LCOV - code coverage report
Current view: top level - sc/source/filter/excel - xiescher.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 965 2166 44.6 %
Date: 2012-08-25 Functions: 149 294 50.7 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 904 3809 23.7 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*************************************************************************
       3                 :            :  *
       4                 :            :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5                 :            :  *
       6                 :            :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7                 :            :  *
       8                 :            :  * OpenOffice.org - a multi-platform office productivity suite
       9                 :            :  *
      10                 :            :  * This file is part of OpenOffice.org.
      11                 :            :  *
      12                 :            :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13                 :            :  * it under the terms of the GNU Lesser General Public License version 3
      14                 :            :  * only, as published by the Free Software Foundation.
      15                 :            :  *
      16                 :            :  * OpenOffice.org is distributed in the hope that it will be useful,
      17                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19                 :            :  * GNU Lesser General Public License version 3 for more details
      20                 :            :  * (a copy is included in the LICENSE file that accompanied this code).
      21                 :            :  *
      22                 :            :  * You should have received a copy of the GNU Lesser General Public License
      23                 :            :  * version 3 along with OpenOffice.org.  If not, see
      24                 :            :  * <http://www.openoffice.org/license.html>
      25                 :            :  * for a copy of the LGPLv3 License.
      26                 :            :  *
      27                 :            :  ************************************************************************/
      28                 :            : 
      29                 :            : 
      30                 :            : #include "xiescher.hxx"
      31                 :            : 
      32                 :            : #include <com/sun/star/beans/NamedValue.hpp>
      33                 :            : #include <com/sun/star/container/XIndexContainer.hpp>
      34                 :            : #include <com/sun/star/container/XNameContainer.hpp>
      35                 :            : #include <com/sun/star/embed/Aspects.hpp>
      36                 :            : #include <com/sun/star/embed/XEmbeddedObject.hpp>
      37                 :            : #include <com/sun/star/embed/XEmbedPersist.hpp>
      38                 :            : #include <com/sun/star/awt/PushButtonType.hpp>
      39                 :            : #include <com/sun/star/awt/ScrollBarOrientation.hpp>
      40                 :            : #include <com/sun/star/awt/VisualEffect.hpp>
      41                 :            : #include <com/sun/star/style/HorizontalAlignment.hpp>
      42                 :            : #include <com/sun/star/style/VerticalAlignment.hpp>
      43                 :            : #include <com/sun/star/drawing/XControlShape.hpp>
      44                 :            : #include <com/sun/star/form/XForm.hpp>
      45                 :            : #include <com/sun/star/form/XFormsSupplier.hpp>
      46                 :            : #include <com/sun/star/form/binding/XBindableValue.hpp>
      47                 :            : #include <com/sun/star/form/binding/XValueBinding.hpp>
      48                 :            : #include <com/sun/star/form/binding/XListEntrySink.hpp>
      49                 :            : #include <com/sun/star/form/binding/XListEntrySource.hpp>
      50                 :            : #include <com/sun/star/script/ScriptEventDescriptor.hpp>
      51                 :            : #include <com/sun/star/script/XEventAttacherManager.hpp>
      52                 :            : 
      53                 :            : #include <rtl/logfile.hxx>
      54                 :            : #include <sfx2/objsh.hxx>
      55                 :            : #include <unotools/moduleoptions.hxx>
      56                 :            : #include <unotools/fltrcfg.hxx>
      57                 :            : #include <svtools/wmf.hxx>
      58                 :            : #include <comphelper/types.hxx>
      59                 :            : #include <comphelper/classids.hxx>
      60                 :            : #include <toolkit/helper/vclunohelper.hxx>
      61                 :            : #include <basegfx/point/b2dpoint.hxx>
      62                 :            : #include <basegfx/polygon/b2dpolygon.hxx>
      63                 :            : 
      64                 :            : #include <svx/svdopath.hxx>
      65                 :            : #include <svx/svdocirc.hxx>
      66                 :            : #include <svx/svdoedge.hxx>
      67                 :            : #include <svx/svdogrp.hxx>
      68                 :            : #include <svx/svdoashp.hxx>
      69                 :            : #include <svx/svdograf.hxx>
      70                 :            : #include <svx/svdoole2.hxx>
      71                 :            : #include <svx/svdocapt.hxx>
      72                 :            : #include <svx/svdouno.hxx>
      73                 :            : #include <svx/svdpage.hxx>
      74                 :            : #include <editeng/editobj.hxx>
      75                 :            : #include <editeng/outliner.hxx>
      76                 :            : #include <editeng/outlobj.hxx>
      77                 :            : #include <svx/unoapi.hxx>
      78                 :            : #include <svx/svditer.hxx>
      79                 :            : #include <editeng/writingmodeitem.hxx>
      80                 :            : 
      81                 :            : #include "scitems.hxx"
      82                 :            : #include <editeng/eeitem.hxx>
      83                 :            : #include <editeng/colritem.hxx>
      84                 :            : #include <svx/xflclit.hxx>
      85                 :            : #include <sal/macros.h>
      86                 :            : #include <editeng/adjitem.hxx>
      87                 :            : #include <svx/xlineit.hxx>
      88                 :            : #include <svx/xlinjoit.hxx>
      89                 :            : #include <svx/xlntrit.hxx>
      90                 :            : #include <svx/xbtmpit.hxx>
      91                 :            : 
      92                 :            : #include "document.hxx"
      93                 :            : #include "drwlayer.hxx"
      94                 :            : #include "userdat.hxx"
      95                 :            : #include "chartarr.hxx"
      96                 :            : #include "detfunc.hxx"
      97                 :            : #include "unonames.hxx"
      98                 :            : #include "convuno.hxx"
      99                 :            : #include "postit.hxx"
     100                 :            : #include "globstr.hrc"
     101                 :            : 
     102                 :            : #include "fprogressbar.hxx"
     103                 :            : #include "xltracer.hxx"
     104                 :            : #include "xistream.hxx"
     105                 :            : #include "xihelper.hxx"
     106                 :            : #include "xiformula.hxx"
     107                 :            : #include "xilink.hxx"
     108                 :            : #include "xistyle.hxx"
     109                 :            : #include "xipage.hxx"
     110                 :            : #include "xichart.hxx"
     111                 :            : #include "xicontent.hxx"
     112                 :            : #include "scextopt.hxx"
     113                 :            : 
     114                 :            : #include "namebuff.hxx"
     115                 :            : #include <boost/shared_ptr.hpp>
     116                 :            : #include <comphelper/componentcontext.hxx>
     117                 :            : #include <comphelper/processfactory.hxx>
     118                 :            : #include <comphelper/mediadescriptor.hxx>
     119                 :            : #include <sfx2/docfile.hxx>
     120                 :            : 
     121                 :            : using ::rtl::OUString;
     122                 :            : using ::rtl::OUStringBuffer;
     123                 :            : using ::com::sun::star::uno::Any;
     124                 :            : using ::com::sun::star::uno::Exception;
     125                 :            : using ::com::sun::star::uno::Reference;
     126                 :            : using ::com::sun::star::uno::Sequence;
     127                 :            : using ::com::sun::star::uno::UNO_QUERY;
     128                 :            : using ::com::sun::star::uno::UNO_QUERY_THROW;
     129                 :            : using ::com::sun::star::uno::UNO_SET_THROW;
     130                 :            : using ::com::sun::star::uno::XComponentContext;
     131                 :            : using ::com::sun::star::beans::NamedValue;
     132                 :            : using ::com::sun::star::lang::XMultiServiceFactory;
     133                 :            : using ::com::sun::star::container::XIndexContainer;
     134                 :            : using ::com::sun::star::container::XNameContainer;
     135                 :            : using ::com::sun::star::frame::XModel;
     136                 :            : using ::com::sun::star::awt::XControlModel;
     137                 :            : using ::com::sun::star::embed::XEmbeddedObject;
     138                 :            : using ::com::sun::star::embed::XEmbedPersist;
     139                 :            : using ::com::sun::star::drawing::XControlShape;
     140                 :            : using ::com::sun::star::drawing::XShape;
     141                 :            : using ::com::sun::star::form::XForm;
     142                 :            : using ::com::sun::star::form::XFormComponent;
     143                 :            : using ::com::sun::star::form::XFormsSupplier;
     144                 :            : using ::com::sun::star::form::binding::XBindableValue;
     145                 :            : using ::com::sun::star::form::binding::XValueBinding;
     146                 :            : using ::com::sun::star::form::binding::XListEntrySink;
     147                 :            : using ::com::sun::star::form::binding::XListEntrySource;
     148                 :            : using ::com::sun::star::script::ScriptEventDescriptor;
     149                 :            : using ::com::sun::star::script::XEventAttacherManager;
     150                 :            : using ::com::sun::star::table::CellAddress;
     151                 :            : using ::com::sun::star::table::CellRangeAddress;
     152                 :            : 
     153                 :            : // ============================================================================
     154                 :            : 
     155                 :            : namespace {
     156                 :            : 
     157                 :            : /** Helper class which mimics the auto_ptr< SdrObject > semantics, but calls
     158                 :            :     SdrObject::Free instead of deleting the SdrObject directly. */
     159                 :            : template< typename SdrObjType >
     160                 :            : class TSdrObjectPtr
     161                 :            : {
     162                 :            : public:
     163                 :        626 :     inline explicit     TSdrObjectPtr( SdrObjType* pObj = 0 ) : mpObj( pObj ) {}
     164                 :        626 :     inline              ~TSdrObjectPtr() { free(); }
     165                 :            : 
     166                 :            :     inline const SdrObjType* operator->() const { return mpObj; }
     167                 :         84 :     inline SdrObjType*  operator->() { return mpObj; }
     168                 :            : 
     169                 :            :     inline const SdrObjType* get() const { return mpObj; }
     170                 :         71 :     inline SdrObjType*  get() { return mpObj; }
     171                 :            : 
     172                 :            :     inline const SdrObjType& operator*() const { return *mpObj; }
     173                 :        139 :     inline SdrObjType& operator*() { return *mpObj; }
     174                 :            : 
     175                 :        481 :     inline bool         is() const { return mpObj != 0; }
     176                 :         28 :     inline bool         operator!() const { return mpObj == 0; }
     177                 :            : 
     178                 :        102 :     inline void         reset( SdrObjType* pObj = 0 ) { free(); mpObj = pObj; }
     179                 :        400 :     inline SdrObjType*  release() { SdrObjType* pObj = mpObj; mpObj = 0; return pObj; }
     180                 :            : 
     181                 :            : private:
     182                 :            :                         TSdrObjectPtr( const TSdrObjectPtr& );    // not implemented
     183                 :            :     TSdrObjectPtr&      operator=( TSdrObjectPtr& rxObj );        // not implemented
     184                 :            : 
     185 [ #  # ][ #  # ]:        728 :     inline void         free() { SdrObject* pObj = mpObj; mpObj = 0; SdrObject::Free( pObj ); }
                 [ +  - ]
     186                 :            : 
     187                 :            : private:
     188                 :            :     SdrObjType*         mpObj;
     189                 :            : };
     190                 :            : 
     191                 :            : typedef TSdrObjectPtr< SdrObject > SdrObjectPtr;
     192                 :            : 
     193                 :            : } // namespace
     194                 :            : 
     195                 :            : // Drawing objects ============================================================
     196                 :            : 
     197                 :        101 : XclImpDrawObjBase::XclImpDrawObjBase( const XclImpRoot& rRoot ) :
     198                 :            :     XclImpRoot( rRoot ),
     199                 :            :     mnObjId( EXC_OBJ_INVALID_ID ),
     200                 :            :     mnObjType( EXC_OBJTYPE_UNKNOWN ),
     201                 :            :     mnDffShapeId( 0 ),
     202                 :            :     mnDffFlags( 0 ),
     203                 :            :     mbHasAnchor( false ),
     204                 :            :     mbHidden( false ),
     205                 :            :     mbVisible( true ),
     206                 :            :     mbPrintable( true ),
     207                 :            :     mbAreaObj( false ),
     208                 :            :     mbAutoMargin( true ),
     209                 :            :     mbSimpleMacro( true ),
     210                 :            :     mbProcessSdr( true ),
     211                 :            :     mbInsertSdr( true ),
     212         [ +  - ]:        101 :     mbCustomDff( false )
     213                 :            : {
     214                 :        101 : }
     215                 :            : 
     216                 :        101 : XclImpDrawObjBase::~XclImpDrawObjBase()
     217                 :            : {
     218         [ -  + ]:        101 : }
     219                 :            : 
     220                 :          0 : XclImpDrawObjRef XclImpDrawObjBase::ReadObj3( const XclImpRoot& rRoot, XclImpStream& rStrm )
     221                 :            : {
     222                 :          0 :     XclImpDrawObjRef xDrawObj;
     223                 :            : 
     224 [ #  # ][ #  # ]:          0 :     if( rStrm.GetRecLeft() >= 30 )
     225                 :            :     {
     226                 :            :         sal_uInt16 nObjType;
     227         [ #  # ]:          0 :         rStrm.Ignore( 4 );
     228         [ #  # ]:          0 :         rStrm >> nObjType;
     229   [ #  #  #  #  :          0 :         switch( nObjType )
          #  #  #  #  #  
                      # ]
     230                 :            :         {
     231 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_GROUP:         xDrawObj.reset( new XclImpGroupObj( rRoot ) );          break;
                 [ #  # ]
     232 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_LINE:          xDrawObj.reset( new XclImpLineObj( rRoot ) );           break;
                 [ #  # ]
     233 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_RECTANGLE:     xDrawObj.reset( new XclImpRectObj( rRoot ) );           break;
                 [ #  # ]
     234 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_OVAL:          xDrawObj.reset( new XclImpOvalObj( rRoot ) );           break;
                 [ #  # ]
     235 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_ARC:           xDrawObj.reset( new XclImpArcObj( rRoot ) );            break;
                 [ #  # ]
     236 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_CHART:         xDrawObj.reset( new XclImpChartObj( rRoot ) );          break;
                 [ #  # ]
     237 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_TEXT:          xDrawObj.reset( new XclImpTextObj( rRoot ) );           break;
                 [ #  # ]
     238 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_BUTTON:        xDrawObj.reset( new XclImpButtonObj( rRoot ) );         break;
                 [ #  # ]
     239 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_PICTURE:       xDrawObj.reset( new XclImpPictureObj( rRoot ) );        break;
                 [ #  # ]
     240                 :            :             default:
     241                 :            :                 OSL_TRACE( "XclImpDrawObjBase::ReadObj3 - unknown object type 0x%04hX", nObjType );
     242 [ #  # ][ #  # ]:          0 :                 rRoot.GetTracer().TraceUnsupportedObjects();
     243 [ #  # ][ #  # ]:          0 :                 xDrawObj.reset( new XclImpPhObj( rRoot ) );
                 [ #  # ]
     244                 :            :         }
     245                 :            :     }
     246                 :            : 
     247                 :          0 :     xDrawObj->mnTab = rRoot.GetCurrScTab();
     248         [ #  # ]:          0 :     xDrawObj->ImplReadObj3( rStrm );
     249                 :          0 :     return xDrawObj;
     250                 :            : }
     251                 :            : 
     252                 :          0 : XclImpDrawObjRef XclImpDrawObjBase::ReadObj4( const XclImpRoot& rRoot, XclImpStream& rStrm )
     253                 :            : {
     254                 :          0 :     XclImpDrawObjRef xDrawObj;
     255                 :            : 
     256 [ #  # ][ #  # ]:          0 :     if( rStrm.GetRecLeft() >= 30 )
     257                 :            :     {
     258                 :            :         sal_uInt16 nObjType;
     259         [ #  # ]:          0 :         rStrm.Ignore( 4 );
     260         [ #  # ]:          0 :         rStrm >> nObjType;
     261   [ #  #  #  #  :          0 :         switch( nObjType )
          #  #  #  #  #  
                   #  # ]
     262                 :            :         {
     263 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_GROUP:         xDrawObj.reset( new XclImpGroupObj( rRoot ) );          break;
                 [ #  # ]
     264 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_LINE:          xDrawObj.reset( new XclImpLineObj( rRoot ) );           break;
                 [ #  # ]
     265 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_RECTANGLE:     xDrawObj.reset( new XclImpRectObj( rRoot ) );           break;
                 [ #  # ]
     266 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_OVAL:          xDrawObj.reset( new XclImpOvalObj( rRoot ) );           break;
                 [ #  # ]
     267 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_ARC:           xDrawObj.reset( new XclImpArcObj( rRoot ) );            break;
                 [ #  # ]
     268 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_CHART:         xDrawObj.reset( new XclImpChartObj( rRoot ) );          break;
                 [ #  # ]
     269 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_TEXT:          xDrawObj.reset( new XclImpTextObj( rRoot ) );           break;
                 [ #  # ]
     270 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_BUTTON:        xDrawObj.reset( new XclImpButtonObj( rRoot ) );         break;
                 [ #  # ]
     271 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_PICTURE:       xDrawObj.reset( new XclImpPictureObj( rRoot ) );        break;
                 [ #  # ]
     272 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_POLYGON:       xDrawObj.reset( new XclImpPolygonObj( rRoot ) );        break;
                 [ #  # ]
     273                 :            :             default:
     274                 :            :                 OSL_TRACE( "XclImpDrawObjBase::ReadObj4 - unknown object type 0x%04hX", nObjType );
     275 [ #  # ][ #  # ]:          0 :                 rRoot.GetTracer().TraceUnsupportedObjects();
     276 [ #  # ][ #  # ]:          0 :                 xDrawObj.reset( new XclImpPhObj( rRoot ) );
                 [ #  # ]
     277                 :            :         }
     278                 :            :     }
     279                 :            : 
     280                 :          0 :     xDrawObj->mnTab = rRoot.GetCurrScTab();
     281         [ #  # ]:          0 :     xDrawObj->ImplReadObj4( rStrm );
     282                 :          0 :     return xDrawObj;
     283                 :            : }
     284                 :            : 
     285                 :          0 : XclImpDrawObjRef XclImpDrawObjBase::ReadObj5( const XclImpRoot& rRoot, XclImpStream& rStrm )
     286                 :            : {
     287                 :          0 :     XclImpDrawObjRef xDrawObj;
     288                 :            : 
     289 [ #  # ][ #  # ]:          0 :     if( rStrm.GetRecLeft() >= 34 )
     290                 :            :     {
     291                 :          0 :         sal_uInt16 nObjType(EXC_OBJTYPE_UNKNOWN);
     292         [ #  # ]:          0 :         rStrm.Ignore( 4 );
     293         [ #  # ]:          0 :         rStrm >> nObjType;
     294   [ #  #  #  #  :          0 :         switch( nObjType )
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     295                 :            :         {
     296 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_GROUP:         xDrawObj.reset( new XclImpGroupObj( rRoot ) );          break;
                 [ #  # ]
     297 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_LINE:          xDrawObj.reset( new XclImpLineObj( rRoot ) );           break;
                 [ #  # ]
     298 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_RECTANGLE:     xDrawObj.reset( new XclImpRectObj( rRoot ) );           break;
                 [ #  # ]
     299 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_OVAL:          xDrawObj.reset( new XclImpOvalObj( rRoot ) );           break;
                 [ #  # ]
     300 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_ARC:           xDrawObj.reset( new XclImpArcObj( rRoot ) );            break;
                 [ #  # ]
     301 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_CHART:         xDrawObj.reset( new XclImpChartObj( rRoot ) );          break;
                 [ #  # ]
     302 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_TEXT:          xDrawObj.reset( new XclImpTextObj( rRoot ) );           break;
                 [ #  # ]
     303 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_BUTTON:        xDrawObj.reset( new XclImpButtonObj( rRoot ) );         break;
                 [ #  # ]
     304 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_PICTURE:       xDrawObj.reset( new XclImpPictureObj( rRoot ) );        break;
                 [ #  # ]
     305 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_POLYGON:       xDrawObj.reset( new XclImpPolygonObj( rRoot ) );        break;
                 [ #  # ]
     306 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_CHECKBOX:      xDrawObj.reset( new XclImpCheckBoxObj( rRoot ) );       break;
                 [ #  # ]
     307 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_OPTIONBUTTON:  xDrawObj.reset( new XclImpOptionButtonObj( rRoot ) );   break;
                 [ #  # ]
     308 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_EDIT:          xDrawObj.reset( new XclImpEditObj( rRoot ) );           break;
                 [ #  # ]
     309 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_LABEL:         xDrawObj.reset( new XclImpLabelObj( rRoot ) );          break;
                 [ #  # ]
     310 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_DIALOG:        xDrawObj.reset( new XclImpDialogObj( rRoot ) );         break;
                 [ #  # ]
     311 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_SPIN:          xDrawObj.reset( new XclImpSpinButtonObj( rRoot ) );     break;
                 [ #  # ]
     312 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_SCROLLBAR:     xDrawObj.reset( new XclImpScrollBarObj( rRoot ) );      break;
                 [ #  # ]
     313 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_LISTBOX:       xDrawObj.reset( new XclImpListBoxObj( rRoot ) );        break;
                 [ #  # ]
     314 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_GROUPBOX:      xDrawObj.reset( new XclImpGroupBoxObj( rRoot ) );       break;
                 [ #  # ]
     315 [ #  # ][ #  # ]:          0 :             case EXC_OBJTYPE_DROPDOWN:      xDrawObj.reset( new XclImpDropDownObj( rRoot ) );       break;
                 [ #  # ]
     316                 :            :             default:
     317                 :            :                 OSL_TRACE( "XclImpDrawObjBase::ReadObj5 - unknown object type 0x%04hX", nObjType );
     318 [ #  # ][ #  # ]:          0 :                 rRoot.GetTracer().TraceUnsupportedObjects();
     319 [ #  # ][ #  # ]:          0 :                 xDrawObj.reset( new XclImpPhObj( rRoot ) );
                 [ #  # ]
     320                 :            :         }
     321                 :            :     }
     322                 :            : 
     323                 :            :     OSL_ENSURE(xDrawObj, "object import failed");
     324                 :            : 
     325         [ #  # ]:          0 :     if (xDrawObj)
     326                 :            :     {
     327                 :          0 :         xDrawObj->mnTab = rRoot.GetCurrScTab();
     328         [ #  # ]:          0 :         xDrawObj->ImplReadObj5( rStrm );
     329                 :            :     }
     330                 :          0 :     return xDrawObj;
     331                 :            : }
     332                 :            : 
     333                 :        101 : XclImpDrawObjRef XclImpDrawObjBase::ReadObj8( const XclImpRoot& rRoot, XclImpStream& rStrm )
     334                 :            : {
     335                 :        101 :     XclImpDrawObjRef xDrawObj;
     336                 :            : 
     337 [ +  - ][ +  - ]:        101 :     if( rStrm.GetRecLeft() >= 10 )
     338                 :            :     {
     339                 :        101 :         sal_uInt16 nSubRecId(0), nSubRecSize(0), nObjType(0);
     340 [ +  - ][ +  - ]:        101 :         rStrm >> nSubRecId >> nSubRecSize >> nObjType;
                 [ +  - ]
     341                 :            :         OSL_ENSURE( nSubRecId == EXC_ID_OBJCMO, "XclImpDrawObjBase::ReadObj8 - OBJCMO subrecord expected" );
     342 [ +  - ][ +  - ]:        101 :         if( (nSubRecId == EXC_ID_OBJCMO) && (nSubRecSize >= 6) )
     343                 :            :         {
     344   [ -  +  -  +  :        101 :             switch( nObjType )
          -  +  -  +  -  
          -  -  -  -  -  
             +  +  +  - ]
     345                 :            :             {
     346                 :            :                 // in BIFF8, all simple objects support text
     347                 :            :                 case EXC_OBJTYPE_LINE:
     348                 :            :                 case EXC_OBJTYPE_ARC:
     349 [ #  # ][ #  # ]:          0 :                     xDrawObj.reset( new XclImpTextObj( rRoot ) );
                 [ #  # ]
     350                 :            :                     // lines and arcs may be 2-dimensional
     351                 :          0 :                     xDrawObj->SetAreaObj( false );
     352                 :          0 :                 break;
     353                 :            : 
     354                 :            :                 // in BIFF8, all simple objects support text
     355                 :            :                 case EXC_OBJTYPE_RECTANGLE:
     356                 :            :                 case EXC_OBJTYPE_OVAL:
     357                 :            :                 case EXC_OBJTYPE_POLYGON:
     358                 :            :                 case EXC_OBJTYPE_DRAWING:
     359                 :            :                 case EXC_OBJTYPE_TEXT:
     360 [ +  - ][ +  - ]:         33 :                     xDrawObj.reset( new XclImpTextObj( rRoot ) );
                 [ +  - ]
     361                 :         33 :                 break;
     362                 :            : 
     363 [ #  # ][ #  # ]:          0 :                 case EXC_OBJTYPE_GROUP:         xDrawObj.reset( new XclImpGroupObj( rRoot ) );          break;
                 [ #  # ]
     364 [ +  - ][ +  - ]:          6 :                 case EXC_OBJTYPE_CHART:         xDrawObj.reset( new XclImpChartObj( rRoot ) );          break;
                 [ +  - ]
     365 [ #  # ][ #  # ]:          0 :                 case EXC_OBJTYPE_BUTTON:        xDrawObj.reset( new XclImpButtonObj( rRoot ) );         break;
                 [ #  # ]
     366 [ +  - ][ +  - ]:         14 :                 case EXC_OBJTYPE_PICTURE:       xDrawObj.reset( new XclImpPictureObj( rRoot ) );        break;
                 [ +  - ]
     367 [ #  # ][ #  # ]:          0 :                 case EXC_OBJTYPE_CHECKBOX:      xDrawObj.reset( new XclImpCheckBoxObj( rRoot ) );       break;
                 [ #  # ]
     368 [ +  - ][ +  - ]:         12 :                 case EXC_OBJTYPE_OPTIONBUTTON:  xDrawObj.reset( new XclImpOptionButtonObj( rRoot ) );   break;
                 [ +  - ]
     369 [ #  # ][ #  # ]:          0 :                 case EXC_OBJTYPE_EDIT:          xDrawObj.reset( new XclImpEditObj( rRoot ) );           break;
                 [ #  # ]
     370 [ #  # ][ #  # ]:          0 :                 case EXC_OBJTYPE_LABEL:         xDrawObj.reset( new XclImpLabelObj( rRoot ) );          break;
                 [ #  # ]
     371 [ #  # ][ #  # ]:          0 :                 case EXC_OBJTYPE_DIALOG:        xDrawObj.reset( new XclImpDialogObj( rRoot ) );         break;
                 [ #  # ]
     372 [ #  # ][ #  # ]:          0 :                 case EXC_OBJTYPE_SPIN:          xDrawObj.reset( new XclImpSpinButtonObj( rRoot ) );     break;
                 [ #  # ]
     373 [ #  # ][ #  # ]:          0 :                 case EXC_OBJTYPE_SCROLLBAR:     xDrawObj.reset( new XclImpScrollBarObj( rRoot ) );      break;
                 [ #  # ]
     374 [ #  # ][ #  # ]:          0 :                 case EXC_OBJTYPE_LISTBOX:       xDrawObj.reset( new XclImpListBoxObj( rRoot ) );        break;
                 [ #  # ]
     375 [ +  - ][ +  - ]:          3 :                 case EXC_OBJTYPE_GROUPBOX:      xDrawObj.reset( new XclImpGroupBoxObj( rRoot ) );       break;
                 [ +  - ]
     376 [ +  - ][ +  - ]:         30 :                 case EXC_OBJTYPE_DROPDOWN:      xDrawObj.reset( new XclImpDropDownObj( rRoot ) );       break;
                 [ +  - ]
     377 [ +  - ][ +  - ]:          3 :                 case EXC_OBJTYPE_NOTE:          xDrawObj.reset( new XclImpNoteObj( rRoot ) );           break;
                 [ +  - ]
     378                 :            : 
     379                 :            :                 default:
     380                 :            :                     OSL_TRACE( "XclImpDrawObjBase::ReadObj8 - unknown object type 0x%04hX", nObjType );
     381 [ #  # ][ #  # ]:        101 :                     rRoot.GetTracer().TraceUnsupportedObjects();
     382                 :            :             }
     383                 :            :         }
     384                 :            :     }
     385                 :            : 
     386         [ -  + ]:        101 :     if (!xDrawObj) //ensure placeholder for unknown or broken records
     387                 :            :     {
     388                 :            :         SAL_WARN( "sc", "XclImpDrawObjBase::ReadObj8 import failed, substituting placeholder");
     389 [ #  # ][ #  # ]:          0 :         xDrawObj.reset( new XclImpPhObj( rRoot ) );
                 [ #  # ]
     390                 :            :     }
     391                 :            : 
     392                 :        101 :     xDrawObj->mnTab = rRoot.GetCurrScTab();
     393         [ +  - ]:        101 :     xDrawObj->ImplReadObj8( rStrm );
     394                 :        101 :     return xDrawObj;
     395                 :            : }
     396                 :            : 
     397                 :        101 : void XclImpDrawObjBase::SetAnchor( const XclObjAnchor& rAnchor )
     398                 :            : {
     399                 :        101 :     maAnchor = rAnchor;
     400                 :        101 :     mbHasAnchor = true;
     401                 :        101 : }
     402                 :            : 
     403                 :         71 : void XclImpDrawObjBase::SetDffData(
     404                 :            :     const DffObjData& rDffObjData, const rtl::OUString& rObjName, const rtl::OUString& rHyperlink,
     405                 :            :     bool bVisible, bool bAutoMargin )
     406                 :            : {
     407                 :         71 :     mnDffShapeId = rDffObjData.nShapeId;
     408                 :         71 :     mnDffFlags = rDffObjData.nSpFlags;
     409                 :         71 :     maObjName = rObjName;
     410                 :         71 :     maHyperlink = rHyperlink;
     411                 :         71 :     mbVisible = bVisible;
     412                 :         71 :     mbAutoMargin = bAutoMargin;
     413                 :         71 : }
     414                 :            : 
     415                 :         75 : OUString XclImpDrawObjBase::GetObjName() const
     416                 :            : {
     417                 :            :     /*  #i51348# Always return a non-empty name. Create English
     418                 :            :         default names depending on the object type. This is not implemented as
     419                 :            :         virtual functions in derived classes, as class type and object type may
     420                 :            :         not match. */
     421         [ +  + ]:         75 :     return maObjName.isEmpty() ? GetObjectManager().GetDefaultObjName(*this) : maObjName;
     422                 :            : }
     423                 :            : 
     424                 :          0 : const XclObjAnchor* XclImpDrawObjBase::GetAnchor() const
     425                 :            : {
     426         [ #  # ]:          0 :     return mbHasAnchor ? &maAnchor : 0;
     427                 :            : }
     428                 :            : 
     429                 :         71 : bool XclImpDrawObjBase::IsValidSize( const Rectangle& rAnchorRect ) const
     430                 :            : {
     431                 :            :     // XclObjAnchor rounds up the width, width of 3 is the result of an Excel width of 0
     432                 :            :     return mbAreaObj ?
     433                 :        142 :         ((rAnchorRect.GetWidth() > 3) && (rAnchorRect.GetHeight() > 1)) :
     434   [ +  -  +  -  :        213 :         ((rAnchorRect.GetWidth() > 3) || (rAnchorRect.GetHeight() > 1));
           +  - ][ #  # ]
                 [ #  # ]
     435                 :            : }
     436                 :            : 
     437                 :         68 : ScRange XclImpDrawObjBase::GetUsedArea( SCTAB nScTab ) const
     438                 :            : {
     439                 :         68 :     ScRange aScUsedArea( ScAddress::INITIALIZE_INVALID );
     440                 :            :     // #i44077# object inserted -> update used area for OLE object import
     441 [ +  - ][ +  - ]:         68 :     if( mbHasAnchor && GetAddressConverter().ConvertRange( aScUsedArea, maAnchor, nScTab, nScTab, false ) )
                 [ +  - ]
     442                 :            :     {
     443                 :            :         // reduce range, if object ends directly on borders between two columns or rows
     444 [ +  + ][ +  - ]:         68 :         if( (maAnchor.mnRX == 0) && (aScUsedArea.aStart.Col() < aScUsedArea.aEnd.Col()) )
                 [ +  + ]
     445                 :          3 :             aScUsedArea.aEnd.IncCol( -1 );
     446 [ +  + ][ +  - ]:         68 :         if( (maAnchor.mnBY == 0) && (aScUsedArea.aStart.Row() < aScUsedArea.aEnd.Row()) )
                 [ +  + ]
     447                 :          6 :             aScUsedArea.aEnd.IncRow( -1 );
     448                 :            :     }
     449                 :         68 :     return aScUsedArea;
     450                 :            : }
     451                 :            : 
     452                 :        137 : sal_Size XclImpDrawObjBase::GetProgressSize() const
     453                 :            : {
     454                 :        137 :     return DoGetProgressSize();
     455                 :            : }
     456                 :            : 
     457                 :         71 : SdrObject* XclImpDrawObjBase::CreateSdrObject( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect, bool bIsDff ) const
     458                 :            : {
     459                 :         71 :     SdrObjectPtr xSdrObj;
     460 [ +  + ][ +  - ]:         71 :     if( bIsDff && !mbCustomDff )
     461                 :            :     {
     462 [ +  - ][ +  - ]:         36 :         rDffConv.Progress( GetProgressSize() );
     463                 :            :     }
     464                 :            :     else
     465                 :            :     {
     466 [ +  - ][ +  - ]:         35 :         xSdrObj.reset( DoCreateSdrObj( rDffConv, rAnchorRect ) );
     467         [ +  + ]:         35 :         if( xSdrObj.is() )
     468         [ +  - ]:         32 :             xSdrObj->SetModel( rDffConv.GetModel() );
     469                 :            :     }
     470         [ +  - ]:         71 :     return xSdrObj.release();
     471                 :            : }
     472                 :            : 
     473                 :         71 : void XclImpDrawObjBase::PreProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
     474                 :            : {
     475                 :            :     // default: front layer, derived classes may have to set other layer in DoPreProcessSdrObj()
     476                 :         71 :     rSdrObj.NbcSetLayer( SC_LAYER_FRONT );
     477                 :            : 
     478                 :            :     // set object name (GetObjName() will always return a non-empty name)
     479         [ +  - ]:         71 :     rSdrObj.SetName( GetObjName() );
     480                 :            : 
     481                 :            :     // #i39167# full width for all objects regardless of horizontal alignment
     482         [ +  - ]:         71 :     rSdrObj.SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) );
     483                 :            : 
     484                 :            :     // automatic text margin
     485         [ +  + ]:         71 :     if( mbAutoMargin )
     486                 :            :     {
     487                 :         68 :         sal_Int32 nMargin = rDffConv.GetDefaultTextMargin();
     488         [ +  - ]:         68 :         rSdrObj.SetMergedItem( SdrTextLeftDistItem( nMargin ) );
     489         [ +  - ]:         68 :         rSdrObj.SetMergedItem( SdrTextRightDistItem( nMargin ) );
     490         [ +  - ]:         68 :         rSdrObj.SetMergedItem( SdrTextUpperDistItem( nMargin ) );
     491         [ +  - ]:         68 :         rSdrObj.SetMergedItem( SdrTextLowerDistItem( nMargin ) );
     492                 :            :     }
     493                 :            : 
     494                 :            :     // macro and hyperlink
     495                 :            :     // removed oracle/sun check for mbSimpleMacro ( no idea what its for )
     496 [ +  - ][ -  + ]:         71 :     if (!maMacroName.isEmpty() || !maHyperlink.isEmpty())
                 [ -  + ]
     497                 :            :     {
     498         [ #  # ]:          0 :         if( ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( &rSdrObj, sal_True ) )
     499                 :            :         {
     500                 :          0 :             pInfo->SetMacro( XclTools::GetSbMacroUrl( maMacroName, GetDocShell() ) );
     501                 :          0 :             pInfo->SetHlink( maHyperlink );
     502                 :            :         }
     503                 :            :     }
     504                 :            : 
     505                 :            :     // call virtual function for object type specific processing
     506                 :         71 :     DoPreProcessSdrObj( rDffConv, rSdrObj );
     507                 :         71 : }
     508                 :            : 
     509                 :         68 : void XclImpDrawObjBase::PostProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
     510                 :            : {
     511                 :            :     // call virtual function for object type specific processing
     512                 :         68 :     DoPostProcessSdrObj( rDffConv, rSdrObj );
     513                 :         68 : }
     514                 :            : 
     515                 :            : // protected ------------------------------------------------------------------
     516                 :            : 
     517                 :          0 : void XclImpDrawObjBase::ReadName5( XclImpStream& rStrm, sal_uInt16 nNameLen )
     518                 :            : {
     519                 :          0 :     maObjName = rtl::OUString();
     520         [ #  # ]:          0 :     if( nNameLen > 0 )
     521                 :            :     {
     522                 :            :         // name length field is repeated before the name
     523         [ #  # ]:          0 :         maObjName = rStrm.ReadByteString( false );
     524                 :            :         // skip padding byte for word boundaries
     525         [ #  # ]:          0 :         if( rStrm.GetRecPos() & 1 ) rStrm.Ignore( 1 );
     526                 :            :     }
     527                 :          0 : }
     528                 :            : 
     529                 :          0 : void XclImpDrawObjBase::ReadMacro3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
     530                 :            : {
     531                 :          0 :     maMacroName = rtl::OUString();
     532                 :          0 :     rStrm.Ignore( nMacroSize );
     533                 :            :     // skip padding byte for word boundaries, not contained in nMacroSize
     534         [ #  # ]:          0 :     if( rStrm.GetRecPos() & 1 ) rStrm.Ignore( 1 );
     535                 :          0 : }
     536                 :            : 
     537                 :          0 : void XclImpDrawObjBase::ReadMacro4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
     538                 :            : {
     539                 :          0 :     maMacroName = rtl::OUString();
     540                 :          0 :     rStrm.Ignore( nMacroSize );
     541                 :          0 : }
     542                 :            : 
     543                 :          0 : void XclImpDrawObjBase::ReadMacro5( XclImpStream& rStrm, sal_uInt16 nMacroSize )
     544                 :            : {
     545                 :          0 :     maMacroName = rtl::OUString();
     546                 :          0 :     rStrm.Ignore( nMacroSize );
     547                 :          0 : }
     548                 :            : 
     549                 :          0 : void XclImpDrawObjBase::ReadMacro8( XclImpStream& rStrm )
     550                 :            : {
     551                 :          0 :     maMacroName = rtl::OUString();
     552         [ #  # ]:          0 :     if( rStrm.GetRecLeft() > 6 )
     553                 :            :     {
     554                 :            :         // macro is stored in a tNameXR token containing a link to a defined name
     555                 :            :         sal_uInt16 nFmlaSize;
     556         [ #  # ]:          0 :         rStrm >> nFmlaSize;
     557         [ #  # ]:          0 :         rStrm.Ignore( 4 );
     558                 :            :         OSL_ENSURE( nFmlaSize == 7, "XclImpDrawObjBase::ReadMacro - unexpected formula size" );
     559         [ #  # ]:          0 :         if( nFmlaSize == 7 )
     560                 :            :         {
     561                 :            :             sal_uInt8 nTokenId;
     562                 :            :             sal_uInt16 nExtSheet, nExtName;
     563 [ #  # ][ #  # ]:          0 :             rStrm >> nTokenId >> nExtSheet >> nExtName;
                 [ #  # ]
     564                 :            :             OSL_ENSURE( nTokenId == XclTokenArrayHelper::GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ),
     565                 :            :                 "XclImpDrawObjBase::ReadMacro - tNameXR token expected" );
     566         [ #  # ]:          0 :             if( nTokenId == XclTokenArrayHelper::GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ) )
     567 [ #  # ][ #  # ]:          0 :                 maMacroName = GetLinkManager().GetMacroName( nExtSheet, nExtName );
                 [ #  # ]
     568                 :            :         }
     569                 :            :     }
     570                 :          0 : }
     571                 :            : 
     572                 :          0 : void XclImpDrawObjBase::ConvertLineStyle( SdrObject& rSdrObj, const XclObjLineData& rLineData ) const
     573                 :            : {
     574         [ #  # ]:          0 :     if( rLineData.IsAuto() )
     575                 :            :     {
     576         [ #  # ]:          0 :         XclObjLineData aAutoData;
     577                 :          0 :         aAutoData.mnAuto = 0;
     578         [ #  # ]:          0 :         ConvertLineStyle( rSdrObj, aAutoData );
     579                 :            :     }
     580                 :            :     else
     581                 :            :     {
     582                 :          0 :         long nLineWidth = 35 * ::std::min( rLineData.mnWidth, EXC_OBJ_LINE_THICK );
     583         [ #  # ]:          0 :         rSdrObj.SetMergedItem( XLineWidthItem( nLineWidth ) );
     584 [ #  # ][ #  # ]:          0 :         rSdrObj.SetMergedItem( XLineColorItem( EMPTY_STRING, GetPalette().GetColor( rLineData.mnColorIdx ) ) );
         [ #  # ][ #  # ]
     585         [ #  # ]:          0 :         rSdrObj.SetMergedItem( XLineJointItem( XLINEJOINT_MITER ) );
     586                 :            : 
     587         [ #  # ]:          0 :         sal_uLong nDotLen = ::std::max< sal_uLong >( 70 * rLineData.mnWidth, 35 );
     588                 :          0 :         sal_uLong nDashLen = 3 * nDotLen;
     589                 :          0 :         sal_uLong nDist = 2 * nDotLen;
     590                 :            : 
     591   [ #  #  #  #  :          0 :         switch( rLineData.mnStyle )
             #  #  #  #  
                      # ]
     592                 :            :         {
     593                 :            :             default:
     594                 :            :             case EXC_OBJ_LINE_SOLID:
     595         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineStyleItem( XLINE_SOLID ) );
     596                 :          0 :             break;
     597                 :            :             case EXC_OBJ_LINE_DASH:
     598         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineStyleItem( XLINE_DASH ) );
     599 [ #  # ][ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineDashItem( EMPTY_STRING, XDash( XDASH_RECT, 0, nDotLen, 1, nDashLen, nDist ) ) );
         [ #  # ][ #  # ]
     600                 :          0 :             break;
     601                 :            :             case EXC_OBJ_LINE_DOT:
     602         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineStyleItem( XLINE_DASH ) );
     603 [ #  # ][ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineDashItem( EMPTY_STRING, XDash( XDASH_RECT, 1, nDotLen, 0, nDashLen, nDist ) ) );
         [ #  # ][ #  # ]
     604                 :          0 :             break;
     605                 :            :             case EXC_OBJ_LINE_DASHDOT:
     606         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineStyleItem( XLINE_DASH ) );
     607 [ #  # ][ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineDashItem( EMPTY_STRING, XDash( XDASH_RECT, 1, nDotLen, 1, nDashLen, nDist ) ) );
         [ #  # ][ #  # ]
     608                 :          0 :             break;
     609                 :            :             case EXC_OBJ_LINE_DASHDOTDOT:
     610         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineStyleItem( XLINE_DASH ) );
     611 [ #  # ][ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineDashItem( EMPTY_STRING, XDash( XDASH_RECT, 2, nDotLen, 1, nDashLen, nDist ) ) );
         [ #  # ][ #  # ]
     612                 :          0 :             break;
     613                 :            :             case EXC_OBJ_LINE_MEDTRANS:
     614         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineStyleItem( XLINE_SOLID ) );
     615         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineTransparenceItem( 50 ) );
     616                 :          0 :             break;
     617                 :            :             case EXC_OBJ_LINE_DARKTRANS:
     618         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineStyleItem( XLINE_SOLID ) );
     619         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineTransparenceItem( 25 ) );
     620                 :          0 :             break;
     621                 :            :             case EXC_OBJ_LINE_LIGHTTRANS:
     622         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineStyleItem( XLINE_SOLID ) );
     623         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineTransparenceItem( 75 ) );
     624                 :          0 :             break;
     625                 :            :             case EXC_OBJ_LINE_NONE:
     626         [ #  # ]:          0 :                 rSdrObj.SetMergedItem( XLineStyleItem( XLINE_NONE ) );
     627                 :          0 :             break;
     628                 :            :         }
     629                 :            :     }
     630                 :          0 : }
     631                 :            : 
     632                 :          0 : void XclImpDrawObjBase::ConvertFillStyle( SdrObject& rSdrObj, const XclObjFillData& rFillData ) const
     633                 :            : {
     634         [ #  # ]:          0 :     if( rFillData.IsAuto() )
     635                 :            :     {
     636         [ #  # ]:          0 :         XclObjFillData aAutoData;
     637                 :          0 :         aAutoData.mnAuto = 0;
     638         [ #  # ]:          0 :         ConvertFillStyle( rSdrObj, aAutoData );
     639                 :            :     }
     640         [ #  # ]:          0 :     else if( rFillData.mnPattern == EXC_PATT_NONE )
     641                 :            :     {
     642         [ #  # ]:          0 :         rSdrObj.SetMergedItem( XFillStyleItem( XFILL_NONE ) );
     643                 :            :     }
     644                 :            :     else
     645                 :            :     {
     646 [ #  # ][ #  # ]:          0 :         Color aPattColor = GetPalette().GetColor( rFillData.mnPattColorIdx );
     647 [ #  # ][ #  # ]:          0 :         Color aBackColor = GetPalette().GetColor( rFillData.mnBackColorIdx );
     648 [ #  # ][ #  # ]:          0 :         if( (rFillData.mnPattern == EXC_PATT_SOLID) || (aPattColor == aBackColor) )
                 [ #  # ]
     649                 :            :         {
     650 [ #  # ][ #  # ]:          0 :             rSdrObj.SetMergedItem( XFillStyleItem( XFILL_SOLID ) );
                 [ #  # ]
     651 [ #  # ][ #  # ]:          0 :             rSdrObj.SetMergedItem( XFillColorItem( EMPTY_STRING, aPattColor ) );
         [ #  # ][ #  # ]
     652                 :            :         }
     653                 :            :         else
     654                 :            :         {
     655                 :            :             static const sal_uInt8 sppnPatterns[][ 8 ] =
     656                 :            :             {
     657                 :            :                 { 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55 },
     658                 :            :                 { 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD },
     659                 :            :                 { 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22 },
     660                 :            :                 { 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00 },
     661                 :            :                 { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC },
     662                 :            :                 { 0x33, 0x66, 0xCC, 0x99, 0x33, 0x66, 0xCC, 0x99 },
     663                 :            :                 { 0xCC, 0x66, 0x33, 0x99, 0xCC, 0x66, 0x33, 0x99 },
     664                 :            :                 { 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33 },
     665                 :            :                 { 0xCC, 0xFF, 0x33, 0xFF, 0xCC, 0xFF, 0x33, 0xFF },
     666                 :            :                 { 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00 },
     667                 :            :                 { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 },
     668                 :            :                 { 0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88 },
     669                 :            :                 { 0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11 },
     670                 :            :                 { 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11 },
     671                 :            :                 { 0xAA, 0x44, 0xAA, 0x11, 0xAA, 0x44, 0xAA, 0x11 },
     672                 :            :                 { 0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x22, 0x00 },
     673                 :            :                 { 0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x08, 0x00 }
     674                 :            :             };
     675         [ #  # ]:          0 :             const sal_uInt8* const pnPattern = sppnPatterns[ ::std::min< size_t >( rFillData.mnPattern - 2, SAL_N_ELEMENTS( sppnPatterns ) ) ];
     676                 :            :             // create 2-colored 8x8 DIB
     677         [ #  # ]:          0 :             SvMemoryStream aMemStrm;
     678 [ #  # ][ #  # ]:          0 :             aMemStrm << sal_uInt32( 12 ) << sal_Int16( 8 ) << sal_Int16( 8 ) << sal_uInt16( 1 ) << sal_uInt16( 1 );
         [ #  # ][ #  # ]
                 [ #  # ]
     679 [ #  # ][ #  # ]:          0 :             aMemStrm << sal_uInt8( 0xFF ) << sal_uInt8( 0xFF ) << sal_uInt8( 0xFF );
                 [ #  # ]
     680 [ #  # ][ #  # ]:          0 :             aMemStrm << sal_uInt8( 0x00 ) << sal_uInt8( 0x00 ) << sal_uInt8( 0x00 );
                 [ #  # ]
     681         [ #  # ]:          0 :             for( size_t nIdx = 0; nIdx < 8; ++nIdx )
     682         [ #  # ]:          0 :                 aMemStrm << sal_uInt32( pnPattern[ nIdx ] ); // 32-bit little-endian
     683         [ #  # ]:          0 :             aMemStrm.Seek( STREAM_SEEK_TO_BEGIN );
     684         [ #  # ]:          0 :             Bitmap aBitmap;
     685         [ #  # ]:          0 :             aBitmap.Read( aMemStrm, false );
     686         [ #  # ]:          0 :             XOBitmap aXOBitmap( aBitmap );
     687         [ #  # ]:          0 :             aXOBitmap.Bitmap2Array();
     688                 :          0 :             aXOBitmap.SetBitmapType( XBITMAP_8X8 );
     689         [ #  # ]:          0 :             if( aXOBitmap.GetBackgroundColor().GetColor() == COL_BLACK )
     690                 :          0 :                 ::std::swap( aPattColor, aBackColor );
     691                 :          0 :             aXOBitmap.SetPixelColor( aPattColor );
     692                 :          0 :             aXOBitmap.SetBackgroundColor( aBackColor );
     693 [ #  # ][ #  # ]:          0 :             rSdrObj.SetMergedItem( XFillStyleItem( XFILL_BITMAP ) );
                 [ #  # ]
     694 [ #  # ][ #  # ]:          0 :             rSdrObj.SetMergedItem( XFillBitmapItem( EMPTY_STRING, aXOBitmap ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     695                 :            :         }
     696                 :            :     }
     697                 :          0 : }
     698                 :            : 
     699                 :          0 : void XclImpDrawObjBase::ConvertFrameStyle( SdrObject& rSdrObj, sal_uInt16 nFrameFlags ) const
     700                 :            : {
     701         [ #  # ]:          0 :     if( ::get_flag( nFrameFlags, EXC_OBJ_FRAME_SHADOW ) )
     702                 :            :     {
     703         [ #  # ]:          0 :         rSdrObj.SetMergedItem( SdrShadowItem( sal_True ) );
     704         [ #  # ]:          0 :         rSdrObj.SetMergedItem( SdrShadowXDistItem( 35 ) );
     705         [ #  # ]:          0 :         rSdrObj.SetMergedItem( SdrShadowYDistItem( 35 ) );
     706 [ #  # ][ #  # ]:          0 :         rSdrObj.SetMergedItem( SdrShadowColorItem( EMPTY_STRING, GetPalette().GetColor( EXC_COLOR_WINDOWTEXT ) ) );
         [ #  # ][ #  # ]
     707                 :            :     }
     708                 :          0 : }
     709                 :            : 
     710                 :          0 : Color XclImpDrawObjBase::GetSolidLineColor( const XclObjLineData& rLineData ) const
     711                 :            : {
     712                 :          0 :     Color aColor( COL_TRANSPARENT );
     713         [ #  # ]:          0 :     if( rLineData.IsAuto() )
     714                 :            :     {
     715         [ #  # ]:          0 :         XclObjLineData aAutoData;
     716                 :          0 :         aAutoData.mnAuto = 0;
     717         [ #  # ]:          0 :         aColor = GetSolidLineColor( aAutoData );
     718                 :            :     }
     719         [ #  # ]:          0 :     else if( rLineData.mnStyle != EXC_OBJ_LINE_NONE )
     720                 :            :     {
     721                 :          0 :         aColor = GetPalette().GetColor( rLineData.mnColorIdx );
     722                 :            :     }
     723                 :          0 :     return aColor;
     724                 :            : }
     725                 :            : 
     726                 :          0 : Color XclImpDrawObjBase::GetSolidFillColor( const XclObjFillData& rFillData ) const
     727                 :            : {
     728                 :          0 :     Color aColor( COL_TRANSPARENT );
     729         [ #  # ]:          0 :     if( rFillData.IsAuto() )
     730                 :            :     {
     731         [ #  # ]:          0 :         XclObjFillData aAutoData;
     732                 :          0 :         aAutoData.mnAuto = 0;
     733         [ #  # ]:          0 :         aColor = GetSolidFillColor( aAutoData );
     734                 :            :     }
     735         [ #  # ]:          0 :     else if( rFillData.mnPattern != EXC_PATT_NONE )
     736                 :            :     {
     737 [ #  # ][ #  # ]:          0 :         Color aPattColor = GetPalette().GetColor( rFillData.mnPattColorIdx );
     738 [ #  # ][ #  # ]:          0 :         Color aBackColor = GetPalette().GetColor( rFillData.mnBackColorIdx );
     739         [ #  # ]:          0 :         aColor = XclTools::GetPatternColor( aPattColor, aBackColor, rFillData.mnPattern );
     740                 :            :     }
     741                 :          0 :     return aColor;
     742                 :            : }
     743                 :            : 
     744                 :          0 : void XclImpDrawObjBase::DoReadObj3( XclImpStream&, sal_uInt16 )
     745                 :            : {
     746                 :          0 : }
     747                 :            : 
     748                 :          0 : void XclImpDrawObjBase::DoReadObj4( XclImpStream&, sal_uInt16 )
     749                 :            : {
     750                 :          0 : }
     751                 :            : 
     752                 :          0 : void XclImpDrawObjBase::DoReadObj5( XclImpStream&, sal_uInt16, sal_uInt16 )
     753                 :            : {
     754                 :          0 : }
     755                 :            : 
     756                 :        133 : void XclImpDrawObjBase::DoReadObj8SubRec( XclImpStream&, sal_uInt16, sal_uInt16 )
     757                 :            : {
     758                 :        133 : }
     759                 :            : 
     760                 :        131 : sal_Size XclImpDrawObjBase::DoGetProgressSize() const
     761                 :            : {
     762                 :        131 :     return 1;
     763                 :            : }
     764                 :            : 
     765                 :          0 : SdrObject* XclImpDrawObjBase::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& ) const
     766                 :            : {
     767                 :          0 :     rDffConv.Progress( GetProgressSize() );
     768                 :          0 :     return 0;
     769                 :            : }
     770                 :            : 
     771                 :         42 : void XclImpDrawObjBase::DoPreProcessSdrObj( XclImpDffConverter&, SdrObject& ) const
     772                 :            : {
     773                 :            :     // trace if object is not printable
     774         [ +  + ]:         42 :     if( !IsPrintable() )
     775                 :          3 :         GetTracer().TraceObjectNotPrintable();
     776                 :         42 : }
     777                 :            : 
     778                 :         62 : void XclImpDrawObjBase::DoPostProcessSdrObj( XclImpDffConverter&, SdrObject& ) const
     779                 :            : {
     780                 :         62 : }
     781                 :            : 
     782                 :          0 : void XclImpDrawObjBase::ImplReadObj3( XclImpStream& rStrm )
     783                 :            : {
     784                 :            :     // back to offset 4 (ignore object count field)
     785         [ #  # ]:          0 :     rStrm.Seek( 4 );
     786                 :            : 
     787                 :            :     sal_uInt16 nObjFlags, nMacroSize;
     788 [ #  # ][ #  # ]:          0 :     rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize;
         [ #  # ][ #  # ]
                 [ #  # ]
     789         [ #  # ]:          0 :     rStrm.Ignore( 2 );
     790                 :            : 
     791                 :          0 :     mbHasAnchor = true;
     792                 :          0 :     mbHidden = ::get_flag( nObjFlags, EXC_OBJ_HIDDEN );
     793                 :          0 :     mbVisible = ::get_flag( nObjFlags, EXC_OBJ_VISIBLE );
     794         [ #  # ]:          0 :     DoReadObj3( rStrm, nMacroSize );
     795                 :          0 : }
     796                 :            : 
     797                 :          0 : void XclImpDrawObjBase::ImplReadObj4( XclImpStream& rStrm )
     798                 :            : {
     799                 :            :     // back to offset 4 (ignore object count field)
     800         [ #  # ]:          0 :     rStrm.Seek( 4 );
     801                 :            : 
     802                 :            :     sal_uInt16 nObjFlags, nMacroSize;
     803 [ #  # ][ #  # ]:          0 :     rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize;
         [ #  # ][ #  # ]
                 [ #  # ]
     804         [ #  # ]:          0 :     rStrm.Ignore( 2 );
     805                 :            : 
     806                 :          0 :     mbHasAnchor = true;
     807                 :          0 :     mbHidden = ::get_flag( nObjFlags, EXC_OBJ_HIDDEN );
     808                 :          0 :     mbVisible = ::get_flag( nObjFlags, EXC_OBJ_VISIBLE );
     809                 :          0 :     mbPrintable = ::get_flag( nObjFlags, EXC_OBJ_PRINTABLE );
     810         [ #  # ]:          0 :     DoReadObj4( rStrm, nMacroSize );
     811                 :          0 : }
     812                 :            : 
     813                 :          0 : void XclImpDrawObjBase::ImplReadObj5( XclImpStream& rStrm )
     814                 :            : {
     815                 :            :     // back to offset 4 (ignore object count field)
     816         [ #  # ]:          0 :     rStrm.Seek( 4 );
     817                 :            : 
     818                 :            :     sal_uInt16 nObjFlags, nMacroSize, nNameLen;
     819 [ #  # ][ #  # ]:          0 :     rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize;
         [ #  # ][ #  # ]
                 [ #  # ]
     820         [ #  # ]:          0 :     rStrm.Ignore( 2 );
     821         [ #  # ]:          0 :     rStrm >> nNameLen;
     822         [ #  # ]:          0 :     rStrm.Ignore( 2 );
     823                 :            : 
     824                 :          0 :     mbHasAnchor = true;
     825                 :          0 :     mbHidden = ::get_flag( nObjFlags, EXC_OBJ_HIDDEN );
     826                 :          0 :     mbVisible = ::get_flag( nObjFlags, EXC_OBJ_VISIBLE );
     827                 :          0 :     mbPrintable = ::get_flag( nObjFlags, EXC_OBJ_PRINTABLE );
     828         [ #  # ]:          0 :     DoReadObj5( rStrm, nNameLen, nMacroSize );
     829                 :          0 : }
     830                 :            : 
     831                 :        101 : void XclImpDrawObjBase::ImplReadObj8( XclImpStream& rStrm )
     832                 :            : {
     833                 :            :     // back to beginning
     834                 :        101 :     rStrm.Seek( EXC_REC_SEEK_TO_BEGIN );
     835                 :            : 
     836                 :        101 :     bool bLoop = true;
     837 [ +  + ][ +  + ]:        438 :     while( bLoop && (rStrm.GetRecLeft() >= 4) )
                 [ +  + ]
     838                 :            :     {
     839                 :            :         sal_uInt16 nSubRecId, nSubRecSize;
     840 [ +  - ][ +  - ]:        337 :         rStrm >> nSubRecId >> nSubRecSize;
     841         [ +  - ]:        337 :         rStrm.PushPosition();
     842                 :            :         // sometimes the last subrecord has an invalid length (OBJLBSDATA) -> min()
     843 [ +  - ][ +  - ]:        337 :         nSubRecSize = static_cast< sal_uInt16 >( ::std::min< sal_Size >( nSubRecSize, rStrm.GetRecLeft() ) );
     844                 :            : 
     845   [ +  -  +  + ]:        337 :         switch( nSubRecId )
     846                 :            :         {
     847                 :            :             case EXC_ID_OBJCMO:
     848                 :            :                 OSL_ENSURE( rStrm.GetRecPos() == 4, "XclImpDrawObjBase::ImplReadObj8 - unexpected OBJCMO subrecord" );
     849 [ +  - ][ +  - ]:        101 :                 if( (rStrm.GetRecPos() == 4) && (nSubRecSize >= 6) )
         [ +  - ][ +  - ]
     850                 :            :                 {
     851                 :            :                     sal_uInt16 nObjFlags;
     852 [ +  - ][ +  - ]:        101 :                     rStrm >> mnObjType >> mnObjId >> nObjFlags;
                 [ +  - ]
     853                 :        101 :                     mbPrintable = ::get_flag( nObjFlags, EXC_OBJCMO_PRINTABLE );
     854                 :            :                 }
     855                 :        101 :             break;
     856                 :            :             case EXC_ID_OBJMACRO:
     857         [ #  # ]:          0 :                 ReadMacro8( rStrm );
     858                 :          0 :             break;
     859                 :            :             case EXC_ID_OBJEND:
     860                 :         83 :                 bLoop = false;
     861                 :         83 :             break;
     862                 :            :             default:
     863         [ +  - ]:        153 :                 DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
     864                 :            :         }
     865                 :            : 
     866         [ +  - ]:        337 :         rStrm.PopPosition();
     867         [ +  - ]:        337 :         rStrm.Ignore( nSubRecSize );
     868                 :            :     }
     869                 :            : 
     870                 :            :     /*  Call DoReadObj8SubRec() with EXC_ID_OBJEND for further stream
     871                 :            :         processing (e.g. charts), even if the OBJEND subrecord is missing. */
     872                 :        101 :     DoReadObj8SubRec( rStrm, EXC_ID_OBJEND, 0 );
     873                 :            : 
     874                 :            :     /*  Pictures that Excel reads from BIFF5 and writes to BIFF8 still have the
     875                 :            :         IMGDATA record following the OBJ record (but they use the image data
     876                 :            :         stored in DFF). The IMGDATA record may be continued by several CONTINUE
     877                 :            :         records. But the last CONTINUE record may be in fact an MSODRAWING
     878                 :            :         record that contains the DFF data of the next drawing object! So we
     879                 :            :         have to skip just enough CONTINUE records to look at the next
     880                 :            :         MSODRAWING/CONTINUE record. */
     881 [ #  # ][ -  + ]:        101 :     if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() )
                 [ -  + ]
     882                 :            :     {
     883                 :            :         sal_uInt32 nDataSize;
     884         [ #  # ]:          0 :         rStrm.Ignore( 4 );
     885         [ #  # ]:          0 :         rStrm >> nDataSize;
     886         [ #  # ]:          0 :         nDataSize -= rStrm.GetRecLeft();
     887                 :            :         // skip following CONTINUE records until IMGDATA ends
     888 [ #  # ][ #  # ]:          0 :         while( (nDataSize > 0) && (rStrm.GetNextRecId() == EXC_ID_CONT) && rStrm.StartNextRecord() )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     889                 :            :         {
     890                 :            :             OSL_ENSURE( nDataSize >= rStrm.GetRecLeft(), "XclImpDrawObjBase::ImplReadObj8 - CONTINUE too long" );
     891 [ #  # ][ #  # ]:          0 :             nDataSize -= ::std::min< sal_uInt32 >( rStrm.GetRecLeft(), nDataSize );
     892                 :            :         }
     893                 :            :         OSL_ENSURE( nDataSize == 0, "XclImpDrawObjBase::ImplReadObj8 - missing CONTINUE records" );
     894                 :            :         // next record may be MSODRAWING or CONTINUE or anything else
     895                 :            :     }
     896                 :        101 : }
     897                 :            : 
     898                 :            : // ----------------------------------------------------------------------------
     899                 :            : 
     900                 :          0 : void XclImpDrawObjVector::InsertGrouped( XclImpDrawObjRef xDrawObj )
     901                 :            : {
     902         [ #  # ]:          0 :     if( !empty() )
     903 [ #  # ][ #  # ]:          0 :         if( XclImpGroupObj* pGroupObj = dynamic_cast< XclImpGroupObj* >( back().get() ) )
     904 [ #  # ][ #  # ]:          0 :             if( pGroupObj->TryInsert( xDrawObj ) )
     905                 :          0 :                 return;
     906                 :          0 :     push_back( xDrawObj );
     907                 :            : }
     908                 :            : 
     909                 :         86 : sal_Size XclImpDrawObjVector::GetProgressSize() const
     910                 :            : {
     911                 :         86 :     sal_Size nProgressSize = 0;
     912 [ +  - ][ -  + ]:         86 :     for( const_iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
     913         [ #  # ]:          0 :         nProgressSize += (*aIt)->GetProgressSize();
     914                 :         86 :     return nProgressSize;
     915                 :            : }
     916                 :            : 
     917                 :            : // ----------------------------------------------------------------------------
     918                 :            : 
     919                 :          0 : XclImpPhObj::XclImpPhObj( const XclImpRoot& rRoot ) :
     920                 :          0 :     XclImpDrawObjBase( rRoot )
     921                 :            : {
     922                 :          0 :     SetProcessSdrObj( false );
     923                 :          0 : }
     924                 :            : 
     925                 :            : // ----------------------------------------------------------------------------
     926                 :            : 
     927                 :          0 : XclImpGroupObj::XclImpGroupObj( const XclImpRoot& rRoot ) :
     928                 :            :     XclImpDrawObjBase( rRoot ),
     929         [ #  # ]:          0 :     mnFirstUngrouped( 0 )
     930                 :            : {
     931                 :          0 : }
     932                 :            : 
     933                 :          0 : bool XclImpGroupObj::TryInsert( XclImpDrawObjRef xDrawObj )
     934                 :            : {
     935         [ #  # ]:          0 :     if( xDrawObj->GetObjId() == mnFirstUngrouped )
     936                 :          0 :         return false;
     937                 :            :     // insert into own list or into nested group
     938         [ #  # ]:          0 :     maChildren.InsertGrouped( xDrawObj );
     939                 :          0 :     return true;
     940                 :            : }
     941                 :            : 
     942                 :          0 : void XclImpGroupObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
     943                 :            : {
     944                 :          0 :     rStrm.Ignore( 4 );
     945                 :          0 :     rStrm >> mnFirstUngrouped;
     946                 :          0 :     rStrm.Ignore( 16 );
     947                 :          0 :     ReadMacro3( rStrm, nMacroSize );
     948                 :          0 : }
     949                 :            : 
     950                 :          0 : void XclImpGroupObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
     951                 :            : {
     952                 :          0 :     rStrm.Ignore( 4 );
     953                 :          0 :     rStrm >> mnFirstUngrouped;
     954                 :          0 :     rStrm.Ignore( 16 );
     955                 :          0 :     ReadMacro4( rStrm, nMacroSize );
     956                 :          0 : }
     957                 :            : 
     958                 :          0 : void XclImpGroupObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
     959                 :            : {
     960                 :          0 :     rStrm.Ignore( 4 );
     961                 :          0 :     rStrm >> mnFirstUngrouped;
     962                 :          0 :     rStrm.Ignore( 16 );
     963                 :          0 :     ReadName5( rStrm, nNameLen );
     964                 :          0 :     ReadMacro5( rStrm, nMacroSize );
     965                 :          0 : }
     966                 :            : 
     967                 :          0 : sal_Size XclImpGroupObj::DoGetProgressSize() const
     968                 :            : {
     969                 :          0 :     return XclImpDrawObjBase::DoGetProgressSize() + maChildren.GetProgressSize();
     970                 :            : }
     971                 :            : 
     972                 :          0 : SdrObject* XclImpGroupObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& /*rAnchorRect*/ ) const
     973                 :            : {
     974 [ #  # ][ #  # ]:          0 :     TSdrObjectPtr< SdrObjGroup > xSdrObj( new SdrObjGroup );
     975                 :            :     // child objects in BIFF2-BIFF5 have absolute size, not needed to pass own anchor rectangle
     976         [ #  # ]:          0 :     SdrObjList& rObjList = *xSdrObj->GetSubList();  // SdrObjGroup always returns existing sublist
     977 [ #  # ][ #  # ]:          0 :     for( XclImpDrawObjVector::const_iterator aIt = maChildren.begin(), aEnd = maChildren.end(); aIt != aEnd; ++aIt )
     978         [ #  # ]:          0 :         rDffConv.ProcessObject( rObjList, **aIt );
     979         [ #  # ]:          0 :     rDffConv.Progress();
     980         [ #  # ]:          0 :     return xSdrObj.release();
     981                 :            : }
     982                 :            : 
     983                 :            : // ----------------------------------------------------------------------------
     984                 :            : 
     985                 :          0 : XclImpLineObj::XclImpLineObj( const XclImpRoot& rRoot ) :
     986                 :            :     XclImpDrawObjBase( rRoot ),
     987                 :            :     mnArrows( 0 ),
     988         [ #  # ]:          0 :     mnStartPoint( EXC_OBJ_LINE_TL )
     989                 :            : {
     990                 :          0 :     SetAreaObj( false );
     991                 :          0 : }
     992                 :            : 
     993                 :          0 : void XclImpLineObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
     994                 :            : {
     995                 :          0 :     rStrm >> maLineData >> mnArrows >> mnStartPoint;
     996                 :          0 :     rStrm.Ignore( 1 );
     997                 :          0 :     ReadMacro3( rStrm, nMacroSize );
     998                 :          0 : }
     999                 :            : 
    1000                 :          0 : void XclImpLineObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1001                 :            : {
    1002                 :          0 :     rStrm >> maLineData >> mnArrows >> mnStartPoint;
    1003                 :          0 :     rStrm.Ignore( 1 );
    1004                 :          0 :     ReadMacro4( rStrm, nMacroSize );
    1005                 :          0 : }
    1006                 :            : 
    1007                 :          0 : void XclImpLineObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
    1008                 :            : {
    1009                 :          0 :     rStrm >> maLineData >> mnArrows >> mnStartPoint;
    1010                 :          0 :     rStrm.Ignore( 1 );
    1011                 :          0 :     ReadName5( rStrm, nNameLen );
    1012                 :          0 :     ReadMacro5( rStrm, nMacroSize );
    1013                 :          0 : }
    1014                 :            : 
    1015                 :          0 : SdrObject* XclImpLineObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
    1016                 :            : {
    1017         [ #  # ]:          0 :     ::basegfx::B2DPolygon aB2DPolygon;
    1018   [ #  #  #  # ]:          0 :     switch( mnStartPoint )
    1019                 :            :     {
    1020                 :            :         default:
    1021                 :            :         case EXC_OBJ_LINE_TL:
    1022         [ #  # ]:          0 :             aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Left(), rAnchorRect.Top() ) );
    1023         [ #  # ]:          0 :             aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Right(), rAnchorRect.Bottom() ) );
    1024                 :          0 :         break;
    1025                 :            :         case EXC_OBJ_LINE_TR:
    1026         [ #  # ]:          0 :             aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Right(), rAnchorRect.Top() ) );
    1027         [ #  # ]:          0 :             aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Left(), rAnchorRect.Bottom() ) );
    1028                 :          0 :         break;
    1029                 :            :         case EXC_OBJ_LINE_BR:
    1030         [ #  # ]:          0 :             aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Right(), rAnchorRect.Bottom() ) );
    1031         [ #  # ]:          0 :             aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Left(), rAnchorRect.Top() ) );
    1032                 :          0 :         break;
    1033                 :            :         case EXC_OBJ_LINE_BL:
    1034         [ #  # ]:          0 :             aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Left(), rAnchorRect.Bottom() ) );
    1035         [ #  # ]:          0 :             aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Right(), rAnchorRect.Top() ) );
    1036                 :          0 :         break;
    1037                 :            :     }
    1038 [ #  # ][ #  # ]:          0 :     SdrObjectPtr xSdrObj( new SdrPathObj( OBJ_LINE, ::basegfx::B2DPolyPolygon( aB2DPolygon ) ) );
         [ #  # ][ #  # ]
    1039         [ #  # ]:          0 :     ConvertLineStyle( *xSdrObj, maLineData );
    1040                 :            : 
    1041                 :            :     // line ends
    1042                 :          0 :     sal_uInt8 nArrowType = ::extract_value< sal_uInt8 >( mnArrows, 0, 4 );
    1043                 :          0 :     bool bLineStart = false;
    1044                 :          0 :     bool bLineEnd = false;
    1045                 :          0 :     bool bFilled = false;
    1046   [ #  #  #  #  :          0 :     switch( nArrowType )
                      # ]
    1047                 :            :     {
    1048                 :          0 :         case EXC_OBJ_ARROW_OPEN:        bLineStart = false; bLineEnd = true;  bFilled = false;  break;
    1049                 :          0 :         case EXC_OBJ_ARROW_OPENBOTH:    bLineStart = true;  bLineEnd = true;  bFilled = false;  break;
    1050                 :          0 :         case EXC_OBJ_ARROW_FILLED:      bLineStart = false; bLineEnd = true;  bFilled = true;   break;
    1051                 :          0 :         case EXC_OBJ_ARROW_FILLEDBOTH:  bLineStart = true;  bLineEnd = true;  bFilled = true;   break;
    1052                 :            :     }
    1053 [ #  # ][ #  # ]:          0 :     if( bLineStart || bLineEnd )
    1054                 :            :     {
    1055                 :          0 :         sal_uInt8 nArrowWidth = ::extract_value< sal_uInt8 >( mnArrows, 4, 4 );
    1056                 :          0 :         double fArrowWidth = 3.0;
    1057   [ #  #  #  # ]:          0 :         switch( nArrowWidth )
    1058                 :            :         {
    1059                 :          0 :             case EXC_OBJ_ARROW_NARROW:  fArrowWidth = 2.0;  break;
    1060                 :          0 :             case EXC_OBJ_ARROW_MEDIUM:  fArrowWidth = 3.0;  break;
    1061                 :          0 :             case EXC_OBJ_ARROW_WIDE:    fArrowWidth = 5.0;  break;
    1062                 :            :         }
    1063                 :            : 
    1064                 :          0 :         sal_uInt8 nArrowLength = ::extract_value< sal_uInt8 >( mnArrows, 8, 4 );
    1065                 :          0 :         double fArrowLength = 3.0;
    1066   [ #  #  #  # ]:          0 :         switch( nArrowLength )
    1067                 :            :         {
    1068                 :          0 :             case EXC_OBJ_ARROW_NARROW:  fArrowLength = 2.5; break;
    1069                 :          0 :             case EXC_OBJ_ARROW_MEDIUM:  fArrowLength = 3.5; break;
    1070                 :          0 :             case EXC_OBJ_ARROW_WIDE:    fArrowLength = 6.0; break;
    1071                 :            :         }
    1072                 :            : 
    1073         [ #  # ]:          0 :         ::basegfx::B2DPolygon aArrowPoly;
    1074                 :            : #define EXC_ARROW_POINT( x, y ) ::basegfx::B2DPoint( fArrowWidth * (x), fArrowLength * (y) )
    1075         [ #  # ]:          0 :         if( bFilled )
    1076                 :            :         {
    1077         [ #  # ]:          0 :             aArrowPoly.append( EXC_ARROW_POINT(   0, 100 ) );
    1078         [ #  # ]:          0 :             aArrowPoly.append( EXC_ARROW_POINT(  50,   0 ) );
    1079         [ #  # ]:          0 :             aArrowPoly.append( EXC_ARROW_POINT( 100, 100 ) );
    1080                 :            :         }
    1081                 :            :         else
    1082                 :            :         {
    1083         [ #  # ]:          0 :             sal_uInt8 nLineWidth = ::limit_cast< sal_uInt8 >( maLineData.mnWidth, EXC_OBJ_LINE_THIN, EXC_OBJ_LINE_THICK );
    1084         [ #  # ]:          0 :             aArrowPoly.append( EXC_ARROW_POINT( 50, 0 ) );
    1085         [ #  # ]:          0 :             aArrowPoly.append( EXC_ARROW_POINT( 100, 100 - 3 * nLineWidth ) );
    1086         [ #  # ]:          0 :             aArrowPoly.append( EXC_ARROW_POINT( 100 - 5 * nLineWidth, 100 ) );
    1087         [ #  # ]:          0 :             aArrowPoly.append( EXC_ARROW_POINT( 50, 12 * nLineWidth ) );
    1088         [ #  # ]:          0 :             aArrowPoly.append( EXC_ARROW_POINT( 5 * nLineWidth, 100 ) );
    1089         [ #  # ]:          0 :             aArrowPoly.append( EXC_ARROW_POINT( 0, 100 - 3 * nLineWidth ) );
    1090                 :            :         }
    1091                 :            : #undef EXC_ARROW_POINT
    1092                 :            : 
    1093         [ #  # ]:          0 :         ::basegfx::B2DPolyPolygon aArrowPolyPoly( aArrowPoly );
    1094                 :          0 :         long nWidth = static_cast< long >( 125 * fArrowWidth );
    1095         [ #  # ]:          0 :         if( bLineStart )
    1096                 :            :         {
    1097 [ #  # ][ #  # ]:          0 :             xSdrObj->SetMergedItem( XLineStartItem( EMPTY_STRING, aArrowPolyPoly ) );
         [ #  # ][ #  # ]
    1098 [ #  # ][ #  # ]:          0 :             xSdrObj->SetMergedItem( XLineStartWidthItem( nWidth ) );
                 [ #  # ]
    1099 [ #  # ][ #  # ]:          0 :             xSdrObj->SetMergedItem( XLineStartCenterItem( false ) );
                 [ #  # ]
    1100                 :            :         }
    1101         [ #  # ]:          0 :         if( bLineEnd )
    1102                 :            :         {
    1103 [ #  # ][ #  # ]:          0 :             xSdrObj->SetMergedItem( XLineEndItem( EMPTY_STRING, aArrowPolyPoly ) );
         [ #  # ][ #  # ]
    1104 [ #  # ][ #  # ]:          0 :             xSdrObj->SetMergedItem( XLineEndWidthItem( nWidth ) );
                 [ #  # ]
    1105 [ #  # ][ #  # ]:          0 :             xSdrObj->SetMergedItem( XLineEndCenterItem( false ) );
                 [ #  # ]
    1106 [ #  # ][ #  # ]:          0 :         }
    1107                 :            :     }
    1108         [ #  # ]:          0 :     rDffConv.Progress();
    1109 [ #  # ][ #  # ]:          0 :     return xSdrObj.release();
    1110                 :            : }
    1111                 :            : 
    1112                 :            : // ----------------------------------------------------------------------------
    1113                 :            : 
    1114                 :        101 : XclImpRectObj::XclImpRectObj( const XclImpRoot& rRoot ) :
    1115                 :            :     XclImpDrawObjBase( rRoot ),
    1116 [ +  - ][ +  - ]:        101 :     mnFrameFlags( 0 )
    1117                 :            : {
    1118                 :        101 :     SetAreaObj( true );
    1119                 :        101 : }
    1120                 :            : 
    1121                 :          0 : void XclImpRectObj::ReadFrameData( XclImpStream& rStrm )
    1122                 :            : {
    1123                 :          0 :     rStrm >> maFillData >> maLineData >> mnFrameFlags;
    1124                 :          0 : }
    1125                 :            : 
    1126                 :          0 : void XclImpRectObj::ConvertRectStyle( SdrObject& rSdrObj ) const
    1127                 :            : {
    1128                 :          0 :     ConvertLineStyle( rSdrObj, maLineData );
    1129                 :          0 :     ConvertFillStyle( rSdrObj, maFillData );
    1130                 :          0 :     ConvertFrameStyle( rSdrObj, mnFrameFlags );
    1131                 :          0 : }
    1132                 :            : 
    1133                 :          0 : void XclImpRectObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1134                 :            : {
    1135                 :          0 :     ReadFrameData( rStrm );
    1136                 :          0 :     ReadMacro3( rStrm, nMacroSize );
    1137                 :          0 : }
    1138                 :            : 
    1139                 :          0 : void XclImpRectObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1140                 :            : {
    1141                 :          0 :     ReadFrameData( rStrm );
    1142                 :          0 :     ReadMacro4( rStrm, nMacroSize );
    1143                 :          0 : }
    1144                 :            : 
    1145                 :          0 : void XclImpRectObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
    1146                 :            : {
    1147                 :          0 :     ReadFrameData( rStrm );
    1148                 :          0 :     ReadName5( rStrm, nNameLen );
    1149                 :          0 :     ReadMacro5( rStrm, nMacroSize );
    1150                 :          0 : }
    1151                 :            : 
    1152                 :          0 : SdrObject* XclImpRectObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
    1153                 :            : {
    1154 [ #  # ][ #  # ]:          0 :     SdrObjectPtr xSdrObj( new SdrRectObj( rAnchorRect ) );
    1155         [ #  # ]:          0 :     ConvertRectStyle( *xSdrObj );
    1156         [ #  # ]:          0 :     rDffConv.Progress();
    1157         [ #  # ]:          0 :     return xSdrObj.release();
    1158                 :            : }
    1159                 :            : 
    1160                 :            : // ----------------------------------------------------------------------------
    1161                 :            : 
    1162                 :          0 : XclImpOvalObj::XclImpOvalObj( const XclImpRoot& rRoot ) :
    1163                 :          0 :     XclImpRectObj( rRoot )
    1164                 :            : {
    1165                 :          0 : }
    1166                 :            : 
    1167                 :          0 : SdrObject* XclImpOvalObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
    1168                 :            : {
    1169 [ #  # ][ #  # ]:          0 :     SdrObjectPtr xSdrObj( new SdrCircObj( OBJ_CIRC, rAnchorRect ) );
    1170         [ #  # ]:          0 :     ConvertRectStyle( *xSdrObj );
    1171         [ #  # ]:          0 :     rDffConv.Progress();
    1172         [ #  # ]:          0 :     return xSdrObj.release();
    1173                 :            : }
    1174                 :            : 
    1175                 :            : // ----------------------------------------------------------------------------
    1176                 :            : 
    1177                 :          0 : XclImpArcObj::XclImpArcObj( const XclImpRoot& rRoot ) :
    1178                 :            :     XclImpDrawObjBase( rRoot ),
    1179 [ #  # ][ #  # ]:          0 :     mnQuadrant( EXC_OBJ_ARC_TR )
    1180                 :            : {
    1181                 :          0 :     SetAreaObj( false );    // arc may be 2-dimensional
    1182                 :          0 : }
    1183                 :            : 
    1184                 :          0 : void XclImpArcObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1185                 :            : {
    1186                 :          0 :     rStrm >> maFillData >> maLineData >> mnQuadrant;
    1187                 :          0 :     rStrm.Ignore( 1 );
    1188                 :          0 :     ReadMacro3( rStrm, nMacroSize );
    1189                 :          0 : }
    1190                 :            : 
    1191                 :          0 : void XclImpArcObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1192                 :            : {
    1193                 :          0 :     rStrm >> maFillData >> maLineData >> mnQuadrant;
    1194                 :          0 :     rStrm.Ignore( 1 );
    1195                 :          0 :     ReadMacro4( rStrm, nMacroSize );
    1196                 :          0 : }
    1197                 :            : 
    1198                 :          0 : void XclImpArcObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
    1199                 :            : {
    1200                 :          0 :     rStrm >> maFillData >> maLineData >> mnQuadrant;
    1201                 :          0 :     rStrm.Ignore( 1 );
    1202                 :          0 :     ReadName5( rStrm, nNameLen );
    1203                 :          0 :     ReadMacro5( rStrm, nMacroSize );
    1204                 :          0 : }
    1205                 :            : 
    1206                 :          0 : SdrObject* XclImpArcObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
    1207                 :            : {
    1208                 :          0 :     Rectangle aNewRect = rAnchorRect;
    1209                 :          0 :     long nStartAngle = 0;
    1210                 :          0 :     long nEndAngle = 0;
    1211   [ #  #  #  # ]:          0 :     switch( mnQuadrant )
    1212                 :            :     {
    1213                 :            :         default:
    1214                 :            :         case EXC_OBJ_ARC_TR:
    1215                 :          0 :             nStartAngle = 0;
    1216                 :          0 :             nEndAngle = 9000;
    1217         [ #  # ]:          0 :             aNewRect.Left() -= rAnchorRect.GetWidth();
    1218         [ #  # ]:          0 :             aNewRect.Bottom() += rAnchorRect.GetHeight();
    1219                 :          0 :         break;
    1220                 :            :         case EXC_OBJ_ARC_TL:
    1221                 :          0 :             nStartAngle = 9000;
    1222                 :          0 :             nEndAngle = 18000;
    1223         [ #  # ]:          0 :             aNewRect.Right() += rAnchorRect.GetWidth();
    1224         [ #  # ]:          0 :             aNewRect.Bottom() += rAnchorRect.GetHeight();
    1225                 :          0 :         break;
    1226                 :            :         case EXC_OBJ_ARC_BL:
    1227                 :          0 :             nStartAngle = 18000;
    1228                 :          0 :             nEndAngle = 27000;
    1229         [ #  # ]:          0 :             aNewRect.Right() += rAnchorRect.GetWidth();
    1230         [ #  # ]:          0 :             aNewRect.Top() -= rAnchorRect.GetHeight();
    1231                 :          0 :         break;
    1232                 :            :         case EXC_OBJ_ARC_BR:
    1233                 :          0 :             nStartAngle = 27000;
    1234                 :          0 :             nEndAngle = 0;
    1235         [ #  # ]:          0 :             aNewRect.Left() -= rAnchorRect.GetWidth();
    1236         [ #  # ]:          0 :             aNewRect.Top() -= rAnchorRect.GetHeight();
    1237                 :          0 :         break;
    1238                 :            :     }
    1239 [ #  # ][ #  # ]:          0 :     SdrObjKind eObjKind = maFillData.IsFilled() ? OBJ_SECT : OBJ_CARC;
    1240 [ #  # ][ #  # ]:          0 :     SdrObjectPtr xSdrObj( new SdrCircObj( eObjKind, aNewRect, nStartAngle, nEndAngle ) );
    1241         [ #  # ]:          0 :     ConvertFillStyle( *xSdrObj, maFillData );
    1242         [ #  # ]:          0 :     ConvertLineStyle( *xSdrObj, maLineData );
    1243         [ #  # ]:          0 :     rDffConv.Progress();
    1244         [ #  # ]:          0 :     return xSdrObj.release();
    1245                 :            : }
    1246                 :            : 
    1247                 :            : // ----------------------------------------------------------------------------
    1248                 :            : 
    1249                 :          0 : XclImpPolygonObj::XclImpPolygonObj( const XclImpRoot& rRoot ) :
    1250                 :            :     XclImpRectObj( rRoot ),
    1251                 :            :     mnPolyFlags( 0 ),
    1252         [ #  # ]:          0 :     mnPointCount( 0 )
    1253                 :            : {
    1254                 :          0 :     SetAreaObj( false );    // polygon may be 2-dimensional
    1255                 :          0 : }
    1256                 :            : 
    1257                 :          0 : void XclImpPolygonObj::ReadCoordList( XclImpStream& rStrm )
    1258                 :            : {
    1259 [ #  # ][ #  # ]:          0 :     if( (rStrm.GetNextRecId() == EXC_ID_COORDLIST) && rStrm.StartNextRecord() )
                 [ #  # ]
    1260                 :            :     {
    1261                 :            :         OSL_ENSURE( rStrm.GetRecLeft() / 4 == mnPointCount, "XclImpPolygonObj::ReadCoordList - wrong polygon point count" );
    1262         [ #  # ]:          0 :         while( rStrm.GetRecLeft() >= 4 )
    1263                 :            :         {
    1264                 :            :             sal_uInt16 nX, nY;
    1265 [ #  # ][ #  # ]:          0 :             rStrm >> nX >> nY;
    1266         [ #  # ]:          0 :             maCoords.push_back( Point( nX, nY ) );
    1267                 :            :         }
    1268                 :            :     }
    1269                 :          0 : }
    1270                 :            : 
    1271                 :          0 : void XclImpPolygonObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1272                 :            : {
    1273                 :          0 :     ReadFrameData( rStrm );
    1274                 :          0 :     rStrm >> mnPolyFlags;
    1275                 :          0 :     rStrm.Ignore( 10 );
    1276                 :          0 :     rStrm >> mnPointCount;
    1277                 :          0 :     rStrm.Ignore( 8 );
    1278                 :          0 :     ReadMacro4( rStrm, nMacroSize );
    1279                 :          0 :     ReadCoordList( rStrm );
    1280                 :          0 : }
    1281                 :            : 
    1282                 :          0 : void XclImpPolygonObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
    1283                 :            : {
    1284                 :          0 :     ReadFrameData( rStrm );
    1285                 :          0 :     rStrm >> mnPolyFlags;
    1286                 :          0 :     rStrm.Ignore( 10 );
    1287                 :          0 :     rStrm >> mnPointCount;
    1288                 :          0 :     rStrm.Ignore( 8 );
    1289                 :          0 :     ReadName5( rStrm, nNameLen );
    1290                 :          0 :     ReadMacro5( rStrm, nMacroSize );
    1291                 :          0 :     ReadCoordList( rStrm );
    1292                 :          0 : }
    1293                 :            : 
    1294                 :            : namespace {
    1295                 :            : 
    1296                 :          0 : ::basegfx::B2DPoint lclGetPolyPoint( const Rectangle& rAnchorRect, const Point& rPoint )
    1297                 :            : {
    1298                 :            :     return ::basegfx::B2DPoint(
    1299 [ #  # ][ #  # ]:          0 :         rAnchorRect.Left() + static_cast< sal_Int32 >( ::std::min< double >( rPoint.X(), 16384.0 ) / 16384.0 * rAnchorRect.GetWidth() + 0.5 ),
    1300 [ #  # ][ #  # ]:          0 :         rAnchorRect.Top() + static_cast< sal_Int32 >( ::std::min< double >( rPoint.Y(), 16384.0 ) / 16384.0 * rAnchorRect.GetHeight() + 0.5 ) );
    1301                 :            : }
    1302                 :            : 
    1303                 :            : } // namespace
    1304                 :            : 
    1305                 :          0 : SdrObject* XclImpPolygonObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
    1306                 :            : {
    1307                 :          0 :     SdrObjectPtr xSdrObj;
    1308         [ #  # ]:          0 :     if( maCoords.size() >= 2 )
    1309                 :            :     {
    1310                 :            :         // create the polygon
    1311         [ #  # ]:          0 :         ::basegfx::B2DPolygon aB2DPolygon;
    1312 [ #  # ][ #  # ]:          0 :         for( PointVector::const_iterator aIt = maCoords.begin(), aEnd = maCoords.end(); aIt != aEnd; ++aIt )
    1313 [ #  # ][ #  # ]:          0 :             aB2DPolygon.append( lclGetPolyPoint( rAnchorRect, *aIt ) );
    1314                 :            :         // close polygon if specified
    1315 [ #  # ][ #  # ]:          0 :         if( ::get_flag( mnPolyFlags, EXC_OBJ_POLY_CLOSED ) && (maCoords.front() != maCoords.back()) )
         [ #  # ][ #  # ]
    1316 [ #  # ][ #  # ]:          0 :             aB2DPolygon.append( lclGetPolyPoint( rAnchorRect, maCoords.front() ) );
    1317                 :            :         // create the SdrObject
    1318 [ #  # ][ #  # ]:          0 :         SdrObjKind eObjKind = maFillData.IsFilled() ? OBJ_PATHPOLY : OBJ_PATHPLIN;
    1319 [ #  # ][ #  # ]:          0 :         xSdrObj.reset( new SdrPathObj( eObjKind, ::basegfx::B2DPolyPolygon( aB2DPolygon ) ) );
         [ #  # ][ #  # ]
                 [ #  # ]
    1320 [ #  # ][ #  # ]:          0 :         ConvertRectStyle( *xSdrObj );
    1321                 :            :     }
    1322         [ #  # ]:          0 :     rDffConv.Progress();
    1323         [ #  # ]:          0 :     return xSdrObj.release();
    1324                 :            : }
    1325                 :            : 
    1326                 :            : // ----------------------------------------------------------------------------
    1327                 :            : 
    1328                 :         30 : void XclImpObjTextData::ReadByteString( XclImpStream& rStrm )
    1329                 :            : {
    1330                 :         30 :     mxString.reset();
    1331         [ -  + ]:         30 :     if( maData.mnTextLen > 0 )
    1332                 :            :     {
    1333 [ #  # ][ #  # ]:          0 :         mxString.reset( new XclImpString( rStrm.ReadRawByteString( maData.mnTextLen ) ) );
                 [ #  # ]
    1334                 :            :         // skip padding byte for word boundaries
    1335         [ #  # ]:          0 :         if( rStrm.GetRecPos() & 1 ) rStrm.Ignore( 1 );
    1336                 :            :     }
    1337                 :         30 : }
    1338                 :            : 
    1339                 :         48 : void XclImpObjTextData::ReadFormats( XclImpStream& rStrm )
    1340                 :            : {
    1341         [ +  - ]:         48 :     if( mxString )
    1342                 :         48 :         mxString->ReadObjFormats( rStrm, maData.mnFormatSize );
    1343                 :            :     else
    1344                 :          0 :         rStrm.Ignore( maData.mnFormatSize );
    1345                 :         48 : }
    1346                 :            : 
    1347                 :            : // ----------------------------------------------------------------------------
    1348                 :            : 
    1349                 :         81 : XclImpTextObj::XclImpTextObj( const XclImpRoot& rRoot ) :
    1350         [ +  - ]:         81 :     XclImpRectObj( rRoot )
    1351                 :            : {
    1352                 :         81 : }
    1353                 :            : 
    1354                 :          0 : void XclImpTextObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1355                 :            : {
    1356                 :          0 :     ReadFrameData( rStrm );
    1357                 :          0 :     maTextData.maData.ReadObj3( rStrm );
    1358                 :          0 :     ReadMacro3( rStrm, nMacroSize );
    1359                 :          0 :     maTextData.ReadByteString( rStrm );
    1360                 :          0 :     maTextData.ReadFormats( rStrm );
    1361                 :          0 : }
    1362                 :            : 
    1363                 :          0 : void XclImpTextObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1364                 :            : {
    1365                 :          0 :     ReadFrameData( rStrm );
    1366                 :          0 :     maTextData.maData.ReadObj3( rStrm );
    1367                 :          0 :     ReadMacro4( rStrm, nMacroSize );
    1368                 :          0 :     maTextData.ReadByteString( rStrm );
    1369                 :          0 :     maTextData.ReadFormats( rStrm );
    1370                 :          0 : }
    1371                 :            : 
    1372                 :          0 : void XclImpTextObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
    1373                 :            : {
    1374                 :          0 :     ReadFrameData( rStrm );
    1375                 :          0 :     maTextData.maData.ReadObj5( rStrm );
    1376                 :          0 :     ReadName5( rStrm, nNameLen );
    1377                 :          0 :     ReadMacro5( rStrm, nMacroSize );
    1378                 :          0 :     maTextData.ReadByteString( rStrm );
    1379                 :          0 :     rStrm.Ignore( maTextData.maData.mnLinkSize );   // ignore text link formula
    1380                 :          0 :     maTextData.ReadFormats( rStrm );
    1381                 :          0 : }
    1382                 :            : 
    1383                 :          0 : SdrObject* XclImpTextObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
    1384                 :            : {
    1385 [ #  # ][ #  # ]:          0 :     TSdrObjectPtr< SdrObjCustomShape > xSdrObj( new SdrObjCustomShape );
    1386         [ #  # ]:          0 :     xSdrObj->NbcSetSnapRect( rAnchorRect );
    1387         [ #  # ]:          0 :     OUString aRectType = CREATE_OUSTRING( "rectangle" );
    1388         [ #  # ]:          0 :     xSdrObj->MergeDefaultAttributes( &aRectType );
    1389         [ #  # ]:          0 :     ConvertRectStyle( *xSdrObj );
    1390                 :          0 :     sal_Bool bAutoSize = ::get_flag( maTextData.maData.mnFlags, EXC_OBJ_TEXT_AUTOSIZE );
    1391 [ #  # ][ #  # ]:          0 :     xSdrObj->SetMergedItem( SdrTextAutoGrowWidthItem( bAutoSize ) );
                 [ #  # ]
    1392 [ #  # ][ #  # ]:          0 :     xSdrObj->SetMergedItem( SdrTextAutoGrowHeightItem( bAutoSize ) );
                 [ #  # ]
    1393 [ #  # ][ #  # ]:          0 :     xSdrObj->SetMergedItem( SdrTextWordWrapItem( sal_True ) );
                 [ #  # ]
    1394         [ #  # ]:          0 :     rDffConv.Progress();
    1395         [ #  # ]:          0 :     return xSdrObj.release();
    1396                 :            : }
    1397                 :            : 
    1398                 :         36 : void XclImpTextObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
    1399                 :            : {
    1400                 :            :     // set text data
    1401 [ -  + ][ +  - ]:         36 :     if( SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( &rSdrObj ) )
    1402                 :            :     {
    1403         [ +  + ]:         36 :         if( maTextData.mxString )
    1404                 :            :         {
    1405         [ +  - ]:         33 :             if( maTextData.mxString->IsRich() )
    1406                 :            :             {
    1407                 :            :                 // rich text
    1408                 :            :                 ::std::auto_ptr< EditTextObject > xEditObj(
    1409         [ +  - ]:         33 :                     XclImpStringHelper::CreateTextObject( GetRoot(), *maTextData.mxString ) );
    1410 [ +  - ][ +  - ]:         33 :                 OutlinerParaObject* pOutlineObj = new OutlinerParaObject( *xEditObj );
                 [ +  - ]
    1411         [ +  - ]:         33 :                 pOutlineObj->SetOutlinerMode( OUTLINERMODE_TEXTOBJECT );
    1412                 :            :                 // text object takes ownership of the outliner object
    1413 [ +  - ][ +  - ]:         33 :                 pTextObj->NbcSetOutlinerParaObject( pOutlineObj );
    1414                 :            :             }
    1415                 :            :             else
    1416                 :            :             {
    1417                 :            :                 // plain text
    1418                 :          0 :                 pTextObj->NbcSetText( maTextData.mxString->GetText() );
    1419                 :            :             }
    1420                 :            : 
    1421                 :            :             /*  #i96858# Do not apply any formatting if there is no text.
    1422                 :            :                 SdrObjCustomShape::SetVerticalWriting (initiated from
    1423                 :            :                 SetMergedItem) calls SdrTextObj::ForceOutlinerParaObject which
    1424                 :            :                 ensures that we can erroneously write a ClientTextbox record
    1425                 :            :                 (with no content) while exporting to XLS, which can cause a
    1426                 :            :                 corrupted exported document. */
    1427                 :            : 
    1428                 :         33 :             SvxAdjust eHorAlign = SVX_ADJUST_LEFT;
    1429                 :         33 :             SdrTextVertAdjust eVerAlign = SDRTEXTVERTADJUST_TOP;
    1430                 :            : 
    1431                 :            :             // orientation (this is only a fake, drawing does not support real text orientation)
    1432                 :            :             namespace csst = ::com::sun::star::text;
    1433                 :         33 :             csst::WritingMode eWriteMode = csst::WritingMode_LR_TB;
    1434      [ +  -  - ]:         33 :             switch( maTextData.maData.mnOrient )
    1435                 :            :             {
    1436                 :            :                 default:
    1437                 :            :                 case EXC_OBJ_ORIENT_NONE:
    1438                 :            :                 {
    1439                 :         33 :                     eWriteMode = csst::WritingMode_LR_TB;
    1440   [ +  -  -  -  :         33 :                     switch( maTextData.maData.GetHorAlign() )
                      - ]
    1441                 :            :                     {
    1442                 :         33 :                         case EXC_OBJ_HOR_LEFT:      eHorAlign = SVX_ADJUST_LEFT;    break;
    1443                 :          0 :                         case EXC_OBJ_HOR_CENTER:    eHorAlign = SVX_ADJUST_CENTER;  break;
    1444                 :          0 :                         case EXC_OBJ_HOR_RIGHT:     eHorAlign = SVX_ADJUST_RIGHT;   break;
    1445                 :          0 :                         case EXC_OBJ_HOR_JUSTIFY:   eHorAlign = SVX_ADJUST_BLOCK;   break;
    1446                 :            :                     }
    1447   [ +  -  -  -  :         33 :                     switch( maTextData.maData.GetVerAlign() )
                      - ]
    1448                 :            :                     {
    1449                 :         33 :                         case EXC_OBJ_VER_TOP:       eVerAlign = SDRTEXTVERTADJUST_TOP;      break;
    1450                 :          0 :                         case EXC_OBJ_VER_CENTER:    eVerAlign = SDRTEXTVERTADJUST_CENTER;   break;
    1451                 :          0 :                         case EXC_OBJ_VER_BOTTOM:    eVerAlign = SDRTEXTVERTADJUST_BOTTOM;   break;
    1452                 :          0 :                         case EXC_OBJ_VER_JUSTIFY:   eVerAlign = SDRTEXTVERTADJUST_BLOCK;    break;
    1453                 :            :                     }
    1454                 :            :                 }
    1455                 :         33 :                 break;
    1456                 :            : 
    1457                 :            :                 case EXC_OBJ_ORIENT_90CCW:
    1458                 :            :                 {
    1459 [ #  # ][ #  # ]:          0 :                     if( SdrObjCustomShape* pObjCustomShape = dynamic_cast< SdrObjCustomShape* >( &rSdrObj ) )
    1460                 :            :                     {
    1461                 :          0 :                         double fAngle = 180.0;
    1462                 :          0 :                         com::sun::star::beans::PropertyValue aTextRotateAngle;
    1463         [ #  # ]:          0 :                         aTextRotateAngle.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "TextRotateAngle" ) );
    1464         [ #  # ]:          0 :                         aTextRotateAngle.Value <<= fAngle;
    1465 [ #  # ][ #  # ]:          0 :                         SdrCustomShapeGeometryItem aGeometryItem((SdrCustomShapeGeometryItem&)pObjCustomShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
    1466         [ #  # ]:          0 :                         aGeometryItem.SetPropertyValue( aTextRotateAngle );
    1467 [ #  # ][ #  # ]:          0 :                         pObjCustomShape->SetMergedItem( aGeometryItem );
    1468                 :            :                     }
    1469                 :          0 :                     eWriteMode = csst::WritingMode_TB_RL;
    1470   [ #  #  #  #  :          0 :                     switch( maTextData.maData.GetHorAlign() )
                      # ]
    1471                 :            :                     {
    1472                 :          0 :                         case EXC_OBJ_HOR_LEFT:      eVerAlign = SDRTEXTVERTADJUST_TOP;      break;
    1473                 :          0 :                         case EXC_OBJ_HOR_CENTER:    eVerAlign = SDRTEXTVERTADJUST_CENTER;   break;
    1474                 :          0 :                         case EXC_OBJ_HOR_RIGHT:     eVerAlign = SDRTEXTVERTADJUST_BOTTOM;   break;
    1475                 :          0 :                         case EXC_OBJ_HOR_JUSTIFY:   eVerAlign = SDRTEXTVERTADJUST_BLOCK;    break;
    1476                 :            :                     }
    1477                 :          0 :                     MSO_Anchor eTextAnchor = (MSO_Anchor)rDffConv.GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
    1478         [ #  # ]:          0 :                     switch( eTextAnchor )
    1479                 :            :                     {
    1480                 :            :                         case mso_anchorTopCentered :
    1481                 :            :                         case mso_anchorMiddleCentered :
    1482                 :            :                         case mso_anchorBottomCentered :
    1483                 :            :                         {
    1484                 :          0 :                             eHorAlign = SVX_ADJUST_CENTER;
    1485                 :            :                         }
    1486                 :          0 :                         break;
    1487                 :            : 
    1488                 :            :                         default:
    1489                 :            :                         {
    1490   [ #  #  #  #  :          0 :                             switch( maTextData.maData.GetVerAlign() )
                      # ]
    1491                 :            :                             {
    1492                 :          0 :                                 case EXC_OBJ_VER_TOP:       eHorAlign = SVX_ADJUST_RIGHT;   break;
    1493                 :          0 :                                 case EXC_OBJ_VER_CENTER:    eHorAlign = SVX_ADJUST_CENTER;  break;
    1494                 :          0 :                                 case EXC_OBJ_VER_BOTTOM:    eHorAlign = SVX_ADJUST_LEFT;    break;
    1495                 :          0 :                                 case EXC_OBJ_VER_JUSTIFY:   eHorAlign = SVX_ADJUST_BLOCK;   break;
    1496                 :            :                             }
    1497                 :            :                         }
    1498                 :            :                     }
    1499                 :            :                 }
    1500                 :          0 :                 break;
    1501                 :            : 
    1502                 :            :                 case EXC_OBJ_ORIENT_STACKED:    // PASSTHROUGH INTENDED
    1503                 :            :                 {
    1504                 :            :                     // sj: STACKED is not supported, maybe it can be optimized here a bit
    1505                 :            :                 }
    1506                 :            :                 case EXC_OBJ_ORIENT_90CW:
    1507                 :            :                 {
    1508                 :          0 :                     eWriteMode = csst::WritingMode_TB_RL;
    1509   [ #  #  #  #  :          0 :                     switch( maTextData.maData.GetHorAlign() )
                      # ]
    1510                 :            :                     {
    1511                 :          0 :                         case EXC_OBJ_HOR_LEFT:      eVerAlign = SDRTEXTVERTADJUST_BOTTOM;   break;
    1512                 :          0 :                         case EXC_OBJ_HOR_CENTER:    eVerAlign = SDRTEXTVERTADJUST_CENTER;   break;
    1513                 :          0 :                         case EXC_OBJ_HOR_RIGHT:     eVerAlign = SDRTEXTVERTADJUST_TOP;      break;
    1514                 :          0 :                         case EXC_OBJ_HOR_JUSTIFY:   eVerAlign = SDRTEXTVERTADJUST_BLOCK;    break;
    1515                 :            :                     }
    1516                 :          0 :                     MSO_Anchor eTextAnchor = (MSO_Anchor)rDffConv.GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
    1517         [ #  # ]:          0 :                     switch ( eTextAnchor )
    1518                 :            :                     {
    1519                 :            :                         case mso_anchorTopCentered :
    1520                 :            :                         case mso_anchorMiddleCentered :
    1521                 :            :                         case mso_anchorBottomCentered :
    1522                 :            :                         {
    1523                 :          0 :                             eHorAlign = SVX_ADJUST_CENTER;
    1524                 :            :                         }
    1525                 :          0 :                         break;
    1526                 :            : 
    1527                 :            :                         default:
    1528                 :            :                         {
    1529   [ #  #  #  #  :          0 :                             switch( maTextData.maData.GetVerAlign() )
                      # ]
    1530                 :            :                             {
    1531                 :          0 :                                 case EXC_OBJ_VER_TOP:       eHorAlign = SVX_ADJUST_LEFT;   break;
    1532                 :          0 :                                 case EXC_OBJ_VER_CENTER:    eHorAlign = SVX_ADJUST_CENTER;  break;
    1533                 :          0 :                                 case EXC_OBJ_VER_BOTTOM:    eHorAlign = SVX_ADJUST_RIGHT;   break;
    1534                 :          0 :                                 case EXC_OBJ_VER_JUSTIFY:   eHorAlign = SVX_ADJUST_BLOCK;   break;
    1535                 :            :                             }
    1536                 :            :                         }
    1537                 :            :                     }
    1538                 :            :                 }
    1539                 :          0 :                 break;
    1540                 :            :             }
    1541         [ +  - ]:         33 :             rSdrObj.SetMergedItem( SvxAdjustItem( eHorAlign, EE_PARA_JUST ) );
    1542         [ +  - ]:         33 :             rSdrObj.SetMergedItem( SdrTextVertAdjustItem( eVerAlign ) );
    1543         [ +  - ]:         33 :             rSdrObj.SetMergedItem( SvxWritingModeItem( eWriteMode, SDRATTR_TEXTDIRECTION ) );
    1544                 :            :         }
    1545                 :            :     }
    1546                 :            :     // base class processing
    1547                 :         36 :     XclImpRectObj::DoPreProcessSdrObj( rDffConv, rSdrObj );
    1548                 :         36 : }
    1549                 :            : 
    1550                 :            : // ----------------------------------------------------------------------------
    1551                 :            : 
    1552                 :          6 : XclImpChartObj::XclImpChartObj( const XclImpRoot& rRoot, bool bOwnTab ) :
    1553                 :            :     XclImpRectObj( rRoot ),
    1554         [ +  - ]:          6 :     mbOwnTab( bOwnTab )
    1555                 :            : {
    1556                 :          6 :     SetSimpleMacro( false );
    1557                 :          6 :     SetCustomDffObj( true );
    1558                 :          6 : }
    1559                 :            : 
    1560                 :          6 : void XclImpChartObj::ReadChartSubStream( XclImpStream& rStrm )
    1561                 :            : {
    1562 [ -  + ][ +  - ]:          6 :     if( mbOwnTab ? (rStrm.GetRecId() == EXC_ID5_BOF) : ((rStrm.GetNextRecId() == EXC_ID5_BOF) && rStrm.StartNextRecord()) )
         [ +  - ][ +  - ]
    1563                 :            :     {
    1564                 :            :         sal_uInt16 nBofType;
    1565         [ +  - ]:          6 :         rStrm.Seek( 2 );
    1566         [ +  - ]:          6 :         rStrm >> nBofType;
    1567                 :            :         OSL_ENSURE( nBofType == EXC_BOF_CHART, "XclImpChartObj::ReadChartSubStream - no chart BOF record" );
    1568                 :            : 
    1569                 :            :         // read chart, even if BOF record contains wrong substream identifier
    1570 [ +  - ][ +  - ]:          6 :         mxChart.reset( new XclImpChart( GetRoot(), mbOwnTab ) );
                 [ +  - ]
    1571         [ +  - ]:          6 :         mxChart->ReadChartSubStream( rStrm );
    1572         [ -  + ]:          6 :         if( mbOwnTab )
    1573         [ #  # ]:          6 :             FinalizeTabChart();
    1574                 :            :     }
    1575                 :            :     else
    1576                 :            :     {
    1577                 :            :         OSL_FAIL( "XclImpChartObj::ReadChartSubStream - missing chart substream" );
    1578                 :            :     }
    1579                 :          6 : }
    1580                 :            : 
    1581                 :          0 : void XclImpChartObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1582                 :            : {
    1583                 :            :     // read OBJ record and the following chart substream
    1584                 :          0 :     ReadFrameData( rStrm );
    1585                 :          0 :     rStrm.Ignore( 18 );
    1586                 :          0 :     ReadMacro3( rStrm, nMacroSize );
    1587                 :            :     // set frame format from OBJ record, it is used if chart itself is transparent
    1588         [ #  # ]:          0 :     if( mxChart )
    1589                 :          0 :         mxChart->UpdateObjFrame( maLineData, maFillData );
    1590                 :          0 : }
    1591                 :            : 
    1592                 :          0 : void XclImpChartObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    1593                 :            : {
    1594                 :            :     // read OBJ record and the following chart substream
    1595                 :          0 :     ReadFrameData( rStrm );
    1596                 :          0 :     rStrm.Ignore( 18 );
    1597                 :          0 :     ReadMacro4( rStrm, nMacroSize );
    1598                 :            :     // set frame format from OBJ record, it is used if chart itself is transparent
    1599         [ #  # ]:          0 :     if( mxChart )
    1600                 :          0 :         mxChart->UpdateObjFrame( maLineData, maFillData );
    1601                 :          0 : }
    1602                 :            : 
    1603                 :          0 : void XclImpChartObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
    1604                 :            : {
    1605                 :            :     // read OBJ record and the following chart substream
    1606                 :          0 :     ReadFrameData( rStrm );
    1607                 :          0 :     rStrm.Ignore( 18 );
    1608                 :          0 :     ReadName5( rStrm, nNameLen );
    1609                 :          0 :     ReadMacro5( rStrm, nMacroSize );
    1610                 :          0 :     ReadChartSubStream( rStrm );
    1611                 :            :     // set frame format from OBJ record, it is used if chart itself is transparent
    1612         [ #  # ]:          0 :     if( mxChart )
    1613                 :          0 :         mxChart->UpdateObjFrame( maLineData, maFillData );
    1614                 :          0 : }
    1615                 :            : 
    1616                 :          6 : void XclImpChartObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 /*nSubRecSize*/ )
    1617                 :            : {
    1618                 :            :     // read the following chart substream
    1619         [ +  - ]:          6 :     if( nSubRecId == EXC_ID_OBJEND )
    1620                 :            :     {
    1621                 :            :         // enable CONTINUE handling for the entire chart substream
    1622                 :          6 :         rStrm.ResetRecord( true );
    1623                 :          6 :         ReadChartSubStream( rStrm );
    1624                 :            :         /*  disable CONTINUE handling again to be able to read
    1625                 :            :             following CONTINUE records as MSODRAWING records. */
    1626                 :          6 :         rStrm.ResetRecord( false );
    1627                 :            :     }
    1628                 :          6 : }
    1629                 :            : 
    1630                 :          6 : sal_Size XclImpChartObj::DoGetProgressSize() const
    1631                 :            : {
    1632         [ +  - ]:          6 :     return mxChart ? mxChart->GetProgressSize() : 1;
    1633                 :            : }
    1634                 :            : 
    1635                 :          6 : SdrObject* XclImpChartObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
    1636                 :            : {
    1637                 :          6 :     SdrObjectPtr xSdrObj;
    1638         [ +  - ]:          6 :     SfxObjectShell* pDocShell = GetDocShell();
    1639 [ +  - ][ +  - ]:          6 :     if( rDffConv.SupportsOleObjects() && SvtModuleOptions().IsChart() && pDocShell && mxChart && !mxChart->IsPivotChart() )
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
           [ +  -  #  # ]
    1640                 :            :     {
    1641                 :            :         // create embedded chart object
    1642                 :          6 :         OUString aEmbObjName;
    1643         [ +  - ]:          6 :         Reference< XEmbeddedObject > xEmbObj = pDocShell->GetEmbeddedObjectContainer().
    1644 [ +  - ][ +  - ]:         12 :                 CreateEmbeddedObject( SvGlobalName( SO3_SCH_CLASSID ).GetByteSequence(), aEmbObjName );
         [ +  - ][ +  - ]
                 [ +  - ]
    1645                 :            : 
    1646                 :            :         /*  Set the size to the embedded object, this prevents that font sizes
    1647                 :            :             of text objects are changed in the chart when the object is
    1648                 :            :             inserted into the draw page. */
    1649                 :          6 :         sal_Int64 nAspect = ::com::sun::star::embed::Aspects::MSOLE_CONTENT;
    1650 [ +  - ][ +  - ]:          6 :         MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xEmbObj->getMapUnit( nAspect ) );
                 [ +  - ]
    1651 [ +  - ][ +  - ]:          6 :         Size aSize( Window::LogicToLogic( rAnchorRect.GetSize(), MapMode( MAP_100TH_MM ), MapMode( aUnit ) ) );
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1652                 :          6 :         ::com::sun::star::awt::Size aAwtSize( aSize.Width(), aSize.Height() );
    1653 [ +  - ][ +  - ]:          6 :         xEmbObj->setVisualAreaSize( nAspect, aAwtSize );
    1654                 :            : 
    1655                 :            :         // create the container OLE object
    1656 [ +  - ][ +  - ]:          6 :         xSdrObj.reset( new SdrOle2Obj( svt::EmbeddedObjectRef( xEmbObj, nAspect ), aEmbObjName, rAnchorRect ) );
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
    1657                 :            :     }
    1658                 :            : 
    1659         [ +  - ]:          6 :     return xSdrObj.release();
    1660                 :            : }
    1661                 :            : 
    1662                 :          6 : void XclImpChartObj::DoPostProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
    1663                 :            : {
    1664         [ -  + ]:          6 :     const SdrOle2Obj* pSdrOleObj = dynamic_cast< const SdrOle2Obj* >( &rSdrObj );
    1665 [ +  - ][ +  - ]:          6 :     if( mxChart && pSdrOleObj )
                 [ +  - ]
    1666                 :            :     {
    1667         [ +  - ]:          6 :         Reference< XEmbeddedObject > xEmbObj = pSdrOleObj->GetObjRef();
    1668 [ +  - ][ +  - ]:          6 :         if( xEmbObj.is() && ::svt::EmbeddedObjectRef::TryRunningState( xEmbObj ) ) try
         [ +  - ][ +  - ]
    1669                 :            :         {
    1670         [ +  - ]:          6 :             Reference< XEmbedPersist > xPersist( xEmbObj, UNO_QUERY_THROW );
    1671 [ +  - ][ +  - ]:          6 :             Reference< XModel > xModel( xEmbObj->getComponent(), UNO_QUERY_THROW );
                 [ +  - ]
    1672 [ +  - ][ +  - ]:          6 :             mxChart->Convert( xModel, rDffConv, xPersist->getEntryName(), rSdrObj.GetLogicRect() );
         [ +  - ][ +  - ]
    1673 [ +  - ][ #  # ]:          6 :             xPersist->storeOwn();
                 [ +  - ]
    1674                 :            :         }
    1675         [ #  # ]:          0 :         catch( const Exception& )
    1676                 :            :         {
    1677                 :          6 :         }
    1678                 :            :     }
    1679                 :          6 : }
    1680                 :            : 
    1681                 :          0 : void XclImpChartObj::FinalizeTabChart()
    1682                 :            : {
    1683                 :            :     /*  #i44077# Calculate and store DFF anchor for sheet charts.
    1684                 :            :         Needed to get used area if this chart is inserted as OLE object. */
    1685                 :            :     OSL_ENSURE( mbOwnTab, "XclImpChartObj::FinalizeTabChart - not allowed for embedded chart objects" );
    1686                 :            : 
    1687                 :            :     // set uninitialized page to landscape
    1688 [ #  # ][ #  # ]:          0 :     if( !GetPageSettings().GetPageData().mbValid )
    1689 [ #  # ][ #  # ]:          0 :         GetPageSettings().SetPaperSize( EXC_PAPERSIZE_DEFAULT, false );
    1690                 :            : 
    1691                 :            :     // calculate size of the chart object
    1692         [ #  # ]:          0 :     const XclPageData& rPageData = GetPageSettings().GetPageData();
    1693         [ #  # ]:          0 :     Size aPaperSize = rPageData.GetScPaperSize();
    1694                 :            : 
    1695         [ #  # ]:          0 :     long nWidth = XclTools::GetHmmFromTwips( aPaperSize.Width() );
    1696         [ #  # ]:          0 :     long nHeight = XclTools::GetHmmFromTwips( aPaperSize.Height() );
    1697                 :            : 
    1698                 :            :     // subtract page margins, give some more extra space
    1699         [ #  # ]:          0 :     nWidth -= (XclTools::GetHmmFromInch( rPageData.mfLeftMargin + rPageData.mfRightMargin ) + 2000);
    1700         [ #  # ]:          0 :     nHeight -= (XclTools::GetHmmFromInch( rPageData.mfTopMargin + rPageData.mfBottomMargin ) + 1000);
    1701                 :            : 
    1702                 :            :     // print column/row headers?
    1703         [ #  # ]:          0 :     if( rPageData.mbPrintHeadings )
    1704                 :            :     {
    1705                 :          0 :         nWidth -= 2000;
    1706                 :          0 :         nHeight -= 1000;
    1707                 :            :     }
    1708                 :            : 
    1709                 :            :     // create the object anchor
    1710         [ #  # ]:          0 :     XclObjAnchor aAnchor;
    1711 [ #  # ][ #  # ]:          0 :     aAnchor.SetRect( GetRoot(), GetCurrScTab(), Rectangle( 1000, 500, nWidth, nHeight ), MAP_100TH_MM );
    1712                 :          0 :     SetAnchor( aAnchor );
    1713                 :          0 : }
    1714                 :            : 
    1715                 :            : // ----------------------------------------------------------------------------
    1716                 :            : 
    1717                 :          3 : XclImpNoteObj::XclImpNoteObj( const XclImpRoot& rRoot ) :
    1718                 :            :     XclImpTextObj( rRoot ),
    1719                 :            :     maScPos( ScAddress::INITIALIZE_INVALID ),
    1720                 :          3 :     mnNoteFlags( 0 )
    1721                 :            : {
    1722                 :          3 :     SetSimpleMacro( false );
    1723                 :            :     // caption object will be created manually
    1724                 :          3 :     SetInsertSdrObj( false );
    1725                 :          3 : }
    1726                 :            : 
    1727                 :          3 : void XclImpNoteObj::SetNoteData( const ScAddress& rScPos, sal_uInt16 nNoteFlags )
    1728                 :            : {
    1729                 :          3 :     maScPos = rScPos;
    1730                 :          3 :     mnNoteFlags = nNoteFlags;
    1731                 :          3 : }
    1732                 :            : 
    1733                 :          3 : void XclImpNoteObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
    1734                 :            : {
    1735                 :            :     // create formatted text
    1736                 :          3 :     XclImpTextObj::DoPreProcessSdrObj( rDffConv, rSdrObj );
    1737                 :          3 :     OutlinerParaObject* pOutlinerObj = rSdrObj.GetOutlinerParaObject();
    1738 [ +  - ][ +  - ]:          3 :     if( maScPos.IsValid() && pOutlinerObj )
                 [ +  - ]
    1739                 :            :     {
    1740                 :            :         // create cell note with all data from drawing object
    1741                 :            :         ScNoteUtil::CreateNoteFromObjectData(
    1742                 :          3 :             GetDoc(), maScPos,
    1743                 :          3 :             rSdrObj.GetMergedItemSet().Clone(),             // new object on heap expected
    1744         [ +  - ]:          3 :             new OutlinerParaObject( *pOutlinerObj ),        // new object on heap expected
    1745                 :          3 :             rSdrObj.GetLogicRect(),
    1746                 :          3 :             ::get_flag( mnNoteFlags, EXC_NOTE_VISIBLE ),
    1747                 :          9 :             false );
    1748                 :            :     }
    1749                 :          3 : }
    1750                 :            : 
    1751                 :            : // ----------------------------------------------------------------------------
    1752                 :            : 
    1753                 :         59 : XclImpControlHelper::XclImpControlHelper( const XclImpRoot& rRoot, XclCtrlBindMode eBindMode ) :
    1754                 :            :     mrRoot( rRoot ),
    1755 [ +  - ][ +  - ]:         59 :     meBindMode( eBindMode )
    1756                 :            : {
    1757                 :         59 : }
    1758                 :            : 
    1759 [ +  - ][ +  - ]:         59 : XclImpControlHelper::~XclImpControlHelper()
    1760                 :            : {
    1761         [ -  + ]:         59 : }
    1762                 :            : 
    1763                 :         26 : SdrObject* XclImpControlHelper::CreateSdrObjectFromShape(
    1764                 :            :         const Reference< XShape >& rxShape, const Rectangle& rAnchorRect ) const
    1765                 :            : {
    1766         [ +  - ]:         26 :     mxShape = rxShape;
    1767         [ +  - ]:         26 :     SdrObjectPtr xSdrObj( SdrObject::getSdrObjectFromXShape( rxShape ) );
    1768         [ +  - ]:         26 :     if( xSdrObj.is() )
    1769                 :            :     {
    1770         [ +  - ]:         26 :         xSdrObj->NbcSetSnapRect( rAnchorRect );
    1771                 :            :         // #i30543# insert into control layer
    1772         [ +  - ]:         26 :         xSdrObj->NbcSetLayer( SC_LAYER_CONTROLS );
    1773                 :            :     }
    1774         [ +  - ]:         26 :     return xSdrObj.release();
    1775                 :            : }
    1776                 :            : 
    1777                 :         35 : void XclImpControlHelper::ApplySheetLinkProps() const
    1778                 :            : {
    1779                 :            : 
    1780         [ +  - ]:         35 :     Reference< XControlModel > xCtrlModel = XclControlHelper::GetControlModel( mxShape );
    1781         [ -  + ]:         35 :     if( !xCtrlModel.is() )
    1782                 :         35 :         return;
    1783         [ +  - ]:         35 :     ScfPropertySet aPropSet( xCtrlModel );
    1784                 :            : 
    1785                 :            :    // sheet links
    1786 [ +  - ][ +  - ]:         35 :     if( SfxObjectShell* pDocShell = mrRoot.GetDocShell() )
    1787                 :            :     {
    1788 [ +  - ][ +  - ]:         35 :         Reference< XMultiServiceFactory > xFactory( pDocShell->GetModel(), UNO_QUERY );
    1789         [ +  - ]:         35 :         if( xFactory.is() )
    1790                 :            :         {
    1791                 :            :             // cell link
    1792         [ +  + ]:         35 :             if( mxCellLink ) try
    1793                 :            :             {
    1794         [ +  - ]:         12 :                 Reference< XBindableValue > xBindable( xCtrlModel, UNO_QUERY_THROW );
    1795                 :            : 
    1796                 :            :                 // create argument sequence for createInstanceWithArguments()
    1797                 :         12 :                 CellAddress aApiAddress;
    1798                 :         12 :                 ScUnoConversion::FillApiAddress( aApiAddress, *mxCellLink );
    1799                 :            : 
    1800                 :         12 :                 NamedValue aValue;
    1801         [ +  - ]:         12 :                 aValue.Name = CREATE_OUSTRING( SC_UNONAME_BOUNDCELL );
    1802         [ +  - ]:         12 :                 aValue.Value <<= aApiAddress;
    1803                 :            : 
    1804         [ +  - ]:         12 :                 Sequence< Any > aArgs( 1 );
    1805 [ +  - ][ +  - ]:         12 :                 aArgs[ 0 ] <<= aValue;
    1806                 :            : 
    1807                 :            :                 // create the CellValueBinding instance and set at the control model
    1808                 :         12 :                 OUString aServiceName;
    1809      [ -  +  - ]:         12 :                 switch( meBindMode )
    1810                 :            :                 {
    1811         [ #  # ]:          0 :                     case EXC_CTRL_BINDCONTENT:  aServiceName = CREATE_OUSTRING( SC_SERVICENAME_VALBIND );       break;
    1812         [ +  - ]:         12 :                     case EXC_CTRL_BINDPOSITION: aServiceName = CREATE_OUSTRING( SC_SERVICENAME_LISTCELLBIND );  break;
    1813                 :            :                 }
    1814                 :            :                 Reference< XValueBinding > xBinding(
    1815 [ +  - ][ +  - ]:         12 :                     xFactory->createInstanceWithArguments( aServiceName, aArgs ), UNO_QUERY_THROW );
                 [ +  - ]
    1816 [ +  - ][ +  - ]:         12 :                 xBindable->setValueBinding( xBinding );
         [ #  # ][ +  - ]
    1817                 :            :             }
    1818         [ #  # ]:          0 :             catch( const Exception& )
    1819                 :            :             {
    1820                 :            :             }
    1821                 :            : 
    1822                 :            :             // source range
    1823         [ -  + ]:         35 :             if( mxSrcRange ) try
    1824                 :            :             {
    1825         [ #  # ]:          0 :                 Reference< XListEntrySink > xEntrySink( xCtrlModel, UNO_QUERY_THROW );
    1826                 :            : 
    1827                 :            :                 // create argument sequence for createInstanceWithArguments()
    1828                 :          0 :                 CellRangeAddress aApiRange;
    1829                 :          0 :                 ScUnoConversion::FillApiRange( aApiRange, *mxSrcRange );
    1830                 :            : 
    1831                 :          0 :                 NamedValue aValue;
    1832         [ #  # ]:          0 :                 aValue.Name = CREATE_OUSTRING( SC_UNONAME_CELLRANGE );
    1833         [ #  # ]:          0 :                 aValue.Value <<= aApiRange;
    1834                 :            : 
    1835         [ #  # ]:          0 :                 Sequence< Any > aArgs( 1 );
    1836 [ #  # ][ #  # ]:          0 :                 aArgs[ 0 ] <<= aValue;
    1837                 :            : 
    1838                 :            :                 // create the EntrySource instance and set at the control model
    1839         [ #  # ]:          0 :                 Reference< XListEntrySource > xEntrySource( xFactory->createInstanceWithArguments(
    1840 [ #  # ][ #  # ]:          0 :                     CREATE_OUSTRING( SC_SERVICENAME_LISTSOURCE ), aArgs ), UNO_QUERY_THROW );
                 [ #  # ]
    1841 [ #  # ][ #  # ]:          0 :                 xEntrySink->setListEntrySource( xEntrySource );
         [ #  # ][ #  # ]
    1842                 :            :             }
    1843         [ #  # ]:          0 :             catch( const Exception& )
    1844                 :            :             {
    1845                 :            :             }
    1846                 :         35 :         }
    1847 [ +  - ][ +  - ]:         35 :     }
    1848                 :            : }
    1849                 :            : 
    1850                 :         26 : void XclImpControlHelper::ProcessControl( const XclImpDrawObjBase& rDrawObj ) const
    1851                 :            : {
    1852         [ +  - ]:         26 :     Reference< XControlModel > xCtrlModel = XclControlHelper::GetControlModel( mxShape );
    1853         [ -  + ]:         26 :     if( !xCtrlModel.is() )
    1854                 :         26 :         return;
    1855                 :            : 
    1856         [ +  - ]:         26 :     ApplySheetLinkProps();
    1857                 :            : 
    1858         [ +  - ]:         26 :     ScfPropertySet aPropSet( xCtrlModel );
    1859                 :            : 
    1860                 :            :     // #i51348# set object name at control model
    1861 [ +  - ][ +  - ]:         26 :     aPropSet.SetStringProperty( CREATE_OUSTRING( "Name" ), rDrawObj.GetObjName() );
         [ +  - ][ +  - ]
                 [ +  - ]
    1862                 :            : 
    1863                 :            :     // control visible and printable?
    1864 [ +  - ][ +  - ]:         26 :     aPropSet.SetBoolProperty( CREATE_OUSTRING( "EnableVisible" ), rDrawObj.IsVisible() );
    1865 [ +  - ][ +  - ]:         26 :     aPropSet.SetBoolProperty( CREATE_OUSTRING( "Printable" ), rDrawObj.IsPrintable() );
    1866                 :            : 
    1867                 :            : 
    1868                 :            :     // virtual call for type specific processing
    1869 [ +  - ][ +  - ]:         26 :     DoProcessControl( aPropSet );
                 [ +  - ]
    1870                 :            : }
    1871                 :            : 
    1872                 :         14 : void XclImpControlHelper::ReadCellLinkFormula( XclImpStream& rStrm, bool bWithBoundSize )
    1873                 :            : {
    1874         [ +  - ]:         14 :     ScRangeList aScRanges;
    1875         [ +  - ]:         14 :     ReadRangeList( aScRanges, rStrm, bWithBoundSize );
    1876                 :            :     // Use first cell of first range
    1877 [ +  - ][ +  + ]:         14 :     if ( !aScRanges.empty() )
    1878                 :            :     {
    1879         [ +  - ]:          3 :         const ScRange* pScRange = aScRanges.front();
    1880 [ +  - ][ +  - ]:          3 :         mxCellLink.reset( new ScAddress( pScRange->aStart ) );
    1881         [ +  - ]:         14 :     }
    1882                 :         14 : }
    1883                 :            : 
    1884                 :         41 : void XclImpControlHelper::ReadSourceRangeFormula( XclImpStream& rStrm, bool bWithBoundSize )
    1885                 :            : {
    1886         [ +  - ]:         41 :     ScRangeList aScRanges;
    1887         [ +  - ]:         41 :     ReadRangeList( aScRanges, rStrm, bWithBoundSize );
    1888                 :            :     // Use first range
    1889 [ +  - ][ -  + ]:         41 :     if ( !aScRanges.empty() )
    1890                 :            :     {
    1891         [ #  # ]:          0 :         const ScRange* pScRange = aScRanges.front();
    1892 [ #  # ][ #  # ]:          0 :         mxSrcRange.reset( new ScRange( *pScRange ) );
    1893         [ +  - ]:         41 :     }
    1894                 :         41 : }
    1895                 :            : 
    1896                 :         11 : void XclImpControlHelper::DoProcessControl( ScfPropertySet& ) const
    1897                 :            : {
    1898                 :         11 : }
    1899                 :            : 
    1900                 :          3 : void XclImpControlHelper::ReadRangeList( ScRangeList& rScRanges, XclImpStream& rStrm )
    1901                 :            : {
    1902         [ +  - ]:          3 :     XclTokenArray aXclTokArr;
    1903         [ +  - ]:          3 :     aXclTokArr.ReadSize( rStrm );
    1904         [ +  - ]:          3 :     rStrm.Ignore( 4 );
    1905         [ +  - ]:          3 :     aXclTokArr.ReadArray( rStrm );
    1906 [ +  - ][ +  - ]:          3 :     mrRoot.GetFormulaCompiler().CreateRangeList( rScRanges, EXC_FMLATYPE_CONTROL, aXclTokArr, rStrm );
    1907                 :          3 : }
    1908                 :            : 
    1909                 :         55 : void XclImpControlHelper::ReadRangeList( ScRangeList& rScRanges, XclImpStream& rStrm, bool bWithBoundSize )
    1910                 :            : {
    1911         [ +  + ]:         55 :     if( bWithBoundSize )
    1912                 :            :     {
    1913                 :            :         sal_uInt16 nSize;
    1914         [ +  - ]:         52 :         rStrm >> nSize;
    1915         [ -  + ]:         52 :         if( nSize > 0 )
    1916                 :            :         {
    1917         [ #  # ]:          0 :             rStrm.PushPosition();
    1918         [ #  # ]:          0 :             ReadRangeList( rScRanges, rStrm );
    1919         [ #  # ]:          0 :             rStrm.PopPosition();
    1920         [ #  # ]:         52 :             rStrm.Ignore( nSize );
    1921                 :            :         }
    1922                 :            :     }
    1923                 :            :     else
    1924                 :            :     {
    1925                 :          3 :         ReadRangeList( rScRanges, rStrm );
    1926                 :            :     }
    1927                 :         55 : }
    1928                 :            : 
    1929                 :            : // ----------------------------------------------------------------------------
    1930                 :            : 
    1931                 :         45 : XclImpTbxObjBase::XclImpTbxObjBase( const XclImpRoot& rRoot ) :
    1932                 :            :     XclImpTextObj( rRoot ),
    1933         [ +  - ]:         45 :     XclImpControlHelper( rRoot, EXC_CTRL_BINDPOSITION )
    1934                 :            : {
    1935                 :         45 :     SetSimpleMacro( false );
    1936                 :         45 :     SetCustomDffObj( true );
    1937                 :         45 : }
    1938                 :            : 
    1939                 :            : namespace {
    1940                 :            : 
    1941                 :         45 : void lclExtractColor( sal_uInt8& rnColorIdx, const DffPropSet& rDffPropSet, sal_uInt32 nPropId )
    1942                 :            : {
    1943         [ +  + ]:         45 :     if( rDffPropSet.IsProperty( nPropId ) )
    1944                 :            :     {
    1945                 :         30 :         sal_uInt32 nColor = rDffPropSet.GetPropertyValue( nPropId );
    1946         [ +  + ]:         30 :         if( (nColor & 0xFF000000) == 0x08000000 )
    1947                 :         27 :             rnColorIdx = ::extract_value< sal_uInt8 >( nColor, 0, 8 );
    1948                 :            :     }
    1949                 :         45 : }
    1950                 :            : 
    1951                 :            : } // namespace
    1952                 :            : 
    1953                 :         15 : void XclImpTbxObjBase::SetDffProperties( const DffPropSet& rDffPropSet )
    1954                 :            : {
    1955         [ -  + ]:         15 :     maFillData.mnPattern = rDffPropSet.GetPropertyBool( DFF_Prop_fFilled ) ? EXC_PATT_SOLID : EXC_PATT_NONE;
    1956                 :         15 :     lclExtractColor( maFillData.mnBackColorIdx, rDffPropSet, DFF_Prop_fillBackColor );
    1957                 :         15 :     lclExtractColor( maFillData.mnPattColorIdx, rDffPropSet, DFF_Prop_fillColor );
    1958                 :         15 :     ::set_flag( maFillData.mnAuto, EXC_OBJ_LINE_AUTO, false );
    1959                 :            : 
    1960         [ +  + ]:         15 :     maLineData.mnStyle = rDffPropSet.GetPropertyBool( DFF_Prop_fLine ) ? EXC_OBJ_LINE_SOLID : EXC_OBJ_LINE_NONE;
    1961                 :         15 :     lclExtractColor( maLineData.mnColorIdx, rDffPropSet, DFF_Prop_lineColor );
    1962                 :         15 :     ::set_flag( maLineData.mnAuto, EXC_OBJ_FILL_AUTO, false );
    1963                 :         15 : }
    1964                 :            : 
    1965                 :         15 : bool XclImpTbxObjBase::FillMacroDescriptor( ScriptEventDescriptor& rDescriptor ) const
    1966                 :            : {
    1967 [ +  - ][ +  - ]:         15 :     return XclControlHelper::FillMacroDescriptor( rDescriptor, DoGetEventType(), GetMacroName(), GetDocShell() );
    1968                 :            : }
    1969                 :            : 
    1970                 :         15 : void XclImpTbxObjBase::ConvertFont( ScfPropertySet& rPropSet ) const
    1971                 :            : {
    1972         [ +  - ]:         15 :     if( maTextData.mxString )
    1973                 :            :     {
    1974                 :         15 :         const XclFormatRunVec& rFormatRuns = maTextData.mxString->GetFormats();
    1975         [ -  + ]:         15 :         if( rFormatRuns.empty() )
    1976                 :          0 :             GetFontBuffer().WriteDefaultCtrlFontProperties( rPropSet );
    1977                 :            :         else
    1978                 :         15 :             GetFontBuffer().WriteFontProperties( rPropSet, EXC_FONTPROPSET_CONTROL, rFormatRuns.front().mnFontIdx );
    1979                 :            :     }
    1980                 :         15 : }
    1981                 :            : 
    1982                 :         15 : void XclImpTbxObjBase::ConvertLabel( ScfPropertySet& rPropSet ) const
    1983                 :            : {
    1984         [ +  - ]:         15 :     if( maTextData.mxString )
    1985                 :            :     {
    1986         [ +  - ]:         15 :         String aLabel = maTextData.mxString->GetText();
    1987         [ -  + ]:         15 :         if( maTextData.maData.mnShortcut > 0 )
    1988                 :            :         {
    1989         [ #  # ]:          0 :             xub_StrLen nPos = aLabel.Search( static_cast< sal_Unicode >( maTextData.maData.mnShortcut ) );
    1990         [ #  # ]:          0 :             if( nPos != STRING_NOTFOUND )
    1991         [ #  # ]:          0 :                 aLabel.Insert( '~', nPos );
    1992                 :            :         }
    1993 [ +  - ][ +  - ]:         15 :         rPropSet.SetStringProperty( CREATE_OUSTRING( "Label" ), aLabel );
                 [ +  - ]
    1994                 :            :     }
    1995                 :         15 :     ConvertFont( rPropSet );
    1996                 :         15 : }
    1997                 :            : 
    1998                 :         15 : SdrObject* XclImpTbxObjBase::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
    1999                 :            : {
    2000         [ +  - ]:         15 :     SdrObjectPtr xSdrObj( rDffConv.CreateSdrObject( *this, rAnchorRect ) );
    2001         [ +  - ]:         15 :     rDffConv.Progress();
    2002         [ +  - ]:         15 :     return xSdrObj.release();
    2003                 :            : }
    2004                 :            : 
    2005                 :         15 : void XclImpTbxObjBase::DoPreProcessSdrObj( XclImpDffConverter& /*rDffConv*/, SdrObject& /*rSdrObj*/ ) const
    2006                 :            : {
    2007                 :            :     // do not call DoPreProcessSdrObj() from base class (to skip text processing)
    2008                 :         15 :     ProcessControl( *this );
    2009                 :         15 : }
    2010                 :            : 
    2011                 :            : // ----------------------------------------------------------------------------
    2012                 :            : 
    2013                 :          0 : XclImpButtonObj::XclImpButtonObj( const XclImpRoot& rRoot ) :
    2014                 :          0 :     XclImpTbxObjBase( rRoot )
    2015                 :            : {
    2016                 :          0 : }
    2017                 :            : 
    2018                 :          0 : void XclImpButtonObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2019                 :            : {
    2020                 :            :     // label and text formatting
    2021         [ #  # ]:          0 :     ConvertLabel( rPropSet );
    2022                 :            : 
    2023                 :            :     /*  Horizontal text alignment. For unknown reason, the property type is a
    2024                 :            :         simple sal_Int16 and not a com.sun.star.style.HorizontalAlignment. */
    2025                 :          0 :     sal_Int16 nHorAlign = 1;
    2026         [ #  # ]:          0 :     switch( maTextData.maData.GetHorAlign() )
           [ #  #  #  # ]
    2027                 :            :     {
    2028                 :          0 :         case EXC_OBJ_HOR_LEFT:      nHorAlign = 0;  break;
    2029                 :          0 :         case EXC_OBJ_HOR_CENTER:    nHorAlign = 1;  break;
    2030                 :          0 :         case EXC_OBJ_HOR_RIGHT:     nHorAlign = 2;  break;
    2031                 :            :     }
    2032 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "Align" ), nHorAlign );
    2033                 :            : 
    2034                 :            :     // vertical text alignment
    2035                 :            :     namespace csss = ::com::sun::star::style;
    2036                 :          0 :     csss::VerticalAlignment eVerAlign = csss::VerticalAlignment_MIDDLE;
    2037   [ #  #  #  # ]:          0 :     switch( maTextData.maData.GetVerAlign() )
                 [ #  # ]
    2038                 :            :     {
    2039                 :          0 :         case EXC_OBJ_VER_TOP:       eVerAlign = csss::VerticalAlignment_TOP;    break;
    2040                 :          0 :         case EXC_OBJ_VER_CENTER:    eVerAlign = csss::VerticalAlignment_MIDDLE; break;
    2041                 :          0 :         case EXC_OBJ_VER_BOTTOM:    eVerAlign = csss::VerticalAlignment_BOTTOM; break;
    2042                 :            :     }
    2043 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "VerticalAlign" ), eVerAlign );
    2044                 :            : 
    2045                 :            :     // always wrap text automatically
    2046 [ #  # ][ #  # ]:          0 :     rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiLine" ), true );
    2047                 :            : 
    2048                 :            :     // default button
    2049                 :          0 :     bool bDefButton = ::get_flag( maTextData.maData.mnButtonFlags, EXC_OBJ_BUTTON_DEFAULT );
    2050 [ #  # ][ #  # ]:          0 :     rPropSet.SetBoolProperty( CREATE_OUSTRING( "DefaultButton" ), bDefButton );
    2051                 :            : 
    2052                 :            :     // button type (flags cannot be combined in OOo)
    2053                 :            :     namespace cssa = ::com::sun::star::awt;
    2054                 :          0 :     cssa::PushButtonType eButtonType = cssa::PushButtonType_STANDARD;
    2055         [ #  # ]:          0 :     if( ::get_flag( maTextData.maData.mnButtonFlags, EXC_OBJ_BUTTON_CLOSE ) )
    2056                 :          0 :         eButtonType = cssa::PushButtonType_OK;
    2057         [ #  # ]:          0 :     else if( ::get_flag( maTextData.maData.mnButtonFlags, EXC_OBJ_BUTTON_CANCEL ) )
    2058                 :          0 :         eButtonType = cssa::PushButtonType_CANCEL;
    2059         [ #  # ]:          0 :     else if( ::get_flag( maTextData.maData.mnButtonFlags, EXC_OBJ_BUTTON_HELP ) )
    2060                 :          0 :         eButtonType = cssa::PushButtonType_HELP;
    2061                 :            :     // property type is short, not enum
    2062 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "PushButtonType" ), sal_Int16( eButtonType ) );
    2063                 :          0 : }
    2064                 :            : 
    2065                 :          0 : OUString XclImpButtonObj::DoGetServiceName() const
    2066                 :            : {
    2067                 :          0 :     return CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" );
    2068                 :            : }
    2069                 :            : 
    2070                 :          0 : XclTbxEventType XclImpButtonObj::DoGetEventType() const
    2071                 :            : {
    2072                 :          0 :     return EXC_TBX_EVENT_ACTION;
    2073                 :            : }
    2074                 :            : 
    2075                 :            : // ----------------------------------------------------------------------------
    2076                 :            : 
    2077                 :         12 : XclImpCheckBoxObj::XclImpCheckBoxObj( const XclImpRoot& rRoot ) :
    2078                 :            :     XclImpTbxObjBase( rRoot ),
    2079                 :            :     mnState( EXC_OBJ_CHECKBOX_UNCHECKED ),
    2080                 :         12 :     mnCheckBoxFlags( 0 )
    2081                 :            : {
    2082                 :         12 : }
    2083                 :            : 
    2084                 :          0 : void XclImpCheckBoxObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
    2085                 :            : {
    2086                 :          0 :     ReadFrameData( rStrm );
    2087                 :          0 :     rStrm.Ignore( 10 );
    2088                 :          0 :     rStrm >> maTextData.maData.mnFlags;
    2089                 :          0 :     rStrm.Ignore( 20 );
    2090                 :          0 :     ReadName5( rStrm, nNameLen );
    2091                 :          0 :     ReadMacro5( rStrm, rStrm.ReaduInt16() );   // fist macro size invalid and unused
    2092                 :          0 :     ReadCellLinkFormula( rStrm, true );
    2093                 :          0 :     rStrm >> maTextData.maData.mnTextLen;
    2094                 :          0 :     maTextData.ReadByteString( rStrm );
    2095                 :          0 :     rStrm >> mnState >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA >> mnCheckBoxFlags;
    2096                 :          0 : }
    2097                 :            : 
    2098                 :         51 : void XclImpCheckBoxObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
    2099                 :            : {
    2100      [ +  +  + ]:         51 :     switch( nSubRecId )
    2101                 :            :     {
    2102                 :            :         case EXC_ID_OBJCBLS:
    2103                 :            :             // do not read EXC_ID_OBJCBLSDATA, not written by OOo Excel export
    2104                 :         12 :             rStrm >> mnState;
    2105                 :         12 :             rStrm.Ignore( 4 );
    2106                 :         12 :             rStrm >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA >> mnCheckBoxFlags;
    2107                 :         12 :         break;
    2108                 :            :         case EXC_ID_OBJCBLSFMLA:
    2109                 :          3 :             ReadCellLinkFormula( rStrm, false );
    2110                 :          3 :         break;
    2111                 :            :         default:
    2112                 :         36 :             XclImpTbxObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
    2113                 :            :     }
    2114                 :         51 : }
    2115                 :            : 
    2116                 :         12 : void XclImpCheckBoxObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2117                 :            : {
    2118                 :            :     // label and text formatting
    2119         [ +  - ]:         12 :     ConvertLabel( rPropSet );
    2120                 :            : 
    2121                 :            :     // state
    2122                 :         12 :     bool bSupportsTristate = GetObjType() == EXC_OBJTYPE_CHECKBOX;
    2123                 :         12 :     sal_Int16 nApiState = 0;
    2124   [ +  +  -  - ]:         12 :     switch( mnState )
    2125                 :            :     {
    2126                 :          9 :         case EXC_OBJ_CHECKBOX_UNCHECKED:    nApiState = 0;                          break;
    2127                 :          3 :         case EXC_OBJ_CHECKBOX_CHECKED:      nApiState = 1;                          break;
    2128         [ #  # ]:          0 :         case EXC_OBJ_CHECKBOX_TRISTATE:     nApiState = bSupportsTristate ? 2 : 1;  break;
    2129                 :            :     }
    2130         [ -  + ]:         12 :     if( bSupportsTristate )
    2131 [ #  # ][ #  # ]:          0 :         rPropSet.SetBoolProperty( CREATE_OUSTRING( "TriState" ), nApiState == 2 );
    2132 [ +  - ][ +  - ]:         12 :     rPropSet.SetProperty( CREATE_OUSTRING( "DefaultState" ), nApiState );
    2133                 :            : 
    2134                 :            :     // box style
    2135                 :            :     namespace AwtVisualEffect = ::com::sun::star::awt::VisualEffect;
    2136                 :         12 :     sal_Int16 nEffect = ::get_flagvalue( mnCheckBoxFlags, EXC_OBJ_CHECKBOX_FLAT, AwtVisualEffect::FLAT, AwtVisualEffect::LOOK3D );
    2137 [ +  - ][ +  - ]:         12 :     rPropSet.SetProperty( CREATE_OUSTRING( "VisualEffect" ), nEffect );
    2138                 :            : 
    2139                 :            :     // do not wrap text automatically
    2140 [ +  - ][ +  - ]:         12 :     rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiLine" ), false );
    2141                 :            : 
    2142                 :            :     // #i40279# always centered vertically
    2143                 :            :     namespace csss = ::com::sun::star::style;
    2144 [ +  - ][ +  - ]:         12 :     rPropSet.SetProperty( CREATE_OUSTRING( "VerticalAlign" ), csss::VerticalAlignment_MIDDLE );
    2145                 :            : 
    2146                 :            :     // background color
    2147 [ -  + ][ +  - ]:         12 :     if( maFillData.IsFilled() )
    2148                 :            :     {
    2149         [ #  # ]:          0 :         sal_Int32 nColor = static_cast< sal_Int32 >( GetSolidFillColor( maFillData ).GetColor() );
    2150 [ #  # ][ #  # ]:          0 :         rPropSet.SetProperty( CREATE_OUSTRING( "BackgroundColor" ), nColor );
    2151                 :            :     }
    2152                 :         12 : }
    2153                 :            : 
    2154                 :          0 : OUString XclImpCheckBoxObj::DoGetServiceName() const
    2155                 :            : {
    2156                 :          0 :     return CREATE_OUSTRING( "com.sun.star.form.component.CheckBox" );
    2157                 :            : }
    2158                 :            : 
    2159                 :          0 : XclTbxEventType XclImpCheckBoxObj::DoGetEventType() const
    2160                 :            : {
    2161                 :          0 :     return EXC_TBX_EVENT_ACTION;
    2162                 :            : }
    2163                 :            : 
    2164                 :            : // ----------------------------------------------------------------------------
    2165                 :            : 
    2166                 :         12 : XclImpOptionButtonObj::XclImpOptionButtonObj( const XclImpRoot& rRoot ) :
    2167                 :            :     XclImpCheckBoxObj( rRoot ),
    2168                 :            :     mnNextInGroup( 0 ),
    2169                 :         12 :     mnFirstInGroup( 1 )
    2170                 :            : {
    2171                 :         12 : }
    2172                 :            : 
    2173                 :          0 : void XclImpOptionButtonObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
    2174                 :            : {
    2175                 :          0 :     ReadFrameData( rStrm );
    2176                 :          0 :     rStrm.Ignore( 10 );
    2177                 :          0 :     rStrm >> maTextData.maData.mnFlags;
    2178                 :          0 :     rStrm.Ignore( 32 );
    2179                 :          0 :     ReadName5( rStrm, nNameLen );
    2180                 :          0 :     ReadMacro5( rStrm, rStrm.ReaduInt16() );   // fist macro size invalid and unused
    2181                 :          0 :     ReadCellLinkFormula( rStrm, true );
    2182                 :          0 :     rStrm >> maTextData.maData.mnTextLen;
    2183                 :          0 :     maTextData.ReadByteString( rStrm );
    2184                 :          0 :     rStrm >> mnState >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA;
    2185                 :          0 :     rStrm >> mnCheckBoxFlags >> mnNextInGroup >> mnFirstInGroup;
    2186                 :          0 : }
    2187                 :            : 
    2188                 :         63 : void XclImpOptionButtonObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
    2189                 :            : {
    2190         [ +  + ]:         63 :     switch( nSubRecId )
    2191                 :            :     {
    2192                 :            :         case EXC_ID_OBJRBODATA:
    2193                 :         12 :             rStrm >> mnNextInGroup >> mnFirstInGroup;
    2194                 :         12 :         break;
    2195                 :            :         default:
    2196                 :         51 :             XclImpCheckBoxObj::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
    2197                 :            :     }
    2198                 :         63 : }
    2199                 :            : 
    2200                 :         12 : void XclImpOptionButtonObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2201                 :            : {
    2202                 :         12 :     XclImpCheckBoxObj::DoProcessControl( rPropSet );
    2203                 :            :     // TODO: grouping
    2204         [ -  + ]:         12 :     XclImpOptionButtonObj* pTbxObj = dynamic_cast< XclImpOptionButtonObj* >( GetObjectManager().GetSheetDrawing( GetTab() ).FindDrawObj( mnNextInGroup ).get() );
    2205 [ +  + ][ +  - ]:         12 :     if ( ( pTbxObj && pTbxObj->mnFirstInGroup ) )
    2206                 :            :     {
    2207                 :            :         // Group has terminated
    2208                 :            :         // traverse each RadioButton in group and
    2209                 :            :         //     a) apply the groupname
    2210                 :            :         //     b) propagate the linked cell from the lead radiobutton
    2211                 :            :         //     c) apply the correct Ref value
    2212                 :          3 :         XclImpOptionButtonObj* pLeader = pTbxObj;
    2213                 :            :  ;
    2214                 :          3 :         sal_Int32 nRefVal = 1;
    2215                 :            :         OSL_TRACE( "0x%x start group ", pLeader->GetObjId()/*.mnObjId */);
    2216 [ +  + ][ +  + ]:         12 :         do
                 [ +  - ]
    2217                 :            :         {
    2218                 :            : 
    2219         [ +  - ]:         12 :             Reference< XControlModel > xCtrlModel = XclControlHelper::GetControlModel( pTbxObj->mxShape );
    2220         [ +  - ]:         12 :             if ( xCtrlModel.is() )
    2221                 :            :             {
    2222         [ +  - ]:         12 :                 ScfPropertySet aProps( xCtrlModel );
    2223                 :         12 :                 rtl::OUString sGroupName = rtl::OUString::valueOf( static_cast< sal_Int32 >( pLeader->GetDffShapeId() ) );
    2224                 :            : 
    2225 [ +  - ][ +  - ]:         12 :                 aProps.SetStringProperty( CREATE_OUSTRING( "GroupName" ), sGroupName );
         [ +  - ][ +  - ]
    2226 [ +  - ][ +  - ]:         12 :                 aProps.SetStringProperty( CREATE_OUSTRING( "RefValue" ), rtl::OUString::valueOf( nRefVal++ ) );
         [ +  - ][ +  - ]
    2227 [ +  - ][ +  - ]:         12 :                 if ( pLeader->HasCellLink() && !pTbxObj->HasCellLink() )
         [ +  + ][ +  + ]
                 [ +  - ]
    2228                 :            :                 {
    2229                 :            :                     // propagate cell link info
    2230 [ +  - ][ +  - ]:          9 :                     pTbxObj->mxCellLink.reset( new ScAddress( *pLeader->mxCellLink.get() ) );
    2231         [ +  - ]:          9 :                     pTbxObj->ApplySheetLinkProps();
    2232                 :            :                 }
    2233 [ +  - ][ +  - ]:         12 :                 pTbxObj = dynamic_cast< XclImpOptionButtonObj* >( GetObjectManager().GetSheetDrawing( GetTab() ).FindDrawObj( pTbxObj->mnNextInGroup ).get() );
         [ +  - ][ -  + ]
         [ +  - ][ +  - ]
    2234                 :            :             }
    2235                 :            :             else
    2236                 :         12 :                 pTbxObj = NULL;
    2237                 :         12 :         } while ( pTbxObj && !( pTbxObj->mnFirstInGroup == 1 ) );
    2238                 :            :     }
    2239                 :            :     else
    2240                 :            :     {
    2241                 :            :         // not the leader? try and find it
    2242                 :            :     }
    2243                 :         12 : }
    2244                 :            : 
    2245                 :         12 : OUString XclImpOptionButtonObj::DoGetServiceName() const
    2246                 :            : {
    2247                 :         12 :     return CREATE_OUSTRING( "com.sun.star.form.component.RadioButton" );
    2248                 :            : }
    2249                 :            : 
    2250                 :         12 : XclTbxEventType XclImpOptionButtonObj::DoGetEventType() const
    2251                 :            : {
    2252                 :         12 :     return EXC_TBX_EVENT_ACTION;
    2253                 :            : }
    2254                 :            : 
    2255                 :            : // ----------------------------------------------------------------------------
    2256                 :            : 
    2257                 :          0 : XclImpLabelObj::XclImpLabelObj( const XclImpRoot& rRoot ) :
    2258                 :          0 :     XclImpTbxObjBase( rRoot )
    2259                 :            : {
    2260                 :          0 : }
    2261                 :            : 
    2262                 :          0 : void XclImpLabelObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2263                 :            : {
    2264                 :            :     // label and text formatting
    2265                 :          0 :     ConvertLabel( rPropSet );
    2266                 :            : 
    2267                 :            :     // text alignment (always top/left aligned)
    2268 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "Align" ), sal_Int16( 0 ) );
    2269                 :            :     namespace csss = ::com::sun::star::style;
    2270 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "VerticalAlign" ), csss::VerticalAlignment_TOP );
    2271                 :            : 
    2272                 :            :     // always wrap text automatically
    2273         [ #  # ]:          0 :     rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiLine" ), true );
    2274                 :          0 : }
    2275                 :            : 
    2276                 :          0 : OUString XclImpLabelObj::DoGetServiceName() const
    2277                 :            : {
    2278                 :          0 :     return CREATE_OUSTRING( "com.sun.star.form.component.FixedText" );
    2279                 :            : }
    2280                 :            : 
    2281                 :          0 : XclTbxEventType XclImpLabelObj::DoGetEventType() const
    2282                 :            : {
    2283                 :          0 :     return EXC_TBX_EVENT_MOUSE;
    2284                 :            : }
    2285                 :            : 
    2286                 :            : // ----------------------------------------------------------------------------
    2287                 :            : 
    2288                 :          3 : XclImpGroupBoxObj::XclImpGroupBoxObj( const XclImpRoot& rRoot ) :
    2289                 :            :     XclImpTbxObjBase( rRoot ),
    2290                 :          3 :     mnGroupBoxFlags( 0 )
    2291                 :            : {
    2292                 :          3 : }
    2293                 :            : 
    2294                 :          0 : void XclImpGroupBoxObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
    2295                 :            : {
    2296                 :          0 :     ReadFrameData( rStrm );
    2297                 :          0 :     rStrm.Ignore( 10 );
    2298                 :          0 :     rStrm >> maTextData.maData.mnFlags;
    2299                 :          0 :     rStrm.Ignore( 26 );
    2300                 :          0 :     ReadName5( rStrm, nNameLen );
    2301                 :          0 :     ReadMacro5( rStrm, rStrm.ReaduInt16() );   // fist macro size invalid and unused
    2302                 :          0 :     rStrm >> maTextData.maData.mnTextLen;
    2303                 :          0 :     maTextData.ReadByteString( rStrm );
    2304                 :          0 :     rStrm >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA >> mnGroupBoxFlags;
    2305                 :          0 : }
    2306                 :            : 
    2307                 :          6 : void XclImpGroupBoxObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
    2308                 :            : {
    2309         [ +  + ]:          6 :     switch( nSubRecId )
    2310                 :            :     {
    2311                 :            :         case EXC_ID_OBJGBODATA:
    2312                 :          3 :             rStrm >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA >> mnGroupBoxFlags;
    2313                 :          3 :         break;
    2314                 :            :         default:
    2315                 :          3 :             XclImpTbxObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
    2316                 :            :     }
    2317                 :          6 : }
    2318                 :            : 
    2319                 :          3 : void XclImpGroupBoxObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2320                 :            : {
    2321                 :            :     // label and text formatting
    2322                 :          3 :     ConvertLabel( rPropSet );
    2323                 :          3 : }
    2324                 :            : 
    2325                 :          3 : OUString XclImpGroupBoxObj::DoGetServiceName() const
    2326                 :            : {
    2327                 :          3 :     return CREATE_OUSTRING( "com.sun.star.form.component.GroupBox" );
    2328                 :            : }
    2329                 :            : 
    2330                 :          3 : XclTbxEventType XclImpGroupBoxObj::DoGetEventType() const
    2331                 :            : {
    2332                 :          3 :     return EXC_TBX_EVENT_MOUSE;
    2333                 :            : }
    2334                 :            : 
    2335                 :            : // ----------------------------------------------------------------------------
    2336                 :            : 
    2337                 :          0 : XclImpDialogObj::XclImpDialogObj( const XclImpRoot& rRoot ) :
    2338                 :          0 :     XclImpTbxObjBase( rRoot )
    2339                 :            : {
    2340                 :          0 : }
    2341                 :            : 
    2342                 :          0 : void XclImpDialogObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2343                 :            : {
    2344                 :            :     // label and text formatting
    2345                 :          0 :     ConvertLabel( rPropSet );
    2346                 :          0 : }
    2347                 :            : 
    2348                 :          0 : OUString XclImpDialogObj::DoGetServiceName() const
    2349                 :            : {
    2350                 :            :     // dialog frame faked by a groupbox
    2351                 :          0 :     return CREATE_OUSTRING( "com.sun.star.form.component.GroupBox" );
    2352                 :            : }
    2353                 :            : 
    2354                 :          0 : XclTbxEventType XclImpDialogObj::DoGetEventType() const
    2355                 :            : {
    2356                 :          0 :     return EXC_TBX_EVENT_MOUSE;
    2357                 :            : }
    2358                 :            : 
    2359                 :            : // ----------------------------------------------------------------------------
    2360                 :            : 
    2361                 :          0 : XclImpEditObj::XclImpEditObj( const XclImpRoot& rRoot ) :
    2362                 :            :     XclImpTbxObjBase( rRoot ),
    2363                 :            :     mnContentType( EXC_OBJ_EDIT_TEXT ),
    2364                 :            :     mnMultiLine( 0 ),
    2365                 :            :     mnScrollBar( 0 ),
    2366                 :          0 :     mnListBoxObjId( 0 )
    2367                 :            : {
    2368                 :          0 : }
    2369                 :            : 
    2370                 :          0 : bool XclImpEditObj::IsNumeric() const
    2371                 :            : {
    2372 [ #  # ][ #  # ]:          0 :     return (mnContentType == EXC_OBJ_EDIT_INTEGER) || (mnContentType == EXC_OBJ_EDIT_DOUBLE);
    2373                 :            : }
    2374                 :            : 
    2375                 :          0 : void XclImpEditObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
    2376                 :            : {
    2377                 :          0 :     ReadFrameData( rStrm );
    2378                 :          0 :     rStrm.Ignore( 10 );
    2379                 :          0 :     rStrm >> maTextData.maData.mnFlags;
    2380                 :          0 :     rStrm.Ignore( 14 );
    2381                 :          0 :     ReadName5( rStrm, nNameLen );
    2382                 :          0 :     ReadMacro5( rStrm, rStrm.ReaduInt16() );   // fist macro size invalid and unused
    2383                 :          0 :     rStrm >> maTextData.maData.mnTextLen;
    2384                 :          0 :     maTextData.ReadByteString( rStrm );
    2385                 :          0 :     rStrm >> mnContentType >> mnMultiLine >> mnScrollBar >> mnListBoxObjId;
    2386                 :          0 : }
    2387                 :            : 
    2388                 :          0 : void XclImpEditObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
    2389                 :            : {
    2390         [ #  # ]:          0 :     switch( nSubRecId )
    2391                 :            :     {
    2392                 :            :         case EXC_ID_OBJEDODATA:
    2393                 :          0 :             rStrm >> mnContentType >> mnMultiLine >> mnScrollBar >> mnListBoxObjId;
    2394                 :          0 :         break;
    2395                 :            :         default:
    2396                 :          0 :             XclImpTbxObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
    2397                 :            :     }
    2398                 :          0 : }
    2399                 :            : 
    2400                 :          0 : void XclImpEditObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2401                 :            : {
    2402         [ #  # ]:          0 :     if( maTextData.mxString )
    2403                 :            :     {
    2404         [ #  # ]:          0 :         OUString aText = maTextData.mxString->GetText();
    2405         [ #  # ]:          0 :         if( IsNumeric() )
    2406                 :            :         {
    2407                 :            :             // TODO: OUString::toDouble() does not handle local decimal separator
    2408 [ #  # ][ #  # ]:          0 :             rPropSet.SetProperty( CREATE_OUSTRING( "DefaultValue" ), aText.toDouble() );
    2409 [ #  # ][ #  # ]:          0 :             rPropSet.SetBoolProperty( CREATE_OUSTRING( "Spin" ), mnScrollBar != 0 );
    2410                 :            :         }
    2411                 :            :         else
    2412                 :            :         {
    2413 [ #  # ][ #  # ]:          0 :             rPropSet.SetProperty( CREATE_OUSTRING( "DefaultText" ), aText );
    2414 [ #  # ][ #  # ]:          0 :             rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiLine" ), mnMultiLine != 0 );
    2415 [ #  # ][ #  # ]:          0 :             rPropSet.SetBoolProperty( CREATE_OUSTRING( "VScroll" ), mnScrollBar != 0 );
    2416                 :          0 :         }
    2417                 :            :     }
    2418                 :          0 :     ConvertFont( rPropSet );
    2419                 :          0 : }
    2420                 :            : 
    2421                 :          0 : OUString XclImpEditObj::DoGetServiceName() const
    2422                 :            : {
    2423                 :          0 :     return IsNumeric() ?
    2424                 :            :         CREATE_OUSTRING( "com.sun.star.form.component.NumericField" ) :
    2425         [ #  # ]:          0 :         CREATE_OUSTRING( "com.sun.star.form.component.TextField" );
    2426                 :            : }
    2427                 :            : 
    2428                 :          0 : XclTbxEventType XclImpEditObj::DoGetEventType() const
    2429                 :            : {
    2430                 :          0 :     return EXC_TBX_EVENT_TEXT;
    2431                 :            : }
    2432                 :            : 
    2433                 :            : // ----------------------------------------------------------------------------
    2434                 :            : 
    2435                 :         30 : XclImpTbxObjScrollableBase::XclImpTbxObjScrollableBase( const XclImpRoot& rRoot ) :
    2436                 :            :     XclImpTbxObjBase( rRoot ),
    2437                 :            :     mnValue( 0 ),
    2438                 :            :     mnMin( 0 ),
    2439                 :            :     mnMax( 100 ),
    2440                 :            :     mnStep( 1 ),
    2441                 :            :     mnPageStep( 10 ),
    2442                 :            :     mnOrient( 0 ),
    2443                 :            :     mnThumbWidth( 1 ),
    2444                 :         30 :     mnScrollFlags( 0 )
    2445                 :            : {
    2446                 :         30 : }
    2447                 :            : 
    2448                 :         30 : void XclImpTbxObjScrollableBase::ReadSbs( XclImpStream& rStrm )
    2449                 :            : {
    2450                 :         30 :     rStrm.Ignore( 4 );
    2451                 :         30 :     rStrm >> mnValue >> mnMin >> mnMax >> mnStep >> mnPageStep >> mnOrient >> mnThumbWidth >> mnScrollFlags;
    2452                 :         30 : }
    2453                 :            : 
    2454                 :         60 : void XclImpTbxObjScrollableBase::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
    2455                 :            : {
    2456      [ +  -  + ]:         60 :     switch( nSubRecId )
    2457                 :            :     {
    2458                 :            :         case EXC_ID_OBJSBS:
    2459                 :         30 :             ReadSbs( rStrm );
    2460                 :         30 :         break;
    2461                 :            :         case EXC_ID_OBJSBSFMLA:
    2462                 :          0 :             ReadCellLinkFormula( rStrm, false );
    2463                 :          0 :         break;
    2464                 :            :         default:
    2465                 :         30 :             XclImpTbxObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
    2466                 :            :     }
    2467                 :         60 : }
    2468                 :            : 
    2469                 :            : // ----------------------------------------------------------------------------
    2470                 :            : 
    2471                 :          0 : XclImpSpinButtonObj::XclImpSpinButtonObj( const XclImpRoot& rRoot ) :
    2472                 :          0 :     XclImpTbxObjScrollableBase( rRoot )
    2473                 :            : {
    2474                 :          0 : }
    2475                 :            : 
    2476                 :          0 : void XclImpSpinButtonObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
    2477                 :            : {
    2478                 :          0 :     ReadFrameData( rStrm );
    2479                 :          0 :     ReadSbs( rStrm );
    2480                 :          0 :     ReadName5( rStrm, nNameLen );
    2481                 :          0 :     ReadMacro5( rStrm, rStrm.ReaduInt16() );   // fist macro size invalid and unused
    2482                 :          0 :     ReadCellLinkFormula( rStrm, true );
    2483                 :          0 : }
    2484                 :            : 
    2485                 :          0 : void XclImpSpinButtonObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2486                 :            : {
    2487                 :            :     // Calc's "Border" property is not the 3D/flat style effect in Excel (#i34712#)
    2488         [ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "Border" ), ::com::sun::star::awt::VisualEffect::NONE );
    2489 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "DefaultSpinValue" ), mnValue );
    2490 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "SpinValueMin" ), mnMin );
    2491 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "SpinValueMax" ), mnMax );
    2492 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "SpinIncrement" ), mnStep );
    2493                 :            : 
    2494                 :            :     // Excel spin buttons always vertical
    2495         [ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "Orientation" ), ::com::sun::star::awt::ScrollBarOrientation::VERTICAL );
    2496                 :          0 : }
    2497                 :            : 
    2498                 :          0 : OUString XclImpSpinButtonObj::DoGetServiceName() const
    2499                 :            : {
    2500                 :          0 :     return CREATE_OUSTRING( "com.sun.star.form.component.SpinButton" );
    2501                 :            : }
    2502                 :            : 
    2503                 :          0 : XclTbxEventType XclImpSpinButtonObj::DoGetEventType() const
    2504                 :            : {
    2505                 :          0 :     return EXC_TBX_EVENT_VALUE;
    2506                 :            : }
    2507                 :            : 
    2508                 :            : // ----------------------------------------------------------------------------
    2509                 :            : 
    2510                 :          0 : XclImpScrollBarObj::XclImpScrollBarObj( const XclImpRoot& rRoot ) :
    2511                 :          0 :     XclImpTbxObjScrollableBase( rRoot )
    2512                 :            : {
    2513                 :          0 : }
    2514                 :            : 
    2515                 :          0 : void XclImpScrollBarObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
    2516                 :            : {
    2517                 :          0 :     ReadFrameData( rStrm );
    2518                 :          0 :     ReadSbs( rStrm );
    2519                 :          0 :     ReadName5( rStrm, nNameLen );
    2520                 :          0 :     ReadMacro5( rStrm, rStrm.ReaduInt16() );   // fist macro size invalid and unused
    2521                 :          0 :     ReadCellLinkFormula( rStrm, true );
    2522                 :          0 : }
    2523                 :            : 
    2524                 :          0 : void XclImpScrollBarObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2525                 :            : {
    2526                 :            :     // Calc's "Border" property is not the 3D/flat style effect in Excel (#i34712#)
    2527 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "Border" ), ::com::sun::star::awt::VisualEffect::NONE );
    2528 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "DefaultScrollValue" ), mnValue );
    2529 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "ScrollValueMin" ), mnMin );
    2530 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "ScrollValueMax" ), mnMax );
    2531 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "LineIncrement" ), mnStep );
    2532 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "BlockIncrement" ), mnPageStep );
    2533 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "VisibleSize" ), ::std::min< sal_Int32 >( mnPageStep, 1 ) );
                 [ #  # ]
    2534                 :            : 
    2535                 :            :     namespace AwtScrollOrient = ::com::sun::star::awt::ScrollBarOrientation;
    2536                 :          0 :     sal_Int32 nApiOrient = ::get_flagvalue( mnOrient, EXC_OBJ_SCROLLBAR_HOR, AwtScrollOrient::HORIZONTAL, AwtScrollOrient::VERTICAL );
    2537 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "Orientation" ), nApiOrient );
    2538                 :          0 : }
    2539                 :            : 
    2540                 :          0 : OUString XclImpScrollBarObj::DoGetServiceName() const
    2541                 :            : {
    2542                 :          0 :     return CREATE_OUSTRING( "com.sun.star.form.component.ScrollBar" );
    2543                 :            : }
    2544                 :            : 
    2545                 :          0 : XclTbxEventType XclImpScrollBarObj::DoGetEventType() const
    2546                 :            : {
    2547                 :          0 :     return EXC_TBX_EVENT_VALUE;
    2548                 :            : }
    2549                 :            : 
    2550                 :            : // ----------------------------------------------------------------------------
    2551                 :            : 
    2552                 :         30 : XclImpTbxObjListBase::XclImpTbxObjListBase( const XclImpRoot& rRoot ) :
    2553                 :            :     XclImpTbxObjScrollableBase( rRoot ),
    2554                 :            :     mnEntryCount( 0 ),
    2555                 :            :     mnSelEntry( 0 ),
    2556                 :            :     mnListFlags( 0 ),
    2557                 :            :     mnEditObjId( 0 ),
    2558                 :         30 :     mbHasDefFontIdx( false )
    2559                 :            : {
    2560                 :         30 : }
    2561                 :            : 
    2562                 :         30 : void XclImpTbxObjListBase::ReadLbsData( XclImpStream& rStrm )
    2563                 :            : {
    2564                 :         30 :     ReadSourceRangeFormula( rStrm, true );
    2565                 :         30 :     rStrm >> mnEntryCount >> mnSelEntry >> mnListFlags >> mnEditObjId;
    2566                 :         30 : }
    2567                 :            : 
    2568                 :          0 : void XclImpTbxObjListBase::SetBoxFormatting( ScfPropertySet& rPropSet ) const
    2569                 :            : {
    2570                 :            :     // border style
    2571                 :            :     namespace AwtVisualEffect = ::com::sun::star::awt::VisualEffect;
    2572                 :          0 :     sal_Int16 nApiBorder = ::get_flagvalue( mnListFlags, EXC_OBJ_LISTBOX_FLAT, AwtVisualEffect::FLAT, AwtVisualEffect::LOOK3D );
    2573 [ #  # ][ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "Border" ), nApiBorder );
    2574                 :            : 
    2575                 :            :     // font formatting
    2576         [ #  # ]:          0 :     if( mbHasDefFontIdx )
    2577 [ #  # ][ #  # ]:          0 :         GetFontBuffer().WriteFontProperties( rPropSet, EXC_FONTPROPSET_CONTROL, maTextData.maData.mnDefFontIdx );
    2578                 :            :     else
    2579 [ #  # ][ #  # ]:          0 :         GetFontBuffer().WriteDefaultCtrlFontProperties( rPropSet );
    2580                 :          0 : }
    2581                 :            : 
    2582                 :            : // ----------------------------------------------------------------------------
    2583                 :            : 
    2584                 :          0 : XclImpListBoxObj::XclImpListBoxObj( const XclImpRoot& rRoot ) :
    2585         [ #  # ]:          0 :     XclImpTbxObjListBase( rRoot )
    2586                 :            : {
    2587                 :          0 : }
    2588                 :            : 
    2589                 :          0 : void XclImpListBoxObj::ReadFullLbsData( XclImpStream& rStrm, sal_Size nRecLeft )
    2590                 :            : {
    2591                 :          0 :     sal_Size nRecEnd = rStrm.GetRecPos() + nRecLeft;
    2592                 :          0 :     ReadLbsData( rStrm );
    2593                 :            :     OSL_ENSURE( (rStrm.GetRecPos() == nRecEnd) || (rStrm.GetRecPos() + mnEntryCount == nRecEnd),
    2594                 :            :         "XclImpListBoxObj::ReadFullLbsData - invalid size of OBJLBSDATA record" );
    2595 [ #  # ][ #  # ]:          0 :     while( rStrm.IsValid() && (rStrm.GetRecPos() < nRecEnd) )
                 [ #  # ]
    2596         [ #  # ]:          0 :         maSelection.push_back( rStrm.ReaduInt8() );
    2597                 :          0 : }
    2598                 :            : 
    2599                 :          0 : void XclImpListBoxObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
    2600                 :            : {
    2601                 :          0 :     ReadFrameData( rStrm );
    2602                 :          0 :     ReadSbs( rStrm );
    2603                 :          0 :     rStrm.Ignore( 18 );
    2604                 :          0 :     rStrm >> maTextData.maData.mnDefFontIdx;
    2605                 :          0 :     rStrm.Ignore( 4 );
    2606                 :          0 :     ReadName5( rStrm, nNameLen );
    2607                 :          0 :     ReadMacro5( rStrm, rStrm.ReaduInt16() );   // fist macro size invalid and unused
    2608                 :          0 :     ReadCellLinkFormula( rStrm, true );
    2609                 :          0 :     ReadFullLbsData( rStrm, rStrm.GetRecLeft() );
    2610                 :          0 :     mbHasDefFontIdx = true;
    2611                 :          0 : }
    2612                 :            : 
    2613                 :          0 : void XclImpListBoxObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
    2614                 :            : {
    2615         [ #  # ]:          0 :     switch( nSubRecId )
    2616                 :            :     {
    2617                 :            :         case EXC_ID_OBJLBSDATA:
    2618                 :          0 :             ReadFullLbsData( rStrm, nSubRecSize );
    2619                 :          0 :         break;
    2620                 :            :         default:
    2621                 :          0 :             XclImpTbxObjListBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
    2622                 :            :     }
    2623                 :          0 : }
    2624                 :            : 
    2625                 :          0 : void XclImpListBoxObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2626                 :            : {
    2627                 :            :     // listbox formatting
    2628                 :          0 :     SetBoxFormatting( rPropSet );
    2629                 :            : 
    2630                 :            :     // selection type
    2631                 :          0 :     sal_uInt8 nSelType = ::extract_value< sal_uInt8 >( mnListFlags, 4, 2 );
    2632                 :          0 :     bool bMultiSel = nSelType != EXC_OBJ_LISTBOX_SINGLE;
    2633         [ #  # ]:          0 :     rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiSelection" ), bMultiSel );
    2634                 :            : 
    2635                 :            :     // selection (do not set, if listbox is linked to a cell)
    2636         [ #  # ]:          0 :     if( !HasCellLink() )
    2637                 :            :     {
    2638         [ #  # ]:          0 :         ScfInt16Vec aSelVec;
    2639                 :            : 
    2640                 :            :         // multi selection: API expects sequence of list entry indexes
    2641         [ #  # ]:          0 :         if( bMultiSel )
    2642                 :            :         {
    2643 [ #  # ][ #  # ]:          0 :             for( ScfUInt8Vec::const_iterator aBeg = maSelection.begin(), aIt = aBeg, aEnd = maSelection.end(); aIt != aEnd; ++aIt )
                 [ #  # ]
    2644 [ #  # ][ #  # ]:          0 :                 if( *aIt != 0 )
    2645 [ #  # ][ #  # ]:          0 :                     aSelVec.push_back( static_cast< sal_Int16 >( aIt - aBeg ) );
    2646                 :            :         }
    2647                 :            :         // single selection: mnSelEntry is one-based, API expects zero-based
    2648         [ #  # ]:          0 :         else if( mnSelEntry > 0 )
    2649         [ #  # ]:          0 :             aSelVec.push_back( static_cast< sal_Int16 >( mnSelEntry - 1 ) );
    2650                 :            : 
    2651         [ #  # ]:          0 :         if( !aSelVec.empty() )
    2652                 :            :         {
    2653 [ #  # ][ #  # ]:          0 :             Sequence< sal_Int16 > aSelSeq( &aSelVec.front(), static_cast< sal_Int32 >( aSelVec.size() ) );
    2654 [ #  # ][ #  # ]:          0 :             rPropSet.SetProperty( CREATE_OUSTRING( "DefaultSelection" ), aSelSeq );
                 [ #  # ]
    2655                 :          0 :         }
    2656                 :            :     }
    2657                 :          0 : }
    2658                 :            : 
    2659                 :          0 : OUString XclImpListBoxObj::DoGetServiceName() const
    2660                 :            : {
    2661                 :          0 :     return CREATE_OUSTRING( "com.sun.star.form.component.ListBox" );
    2662                 :            : }
    2663                 :            : 
    2664                 :          0 : XclTbxEventType XclImpListBoxObj::DoGetEventType() const
    2665                 :            : {
    2666                 :          0 :     return EXC_TBX_EVENT_CHANGE;
    2667                 :            : }
    2668                 :            : 
    2669                 :            : // ----------------------------------------------------------------------------
    2670                 :            : 
    2671                 :         30 : XclImpDropDownObj::XclImpDropDownObj( const XclImpRoot& rRoot ) :
    2672                 :            :     XclImpTbxObjListBase( rRoot ),
    2673                 :            :     mnLeft( 0 ),
    2674                 :            :     mnTop( 0 ),
    2675                 :            :     mnRight( 0 ),
    2676                 :            :     mnBottom( 0 ),
    2677                 :            :     mnDropDownFlags( 0 ),
    2678                 :            :     mnLineCount( 0 ),
    2679                 :         30 :     mnMinWidth( 0 )
    2680                 :            : {
    2681                 :         30 : }
    2682                 :            : 
    2683                 :         30 : sal_uInt16 XclImpDropDownObj::GetDropDownType() const
    2684                 :            : {
    2685                 :         30 :     return ::extract_value< sal_uInt8 >( mnDropDownFlags, 0, 2 );
    2686                 :            : }
    2687                 :            : 
    2688                 :         30 : void XclImpDropDownObj::ReadFullLbsData( XclImpStream& rStrm )
    2689                 :            : {
    2690                 :         30 :     ReadLbsData( rStrm );
    2691                 :         30 :     rStrm >> mnDropDownFlags >> mnLineCount >> mnMinWidth >> maTextData.maData.mnTextLen;
    2692                 :         30 :     maTextData.ReadByteString( rStrm );
    2693                 :            :     // dropdowns of auto-filters have 'simple' style, they don't have a text area
    2694         [ +  - ]:         30 :     if( GetDropDownType() == EXC_OBJ_DROPDOWN_SIMPLE )
    2695                 :         30 :         SetProcessSdrObj( false );
    2696                 :         30 : }
    2697                 :            : 
    2698                 :          0 : void XclImpDropDownObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
    2699                 :            : {
    2700                 :          0 :     ReadFrameData( rStrm );
    2701                 :          0 :     ReadSbs( rStrm );
    2702                 :          0 :     rStrm.Ignore( 18 );
    2703                 :          0 :     rStrm >> maTextData.maData.mnDefFontIdx;
    2704                 :          0 :     rStrm.Ignore( 14 );
    2705                 :          0 :     rStrm >> mnLeft >> mnTop >> mnRight >> mnBottom;
    2706                 :          0 :     rStrm.Ignore( 4 );
    2707                 :          0 :     ReadName5( rStrm, nNameLen );
    2708                 :          0 :     ReadMacro5( rStrm, rStrm.ReaduInt16() );   // fist macro size invalid and unused
    2709                 :          0 :     ReadCellLinkFormula( rStrm, true );
    2710                 :          0 :     ReadFullLbsData( rStrm );
    2711                 :          0 :     mbHasDefFontIdx = true;
    2712                 :          0 : }
    2713                 :            : 
    2714                 :         90 : void XclImpDropDownObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
    2715                 :            : {
    2716         [ +  + ]:         90 :     switch( nSubRecId )
    2717                 :            :     {
    2718                 :            :         case EXC_ID_OBJLBSDATA:
    2719                 :         30 :             ReadFullLbsData( rStrm );
    2720                 :         30 :         break;
    2721                 :            :         default:
    2722                 :         60 :             XclImpTbxObjListBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
    2723                 :            :     }
    2724                 :         90 : }
    2725                 :            : 
    2726                 :          0 : void XclImpDropDownObj::DoProcessControl( ScfPropertySet& rPropSet ) const
    2727                 :            : {
    2728                 :            :     // dropdown listbox formatting
    2729                 :          0 :     SetBoxFormatting( rPropSet );
    2730                 :            :     // enable dropdown button
    2731         [ #  # ]:          0 :     rPropSet.SetBoolProperty( CREATE_OUSTRING( "Dropdown" ), true );
    2732                 :            :     // dropdown line count
    2733         [ #  # ]:          0 :     rPropSet.SetProperty( CREATE_OUSTRING( "LineCount" ), mnLineCount );
    2734                 :            : 
    2735         [ #  # ]:          0 :     if( GetDropDownType() == EXC_OBJ_DROPDOWN_COMBOBOX )
    2736                 :            :     {
    2737                 :            :         // text of editable combobox
    2738         [ #  # ]:          0 :         if( maTextData.mxString )
    2739         [ #  # ]:          0 :             rPropSet.SetStringProperty( CREATE_OUSTRING( "DefaultText" ), maTextData.mxString->GetText() );
    2740                 :            :     }
    2741                 :            :     else
    2742                 :            :     {
    2743                 :            :         // selection (do not set, if dropdown is linked to a cell)
    2744 [ #  # ][ #  # ]:          0 :         if( !HasCellLink() && (mnSelEntry > 0) )
                 [ #  # ]
    2745                 :            :         {
    2746         [ #  # ]:          0 :             Sequence< sal_Int16 > aSelSeq( 1 );
    2747         [ #  # ]:          0 :             aSelSeq[ 0 ] = mnSelEntry - 1;
    2748 [ #  # ][ #  # ]:          0 :             rPropSet.SetProperty( CREATE_OUSTRING( "DefaultSelection" ), aSelSeq );
                 [ #  # ]
    2749                 :            :         }
    2750                 :            :     }
    2751                 :          0 : }
    2752                 :            : 
    2753                 :          0 : OUString XclImpDropDownObj::DoGetServiceName() const
    2754                 :            : {
    2755                 :          0 :     return (GetDropDownType() == EXC_OBJ_DROPDOWN_COMBOBOX) ?
    2756                 :            :         CREATE_OUSTRING( "com.sun.star.form.component.ComboBox" ) :
    2757         [ #  # ]:          0 :         CREATE_OUSTRING( "com.sun.star.form.component.ListBox" );
    2758                 :            : }
    2759                 :            : 
    2760                 :          0 : XclTbxEventType XclImpDropDownObj::DoGetEventType() const
    2761                 :            : {
    2762         [ #  # ]:          0 :     return (GetDropDownType() == EXC_OBJ_DROPDOWN_COMBOBOX) ? EXC_TBX_EVENT_TEXT : EXC_TBX_EVENT_CHANGE;
    2763                 :            : }
    2764                 :            : 
    2765                 :            : // ----------------------------------------------------------------------------
    2766                 :            : 
    2767                 :         14 : XclImpPictureObj::XclImpPictureObj( const XclImpRoot& rRoot ) :
    2768                 :            :     XclImpRectObj( rRoot ),
    2769                 :            :     XclImpControlHelper( rRoot, EXC_CTRL_BINDCONTENT ),
    2770                 :            :     mnStorageId( 0 ),
    2771                 :            :     mnCtlsStrmPos( 0 ),
    2772                 :            :     mnCtlsStrmSize( 0 ),
    2773                 :            :     mbEmbedded( false ),
    2774                 :            :     mbLinked( false ),
    2775                 :            :     mbSymbol( false ),
    2776                 :            :     mbControl( false ),
    2777 [ +  - ][ +  - ]:         14 :     mbUseCtlsStrm( false )
         [ +  - ][ +  - ]
    2778                 :            : {
    2779                 :         14 :     SetAreaObj( true );
    2780                 :         14 :     SetSimpleMacro( false );
    2781                 :         14 :     SetCustomDffObj( true );
    2782                 :         14 : }
    2783                 :            : 
    2784                 :          3 : String XclImpPictureObj::GetOleStorageName() const
    2785                 :            : {
    2786                 :          3 :     String aStrgName;
    2787 [ -  + ][ #  # ]:          3 :     if( (mbEmbedded || mbLinked) && !mbControl && (mnStorageId > 0) )
         [ #  # ][ +  - ]
    2788                 :            :     {
    2789 [ #  # ][ #  # ]:          0 :         aStrgName = mbEmbedded ? EXC_STORAGE_OLE_EMBEDDED : EXC_STORAGE_OLE_LINKED;
         [ #  # ][ #  # ]
                 [ #  # ]
    2790                 :            :         static const sal_Char spcHexChars[] = "0123456789ABCDEF";
    2791         [ #  # ]:          0 :         for( sal_uInt8 nIndex = 32; nIndex > 0; nIndex -= 4 )
    2792         [ #  # ]:          0 :             aStrgName.Append( sal_Unicode( spcHexChars[ ::extract_value< sal_uInt8 >( mnStorageId, nIndex - 4, 4 ) ] ) );
    2793                 :            :     }
    2794                 :          3 :     return aStrgName;
    2795                 :            : }
    2796                 :            : 
    2797                 :          0 : void XclImpPictureObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    2798                 :            : {
    2799                 :            :     sal_uInt16 nLinkSize;
    2800         [ #  # ]:          0 :     ReadFrameData( rStrm );
    2801         [ #  # ]:          0 :     rStrm.Ignore( 6 );
    2802         [ #  # ]:          0 :     rStrm >> nLinkSize;
    2803         [ #  # ]:          0 :     rStrm.Ignore( 2 );
    2804         [ #  # ]:          0 :     ReadFlags3( rStrm );
    2805         [ #  # ]:          0 :     ReadMacro3( rStrm, nMacroSize );
    2806         [ #  # ]:          0 :     ReadPictFmla( rStrm, nLinkSize );
    2807                 :            : 
    2808 [ #  # ][ #  # ]:          0 :     if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() )
         [ #  # ][ #  # ]
                 [ #  # ]
    2809 [ #  # ][ #  # ]:          0 :         maGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm );
                 [ #  # ]
    2810                 :          0 : }
    2811                 :            : 
    2812                 :          0 : void XclImpPictureObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
    2813                 :            : {
    2814                 :            :     sal_uInt16 nLinkSize;
    2815         [ #  # ]:          0 :     ReadFrameData( rStrm );
    2816         [ #  # ]:          0 :     rStrm.Ignore( 6 );
    2817         [ #  # ]:          0 :     rStrm >> nLinkSize;
    2818         [ #  # ]:          0 :     rStrm.Ignore( 2 );
    2819         [ #  # ]:          0 :     ReadFlags3( rStrm );
    2820         [ #  # ]:          0 :     ReadMacro4( rStrm, nMacroSize );
    2821         [ #  # ]:          0 :     ReadPictFmla( rStrm, nLinkSize );
    2822                 :            : 
    2823 [ #  # ][ #  # ]:          0 :     if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() )
         [ #  # ][ #  # ]
                 [ #  # ]
    2824 [ #  # ][ #  # ]:          0 :         maGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm );
                 [ #  # ]
    2825                 :          0 : }
    2826                 :            : 
    2827                 :          0 : void XclImpPictureObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
    2828                 :            : {
    2829                 :            :     sal_uInt16 nLinkSize;
    2830         [ #  # ]:          0 :     ReadFrameData( rStrm );
    2831         [ #  # ]:          0 :     rStrm.Ignore( 6 );
    2832         [ #  # ]:          0 :     rStrm >> nLinkSize;
    2833         [ #  # ]:          0 :     rStrm.Ignore( 2 );
    2834         [ #  # ]:          0 :     ReadFlags3( rStrm );
    2835         [ #  # ]:          0 :     rStrm.Ignore( 4 );
    2836         [ #  # ]:          0 :     ReadName5( rStrm, nNameLen );
    2837         [ #  # ]:          0 :     ReadMacro5( rStrm, nMacroSize );
    2838         [ #  # ]:          0 :     ReadPictFmla( rStrm, nLinkSize );
    2839                 :            : 
    2840 [ #  # ][ #  # ]:          0 :     if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() )
         [ #  # ][ #  # ]
                 [ #  # ]
    2841                 :            :     {
    2842                 :            :         // page background is stored as hidden picture with name "__BkgndObj"
    2843 [ #  # ][ #  # ]:          0 :         if ( IsHidden() && (GetObjName() == "__BkgndObj") )
         [ #  # ][ #  # ]
           [ #  #  #  # ]
    2844 [ #  # ][ #  # ]:          0 :             GetPageSettings().ReadImgData( rStrm );
    2845                 :            :         else
    2846 [ #  # ][ #  # ]:          0 :             maGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm );
                 [ #  # ]
    2847                 :            :     }
    2848                 :          0 : }
    2849                 :            : 
    2850                 :         53 : void XclImpPictureObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
    2851                 :            : {
    2852      [ +  +  + ]:         53 :     switch( nSubRecId )
    2853                 :            :     {
    2854                 :            :         case EXC_ID_OBJFLAGS:
    2855                 :         14 :             ReadFlags8( rStrm );
    2856                 :         14 :         break;
    2857                 :            :         case EXC_ID_OBJPICTFMLA:
    2858                 :         11 :             ReadPictFmla( rStrm, rStrm.ReaduInt16() );
    2859                 :         11 :         break;
    2860                 :            :         default:
    2861                 :         28 :             XclImpDrawObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
    2862                 :            :     }
    2863                 :         53 : }
    2864                 :            : 
    2865                 :         14 : SdrObject* XclImpPictureObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
    2866                 :            : {
    2867                 :            :     // try to create an OLE object or form control
    2868         [ +  - ]:         14 :     SdrObjectPtr xSdrObj( rDffConv.CreateSdrObject( *this, rAnchorRect ) );
    2869                 :            : 
    2870                 :            :     // insert a graphic replacement for unsupported ole object ( if none already
    2871                 :            :     // exists ) Hmm ok, it's possibly that there has been some imported
    2872                 :            :     // graphic at a base level  but unlikely, normally controls have a valid
    2873                 :            :     // preview in the IMGDATA record ( see below )
    2874                 :            :     // It might be possible to push such an imported graphic up to this
    2875                 :            :     // XclImpPictureObj instance but there are somany layers of indirection I
    2876                 :            :     // don't see an easy way. This way at least ensures that we can
    2877                 :            :     // avoid a 'blank' shape that can result from a failed control import
    2878 [ -  + ][ #  # ]:         14 :     if ( !xSdrObj && IsOcxControl() && maGraphic.GetType() == GRAPHIC_NONE )
         [ #  # ][ -  + ]
                 [ +  + ]
    2879                 :            :     {
    2880 [ #  # ][ #  # ]:          0 :         Graphic aReplacement( SdrOle2Obj::GetEmtyOLEReplacementBitmap() );
                 [ #  # ]
    2881 [ #  # ][ #  # ]:          0 :         const_cast< XclImpPictureObj* >( this )->maGraphic = aReplacement;
    2882                 :            :     }
    2883                 :            :     // no OLE - create a plain picture from IMGDATA record data
    2884 [ +  + ][ +  - ]:         14 :     if( !xSdrObj && (maGraphic.GetType() != GRAPHIC_NONE) )
         [ -  + ][ -  + ]
    2885                 :            :     {
    2886 [ #  # ][ #  # ]:          0 :         xSdrObj.reset( new SdrGrafObj( maGraphic, rAnchorRect ) );
                 [ #  # ]
    2887         [ #  # ]:          0 :         ConvertRectStyle( *xSdrObj );
    2888                 :            :     }
    2889                 :            : 
    2890         [ +  - ]:         14 :     rDffConv.Progress();
    2891         [ +  - ]:         14 :     return xSdrObj.release();
    2892                 :            : }
    2893                 :            : 
    2894                 :         36 : OUString XclImpPictureObj::GetObjName() const
    2895                 :            : {
    2896         [ +  + ]:         36 :     if( IsOcxControl() )
    2897                 :            :     {
    2898 [ +  - ][ +  - ]:         33 :         OUString sName( GetObjectManager().GetOleNameOverride( GetTab(), GetObjId() ) );
         [ +  - ][ +  - ]
    2899         [ +  - ]:         33 :         if (!sName.isEmpty())
    2900         [ -  + ]:         33 :             return sName;
    2901                 :            :     }
    2902                 :         36 :     return XclImpDrawObjBase::GetObjName();
    2903                 :            : }
    2904                 :            : 
    2905                 :         14 : void XclImpPictureObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
    2906                 :            : {
    2907         [ +  + ]:         14 :     if( IsOcxControl() )
    2908                 :            :     {
    2909                 :            :         // do not call XclImpRectObj::DoPreProcessSdrObj(), it would trace missing "printable" feature
    2910                 :         11 :         ProcessControl( *this );
    2911                 :            :     }
    2912 [ +  - ][ -  + ]:          3 :     else if( mbEmbedded || mbLinked )
    2913                 :            :     {
    2914                 :            :         // trace missing "printable" feature
    2915                 :          0 :         XclImpRectObj::DoPreProcessSdrObj( rDffConv, rSdrObj );
    2916                 :            : 
    2917                 :          0 :         SfxObjectShell* pDocShell = GetDocShell();
    2918         [ #  # ]:          0 :         SdrOle2Obj* pOleSdrObj = dynamic_cast< SdrOle2Obj* >( &rSdrObj );
    2919 [ #  # ][ #  # ]:          0 :         if( pOleSdrObj && pDocShell )
    2920                 :            :         {
    2921         [ #  # ]:          0 :             comphelper::EmbeddedObjectContainer& rEmbObjCont = pDocShell->GetEmbeddedObjectContainer();
    2922         [ #  # ]:          0 :             Reference< XEmbeddedObject > xEmbObj = pOleSdrObj->GetObjRef();
    2923 [ #  # ][ #  # ]:          0 :             OUString aOldName( pOleSdrObj->GetPersistName() );
                 [ #  # ]
    2924                 :            : 
    2925                 :            :             /*  The object persistence should be already in the storage, but
    2926                 :            :                 the object still might not be inserted into the container. */
    2927 [ #  # ][ #  # ]:          0 :             if( rEmbObjCont.HasEmbeddedObject( aOldName ) )
    2928                 :            :             {
    2929 [ #  # ][ #  # ]:          0 :                 if( !rEmbObjCont.HasEmbeddedObject( xEmbObj ) )
    2930                 :            :                     // filter code is allowed to call the following method
    2931         [ #  # ]:          0 :                     rEmbObjCont.AddEmbeddedObject( xEmbObj, aOldName );
    2932                 :            :             }
    2933                 :            :             else
    2934                 :            :             {
    2935                 :            :                 /*  If the object is still not in container it must be inserted
    2936                 :            :                     there, the name must be generated in this case. */
    2937                 :          0 :                 OUString aNewName;
    2938         [ #  # ]:          0 :                 rEmbObjCont.InsertEmbeddedObject( xEmbObj, aNewName );
    2939         [ #  # ]:          0 :                 if( aOldName != aNewName )
    2940                 :            :                     // SetPersistName, not SetName
    2941 [ #  # ][ #  # ]:          0 :                     pOleSdrObj->SetPersistName( aNewName );
                 [ #  # ]
    2942                 :          0 :             }
    2943                 :            :         }
    2944                 :            :     }
    2945                 :         14 : }
    2946                 :            : 
    2947                 :          0 : void XclImpPictureObj::ReadFlags3( XclImpStream& rStrm )
    2948                 :            : {
    2949                 :            :     sal_uInt16 nFlags;
    2950         [ #  # ]:          0 :     rStrm >> nFlags;
    2951                 :          0 :     mbSymbol = ::get_flag( nFlags, EXC_OBJ_PIC_SYMBOL );
    2952                 :          0 : }
    2953                 :            : 
    2954                 :         14 : void XclImpPictureObj::ReadFlags8( XclImpStream& rStrm )
    2955                 :            : {
    2956                 :            :     sal_uInt16 nFlags;
    2957         [ +  - ]:         14 :     rStrm >> nFlags;
    2958                 :         14 :     mbSymbol      = ::get_flag( nFlags, EXC_OBJ_PIC_SYMBOL );
    2959                 :         14 :     mbControl     = ::get_flag( nFlags, EXC_OBJ_PIC_CONTROL );
    2960                 :         14 :     mbUseCtlsStrm = ::get_flag( nFlags, EXC_OBJ_PIC_CTLSSTREAM );
    2961                 :            :     OSL_ENSURE( mbControl || !mbUseCtlsStrm, "XclImpPictureObj::ReadFlags8 - CTLS stream for controls only" );
    2962 [ +  - ][ +  + ]:         14 :     SetProcessSdrObj( mbControl || !mbUseCtlsStrm );
    2963                 :         14 : }
    2964                 :            : 
    2965                 :         11 : void XclImpPictureObj::ReadPictFmla( XclImpStream& rStrm, sal_uInt16 nLinkSize )
    2966                 :            : {
    2967                 :         11 :     sal_Size nLinkEnd = rStrm.GetRecPos() + nLinkSize;
    2968         [ +  - ]:         11 :     if( nLinkSize >= 6 )
    2969                 :            :     {
    2970                 :            :         sal_uInt16 nFmlaSize;
    2971         [ +  - ]:         11 :         rStrm >> nFmlaSize;
    2972                 :            :         OSL_ENSURE( nFmlaSize > 0, "XclImpPictureObj::ReadPictFmla - missing link formula" );
    2973                 :            :         // BIFF3/BIFF4 do not support storages, nothing to do here
    2974 [ +  - ][ +  - ]:         11 :         if( (nFmlaSize > 0) && (GetBiff() >= EXC_BIFF5) )
                 [ +  - ]
    2975                 :            :         {
    2976         [ +  - ]:         11 :             rStrm.Ignore( 4 );
    2977                 :            :             sal_uInt8 nToken;
    2978         [ +  - ]:         11 :             rStrm >> nToken;
    2979                 :            : 
    2980                 :            :             // different processing for linked vs. embedded OLE objects
    2981         [ -  + ]:         11 :             if( nToken == XclTokenArrayHelper::GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ) )
    2982                 :            :             {
    2983                 :          0 :                 mbLinked = true;
    2984      [ #  #  # ]:          0 :                 switch( GetBiff() )
    2985                 :            :                 {
    2986                 :            :                     case EXC_BIFF5:
    2987                 :            :                     {
    2988                 :            :                         sal_Int16 nRefIdx;
    2989                 :            :                         sal_uInt16 nNameIdx;
    2990         [ #  # ]:          0 :                         rStrm >> nRefIdx;
    2991         [ #  # ]:          0 :                         rStrm.Ignore( 8 );
    2992         [ #  # ]:          0 :                         rStrm >> nNameIdx;
    2993         [ #  # ]:          0 :                         rStrm.Ignore( 12 );
    2994 [ #  # ][ #  # ]:          0 :                         const ExtName* pExtName = GetOldRoot().pExtNameBuff->GetNameByIndex( nRefIdx, nNameIdx );
    2995 [ #  # ][ #  # ]:          0 :                         if( pExtName && pExtName->IsOLE() )
         [ #  # ][ #  # ]
    2996                 :          0 :                             mnStorageId = pExtName->nStorageId;
    2997                 :            :                     }
    2998                 :          0 :                     break;
    2999                 :            :                     case EXC_BIFF8:
    3000                 :            :                     {
    3001                 :            :                         sal_uInt16 nXti, nExtName;
    3002 [ #  # ][ #  # ]:          0 :                         rStrm >> nXti >> nExtName;
    3003 [ #  # ][ #  # ]:          0 :                         const XclImpExtName* pExtName = GetLinkManager().GetExternName( nXti, nExtName );
    3004 [ #  # ][ #  # ]:          0 :                         if( pExtName && (pExtName->GetType() == xlExtOLE) )
                 [ #  # ]
    3005                 :          0 :                             mnStorageId = pExtName->GetStorageId();
    3006                 :            :                     }
    3007                 :          0 :                     break;
    3008                 :            :                     default:
    3009                 :            :                         DBG_ERROR_BIFF();
    3010                 :            :                 }
    3011                 :            :             }
    3012         [ +  - ]:         11 :             else if( nToken == XclTokenArrayHelper::GetTokenId( EXC_TOKID_TBL, EXC_TOKCLASS_NONE ) )
    3013                 :            :             {
    3014                 :         11 :                 mbEmbedded = true;
    3015                 :            :                 OSL_ENSURE( nFmlaSize == 5, "XclImpPictureObj::ReadPictFmla - unexpected formula size" );
    3016         [ +  - ]:         11 :                 rStrm.Ignore( nFmlaSize - 1 );      // token ID already read
    3017         [ +  - ]:         11 :                 if( nFmlaSize & 1 )
    3018         [ +  - ]:         11 :                     rStrm.Ignore( 1 );              // padding byte
    3019                 :            : 
    3020                 :            :                 // a class name may follow inside the picture link
    3021 [ +  - ][ +  - ]:         11 :                 if( rStrm.GetRecPos() + 2 <= nLinkEnd )
    3022                 :            :                 {
    3023                 :            :                     sal_uInt16 nLen;
    3024         [ +  - ]:         11 :                     rStrm >> nLen;
    3025         [ +  - ]:         11 :                     if( nLen > 0 )
    3026 [ +  - ][ +  - ]:         11 :                         maClassName = (GetBiff() == EXC_BIFF8) ? rStrm.ReadUniString( nLen ) : rStrm.ReadRawByteString( nLen );
         [ #  # ][ +  - ]
                 [ +  - ]
    3027                 :            :                 }
    3028                 :            :             }
    3029                 :            :             // else: ignore other formulas, e.g. pictures linked to cell ranges
    3030                 :            :         }
    3031                 :            :     }
    3032                 :            : 
    3033                 :            :     // seek behind picture link data
    3034                 :         11 :     rStrm.Seek( nLinkEnd );
    3035                 :            : 
    3036                 :            :     // read additional data for embedded OLE objects following the picture link
    3037         [ +  - ]:         11 :     if( IsOcxControl() )
    3038                 :            :     {
    3039                 :            :         // #i26521# form controls to be ignored
    3040 [ +  - ][ -  + ]:         11 :         if( maClassName.EqualsAscii( "Forms.HTML:Hidden.1" ) )
    3041                 :            :         {
    3042                 :          0 :             SetProcessSdrObj( false );
    3043                 :            :             return;
    3044                 :            :         }
    3045                 :            : 
    3046 [ +  - ][ +  - ]:         11 :         if( rStrm.GetRecLeft() <= 8 ) return;
    3047                 :            : 
    3048                 :            :         // position and size of control data in 'Ctls' stream
    3049         [ +  - ]:         11 :         mnCtlsStrmPos = static_cast< sal_Size >( rStrm.ReaduInt32() );
    3050         [ +  - ]:         11 :         mnCtlsStrmSize = static_cast< sal_Size >( rStrm.ReaduInt32() );
    3051                 :            : 
    3052 [ +  - ][ +  - ]:         11 :         if( rStrm.GetRecLeft() <= 8 ) return;
    3053                 :            : 
    3054                 :            :         // additional string (16-bit characters), e.g. for progress bar control
    3055                 :            :         sal_uInt32 nAddStrSize;
    3056         [ +  - ]:         11 :         rStrm >> nAddStrSize;
    3057                 :            :         OSL_ENSURE( rStrm.GetRecLeft() >= nAddStrSize + 4, "XclImpPictureObj::ReadPictFmla - missing data" );
    3058 [ +  - ][ +  - ]:         11 :         if( rStrm.GetRecLeft() >= nAddStrSize + 4 )
    3059                 :            :         {
    3060         [ +  - ]:         11 :             rStrm.Ignore( nAddStrSize );
    3061                 :            :             // cell link and source range
    3062         [ +  - ]:         11 :             ReadCellLinkFormula( rStrm, true );
    3063         [ +  - ]:         11 :             ReadSourceRangeFormula( rStrm, true );
    3064                 :            :         }
    3065                 :            :     }
    3066 [ #  # ][ #  # ]:          0 :     else if( mbEmbedded && (rStrm.GetRecLeft() >= 4) )
                 [ #  # ]
    3067                 :            :     {
    3068                 :         11 :         rStrm >> mnStorageId;
    3069                 :            :     }
    3070                 :            : }
    3071                 :            : 
    3072                 :            : // DFF stream conversion ======================================================
    3073                 :            : 
    3074                 :         68 : void XclImpSolverContainer::InsertSdrObjectInfo( SdrObject& rSdrObj, sal_uInt32 nDffShapeId, sal_uInt32 nDffFlags )
    3075                 :            : {
    3076         [ +  - ]:         68 :     if( nDffShapeId > 0 )
    3077                 :            :     {
    3078                 :         68 :         maSdrInfoMap[ nDffShapeId ].Set( &rSdrObj, nDffFlags );
    3079         [ +  - ]:         68 :         maSdrObjMap[ &rSdrObj ] = nDffShapeId;
    3080                 :            :     }
    3081                 :         68 : }
    3082                 :            : 
    3083                 :          0 : void XclImpSolverContainer::RemoveSdrObjectInfo( SdrObject& rSdrObj )
    3084                 :            : {
    3085                 :            :     // remove info of passed object from the maps
    3086         [ #  # ]:          0 :     XclImpSdrObjMap::iterator aIt = maSdrObjMap.find( &rSdrObj );
    3087 [ #  # ][ #  # ]:          0 :     if( aIt != maSdrObjMap.end() )
    3088                 :            :     {
    3089 [ #  # ][ #  # ]:          0 :         maSdrInfoMap.erase( aIt->second );
    3090         [ #  # ]:          0 :         maSdrObjMap.erase( aIt );
    3091                 :            :     }
    3092                 :            : 
    3093                 :            :     // remove info of all child objects of a group object
    3094 [ #  # ][ #  # ]:          0 :     if( SdrObjGroup* pGroupObj = dynamic_cast< SdrObjGroup* >( &rSdrObj ) )
    3095                 :            :     {
    3096 [ #  # ][ #  # ]:          0 :         if( SdrObjList* pSubList = pGroupObj->GetSubList() )
    3097                 :            :         {
    3098                 :            :             // iterate flat over the list because this function already works recursively
    3099         [ #  # ]:          0 :             SdrObjListIter aObjIt( *pSubList, IM_FLAT );
    3100 [ #  # ][ #  # ]:          0 :             for( SdrObject* pChildObj = aObjIt.Next(); pChildObj; pChildObj = aObjIt.Next() )
                 [ #  # ]
    3101         [ #  # ]:          0 :                 RemoveSdrObjectInfo( *pChildObj );
    3102                 :            :         }
    3103                 :            :     }
    3104                 :          0 : }
    3105                 :            : 
    3106                 :         62 : void XclImpSolverContainer::UpdateConnectorRules()
    3107                 :            : {
    3108         [ -  + ]:         62 :     for ( size_t i = 0, n = aCList.size(); i < n; ++i )
    3109                 :            :     {
    3110                 :          0 :         SvxMSDffConnectorRule* pRule = aCList[ i ];
    3111                 :          0 :         UpdateConnection( pRule->nShapeA, pRule->pAObj, &pRule->nSpFlagsA );
    3112                 :          0 :         UpdateConnection( pRule->nShapeB, pRule->pBObj, &pRule->nSpFlagsB );
    3113                 :          0 :         UpdateConnection( pRule->nShapeC, pRule->pCObj );
    3114                 :            :     }
    3115                 :         62 : }
    3116                 :            : 
    3117                 :         62 : void XclImpSolverContainer::RemoveConnectorRules()
    3118                 :            : {
    3119                 :            :     // base class from SVX uses plain untyped tools/List
    3120         [ -  + ]:         62 :     for ( size_t i = 0, n = aCList.size(); i < n; ++i ) {
    3121                 :          0 :         delete aCList[ i ];
    3122                 :            :     }
    3123                 :         62 :     aCList.clear();
    3124                 :         62 :     maSdrInfoMap.clear();
    3125                 :         62 :     maSdrObjMap.clear();
    3126                 :         62 : }
    3127                 :            : 
    3128                 :          0 : void XclImpSolverContainer::UpdateConnection( sal_uInt32 nDffShapeId, SdrObject*& rpSdrObj, sal_uInt32* pnDffFlags )
    3129                 :            : {
    3130         [ #  # ]:          0 :     XclImpSdrInfoMap::const_iterator aIt = maSdrInfoMap.find( nDffShapeId );
    3131         [ #  # ]:          0 :     if( aIt != maSdrInfoMap.end() )
    3132                 :            :     {
    3133                 :          0 :         rpSdrObj = aIt->second.mpSdrObj;
    3134         [ #  # ]:          0 :         if( pnDffFlags )
    3135                 :          0 :             *pnDffFlags = aIt->second.mnDffFlags;
    3136                 :            :     }
    3137                 :          0 : }
    3138                 :            : 
    3139                 :            : // ----------------------------------------------------------------------------
    3140                 :            : 
    3141                 :         17 : XclImpSimpleDffConverter::XclImpSimpleDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ) :
    3142                 :         17 :     SvxMSDffManager( rDffStrm, rRoot.GetBasePath(), 0, 0, rRoot.GetDoc().GetDrawLayer(), 1440, COL_DEFAULT, 24, 0 ),
    3143         [ +  - ]:         17 :     XclImpRoot( rRoot )
    3144                 :            : {
    3145                 :         17 :     SetSvxMSDffSettings( SVXMSDFF_SETTINGS_CROP_BITMAPS | SVXMSDFF_SETTINGS_IMPORT_EXCEL );
    3146                 :         17 : }
    3147                 :            : 
    3148         [ +  - ]:         17 : XclImpSimpleDffConverter::~XclImpSimpleDffConverter()
    3149                 :            : {
    3150         [ -  + ]:         17 : }
    3151                 :            : 
    3152                 :         99 : bool XclImpSimpleDffConverter::GetColorFromPalette( sal_uInt16 nIndex, Color& rColor ) const
    3153                 :            : {
    3154                 :         99 :     ColorData nColor = GetPalette().GetColorData( static_cast< sal_uInt16 >( nIndex ) );
    3155                 :            : 
    3156         [ -  + ]:         99 :     if( nColor == COL_AUTO )
    3157                 :          0 :         return 0;
    3158                 :            : 
    3159                 :         99 :     rColor.SetColor( nColor );
    3160                 :         99 :     return 1;
    3161                 :            : }
    3162                 :            : 
    3163                 :            : // ----------------------------------------------------------------------------
    3164                 :            : Reference< XComponentContext >
    3165                 :          0 : lcl_getUnoCtx()
    3166                 :            : {
    3167 [ #  # ][ #  # ]:          0 :     comphelper::ComponentContext aCtx( ::comphelper::getProcessServiceFactory() );
    3168 [ #  # ][ #  # ]:          0 :     return aCtx.getUNOContext();
    3169                 :            : }
    3170                 :            : 
    3171                 :         62 : XclImpDffConverter::XclImpDffConvData::XclImpDffConvData(
    3172                 :            :         XclImpDrawing& rDrawing, SdrModel& rSdrModel, SdrPage& rSdrPage ) :
    3173                 :            :     mrDrawing( rDrawing ),
    3174                 :            :     mrSdrModel( rSdrModel ),
    3175                 :            :     mrSdrPage( rSdrPage ),
    3176                 :            :     mnLastCtrlIndex( -1 ),
    3177                 :         62 :     mbHasCtrlForm( false )
    3178                 :            : {
    3179                 :         62 : }
    3180                 :            : // ----------------------------------------------------------------------------
    3181                 :            : 
    3182                 :         17 : XclImpDffConverter::XclImpDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ) :
    3183                 :            :     XclImpSimpleDffConverter( rRoot, rDffStrm ),
    3184                 :            :     oox::ole::MSConvertOCXControls( rRoot.GetDocShell()->GetModel() ),
    3185                 :            :     maStdFormName( CREATE_OUSTRING( "Standard" ) ),
    3186 [ +  - ][ +  - ]:         17 :     mnOleImpFlags( 0 )
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    3187                 :            : {
    3188         [ +  - ]:         17 :     const SvtFilterOptions& rFilterOpt = SvtFilterOptions::Get();
    3189 [ +  - ][ +  - ]:         17 :     if( rFilterOpt.IsMathType2Math() )
    3190                 :         17 :         mnOleImpFlags |= OLE_MATHTYPE_2_STARMATH;
    3191 [ +  - ][ +  - ]:         17 :     if( rFilterOpt.IsWinWord2Writer() )
    3192                 :         17 :         mnOleImpFlags |= OLE_WINWORD_2_STARWRITER;
    3193 [ +  - ][ +  - ]:         17 :     if( rFilterOpt.IsPowerPoint2Impress() )
    3194                 :         17 :         mnOleImpFlags |= OLE_POWERPOINT_2_STARIMPRESS;
    3195                 :            : 
    3196                 :            :     // try to open the 'Ctls' storage stream containing OCX control properties
    3197 [ +  - ][ +  - ]:         17 :     mxCtlsStrm = OpenStream( EXC_STREAM_CTLS );
         [ +  - ][ +  - ]
                 [ +  - ]
    3198                 :            : 
    3199                 :            :     // default text margin (convert EMU to drawing layer units)
    3200                 :         17 :     mnDefTextMargin = EXC_OBJ_TEXT_MARGIN;
    3201         [ +  - ]:         17 :     ScaleEmu( mnDefTextMargin );
    3202                 :         17 : }
    3203                 :            : 
    3204 [ +  - ][ +  - ]:         17 : XclImpDffConverter::~XclImpDffConverter()
                 [ +  - ]
    3205                 :            : {
    3206         [ -  + ]:         17 : }
    3207                 :            : 
    3208                 :         33 : String XclImpObjectManager::GetOleNameOverride( SCTAB nTab, sal_uInt16 nObjId )
    3209                 :            : {
    3210                 :         33 :     rtl::OUString sOleName;
    3211 [ +  - ][ +  - ]:         33 :     String sCodeName = GetExtDocOptions().GetCodeName( nTab );
                 [ +  - ]
    3212                 :            : 
    3213 [ +  - ][ +  - ]:         33 :     if (  mxOleCtrlNameOverride->hasByName( sCodeName ) )
         [ +  - ][ +  - ]
    3214                 :            :     {
    3215                 :         33 :         Reference< XIndexContainer > xIdToOleName;
    3216 [ +  - ][ +  - ]:         33 :         mxOleCtrlNameOverride->getByName( sCodeName ) >>= xIdToOleName;
         [ +  - ][ +  - ]
    3217 [ +  - ][ +  - ]:         33 :         xIdToOleName->getByIndex( nObjId ) >>= sOleName;
    3218                 :            :     }
    3219                 :            :     OSL_TRACE("XclImpObjectManager::GetOleNameOverride tab %d, ( module %s ) object id ( %d ) is %s", nTab,
    3220                 :            :         rtl::OUStringToOString( sCodeName, RTL_TEXTENCODING_UTF8 ).getStr(), nObjId,
    3221                 :            :         rtl::OUStringToOString( sOleName, RTL_TEXTENCODING_UTF8 ).getStr() );
    3222                 :            : 
    3223 [ +  - ][ +  - ]:         33 :     return sOleName;
    3224                 :            : }
    3225                 :            : 
    3226                 :         17 : void XclImpDffConverter::StartProgressBar( sal_Size nProgressSize )
    3227                 :            : {
    3228         [ +  - ]:         17 :     mxProgress.reset( new ScfProgressBar( GetDocShell(), STR_PROGRESS_CALCULATING ) );
    3229                 :         17 :     mxProgress->AddSegment( nProgressSize );
    3230                 :         17 :     mxProgress->Activate();
    3231                 :         17 : }
    3232                 :            : 
    3233                 :         77 : void XclImpDffConverter::Progress( sal_Size nDelta )
    3234                 :            : {
    3235                 :            :     OSL_ENSURE( mxProgress, "XclImpDffConverter::Progress - invalid call, no progress bar" );
    3236                 :         77 :     mxProgress->Progress( nDelta );
    3237                 :         77 : }
    3238                 :            : 
    3239                 :         62 : void XclImpDffConverter::InitializeDrawing( XclImpDrawing& rDrawing, SdrModel& rSdrModel, SdrPage& rSdrPage )
    3240                 :            : {
    3241 [ +  - ][ +  - ]:         62 :     XclImpDffConvDataRef xConvData( new XclImpDffConvData( rDrawing, rSdrModel, rSdrPage ) );
                 [ +  - ]
    3242         [ +  - ]:         62 :     maDataStack.push_back( xConvData );
    3243 [ +  - ][ +  - ]:         62 :     SetModel( &xConvData->mrSdrModel, 1440 );
    3244                 :         62 : }
    3245                 :            : 
    3246                 :          0 : void XclImpDffConverter::ProcessObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj )
    3247                 :            : {
    3248         [ #  # ]:          0 :     if( rDrawObj.IsProcessSdrObj() )
    3249                 :            :     {
    3250         [ #  # ]:          0 :         if( const XclObjAnchor* pAnchor = rDrawObj.GetAnchor() )
    3251                 :            :         {
    3252 [ #  # ][ #  # ]:          0 :             Rectangle aAnchorRect = GetConvData().mrDrawing.CalcAnchorRect( *pAnchor, false );
    3253 [ #  # ][ #  # ]:          0 :             if( rDrawObj.IsValidSize( aAnchorRect ) )
    3254                 :            :             {
    3255                 :            :                 // CreateSdrObject() recursively creates embedded child objects
    3256         [ #  # ]:          0 :                 SdrObjectPtr xSdrObj( rDrawObj.CreateSdrObject( *this, aAnchorRect, false ) );
    3257         [ #  # ]:          0 :                 if( xSdrObj.is() )
    3258         [ #  # ]:          0 :                     rDrawObj.PreProcessSdrObject( *this, *xSdrObj );
    3259                 :            :                 // call InsertSdrObject() also, if SdrObject is missing
    3260 [ #  # ][ #  # ]:          0 :                 InsertSdrObject( rObjList, rDrawObj, xSdrObj.release() );
    3261                 :            :             }
    3262                 :            :         }
    3263                 :            :     }
    3264                 :          0 : }
    3265                 :            : 
    3266                 :         62 : void XclImpDffConverter::ProcessDrawing( const XclImpDrawObjVector& rDrawObjs )
    3267                 :            : {
    3268                 :         62 :     SdrPage& rSdrPage = GetConvData().mrSdrPage;
    3269 [ +  - ][ -  + ]:         62 :     for( XclImpDrawObjVector::const_iterator aIt = rDrawObjs.begin(), aEnd = rDrawObjs.end(); aIt != aEnd; ++aIt )
    3270         [ #  # ]:          0 :         ProcessObject( rSdrPage, **aIt );
    3271                 :         62 : }
    3272                 :            : 
    3273                 :         62 : void XclImpDffConverter::ProcessDrawing( SvStream& rDffStrm )
    3274                 :            : {
    3275                 :         62 :     rDffStrm.Seek( STREAM_SEEK_TO_END );
    3276         [ +  - ]:         62 :     if( rDffStrm.Tell() > 0 )
    3277                 :            :     {
    3278         [ +  - ]:         62 :         rDffStrm.Seek( STREAM_SEEK_TO_BEGIN );
    3279                 :         62 :         DffRecordHeader aHeader;
    3280         [ +  - ]:         62 :         rDffStrm >> aHeader;
    3281                 :            :         OSL_ENSURE( aHeader.nRecType == DFF_msofbtDgContainer, "XclImpDffConverter::ProcessDrawing - unexpected record" );
    3282         [ +  - ]:         62 :         if( aHeader.nRecType == DFF_msofbtDgContainer )
    3283         [ +  - ]:         62 :             ProcessDgContainer( rDffStrm, aHeader );
    3284                 :            :     }
    3285                 :         62 : }
    3286                 :            : 
    3287                 :         62 : void XclImpDffConverter::FinalizeDrawing()
    3288                 :            : {
    3289                 :            :     OSL_ENSURE( !maDataStack.empty(), "XclImpDffConverter::FinalizeDrawing - no drawing manager on stack" );
    3290                 :         62 :     maDataStack.pop_back();
    3291                 :            :     // restore previous model at core DFF converter
    3292         [ -  + ]:         62 :     if( !maDataStack.empty() )
    3293                 :          0 :         SetModel( &maDataStack.back()->mrSdrModel, 1440 );
    3294                 :         62 : }
    3295                 :            : 
    3296                 :         15 : SdrObject* XclImpDffConverter::CreateSdrObject( const XclImpTbxObjBase& rTbxObj, const Rectangle& rAnchorRect )
    3297                 :            : {
    3298                 :         15 :     SdrObjectPtr xSdrObj;
    3299                 :            : 
    3300         [ +  - ]:         15 :     OUString aServiceName = rTbxObj.GetServiceName();
    3301 [ +  - ][ +  - ]:         15 :     if( SupportsOleObjects() && !aServiceName.isEmpty() ) try
         [ +  - ][ +  - ]
    3302                 :            :     {
    3303                 :            :         // create the form control from scratch
    3304 [ +  - ][ +  - ]:         15 :         Reference< XFormComponent > xFormComp( ScfApiHelper::CreateInstance( GetDocShell(), aServiceName ), UNO_QUERY_THROW );
                 [ +  - ]
    3305                 :            :         // set controls form, needed in virtual function InsertControl()
    3306         [ +  - ]:         15 :         InitControlForm();
    3307                 :            :         // try to insert the control into the form
    3308                 :         15 :         ::com::sun::star::awt::Size aDummySize;
    3309                 :         15 :         Reference< XShape > xShape;
    3310         [ +  - ]:         15 :         XclImpDffConvData& rConvData = GetConvData();
    3311 [ +  - ][ +  - ]:         15 :         if( rConvData.mxCtrlForm.is() && InsertControl( xFormComp, aDummySize, &xShape, sal_True ) )
         [ +  - ][ +  - ]
    3312                 :            :         {
    3313 [ +  - ][ +  - ]:         15 :             xSdrObj.reset( rTbxObj.CreateSdrObjectFromShape( xShape, rAnchorRect ) );
    3314                 :            :             // try to attach a macro to the control
    3315                 :         15 :             ScriptEventDescriptor aDescriptor;
    3316 [ +  - ][ -  + ]:         15 :             if( (rConvData.mnLastCtrlIndex >= 0) && rTbxObj.FillMacroDescriptor( aDescriptor ) )
         [ -  + ][ +  - ]
    3317                 :            :             {
    3318         [ #  # ]:          0 :                 Reference< XEventAttacherManager > xEventMgr( rConvData.mxCtrlForm, UNO_QUERY_THROW );
    3319 [ #  # ][ #  # ]:          0 :                 xEventMgr->registerScriptEvent( rConvData.mnLastCtrlIndex, aDescriptor );
    3320                 :         15 :             }
    3321         [ #  # ]:         15 :         }
    3322                 :            :     }
    3323         [ #  # ]:          0 :     catch( const Exception& )
    3324                 :            :     {
    3325                 :            :     }
    3326                 :            : 
    3327         [ +  - ]:         15 :     return xSdrObj.release();
    3328                 :            : }
    3329                 :            : 
    3330                 :         14 : SdrObject* XclImpDffConverter::CreateSdrObject( const XclImpPictureObj& rPicObj, const Rectangle& rAnchorRect )
    3331                 :            : {
    3332                 :         14 :     SdrObjectPtr xSdrObj;
    3333                 :            : 
    3334 [ +  - ][ +  - ]:         14 :     if( SupportsOleObjects() )
    3335                 :            :     {
    3336         [ +  + ]:         14 :         if( rPicObj.IsOcxControl() )
    3337                 :            :         {
    3338         [ +  - ]:         11 :             if( mxCtlsStrm.Is() ) try
    3339                 :            :             {
    3340                 :            :                 /*  set controls form, needed in virtual function InsertControl()
    3341                 :            :                     called from ReadOCXExcelKludgeStream() */
    3342         [ +  - ]:         11 :                 InitControlForm();
    3343                 :            : 
    3344                 :            :                 // read from mxCtlsStrm into xShape, insert the control model into the form
    3345                 :         11 :                 Reference< XShape > xShape;
    3346 [ +  - ][ +  - ]:         11 :                 if( GetConvData().mxCtrlForm.is() )
    3347                 :            :                 {
    3348                 :         11 :                      Reference< XFormComponent >  xFComp;
    3349                 :         11 :                      com::sun::star::awt::Size aSz;  // not used in import
    3350         [ +  - ]:         11 :                      ReadOCXCtlsStream( mxCtlsStrm, xFComp, rPicObj.GetCtlsStreamPos(),  rPicObj.GetCtlsStreamSize() );
    3351                 :            :                      // recreate the method formally known as
    3352                 :            :                      // ReadOCXExcelKludgeStream( )
    3353         [ +  - ]:         11 :                      if ( xFComp.is() )
    3354                 :            :                      {
    3355         [ +  - ]:         11 :                          ScfPropertySet aPropSet( xFComp );
    3356 [ +  - ][ +  - ]:         11 :                          aPropSet.SetStringProperty( CREATE_OUSTRING( "Name" ), rPicObj.GetObjName() );
         [ +  - ][ +  - ]
                 [ +  - ]
    3357         [ +  - ]:         11 :                          InsertControl( xFComp, aSz,&xShape,true);
    3358 [ +  - ][ +  - ]:         11 :                          xSdrObj.reset( rPicObj.CreateSdrObjectFromShape( xShape, rAnchorRect ) );
                 [ +  - ]
    3359                 :         11 :                      }
    3360         [ #  # ]:         11 :                 }
    3361                 :            :             }
    3362         [ #  # ]:          0 :             catch( const Exception& )
    3363                 :            :             {
    3364                 :            :             }
    3365                 :            :         }
    3366                 :            :         else
    3367                 :            :         {
    3368         [ +  - ]:          3 :             SfxObjectShell* pDocShell = GetDocShell();
    3369         [ +  - ]:          3 :             SotStorageRef xSrcStrg = GetRootStorage();
    3370         [ +  - ]:          3 :             String aStrgName = rPicObj.GetOleStorageName();
    3371 [ +  - ][ +  - ]:          3 :             if( pDocShell && xSrcStrg.Is() && (aStrgName.Len() > 0) )
         [ -  + ][ -  + ]
    3372                 :            :             {
    3373                 :            :                 // first try to resolve graphic from DFF storage
    3374         [ #  # ]:          0 :                 Graphic aGraphic;
    3375         [ #  # ]:          0 :                 Rectangle aVisArea;
    3376 [ #  # ][ #  # ]:          0 :                 if( !GetBLIP( GetPropertyValue( DFF_Prop_pib ), aGraphic, &aVisArea ) )
                 [ #  # ]
    3377                 :            :                 {
    3378                 :            :                     // if not found, use graphic from object (imported from IMGDATA record)
    3379         [ #  # ]:          0 :                     aGraphic = rPicObj.GetGraphic();
    3380                 :          0 :                     aVisArea = rPicObj.GetVisArea();
    3381                 :            :                 }
    3382 [ #  # ][ #  # ]:          0 :                 if( aGraphic.GetType() != GRAPHIC_NONE )
    3383                 :            :                 {
    3384                 :          0 :                     ErrCode nError = ERRCODE_NONE;
    3385                 :            :                     namespace cssea = ::com::sun::star::embed::Aspects;
    3386         [ #  # ]:          0 :                     sal_Int64 nAspects = rPicObj.IsSymbol() ? cssea::MSOLE_ICON : cssea::MSOLE_CONTENT;
    3387                 :            :                     xSdrObj.reset( CreateSdrOLEFromStorage(
    3388                 :            :                         aStrgName, xSrcStrg, pDocShell->GetStorage(), aGraphic,
    3389 [ #  # ][ #  # ]:          0 :                         rAnchorRect, aVisArea, 0, nError, mnOleImpFlags, nAspects ) );
                 [ #  # ]
    3390         [ #  # ]:          0 :                 }
    3391 [ +  - ][ +  - ]:          3 :             }
    3392                 :            :         }
    3393                 :            :     }
    3394                 :            : 
    3395         [ +  - ]:         14 :     return xSdrObj.release();
    3396                 :            : }
    3397                 :            : 
    3398                 :         40 : bool XclImpDffConverter::SupportsOleObjects() const
    3399                 :            : {
    3400                 :         40 :     return GetConvData().mrDrawing.SupportsOleObjects();
    3401                 :            : }
    3402                 :            : 
    3403                 :            : // virtual functions ----------------------------------------------------------
    3404                 :            : 
    3405                 :        101 : void XclImpDffConverter::ProcessClientAnchor2( SvStream& rDffStrm,
    3406                 :            :         DffRecordHeader& rHeader, void* /*pClientData*/, DffObjData& rObjData )
    3407                 :            : {
    3408                 :            :     // find the OBJ record data related to the processed shape
    3409                 :        101 :     XclImpDffConvData& rConvData = GetConvData();
    3410         [ +  - ]:        101 :     if( XclImpDrawObjBase* pDrawObj = rConvData.mrDrawing.FindDrawObj( rObjData.rSpHd ).get() )
    3411                 :            :     {
    3412                 :            :         OSL_ENSURE( rHeader.nRecType == DFF_msofbtClientAnchor, "XclImpDffConverter::ProcessClientAnchor2 - no client anchor record" );
    3413         [ +  - ]:        101 :         XclObjAnchor aAnchor;
    3414         [ +  - ]:        101 :         rHeader.SeekToContent( rDffStrm );
    3415         [ +  - ]:        101 :         rDffStrm.SeekRel( 2 );  // flags
    3416         [ +  - ]:        101 :         rDffStrm >> aAnchor;    // anchor format equal to BIFF5 OBJ records
    3417                 :        101 :         pDrawObj->SetAnchor( aAnchor );
    3418         [ +  - ]:        101 :         rObjData.aChildAnchor = rConvData.mrDrawing.CalcAnchorRect( aAnchor, true );
    3419                 :        101 :         rObjData.bChildAnchor = sal_True;
    3420                 :            :     }
    3421                 :        101 : }
    3422                 :            : 
    3423                 :        163 : SdrObject* XclImpDffConverter::ProcessObj( SvStream& rDffStrm, DffObjData& rDffObjData,
    3424                 :            :         void* pClientData, Rectangle& /*rTextRect*/, SdrObject* pOldSdrObj )
    3425                 :            : {
    3426         [ +  - ]:        163 :     XclImpDffConvData& rConvData = GetConvData();
    3427                 :            : 
    3428                 :            :     /*  pOldSdrObj passes a generated SdrObject. This function owns this object
    3429                 :            :         and can modify it. The function has either to return it back to caller
    3430                 :            :         or to delete it by itself. */
    3431                 :        163 :     SdrObjectPtr xSdrObj( pOldSdrObj );
    3432                 :            : 
    3433                 :            :     // find the OBJ record data related to the processed shape
    3434         [ +  - ]:        163 :     XclImpDrawObjRef xDrawObj = rConvData.mrDrawing.FindDrawObj( rDffObjData.rSpHd );
    3435                 :        163 :     const Rectangle& rAnchorRect = rDffObjData.aChildAnchor;
    3436                 :            : 
    3437                 :            :     // Do not process the global page group shape (flag SP_FPATRIARCH)
    3438                 :        163 :     bool bGlobalPageGroup = ::get_flag< sal_uInt32 >( rDffObjData.nSpFlags, SP_FPATRIARCH );
    3439 [ +  + ][ -  + ]:        163 :     if( !xDrawObj || !xDrawObj->IsProcessSdrObj() || bGlobalPageGroup )
         [ +  + ][ +  + ]
    3440                 :         92 :         return 0;   // simply return, xSdrObj will be destroyed
    3441                 :            : 
    3442                 :            :     /*  Pass pointer to top-level object back to caller. If the processed
    3443                 :            :         object is embedded in a group, the pointer is already set to the
    3444                 :            :         top-level parent object. */
    3445                 :         71 :     XclImpDrawObjBase** ppTopLevelObj = reinterpret_cast< XclImpDrawObjBase** >( pClientData );
    3446 [ +  - ][ +  - ]:         71 :     bool bIsTopLevel = !ppTopLevelObj || !*ppTopLevelObj;
    3447 [ +  - ][ +  - ]:         71 :     if( ppTopLevelObj && bIsTopLevel )
    3448                 :         71 :         *ppTopLevelObj = xDrawObj.get();
    3449                 :            : 
    3450                 :            :     // connectors don't have to be area objects
    3451 [ +  + ][ -  + ]:         71 :     if( dynamic_cast< SdrEdgeObj* >( xSdrObj.get() ) )
                 [ -  + ]
    3452                 :          0 :         xDrawObj->SetAreaObj( false );
    3453                 :            : 
    3454                 :            :     /*  Check for valid size for all objects. Needed to ignore lots of invisible
    3455                 :            :         phantom objects from deleted rows or columns (for performance reasons).
    3456                 :            :         #i30816# Include objects embedded in groups.
    3457                 :            :         #i58780# Ignore group shapes, size is not initialized. */
    3458 [ -  + ][ #  # ]:         71 :     bool bEmbeddedGroup = !bIsTopLevel && dynamic_cast< SdrObjGroup* >( xSdrObj.get() );
                 [ #  # ]
    3459 [ +  - ][ +  - ]:         71 :     if( !bEmbeddedGroup && !xDrawObj->IsValidSize( rAnchorRect ) )
         [ -  + ][ -  + ]
    3460                 :          0 :         return 0;   // simply return, xSdrObj will be destroyed
    3461                 :            : 
    3462                 :            :     // set shape information from DFF stream
    3463 [ +  - ][ +  - ]:         71 :     String aObjName = GetPropertyString( DFF_Prop_wzName, rDffStrm );
    3464         [ +  - ]:         71 :     String aHyperlink = ReadHlinkProperty( rDffStrm );
    3465         [ +  - ]:         71 :     bool bVisible = !GetPropertyBool( DFF_Prop_fHidden );
    3466         [ +  - ]:         71 :     bool bAutoMargin = GetPropertyBool( DFF_Prop_AutoTextMargin );
    3467 [ +  - ][ +  - ]:         71 :     xDrawObj->SetDffData( rDffObjData, aObjName, aHyperlink, bVisible, bAutoMargin );
    3468                 :            : 
    3469                 :            :     /*  Connect textbox data (string, alignment, text orientation) to object.
    3470                 :            :         don't ask for a text-ID, DFF export doesn't set one. */
    3471 [ +  + ][ -  + ]:         71 :     if( XclImpTextObj* pTextObj = dynamic_cast< XclImpTextObj* >( xDrawObj.get() ) )
    3472 [ +  - ][ +  + ]:         51 :         if( const XclImpObjTextData* pTextData = rConvData.mrDrawing.FindTextData( rDffObjData.rSpHd ) )
    3473         [ +  - ]:         48 :             pTextObj->SetTextData( *pTextData );
    3474                 :            : 
    3475                 :            :     // copy line and fill formatting of TBX form controls from DFF properties
    3476 [ -  + ][ +  + ]:         71 :     if( XclImpTbxObjBase* pTbxObj = dynamic_cast< XclImpTbxObjBase* >( xDrawObj.get() ) )
    3477         [ +  - ]:         15 :         pTbxObj->SetDffProperties( *this );
    3478                 :            : 
    3479                 :            :     // try to create a custom SdrObject that overwrites the passed object
    3480         [ +  - ]:         71 :     SdrObjectPtr xNewSdrObj( xDrawObj->CreateSdrObject( *this, rAnchorRect, true ) );
    3481         [ +  + ]:         71 :     if( xNewSdrObj.is() )
    3482         [ +  - ]:         32 :         xSdrObj.reset( xNewSdrObj.release() );
    3483                 :            : 
    3484                 :            :     // process the SdrObject
    3485         [ +  - ]:         71 :     if( xSdrObj.is() )
    3486                 :            :     {
    3487                 :            :         // filled without color -> set system window color
    3488 [ +  - ][ +  + ]:         71 :         if( GetPropertyBool( DFF_Prop_fFilled ) && !IsProperty( DFF_Prop_fillColor ) )
         [ -  + ][ -  + ]
    3489 [ #  # ][ #  # ]:          0 :             xSdrObj->SetMergedItem( XFillColorItem( EMPTY_STRING, GetPalette().GetColor( EXC_COLOR_WINDOWBACK ) ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3490                 :            : 
    3491                 :            :         // additional processing on the SdrObject
    3492         [ +  - ]:         71 :         xDrawObj->PreProcessSdrObject( *this, *xSdrObj );
    3493                 :            : 
    3494                 :            :         /*  If the SdrObject will not be inserted into the draw page, delete it
    3495                 :            :             here. Happens e.g. for notes: The PreProcessSdrObject() call above
    3496                 :            :             has inserted the note into the document, and the SdrObject is not
    3497                 :            :             needed anymore. */
    3498         [ +  + ]:         71 :         if( !xDrawObj->IsInsertSdrObj() )
    3499         [ +  - ]:          3 :             xSdrObj.reset();
    3500                 :            :     }
    3501                 :            : 
    3502         [ +  + ]:         71 :     if( xSdrObj.is() )
    3503                 :            :     {
    3504                 :            :         /*  Store the relation between shape ID and SdrObject for connectors.
    3505                 :            :             Must be done here (and not in InsertSdrObject() function),
    3506                 :            :             otherwise all SdrObjects embedded in groups would be lost. */
    3507         [ +  - ]:         68 :         rConvData.maSolverCont.InsertSdrObjectInfo( *xSdrObj, xDrawObj->GetDffShapeId(), xDrawObj->GetDffFlags() );
    3508                 :            : 
    3509                 :            :         /*  If the drawing object is embedded in a group object, call
    3510                 :            :             PostProcessSdrObject() here. For top-level objects this will be
    3511                 :            :             done automatically in InsertSdrObject() but grouped shapes are
    3512                 :            :             inserted into their groups somewhere in the SvxMSDffManager base
    3513                 :            :             class without chance of notification. Unfortunately, now this is
    3514                 :            :             called before the object is really inserted into its group object,
    3515                 :            :             but that should not have any effect for grouped objects. */
    3516         [ -  + ]:         68 :         if( !bIsTopLevel )
    3517         [ #  # ]:          0 :             xDrawObj->PostProcessSdrObject( *this, *xSdrObj );
    3518                 :            :      }
    3519                 :            : 
    3520 [ +  - ][ +  - ]:        163 :     return xSdrObj.release();
         [ +  - ][ +  - ]
                 [ +  - ]
    3521                 :            : }
    3522                 :            : 
    3523                 :          0 : sal_uLong XclImpDffConverter::Calc_nBLIPPos( sal_uLong /*nOrgVal*/, sal_uLong nStreamPos ) const
    3524                 :            : {
    3525                 :          0 :     return nStreamPos + 4;
    3526                 :            : }
    3527                 :            : 
    3528                 :         26 : sal_Bool XclImpDffConverter::InsertControl( const Reference< XFormComponent >& rxFormComp,
    3529                 :            :         const ::com::sun::star::awt::Size& /*rSize*/, Reference< XShape >* pxShape,
    3530                 :            :         sal_Bool /*bFloatingCtrl*/ )
    3531                 :            : {
    3532         [ +  - ]:         26 :     if( GetDocShell() ) try
    3533                 :            :     {
    3534         [ +  - ]:         26 :         XclImpDffConvData& rConvData = GetConvData();
    3535         [ +  - ]:         26 :         Reference< XIndexContainer > xFormIC( rConvData.mxCtrlForm, UNO_QUERY_THROW );
    3536         [ +  - ]:         26 :         Reference< XControlModel > xCtrlModel( rxFormComp, UNO_QUERY_THROW );
    3537                 :            : 
    3538                 :            :         // create the control shape
    3539 [ +  - ][ +  - ]:         26 :         Reference< XShape > xShape( ScfApiHelper::CreateInstance( GetDocShell(), CREATE_OUSTRING( "com.sun.star.drawing.ControlShape" ) ), UNO_QUERY_THROW );
         [ +  - ][ +  - ]
    3540         [ +  - ]:         26 :         Reference< XControlShape > xCtrlShape( xShape, UNO_QUERY_THROW );
    3541                 :            : 
    3542                 :            :         // insert the new control into the form
    3543 [ +  - ][ +  - ]:         26 :         sal_Int32 nNewIndex = xFormIC->getCount();
    3544 [ +  - ][ +  - ]:         26 :         xFormIC->insertByIndex( nNewIndex, Any( rxFormComp ) );
                 [ +  - ]
    3545                 :            :         // on success: store new index of the control for later use (macro events)
    3546                 :         26 :         rConvData.mnLastCtrlIndex = nNewIndex;
    3547                 :            : 
    3548                 :            :         // set control model at control shape and pass back shape to caller
    3549 [ +  - ][ +  - ]:         26 :         xCtrlShape->setControl( xCtrlModel );
    3550 [ +  - ][ +  - ]:         26 :         if( pxShape ) *pxShape = xShape;
    3551         [ #  # ]:         26 :         return sal_True;
    3552                 :            :     }
    3553                 :          0 :     catch( const Exception& )
    3554                 :            :     {
    3555                 :            :         OSL_FAIL( "XclImpDffConverter::InsertControl - cannot create form control" );
    3556                 :            :     }
    3557                 :            : 
    3558                 :         26 :     return false;
    3559                 :            : }
    3560                 :            : 
    3561                 :            : // private --------------------------------------------------------------------
    3562                 :            : 
    3563                 :        614 : XclImpDffConverter::XclImpDffConvData& XclImpDffConverter::GetConvData()
    3564                 :            : {
    3565                 :            :     OSL_ENSURE( !maDataStack.empty(), "XclImpDffConverter::GetConvData - no drawing manager on stack" );
    3566                 :        614 :     return *maDataStack.back();
    3567                 :            : }
    3568                 :            : 
    3569                 :         40 : const XclImpDffConverter::XclImpDffConvData& XclImpDffConverter::GetConvData() const
    3570                 :            : {
    3571                 :            :     OSL_ENSURE( !maDataStack.empty(), "XclImpDffConverter::GetConvData - no drawing manager on stack" );
    3572                 :         40 :     return *maDataStack.back();
    3573                 :            : }
    3574                 :            : 
    3575                 :         71 : String XclImpDffConverter::ReadHlinkProperty( SvStream& rDffStrm ) const
    3576                 :            : {
    3577                 :            :     /*  Reads hyperlink data from a complex DFF property. Contents of this
    3578                 :            :         property are equal to the HLINK record, import of this record is
    3579                 :            :         implemented in class XclImpHyperlink. This function has to create an
    3580                 :            :         instance of the XclImpStream class to be able to reuse the
    3581                 :            :         functionality of XclImpHyperlink. */
    3582                 :         71 :     String aString;
    3583         [ +  - ]:         71 :     sal_uInt32 nBufferSize = GetPropertyValue( DFF_Prop_pihlShape );
    3584 [ -  + ][ #  # ]:         71 :     if( (0 < nBufferSize) && (nBufferSize <= 0xFFFF) && SeekToContent( DFF_Prop_pihlShape, rDffStrm ) )
         [ #  # ][ #  # ]
                 [ -  + ]
    3585                 :            :     {
    3586                 :            :         // create a faked BIFF record that can be read by XclImpStream class
    3587         [ #  # ]:          0 :         SvMemoryStream aMemStream;
    3588 [ #  # ][ #  # ]:          0 :         aMemStream << sal_uInt16( 0 ) << static_cast< sal_uInt16 >( nBufferSize );
    3589                 :            : 
    3590                 :            :         // copy from DFF stream to memory stream
    3591         [ #  # ]:          0 :         ::std::vector< sal_uInt8 > aBuffer( nBufferSize );
    3592         [ #  # ]:          0 :         sal_uInt8* pnData = &aBuffer.front();
    3593 [ #  # ][ #  # ]:          0 :         if( rDffStrm.Read( pnData, nBufferSize ) == nBufferSize )
    3594                 :            :         {
    3595         [ #  # ]:          0 :             aMemStream.Write( pnData, nBufferSize );
    3596                 :            : 
    3597                 :            :             // create BIFF import stream to be able to use XclImpHyperlink class
    3598         [ #  # ]:          0 :             XclImpStream aXclStrm( aMemStream, GetRoot() );
    3599 [ #  # ][ #  # ]:          0 :             if( aXclStrm.StartNextRecord() )
    3600 [ #  # ][ #  # ]:          0 :                 aString = XclImpHyperlink::ReadEmbeddedData( aXclStrm );
         [ #  # ][ #  # ]
    3601         [ #  # ]:          0 :         }
    3602                 :            :     }
    3603                 :         71 :     return aString;
    3604                 :            : }
    3605                 :            : 
    3606                 :         62 : void XclImpDffConverter::ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader )
    3607                 :            : {
    3608                 :         62 :     sal_Size nEndPos = rDgHeader.GetRecEndFilePos();
    3609         [ +  + ]:        198 :     while( rDffStrm.Tell() < nEndPos )
    3610                 :            :     {
    3611                 :        136 :         DffRecordHeader aHeader;
    3612         [ +  - ]:        136 :         rDffStrm >> aHeader;
    3613      [ +  +  + ]:        136 :         switch( aHeader.nRecType )
    3614                 :            :         {
    3615                 :            :             case DFF_msofbtSolverContainer:
    3616         [ +  - ]:         12 :                 ProcessSolverContainer( rDffStrm, aHeader );
    3617                 :         12 :             break;
    3618                 :            :             case DFF_msofbtSpgrContainer:
    3619         [ +  - ]:         62 :                 ProcessShGrContainer( rDffStrm, aHeader );
    3620                 :         62 :             break;
    3621                 :            :             default:
    3622         [ +  - ]:        136 :                 aHeader.SeekToEndOfRecord( rDffStrm );
    3623                 :            :         }
    3624                 :            :     }
    3625                 :            :     // seek to end of drawing page container
    3626                 :         62 :     rDgHeader.SeekToEndOfRecord( rDffStrm );
    3627                 :            : 
    3628                 :            :     // #i12638# #i37900# connector rules
    3629                 :         62 :     XclImpSolverContainer& rSolverCont = GetConvData().maSolverCont;
    3630                 :         62 :     rSolverCont.UpdateConnectorRules();
    3631                 :         62 :     SolveSolver( rSolverCont );
    3632                 :         62 :     rSolverCont.RemoveConnectorRules();
    3633                 :         62 : }
    3634                 :            : 
    3635                 :         62 : void XclImpDffConverter::ProcessShGrContainer( SvStream& rDffStrm, const DffRecordHeader& rShGrHeader )
    3636                 :            : {
    3637                 :         62 :     sal_Size nEndPos = rShGrHeader.GetRecEndFilePos();
    3638         [ +  + ]:        225 :     while( rDffStrm.Tell() < nEndPos )
    3639                 :            :     {
    3640                 :        163 :         DffRecordHeader aHeader;
    3641         [ +  - ]:        163 :         rDffStrm >> aHeader;
    3642         [ +  - ]:        163 :         switch( aHeader.nRecType )
    3643                 :            :         {
    3644                 :            :             case DFF_msofbtSpgrContainer:
    3645                 :            :             case DFF_msofbtSpContainer:
    3646         [ +  - ]:        163 :                 ProcessShContainer( rDffStrm, aHeader );
    3647                 :        163 :             break;
    3648                 :            :             default:
    3649         [ #  # ]:        163 :                 aHeader.SeekToEndOfRecord( rDffStrm );
    3650                 :            :         }
    3651                 :            :     }
    3652                 :            :     // seek to end of shape group container
    3653                 :         62 :     rShGrHeader.SeekToEndOfRecord( rDffStrm );
    3654                 :         62 : }
    3655                 :            : 
    3656                 :         12 : void XclImpDffConverter::ProcessSolverContainer( SvStream& rDffStrm, const DffRecordHeader& rSolverHeader )
    3657                 :            : {
    3658                 :            :     // solver container wants to read the solver container header again
    3659                 :         12 :     rSolverHeader.SeekToBegOfRecord( rDffStrm );
    3660                 :            :     // read the entire solver container
    3661                 :         12 :     rDffStrm >> GetConvData().maSolverCont;
    3662                 :            :     // seek to end of solver container
    3663                 :         12 :     rSolverHeader.SeekToEndOfRecord( rDffStrm );
    3664                 :         12 : }
    3665                 :            : 
    3666                 :        163 : void XclImpDffConverter::ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader )
    3667                 :            : {
    3668         [ +  - ]:        163 :     rShHeader.SeekToBegOfRecord( rDffStrm );
    3669         [ +  - ]:        163 :     Rectangle aDummy;
    3670                 :        163 :     const XclImpDrawObjBase* pDrawObj = 0;
    3671                 :            :     /*  The call to ImportObj() creates and returns a new SdrObject for the
    3672                 :            :         processed shape. We take ownership of the returned object here. If the
    3673                 :            :         shape is a group object, all embedded objects are created recursively,
    3674                 :            :         and the returned group object contains them all. ImportObj() calls the
    3675                 :            :         virtual functions ProcessClientAnchor2() and ProcessObj() and writes
    3676                 :            :         the pointer to the related draw object data (OBJ record) into pDrawObj. */
    3677         [ +  - ]:        163 :     SdrObjectPtr xSdrObj( ImportObj( rDffStrm, &pDrawObj, aDummy, aDummy, 0, 0 ) );
    3678 [ +  + ][ +  + ]:        163 :     if( pDrawObj && xSdrObj.is() )
                 [ +  + ]
    3679 [ +  - ][ +  - ]:         68 :         InsertSdrObject( GetConvData().mrSdrPage, *pDrawObj, xSdrObj.release() );
    3680 [ +  - ][ +  - ]:        163 :     rShHeader.SeekToEndOfRecord( rDffStrm );
    3681                 :        163 : }
    3682                 :            : 
    3683                 :         68 : void XclImpDffConverter::InsertSdrObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj )
    3684                 :            : {
    3685         [ +  - ]:         68 :     XclImpDffConvData& rConvData = GetConvData();
    3686                 :            :     /*  Take ownership of the passed object. If insertion fails (e.g. rDrawObj
    3687                 :            :         states to skip insertion), the object is automatically deleted. */
    3688                 :         68 :     SdrObjectPtr xSdrObj( pSdrObj );
    3689 [ +  - ][ +  - ]:         68 :     if( xSdrObj.is() && rDrawObj.IsInsertSdrObj() )
                 [ +  - ]
    3690                 :            :     {
    3691         [ +  - ]:         68 :         rObjList.NbcInsertObject( xSdrObj.release() );
    3692                 :            :         // callback to drawing manager for e.g. tracking of used sheet area
    3693         [ +  - ]:         68 :         rConvData.mrDrawing.OnObjectInserted( rDrawObj );
    3694                 :            :         // callback to drawing object for post processing (use pSdrObj, xSdrObj already released)
    3695         [ +  - ]:         68 :         rDrawObj.PostProcessSdrObject( *this, *pSdrObj );
    3696                 :            :     }
    3697                 :            :     /*  SdrObject still here? Insertion failed, remove data from shape ID map.
    3698                 :            :         The SdrObject will be destructed then. */
    3699         [ -  + ]:         68 :     if( xSdrObj.is() )
    3700 [ #  # ][ +  - ]:         68 :         rConvData.maSolverCont.RemoveSdrObjectInfo( *xSdrObj );
    3701                 :         68 : }
    3702                 :            : 
    3703                 :         26 : void XclImpDffConverter::InitControlForm()
    3704                 :            : {
    3705                 :         26 :     XclImpDffConvData& rConvData = GetConvData();
    3706         [ +  + ]:         26 :     if( rConvData.mbHasCtrlForm )
    3707                 :         26 :         return;
    3708                 :            : 
    3709                 :          5 :     rConvData.mbHasCtrlForm = true;
    3710         [ +  - ]:          5 :     if( SupportsOleObjects() ) try
    3711                 :            :     {
    3712 [ +  - ][ +  - ]:          5 :         Reference< XFormsSupplier > xFormsSupplier( rConvData.mrSdrPage.getUnoPage(), UNO_QUERY_THROW );
    3713 [ +  - ][ +  - ]:          5 :         Reference< XNameContainer > xFormsNC( xFormsSupplier->getForms(), UNO_SET_THROW );
                 [ +  - ]
    3714                 :            :         // find or create the Standard form used to insert the imported controls
    3715 [ +  - ][ -  + ]:          5 :         if( xFormsNC->hasByName( maStdFormName ) )
                 [ +  - ]
    3716                 :            :         {
    3717 [ #  # ][ #  # ]:          0 :             xFormsNC->getByName( maStdFormName ) >>= rConvData.mxCtrlForm;
                 [ #  # ]
    3718                 :            :         }
    3719 [ +  - ][ +  - ]:          5 :         else if( SfxObjectShell* pDocShell = GetDocShell() )
    3720                 :            :         {
    3721 [ +  - ][ +  - ]:          5 :             rConvData.mxCtrlForm.set( ScfApiHelper::CreateInstance( pDocShell, CREATE_OUSTRING( "com.sun.star.form.component.Form" ) ), UNO_QUERY_THROW );
                 [ +  - ]
    3722 [ +  - ][ +  - ]:          5 :             xFormsNC->insertByName( maStdFormName, Any( rConvData.mxCtrlForm ) );
                 [ +  - ]
    3723         [ #  # ]:          5 :         }
    3724                 :            :     }
    3725                 :          0 :     catch( const Exception& )
    3726                 :            :     {
    3727                 :            :     }
    3728                 :            : }
    3729                 :            : 
    3730                 :            : // Drawing manager ============================================================
    3731                 :            : 
    3732                 :         86 : XclImpDrawing::XclImpDrawing( const XclImpRoot& rRoot, bool bOleObjects ) :
    3733                 :            :     XclImpRoot( rRoot ),
    3734 [ +  - ][ +  - ]:         86 :     mbOleObjs( bOleObjects )
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    3735                 :            : {
    3736                 :         86 : }
    3737                 :            : 
    3738         [ +  - ]:         86 : XclImpDrawing::~XclImpDrawing()
    3739                 :            : {
    3740         [ -  + ]:         86 : }
    3741                 :            : 
    3742                 :          0 : Graphic XclImpDrawing::ReadImgData( const XclImpRoot& rRoot, XclImpStream& rStrm )
    3743                 :            : {
    3744         [ #  # ]:          0 :     Graphic aGraphic;
    3745                 :            :     sal_uInt16 nFormat, nEnv;
    3746                 :            :     sal_uInt32 nDataSize;
    3747 [ #  # ][ #  # ]:          0 :     rStrm >> nFormat >> nEnv >> nDataSize;
                 [ #  # ]
    3748 [ #  # ][ #  # ]:          0 :     if( nDataSize <= rStrm.GetRecLeft() )
    3749                 :            :     {
    3750      [ #  #  # ]:          0 :         switch( nFormat )
    3751                 :            :         {
    3752         [ #  # ]:          0 :             case EXC_IMGDATA_WMF:   ReadWmf( aGraphic, rRoot, rStrm );  break;
    3753         [ #  # ]:          0 :             case EXC_IMGDATA_BMP:   ReadBmp( aGraphic, rRoot, rStrm );  break;
    3754                 :            :             default:    OSL_FAIL( "XclImpDrawing::ReadImgData - unknown image format" );
    3755                 :            :         }
    3756                 :            :     }
    3757                 :          0 :     return aGraphic;
    3758                 :            : }
    3759                 :            : 
    3760                 :          0 : void XclImpDrawing::ReadObj( XclImpStream& rStrm )
    3761                 :            : {
    3762         [ #  # ]:          0 :     XclImpDrawObjRef xDrawObj;
    3763                 :            : 
    3764                 :            :     /*  #i61786# In BIFF8 streams, OBJ records may occur without MSODRAWING
    3765                 :            :         records. In this case, the OBJ records are in BIFF5 format. Do a sanity
    3766                 :            :         check here that there is no DFF data loaded before. */
    3767                 :            :     OSL_ENSURE( maDffStrm.Tell() == 0, "XclImpDrawing::ReadObj - unexpected DFF stream data, OBJ will be ignored" );
    3768         [ #  # ]:          0 :     if( maDffStrm.Tell() == 0 ) switch( GetBiff() )
           [ #  #  #  # ]
    3769                 :            :     {
    3770                 :            :         case EXC_BIFF3:
    3771 [ #  # ][ #  # ]:          0 :             xDrawObj = XclImpDrawObjBase::ReadObj3( GetRoot(), rStrm );
                 [ #  # ]
    3772                 :          0 :         break;
    3773                 :            :         case EXC_BIFF4:
    3774 [ #  # ][ #  # ]:          0 :             xDrawObj = XclImpDrawObjBase::ReadObj4( GetRoot(), rStrm );
                 [ #  # ]
    3775                 :          0 :         break;
    3776                 :            :         case EXC_BIFF5:
    3777                 :            :         case EXC_BIFF8:
    3778 [ #  # ][ #  # ]:          0 :             xDrawObj = XclImpDrawObjBase::ReadObj5( GetRoot(), rStrm );
                 [ #  # ]
    3779                 :          0 :         break;
    3780                 :            :         default:
    3781                 :            :             DBG_ERROR_BIFF();
    3782                 :            :     }
    3783                 :            : 
    3784         [ #  # ]:          0 :     if( xDrawObj )
    3785                 :            :     {
    3786                 :            :         // insert into maRawObjs or into the last open group object
    3787 [ #  # ][ #  # ]:          0 :         maRawObjs.InsertGrouped( xDrawObj );
                 [ #  # ]
    3788                 :            :         // to be able to find objects by ID
    3789 [ #  # ][ #  # ]:          0 :         maObjMapId[ xDrawObj->GetObjId() ] = xDrawObj;
    3790         [ #  # ]:          0 :     }
    3791                 :          0 : }
    3792                 :            : 
    3793                 :         86 : void XclImpDrawing::ReadMsoDrawing( XclImpStream& rStrm )
    3794                 :            : {
    3795                 :            :     OSL_ENSURE_BIFF( GetBiff() == EXC_BIFF8 );
    3796                 :            :     // disable internal CONTINUE handling
    3797                 :         86 :     rStrm.ResetRecord( false );
    3798                 :            :     // read leading MSODRAWING record
    3799                 :         86 :     ReadDffRecord( rStrm );
    3800                 :            : 
    3801                 :            :     // read following drawing records, but do not start following unrelated record
    3802                 :         86 :     bool bLoop = true;
    3803   [ +  +  +  + ]:        450 :     while( bLoop ) switch( rStrm.GetNextRecId() )
                 [ +  + ]
    3804                 :            :     {
    3805                 :            :         case EXC_ID_MSODRAWING:
    3806                 :            :         case EXC_ID_MSODRAWINGSEL:
    3807                 :            :         case EXC_ID_CONT:
    3808                 :        129 :             rStrm.StartNextRecord();
    3809                 :        129 :             ReadDffRecord( rStrm );
    3810                 :        129 :         break;
    3811                 :            :         case EXC_ID_OBJ:
    3812                 :        101 :             rStrm.StartNextRecord();
    3813                 :        101 :             ReadObj8( rStrm );
    3814                 :        101 :         break;
    3815                 :            :         case EXC_ID_TXO:
    3816                 :         48 :             rStrm.StartNextRecord();
    3817                 :         48 :             ReadTxo( rStrm );
    3818                 :         48 :         break;
    3819                 :            :         default:
    3820                 :         86 :             bLoop = false;
    3821                 :            :     }
    3822                 :            : 
    3823                 :            :     // re-enable internal CONTINUE handling
    3824                 :         86 :     rStrm.ResetRecord( true );
    3825                 :         86 : }
    3826                 :            : 
    3827                 :        264 : XclImpDrawObjRef XclImpDrawing::FindDrawObj( const DffRecordHeader& rHeader ) const
    3828                 :            : {
    3829                 :            :     /*  maObjMap stores objects by position of the client data (OBJ record) in
    3830                 :            :         the DFF stream, which is always behind shape start position of the
    3831                 :            :         passed header. The function upper_bound() finds the first element in
    3832                 :            :         the map whose key is greater than the start position of the header. Its
    3833                 :            :         end position is used to test whether the found object is really related
    3834                 :            :         to the shape. */
    3835         [ +  - ]:        264 :     XclImpDrawObjRef xDrawObj;
    3836         [ +  - ]:        264 :     XclImpObjMap::const_iterator aIt = maObjMap.upper_bound( rHeader.GetRecBegFilePos() );
    3837 [ +  + ][ +  + ]:        264 :     if( (aIt != maObjMap.end()) && (aIt->first <= rHeader.GetRecEndFilePos()) )
         [ +  - ][ +  + ]
    3838         [ +  - ]:        264 :         xDrawObj = aIt->second;
    3839                 :        264 :     return xDrawObj;
    3840                 :            : }
    3841                 :            : 
    3842                 :         30 : XclImpDrawObjRef XclImpDrawing::FindDrawObj( sal_uInt16 nObjId ) const
    3843                 :            : {
    3844         [ +  - ]:         30 :     XclImpDrawObjRef xDrawObj;
    3845         [ +  - ]:         30 :     XclImpObjMapById::const_iterator aIt = maObjMapId.find( nObjId );
    3846         [ +  - ]:         30 :     if( aIt != maObjMapId.end() )
    3847         [ +  - ]:         30 :         xDrawObj = aIt->second;
    3848                 :         30 :     return xDrawObj;
    3849                 :            : }
    3850                 :            : 
    3851                 :         51 : const XclImpObjTextData* XclImpDrawing::FindTextData( const DffRecordHeader& rHeader ) const
    3852                 :            : {
    3853                 :            :     /*  maTextMap stores textbox data by position of the client data (TXO
    3854                 :            :         record) in the DFF stream, which is always behind shape start position
    3855                 :            :         of the passed header. The function upper_bound() finds the first
    3856                 :            :         element in the map whose key is greater than the start position of the
    3857                 :            :         header. Its end position is used to test whether the found object is
    3858                 :            :         really related to the shape. */
    3859         [ +  - ]:         51 :     XclImpObjTextMap::const_iterator aIt = maTextMap.upper_bound( rHeader.GetRecBegFilePos() );
    3860 [ +  + ][ +  - ]:         51 :     if( (aIt != maTextMap.end()) && (aIt->first <= rHeader.GetRecEndFilePos()) )
         [ +  - ][ +  + ]
    3861                 :         48 :         return aIt->second.get();
    3862                 :         51 :     return 0;
    3863                 :            : }
    3864                 :            : 
    3865                 :          3 : void XclImpDrawing::SetSkipObj( sal_uInt16 nObjId )
    3866                 :            : {
    3867                 :          3 :     maSkipObjs.push_back( nObjId );
    3868                 :          3 : }
    3869                 :            : 
    3870                 :         86 : sal_Size XclImpDrawing::GetProgressSize() const
    3871                 :            : {
    3872                 :         86 :     sal_Size nProgressSize = maRawObjs.GetProgressSize();
    3873         [ +  + ]:        187 :     for( XclImpObjMap::const_iterator aIt = maObjMap.begin(), aEnd = maObjMap.end(); aIt != aEnd; ++aIt )
    3874         [ +  - ]:        101 :         nProgressSize += aIt->second->GetProgressSize();
    3875                 :         86 :     return nProgressSize;
    3876                 :            : }
    3877                 :            : 
    3878                 :         62 : void XclImpDrawing::ImplConvertObjects( XclImpDffConverter& rDffConv, SdrModel& rSdrModel, SdrPage& rSdrPage )
    3879                 :            : {
    3880                 :            :     //rhbz#636521, disable undo during conversion. faster, smaller and stops
    3881                 :            :     //temp objects being inserted into the undo list
    3882                 :         62 :     bool bOrigUndoStatus = rSdrModel.IsUndoEnabled();
    3883                 :         62 :     rSdrModel.EnableUndo(false);
    3884                 :            :     // register this drawing manager at the passed (global) DFF manager
    3885                 :         62 :     rDffConv.InitializeDrawing( *this, rSdrModel, rSdrPage );
    3886                 :            :     // process list of objects to be skipped
    3887 [ +  - ][ +  - ]:         65 :     for( ScfUInt16Vec::const_iterator aIt = maSkipObjs.begin(), aEnd = maSkipObjs.end(); aIt != aEnd; ++aIt )
         [ +  - ][ +  + ]
                 [ +  - ]
    3888 [ +  - ][ +  - ]:          3 :         if( XclImpDrawObjBase* pDrawObj = FindDrawObj( *aIt ).get() )
         [ +  - ][ +  - ]
    3889                 :          3 :             pDrawObj->SetProcessSdrObj( false );
    3890                 :            :     // process drawing objects without DFF data
    3891                 :         62 :     rDffConv.ProcessDrawing( maRawObjs );
    3892                 :            :     // process all objects in the DFF stream
    3893                 :         62 :     rDffConv.ProcessDrawing( maDffStrm );
    3894                 :            :     // unregister this drawing manager at the passed (global) DFF manager
    3895                 :         62 :     rDffConv.FinalizeDrawing();
    3896                 :         62 :     rSdrModel.EnableUndo(bOrigUndoStatus);
    3897                 :         62 : }
    3898                 :            : 
    3899                 :            : // protected ------------------------------------------------------------------
    3900                 :            : 
    3901                 :          0 : void XclImpDrawing::AppendRawObject( const XclImpDrawObjRef& rxDrawObj )
    3902                 :            : {
    3903                 :            :     OSL_ENSURE( rxDrawObj, "XclImpDrawing::AppendRawObject - unexpected empty reference" );
    3904                 :          0 :     maRawObjs.push_back( rxDrawObj );
    3905                 :          0 : }
    3906                 :            : 
    3907                 :            : // private --------------------------------------------------------------------
    3908                 :            : 
    3909                 :          0 : void XclImpDrawing::ReadWmf( Graphic& rGraphic, const XclImpRoot&, XclImpStream& rStrm ) // static helper
    3910                 :            : {
    3911                 :            :     // extract graphic data from IMGDATA and following CONTINUE records
    3912         [ #  # ]:          0 :     rStrm.Ignore( 8 );
    3913         [ #  # ]:          0 :     SvMemoryStream aMemStrm;
    3914 [ #  # ][ #  # ]:          0 :     rStrm.CopyToStream( aMemStrm, rStrm.GetRecLeft() );
    3915         [ #  # ]:          0 :     aMemStrm.Seek( STREAM_SEEK_TO_BEGIN );
    3916                 :            :     // import the graphic from memory stream
    3917         [ #  # ]:          0 :     GDIMetaFile aGDIMetaFile;
    3918 [ #  # ][ #  # ]:          0 :     if( ::ReadWindowMetafile( aMemStrm, aGDIMetaFile, 0 ) )
    3919 [ #  # ][ #  # ]:          0 :         rGraphic = aGDIMetaFile;
         [ #  # ][ #  # ]
                 [ #  # ]
    3920                 :          0 : }
    3921                 :            : 
    3922                 :          0 : void XclImpDrawing::ReadBmp( Graphic& rGraphic, const XclImpRoot& rRoot, XclImpStream& rStrm ) // static helper
    3923                 :            : {
    3924                 :            :     // extract graphic data from IMGDATA and following CONTINUE records
    3925         [ #  # ]:          0 :     SvMemoryStream aMemStrm;
    3926                 :            : 
    3927                 :            :     /*  Excel 3 and 4 seem to write broken BMP data. Usually they write a
    3928                 :            :         DIBCOREHEADER (12 bytes) containing width, height, planes = 1, and
    3929                 :            :         pixel depth = 32 bit. After that, 3 unused bytes are added before the
    3930                 :            :         actual pixel data. This does even confuse Excel 5 and later, which
    3931                 :            :         cannot read the image data correctly. */
    3932         [ #  # ]:          0 :     if( rRoot.GetBiff() <= EXC_BIFF4 )
    3933                 :            :     {
    3934         [ #  # ]:          0 :         rStrm.PushPosition();
    3935                 :            :         sal_uInt32 nHdrSize;
    3936                 :            :         sal_uInt16 nWidth, nHeight, nPlanes, nDepth;
    3937 [ #  # ][ #  # ]:          0 :         rStrm >> nHdrSize >> nWidth >> nHeight >> nPlanes >> nDepth;
         [ #  # ][ #  # ]
                 [ #  # ]
    3938 [ #  # ][ #  # ]:          0 :         if( (nHdrSize == 12) && (nPlanes == 1) && (nDepth == 32) )
                 [ #  # ]
    3939                 :            :         {
    3940         [ #  # ]:          0 :             rStrm.Ignore( 3 );
    3941         [ #  # ]:          0 :             aMemStrm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    3942 [ #  # ][ #  # ]:          0 :             aMemStrm << nHdrSize << nWidth << nHeight << nPlanes << nDepth;
         [ #  # ][ #  # ]
                 [ #  # ]
    3943 [ #  # ][ #  # ]:          0 :             rStrm.CopyToStream( aMemStrm, rStrm.GetRecLeft() );
    3944                 :            :         }
    3945         [ #  # ]:          0 :         rStrm.PopPosition();
    3946                 :            :     }
    3947                 :            : 
    3948                 :            :     // no special handling above -> just copy the remaining record data
    3949         [ #  # ]:          0 :     if( aMemStrm.Tell() == 0 )
    3950 [ #  # ][ #  # ]:          0 :         rStrm.CopyToStream( aMemStrm, rStrm.GetRecLeft() );
    3951                 :            : 
    3952                 :            :     // import the graphic from memory stream
    3953         [ #  # ]:          0 :     aMemStrm.Seek( STREAM_SEEK_TO_BEGIN );
    3954         [ #  # ]:          0 :     Bitmap aBitmap;
    3955 [ #  # ][ #  # ]:          0 :     if( aBitmap.Read( aMemStrm, false ) )   // read DIB without file header
    3956 [ #  # ][ #  # ]:          0 :         rGraphic = aBitmap;
         [ #  # ][ #  # ]
                 [ #  # ]
    3957                 :          0 : }
    3958                 :            : 
    3959                 :        215 : void XclImpDrawing::ReadDffRecord( XclImpStream& rStrm )
    3960                 :            : {
    3961                 :        215 :     maDffStrm.Seek( STREAM_SEEK_TO_END );
    3962                 :        215 :     rStrm.CopyRecordToStream( maDffStrm );
    3963                 :        215 : }
    3964                 :            : 
    3965                 :        101 : void XclImpDrawing::ReadObj8( XclImpStream& rStrm )
    3966                 :            : {
    3967         [ +  - ]:        101 :     XclImpDrawObjRef xDrawObj = XclImpDrawObjBase::ReadObj8( GetRoot(), rStrm );
    3968                 :            :     // store the new object in the internal containers
    3969 [ +  - ][ +  - ]:        101 :     maObjMap[ maDffStrm.Tell() ] = xDrawObj;
    3970 [ +  - ][ +  - ]:        101 :     maObjMapId[ xDrawObj->GetObjId() ] = xDrawObj;
                 [ +  - ]
    3971                 :        101 : }
    3972                 :            : 
    3973                 :         48 : void XclImpDrawing::ReadTxo( XclImpStream& rStrm )
    3974                 :            : {
    3975 [ +  - ][ +  - ]:         48 :     XclImpObjTextRef xTextData( new XclImpObjTextData );
                 [ +  - ]
    3976 [ +  - ][ +  - ]:         48 :     maTextMap[ maDffStrm.Tell() ] = xTextData;
    3977                 :            : 
    3978                 :            :     // 1) read the TXO record
    3979         [ +  - ]:         48 :     xTextData->maData.ReadTxo8( rStrm );
    3980                 :            : 
    3981                 :            :     // 2) first CONTINUE with string
    3982         [ +  - ]:         48 :     xTextData->mxString.reset();
    3983                 :         48 :     bool bValid = true;
    3984         [ +  - ]:         48 :     if( xTextData->maData.mnTextLen > 0 )
    3985                 :            :     {
    3986 [ +  - ][ +  - ]:         48 :         bValid = (rStrm.GetNextRecId() == EXC_ID_CONT) && rStrm.StartNextRecord();
         [ +  - ][ +  - ]
    3987                 :            :         OSL_ENSURE( bValid, "XclImpDrawing::ReadTxo - missing CONTINUE record" );
    3988         [ +  - ]:         48 :         if( bValid )
    3989 [ +  - ][ +  - ]:         48 :             xTextData->mxString.reset( new XclImpString( rStrm.ReadUniString( xTextData->maData.mnTextLen ) ) );
         [ +  - ][ +  - ]
                 [ +  - ]
    3990                 :            :     }
    3991                 :            : 
    3992                 :            :     // 3) second CONTINUE with formatting runs
    3993         [ +  - ]:         48 :     if( xTextData->maData.mnFormatSize > 0 )
    3994                 :            :     {
    3995 [ +  - ][ +  - ]:         48 :         bValid = (rStrm.GetNextRecId() == EXC_ID_CONT) && rStrm.StartNextRecord();
         [ +  - ][ +  - ]
    3996                 :            :         OSL_ENSURE( bValid, "XclImpDrawing::ReadTxo - missing CONTINUE record" );
    3997         [ +  - ]:         48 :         if( bValid )
    3998         [ +  - ]:         48 :             xTextData->ReadFormats( rStrm );
    3999         [ +  - ]:         48 :     }
    4000                 :         48 : }
    4001                 :            : 
    4002                 :            : // ----------------------------------------------------------------------------
    4003                 :            : 
    4004                 :         86 : XclImpSheetDrawing::XclImpSheetDrawing( const XclImpRoot& rRoot, SCTAB nScTab ) :
    4005                 :            :     XclImpDrawing( rRoot, true ),
    4006                 :         86 :     maScUsedArea( ScAddress::INITIALIZE_INVALID )
    4007                 :            : {
    4008                 :         86 :     maScUsedArea.aStart.SetTab( nScTab );
    4009                 :         86 :     maScUsedArea.aEnd.SetTab( nScTab );
    4010                 :         86 : }
    4011                 :            : 
    4012                 :          3 : void XclImpSheetDrawing::ReadNote( XclImpStream& rStrm )
    4013                 :            : {
    4014      [ -  +  - ]:          3 :     switch( GetBiff() )
    4015                 :            :     {
    4016                 :            :         case EXC_BIFF2:
    4017                 :            :         case EXC_BIFF3:
    4018                 :            :         case EXC_BIFF4:
    4019                 :            :         case EXC_BIFF5:
    4020                 :          0 :             ReadNote3( rStrm );
    4021                 :          0 :         break;
    4022                 :            :         case EXC_BIFF8:
    4023                 :          3 :             ReadNote8( rStrm );
    4024                 :          3 :         break;
    4025                 :            :         default:
    4026                 :            :             DBG_ERROR_BIFF();
    4027                 :            :     }
    4028                 :          3 : }
    4029                 :            : 
    4030                 :          0 : void XclImpSheetDrawing::ReadTabChart( XclImpStream& rStrm )
    4031                 :            : {
    4032                 :            :     OSL_ENSURE_BIFF( GetBiff() >= EXC_BIFF5 );
    4033 [ #  # ][ #  # ]:          0 :     boost::shared_ptr< XclImpChartObj > xChartObj( new XclImpChartObj( GetRoot(), true ) );
                 [ #  # ]
    4034         [ #  # ]:          0 :     xChartObj->ReadChartSubStream( rStrm );
    4035                 :            :     // insert the chart as raw object without connected DFF data
    4036 [ #  # ][ #  # ]:          0 :     AppendRawObject( xChartObj );
         [ #  # ][ #  # ]
    4037                 :          0 : }
    4038                 :            : 
    4039                 :         62 : void XclImpSheetDrawing::ConvertObjects( XclImpDffConverter& rDffConv )
    4040                 :            : {
    4041         [ +  - ]:         62 :     if( SdrModel* pSdrModel = GetDoc().GetDrawLayer() )
    4042         [ +  - ]:         62 :         if( SdrPage* pSdrPage = GetSdrPage( maScUsedArea.aStart.Tab() ) )
    4043                 :         62 :             ImplConvertObjects( rDffConv, *pSdrModel, *pSdrPage );
    4044                 :         62 : }
    4045                 :            : 
    4046                 :        101 : Rectangle XclImpSheetDrawing::CalcAnchorRect( const XclObjAnchor& rAnchor, bool /*bDffAnchor*/ ) const
    4047                 :            : {
    4048                 :        101 :     return rAnchor.GetRect( GetRoot(), maScUsedArea.aStart.Tab(), MAP_100TH_MM );
    4049                 :            : }
    4050                 :            : 
    4051                 :         68 : void XclImpSheetDrawing::OnObjectInserted( const XclImpDrawObjBase& rDrawObj )
    4052                 :            : {
    4053         [ +  - ]:         68 :     ScRange aScObjArea = rDrawObj.GetUsedArea( maScUsedArea.aStart.Tab() );
    4054         [ +  - ]:         68 :     if( aScObjArea.IsValid() )
    4055         [ +  - ]:         68 :         maScUsedArea.ExtendTo( aScObjArea );
    4056                 :         68 : }
    4057                 :            : 
    4058                 :            : // private --------------------------------------------------------------------
    4059                 :            : 
    4060                 :          0 : void XclImpSheetDrawing::ReadNote3( XclImpStream& rStrm )
    4061                 :            : {
    4062                 :          0 :     XclAddress aXclPos;
    4063                 :            :     sal_uInt16 nTotalLen;
    4064 [ #  # ][ #  # ]:          0 :     rStrm >> aXclPos >> nTotalLen;
    4065                 :            : 
    4066                 :          0 :     ScAddress aScNotePos( ScAddress::UNINITIALIZED );
    4067 [ #  # ][ #  # ]:          0 :     if( GetAddressConverter().ConvertAddress( aScNotePos, aXclPos, maScUsedArea.aStart.Tab(), true ) )
                 [ #  # ]
    4068                 :            :     {
    4069 [ #  # ][ #  # ]:          0 :         sal_uInt16 nPartLen = ::std::min( nTotalLen, static_cast< sal_uInt16 >( rStrm.GetRecLeft() ) );
    4070         [ #  # ]:          0 :         String aNoteText = rStrm.ReadRawByteString( nPartLen );
    4071                 :          0 :         nTotalLen = nTotalLen - nPartLen;
    4072 [ #  # ][ #  # ]:          0 :         while( (nTotalLen > 0) && (rStrm.GetNextRecId() == EXC_ID_NOTE) && rStrm.StartNextRecord() )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    4073                 :            :         {
    4074 [ #  # ][ #  # ]:          0 :             rStrm >> aXclPos >> nPartLen;
    4075                 :            :             OSL_ENSURE( aXclPos.mnRow == 0xFFFF, "XclImpObjectManager::ReadNote3 - missing continuation NOTE record" );
    4076         [ #  # ]:          0 :             if( aXclPos.mnRow == 0xFFFF )
    4077                 :            :             {
    4078                 :            :                 OSL_ENSURE( nPartLen <= nTotalLen, "XclImpObjectManager::ReadNote3 - string too long" );
    4079 [ #  # ][ #  # ]:          0 :                 aNoteText.Append( rStrm.ReadRawByteString( nPartLen ) );
                 [ #  # ]
    4080         [ #  # ]:          0 :                 nTotalLen = nTotalLen - ::std::min( nTotalLen, nPartLen );
    4081                 :            :             }
    4082                 :            :             else
    4083                 :            :             {
    4084                 :            :                 // seems to be a new note, record already started -> load the note
    4085         [ #  # ]:          0 :                 rStrm.Seek( EXC_REC_SEEK_TO_BEGIN );
    4086         [ #  # ]:          0 :                 ReadNote( rStrm );
    4087                 :          0 :                 nTotalLen = 0;
    4088                 :            :             }
    4089                 :            :         }
    4090 [ #  # ][ #  # ]:          0 :         ScNoteUtil::CreateNoteFromString( GetDoc(), aScNotePos, aNoteText, false, false );
                 [ #  # ]
    4091                 :            :     }
    4092                 :          0 : }
    4093                 :            : 
    4094                 :          3 : void XclImpSheetDrawing::ReadNote8( XclImpStream& rStrm )
    4095                 :            : {
    4096                 :          3 :     XclAddress aXclPos;
    4097                 :            :     sal_uInt16 nFlags, nObjId;
    4098 [ +  - ][ +  - ]:          3 :     rStrm >> aXclPos >> nFlags >> nObjId;
                 [ +  - ]
    4099                 :            : 
    4100                 :          3 :     ScAddress aScNotePos( ScAddress::UNINITIALIZED );
    4101 [ +  - ][ +  - ]:          3 :     if( GetAddressConverter().ConvertAddress( aScNotePos, aXclPos, maScUsedArea.aStart.Tab(), true ) )
                 [ +  - ]
    4102         [ +  - ]:          3 :         if( nObjId != EXC_OBJ_INVALID_ID )
    4103 [ +  - ][ -  + ]:          3 :             if( XclImpNoteObj* pNoteObj = dynamic_cast< XclImpNoteObj* >( FindDrawObj( nObjId ).get() ) )
         [ +  - ][ +  - ]
    4104                 :          3 :                 pNoteObj->SetNoteData( aScNotePos, nFlags );
    4105                 :          3 : }
    4106                 :            : 
    4107                 :            : // The object manager =========================================================
    4108                 :            : 
    4109                 :         55 : XclImpObjectManager::XclImpObjectManager( const XclImpRoot& rRoot ) :
    4110 [ +  - ][ +  - ]:         55 :     XclImpRoot( rRoot )
                 [ +  - ]
    4111                 :            : {
    4112 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_GROUP ]          = CREATE_STRING( "Group" );
         [ +  - ][ +  - ]
    4113 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_LINE ]           = ScGlobal::GetRscString( STR_SHAPE_LINE );
                 [ +  - ]
    4114 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_RECTANGLE ]      = ScGlobal::GetRscString( STR_SHAPE_RECTANGLE );
                 [ +  - ]
    4115 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_OVAL ]           = ScGlobal::GetRscString( STR_SHAPE_OVAL );
                 [ +  - ]
    4116 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_ARC ]            = CREATE_STRING( "Arc" );
         [ +  - ][ +  - ]
    4117 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_CHART ]          = CREATE_STRING( "Chart" );
         [ +  - ][ +  - ]
    4118 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_TEXT ]           = CREATE_STRING( "Text" );
         [ +  - ][ +  - ]
    4119 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_BUTTON ]         =  ScGlobal::GetRscString( STR_FORM_BUTTON );
                 [ +  - ]
    4120 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_PICTURE ]        = CREATE_STRING( "Picture" );
         [ +  - ][ +  - ]
    4121 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_POLYGON ]        = CREATE_STRING( "Freeform" );
         [ +  - ][ +  - ]
    4122 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_CHECKBOX ]       = ScGlobal::GetRscString( STR_FORM_CHECKBOX );
                 [ +  - ]
    4123 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_OPTIONBUTTON ]   = ScGlobal::GetRscString( STR_FORM_OPTIONBUTTON );
                 [ +  - ]
    4124 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_EDIT ]           = CREATE_STRING( "Edit Box" );
         [ +  - ][ +  - ]
    4125 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_LABEL ]          = ScGlobal::GetRscString( STR_FORM_LABEL );
                 [ +  - ]
    4126 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_DIALOG ]         = CREATE_STRING( "Dialog Frame" );
         [ +  - ][ +  - ]
    4127 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_SPIN ]           = ScGlobal::GetRscString( STR_FORM_SPINNER );
                 [ +  - ]
    4128 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_SCROLLBAR ]      = ScGlobal::GetRscString( STR_FORM_SCROLLBAR );
                 [ +  - ]
    4129 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_LISTBOX ]        = ScGlobal::GetRscString( STR_FORM_LISTBOX );
                 [ +  - ]
    4130 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_GROUPBOX ]       = ScGlobal::GetRscString( STR_FORM_GROUPBOX );
                 [ +  - ]
    4131 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_DROPDOWN ]       = ScGlobal::GetRscString( STR_FORM_DROPDOWN );
                 [ +  - ]
    4132 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_NOTE ]           = CREATE_STRING( "Comment" );
         [ +  - ][ +  - ]
    4133 [ +  - ][ +  - ]:         55 :     maDefObjNames[ EXC_OBJTYPE_DRAWING ]        = ScGlobal::GetRscString( STR_SHAPE_AUTOSHAPE );
                 [ +  - ]
    4134                 :         55 : }
    4135                 :            : 
    4136         [ +  - ]:         55 : XclImpObjectManager::~XclImpObjectManager()
    4137                 :            : {
    4138         [ -  + ]:        110 : }
    4139                 :            : 
    4140                 :         29 : void XclImpObjectManager::ReadMsoDrawingGroup( XclImpStream& rStrm )
    4141                 :            : {
    4142                 :            :     OSL_ENSURE_BIFF( GetBiff() == EXC_BIFF8 );
    4143                 :            :     // Excel continues this record with MSODRAWINGGROUP and CONTINUE records, hmm.
    4144                 :         29 :     rStrm.ResetRecord( true, EXC_ID_MSODRAWINGGROUP );
    4145                 :         29 :     maDggStrm.Seek( STREAM_SEEK_TO_END );
    4146                 :         29 :     rStrm.CopyRecordToStream( maDggStrm );
    4147                 :         29 : }
    4148                 :            : 
    4149                 :        116 : XclImpSheetDrawing& XclImpObjectManager::GetSheetDrawing( SCTAB nScTab )
    4150                 :            : {
    4151                 :        116 :     XclImpSheetDrawingRef& rxDrawing = maSheetDrawings[ nScTab ];
    4152         [ +  + ]:        116 :     if( !rxDrawing )
    4153         [ +  - ]:         86 :         rxDrawing.reset( new XclImpSheetDrawing( GetRoot(), nScTab ) );
    4154                 :        116 :     return *rxDrawing;
    4155                 :            : }
    4156                 :            : 
    4157                 :         55 : void XclImpObjectManager::ConvertObjects()
    4158                 :            : {
    4159                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "sc", "dr104026", "XclImpObjectManager::ConvertObjects" );
    4160                 :            : 
    4161                 :            :     // do nothing if the document does not contain a drawing layer
    4162 [ +  - ][ +  - ]:         55 :     if( !GetDoc().GetDrawLayer() )
    4163                 :            :         return;
    4164                 :            : 
    4165                 :            :     // get total progress bar size for all sheet drawing managers
    4166                 :         55 :     sal_Size nProgressSize = 0;
    4167         [ +  + ]:        141 :     for( XclImpSheetDrawingMap::iterator aIt = maSheetDrawings.begin(), aEnd = maSheetDrawings.end(); aIt != aEnd; ++aIt )
    4168         [ +  - ]:         86 :         nProgressSize += aIt->second->GetProgressSize();
    4169                 :            :     // nothing to do if progress bar is zero (no objects present)
    4170         [ +  + ]:         55 :     if( nProgressSize == 0 )
    4171                 :            :         return;
    4172                 :            : 
    4173         [ +  - ]:         17 :     XclImpDffConverter aDffConv( GetRoot(), maDggStrm );
    4174         [ +  - ]:         17 :     aDffConv.StartProgressBar( nProgressSize );
    4175         [ +  + ]:         79 :     for( XclImpSheetDrawingMap::iterator aIt = maSheetDrawings.begin(), aEnd = maSheetDrawings.end(); aIt != aEnd; ++aIt )
    4176 [ +  - ][ +  - ]:        117 :         aIt->second->ConvertObjects( aDffConv );
    4177                 :            : 
    4178                 :            :     // #i112436# don't call ScChartListenerCollection::SetDirty here,
    4179                 :            :     // instead use InterpretDirtyCells in ScDocument::CalcAfterLoad.
    4180                 :            : }
    4181                 :            : 
    4182                 :         72 : OUString XclImpObjectManager::GetDefaultObjName( const XclImpDrawObjBase& rDrawObj ) const
    4183                 :            : {
    4184                 :         72 :     rtl::OUStringBuffer aDefName;
    4185         [ +  - ]:         72 :     DefObjNameMap::const_iterator aIt = maDefObjNames.find( rDrawObj.GetObjType() );
    4186 [ +  - ][ +  - ]:         72 :     if( aIt != maDefObjNames.end() )
    4187 [ +  - ][ +  - ]:         72 :         aDefName.append(aIt->second);
                 [ +  - ]
    4188 [ +  - ][ +  - ]:         72 :     return aDefName.append(' ').append(static_cast<sal_Int32>(rDrawObj.GetObjId())).makeStringAndClear();
                 [ +  - ]
    4189                 :            : }
    4190                 :            : 
    4191                 :         55 : ScRange XclImpObjectManager::GetUsedArea( SCTAB nScTab ) const
    4192                 :            : {
    4193         [ +  - ]:         55 :     XclImpSheetDrawingMap::const_iterator aIt = maSheetDrawings.find( nScTab );
    4194         [ +  + ]:         55 :     if( aIt != maSheetDrawings.end() )
    4195                 :         29 :         return aIt->second->GetUsedArea();
    4196                 :         55 :     return ScRange( ScAddress::INITIALIZE_INVALID );
    4197                 :            : }
    4198                 :            : 
    4199                 :            : // DFF property set helper ====================================================
    4200                 :            : 
    4201                 :          0 : XclImpDffPropSet::XclImpDffPropSet( const XclImpRoot& rRoot ) :
    4202                 :            :     XclImpRoot( rRoot ),
    4203 [ #  # ][ #  # ]:          0 :     maDffConv( rRoot, maDummyStrm )
    4204                 :            : {
    4205                 :          0 : }
    4206                 :            : 
    4207                 :          0 : void XclImpDffPropSet::Read( XclImpStream& rStrm )
    4208                 :            : {
    4209                 :            :     sal_uInt32 nPropSetSize;
    4210                 :            : 
    4211         [ #  # ]:          0 :     rStrm.PushPosition();
    4212         [ #  # ]:          0 :     rStrm.Ignore( 4 );
    4213         [ #  # ]:          0 :     rStrm >> nPropSetSize;
    4214         [ #  # ]:          0 :     rStrm.PopPosition();
    4215                 :            : 
    4216 [ #  # ][ #  # ]:          0 :     mxMemStrm.reset( new SvMemoryStream );
    4217         [ #  # ]:          0 :     rStrm.CopyToStream( *mxMemStrm, 8 + nPropSetSize );
    4218         [ #  # ]:          0 :     mxMemStrm->Seek( STREAM_SEEK_TO_BEGIN );
    4219         [ #  # ]:          0 :     maDffConv.ReadPropSet( *mxMemStrm, 0 );
    4220                 :          0 : }
    4221                 :            : 
    4222                 :          0 : sal_uInt32 XclImpDffPropSet::GetPropertyValue( sal_uInt16 nPropId, sal_uInt32 nDefault ) const
    4223                 :            : {
    4224                 :          0 :     return maDffConv.GetPropertyValue( nPropId, nDefault );
    4225                 :            : }
    4226                 :            : 
    4227                 :          0 : void XclImpDffPropSet::FillToItemSet( SfxItemSet& rItemSet ) const
    4228                 :            : {
    4229         [ #  # ]:          0 :     if( mxMemStrm.get() )
    4230                 :          0 :         maDffConv.ApplyAttributes( *mxMemStrm, rItemSet );
    4231                 :          0 : }
    4232                 :            : 
    4233                 :          0 : XclImpStream& operator>>( XclImpStream& rStrm, XclImpDffPropSet& rPropSet )
    4234                 :            : {
    4235                 :          0 :     rPropSet.Read( rStrm );
    4236                 :          0 :     return rStrm;
    4237 [ +  - ][ +  - ]:         24 : }
    4238                 :            : 
    4239                 :            : // ============================================================================
    4240                 :            : 
    4241                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10