LCOV - code coverage report
Current view: top level - sc/source/ui/unoobj - docuno.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 1130 2007 56.3 %
Date: 2014-11-03 Functions: 142 233 60.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "scitems.hxx"
      21             : #include <svx/fmdpage.hxx>
      22             : #include <svx/fmview.hxx>
      23             : #include <svx/svditer.hxx>
      24             : #include <svx/svdpage.hxx>
      25             : #include <svx/svxids.hrc>
      26             : #include <svx/unoshape.hxx>
      27             : 
      28             : #include <officecfg/Office/Common.hxx>
      29             : #include <svl/numuno.hxx>
      30             : #include <svl/smplhint.hxx>
      31             : #include <unotools/moduleoptions.hxx>
      32             : #include <sfx2/printer.hxx>
      33             : #include <sfx2/bindings.hxx>
      34             : #include <vcl/pdfextoutdevdata.hxx>
      35             : #include <vcl/waitobj.hxx>
      36             : #include <unotools/charclass.hxx>
      37             : #include <tools/multisel.hxx>
      38             : #include <tools/resary.hxx>
      39             : #include <toolkit/awt/vclxdevice.hxx>
      40             : 
      41             : #include <ctype.h>
      42             : #include <float.h>
      43             : 
      44             : #include <com/sun/star/util/Date.hpp>
      45             : #include <com/sun/star/sheet/XNamedRanges.hpp>
      46             : #include <com/sun/star/sheet/XLabelRanges.hpp>
      47             : #include <com/sun/star/sheet/XSelectedSheetsSupplier.hpp>
      48             : #include <com/sun/star/sheet/XUnnamedDatabaseRanges.hpp>
      49             : #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
      50             : #include <com/sun/star/script/XLibraryContainer.hpp>
      51             : #include <com/sun/star/lang/XInitialization.hpp>
      52             : #include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
      53             : #include <com/sun/star/document/XDocumentEventBroadcaster.hpp>
      54             : #include <com/sun/star/document/IndexedPropertyValues.hpp>
      55             : #include <com/sun/star/script/XInvocation.hpp>
      56             : #include <com/sun/star/script/vba/XVBAEventProcessor.hpp>
      57             : #include <comphelper/processfactory.hxx>
      58             : #include <comphelper/servicehelper.hxx>
      59             : #include <comphelper/string.hxx>
      60             : #include <cppuhelper/supportsservice.hxx>
      61             : 
      62             : #include "docuno.hxx"
      63             : #include "cellsuno.hxx"
      64             : #include "nameuno.hxx"
      65             : #include "datauno.hxx"
      66             : #include "miscuno.hxx"
      67             : #include "notesuno.hxx"
      68             : #include "styleuno.hxx"
      69             : #include "linkuno.hxx"
      70             : #include "servuno.hxx"
      71             : #include "targuno.hxx"
      72             : #include "convuno.hxx"
      73             : #include "optuno.hxx"
      74             : #include "forbiuno.hxx"
      75             : #include "docsh.hxx"
      76             : #include "hints.hxx"
      77             : #include "docfunc.hxx"
      78             : #include "postit.hxx"
      79             : #include "dociter.hxx"
      80             : #include "formulacell.hxx"
      81             : #include "drwlayer.hxx"
      82             : #include "rangeutl.hxx"
      83             : #include "markdata.hxx"
      84             : #include "docoptio.hxx"
      85             : #include "unonames.hxx"
      86             : #include "shapeuno.hxx"
      87             : #include "viewuno.hxx"
      88             : #include "tabvwsh.hxx"
      89             : #include "printfun.hxx"
      90             : #include "pfuncache.hxx"
      91             : #include "scmod.hxx"
      92             : #include "ViewSettingsSequenceDefines.hxx"
      93             : #include "sheetevents.hxx"
      94             : #include "sc.hrc"
      95             : #include "scresid.hxx"
      96             : #include "platforminfo.hxx"
      97             : #include "interpre.hxx"
      98             : #include "formulagroup.hxx"
      99             : #include "gridwin.hxx"
     100             : #include <columnspanset.hxx>
     101             : 
     102             : using namespace com::sun::star;
     103             : 
     104             : // #i111553# provides the name of the VBA constant for this document type (e.g. 'ThisExcelDoc' for Calc)
     105             : #define SC_UNO_VBAGLOBNAME "VBAGlobalConstantName"
     106             : 
     107             : //  alles ohne Which-ID, Map nur fuer PropertySetInfo
     108             : 
     109             : //! umbenennen, sind nicht mehr nur Options
     110        2248 : static const SfxItemPropertyMapEntry* lcl_GetDocOptPropertyMap()
     111             : {
     112             :     static const SfxItemPropertyMapEntry aDocOptPropertyMap_Impl[] =
     113             :     {
     114          74 :         {OUString(SC_UNO_APPLYFMDES),              0, getBooleanCppuType(),                                             0, 0},
     115          74 :         {OUString(SC_UNO_AREALINKS),               0, cppu::UnoType<sheet::XAreaLinks>::get(),               0, 0},
     116          74 :         {OUString(SC_UNO_AUTOCONTFOC),             0, getBooleanCppuType(),                                             0, 0},
     117          74 :         {OUString(SC_UNO_BASICLIBRARIES),          0, cppu::UnoType<script::XLibraryContainer>::get(),     beans::PropertyAttribute::READONLY, 0},
     118          74 :         {OUString(SC_UNO_DIALOGLIBRARIES),         0, cppu::UnoType<script::XLibraryContainer>::get(),     beans::PropertyAttribute::READONLY, 0},
     119          74 :         {OUString(SC_UNO_VBAGLOBNAME),             0, cppu::UnoType<OUString>::get(),                  beans::PropertyAttribute::READONLY, 0},
     120          74 :         {OUString(SC_UNO_CALCASSHOWN),             PROP_UNO_CALCASSHOWN, getBooleanCppuType(),                          0, 0},
     121          74 :         {OUString(SC_UNONAME_CLOCAL),              0, cppu::UnoType<lang::Locale>::get(),                                    0, 0},
     122          74 :         {OUString(SC_UNO_CJK_CLOCAL),              0, cppu::UnoType<lang::Locale>::get(),                                    0, 0},
     123          74 :         {OUString(SC_UNO_CTL_CLOCAL),              0, cppu::UnoType<lang::Locale>::get(),                                    0, 0},
     124          74 :         {OUString(SC_UNO_COLLABELRNG),             0, cppu::UnoType<sheet::XLabelRanges>::get(),             0, 0},
     125          74 :         {OUString(SC_UNO_DDELINKS),                0, cppu::UnoType<container::XNameAccess>::get(),          0, 0},
     126          74 :         {OUString(SC_UNO_DEFTABSTOP),              PROP_UNO_DEFTABSTOP, cppu::UnoType<sal_Int16>::get(),                     0, 0},
     127          74 :         {OUString(SC_UNO_EXTERNALDOCLINKS),        0, cppu::UnoType<sheet::XExternalDocLinks>::get(),        0, 0},
     128          74 :         {OUString(SC_UNO_FORBIDDEN),               0, cppu::UnoType<i18n::XForbiddenCharacters>::get(),      beans::PropertyAttribute::READONLY, 0},
     129          74 :         {OUString(SC_UNO_HASDRAWPAGES),            0, getBooleanCppuType(),                                             beans::PropertyAttribute::READONLY, 0},
     130          74 :         {OUString(SC_UNO_IGNORECASE),              PROP_UNO_IGNORECASE, getBooleanCppuType(),                           0, 0},
     131          74 :         {OUString(SC_UNO_ITERENABLED),             PROP_UNO_ITERENABLED, getBooleanCppuType(),                          0, 0},
     132          74 :         {OUString(SC_UNO_ITERCOUNT),               PROP_UNO_ITERCOUNT, cppu::UnoType<sal_Int32>::get(),                      0, 0},
     133          74 :         {OUString(SC_UNO_ITEREPSILON),             PROP_UNO_ITEREPSILON, cppu::UnoType<double>::get(),                       0, 0},
     134          74 :         {OUString(SC_UNO_LOOKUPLABELS),            PROP_UNO_LOOKUPLABELS, getBooleanCppuType(),                         0, 0},
     135          74 :         {OUString(SC_UNO_MATCHWHOLE),              PROP_UNO_MATCHWHOLE, getBooleanCppuType(),                           0, 0},
     136          74 :         {OUString(SC_UNO_NAMEDRANGES),             0, cppu::UnoType<sheet::XNamedRanges>::get(),             0, 0},
     137          74 :         {OUString(SC_UNO_DATABASERNG),             0, cppu::UnoType<sheet::XDatabaseRanges>::get(),          0, 0},
     138          74 :         {OUString(SC_UNO_NULLDATE),                PROP_UNO_NULLDATE, cppu::UnoType<util::Date>::get(),                      0, 0},
     139          74 :         {OUString(SC_UNO_ROWLABELRNG),             0, cppu::UnoType<sheet::XLabelRanges>::get(),             0, 0},
     140          74 :         {OUString(SC_UNO_SHEETLINKS),              0, cppu::UnoType<container::XNameAccess>::get(),          0, 0},
     141          74 :         {OUString(SC_UNO_SPELLONLINE),             PROP_UNO_SPELLONLINE, getBooleanCppuType(),                          0, 0},
     142          74 :         {OUString(SC_UNO_STANDARDDEC),             PROP_UNO_STANDARDDEC, cppu::UnoType<sal_Int16>::get(),                    0, 0},
     143          74 :         {OUString(SC_UNO_REGEXENABLED),            PROP_UNO_REGEXENABLED, getBooleanCppuType(),                         0, 0},
     144          74 :         {OUString(SC_UNO_RUNTIMEUID),              0, cppu::UnoType<OUString>::get(),                  beans::PropertyAttribute::READONLY, 0},
     145          74 :         {OUString(SC_UNO_HASVALIDSIGNATURES),      0, getBooleanCppuType(),                                             beans::PropertyAttribute::READONLY, 0},
     146          74 :         {OUString(SC_UNO_ISLOADED),                0, getBooleanCppuType(),                                             0, 0},
     147          74 :         {OUString(SC_UNO_ISUNDOENABLED),           0, getBooleanCppuType(),                                             0, 0},
     148          74 :         {OUString(SC_UNO_ISADJUSTHEIGHTENABLED),   0, getBooleanCppuType(),                                             0, 0},
     149          74 :         {OUString(SC_UNO_ISEXECUTELINKENABLED),    0, getBooleanCppuType(),                                             0, 0},
     150          74 :         {OUString(SC_UNO_ISCHANGEREADONLYENABLED), 0, getBooleanCppuType(),                                             0, 0},
     151          74 :         {OUString(SC_UNO_REFERENCEDEVICE),         0, cppu::UnoType<awt::XDevice>::get(),                    beans::PropertyAttribute::READONLY, 0},
     152          74 :         {OUString("BuildId"),                      0, ::cppu::UnoType<OUString>::get(),                0, 0},
     153          74 :         {OUString(SC_UNO_CODENAME),                0, cppu::UnoType<OUString>::get(),                  0, 0},
     154          74 :         {OUString(SC_UNO_INTEROPGRABBAG),          0, ::getCppuType((uno::Sequence< beans::PropertyValue >*)0), 0, 0},
     155             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     156        5356 :     };
     157        2248 :     return aDocOptPropertyMap_Impl;
     158             : }
     159             : 
     160             : //! StandardDecimals als Property und vom NumberFormatter ????????
     161             : 
     162          48 : static const SfxItemPropertyMapEntry* lcl_GetColumnsPropertyMap()
     163             : {
     164             :     static const SfxItemPropertyMapEntry aColumnsPropertyMap_Impl[] =
     165             :     {
     166          48 :         {OUString(SC_UNONAME_MANPAGE),  0,  getBooleanCppuType(),          0, 0 },
     167          48 :         {OUString(SC_UNONAME_NEWPAGE),  0,  getBooleanCppuType(),          0, 0 },
     168          48 :         {OUString(SC_UNONAME_CELLVIS),  0,  getBooleanCppuType(),          0, 0 },
     169          48 :         {OUString(SC_UNONAME_OWIDTH),   0,  getBooleanCppuType(),          0, 0 },
     170          48 :         {OUString(SC_UNONAME_CELLWID),  0,  cppu::UnoType<sal_Int32>::get(),    0, 0 },
     171             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     172         336 :     };
     173          48 :     return aColumnsPropertyMap_Impl;
     174             : }
     175             : 
     176          48 : static const SfxItemPropertyMapEntry* lcl_GetRowsPropertyMap()
     177             : {
     178             :     static const SfxItemPropertyMapEntry aRowsPropertyMap_Impl[] =
     179             :     {
     180          48 :         {OUString(SC_UNONAME_CELLHGT),  0,  cppu::UnoType<sal_Int32>::get(),    0, 0 },
     181          48 :         {OUString(SC_UNONAME_CELLFILT), 0,  getBooleanCppuType(),          0, 0 },
     182          48 :         {OUString(SC_UNONAME_OHEIGHT),  0,  getBooleanCppuType(),          0, 0 },
     183          48 :         {OUString(SC_UNONAME_MANPAGE),  0,  getBooleanCppuType(),          0, 0 },
     184          48 :         {OUString(SC_UNONAME_NEWPAGE),  0,  getBooleanCppuType(),          0, 0 },
     185          48 :         {OUString(SC_UNONAME_CELLVIS),  0,  getBooleanCppuType(),          0, 0 },
     186          48 :         {OUString(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, ::cppu::UnoType<sal_Int32>::get(), 0, MID_BACK_COLOR },
     187          48 :         {OUString(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, ::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT },
     188             :         // not sorted, not used with SfxItemPropertyMapEntry::GetByName
     189             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     190         480 :     };
     191          48 :     return aRowsPropertyMap_Impl;
     192             : }
     193             : 
     194             : using sc::HMMToTwips;
     195             : using sc::TwipsToHMM;
     196             : 
     197             : #define SCMODELOBJ_SERVICE          "com.sun.star.sheet.SpreadsheetDocument"
     198             : #define SCDOCSETTINGS_SERVICE       "com.sun.star.sheet.SpreadsheetDocumentSettings"
     199             : #define SCDOC_SERVICE               "com.sun.star.document.OfficeDocument"
     200             : 
     201           0 : SC_SIMPLE_SERVICE_INFO( ScAnnotationsObj, "ScAnnotationsObj", "com.sun.star.sheet.CellAnnotations" )
     202           0 : SC_SIMPLE_SERVICE_INFO( ScDrawPagesObj, "ScDrawPagesObj", "com.sun.star.drawing.DrawPages" )
     203           0 : SC_SIMPLE_SERVICE_INFO( ScScenariosObj, "ScScenariosObj", "com.sun.star.sheet.Scenarios" )
     204           0 : SC_SIMPLE_SERVICE_INFO( ScSpreadsheetSettingsObj, "ScSpreadsheetSettingsObj", "com.sun.star.sheet.SpreadsheetDocumentSettings" )
     205           0 : SC_SIMPLE_SERVICE_INFO( ScTableColumnsObj, "ScTableColumnsObj", "com.sun.star.table.TableColumns" )
     206           0 : SC_SIMPLE_SERVICE_INFO( ScTableRowsObj, "ScTableRowsObj", "com.sun.star.table.TableRows" )
     207           0 : SC_SIMPLE_SERVICE_INFO( ScTableSheetsObj, "ScTableSheetsObj", "com.sun.star.sheet.Spreadsheets" )
     208             : 
     209           0 : class ScPrintUIOptions : public vcl::PrinterOptionsHelper
     210             : {
     211             : public:
     212             :     ScPrintUIOptions();
     213             :     void SetDefaults();
     214             : };
     215             : 
     216           0 : ScPrintUIOptions::ScPrintUIOptions()
     217             : {
     218           0 :     const ScPrintOptions& rPrintOpt = SC_MOD()->GetPrintOptions();
     219           0 :     sal_Int32 nContent = rPrintOpt.GetAllSheets() ? 0 : 1;
     220           0 :     bool bSuppress = rPrintOpt.GetSkipEmpty();
     221             : 
     222           0 :     ResStringArray aStrings( ScResId( SCSTR_PRINT_OPTIONS ) );
     223             :     OSL_ENSURE( aStrings.Count() >= 10, "resource incomplete" );
     224           0 :     if( aStrings.Count() < 10 ) // bad resource ?
     225           0 :         return;
     226             : 
     227           0 :     sal_Int32 nNumProps= 9, nIdx = 0;
     228             : 
     229           0 :     m_aUIProperties.realloc(nNumProps);
     230             : 
     231             :     // load the writer PrinterOptions into the custom tab
     232           0 :     m_aUIProperties[nIdx].Name = "OptionsUIFile";
     233           0 :     m_aUIProperties[nIdx++].Value <<= OUString("modules/scalc/ui/printeroptions.ui");
     234             : 
     235             :     // create Section for spreadsheet (results in an extra tab page in dialog)
     236           0 :     SvtModuleOptions aOpt;
     237           0 :     OUString aAppGroupname( aStrings.GetString( 9 ) );
     238           0 :     aAppGroupname = aAppGroupname.replaceFirst( "%s", aOpt.GetModuleName( SvtModuleOptions::E_SCALC ) );
     239           0 :     m_aUIProperties[nIdx++].Value = setGroupControlOpt("tabcontrol-page2", aAppGroupname, OUString());
     240             : 
     241             :     // show subgroup for pages
     242           0 :     m_aUIProperties[nIdx++].Value = setSubgroupControlOpt("pages", OUString(aStrings.GetString(0)), OUString());
     243             : 
     244             :     // create a bool option for empty pages
     245           0 :     m_aUIProperties[nIdx++].Value = setBoolControlOpt("suppressemptypages", OUString( aStrings.GetString( 1 ) ),
     246             :                                                   ".HelpID:vcl:PrintDialog:IsSuppressEmptyPages:CheckBox",
     247             :                                                   "IsSuppressEmptyPages",
     248           0 :                                                   bSuppress);
     249             :     // show Subgroup for print content
     250           0 :     vcl::PrinterOptionsHelper::UIControlOptions aPrintRangeOpt;
     251           0 :     aPrintRangeOpt.maGroupHint = "PrintRange";
     252           0 :     m_aUIProperties[nIdx++].Value = setSubgroupControlOpt("printrange", OUString(aStrings.GetString(2)),
     253             :                                                       OUString(),
     254           0 :                                                       aPrintRangeOpt);
     255             : 
     256             :     // create a choice for the content to create
     257           0 :     uno::Sequence< OUString > aChoices( 3 ), aHelpIds( 3 ), aWidgetIds( 3 );
     258           0 :     aChoices[0] = aStrings.GetString( 3 );
     259           0 :     aHelpIds[0] = ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:0";
     260           0 :     aWidgetIds[0] = "printallsheets";
     261           0 :     aChoices[1] = aStrings.GetString( 4 );
     262           0 :     aHelpIds[1] = ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:1";
     263           0 :     aWidgetIds[1] = "printselectedsheets";
     264           0 :     aChoices[2] = aStrings.GetString( 5 );
     265           0 :     aHelpIds[2] = ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:2";
     266           0 :     aWidgetIds[2] = "printselectedcells";
     267           0 :     m_aUIProperties[nIdx++].Value = setChoiceRadiosControlOpt(aWidgetIds, OUString(),
     268             :                                                     aHelpIds, "PrintContent",
     269           0 :                                                     aChoices, nContent );
     270             : 
     271             :     // show Subgroup for print range
     272           0 :     aPrintRangeOpt.mbInternalOnly = true;
     273           0 :     m_aUIProperties[nIdx++].Value = setSubgroupControlOpt("fromwhich", OUString(aStrings.GetString(6)),
     274             :                                                       OUString(),
     275           0 :                                                       aPrintRangeOpt);
     276             : 
     277             :     // create a choice for the range to print
     278           0 :     OUString aPrintRangeName( "PrintRange" );
     279           0 :     aChoices.realloc( 2 );
     280           0 :     aHelpIds.realloc( 2 );
     281           0 :     aWidgetIds.realloc( 2 );
     282           0 :     aChoices[0] = aStrings.GetString( 7 );
     283           0 :     aHelpIds[0] = ".HelpID:vcl:PrintDialog:PrintRange:RadioButton:0";
     284           0 :     aWidgetIds[0] = "printallpages";
     285           0 :     aChoices[1] = aStrings.GetString( 8 );
     286           0 :     aHelpIds[1] = ".HelpID:vcl:PrintDialog:PrintRange:RadioButton:1";
     287           0 :     aWidgetIds[1] = "printpages";
     288           0 :     m_aUIProperties[nIdx++].Value = setChoiceRadiosControlOpt(aWidgetIds, OUString(),
     289             :                                                     aHelpIds,
     290             :                                                     aPrintRangeName,
     291             :                                                     aChoices,
     292           0 :                                                     0 );
     293             : 
     294             :     // create a an Edit dependent on "Pages" selected
     295           0 :     vcl::PrinterOptionsHelper::UIControlOptions aPageRangeOpt( aPrintRangeName, 1, true );
     296           0 :     m_aUIProperties[nIdx++].Value = setEditControlOpt("pagerange", OUString(),
     297             :                                                       ".HelpID:vcl:PrintDialog:PageRange:Edit",
     298           0 :                                                       "PageRange", OUString(), aPageRangeOpt);
     299             : 
     300           0 :     assert(nIdx == nNumProps);
     301             : }
     302             : 
     303           0 : void ScPrintUIOptions::SetDefaults()
     304             : {
     305             :     // re-initialize the default values from print options
     306             : 
     307           0 :     const ScPrintOptions& rPrintOpt = SC_MOD()->GetPrintOptions();
     308           0 :     sal_Int32 nContent = rPrintOpt.GetAllSheets() ? 0 : 1;
     309           0 :     bool bSuppress = rPrintOpt.GetSkipEmpty();
     310             : 
     311           0 :     for (sal_Int32 nUIPos=0; nUIPos<m_aUIProperties.getLength(); ++nUIPos)
     312             :     {
     313           0 :         uno::Sequence<beans::PropertyValue> aUIProp;
     314           0 :         if ( m_aUIProperties[nUIPos].Value >>= aUIProp )
     315             :         {
     316           0 :             for (sal_Int32 nPropPos=0; nPropPos<aUIProp.getLength(); ++nPropPos)
     317             :             {
     318           0 :                 OUString aName = aUIProp[nPropPos].Name;
     319           0 :                 if ( aName == "Property" )
     320             :                 {
     321           0 :                     beans::PropertyValue aPropertyValue;
     322           0 :                     if ( aUIProp[nPropPos].Value >>= aPropertyValue )
     323             :                     {
     324           0 :                         if ( aPropertyValue.Name == "PrintContent" )
     325             :                         {
     326           0 :                             aPropertyValue.Value <<= nContent;
     327           0 :                             aUIProp[nPropPos].Value <<= aPropertyValue;
     328             :                         }
     329           0 :                         else if ( aPropertyValue.Name == "IsSuppressEmptyPages" )
     330             :                         {
     331           0 :                             ScUnoHelpFunctions::SetBoolInAny( aPropertyValue.Value, bSuppress );
     332           0 :                             aUIProp[nPropPos].Value <<= aPropertyValue;
     333             :                         }
     334           0 :                     }
     335             :                 }
     336           0 :             }
     337           0 :             m_aUIProperties[nUIPos].Value <<= aUIProp;
     338             :         }
     339           0 :     }
     340           0 : }
     341             : 
     342        2248 : void ScModelObj::CreateAndSet(ScDocShell* pDocSh)
     343             : {
     344        2248 :     if (pDocSh)
     345        2248 :         pDocSh->SetBaseModel( new ScModelObj(pDocSh) );
     346        2248 : }
     347             : 
     348        2248 : ScModelObj::ScModelObj( ScDocShell* pDocSh ) :
     349             :     SfxBaseModel( pDocSh ),
     350             :     aPropSet( lcl_GetDocOptPropertyMap() ),
     351             :     pDocShell( pDocSh ),
     352             :     pPrintFuncCache( NULL ),
     353             :     pPrinterOptions( NULL ),
     354        2248 :     maChangesListeners( m_aMutex )
     355             : {
     356             :     // pDocShell may be NULL if this is the base of a ScDocOptionsObj
     357        2248 :     if ( pDocShell )
     358             :     {
     359        2248 :         pDocShell->GetDocument().AddUnoObject(*this);      // SfxModel is derived from SfxListener
     360             :     }
     361        2248 : }
     362             : 
     363        6360 : ScModelObj::~ScModelObj()
     364             : {
     365        2120 :     SolarMutexGuard g;
     366             : 
     367        2120 :     if (pDocShell)
     368           0 :         pDocShell->GetDocument().RemoveUnoObject(*this);
     369             : 
     370        2120 :     if (xNumberAgg.is())
     371         518 :         xNumberAgg->setDelegator(uno::Reference<uno::XInterface>());
     372             : 
     373        2120 :     delete pPrintFuncCache;
     374        2120 :     delete pPrinterOptions;
     375        4240 : }
     376             : 
     377       19758 : uno::Reference< uno::XAggregation> ScModelObj::GetFormatter()
     378             : {
     379             :     // pDocShell may be NULL if this is the base of a ScDocOptionsObj
     380       19758 :     if ( !xNumberAgg.is() && pDocShell )
     381             :     {
     382             :         // setDelegator veraendert den RefCount, darum eine Referenz selber halten
     383             :         // (direkt am m_refCount, um sich beim release nicht selbst zu loeschen)
     384         600 :         comphelper::increment( m_refCount );
     385             :         // waehrend des queryInterface braucht man ein Ref auf das
     386             :         // SvNumberFormatsSupplierObj, sonst wird es geloescht.
     387         600 :         uno::Reference<util::XNumberFormatsSupplier> xFormatter(new SvNumberFormatsSupplierObj(pDocShell->GetDocument().GetFormatTable() ));
     388             :         {
     389         600 :             xNumberAgg.set(uno::Reference<uno::XAggregation>( xFormatter, uno::UNO_QUERY ));
     390             :             // extra block to force deletion of the temporary before setDelegator
     391             :         }
     392             : 
     393             :         // beim setDelegator darf die zusaetzliche Ref nicht mehr existieren
     394         600 :         xFormatter = NULL;
     395             : 
     396         600 :         if (xNumberAgg.is())
     397         600 :             xNumberAgg->setDelegator( (cppu::OWeakObject*)this );
     398         600 :         comphelper::decrement( m_refCount );
     399             :     } // if ( !xNumberAgg.is() )
     400       19758 :     return xNumberAgg;
     401             : }
     402             : 
     403        1852 : ScDocument* ScModelObj::GetDocument() const
     404             : {
     405        1852 :     if (pDocShell)
     406        1852 :         return &pDocShell->GetDocument();
     407           0 :     return NULL;
     408             : }
     409             : 
     410         772 : SfxObjectShell* ScModelObj::GetEmbeddedObject() const
     411             : {
     412         772 :     return pDocShell;
     413             : }
     414             : 
     415           2 : void ScModelObj::UpdateAllRowHeights()
     416             : {
     417           2 :     if (pDocShell)
     418           2 :         pDocShell->UpdateAllRowHeights(NULL);
     419           2 : }
     420             : 
     421          60 : void ScModelObj::BeforeXMLLoading()
     422             : {
     423          60 :     if (pDocShell)
     424          60 :         pDocShell->BeforeXMLLoading();
     425          60 : }
     426             : 
     427          60 : void ScModelObj::AfterXMLLoading(bool bRet)
     428             : {
     429          60 :     if (pDocShell)
     430          60 :         pDocShell->AfterXMLLoading(bRet);
     431          60 : }
     432             : 
     433        8732 : ScSheetSaveData* ScModelObj::GetSheetSaveData()
     434             : {
     435        8732 :     if (pDocShell)
     436        8732 :         return pDocShell->GetSheetSaveData();
     437           0 :     return NULL;
     438             : }
     439             : 
     440         342 : void ScModelObj::RepaintRange( const ScRange& rRange )
     441             : {
     442         342 :     if (pDocShell)
     443         342 :         pDocShell->PostPaint( rRange, PAINT_GRID );
     444         342 : }
     445             : 
     446           0 : void ScModelObj::RepaintRange( const ScRangeList& rRange )
     447             : {
     448           0 :     if (pDocShell)
     449           0 :         pDocShell->PostPaint( rRange, PAINT_GRID );
     450           0 : }
     451             : 
     452           0 : void ScModelObj::paintTile( VirtualDevice& rDevice,
     453             :                             int nOutputWidth, int nOutputHeight,
     454             :                             int nTilePosX, int nTilePosY,
     455             :                             long nTileWidth, long nTileHeight )
     456             : {
     457             :     // There seems to be no clear way of getting the grid window for this
     458             :     // particular document, hence we need to hope we get the right window.
     459           0 :     ScViewData* pViewData = ScDocShell::GetViewData();
     460           0 :     ScGridWindow* pGridWindow = pViewData->GetActiveWin();
     461             : 
     462             :     pGridWindow->PaintTile( rDevice, nOutputWidth, nOutputHeight,
     463           0 :                             nTilePosX, nTilePosY, nTileWidth, nTileHeight );
     464           0 : }
     465             : 
     466           0 : void ScModelObj::setPart( int nPart )
     467             : {
     468           0 :     ScViewData* pViewData = ScDocShell::GetViewData();
     469           0 :     pViewData->SetTabNo( nPart );
     470           0 : }
     471             : 
     472           0 : int ScModelObj::getParts()
     473             : {
     474           0 :     ScDocument& rDoc = pDocShell->GetDocument();
     475           0 :     return rDoc.GetTableCount();
     476             : }
     477             : 
     478           0 : int ScModelObj::getPart()
     479             : {
     480           0 :     ScViewData* pViewData = ScDocShell::GetViewData();
     481           0 :     return pViewData->GetTabNo();
     482             : }
     483             : 
     484           0 : Size ScModelObj::getDocumentSize()
     485             : {
     486             :     // TODO: not sure what we want to do here, maybe just return the size for a certain
     487             :     // default minimum number of cells, e.g. 100x100 and more if more cells have
     488             :     // content?
     489           0 :     return Size();
     490             : }
     491             : 
     492      410215 : uno::Any SAL_CALL ScModelObj::queryInterface( const uno::Type& rType )
     493             :                                                 throw(uno::RuntimeException, std::exception)
     494             : {
     495      410215 :     SC_QUERYINTERFACE( sheet::XSpreadsheetDocument )
     496      407985 :     SC_QUERYINTERFACE( document::XActionLockable )
     497      405797 :     SC_QUERYINTERFACE( sheet::XCalculatable )
     498      405635 :     SC_QUERYINTERFACE( util::XProtectable )
     499      405633 :     SC_QUERYINTERFACE( drawing::XDrawPagesSupplier )
     500      405585 :     SC_QUERYINTERFACE( sheet::XGoalSeek )
     501      405578 :     SC_QUERYINTERFACE( sheet::XConsolidatable )
     502      405574 :     SC_QUERYINTERFACE( sheet::XDocumentAuditing )
     503      405571 :     SC_QUERYINTERFACE( style::XStyleFamiliesSupplier )
     504      402410 :     SC_QUERYINTERFACE( view::XRenderable )
     505      402410 :     SC_QUERYINTERFACE( document::XLinkTargetSupplier )
     506      402408 :     SC_QUERYINTERFACE( beans::XPropertySet )
     507      391481 :     SC_QUERYINTERFACE( lang::XMultiServiceFactory )
     508      382359 :     SC_QUERYINTERFACE( lang::XServiceInfo )
     509      379763 :     SC_QUERYINTERFACE( util::XChangesNotifier )
     510      379713 :     SC_QUERYINTERFACE( sheet::opencl::XOpenCLSelection )
     511             : 
     512      379713 :     uno::Any aRet(SfxBaseModel::queryInterface( rType ));
     513      759426 :     if ( !aRet.hasValue()
     514       55010 :         && rType != cppu::UnoType<com::sun::star::document::XDocumentEventBroadcaster>::get()
     515       55010 :         && rType != cppu::UnoType<com::sun::star::frame::XController>::get()
     516       41638 :         && rType != cppu::UnoType<com::sun::star::frame::XFrame>::get()
     517       28266 :         && rType != cppu::UnoType<com::sun::star::script::XInvocation>::get()
     518       27032 :         && rType != cppu::UnoType<com::sun::star::beans::XFastPropertySet>::get()
     519      406683 :         && rType != cppu::UnoType<com::sun::star::awt::XWindow>::get())
     520             :     {
     521       16982 :         GetFormatter();
     522       16982 :         if ( xNumberAgg.is() )
     523       16982 :             aRet = xNumberAgg->queryAggregation( rType );
     524             :     }
     525             : 
     526      379713 :     return aRet;
     527             : }
     528             : 
     529     1838073 : void SAL_CALL ScModelObj::acquire() throw()
     530             : {
     531     1838073 :     SfxBaseModel::acquire();
     532     1838073 : }
     533             : 
     534     1837689 : void SAL_CALL ScModelObj::release() throw()
     535             : {
     536     1837689 :     SfxBaseModel::release();
     537     1837689 : }
     538             : 
     539        2448 : uno::Sequence<uno::Type> SAL_CALL ScModelObj::getTypes() throw(uno::RuntimeException, std::exception)
     540             : {
     541        2448 :     static uno::Sequence<uno::Type> aTypes;
     542        2448 :     if ( aTypes.getLength() == 0 )
     543             :     {
     544          62 :         uno::Sequence<uno::Type> aParentTypes(SfxBaseModel::getTypes());
     545          62 :         long nParentLen = aParentTypes.getLength();
     546          62 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
     547             : 
     548         124 :         uno::Sequence<uno::Type> aAggTypes;
     549          62 :         if ( GetFormatter().is() )
     550             :         {
     551          62 :             const uno::Type& rProvType = cppu::UnoType<lang::XTypeProvider>::get();
     552          62 :             uno::Any aNumProv(xNumberAgg->queryAggregation(rProvType));
     553          62 :             if(aNumProv.getValueType() == rProvType)
     554             :             {
     555             :                 uno::Reference<lang::XTypeProvider> xNumProv(
     556          62 :                     *(uno::Reference<lang::XTypeProvider>*)aNumProv.getValue());
     557          62 :                 aAggTypes = xNumProv->getTypes();
     558          62 :             }
     559             :         }
     560          62 :         long nAggLen = aAggTypes.getLength();
     561          62 :         const uno::Type* pAggPtr = aAggTypes.getConstArray();
     562             : 
     563          62 :         const long nThisLen = 16;
     564          62 :         aTypes.realloc( nParentLen + nAggLen + nThisLen );
     565          62 :         uno::Type* pPtr = aTypes.getArray();
     566          62 :         pPtr[nParentLen + 0] = cppu::UnoType<sheet::XSpreadsheetDocument>::get();
     567          62 :         pPtr[nParentLen + 1] = cppu::UnoType<document::XActionLockable>::get();
     568          62 :         pPtr[nParentLen + 2] = cppu::UnoType<sheet::XCalculatable>::get();
     569          62 :         pPtr[nParentLen + 3] = cppu::UnoType<util::XProtectable>::get();
     570          62 :         pPtr[nParentLen + 4] = cppu::UnoType<drawing::XDrawPagesSupplier>::get();
     571          62 :         pPtr[nParentLen + 5] = cppu::UnoType<sheet::XGoalSeek>::get();
     572          62 :         pPtr[nParentLen + 6] = cppu::UnoType<sheet::XConsolidatable>::get();
     573          62 :         pPtr[nParentLen + 7] = cppu::UnoType<sheet::XDocumentAuditing>::get();
     574          62 :         pPtr[nParentLen + 8] = cppu::UnoType<style::XStyleFamiliesSupplier>::get();
     575          62 :         pPtr[nParentLen + 9] = cppu::UnoType<view::XRenderable>::get();
     576          62 :         pPtr[nParentLen +10] = cppu::UnoType<document::XLinkTargetSupplier>::get();
     577          62 :         pPtr[nParentLen +11] = cppu::UnoType<beans::XPropertySet>::get();
     578          62 :         pPtr[nParentLen +12] = cppu::UnoType<lang::XMultiServiceFactory>::get();
     579          62 :         pPtr[nParentLen +13] = cppu::UnoType<lang::XServiceInfo>::get();
     580          62 :         pPtr[nParentLen +14] = cppu::UnoType<util::XChangesNotifier>::get();
     581          62 :         pPtr[nParentLen +15] = cppu::UnoType<sheet::opencl::XOpenCLSelection>::get();
     582             : 
     583             :         long i;
     584        2170 :         for (i=0; i<nParentLen; i++)
     585        2108 :             pPtr[i] = pParentPtr[i];                    // parent types first
     586             : 
     587         372 :         for (i=0; i<nAggLen; i++)
     588         372 :             pPtr[nParentLen+nThisLen+i] = pAggPtr[i];   // aggregated types last
     589             :     }
     590        2448 :     return aTypes;
     591             : }
     592             : 
     593           0 : uno::Sequence<sal_Int8> SAL_CALL ScModelObj::getImplementationId()
     594             :                                                     throw(uno::RuntimeException, std::exception)
     595             : {
     596           0 :     return css::uno::Sequence<sal_Int8>();
     597             : }
     598             : 
     599      159974 : void ScModelObj::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
     600             : {
     601             :     //  Not interested in reference update hints here
     602             : 
     603      159974 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
     604      159974 :     if ( pSimpleHint )
     605             :     {
     606      105790 :         sal_uLong nId = pSimpleHint->GetId();
     607      105790 :         if ( nId == SFX_HINT_DYING )
     608             :         {
     609        2202 :             pDocShell = NULL;       // has become invalid
     610        2202 :             if (xNumberAgg.is())
     611             :             {
     612             :                 SvNumberFormatsSupplierObj* pNumFmt =
     613             :                     SvNumberFormatsSupplierObj::getImplementation(
     614         600 :                         uno::Reference<util::XNumberFormatsSupplier>(xNumberAgg, uno::UNO_QUERY) );
     615         600 :                 if ( pNumFmt )
     616         600 :                     pNumFmt->SetNumberFormatter( NULL );
     617             :             }
     618             : 
     619        2202 :             DELETEZ( pPrintFuncCache );     // must be deleted because it has a pointer to the DocShell
     620             :         }
     621      103588 :         else if ( nId == SFX_HINT_DATACHANGED )
     622             :         {
     623             :             //  cached data for rendering become invalid when contents change
     624             :             //  (if a broadcast is added to SetDrawModified, is has to be tested here, too)
     625             : 
     626       63122 :             DELETEZ( pPrintFuncCache );
     627             : 
     628             :             // handle "OnCalculate" sheet events (search also for VBA event handlers)
     629       63122 :             if ( pDocShell )
     630             :             {
     631       63122 :                 ScDocument& rDoc = pDocShell->GetDocument();
     632       63122 :                 if ( rDoc.GetVbaEventProcessor().is() )
     633             :                 {
     634             :                     // If the VBA event processor is set, HasAnyCalcNotification is much faster than HasAnySheetEventScript
     635        8554 :                     if ( rDoc.HasAnyCalcNotification() && rDoc.HasAnySheetEventScript( SC_SHEETEVENT_CALCULATE, true ) )
     636           0 :                         HandleCalculateEvents();
     637             :                 }
     638             :                 else
     639             :                 {
     640       54568 :                     if ( rDoc.HasAnySheetEventScript( SC_SHEETEVENT_CALCULATE ) )
     641           0 :                         HandleCalculateEvents();
     642             :                 }
     643             :             }
     644             :         }
     645             :     }
     646       54184 :     else if ( dynamic_cast<const ScPointerChangedHint*>(&rHint) )
     647             :     {
     648           0 :         sal_uInt16 nFlags = static_cast<const ScPointerChangedHint&>(rHint).GetFlags();
     649           0 :         if (nFlags & SC_POINTERCHANGED_NUMFMT)
     650             :         {
     651             :             //  NumberFormatter-Pointer am Uno-Objekt neu setzen
     652             : 
     653           0 :             if (GetFormatter().is())
     654             :             {
     655             :                 SvNumberFormatsSupplierObj* pNumFmt =
     656             :                     SvNumberFormatsSupplierObj::getImplementation(
     657           0 :                         uno::Reference<util::XNumberFormatsSupplier>(xNumberAgg, uno::UNO_QUERY) );
     658           0 :                 if ( pNumFmt && pDocShell )
     659           0 :                     pNumFmt->SetNumberFormatter( pDocShell->GetDocument().GetFormatTable() );
     660             :             }
     661             :         }
     662             :     }
     663             : 
     664             :     // always call parent - SfxBaseModel might need to handle the same hints again
     665      159974 :     SfxBaseModel::Notify( rBC, rHint );     // SfxBaseModel is derived from SfxListener
     666      159974 : }
     667             : 
     668             : // XSpreadsheetDocument
     669             : 
     670        2724 : uno::Reference<sheet::XSpreadsheets> SAL_CALL ScModelObj::getSheets() throw(uno::RuntimeException, std::exception)
     671             : {
     672        2724 :     SolarMutexGuard aGuard;
     673        2724 :     if (pDocShell)
     674        2724 :         return new ScTableSheetsObj(pDocShell);
     675           0 :     return NULL;
     676             : }
     677             : 
     678             : // XStyleFamiliesSupplier
     679             : 
     680        3166 : uno::Reference<container::XNameAccess> SAL_CALL ScModelObj::getStyleFamilies()
     681             :                                                 throw(uno::RuntimeException, std::exception)
     682             : {
     683        3166 :     SolarMutexGuard aGuard;
     684        3166 :     if (pDocShell)
     685        3166 :         return new ScStyleFamiliesObj(pDocShell);
     686           0 :     return NULL;
     687             : }
     688             : 
     689             : // XRenderable
     690             : 
     691           0 : static OutputDevice* lcl_GetRenderDevice( const uno::Sequence<beans::PropertyValue>& rOptions )
     692             : {
     693           0 :     OutputDevice* pRet = NULL;
     694           0 :     const beans::PropertyValue* pPropArray = rOptions.getConstArray();
     695           0 :     long nPropCount = rOptions.getLength();
     696           0 :     for (long i = 0; i < nPropCount; i++)
     697             :     {
     698           0 :         const beans::PropertyValue& rProp = pPropArray[i];
     699           0 :         OUString aPropName(rProp.Name);
     700             : 
     701           0 :         if (aPropName.equalsAscii( SC_UNONAME_RENDERDEV ))
     702             :         {
     703           0 :             uno::Reference<awt::XDevice> xRenderDevice(rProp.Value, uno::UNO_QUERY);
     704           0 :             if ( xRenderDevice.is() )
     705             :             {
     706           0 :                 VCLXDevice* pDevice = VCLXDevice::GetImplementation( xRenderDevice );
     707           0 :                 if ( pDevice )
     708             :                 {
     709           0 :                     pRet = pDevice->GetOutputDevice();
     710           0 :                     pRet->SetDigitLanguage( SC_MOD()->GetOptDigitLanguage() );
     711             :                 }
     712           0 :             }
     713             :         }
     714           0 :     }
     715           0 :     return pRet;
     716             : }
     717             : 
     718           0 : static bool lcl_ParseTarget( const OUString& rTarget, ScRange& rTargetRange, Rectangle& rTargetRect,
     719             :                         bool& rIsSheet, ScDocument* pDoc, SCTAB nSourceTab )
     720             : {
     721             :     // test in same order as in SID_CURRENTCELL execute
     722             : 
     723           0 :     ScAddress aAddress;
     724           0 :     ScRangeUtil aRangeUtil;
     725             :     SCTAB nNameTab;
     726           0 :     sal_Int32 nNumeric = 0;
     727             : 
     728           0 :     bool bRangeValid = false;
     729           0 :     bool bRectValid = false;
     730             : 
     731           0 :     if ( rTargetRange.Parse( rTarget, pDoc ) & SCA_VALID )
     732             :     {
     733           0 :         bRangeValid = true;             // range reference
     734             :     }
     735           0 :     else if ( aAddress.Parse( rTarget, pDoc ) & SCA_VALID )
     736             :     {
     737           0 :         rTargetRange = aAddress;
     738           0 :         bRangeValid = true;             // cell reference
     739             :     }
     740           0 :     else if ( aRangeUtil.MakeRangeFromName( rTarget, pDoc, nSourceTab, rTargetRange, RUTL_NAMES ) ||
     741           0 :               aRangeUtil.MakeRangeFromName( rTarget, pDoc, nSourceTab, rTargetRange, RUTL_DBASE ) )
     742             :     {
     743           0 :         bRangeValid = true;             // named range or database range
     744             :     }
     745           0 :     else if ( comphelper::string::isdigitAsciiString(rTarget) &&
     746           0 :               ( nNumeric = rTarget.toInt32() ) > 0 && nNumeric <= MAXROW+1 )
     747             :     {
     748             :         // row number is always mapped to cell A(row) on the same sheet
     749           0 :         rTargetRange = ScAddress( 0, (SCROW)(nNumeric-1), nSourceTab );     // target row number is 1-based
     750           0 :         bRangeValid = true;             // row number
     751             :     }
     752           0 :     else if ( pDoc->GetTable( rTarget, nNameTab ) )
     753             :     {
     754           0 :         rTargetRange = ScAddress(0,0,nNameTab);
     755           0 :         bRangeValid = true;             // sheet name
     756           0 :         rIsSheet = true;                // needs special handling (first page of the sheet)
     757             :     }
     758             :     else
     759             :     {
     760             :         // look for named drawing object
     761             : 
     762           0 :         ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
     763           0 :         if ( pDrawLayer )
     764             :         {
     765           0 :             SCTAB nTabCount = pDoc->GetTableCount();
     766           0 :             for (SCTAB i=0; i<nTabCount && !bRangeValid; i++)
     767             :             {
     768           0 :                 SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(i));
     769             :                 OSL_ENSURE(pPage,"Page ?");
     770           0 :                 if (pPage)
     771             :                 {
     772           0 :                     SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS );
     773           0 :                     SdrObject* pObject = aIter.Next();
     774           0 :                     while (pObject && !bRangeValid)
     775             :                     {
     776           0 :                         if ( ScDrawLayer::GetVisibleName( pObject ) == rTarget )
     777             :                         {
     778           0 :                             rTargetRect = pObject->GetLogicRect();              // 1/100th mm
     779           0 :                             rTargetRange = pDoc->GetRange( i, rTargetRect );    // underlying cells
     780           0 :                             bRangeValid = bRectValid = true;                    // rectangle is valid
     781             :                         }
     782           0 :                         pObject = aIter.Next();
     783           0 :                     }
     784             :                 }
     785             :             }
     786             :         }
     787             :     }
     788           0 :     if ( bRangeValid && !bRectValid )
     789             :     {
     790             :         //  get rectangle for cell range
     791           0 :         rTargetRect = pDoc->GetMMRect( rTargetRange.aStart.Col(), rTargetRange.aStart.Row(),
     792           0 :                                        rTargetRange.aEnd.Col(),   rTargetRange.aEnd.Row(),
     793           0 :                                        rTargetRange.aStart.Tab() );
     794             :     }
     795             : 
     796           0 :     return bRangeValid;
     797             : }
     798             : 
     799           0 : bool ScModelObj::FillRenderMarkData( const uno::Any& aSelection,
     800             :                                      const uno::Sequence< beans::PropertyValue >& rOptions,
     801             :                                      ScMarkData& rMark,
     802             :                                      ScPrintSelectionStatus& rStatus, OUString& rPagesStr ) const
     803             : {
     804             :     OSL_ENSURE( !rMark.IsMarked() && !rMark.IsMultiMarked(), "FillRenderMarkData: MarkData must be empty" );
     805             :     OSL_ENSURE( pDocShell, "FillRenderMarkData: DocShell must be set" );
     806             : 
     807           0 :     bool bDone = false;
     808             : 
     809           0 :     uno::Reference<frame::XController> xView;
     810             : 
     811             :     // defaults when no options are passed: all sheets, include empty pages
     812           0 :     bool bSelectedSheetsOnly = false;
     813           0 :     bool bSuppressEmptyPages = true;
     814             : 
     815           0 :     bool bHasPrintContent = false;
     816           0 :     sal_Int32 nPrintContent = 0;        // all sheets / selected sheets / selected cells
     817           0 :     sal_Int32 nPrintRange = 0;          // all pages / pages
     818           0 :     OUString aPageRange;           // "pages" edit value
     819             : 
     820           0 :     for( sal_Int32 i = 0, nLen = rOptions.getLength(); i < nLen; i++ )
     821             :     {
     822           0 :         if ( rOptions[i].Name == "IsOnlySelectedSheets" )
     823             :         {
     824           0 :             rOptions[i].Value >>= bSelectedSheetsOnly;
     825             :         }
     826           0 :         else if ( rOptions[i].Name == "IsSuppressEmptyPages" )
     827             :         {
     828           0 :             rOptions[i].Value >>= bSuppressEmptyPages;
     829             :         }
     830           0 :         else if ( rOptions[i].Name == "PageRange" )
     831             :         {
     832           0 :             rOptions[i].Value >>= aPageRange;
     833             :         }
     834           0 :         else if ( rOptions[i].Name == "PrintRange" )
     835             :         {
     836           0 :             rOptions[i].Value >>= nPrintRange;
     837             :         }
     838           0 :         else if ( rOptions[i].Name == "PrintContent" )
     839             :         {
     840           0 :             bHasPrintContent = true;
     841           0 :             rOptions[i].Value >>= nPrintContent;
     842             :         }
     843           0 :         else if ( rOptions[i].Name == "View" )
     844             :         {
     845           0 :             rOptions[i].Value >>= xView;
     846             :         }
     847             :     }
     848             : 
     849             :     // "Print Content" selection wins over "Selected Sheets" option
     850           0 :     if ( bHasPrintContent )
     851           0 :         bSelectedSheetsOnly = ( nPrintContent != 0 );
     852             : 
     853           0 :     uno::Reference<uno::XInterface> xInterface(aSelection, uno::UNO_QUERY);
     854           0 :     if ( xInterface.is() )
     855             :     {
     856           0 :         ScCellRangesBase* pSelObj = ScCellRangesBase::getImplementation( xInterface );
     857           0 :         uno::Reference< drawing::XShapes > xShapes( xInterface, uno::UNO_QUERY );
     858           0 :         if ( pSelObj && pSelObj->GetDocShell() == pDocShell )
     859             :         {
     860           0 :             bool bSheet = ( ScTableSheetObj::getImplementation( xInterface ) != NULL );
     861           0 :             bool bCursor = pSelObj->IsCursorOnly();
     862           0 :             const ScRangeList& rRanges = pSelObj->GetRangeList();
     863             : 
     864           0 :             rMark.MarkFromRangeList( rRanges, false );
     865           0 :             rMark.MarkToSimple();
     866             : 
     867           0 :             if ( rMark.IsMultiMarked() )
     868             :             {
     869             :                 // #i115266# copy behavior of old printing:
     870             :                 // treat multiple selection like a single selection with the enclosing range
     871           0 :                 ScRange aMultiMarkArea;
     872           0 :                 rMark.GetMultiMarkArea( aMultiMarkArea );
     873           0 :                 rMark.ResetMark();
     874           0 :                 rMark.SetMarkArea( aMultiMarkArea );
     875             :             }
     876             : 
     877           0 :             if ( rMark.IsMarked() && !rMark.IsMultiMarked() )
     878             :             {
     879             :                 // a sheet object is treated like an empty selection: print the used area of the sheet
     880             : 
     881           0 :                 if ( bCursor || bSheet )                // nothing selected -> use whole tables
     882             :                 {
     883           0 :                     rMark.ResetMark();      // doesn't change table selection
     884           0 :                     rStatus.SetMode( SC_PRINTSEL_CURSOR );
     885             :                 }
     886             :                 else
     887           0 :                     rStatus.SetMode( SC_PRINTSEL_RANGE );
     888             : 
     889           0 :                 rStatus.SetRanges( rRanges );
     890           0 :                 bDone = true;
     891             :             }
     892             :             // multi selection isn't supported
     893             :         }
     894           0 :         else if( xShapes.is() )
     895             :         {
     896             :             //print a selected ole object
     897           0 :             uno::Reference< container::XIndexAccess > xIndexAccess( xShapes, uno::UNO_QUERY );
     898           0 :             if( xIndexAccess.is() )
     899             :             {
     900             :                 // multi selection isn't supported yet
     901           0 :                 uno::Reference< drawing::XShape > xShape( xIndexAccess->getByIndex(0), uno::UNO_QUERY );
     902           0 :                 SvxShape* pShape = SvxShape::getImplementation( xShape );
     903           0 :                 if( pShape )
     904             :                 {
     905           0 :                     SdrObject *pSdrObj = pShape->GetSdrObject();
     906           0 :                     if( pDocShell )
     907             :                     {
     908           0 :                         ScDocument& rDoc = pDocShell->GetDocument();
     909           0 :                         if( pSdrObj )
     910             :                         {
     911           0 :                             Rectangle aObjRect = pSdrObj->GetCurrentBoundRect();
     912           0 :                             SCTAB nCurrentTab = ScDocShell::GetCurTab();
     913           0 :                             ScRange aRange = rDoc.GetRange( nCurrentTab, aObjRect );
     914           0 :                             rMark.SetMarkArea( aRange );
     915             : 
     916           0 :                             if( rMark.IsMarked() && !rMark.IsMultiMarked() )
     917             :                             {
     918           0 :                                 rStatus.SetMode( SC_PRINTSEL_RANGE_EXCLUSIVELY_OLE_AND_DRAW_OBJECTS );
     919           0 :                                 bDone = true;
     920             :                             }
     921             :                         }
     922             :                     }
     923           0 :                 }
     924           0 :             }
     925             :         }
     926           0 :         else if ( ScModelObj::getImplementation( xInterface ) == this )
     927             :         {
     928             :             //  render the whole document
     929             :             //  -> no selection, all sheets
     930             : 
     931           0 :             SCTAB nTabCount = pDocShell->GetDocument().GetTableCount();
     932           0 :             for (SCTAB nTab = 0; nTab < nTabCount; nTab++)
     933           0 :                 rMark.SelectTable( nTab, true );
     934           0 :             rStatus.SetMode( SC_PRINTSEL_DOCUMENT );
     935           0 :             bDone = true;
     936           0 :         }
     937             :         // other selection types aren't supported
     938             :     }
     939             : 
     940             :     // restrict to selected sheets if a view is available
     941           0 :     uno::Reference<sheet::XSelectedSheetsSupplier> xSelectedSheets(xView, uno::UNO_QUERY);
     942           0 :     if (bSelectedSheetsOnly && xSelectedSheets.is())
     943             :     {
     944           0 :         uno::Sequence<sal_Int32> aSelected = xSelectedSheets->getSelectedSheets();
     945           0 :         ScMarkData::MarkedTabsType aSelectedTabs;
     946           0 :         SCTAB nMaxTab = pDocShell->GetDocument().GetTableCount() -1;
     947           0 :         for (sal_Int32 i = 0, n = aSelected.getLength(); i < n; ++i)
     948             :         {
     949           0 :             SCTAB nSelected = static_cast<SCTAB>(aSelected[i]);
     950           0 :             if (ValidTab(nSelected, nMaxTab))
     951           0 :                 aSelectedTabs.insert(static_cast<SCTAB>(aSelected[i]));
     952             :         }
     953           0 :         rMark.SetSelectedTabs(aSelectedTabs);
     954             :     }
     955             : 
     956           0 :     ScPrintOptions aNewOptions;
     957           0 :     aNewOptions.SetSkipEmpty( bSuppressEmptyPages );
     958           0 :     aNewOptions.SetAllSheets( !bSelectedSheetsOnly );
     959           0 :     rStatus.SetOptions( aNewOptions );
     960             : 
     961             :     // "PrintRange" enables (1) or disables (0) the "PageRange" edit
     962           0 :     if ( nPrintRange == 1 )
     963           0 :         rPagesStr = aPageRange;
     964             :     else
     965           0 :         rPagesStr = "";
     966             : 
     967           0 :     return bDone;
     968             : }
     969             : 
     970           0 : sal_Int32 SAL_CALL ScModelObj::getRendererCount(const uno::Any& aSelection,
     971             :     const uno::Sequence<beans::PropertyValue>& rOptions)
     972             :         throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception)
     973             : {
     974           0 :     SolarMutexGuard aGuard;
     975           0 :     if (!pDocShell)
     976             :     {
     977             :         throw lang::DisposedException( OUString(),
     978           0 :                 static_cast< sheet::XSpreadsheetDocument* >(this) );
     979             :     }
     980             : 
     981           0 :     ScMarkData aMark;
     982           0 :     ScPrintSelectionStatus aStatus;
     983           0 :     OUString aPagesStr;
     984           0 :     if ( !FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr ) )
     985           0 :         return 0;
     986             : 
     987             :     //  The same ScPrintFuncCache object in pPrintFuncCache is used as long as
     988             :     //  the same selection is used (aStatus) and the document isn't changed
     989             :     //  (pPrintFuncCache is cleared in Notify handler)
     990             : 
     991           0 :     if ( !pPrintFuncCache || !pPrintFuncCache->IsSameSelection( aStatus ) )
     992             :     {
     993           0 :         delete pPrintFuncCache;
     994           0 :         pPrintFuncCache = new ScPrintFuncCache( pDocShell, aMark, aStatus );
     995             :     }
     996           0 :     sal_Int32 nPages = pPrintFuncCache->GetPageCount();
     997             : 
     998           0 :     sal_Int32 nSelectCount = nPages;
     999           0 :     if ( !aPagesStr.isEmpty() )
    1000             :     {
    1001           0 :         StringRangeEnumerator aRangeEnum( aPagesStr, 0, nPages-1 );
    1002           0 :         nSelectCount = aRangeEnum.size();
    1003             :     }
    1004           0 :     return (nSelectCount > 0) ? nSelectCount : 1;
    1005             : }
    1006             : 
    1007           0 : static sal_Int32 lcl_GetRendererNum( sal_Int32 nSelRenderer, const OUString& rPagesStr, sal_Int32 nTotalPages )
    1008             : {
    1009           0 :     if ( rPagesStr.isEmpty() )
    1010           0 :         return nSelRenderer;
    1011             : 
    1012           0 :     StringRangeEnumerator aRangeEnum( rPagesStr, 0, nTotalPages-1 );
    1013           0 :     StringRangeEnumerator::Iterator aIter = aRangeEnum.begin();
    1014           0 :     StringRangeEnumerator::Iterator aEnd  = aRangeEnum.end();
    1015           0 :     for ( ; nSelRenderer > 0 && aIter != aEnd; --nSelRenderer )
    1016           0 :         ++aIter;
    1017             : 
    1018           0 :     return *aIter; // returns -1 if reached the end
    1019             : }
    1020             : 
    1021           0 : uno::Sequence<beans::PropertyValue> SAL_CALL ScModelObj::getRenderer( sal_Int32 nSelRenderer,
    1022             :                                     const uno::Any& aSelection, const uno::Sequence<beans::PropertyValue>& rOptions  )
    1023             :                                 throw (lang::IllegalArgumentException,
    1024             :                                        uno::RuntimeException,
    1025             :                                        std::exception)
    1026             : {
    1027           0 :     SolarMutexGuard aGuard;
    1028           0 :     if (!pDocShell)
    1029             :     {
    1030             :         throw lang::DisposedException( OUString(),
    1031           0 :                 static_cast< sheet::XSpreadsheetDocument* >(this) );
    1032             :     }
    1033             : 
    1034           0 :     ScMarkData aMark;
    1035           0 :     ScPrintSelectionStatus aStatus;
    1036           0 :     OUString aPagesStr;
    1037             :     // #i115266# if FillRenderMarkData fails, keep nTotalPages at 0, but still handle getRenderer(0) below
    1038           0 :     long nTotalPages = 0;
    1039           0 :     if ( FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr ) )
    1040             :     {
    1041           0 :         if ( !pPrintFuncCache || !pPrintFuncCache->IsSameSelection( aStatus ) )
    1042             :         {
    1043           0 :             delete pPrintFuncCache;
    1044           0 :             pPrintFuncCache = new ScPrintFuncCache( pDocShell, aMark, aStatus );
    1045             :         }
    1046           0 :         nTotalPages = pPrintFuncCache->GetPageCount();
    1047             :     }
    1048           0 :     sal_Int32 nRenderer = lcl_GetRendererNum( nSelRenderer, aPagesStr, nTotalPages );
    1049           0 :     if ( nRenderer < 0 )
    1050             :     {
    1051           0 :         if ( nSelRenderer == 0 )
    1052             :         {
    1053             :             // getRenderer(0) is used to query the settings, so it must always return something
    1054             : 
    1055           0 :             SCTAB nCurTab = 0;      //! use current sheet from view?
    1056           0 :             ScPrintFunc aDefaultFunc( pDocShell, pDocShell->GetPrinter(), nCurTab );
    1057           0 :             Size aTwips = aDefaultFunc.GetPageSize();
    1058           0 :             awt::Size aPageSize( TwipsToHMM( aTwips.Width() ), TwipsToHMM( aTwips.Height() ) );
    1059             : 
    1060           0 :             uno::Sequence<beans::PropertyValue> aSequence(1);
    1061           0 :             beans::PropertyValue* pArray = aSequence.getArray();
    1062           0 :             pArray[0].Name = SC_UNONAME_PAGESIZE;
    1063           0 :             pArray[0].Value <<= aPageSize;
    1064             : 
    1065           0 :             if( ! pPrinterOptions )
    1066           0 :                 pPrinterOptions = new ScPrintUIOptions;
    1067             :             else
    1068           0 :                 pPrinterOptions->SetDefaults();
    1069           0 :             pPrinterOptions->appendPrintUIOptions( aSequence );
    1070           0 :             return aSequence;
    1071             :         }
    1072             :         else
    1073           0 :             throw lang::IllegalArgumentException();
    1074             :     }
    1075             : 
    1076             :     //  printer is used as device (just for page layout), draw view is not needed
    1077             : 
    1078           0 :     SCTAB nTab = pPrintFuncCache->GetTabForPage( nRenderer );
    1079             : 
    1080           0 :     ScRange aRange;
    1081           0 :     const ScRange* pSelRange = NULL;
    1082           0 :     if ( aMark.IsMarked() )
    1083             :     {
    1084           0 :         aMark.GetMarkArea( aRange );
    1085           0 :         pSelRange = &aRange;
    1086             :     }
    1087             :     ScPrintFunc aFunc( pDocShell, pDocShell->GetPrinter(), nTab,
    1088           0 :                         pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions() );
    1089           0 :     aFunc.SetRenderFlag( true );
    1090             : 
    1091           0 :     Range aPageRange( nRenderer+1, nRenderer+1 );
    1092           0 :     MultiSelection aPage( aPageRange );
    1093           0 :     aPage.SetTotalRange( Range(0,RANGE_MAX) );
    1094           0 :     aPage.Select( aPageRange );
    1095             : 
    1096           0 :     long nDisplayStart = pPrintFuncCache->GetDisplayStart( nTab );
    1097           0 :     long nTabStart = pPrintFuncCache->GetTabStart( nTab );
    1098             : 
    1099           0 :     (void)aFunc.DoPrint( aPage, nTabStart, nDisplayStart, false, NULL );
    1100             : 
    1101           0 :     ScRange aCellRange;
    1102           0 :     bool bWasCellRange = aFunc.GetLastSourceRange( aCellRange );
    1103           0 :     Size aTwips = aFunc.GetPageSize();
    1104           0 :     awt::Size aPageSize( TwipsToHMM( aTwips.Width() ), TwipsToHMM( aTwips.Height() ) );
    1105             : 
    1106           0 :     long nPropCount = bWasCellRange ? 3 : 2;
    1107           0 :     uno::Sequence<beans::PropertyValue> aSequence(nPropCount);
    1108           0 :     beans::PropertyValue* pArray = aSequence.getArray();
    1109           0 :     pArray[0].Name = SC_UNONAME_PAGESIZE;
    1110           0 :     pArray[0].Value <<= aPageSize;
    1111             :     // #i111158# all positions are relative to the whole page, including non-printable area
    1112           0 :     pArray[1].Name = SC_UNONAME_INC_NP_AREA;
    1113           0 :     pArray[1].Value = uno::makeAny( sal_True );
    1114           0 :     if ( bWasCellRange )
    1115             :     {
    1116             :         table::CellRangeAddress aRangeAddress( nTab,
    1117           0 :                         aCellRange.aStart.Col(), aCellRange.aStart.Row(),
    1118           0 :                         aCellRange.aEnd.Col(), aCellRange.aEnd.Row() );
    1119           0 :         pArray[2].Name = SC_UNONAME_SOURCERANGE;
    1120           0 :         pArray[2].Value <<= aRangeAddress;
    1121             :     }
    1122             : 
    1123           0 :     if( ! pPrinterOptions )
    1124           0 :         pPrinterOptions = new ScPrintUIOptions;
    1125             :     else
    1126           0 :         pPrinterOptions->SetDefaults();
    1127           0 :     pPrinterOptions->appendPrintUIOptions( aSequence );
    1128           0 :     return aSequence;
    1129             : }
    1130             : 
    1131           0 : void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelection,
    1132             :                                     const uno::Sequence<beans::PropertyValue>& rOptions )
    1133             :                                 throw(lang::IllegalArgumentException,
    1134             :                                       uno::RuntimeException,
    1135             :                                       std::exception)
    1136             : {
    1137           0 :     SolarMutexGuard aGuard;
    1138           0 :     if (!pDocShell)
    1139             :     {
    1140             :         throw lang::DisposedException( OUString(),
    1141           0 :                 static_cast< sheet::XSpreadsheetDocument* >(this) );
    1142             :     }
    1143             : 
    1144           0 :     ScMarkData aMark;
    1145           0 :     ScPrintSelectionStatus aStatus;
    1146           0 :     OUString aPagesStr;
    1147           0 :     if ( !FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr ) )
    1148           0 :         throw lang::IllegalArgumentException();
    1149             : 
    1150           0 :     if ( !pPrintFuncCache || !pPrintFuncCache->IsSameSelection( aStatus ) )
    1151             :     {
    1152           0 :         delete pPrintFuncCache;
    1153           0 :         pPrintFuncCache = new ScPrintFuncCache( pDocShell, aMark, aStatus );
    1154             :     }
    1155           0 :     long nTotalPages = pPrintFuncCache->GetPageCount();
    1156           0 :     sal_Int32 nRenderer = lcl_GetRendererNum( nSelRenderer, aPagesStr, nTotalPages );
    1157           0 :     if ( nRenderer < 0 )
    1158           0 :         throw lang::IllegalArgumentException();
    1159             : 
    1160           0 :     OutputDevice* pDev = lcl_GetRenderDevice( rOptions );
    1161           0 :     if ( !pDev )
    1162           0 :         throw lang::IllegalArgumentException();
    1163             : 
    1164           0 :     SCTAB nTab = pPrintFuncCache->GetTabForPage( nRenderer );
    1165           0 :     ScDocument& rDoc = pDocShell->GetDocument();
    1166             : 
    1167           0 :     FmFormView* pDrawView = NULL;
    1168             : 
    1169             :     // #114135#
    1170           0 :     ScDrawLayer* pModel = rDoc.GetDrawLayer();
    1171             : 
    1172           0 :     if( pModel )
    1173             :     {
    1174           0 :         pDrawView = new FmFormView( pModel, pDev );
    1175           0 :         pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab));
    1176           0 :         pDrawView->SetPrintPreview( true );
    1177             :     }
    1178             : 
    1179           0 :     ScRange aRange;
    1180           0 :     const ScRange* pSelRange = NULL;
    1181           0 :     if ( aMark.IsMarked() )
    1182             :     {
    1183           0 :         aMark.GetMarkArea( aRange );
    1184           0 :         pSelRange = &aRange;
    1185             :     }
    1186             : 
    1187             :     //  to increase performance, ScPrintState might be used here for subsequent
    1188             :     //  pages of the same sheet
    1189             : 
    1190           0 :     ScPrintFunc aFunc( pDev, pDocShell, nTab, pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions() );
    1191           0 :     aFunc.SetDrawView( pDrawView );
    1192           0 :     aFunc.SetRenderFlag( true );
    1193           0 :     if( aStatus.GetMode() == SC_PRINTSEL_RANGE_EXCLUSIVELY_OLE_AND_DRAW_OBJECTS )
    1194           0 :         aFunc.SetExclusivelyDrawOleAndDrawObjects();
    1195             : 
    1196           0 :     Range aPageRange( nRenderer+1, nRenderer+1 );
    1197           0 :     MultiSelection aPage( aPageRange );
    1198           0 :     aPage.SetTotalRange( Range(0,RANGE_MAX) );
    1199           0 :     aPage.Select( aPageRange );
    1200             : 
    1201           0 :     long nDisplayStart = pPrintFuncCache->GetDisplayStart( nTab );
    1202           0 :     long nTabStart = pPrintFuncCache->GetTabStart( nTab );
    1203             : 
    1204           0 :     vcl::PDFExtOutDevData* pPDFData = PTR_CAST( vcl::PDFExtOutDevData, pDev->GetExtOutDevData() );
    1205           0 :     if ( nRenderer == nTabStart )
    1206             :     {
    1207             :         // first page of a sheet: add outline item for the sheet name
    1208             : 
    1209           0 :         if ( pPDFData && pPDFData->GetIsExportBookmarks() )
    1210             :         {
    1211             :             // the sheet starts at the top of the page
    1212           0 :             Rectangle aArea( pDev->PixelToLogic( Rectangle( 0,0,0,0 ) ) );
    1213           0 :             sal_Int32 nDestID = pPDFData->CreateDest( aArea );
    1214           0 :             OUString aTabName;
    1215           0 :             rDoc.GetName( nTab, aTabName );
    1216           0 :             sal_Int32 nParent = -1;     // top-level
    1217           0 :             pPDFData->CreateOutlineItem( nParent, aTabName, nDestID );
    1218             :         }
    1219             :         // #i56629# add the named destination stuff
    1220           0 :         if( pPDFData && pPDFData->GetIsExportNamedDestinations() )
    1221             :         {
    1222           0 :             Rectangle aArea( pDev->PixelToLogic( Rectangle( 0,0,0,0 ) ) );
    1223           0 :             OUString aTabName;
    1224           0 :             rDoc.GetName( nTab, aTabName );
    1225             :             //need the PDF page number here
    1226           0 :             pPDFData->CreateNamedDest( aTabName, aArea );
    1227             :         }
    1228             :     }
    1229             : 
    1230           0 :     (void)aFunc.DoPrint( aPage, nTabStart, nDisplayStart, true, NULL );
    1231             : 
    1232             :     //  resolve the hyperlinks for PDF export
    1233             : 
    1234           0 :     if ( pPDFData )
    1235             :     {
    1236             :         //  iterate over the hyperlinks that were output for this page
    1237             : 
    1238           0 :         std::vector< vcl::PDFExtOutDevBookmarkEntry >& rBookmarks = pPDFData->GetBookmarks();
    1239           0 :         std::vector< vcl::PDFExtOutDevBookmarkEntry >::iterator aIter = rBookmarks.begin();
    1240           0 :         std::vector< vcl::PDFExtOutDevBookmarkEntry >::iterator aIEnd = rBookmarks.end();
    1241           0 :         while ( aIter != aIEnd )
    1242             :         {
    1243           0 :             OUString aBookmark = aIter->aBookmark;
    1244           0 :             if ( aBookmark.toChar() == (sal_Unicode) '#' )
    1245             :             {
    1246             :                 //  try to resolve internal link
    1247             : 
    1248           0 :                 OUString aTarget( aBookmark.copy( 1 ) );
    1249             : 
    1250           0 :                 ScRange aTargetRange;
    1251           0 :                 Rectangle aTargetRect;      // 1/100th mm
    1252           0 :                 bool bIsSheet = false;
    1253           0 :                 bool bValid = lcl_ParseTarget( aTarget, aTargetRange, aTargetRect, bIsSheet, &rDoc, nTab );
    1254             : 
    1255           0 :                 if ( bValid )
    1256             :                 {
    1257           0 :                     sal_Int32 nPage = -1;
    1258           0 :                     Rectangle aArea;
    1259           0 :                     if ( bIsSheet )
    1260             :                     {
    1261             :                         //  Get first page for sheet (if nothing from that sheet is printed,
    1262             :                         //  this page can show a different sheet)
    1263           0 :                         nPage = pPrintFuncCache->GetTabStart( aTargetRange.aStart.Tab() );
    1264           0 :                         aArea = pDev->PixelToLogic( Rectangle( 0,0,0,0 ) );
    1265             :                     }
    1266             :                     else
    1267             :                     {
    1268           0 :                         pPrintFuncCache->InitLocations( aMark, pDev );      // does nothing if already initialized
    1269             : 
    1270           0 :                         ScPrintPageLocation aLocation;
    1271           0 :                         if ( pPrintFuncCache->FindLocation( aTargetRange.aStart, aLocation ) )
    1272             :                         {
    1273           0 :                             nPage = aLocation.nPage;
    1274             : 
    1275             :                             // get the rectangle of the page's cell range in 1/100th mm
    1276           0 :                             ScRange aLocRange = aLocation.aCellRange;
    1277             :                             Rectangle aLocationMM = rDoc.GetMMRect(
    1278           0 :                                        aLocRange.aStart.Col(), aLocRange.aStart.Row(),
    1279           0 :                                        aLocRange.aEnd.Col(),   aLocRange.aEnd.Row(),
    1280           0 :                                        aLocRange.aStart.Tab() );
    1281           0 :                             Rectangle aLocationPixel = aLocation.aRectangle;
    1282             : 
    1283             :                             // Scale and move the target rectangle from aLocationMM to aLocationPixel,
    1284             :                             // to get the target rectangle in pixels.
    1285             : 
    1286           0 :                             Fraction aScaleX( aLocationPixel.GetWidth(), aLocationMM.GetWidth() );
    1287           0 :                             Fraction aScaleY( aLocationPixel.GetHeight(), aLocationMM.GetHeight() );
    1288             : 
    1289           0 :                             long nX1 = aLocationPixel.Left() + (long)
    1290           0 :                                 ( Fraction( aTargetRect.Left() - aLocationMM.Left(), 1 ) * aScaleX );
    1291           0 :                             long nX2 = aLocationPixel.Left() + (long)
    1292           0 :                                 ( Fraction( aTargetRect.Right() - aLocationMM.Left(), 1 ) * aScaleX );
    1293           0 :                             long nY1 = aLocationPixel.Top() + (long)
    1294           0 :                                 ( Fraction( aTargetRect.Top() - aLocationMM.Top(), 1 ) * aScaleY );
    1295           0 :                             long nY2 = aLocationPixel.Top() + (long)
    1296           0 :                                 ( Fraction( aTargetRect.Bottom() - aLocationMM.Top(), 1 ) * aScaleY );
    1297             : 
    1298           0 :                             if ( nX1 > aLocationPixel.Right() ) nX1 = aLocationPixel.Right();
    1299           0 :                             if ( nX2 > aLocationPixel.Right() ) nX2 = aLocationPixel.Right();
    1300           0 :                             if ( nY1 > aLocationPixel.Bottom() ) nY1 = aLocationPixel.Bottom();
    1301           0 :                             if ( nY2 > aLocationPixel.Bottom() ) nY2 = aLocationPixel.Bottom();
    1302             : 
    1303             :                             // The link target area is interpreted using the device's MapMode at
    1304             :                             // the time of the CreateDest call, so PixelToLogic can be used here,
    1305             :                             // regardless of the MapMode that is actually selected.
    1306             : 
    1307           0 :                             aArea = pDev->PixelToLogic( Rectangle( nX1, nY1, nX2, nY2 ) );
    1308             :                         }
    1309             :                     }
    1310             : 
    1311           0 :                     if ( nPage >= 0 )
    1312           0 :                         pPDFData->SetLinkDest( aIter->nLinkId, pPDFData->CreateDest( aArea, nPage ) );
    1313           0 :                 }
    1314             :             }
    1315             :             else
    1316             :             {
    1317             :                 //  external link, use as-is
    1318           0 :                 pPDFData->SetLinkURL( aIter->nLinkId, aBookmark );
    1319             :             }
    1320           0 :             ++aIter;
    1321           0 :         }
    1322           0 :         rBookmarks.clear();
    1323             :     }
    1324             : 
    1325           0 :     if ( pDrawView )
    1326           0 :         pDrawView->HideSdrPage();
    1327           0 :     delete pDrawView;
    1328           0 : }
    1329             : 
    1330             : // XLinkTargetSupplier
    1331             : 
    1332           2 : uno::Reference<container::XNameAccess> SAL_CALL ScModelObj::getLinks() throw(uno::RuntimeException, std::exception)
    1333             : {
    1334           2 :     SolarMutexGuard aGuard;
    1335           2 :     if (pDocShell)
    1336           2 :         return new ScLinkTargetTypesObj(pDocShell);
    1337           0 :     return NULL;
    1338             : }
    1339             : 
    1340             : // XActionLockable
    1341             : 
    1342           6 : sal_Bool SAL_CALL ScModelObj::isActionLocked() throw(uno::RuntimeException, std::exception)
    1343             : {
    1344           6 :     SolarMutexGuard aGuard;
    1345           6 :     bool bLocked = false;
    1346           6 :     if (pDocShell)
    1347           6 :         bLocked = ( pDocShell->GetLockCount() != 0 );
    1348           6 :     return bLocked;
    1349             : }
    1350             : 
    1351        1102 : void SAL_CALL ScModelObj::addActionLock() throw(uno::RuntimeException, std::exception)
    1352             : {
    1353        1102 :     SolarMutexGuard aGuard;
    1354        1102 :     if (pDocShell)
    1355        1102 :         pDocShell->LockDocument();
    1356        1102 : }
    1357             : 
    1358        1090 : void SAL_CALL ScModelObj::removeActionLock() throw(uno::RuntimeException, std::exception)
    1359             : {
    1360        1090 :     SolarMutexGuard aGuard;
    1361        1090 :     if (pDocShell)
    1362        1090 :         pDocShell->UnlockDocument();
    1363        1090 : }
    1364             : 
    1365           2 : void SAL_CALL ScModelObj::setActionLocks( sal_Int16 nLock ) throw(uno::RuntimeException, std::exception)
    1366             : {
    1367           2 :     SolarMutexGuard aGuard;
    1368           2 :     if (pDocShell)
    1369           2 :         pDocShell->SetLockCount(nLock);
    1370           2 : }
    1371             : 
    1372           2 : sal_Int16 SAL_CALL ScModelObj::resetActionLocks() throw(uno::RuntimeException, std::exception)
    1373             : {
    1374           2 :     SolarMutexGuard aGuard;
    1375           2 :     sal_uInt16 nRet = 0;
    1376           2 :     if (pDocShell)
    1377             :     {
    1378           2 :         nRet = pDocShell->GetLockCount();
    1379           2 :         pDocShell->SetLockCount(0);
    1380             :     }
    1381           2 :     return nRet;
    1382             : }
    1383             : 
    1384         262 : void SAL_CALL ScModelObj::lockControllers() throw (::com::sun::star::uno::RuntimeException, std::exception)
    1385             : {
    1386         262 :     SolarMutexGuard aGuard;
    1387         262 :     SfxBaseModel::lockControllers();
    1388         262 :     if (pDocShell)
    1389         262 :         pDocShell->LockPaint();
    1390         262 : }
    1391             : 
    1392         312 : void SAL_CALL ScModelObj::unlockControllers() throw (::com::sun::star::uno::RuntimeException, std::exception)
    1393             : {
    1394         312 :     SolarMutexGuard aGuard;
    1395         312 :     if (hasControllersLocked())
    1396             :     {
    1397         262 :         SfxBaseModel::unlockControllers();
    1398         262 :         if (pDocShell)
    1399         262 :             pDocShell->UnlockPaint();
    1400         312 :     }
    1401         312 : }
    1402             : 
    1403             : // XCalculate
    1404             : 
    1405           8 : void SAL_CALL ScModelObj::calculate() throw(uno::RuntimeException, std::exception)
    1406             : {
    1407           8 :     SolarMutexGuard aGuard;
    1408           8 :     if (pDocShell)
    1409           8 :         pDocShell->DoRecalc(true);
    1410             :     else
    1411             :     {
    1412             :         OSL_FAIL("keine DocShell");     //! Exception oder so?
    1413           8 :     }
    1414           8 : }
    1415             : 
    1416           8 : void SAL_CALL ScModelObj::calculateAll() throw(uno::RuntimeException, std::exception)
    1417             : {
    1418           8 :     SolarMutexGuard aGuard;
    1419           8 :     if (pDocShell)
    1420           8 :         pDocShell->DoHardRecalc(true);
    1421             :     else
    1422             :     {
    1423             :         OSL_FAIL("keine DocShell");     //! Exception oder so?
    1424           8 :     }
    1425           8 : }
    1426             : 
    1427          18 : sal_Bool SAL_CALL ScModelObj::isAutomaticCalculationEnabled() throw(uno::RuntimeException, std::exception)
    1428             : {
    1429          18 :     SolarMutexGuard aGuard;
    1430          18 :     if (pDocShell)
    1431          18 :         return pDocShell->GetDocument().GetAutoCalc();
    1432             : 
    1433             :     OSL_FAIL("keine DocShell");     //! Exception oder so?
    1434           0 :     return false;
    1435             : }
    1436             : 
    1437         142 : void SAL_CALL ScModelObj::enableAutomaticCalculation( sal_Bool bEnabledIn )
    1438             :                                                 throw(uno::RuntimeException, std::exception)
    1439             : {
    1440         142 :     bool bEnabled(bEnabledIn);
    1441         142 :     SolarMutexGuard aGuard;
    1442         142 :     if (pDocShell)
    1443             :     {
    1444         142 :         ScDocument& rDoc = pDocShell->GetDocument();
    1445         142 :         if ( rDoc.GetAutoCalc() != bEnabled )
    1446             :         {
    1447          12 :             rDoc.SetAutoCalc( bEnabled );
    1448          12 :             pDocShell->SetDocumentModified();
    1449             :         }
    1450             :     }
    1451             :     else
    1452             :     {
    1453             :         OSL_FAIL("keine DocShell");     //! Exception oder so?
    1454         142 :     }
    1455         142 : }
    1456             : 
    1457             : // XProtectable
    1458             : 
    1459           2 : void SAL_CALL ScModelObj::protect( const OUString& aPassword ) throw(uno::RuntimeException, std::exception)
    1460             : {
    1461           2 :     SolarMutexGuard aGuard;
    1462             :     // #i108245# if already protected, don't change anything
    1463           2 :     if ( pDocShell && !pDocShell->GetDocument().IsDocProtected() )
    1464             :     {
    1465           2 :         OUString aString(aPassword);
    1466           2 :         pDocShell->GetDocFunc().Protect( TABLEID_DOC, aString, true );
    1467           2 :     }
    1468           2 : }
    1469             : 
    1470           4 : void SAL_CALL ScModelObj::unprotect( const OUString& aPassword )
    1471             :                         throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    1472             : {
    1473           4 :     SolarMutexGuard aGuard;
    1474           4 :     if (pDocShell)
    1475             :     {
    1476           4 :         OUString aString(aPassword);
    1477           4 :         bool bDone = pDocShell->GetDocFunc().Unprotect( TABLEID_DOC, aString, true );
    1478           4 :         if (!bDone)
    1479           2 :             throw lang::IllegalArgumentException();
    1480           4 :     }
    1481           2 : }
    1482             : 
    1483           6 : sal_Bool SAL_CALL ScModelObj::isProtected() throw(uno::RuntimeException, std::exception)
    1484             : {
    1485           6 :     SolarMutexGuard aGuard;
    1486           6 :     if (pDocShell)
    1487           6 :         return pDocShell->GetDocument().IsDocProtected();
    1488             : 
    1489             :     OSL_FAIL("keine DocShell");     //! Exception oder so?
    1490           0 :     return false;
    1491             : }
    1492             : 
    1493             : // XDrawPagesSupplier
    1494             : 
    1495          50 : uno::Reference<drawing::XDrawPages> SAL_CALL ScModelObj::getDrawPages() throw(uno::RuntimeException, std::exception)
    1496             : {
    1497          50 :     SolarMutexGuard aGuard;
    1498          50 :     if (pDocShell)
    1499          50 :         return new ScDrawPagesObj(pDocShell);
    1500             : 
    1501             :     OSL_FAIL("keine DocShell");     //! Exception oder so?
    1502           0 :     return NULL;
    1503             : }
    1504             : 
    1505             : // XGoalSeek
    1506             : 
    1507          10 : sheet::GoalResult SAL_CALL ScModelObj::seekGoal(
    1508             :                                 const table::CellAddress& aFormulaPosition,
    1509             :                                 const table::CellAddress& aVariablePosition,
    1510             :                                 const OUString& aGoalValue )
    1511             :                                     throw (uno::RuntimeException,
    1512             :                                            std::exception)
    1513             : {
    1514          10 :     SolarMutexGuard aGuard;
    1515          10 :     sheet::GoalResult aResult;
    1516          10 :     aResult.Divergence = DBL_MAX;       // nichts gefunden
    1517          10 :     if (pDocShell)
    1518             :     {
    1519          10 :         WaitObject aWait( pDocShell->GetActiveDialogParent() );
    1520          20 :         OUString aGoalString(aGoalValue);
    1521          10 :         ScDocument& rDoc = pDocShell->GetDocument();
    1522          10 :         double fValue = 0.0;
    1523             :         bool bFound = rDoc.Solver(
    1524             :                     (SCCOL)aFormulaPosition.Column, (SCROW)aFormulaPosition.Row, aFormulaPosition.Sheet,
    1525             :                     (SCCOL)aVariablePosition.Column, (SCROW)aVariablePosition.Row, aVariablePosition.Sheet,
    1526          10 :                     aGoalString, fValue );
    1527          10 :         aResult.Result = fValue;
    1528          10 :         if (bFound)
    1529          18 :             aResult.Divergence = 0.0;   //! das ist gelogen
    1530             :     }
    1531          10 :     return aResult;
    1532             : }
    1533             : 
    1534             : // XConsolidatable
    1535             : 
    1536           4 : uno::Reference<sheet::XConsolidationDescriptor> SAL_CALL ScModelObj::createConsolidationDescriptor(
    1537             :                                 sal_Bool bEmpty ) throw(uno::RuntimeException, std::exception)
    1538             : {
    1539           4 :     SolarMutexGuard aGuard;
    1540           4 :     ScConsolidationDescriptor* pNew = new ScConsolidationDescriptor;
    1541           4 :     if ( pDocShell && !bEmpty )
    1542             :     {
    1543           0 :         ScDocument& rDoc = pDocShell->GetDocument();
    1544           0 :         const ScConsolidateParam* pParam = rDoc.GetConsolidateDlgData();
    1545           0 :         if (pParam)
    1546           0 :             pNew->SetParam( *pParam );
    1547             :     }
    1548           4 :     return pNew;
    1549             : }
    1550             : 
    1551           2 : void SAL_CALL ScModelObj::consolidate(
    1552             :     const uno::Reference<sheet::XConsolidationDescriptor>& xDescriptor )
    1553             :         throw (uno::RuntimeException, std::exception)
    1554             : {
    1555           2 :     SolarMutexGuard aGuard;
    1556             :     //  das koennte theoretisch ein fremdes Objekt sein, also nur das
    1557             :     //  oeffentliche XConsolidationDescriptor Interface benutzen, um
    1558             :     //  die Daten in ein ScConsolidationDescriptor Objekt zu kopieren:
    1559             :     //! wenn es schon ein ScConsolidationDescriptor ist, direkt per getImplementation?
    1560             : 
    1561           4 :     ScConsolidationDescriptor aImpl;
    1562           2 :     aImpl.setFunction( xDescriptor->getFunction() );
    1563           2 :     aImpl.setSources( xDescriptor->getSources() );
    1564           2 :     aImpl.setStartOutputPosition( xDescriptor->getStartOutputPosition() );
    1565           2 :     aImpl.setUseColumnHeaders( xDescriptor->getUseColumnHeaders() );
    1566           2 :     aImpl.setUseRowHeaders( xDescriptor->getUseRowHeaders() );
    1567           2 :     aImpl.setInsertLinks( xDescriptor->getInsertLinks() );
    1568             : 
    1569           2 :     if (pDocShell)
    1570             :     {
    1571           2 :         const ScConsolidateParam& rParam = aImpl.GetParam();
    1572           2 :         pDocShell->DoConsolidate( rParam, true );
    1573           2 :         pDocShell->GetDocument().SetConsolidateDlgData( &rParam );
    1574           2 :     }
    1575           2 : }
    1576             : 
    1577             : // XDocumentAuditing
    1578             : 
    1579           2 : void SAL_CALL ScModelObj::refreshArrows() throw(uno::RuntimeException, std::exception)
    1580             : {
    1581           2 :     SolarMutexGuard aGuard;
    1582           2 :     if (pDocShell)
    1583           2 :         pDocShell->GetDocFunc().DetectiveRefresh();
    1584           2 : }
    1585             : 
    1586             : // XViewDataSupplier
    1587        1496 : uno::Reference< container::XIndexAccess > SAL_CALL ScModelObj::getViewData(  )
    1588             :     throw (uno::RuntimeException, std::exception)
    1589             : {
    1590        1496 :     uno::Reference < container::XIndexAccess > xRet( SfxBaseModel::getViewData() );
    1591             : 
    1592        1496 :     if( !xRet.is() )
    1593             :     {
    1594         458 :         SolarMutexGuard aGuard;
    1595         458 :         if (pDocShell && pDocShell->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED)
    1596             :         {
    1597          38 :             uno::Reference < container::XIndexContainer > xCont = document::IndexedPropertyValues::create( ::comphelper::getProcessComponentContext() );
    1598          38 :             xRet.set( xCont, uno::UNO_QUERY_THROW );
    1599             : 
    1600          76 :             uno::Sequence< beans::PropertyValue > aSeq;
    1601          38 :             aSeq.realloc(1);
    1602          76 :             OUString sName;
    1603          38 :             pDocShell->GetDocument().GetName( pDocShell->GetDocument().GetVisibleTab(), sName );
    1604          76 :             OUString sOUName(sName);
    1605          38 :             aSeq[0].Name = SC_ACTIVETABLE;
    1606          38 :             aSeq[0].Value <<= sOUName;
    1607          76 :             xCont->insertByIndex( 0, uno::makeAny( aSeq ) );
    1608         458 :         }
    1609             :     }
    1610             : 
    1611        1496 :     return xRet;
    1612             : }
    1613             : 
    1614             : //  XPropertySet (Doc-Optionen)
    1615             : //! auch an der Applikation anbieten?
    1616             : 
    1617        3628 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScModelObj::getPropertySetInfo()
    1618             :                                                         throw(uno::RuntimeException, std::exception)
    1619             : {
    1620        3628 :     SolarMutexGuard aGuard;
    1621             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    1622        3628 :         new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
    1623        3628 :     return aRef;
    1624             : }
    1625             : 
    1626        5136 : void SAL_CALL ScModelObj::setPropertyValue(
    1627             :                         const OUString& aPropertyName, const uno::Any& aValue )
    1628             :     throw(beans::UnknownPropertyException, beans::PropertyVetoException,
    1629             :           lang::IllegalArgumentException, lang::WrappedTargetException,
    1630             :           uno::RuntimeException, std::exception)
    1631             : {
    1632        5136 :     SolarMutexGuard aGuard;
    1633       10272 :     OUString aString(aPropertyName);
    1634             : 
    1635        5136 :     if (pDocShell)
    1636             :     {
    1637        5136 :         ScDocument& rDoc = pDocShell->GetDocument();
    1638        5136 :         const ScDocOptions& rOldOpt = rDoc.GetDocOptions();
    1639        5136 :         ScDocOptions aNewOpt = rOldOpt;
    1640             :         //  Don't recalculate while loading XML, when the formula text is stored
    1641             :         //  Recalculation after loading is handled separately.
    1642        5136 :         bool bHardRecalc = !rDoc.IsImportingXML();
    1643             : 
    1644        5136 :         bool bOpt = ScDocOptionsHelper::setPropertyValue( aNewOpt, aPropSet.getPropertyMap(), aPropertyName, aValue );
    1645        5136 :         if (bOpt)
    1646             :         {
    1647             :             // done...
    1648       11736 :             if ( aString.equalsAscii( SC_UNO_IGNORECASE ) ||
    1649        7208 :                  aString.equalsAscii( SC_UNONAME_REGEXP ) ||
    1650        3142 :                  aString.equalsAscii( SC_UNO_LOOKUPLABELS ) )
    1651        1386 :                 bHardRecalc = false;
    1652             :         }
    1653        1070 :         else if ( aString.equalsAscii( SC_UNONAME_CLOCAL ) )
    1654             :         {
    1655          12 :             lang::Locale aLocale;
    1656          12 :             if ( aValue >>= aLocale )
    1657             :             {
    1658             :                 LanguageType eLatin, eCjk, eCtl;
    1659          12 :                 rDoc.GetLanguage( eLatin, eCjk, eCtl );
    1660          12 :                 eLatin = ScUnoConversion::GetLanguage(aLocale);
    1661          12 :                 rDoc.SetLanguage( eLatin, eCjk, eCtl );
    1662          12 :             }
    1663             :         }
    1664        1058 :         else if ( aString.equalsAscii( SC_UNO_CODENAME ) )
    1665             :         {
    1666         136 :             OUString sCodeName;
    1667         136 :             if ( aValue >>= sCodeName )
    1668         136 :                 rDoc.SetCodeName( sCodeName );
    1669             :         }
    1670         922 :         else if ( aString.equalsAscii( SC_UNO_CJK_CLOCAL ) )
    1671             :         {
    1672          12 :             lang::Locale aLocale;
    1673          12 :             if ( aValue >>= aLocale )
    1674             :             {
    1675             :                 LanguageType eLatin, eCjk, eCtl;
    1676          12 :                 rDoc.GetLanguage( eLatin, eCjk, eCtl );
    1677          12 :                 eCjk = ScUnoConversion::GetLanguage(aLocale);
    1678          12 :                 rDoc.SetLanguage( eLatin, eCjk, eCtl );
    1679          12 :             }
    1680             :         }
    1681         910 :         else if ( aString.equalsAscii( SC_UNO_CTL_CLOCAL ) )
    1682             :         {
    1683          12 :             lang::Locale aLocale;
    1684          12 :             if ( aValue >>= aLocale )
    1685             :             {
    1686             :                 LanguageType eLatin, eCjk, eCtl;
    1687          12 :                 rDoc.GetLanguage( eLatin, eCjk, eCtl );
    1688          12 :                 eCtl = ScUnoConversion::GetLanguage(aLocale);
    1689          12 :                 rDoc.SetLanguage( eLatin, eCjk, eCtl );
    1690          12 :             }
    1691             :         }
    1692         898 :         else if ( aString.equalsAscii( SC_UNO_APPLYFMDES ) )
    1693             :         {
    1694             :             //  model is created if not there
    1695         206 :             ScDrawLayer* pModel = pDocShell->MakeDrawLayer();
    1696         206 :             pModel->SetOpenInDesignMode( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
    1697             : 
    1698         206 :             SfxBindings* pBindings = pDocShell->GetViewBindings();
    1699         206 :             if (pBindings)
    1700          10 :                 pBindings->Invalidate( SID_FM_OPEN_READONLY );
    1701             :         }
    1702         692 :         else if ( aString.equalsAscii( SC_UNO_AUTOCONTFOC ) )
    1703             :         {
    1704             :             //  model is created if not there
    1705          62 :             ScDrawLayer* pModel = pDocShell->MakeDrawLayer();
    1706          62 :             pModel->SetAutoControlFocus( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
    1707             : 
    1708          62 :             SfxBindings* pBindings = pDocShell->GetViewBindings();
    1709          62 :             if (pBindings)
    1710          10 :                 pBindings->Invalidate( SID_FM_AUTOCONTROLFOCUS );
    1711             :         }
    1712         630 :         else if ( aString.equalsAscii( SC_UNO_ISLOADED ) )
    1713             :         {
    1714           8 :             pDocShell->SetEmpty( !ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
    1715             :         }
    1716         622 :         else if ( aString.equalsAscii( SC_UNO_ISUNDOENABLED ) )
    1717             :         {
    1718           8 :             bool bUndoEnabled = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    1719           8 :             rDoc.EnableUndo( bUndoEnabled );
    1720           8 :             pDocShell->GetUndoManager()->SetMaxUndoActionCount(
    1721             :                 bUndoEnabled
    1722           8 :                 ? officecfg::Office::Common::Undo::Steps::get() : 0);
    1723             :         }
    1724         614 :         else if ( aString.equalsAscii( SC_UNO_ISADJUSTHEIGHTENABLED ) )
    1725             :         {
    1726           8 :             bool bOldAdjustHeightEnabled = rDoc.IsAdjustHeightEnabled();
    1727           8 :             bool bAdjustHeightEnabled = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    1728           8 :             if( bOldAdjustHeightEnabled != bAdjustHeightEnabled )
    1729           8 :                 rDoc.EnableAdjustHeight( bAdjustHeightEnabled );
    1730             :         }
    1731         606 :         else if ( aString.equalsAscii( SC_UNO_ISEXECUTELINKENABLED ) )
    1732             :         {
    1733           8 :             rDoc.EnableExecuteLink( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
    1734             :         }
    1735         598 :         else if ( aString.equalsAscii( SC_UNO_ISCHANGEREADONLYENABLED ) )
    1736             :         {
    1737           8 :             rDoc.EnableChangeReadOnly( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
    1738             :         }
    1739         590 :         else if ( aString.equalsAscii( "BuildId" ) )
    1740             :         {
    1741         274 :             aValue >>= maBuildId;
    1742             :         }
    1743         316 :         else if ( aString.equalsAscii( "SavedObject" ) )    // set from chart after saving
    1744             :         {
    1745          10 :             OUString aObjName;
    1746          10 :             aValue >>= aObjName;
    1747          10 :             if ( !aObjName.isEmpty() )
    1748          10 :                 rDoc.RestoreChartListener( aObjName );
    1749             :         }
    1750         306 :         else if ( aString.equalsAscii( SC_UNO_INTEROPGRABBAG ) )
    1751             :         {
    1752          10 :             setGrabBagItem(aValue);
    1753             :         }
    1754             : 
    1755        5136 :         if ( aNewOpt != rOldOpt )
    1756             :         {
    1757         808 :             rDoc.SetDocOptions( aNewOpt );
    1758             :             //! Recalc only for options that need it?
    1759         808 :             if ( bHardRecalc )
    1760         292 :                 pDocShell->DoHardRecalc( true );
    1761         808 :             pDocShell->SetDocumentModified();
    1762        5136 :         }
    1763        5136 :     }
    1764        5136 : }
    1765             : 
    1766        9918 : uno::Any SAL_CALL ScModelObj::getPropertyValue( const OUString& aPropertyName )
    1767             :                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
    1768             :                         uno::RuntimeException, std::exception)
    1769             : {
    1770        9918 :     SolarMutexGuard aGuard;
    1771       19836 :     OUString aString(aPropertyName);
    1772        9918 :     uno::Any aRet;
    1773             : 
    1774        9918 :     if (pDocShell)
    1775             :     {
    1776        9918 :         ScDocument& rDoc = pDocShell->GetDocument();
    1777        9918 :         const ScDocOptions& rOpt = rDoc.GetDocOptions();
    1778        9918 :         aRet = ScDocOptionsHelper::getPropertyValue( rOpt, aPropSet.getPropertyMap(), aPropertyName );
    1779        9918 :         if ( aRet.hasValue() )
    1780             :         {
    1781             :             // done...
    1782             :         }
    1783        8064 :         else if ( aString.equalsAscii( SC_UNONAME_CLOCAL ) )
    1784             :         {
    1785             :             LanguageType eLatin, eCjk, eCtl;
    1786          28 :             rDoc.GetLanguage( eLatin, eCjk, eCtl );
    1787             : 
    1788          28 :             lang::Locale aLocale;
    1789          28 :             ScUnoConversion::FillLocale( aLocale, eLatin );
    1790          28 :             aRet <<= aLocale;
    1791             :         }
    1792        8036 :         else if ( aString.equalsAscii( SC_UNO_CODENAME ) )
    1793             :         {
    1794         564 :             OUString sCodeName = rDoc.GetCodeName();
    1795         564 :             aRet <<= sCodeName;
    1796             :         }
    1797             : 
    1798        7472 :         else if ( aString.equalsAscii( SC_UNO_CJK_CLOCAL ) )
    1799             :         {
    1800             :             LanguageType eLatin, eCjk, eCtl;
    1801          28 :             rDoc.GetLanguage( eLatin, eCjk, eCtl );
    1802             : 
    1803          28 :             lang::Locale aLocale;
    1804          28 :             ScUnoConversion::FillLocale( aLocale, eCjk );
    1805          28 :             aRet <<= aLocale;
    1806             :         }
    1807        7444 :         else if ( aString.equalsAscii( SC_UNO_CTL_CLOCAL ) )
    1808             :         {
    1809             :             LanguageType eLatin, eCjk, eCtl;
    1810          28 :             rDoc.GetLanguage( eLatin, eCjk, eCtl );
    1811             : 
    1812          28 :             lang::Locale aLocale;
    1813          28 :             ScUnoConversion::FillLocale( aLocale, eCtl );
    1814          28 :             aRet <<= aLocale;
    1815             :         }
    1816        7416 :         else if ( aString.equalsAscii( SC_UNO_NAMEDRANGES ) )
    1817             :         {
    1818        2826 :             aRet <<= uno::Reference<sheet::XNamedRanges>(new ScGlobalNamedRangesObj( pDocShell ));
    1819             :         }
    1820        4590 :         else if ( aString.equalsAscii( SC_UNO_DATABASERNG ) )
    1821             :         {
    1822          78 :             aRet <<= uno::Reference<sheet::XDatabaseRanges>(new ScDatabaseRangesObj( pDocShell ));
    1823             :         }
    1824        4512 :         else if ( aString.equalsAscii( SC_UNO_UNNAMEDDBRNG ) )
    1825             :         {
    1826          26 :             aRet <<= uno::Reference<sheet::XUnnamedDatabaseRanges>(new ScUnnamedDatabaseRangesObj(pDocShell));
    1827             :         }
    1828        4486 :         else if ( aString.equalsAscii( SC_UNO_COLLABELRNG ) )
    1829             :         {
    1830          62 :             aRet <<= uno::Reference<sheet::XLabelRanges>(new ScLabelRangesObj( pDocShell, true ));
    1831             :         }
    1832        4424 :         else if ( aString.equalsAscii( SC_UNO_ROWLABELRNG ) )
    1833             :         {
    1834          56 :             aRet <<= uno::Reference<sheet::XLabelRanges>(new ScLabelRangesObj( pDocShell, false ));
    1835             :         }
    1836        4368 :         else if ( aString.equalsAscii( SC_UNO_AREALINKS ) )
    1837             :         {
    1838          64 :             aRet <<= uno::Reference<sheet::XAreaLinks>(new ScAreaLinksObj( pDocShell ));
    1839             :         }
    1840        4304 :         else if ( aString.equalsAscii( SC_UNO_DDELINKS ) )
    1841             :         {
    1842          62 :             aRet <<= uno::Reference<container::XNameAccess>(new ScDDELinksObj( pDocShell ));
    1843             :         }
    1844        4242 :         else if ( aString.equalsAscii( SC_UNO_EXTERNALDOCLINKS ) )
    1845             :         {
    1846           6 :             aRet <<= uno::Reference<sheet::XExternalDocLinks>(new ScExternalDocLinksObj(pDocShell));
    1847             :         }
    1848        4236 :         else if ( aString.equalsAscii( SC_UNO_SHEETLINKS ) )
    1849             :         {
    1850          12 :             aRet <<= uno::Reference<container::XNameAccess>(new ScSheetLinksObj( pDocShell ));
    1851             :         }
    1852        4224 :         else if ( aString.equalsAscii( SC_UNO_APPLYFMDES ) )
    1853             :         {
    1854             :             // default for no model is TRUE
    1855          24 :             ScDrawLayer* pModel = rDoc.GetDrawLayer();
    1856          24 :             bool bOpenInDesign = pModel ? pModel->GetOpenInDesignMode() : sal_True;
    1857          24 :             ScUnoHelpFunctions::SetBoolInAny( aRet, bOpenInDesign );
    1858             :         }
    1859        4200 :         else if ( aString.equalsAscii( SC_UNO_AUTOCONTFOC ) )
    1860             :         {
    1861             :             // default for no model is FALSE
    1862          24 :             ScDrawLayer* pModel = rDoc.GetDrawLayer();
    1863          24 :             bool bAutoControlFocus = pModel && pModel->GetAutoControlFocus();
    1864          24 :             ScUnoHelpFunctions::SetBoolInAny( aRet, bAutoControlFocus );
    1865             :         }
    1866        4176 :         else if ( aString.equalsAscii( SC_UNO_FORBIDDEN ) )
    1867             :         {
    1868           8 :             aRet <<= uno::Reference<i18n::XForbiddenCharacters>(new ScForbiddenCharsObj( pDocShell ));
    1869             :         }
    1870        4168 :         else if ( aString.equalsAscii( SC_UNO_HASDRAWPAGES ) )
    1871             :         {
    1872           8 :             ScUnoHelpFunctions::SetBoolInAny( aRet, (pDocShell->GetDocument().GetDrawLayer() != 0) );
    1873             :         }
    1874        4160 :         else if ( aString.equalsAscii( SC_UNO_BASICLIBRARIES ) )
    1875             :         {
    1876         294 :             aRet <<= pDocShell->GetBasicContainer();
    1877             :         }
    1878        3866 :         else if ( aString.equalsAscii( SC_UNO_DIALOGLIBRARIES ) )
    1879             :         {
    1880           4 :             aRet <<= pDocShell->GetDialogContainer();
    1881             :         }
    1882        3862 :         else if ( aString.equalsAscii( SC_UNO_VBAGLOBNAME ) )
    1883             :         {
    1884             :             /*  #i111553# This property provides the name of the constant that
    1885             :                 will be used to store this model in the global Basic manager.
    1886             :                 That constant will be equivalent to 'ThisComponent' but for
    1887             :                 each application, so e.g. a 'ThisExcelDoc' and a 'ThisWordDoc'
    1888             :                 constant can co-exist, as required by VBA. */
    1889        1064 :             aRet <<= OUString( "ThisExcelDoc" );
    1890             :         }
    1891        2798 :         else if ( aString.equalsAscii( SC_UNO_RUNTIMEUID ) )
    1892             :         {
    1893        1686 :             aRet <<= getRuntimeUID();
    1894             :         }
    1895        1112 :         else if ( aString.equalsAscii( SC_UNO_HASVALIDSIGNATURES ) )
    1896             :         {
    1897           0 :             aRet <<= hasValidSignatures();
    1898             :         }
    1899        1112 :         else if ( aString.equalsAscii( SC_UNO_ISLOADED ) )
    1900             :         {
    1901          20 :             ScUnoHelpFunctions::SetBoolInAny( aRet, !pDocShell->IsEmpty() );
    1902             :         }
    1903        1092 :         else if ( aString.equalsAscii( SC_UNO_ISUNDOENABLED ) )
    1904             :         {
    1905          20 :             ScUnoHelpFunctions::SetBoolInAny( aRet, rDoc.IsUndoEnabled() );
    1906             :         }
    1907        1072 :         else if ( aString.equalsAscii( SC_UNO_ISADJUSTHEIGHTENABLED ) )
    1908             :         {
    1909          20 :             ScUnoHelpFunctions::SetBoolInAny( aRet, rDoc.IsAdjustHeightEnabled() );
    1910             :         }
    1911        1052 :         else if ( aString.equalsAscii( SC_UNO_ISEXECUTELINKENABLED ) )
    1912             :         {
    1913          20 :             ScUnoHelpFunctions::SetBoolInAny( aRet, rDoc.IsExecuteLinkEnabled() );
    1914             :         }
    1915        1032 :         else if ( aString.equalsAscii( SC_UNO_ISCHANGEREADONLYENABLED ) )
    1916             :         {
    1917          20 :             ScUnoHelpFunctions::SetBoolInAny( aRet, rDoc.IsChangeReadOnlyEnabled() );
    1918             :         }
    1919        1012 :         else if ( aString.equalsAscii( SC_UNO_REFERENCEDEVICE ) )
    1920             :         {
    1921         666 :             VCLXDevice* pXDev = new VCLXDevice();
    1922         666 :             pXDev->SetOutputDevice( rDoc.GetRefDevice() );
    1923         666 :             aRet <<= uno::Reference< awt::XDevice >( pXDev );
    1924             :         }
    1925         346 :         else if ( aString.equalsAscii( "BuildId" ) )
    1926             :         {
    1927          20 :             aRet <<= maBuildId;
    1928             :         }
    1929         326 :         else if ( aString.equalsAscii( "InternalDocument" ) )
    1930             :         {
    1931           0 :             ScUnoHelpFunctions::SetBoolInAny( aRet, (pDocShell->GetCreateMode() == SFX_CREATE_MODE_INTERNAL) );
    1932             :         }
    1933         326 :         else if ( aString.equalsAscii( SC_UNO_INTEROPGRABBAG ) )
    1934             :         {
    1935          24 :             getGrabBagItem(aRet);
    1936             :         }
    1937             :     }
    1938             : 
    1939       19836 :     return aRet;
    1940             : }
    1941             : 
    1942           0 : SC_IMPL_DUMMY_PROPERTY_LISTENER( ScModelObj )
    1943             : 
    1944             : // XMultiServiceFactory
    1945             : 
    1946       10350 : css::uno::Reference<css::uno::XInterface> ScModelObj::create(
    1947             :     OUString const & aServiceSpecifier,
    1948             :     css::uno::Sequence<css::uno::Any> const * arguments)
    1949             : {
    1950       10350 :     uno::Reference<uno::XInterface> xRet;
    1951       20700 :     OUString aNameStr(aServiceSpecifier);
    1952       10350 :     sal_uInt16 nType = ScServiceProvider::GetProviderType(aNameStr);
    1953       10350 :     if ( nType != SC_SERVICE_INVALID )
    1954             :     {
    1955             :         //  drawing layer tables must be kept as long as the model is alive
    1956             :         //  return stored instance if already set
    1957        9614 :         switch ( nType )
    1958             :         {
    1959          50 :             case SC_SERVICE_GRADTAB:    xRet.set(xDrawGradTab);     break;
    1960          50 :             case SC_SERVICE_HATCHTAB:   xRet.set(xDrawHatchTab);    break;
    1961          52 :             case SC_SERVICE_BITMAPTAB:  xRet.set(xDrawBitmapTab);   break;
    1962          50 :             case SC_SERVICE_TRGRADTAB:  xRet.set(xDrawTrGradTab);   break;
    1963          84 :             case SC_SERVICE_MARKERTAB:  xRet.set(xDrawMarkerTab);   break;
    1964          50 :             case SC_SERVICE_DASHTAB:    xRet.set(xDrawDashTab);     break;
    1965         190 :             case SC_SERVICE_CHDATAPROV: xRet.set(xChartDataProv);   break;
    1966          62 :             case SC_SERVICE_VBAOBJECTPROVIDER: xRet.set(xObjProvider); break;
    1967             :         }
    1968             : 
    1969             :         // #i64497# If a chart is in a temporary document during clipoard paste,
    1970             :         // there should be no data provider, so that own data is used
    1971             :         bool bCreate =
    1972             :             ! ( nType == SC_SERVICE_CHDATAPROV &&
    1973        9614 :                 ( pDocShell->GetCreateMode() == SFX_CREATE_MODE_INTERNAL ));
    1974             :         // this should never happen, i.e. the temporary document should never be
    1975             :         // loaded, because this unlinks the data
    1976             :         OSL_ASSERT( bCreate );
    1977             : 
    1978        9614 :         if ( !xRet.is() && bCreate )
    1979             :         {
    1980        9496 :             xRet.set(ScServiceProvider::MakeInstance( nType, pDocShell ));
    1981             : 
    1982             :             //  store created instance
    1983        9476 :             switch ( nType )
    1984             :             {
    1985          48 :                 case SC_SERVICE_GRADTAB:    xDrawGradTab.set(xRet);     break;
    1986          48 :                 case SC_SERVICE_HATCHTAB:   xDrawHatchTab.set(xRet);    break;
    1987          50 :                 case SC_SERVICE_BITMAPTAB:  xDrawBitmapTab.set(xRet);   break;
    1988          48 :                 case SC_SERVICE_TRGRADTAB:  xDrawTrGradTab.set(xRet);   break;
    1989          80 :                 case SC_SERVICE_MARKERTAB:  xDrawMarkerTab.set(xRet);   break;
    1990          48 :                 case SC_SERVICE_DASHTAB:    xDrawDashTab.set(xRet);     break;
    1991          86 :                 case SC_SERVICE_CHDATAPROV: xChartDataProv.set(xRet);   break;
    1992          52 :                 case SC_SERVICE_VBAOBJECTPROVIDER: xObjProvider.set(xRet); break;
    1993             :             }
    1994             :         }
    1995             :     }
    1996             :     else
    1997             :     {
    1998             :         //  alles was ich nicht kenn, werf ich der SvxFmMSFactory an den Hals,
    1999             :         //  da wird dann 'ne Exception geworfen, wenn's nicht passt...
    2000             : 
    2001             :         try
    2002             :         {
    2003        1294 :             xRet = arguments == 0
    2004             :                 ? SvxFmMSFactory::createInstance(aServiceSpecifier)
    2005             :                 : SvxFmMSFactory::createInstanceWithArguments(
    2006         558 :                     aServiceSpecifier, *arguments);
    2007             :             // extra block to force deletion of the temporary before ScShapeObj ctor (setDelegator)
    2008             :         }
    2009         178 :         catch ( lang::ServiceNotRegisteredException & )
    2010             :         {
    2011             :         }
    2012             : 
    2013             :         //  if the drawing factory created a shape, a ScShapeObj has to be used
    2014             :         //  to support own properties like ImageMap:
    2015             : 
    2016         736 :         uno::Reference<drawing::XShape> xShape( xRet, uno::UNO_QUERY );
    2017         736 :         if ( xShape.is() )
    2018             :         {
    2019         458 :             xRet.clear();               // for aggregation, xShape must be the object's only ref
    2020         458 :             new ScShapeObj( xShape );   // aggregates object and modifies xShape
    2021         458 :             xRet.set(xShape);
    2022         736 :         }
    2023             :     }
    2024       20660 :     return xRet;
    2025             : }
    2026             : 
    2027       10328 : uno::Reference<uno::XInterface> SAL_CALL ScModelObj::createInstance(
    2028             :                                 const OUString& aServiceSpecifier )
    2029             :                                 throw(uno::Exception, uno::RuntimeException, std::exception)
    2030             : {
    2031       10328 :     SolarMutexGuard aGuard;
    2032       10328 :     return create(aServiceSpecifier, 0);
    2033             : }
    2034             : 
    2035          22 : uno::Reference<uno::XInterface> SAL_CALL ScModelObj::createInstanceWithArguments(
    2036             :                                 const OUString& ServiceSpecifier,
    2037             :                                 const uno::Sequence<uno::Any>& aArgs )
    2038             :                                 throw(uno::Exception, uno::RuntimeException, std::exception)
    2039             : {
    2040             :     //! unterscheiden zwischen eigenen Services und denen vom Drawing-Layer?
    2041             : 
    2042          22 :     SolarMutexGuard aGuard;
    2043          22 :     uno::Reference<uno::XInterface> xInt(create(ServiceSpecifier, &aArgs));
    2044             : 
    2045          22 :     if ( aArgs.getLength() )
    2046             :     {
    2047             :         //  used only for cell value binding so far - it can be initialized after creating
    2048             : 
    2049          22 :         uno::Reference<lang::XInitialization> xInit( xInt, uno::UNO_QUERY );
    2050          22 :         if ( xInit.is() )
    2051           8 :             xInit->initialize( aArgs );
    2052             :     }
    2053             : 
    2054          22 :     return xInt;
    2055             : }
    2056             : 
    2057         166 : uno::Sequence<OUString> SAL_CALL ScModelObj::getAvailableServiceNames()
    2058             :                                                 throw(uno::RuntimeException, std::exception)
    2059             : {
    2060         166 :     SolarMutexGuard aGuard;
    2061             : 
    2062             :     //! warum sind die Parameter bei concatServiceNames nicht const ???
    2063             :     //! return concatServiceNames( ScServiceProvider::GetAllServiceNames(),
    2064             :     //!                            SvxFmMSFactory::getAvailableServiceNames() );
    2065             : 
    2066         332 :     uno::Sequence<OUString> aMyServices(ScServiceProvider::GetAllServiceNames());
    2067         332 :     uno::Sequence<OUString> aDrawServices(SvxFmMSFactory::getAvailableServiceNames());
    2068             : 
    2069         332 :     return concatServiceNames( aMyServices, aDrawServices );
    2070             : }
    2071             : 
    2072             : // XServiceInfo
    2073           0 : OUString SAL_CALL ScModelObj::getImplementationName() throw(uno::RuntimeException, std::exception)
    2074             : {
    2075           0 :     return OUString( "ScModelObj" );
    2076             : }
    2077             : 
    2078        2266 : sal_Bool SAL_CALL ScModelObj::supportsService( const OUString& rServiceName )
    2079             :                                                     throw(uno::RuntimeException, std::exception)
    2080             : {
    2081        2266 :     return cppu::supportsService(this, rServiceName);
    2082             : }
    2083             : 
    2084        3004 : uno::Sequence<OUString> SAL_CALL ScModelObj::getSupportedServiceNames()
    2085             :                                                     throw(uno::RuntimeException, std::exception)
    2086             : {
    2087        3004 :     uno::Sequence<OUString> aRet(3);
    2088        3004 :     aRet[0] = SCMODELOBJ_SERVICE;
    2089        3004 :     aRet[1] = SCDOCSETTINGS_SERVICE;
    2090        3004 :     aRet[2] = SCDOC_SERVICE;
    2091        3004 :     return aRet;
    2092             : }
    2093             : 
    2094             : // XUnoTunnel
    2095             : 
    2096       46360 : sal_Int64 SAL_CALL ScModelObj::getSomething(
    2097             :                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException, std::exception)
    2098             : {
    2099       92720 :     if ( rId.getLength() == 16 &&
    2100       46360 :           0 == memcmp( getUnoTunnelId().getConstArray(),
    2101       92720 :                                     rId.getConstArray(), 16 ) )
    2102             :     {
    2103       11600 :         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
    2104             :     }
    2105             : 
    2106       69520 :     if ( rId.getLength() == 16 &&
    2107       34760 :         0 == memcmp( SfxObjectShell::getUnoTunnelId().getConstArray(),
    2108       69520 :                                     rId.getConstArray(), 16 ) )
    2109             :     {
    2110         692 :         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(pDocShell ));
    2111             :     }
    2112             : 
    2113             :     //  aggregated number formats supplier has XUnoTunnel, too
    2114             :     //  interface from aggregated object must be obtained via queryAggregation
    2115             : 
    2116       34068 :     sal_Int64 nRet = SfxBaseModel::getSomething( rId );
    2117       34068 :     if ( nRet )
    2118       31354 :         return nRet;
    2119             : 
    2120        2714 :     if ( GetFormatter().is() )
    2121             :     {
    2122        2714 :         const uno::Type& rTunnelType = cppu::UnoType<lang::XUnoTunnel>::get();
    2123        2714 :         uno::Any aNumTunnel(xNumberAgg->queryAggregation(rTunnelType));
    2124        2714 :         if(aNumTunnel.getValueType() == rTunnelType)
    2125             :         {
    2126             :             uno::Reference<lang::XUnoTunnel> xTunnelAgg(
    2127        2714 :                 *(uno::Reference<lang::XUnoTunnel>*)aNumTunnel.getValue());
    2128        2714 :             return xTunnelAgg->getSomething( rId );
    2129           0 :         }
    2130             :     }
    2131             : 
    2132           0 :     return 0;
    2133             : }
    2134             : 
    2135             : namespace
    2136             : {
    2137             :     class theScModelObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScModelObjUnoTunnelId> {};
    2138             : }
    2139             : 
    2140       57960 : const uno::Sequence<sal_Int8>& ScModelObj::getUnoTunnelId()
    2141             : {
    2142       57960 :     return theScModelObjUnoTunnelId::get().getSeq();
    2143             : }
    2144             : 
    2145       11600 : ScModelObj* ScModelObj::getImplementation( const uno::Reference<uno::XInterface> xObj )
    2146             : {
    2147       11600 :     ScModelObj* pRet = NULL;
    2148       11600 :     uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
    2149       11600 :     if (xUT.is())
    2150       11600 :         pRet = reinterpret_cast<ScModelObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
    2151       11600 :     return pRet;
    2152             : }
    2153             : 
    2154             : // XChangesNotifier
    2155             : 
    2156          50 : void ScModelObj::addChangesListener( const uno::Reference< util::XChangesListener >& aListener )
    2157             :     throw (uno::RuntimeException, std::exception)
    2158             : {
    2159          50 :     SolarMutexGuard aGuard;
    2160          50 :     maChangesListeners.addInterface( aListener );
    2161          50 : }
    2162             : 
    2163           0 : void ScModelObj::removeChangesListener( const uno::Reference< util::XChangesListener >& aListener )
    2164             :     throw (uno::RuntimeException, std::exception)
    2165             : {
    2166           0 :     SolarMutexGuard aGuard;
    2167           0 :     maChangesListeners.removeInterface( aListener );
    2168           0 : }
    2169             : 
    2170          42 : bool ScModelObj::HasChangesListeners() const
    2171             : {
    2172          42 :     if ( maChangesListeners.getLength() > 0 )
    2173           0 :         return true;
    2174             : 
    2175             :     // "change" event set in any sheet?
    2176          42 :     return pDocShell && pDocShell->GetDocument().HasAnySheetEventScript(SC_SHEETEVENT_CHANGE);
    2177             : }
    2178             : 
    2179           0 : void ScModelObj::NotifyChanges( const OUString& rOperation, const ScRangeList& rRanges,
    2180             :     const uno::Sequence< beans::PropertyValue >& rProperties )
    2181             : {
    2182           0 :     if ( pDocShell && HasChangesListeners() )
    2183             :     {
    2184           0 :         util::ChangesEvent aEvent;
    2185           0 :         aEvent.Source.set( static_cast< cppu::OWeakObject* >( this ) );
    2186           0 :         aEvent.Base <<= aEvent.Source;
    2187             : 
    2188           0 :         size_t nRangeCount = rRanges.size();
    2189           0 :         aEvent.Changes.realloc( static_cast< sal_Int32 >( nRangeCount ) );
    2190           0 :         for ( size_t nIndex = 0; nIndex < nRangeCount; ++nIndex )
    2191             :         {
    2192           0 :             uno::Reference< table::XCellRange > xRangeObj;
    2193             : 
    2194           0 :             ScRange aRange( *rRanges[ nIndex ] );
    2195           0 :             if ( aRange.aStart == aRange.aEnd )
    2196             :             {
    2197           0 :                 xRangeObj.set( new ScCellObj( pDocShell, aRange.aStart ) );
    2198             :             }
    2199             :             else
    2200             :             {
    2201           0 :                 xRangeObj.set( new ScCellRangeObj( pDocShell, aRange ) );
    2202             :             }
    2203             : 
    2204           0 :             util::ElementChange& rChange = aEvent.Changes[ static_cast< sal_Int32 >( nIndex ) ];
    2205           0 :             rChange.Accessor <<= rOperation;
    2206           0 :             rChange.Element <<= rProperties;
    2207           0 :             rChange.ReplacedElement <<= xRangeObj;
    2208           0 :         }
    2209             : 
    2210           0 :         ::cppu::OInterfaceIteratorHelper aIter( maChangesListeners );
    2211           0 :         while ( aIter.hasMoreElements() )
    2212             :         {
    2213             :             try
    2214             :             {
    2215           0 :                 static_cast< util::XChangesListener* >( aIter.next() )->changesOccurred( aEvent );
    2216             :             }
    2217           0 :             catch( uno::Exception& )
    2218             :             {
    2219             :             }
    2220           0 :         }
    2221             :     }
    2222             : 
    2223             :     // handle sheet events
    2224             :     //! separate method with ScMarkData? Then change HasChangesListeners back.
    2225           0 :     if ( rOperation.equalsAscii("cell-change") && pDocShell )
    2226             :     {
    2227           0 :         ScMarkData aMarkData;
    2228           0 :         aMarkData.MarkFromRangeList( rRanges, false );
    2229           0 :         ScDocument& rDoc = pDocShell->GetDocument();
    2230           0 :         SCTAB nTabCount = rDoc.GetTableCount();
    2231           0 :         ScMarkData::iterator itr = aMarkData.begin(), itrEnd = aMarkData.end();
    2232           0 :         for (; itr != itrEnd && *itr < nTabCount; ++itr)
    2233             :         {
    2234           0 :             SCTAB nTab = *itr;
    2235           0 :             const ScSheetEvents* pEvents = rDoc.GetSheetEvents(nTab);
    2236           0 :             if (pEvents)
    2237             :             {
    2238           0 :                 const OUString* pScript = pEvents->GetScript(SC_SHEETEVENT_CHANGE);
    2239           0 :                 if (pScript)
    2240             :                 {
    2241           0 :                     ScRangeList aTabRanges;     // collect ranges on this sheet
    2242           0 :                     size_t nRangeCount = rRanges.size();
    2243           0 :                     for ( size_t nIndex = 0; nIndex < nRangeCount; ++nIndex )
    2244             :                     {
    2245           0 :                         ScRange aRange( *rRanges[ nIndex ] );
    2246           0 :                         if ( aRange.aStart.Tab() == nTab )
    2247           0 :                             aTabRanges.Append( aRange );
    2248             :                     }
    2249           0 :                     size_t nTabRangeCount = aTabRanges.size();
    2250           0 :                     if ( nTabRangeCount > 0 )
    2251             :                     {
    2252           0 :                         uno::Reference<uno::XInterface> xTarget;
    2253           0 :                         if ( nTabRangeCount == 1 )
    2254             :                         {
    2255           0 :                             ScRange aRange( *aTabRanges[ 0 ] );
    2256           0 :                             if ( aRange.aStart == aRange.aEnd )
    2257           0 :                                 xTarget.set( static_cast<cppu::OWeakObject*>( new ScCellObj( pDocShell, aRange.aStart ) ) );
    2258             :                             else
    2259           0 :                                 xTarget.set( static_cast<cppu::OWeakObject*>( new ScCellRangeObj( pDocShell, aRange ) ) );
    2260             :                         }
    2261             :                         else
    2262           0 :                             xTarget.set( static_cast<cppu::OWeakObject*>( new ScCellRangesObj( pDocShell, aTabRanges ) ) );
    2263             : 
    2264           0 :                         uno::Sequence<uno::Any> aParams(1);
    2265           0 :                         aParams[0] <<= xTarget;
    2266             : 
    2267           0 :                         uno::Any aRet;
    2268           0 :                         uno::Sequence<sal_Int16> aOutArgsIndex;
    2269           0 :                         uno::Sequence<uno::Any> aOutArgs;
    2270             : 
    2271           0 :                         /*ErrCode eRet =*/ pDocShell->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
    2272           0 :                     }
    2273             :                 }
    2274             :             }
    2275           0 :         }
    2276             :     }
    2277           0 : }
    2278             : 
    2279           0 : void ScModelObj::HandleCalculateEvents()
    2280             : {
    2281           0 :     if (pDocShell)
    2282             :     {
    2283           0 :         ScDocument& rDoc = pDocShell->GetDocument();
    2284             :         // don't call events before the document is visible
    2285             :         // (might also set a flag on SFX_EVENT_LOADFINISHED and only disable while loading)
    2286           0 :         if ( rDoc.IsDocVisible() )
    2287             :         {
    2288           0 :             SCTAB nTabCount = rDoc.GetTableCount();
    2289           0 :             for (SCTAB nTab = 0; nTab < nTabCount; nTab++)
    2290             :             {
    2291           0 :                 if (rDoc.HasCalcNotification(nTab))
    2292             :                 {
    2293           0 :                     if (const ScSheetEvents* pEvents = rDoc.GetSheetEvents( nTab ))
    2294             :                     {
    2295           0 :                         if (const OUString* pScript = pEvents->GetScript(SC_SHEETEVENT_CALCULATE))
    2296             :                         {
    2297           0 :                             uno::Any aRet;
    2298           0 :                             uno::Sequence<uno::Any> aParams;
    2299           0 :                             uno::Sequence<sal_Int16> aOutArgsIndex;
    2300           0 :                             uno::Sequence<uno::Any> aOutArgs;
    2301           0 :                             pDocShell->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
    2302             :                         }
    2303             :                     }
    2304             : 
    2305             :                     try
    2306             :                     {
    2307           0 :                         uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( rDoc.GetVbaEventProcessor(), uno::UNO_SET_THROW );
    2308           0 :                         uno::Sequence< uno::Any > aArgs( 1 );
    2309           0 :                         aArgs[ 0 ] <<= nTab;
    2310           0 :                         xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_CALCULATE ), aArgs );
    2311             :                     }
    2312           0 :                     catch( uno::Exception& )
    2313             :                     {
    2314             :                     }
    2315             :                 }
    2316             :             }
    2317             :         }
    2318           0 :         rDoc.ResetCalcNotifications();
    2319             :     }
    2320           0 : }
    2321             : 
    2322             : // XOpenCLSelection
    2323             : 
    2324           0 : sal_Bool ScModelObj::isOpenCLEnabled()
    2325             :     throw (uno::RuntimeException, std::exception)
    2326             : {
    2327           0 :     return ScInterpreter::GetGlobalConfig().mbOpenCLEnabled;
    2328             : }
    2329             : 
    2330           0 : void ScModelObj::enableOpenCL(sal_Bool bEnable)
    2331             :     throw (uno::RuntimeException, std::exception)
    2332             : {
    2333           0 :     ScCalcConfig aConfig = ScInterpreter::GetGlobalConfig();
    2334           0 :     aConfig.mbOpenCLEnabled = bEnable;
    2335           0 :     ScInterpreter::SetGlobalConfig(aConfig);
    2336           0 : }
    2337             : 
    2338           0 : void ScModelObj::enableAutomaticDeviceSelection(sal_Bool bForce)
    2339             :     throw (uno::RuntimeException, std::exception)
    2340             : {
    2341           0 :     ScCalcConfig aConfig = ScInterpreter::GetGlobalConfig();
    2342           0 :     aConfig.mbOpenCLAutoSelect = true;
    2343           0 :     ScInterpreter::SetGlobalConfig(aConfig);
    2344           0 :     ScFormulaOptions aOptions = SC_MOD()->GetFormulaOptions();
    2345           0 :     aOptions.SetCalcConfig(aConfig);
    2346           0 :     SC_MOD()->SetFormulaOptions(aOptions);
    2347           0 :     sc::FormulaGroupInterpreter::switchOpenCLDevice(OUString(), true, bForce);
    2348           0 : }
    2349             : 
    2350           0 : void ScModelObj::disableAutomaticDeviceSelection()
    2351             :     throw (uno::RuntimeException, std::exception)
    2352             : {
    2353           0 :     ScCalcConfig aConfig = ScInterpreter::GetGlobalConfig();
    2354           0 :     aConfig.mbOpenCLAutoSelect = false;
    2355           0 :     ScInterpreter::SetGlobalConfig(aConfig);
    2356           0 :     ScFormulaOptions aOptions = SC_MOD()->GetFormulaOptions();
    2357           0 :     aOptions.SetCalcConfig(aConfig);
    2358           0 :     SC_MOD()->SetFormulaOptions(aOptions);
    2359           0 : }
    2360             : 
    2361           0 : void ScModelObj::selectOpenCLDevice( sal_Int32 nPlatform, sal_Int32 nDevice )
    2362             :     throw (uno::RuntimeException, std::exception)
    2363             : {
    2364           0 :     if(nPlatform < 0 || nDevice < 0)
    2365           0 :         throw uno::RuntimeException();
    2366             : 
    2367           0 :     std::vector<sc::OpenCLPlatformInfo> aPlatformInfo;
    2368           0 :     sc::FormulaGroupInterpreter::fillOpenCLInfo(aPlatformInfo);
    2369           0 :     if(size_t(nPlatform) >= aPlatformInfo.size())
    2370           0 :         throw uno::RuntimeException();
    2371             : 
    2372           0 :     if(size_t(nDevice) >= aPlatformInfo[nPlatform].maDevices.size())
    2373           0 :         throw uno::RuntimeException();
    2374             : 
    2375           0 :     OUString aDeviceString = aPlatformInfo[nPlatform].maVendor + " " + aPlatformInfo[nPlatform].maDevices[nDevice].maName;
    2376           0 :     sc::FormulaGroupInterpreter::switchOpenCLDevice(aDeviceString, false);
    2377           0 : }
    2378             : 
    2379           0 : sal_Int32 ScModelObj::getPlatformID()
    2380             :     throw (uno::RuntimeException, std::exception)
    2381             : {
    2382             :     sal_Int32 nPlatformId;
    2383             :     sal_Int32 nDeviceId;
    2384           0 :     sc::FormulaGroupInterpreter::getOpenCLDeviceInfo(nDeviceId, nPlatformId);
    2385           0 :     return nPlatformId;
    2386             : }
    2387             : 
    2388           0 : sal_Int32 ScModelObj::getDeviceID()
    2389             :     throw (uno::RuntimeException, std::exception)
    2390             : {
    2391             :     sal_Int32 nPlatformId;
    2392             :     sal_Int32 nDeviceId;
    2393           0 :     sc::FormulaGroupInterpreter::getOpenCLDeviceInfo(nDeviceId, nPlatformId);
    2394           0 :     return nDeviceId;
    2395             : }
    2396             : 
    2397           0 : uno::Sequence< sheet::opencl::OpenCLPlatform > ScModelObj::getOpenCLPlatforms()
    2398             :     throw (uno::RuntimeException, std::exception)
    2399             : {
    2400           0 :     std::vector<sc::OpenCLPlatformInfo> aPlatformInfo;
    2401           0 :     sc::FormulaGroupInterpreter::fillOpenCLInfo(aPlatformInfo);
    2402             : 
    2403           0 :     uno::Sequence<sheet::opencl::OpenCLPlatform> aRet(aPlatformInfo.size());
    2404           0 :     for(size_t i = 0; i < aPlatformInfo.size(); ++i)
    2405             :     {
    2406           0 :         aRet[i].Name = aPlatformInfo[i].maName;
    2407           0 :         aRet[i].Vendor = aPlatformInfo[i].maVendor;
    2408             : 
    2409           0 :         aRet[i].Devices.realloc(aPlatformInfo[i].maDevices.size());
    2410           0 :         for(size_t j = 0; j < aPlatformInfo[i].maDevices.size(); ++j)
    2411             :         {
    2412           0 :             const sc::OpenCLDeviceInfo& rDevice = aPlatformInfo[i].maDevices[j];
    2413           0 :             aRet[i].Devices[j].Name = rDevice.maName;
    2414           0 :             aRet[i].Devices[j].Vendor = rDevice.maVendor;
    2415           0 :             aRet[i].Devices[j].Driver = rDevice.maDriver;
    2416             :         }
    2417             :     }
    2418             : 
    2419           0 :     return aRet;
    2420             : }
    2421             : 
    2422          50 : ScDrawPagesObj::ScDrawPagesObj(ScDocShell* pDocSh) :
    2423          50 :     pDocShell( pDocSh )
    2424             : {
    2425          50 :     pDocShell->GetDocument().AddUnoObject(*this);
    2426          50 : }
    2427             : 
    2428         150 : ScDrawPagesObj::~ScDrawPagesObj()
    2429             : {
    2430          50 :     SolarMutexGuard g;
    2431             : 
    2432          50 :     if (pDocShell)
    2433          35 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    2434         100 : }
    2435             : 
    2436         261 : void ScDrawPagesObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    2437             : {
    2438             :     //  Referenz-Update interessiert hier nicht
    2439             : 
    2440         261 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
    2441         261 :     if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING )
    2442             :     {
    2443          15 :         pDocShell = NULL;       // ungueltig geworden
    2444             :     }
    2445         261 : }
    2446             : 
    2447         116 : uno::Reference<drawing::XDrawPage> ScDrawPagesObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const
    2448             : {
    2449         116 :     if (pDocShell)
    2450             :     {
    2451         116 :         ScDrawLayer* pDrawLayer = pDocShell->MakeDrawLayer();
    2452             :         OSL_ENSURE(pDrawLayer,"kann Draw-Layer nicht anlegen");
    2453         116 :         if ( pDrawLayer && nIndex >= 0 && nIndex < pDocShell->GetDocument().GetTableCount() )
    2454             :         {
    2455         114 :             SdrPage* pPage = pDrawLayer->GetPage((sal_uInt16)nIndex);
    2456             :             OSL_ENSURE(pPage,"Draw-Page nicht gefunden");
    2457         114 :             if (pPage)
    2458             :             {
    2459         114 :                 return uno::Reference<drawing::XDrawPage> (pPage->getUnoPage(), uno::UNO_QUERY);
    2460             :             }
    2461             :         }
    2462             :     }
    2463           2 :     return NULL;
    2464             : }
    2465             : 
    2466             : // XDrawPages
    2467             : 
    2468          14 : uno::Reference<drawing::XDrawPage> SAL_CALL ScDrawPagesObj::insertNewByIndex( sal_Int32 nPos )
    2469             :                                             throw(uno::RuntimeException, std::exception)
    2470             : {
    2471          14 :     SolarMutexGuard aGuard;
    2472          14 :     uno::Reference<drawing::XDrawPage> xRet;
    2473          14 :     if (pDocShell)
    2474             :     {
    2475          14 :         OUString aNewName;
    2476          14 :         pDocShell->GetDocument().CreateValidTabName(aNewName);
    2477          14 :         if ( pDocShell->GetDocFunc().InsertTable( static_cast<SCTAB>(nPos),
    2478          14 :                                                   aNewName, true, true ) )
    2479          14 :             xRet.set(GetObjectByIndex_Impl( nPos ));
    2480             :     }
    2481          14 :     return xRet;
    2482             : }
    2483             : 
    2484           2 : void SAL_CALL ScDrawPagesObj::remove( const uno::Reference<drawing::XDrawPage>& xPage )
    2485             :                                             throw(uno::RuntimeException, std::exception)
    2486             : {
    2487           2 :     SolarMutexGuard aGuard;
    2488           2 :     SvxDrawPage* pImp = SvxDrawPage::getImplementation( xPage );
    2489           2 :     if ( pDocShell && pImp )
    2490             :     {
    2491           2 :         SdrPage* pPage = pImp->GetSdrPage();
    2492           2 :         if (pPage)
    2493             :         {
    2494           2 :             SCTAB nPageNum = static_cast<SCTAB>(pPage->GetPageNum());
    2495           2 :             pDocShell->GetDocFunc().DeleteTable( nPageNum, true, true );
    2496             :         }
    2497           2 :     }
    2498           2 : }
    2499             : 
    2500             : // XIndexAccess
    2501             : 
    2502          46 : sal_Int32 SAL_CALL ScDrawPagesObj::getCount() throw(uno::RuntimeException, std::exception)
    2503             : {
    2504          46 :     SolarMutexGuard aGuard;
    2505          46 :     if (pDocShell)
    2506          46 :         return pDocShell->GetDocument().GetTableCount();
    2507           0 :     return 0;
    2508             : }
    2509             : 
    2510         102 : uno::Any SAL_CALL ScDrawPagesObj::getByIndex( sal_Int32 nIndex )
    2511             :                             throw(lang::IndexOutOfBoundsException,
    2512             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2513             : {
    2514         102 :     SolarMutexGuard aGuard;
    2515         204 :     uno::Reference<drawing::XDrawPage> xPage(GetObjectByIndex_Impl(nIndex));
    2516         102 :     if (xPage.is())
    2517         200 :         return uno::makeAny(xPage);
    2518             :     else
    2519         104 :         throw lang::IndexOutOfBoundsException();
    2520             : }
    2521             : 
    2522           2 : uno::Type SAL_CALL ScDrawPagesObj::getElementType() throw(uno::RuntimeException, std::exception)
    2523             : {
    2524           2 :     SolarMutexGuard aGuard;
    2525           2 :     return cppu::UnoType<drawing::XDrawPage>::get();
    2526             : }
    2527             : 
    2528           2 : sal_Bool SAL_CALL ScDrawPagesObj::hasElements() throw(uno::RuntimeException, std::exception)
    2529             : {
    2530           2 :     SolarMutexGuard aGuard;
    2531           2 :     return ( getCount() != 0 );
    2532             : }
    2533             : 
    2534        2724 : ScTableSheetsObj::ScTableSheetsObj(ScDocShell* pDocSh) :
    2535        2724 :     pDocShell( pDocSh )
    2536             : {
    2537        2724 :     pDocShell->GetDocument().AddUnoObject(*this);
    2538        2724 : }
    2539             : 
    2540        8172 : ScTableSheetsObj::~ScTableSheetsObj()
    2541             : {
    2542        2724 :     SolarMutexGuard g;
    2543             : 
    2544        2724 :     if (pDocShell)
    2545        2501 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    2546        5448 : }
    2547             : 
    2548        7044 : void ScTableSheetsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    2549             : {
    2550             :     //  Referenz-Update interessiert hier nicht
    2551             : 
    2552        7044 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
    2553        7044 :     if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING )
    2554             :     {
    2555         223 :         pDocShell = NULL;       // ungueltig geworden
    2556             :     }
    2557        7044 : }
    2558             : 
    2559             : // XSpreadsheets
    2560             : 
    2561        2412 : ScTableSheetObj* ScTableSheetsObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const
    2562             : {
    2563        2412 :     if ( pDocShell && nIndex >= 0 && nIndex < pDocShell->GetDocument().GetTableCount() )
    2564        2410 :         return new ScTableSheetObj( pDocShell, static_cast<SCTAB>(nIndex) );
    2565             : 
    2566           2 :     return NULL;
    2567             : }
    2568             : 
    2569         328 : ScTableSheetObj* ScTableSheetsObj::GetObjectByName_Impl(const OUString& aName) const
    2570             : {
    2571         328 :     if (pDocShell)
    2572             :     {
    2573             :         SCTAB nIndex;
    2574         328 :         if ( pDocShell->GetDocument().GetTable( aName, nIndex ) )
    2575         328 :             return new ScTableSheetObj( pDocShell, nIndex );
    2576             :     }
    2577           0 :     return NULL;
    2578             : }
    2579             : 
    2580         158 : void SAL_CALL ScTableSheetsObj::insertNewByName( const OUString& aName, sal_Int16 nPosition )
    2581             :                                                 throw(uno::RuntimeException, std::exception)
    2582             : {
    2583         158 :     SolarMutexGuard aGuard;
    2584         158 :     bool bDone = false;
    2585         158 :     if (pDocShell)
    2586             :     {
    2587         158 :         OUString aNamStr(aName);
    2588         158 :         bDone = pDocShell->GetDocFunc().InsertTable( nPosition, aNamStr, true, true );
    2589             :     }
    2590         158 :     if (!bDone)
    2591           0 :         throw uno::RuntimeException();      // no other exceptions specified
    2592         158 : }
    2593             : 
    2594           0 : void SAL_CALL ScTableSheetsObj::moveByName( const OUString& aName, sal_Int16 nDestination )
    2595             :     throw(uno::RuntimeException, std::exception)
    2596             : {
    2597           0 :     SolarMutexGuard aGuard;
    2598           0 :     bool bDone = false;
    2599           0 :     if (pDocShell)
    2600             :     {
    2601             :         SCTAB nSource;
    2602           0 :         if ( pDocShell->GetDocument().GetTable( aName, nSource ) )
    2603           0 :             bDone = pDocShell->MoveTable( nSource, nDestination, false, true );
    2604             :     }
    2605           0 :     if (!bDone)
    2606           0 :         throw uno::RuntimeException();      // no other exceptions specified
    2607           0 : }
    2608             : 
    2609           0 : void SAL_CALL ScTableSheetsObj::copyByName( const OUString& aName,
    2610             :     const OUString& aCopy, sal_Int16 nDestination )
    2611             :         throw(uno::RuntimeException, std::exception)
    2612             : {
    2613           0 :     SolarMutexGuard aGuard;
    2614           0 :     bool bDone = false;
    2615           0 :     if (pDocShell)
    2616             :     {
    2617           0 :         OUString aNewStr(aCopy);
    2618             :         SCTAB nSource;
    2619           0 :         if ( pDocShell->GetDocument().GetTable( aName, nSource ) )
    2620             :         {
    2621           0 :             bDone = pDocShell->MoveTable( nSource, nDestination, true, true );
    2622           0 :             if (bDone)
    2623             :             {
    2624             :                 // #i92477# any index past the last sheet means "append" in MoveTable
    2625           0 :                 SCTAB nResultTab = static_cast<SCTAB>(nDestination);
    2626           0 :                 SCTAB nTabCount = pDocShell->GetDocument().GetTableCount();    // count after copying
    2627           0 :                 if (nResultTab >= nTabCount)
    2628           0 :                     nResultTab = nTabCount - 1;
    2629             : 
    2630           0 :                 bDone = pDocShell->GetDocFunc().RenameTable( nResultTab, aNewStr,
    2631           0 :                                                              true, true );
    2632             :             }
    2633           0 :         }
    2634             :     }
    2635           0 :     if (!bDone)
    2636           0 :         throw uno::RuntimeException();      // no other exceptions specified
    2637           0 : }
    2638             : 
    2639           0 : void SAL_CALL ScTableSheetsObj::insertByName( const OUString& aName, const uno::Any& aElement )
    2640             :                             throw(lang::IllegalArgumentException, container::ElementExistException,
    2641             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2642             : {
    2643           0 :     SolarMutexGuard aGuard;
    2644           0 :     bool bDone = false;
    2645           0 :     bool bIllArg = false;
    2646             : 
    2647             :     //! Type of aElement can be some specific interface instead of XInterface
    2648             : 
    2649           0 :     if ( pDocShell )
    2650             :     {
    2651           0 :         uno::Reference<uno::XInterface> xInterface(aElement, uno::UNO_QUERY);
    2652           0 :         if ( xInterface.is() )
    2653             :         {
    2654           0 :             ScTableSheetObj* pSheetObj = ScTableSheetObj::getImplementation( xInterface );
    2655           0 :             if ( pSheetObj && !pSheetObj->GetDocShell() )   // noch nicht eingefuegt?
    2656             :             {
    2657           0 :                 ScDocument& rDoc = pDocShell->GetDocument();
    2658           0 :                 OUString aNamStr(aName);
    2659             :                 SCTAB nDummy;
    2660           0 :                 if ( rDoc.GetTable( aNamStr, nDummy ) )
    2661             :                 {
    2662             :                     //  name already exists
    2663           0 :                     throw container::ElementExistException();
    2664             :                 }
    2665             :                 else
    2666             :                 {
    2667           0 :                     SCTAB nPosition = rDoc.GetTableCount();
    2668           0 :                     bDone = pDocShell->GetDocFunc().InsertTable( nPosition, aNamStr,
    2669           0 :                                                                  true, true );
    2670           0 :                     if (bDone)
    2671           0 :                         pSheetObj->InitInsertSheet( pDocShell, nPosition );
    2672             :                     //  Dokument und neuen Range am Objekt setzen
    2673           0 :                 }
    2674             :             }
    2675             :             else
    2676           0 :                 bIllArg = true;
    2677             :         }
    2678             :         else
    2679           0 :             bIllArg = true;
    2680             :     }
    2681             : 
    2682           0 :     if (!bDone)
    2683             :     {
    2684           0 :         if (bIllArg)
    2685           0 :             throw lang::IllegalArgumentException();
    2686             :         else
    2687           0 :             throw uno::RuntimeException();      // ElementExistException is handled above
    2688           0 :     }
    2689           0 : }
    2690             : 
    2691           0 : void SAL_CALL ScTableSheetsObj::replaceByName( const OUString& aName, const uno::Any& aElement )
    2692             :                             throw(lang::IllegalArgumentException, container::NoSuchElementException,
    2693             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2694             : {
    2695           0 :     SolarMutexGuard aGuard;
    2696           0 :     bool bDone = false;
    2697           0 :     bool bIllArg = false;
    2698             : 
    2699             :     //! Type of aElement can be some specific interface instead of XInterface
    2700             : 
    2701           0 :     if ( pDocShell )
    2702             :     {
    2703           0 :         uno::Reference<uno::XInterface> xInterface(aElement, uno::UNO_QUERY);
    2704           0 :         if ( xInterface.is() )
    2705             :         {
    2706           0 :             ScTableSheetObj* pSheetObj = ScTableSheetObj::getImplementation( xInterface );
    2707           0 :             if ( pSheetObj && !pSheetObj->GetDocShell() )   // noch nicht eingefuegt?
    2708             :             {
    2709             :                 SCTAB nPosition;
    2710           0 :                 if ( pDocShell->GetDocument().GetTable( aName, nPosition ) )
    2711             :                 {
    2712           0 :                     if ( pDocShell->GetDocFunc().DeleteTable( nPosition, true, true ) )
    2713             :                     {
    2714             :                         //  InsertTable kann jetzt eigentlich nicht schiefgehen...
    2715           0 :                         OUString aNamStr(aName);
    2716           0 :                         bDone = pDocShell->GetDocFunc().InsertTable( nPosition, aNamStr, true, true );
    2717           0 :                         if (bDone)
    2718           0 :                             pSheetObj->InitInsertSheet( pDocShell, nPosition );
    2719             :                     }
    2720             :                 }
    2721             :                 else
    2722             :                 {
    2723             :                     //  not found
    2724           0 :                     throw container::NoSuchElementException();
    2725             :                 }
    2726             :             }
    2727             :             else
    2728           0 :                 bIllArg = true;
    2729             :         }
    2730             :         else
    2731           0 :             bIllArg = true;
    2732             :     }
    2733             : 
    2734           0 :     if (!bDone)
    2735             :     {
    2736           0 :         if (bIllArg)
    2737           0 :             throw lang::IllegalArgumentException();
    2738             :         else
    2739           0 :             throw uno::RuntimeException();      // NoSuchElementException is handled above
    2740           0 :     }
    2741           0 : }
    2742             : 
    2743          36 : void SAL_CALL ScTableSheetsObj::removeByName( const OUString& aName )
    2744             :                                 throw(container::NoSuchElementException,
    2745             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2746             : {
    2747          36 :     SolarMutexGuard aGuard;
    2748          36 :     bool bDone = false;
    2749          36 :     if (pDocShell)
    2750             :     {
    2751             :         SCTAB nIndex;
    2752          36 :         if ( pDocShell->GetDocument().GetTable( aName, nIndex ) )
    2753          34 :             bDone = pDocShell->GetDocFunc().DeleteTable( nIndex, true, true );
    2754             :         else // not found
    2755           2 :             throw container::NoSuchElementException();
    2756             :     }
    2757             : 
    2758          34 :     if (!bDone)
    2759           0 :         throw uno::RuntimeException();      // NoSuchElementException is handled above
    2760          34 : }
    2761             : 
    2762          20 : sal_Int32 ScTableSheetsObj::importSheet(
    2763             :     const uno::Reference < sheet::XSpreadsheetDocument > & xDocSrc,
    2764             :     const OUString& srcName, const sal_Int32 nDestPosition )
    2765             :         throw( lang::IllegalArgumentException, lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception )
    2766             : {
    2767             :     //pDocShell is the destination
    2768          20 :     ScDocument& rDocDest = pDocShell->GetDocument();
    2769             : 
    2770             :     // Source document docShell
    2771          20 :     if ( !xDocSrc.is() )
    2772           0 :         throw uno::RuntimeException();
    2773          20 :     ScModelObj* pObj = ScModelObj::getImplementation(xDocSrc);
    2774          20 :     ScDocShell* pDocShellSrc = static_cast<ScDocShell*>(pObj->GetEmbeddedObject());
    2775             : 
    2776             :     // SourceSheet Position and does srcName exists ?
    2777             :     SCTAB nIndexSrc;
    2778          20 :     if ( !pDocShellSrc->GetDocument().GetTable( srcName, nIndexSrc ) )
    2779           0 :         throw lang::IllegalArgumentException();
    2780             : 
    2781             :     // Check the validity of destination index.
    2782          20 :     SCTAB nCount = rDocDest.GetTableCount();
    2783          20 :     SCTAB nIndexDest = static_cast<SCTAB>(nDestPosition);
    2784          20 :     if (nIndexDest > nCount || nIndexDest < 0)
    2785           0 :         throw lang::IndexOutOfBoundsException();
    2786             : 
    2787             :     // Transfert Tab
    2788          20 :     bool bInsertNew = true;
    2789          20 :     bool bNotifyAndPaint = true;
    2790             :     pDocShell->TransferTab(
    2791          20 :         *pDocShellSrc, nIndexSrc, nIndexDest, bInsertNew, bNotifyAndPaint );
    2792             : 
    2793          20 :     return nIndexDest;
    2794             : }
    2795             : 
    2796             : // XCellRangesAccess
    2797             : 
    2798           0 : uno::Reference< table::XCell > SAL_CALL ScTableSheetsObj::getCellByPosition( sal_Int32 nColumn, sal_Int32 nRow, sal_Int32 nSheet )
    2799             :     throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
    2800             : {
    2801           0 :     SolarMutexGuard aGuard;
    2802           0 :     uno::Reference<table::XCellRange> xSheet(static_cast<ScCellRangeObj*>(GetObjectByIndex_Impl((sal_uInt16)nSheet)));
    2803           0 :     if (! xSheet.is())
    2804           0 :         throw lang::IndexOutOfBoundsException();
    2805             : 
    2806           0 :     return xSheet->getCellByPosition(nColumn, nRow);
    2807             : }
    2808             : 
    2809           0 : uno::Reference< table::XCellRange > SAL_CALL ScTableSheetsObj::getCellRangeByPosition( sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom, sal_Int32 nSheet )
    2810             :     throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
    2811             : {
    2812           0 :     SolarMutexGuard aGuard;
    2813           0 :     uno::Reference<table::XCellRange> xSheet(static_cast<ScCellRangeObj*>(GetObjectByIndex_Impl((sal_uInt16)nSheet)));
    2814           0 :     if (! xSheet.is())
    2815           0 :         throw lang::IndexOutOfBoundsException();
    2816             : 
    2817           0 :     return xSheet->getCellRangeByPosition(nLeft, nTop, nRight, nBottom);
    2818             : }
    2819             : 
    2820           0 : uno::Sequence < uno::Reference< table::XCellRange > > SAL_CALL ScTableSheetsObj::getCellRangesByName( const OUString& aRange )
    2821             :     throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    2822             : {
    2823           0 :     SolarMutexGuard aGuard;
    2824           0 :     uno::Sequence < uno::Reference < table::XCellRange > > xRet;
    2825             : 
    2826           0 :     ScRangeList aRangeList;
    2827           0 :     ScDocument& rDoc = pDocShell->GetDocument();
    2828           0 :     if (ScRangeStringConverter::GetRangeListFromString( aRangeList, aRange, &rDoc, ::formula::FormulaGrammar::CONV_OOO, ';' ))
    2829             :     {
    2830           0 :         size_t nCount = aRangeList.size();
    2831           0 :         if (nCount)
    2832             :         {
    2833           0 :             xRet.realloc(nCount);
    2834           0 :             for( size_t nIndex = 0; nIndex < nCount; nIndex++ )
    2835             :             {
    2836           0 :                 const ScRange* pRange = aRangeList[ nIndex ];
    2837           0 :                 if( pRange )
    2838           0 :                     xRet[nIndex] = new ScCellRangeObj(pDocShell, *pRange);
    2839             :             }
    2840             :         }
    2841             :         else
    2842           0 :             throw lang::IllegalArgumentException();
    2843             :     }
    2844             :     else
    2845           0 :         throw lang::IllegalArgumentException();
    2846           0 :     return xRet;
    2847             : }
    2848             : 
    2849             : // XEnumerationAccess
    2850             : 
    2851           4 : uno::Reference<container::XEnumeration> SAL_CALL ScTableSheetsObj::createEnumeration()
    2852             :                                                     throw(uno::RuntimeException, std::exception)
    2853             : {
    2854           4 :     SolarMutexGuard aGuard;
    2855           4 :     return new ScIndexEnumeration(this, OUString("com.sun.star.sheet.SpreadsheetsEnumeration"));
    2856             : }
    2857             : 
    2858             : // XIndexAccess
    2859             : 
    2860         636 : sal_Int32 SAL_CALL ScTableSheetsObj::getCount() throw(uno::RuntimeException, std::exception)
    2861             : {
    2862         636 :     SolarMutexGuard aGuard;
    2863         636 :     if (pDocShell)
    2864         636 :         return pDocShell->GetDocument().GetTableCount();
    2865           0 :     return 0;
    2866             : }
    2867             : 
    2868        2412 : uno::Any SAL_CALL ScTableSheetsObj::getByIndex( sal_Int32 nIndex )
    2869             :                             throw(lang::IndexOutOfBoundsException,
    2870             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2871             : {
    2872        2412 :     SolarMutexGuard aGuard;
    2873        4824 :     uno::Reference<sheet::XSpreadsheet> xSheet(GetObjectByIndex_Impl(nIndex));
    2874        2412 :     if (xSheet.is())
    2875        4820 :         return uno::makeAny(xSheet);
    2876             :     else
    2877        2414 :         throw lang::IndexOutOfBoundsException();
    2878             : //    return uno::Any();
    2879             : }
    2880             : 
    2881           0 : uno::Type SAL_CALL ScTableSheetsObj::getElementType() throw(uno::RuntimeException, std::exception)
    2882             : {
    2883           0 :     SolarMutexGuard aGuard;
    2884           0 :     return cppu::UnoType<sheet::XSpreadsheet>::get();
    2885             : }
    2886             : 
    2887           0 : sal_Bool SAL_CALL ScTableSheetsObj::hasElements() throw(uno::RuntimeException, std::exception)
    2888             : {
    2889           0 :     SolarMutexGuard aGuard;
    2890           0 :     return ( getCount() != 0 );
    2891             : }
    2892             : 
    2893             : // XNameAccess
    2894             : 
    2895         328 : uno::Any SAL_CALL ScTableSheetsObj::getByName( const OUString& aName )
    2896             :             throw(container::NoSuchElementException,
    2897             :                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2898             : {
    2899         328 :     SolarMutexGuard aGuard;
    2900         656 :     uno::Reference<sheet::XSpreadsheet> xSheet(GetObjectByName_Impl(aName));
    2901         328 :     if (xSheet.is())
    2902         656 :         return uno::makeAny(xSheet);
    2903             :     else
    2904         328 :         throw container::NoSuchElementException();
    2905             : }
    2906             : 
    2907          36 : uno::Sequence<OUString> SAL_CALL ScTableSheetsObj::getElementNames()
    2908             :                                                 throw(uno::RuntimeException, std::exception)
    2909             : {
    2910          36 :     SolarMutexGuard aGuard;
    2911          36 :     if (pDocShell)
    2912             :     {
    2913          36 :         ScDocument& rDoc = pDocShell->GetDocument();
    2914          36 :         SCTAB nCount = rDoc.GetTableCount();
    2915          36 :         OUString aName;
    2916          72 :         uno::Sequence<OUString> aSeq(nCount);
    2917          36 :         OUString* pAry = aSeq.getArray();
    2918          72 :         for (SCTAB i=0; i<nCount; i++)
    2919             :         {
    2920          36 :             rDoc.GetName( i, aName );
    2921          36 :             pAry[i] = aName;
    2922             :         }
    2923          72 :         return aSeq;
    2924             :     }
    2925           0 :     return uno::Sequence<OUString>();
    2926             : }
    2927             : 
    2928         162 : sal_Bool SAL_CALL ScTableSheetsObj::hasByName( const OUString& aName )
    2929             :                                         throw(uno::RuntimeException, std::exception)
    2930             : {
    2931         162 :     SolarMutexGuard aGuard;
    2932         162 :     if (pDocShell)
    2933             :     {
    2934             :         SCTAB nIndex;
    2935         162 :         if ( pDocShell->GetDocument().GetTable( aName, nIndex ) )
    2936           8 :             return sal_True;
    2937             :     }
    2938         154 :     return false;
    2939             : }
    2940             : 
    2941        2700 : ScTableColumnsObj::ScTableColumnsObj(ScDocShell* pDocSh, SCTAB nT, SCCOL nSC, SCCOL nEC) :
    2942             :     pDocShell( pDocSh ),
    2943             :     nTab     ( nT ),
    2944             :     nStartCol( nSC ),
    2945        2700 :     nEndCol  ( nEC )
    2946             : {
    2947        2700 :     pDocShell->GetDocument().AddUnoObject(*this);
    2948        2700 : }
    2949             : 
    2950        8100 : ScTableColumnsObj::~ScTableColumnsObj()
    2951             : {
    2952        2700 :     SolarMutexGuard g;
    2953             : 
    2954        2700 :     if (pDocShell)
    2955        2687 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    2956        5400 : }
    2957             : 
    2958        4886 : void ScTableColumnsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    2959             : {
    2960        4886 :     if ( dynamic_cast<const ScUpdateRefHint*>(&rHint) )
    2961             :     {
    2962             :         //! Referenz-Update fuer Tab und Start/Ende
    2963             :     }
    2964        9748 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) &&
    2965        4874 :             static_cast<const SfxSimpleHint&>(rHint).GetId() == SFX_HINT_DYING )
    2966             :     {
    2967          13 :         pDocShell = NULL;       // ungueltig geworden
    2968             :     }
    2969        4886 : }
    2970             : 
    2971             : // XTableColumns
    2972             : 
    2973        2190 : ScTableColumnObj* ScTableColumnsObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const
    2974             : {
    2975        2190 :     SCCOL nCol = static_cast<SCCOL>(nIndex) + nStartCol;
    2976        2190 :     if ( pDocShell && nCol <= nEndCol )
    2977        2186 :         return new ScTableColumnObj( pDocShell, nCol, nTab );
    2978             : 
    2979           4 :     return NULL;    // falscher Index
    2980             : }
    2981             : 
    2982           4 : ScTableColumnObj* ScTableColumnsObj::GetObjectByName_Impl(const OUString& aName) const
    2983             : {
    2984           4 :     SCCOL nCol = 0;
    2985           4 :     OUString aString(aName);
    2986           4 :     if ( ::AlphaToCol( nCol, aString) )
    2987           2 :         if ( pDocShell && nCol >= nStartCol && nCol <= nEndCol )
    2988           2 :             return new ScTableColumnObj( pDocShell, nCol, nTab );
    2989             : 
    2990           2 :     return NULL;
    2991             : }
    2992             : 
    2993          12 : void SAL_CALL ScTableColumnsObj::insertByIndex( sal_Int32 nPosition, sal_Int32 nCount )
    2994             :                                                 throw(uno::RuntimeException, std::exception)
    2995             : {
    2996          12 :     SolarMutexGuard aGuard;
    2997          12 :     bool bDone = false;
    2998          18 :     if ( pDocShell && nCount > 0 && nPosition >= 0 && nStartCol+nPosition <= nEndCol &&
    2999           6 :             nStartCol+nPosition+nCount-1 <= MAXCOL )
    3000             :     {
    3001             :         ScRange aRange( (SCCOL)(nStartCol+nPosition), 0, nTab,
    3002           6 :                         (SCCOL)(nStartCol+nPosition+nCount-1), MAXROW, nTab );
    3003           6 :         bDone = pDocShell->GetDocFunc().InsertCells( aRange, NULL, INS_INSCOLS, true, true );
    3004             :     }
    3005          12 :     if (!bDone)
    3006           6 :         throw uno::RuntimeException();      // no other exceptions specified
    3007           6 : }
    3008             : 
    3009          12 : void SAL_CALL ScTableColumnsObj::removeByIndex( sal_Int32 nIndex, sal_Int32 nCount )
    3010             :                                                 throw(uno::RuntimeException, std::exception)
    3011             : {
    3012          12 :     SolarMutexGuard aGuard;
    3013          12 :     bool bDone = false;
    3014             :     //  Der zu loeschende Bereich muss innerhalb des Objekts liegen
    3015          12 :     if ( pDocShell && nCount > 0 && nIndex >= 0 && nStartCol+nIndex+nCount-1 <= nEndCol )
    3016             :     {
    3017             :         ScRange aRange( (SCCOL)(nStartCol+nIndex), 0, nTab,
    3018           6 :                         (SCCOL)(nStartCol+nIndex+nCount-1), MAXROW, nTab );
    3019           6 :         bDone = pDocShell->GetDocFunc().DeleteCells( aRange, NULL, DEL_DELCOLS, true, true );
    3020             :     }
    3021          12 :     if (!bDone)
    3022           6 :         throw uno::RuntimeException();      // no other exceptions specified
    3023           6 : }
    3024             : 
    3025             : // XEnumerationAccess
    3026             : 
    3027           4 : uno::Reference<container::XEnumeration> SAL_CALL ScTableColumnsObj::createEnumeration()
    3028             :                                                     throw(uno::RuntimeException, std::exception)
    3029             : {
    3030           4 :     SolarMutexGuard aGuard;
    3031           4 :     return new ScIndexEnumeration(this, OUString("com.sun.star.table.TableColumnsEnumeration"));
    3032             : }
    3033             : 
    3034             : // XIndexAccess
    3035             : 
    3036        2372 : sal_Int32 SAL_CALL ScTableColumnsObj::getCount() throw(uno::RuntimeException, std::exception)
    3037             : {
    3038        2372 :     SolarMutexGuard aGuard;
    3039        2372 :     return nEndCol - nStartCol + 1;
    3040             : }
    3041             : 
    3042        2190 : uno::Any SAL_CALL ScTableColumnsObj::getByIndex( sal_Int32 nIndex )
    3043             :                             throw(lang::IndexOutOfBoundsException,
    3044             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    3045             : {
    3046        2190 :     SolarMutexGuard aGuard;
    3047        4380 :     uno::Reference<table::XCellRange> xColumn(GetObjectByIndex_Impl(nIndex));
    3048        2190 :     if (xColumn.is())
    3049        4372 :         return uno::makeAny(xColumn);
    3050             :     else
    3051        2194 :         throw lang::IndexOutOfBoundsException();
    3052             : }
    3053             : 
    3054           2 : uno::Type SAL_CALL ScTableColumnsObj::getElementType() throw(uno::RuntimeException, std::exception)
    3055             : {
    3056           2 :     SolarMutexGuard aGuard;
    3057           2 :     return cppu::UnoType<table::XCellRange>::get();
    3058             : }
    3059             : 
    3060           2 : sal_Bool SAL_CALL ScTableColumnsObj::hasElements() throw(uno::RuntimeException, std::exception)
    3061             : {
    3062           2 :     SolarMutexGuard aGuard;
    3063           2 :     return ( getCount() != 0 );
    3064             : }
    3065             : 
    3066           4 : uno::Any SAL_CALL ScTableColumnsObj::getByName( const OUString& aName )
    3067             :             throw(container::NoSuchElementException,
    3068             :                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    3069             : {
    3070           4 :     SolarMutexGuard aGuard;
    3071           8 :     uno::Reference<table::XCellRange> xColumn(GetObjectByName_Impl(aName));
    3072           4 :     if (xColumn.is())
    3073           4 :         return uno::makeAny(xColumn);
    3074             :     else
    3075           6 :         throw container::NoSuchElementException();
    3076             : }
    3077             : 
    3078           2 : uno::Sequence<OUString> SAL_CALL ScTableColumnsObj::getElementNames()
    3079             :                                                 throw(uno::RuntimeException, std::exception)
    3080             : {
    3081           2 :     SolarMutexGuard aGuard;
    3082           2 :     SCCOL nCount = nEndCol - nStartCol + 1;
    3083           2 :     uno::Sequence<OUString> aSeq(nCount);
    3084           2 :     OUString* pAry = aSeq.getArray();
    3085        2050 :     for (SCCOL i=0; i<nCount; i++)
    3086        2048 :         pAry[i] = ::ScColToAlpha( nStartCol + i );
    3087             : 
    3088           2 :     return aSeq;
    3089             : }
    3090             : 
    3091           4 : sal_Bool SAL_CALL ScTableColumnsObj::hasByName( const OUString& aName )
    3092             :                                         throw(uno::RuntimeException, std::exception)
    3093             : {
    3094           4 :     SolarMutexGuard aGuard;
    3095           4 :     SCCOL nCol = 0;
    3096           8 :     OUString aString(aName);
    3097           4 :     if ( ::AlphaToCol( nCol, aString) )
    3098           2 :         if ( pDocShell && nCol >= nStartCol && nCol <= nEndCol )
    3099           2 :             return sal_True;
    3100             : 
    3101           6 :     return false;       // nicht gefunden
    3102             : }
    3103             : 
    3104             : // XPropertySet
    3105             : 
    3106        2322 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableColumnsObj::getPropertySetInfo()
    3107             :                                                         throw(uno::RuntimeException, std::exception)
    3108             : {
    3109        2322 :     SolarMutexGuard aGuard;
    3110             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    3111        2322 :         new SfxItemPropertySetInfo( lcl_GetColumnsPropertyMap() ));
    3112        2322 :     return aRef;
    3113             : }
    3114             : 
    3115        5558 : void SAL_CALL ScTableColumnsObj::setPropertyValue(
    3116             :                         const OUString& aPropertyName, const uno::Any& aValue )
    3117             :                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
    3118             :                         lang::IllegalArgumentException, lang::WrappedTargetException,
    3119             :                         uno::RuntimeException, std::exception)
    3120             : {
    3121        5558 :     SolarMutexGuard aGuard;
    3122        5558 :     if (!pDocShell)
    3123           0 :         throw uno::RuntimeException();
    3124             : 
    3125       11116 :     std::vector<sc::ColRowSpan> aColArr(1, sc::ColRowSpan(nStartCol,nEndCol));
    3126       11116 :     OUString aNameString(aPropertyName);
    3127        5558 :     ScDocFunc& rFunc = pDocShell->GetDocFunc();
    3128             : 
    3129        5558 :     if ( aNameString.equalsAscii( SC_UNONAME_CELLWID ) )
    3130             :     {
    3131        2322 :         sal_Int32 nNewWidth = 0;
    3132        2322 :         if ( aValue >>= nNewWidth )
    3133             :             rFunc.SetWidthOrHeight(
    3134        2322 :                 true, aColArr, nTab, SC_SIZE_ORIGINAL, (sal_uInt16)HMMToTwips(nNewWidth), true, true);
    3135             :     }
    3136        3236 :     else if ( aNameString.equalsAscii( SC_UNONAME_CELLVIS ) )
    3137             :     {
    3138        2338 :         bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    3139        2338 :         ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT;
    3140        2338 :         rFunc.SetWidthOrHeight(true, aColArr, nTab, eMode, 0, true, true);
    3141             :         //  SC_SIZE_DIRECT with size 0: hide
    3142             :     }
    3143         898 :     else if ( aNameString.equalsAscii( SC_UNONAME_OWIDTH ) )
    3144             :     {
    3145           0 :         bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    3146           0 :         if (bOpt)
    3147             :             rFunc.SetWidthOrHeight(
    3148           0 :                 true, aColArr, nTab, SC_SIZE_OPTIMAL, STD_EXTRA_WIDTH, true, true);
    3149             :         // sal_False for columns currently has no effect
    3150             :     }
    3151         898 :     else if ( aNameString.equalsAscii( SC_UNONAME_NEWPAGE ) || aNameString.equalsAscii( SC_UNONAME_MANPAGE ) )
    3152             :     {
    3153             :         //! single function to set/remove all breaks?
    3154         898 :         bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    3155       27770 :         for (SCCOL nCol=nStartCol; nCol<=nEndCol; nCol++)
    3156       26872 :             if (bSet)
    3157           0 :                 rFunc.InsertPageBreak( true, ScAddress(nCol,0,nTab), true, true, true );
    3158             :             else
    3159       26872 :                 rFunc.RemovePageBreak( true, ScAddress(nCol,0,nTab), true, true, true );
    3160        5558 :     }
    3161        5558 : }
    3162             : 
    3163          52 : uno::Any SAL_CALL ScTableColumnsObj::getPropertyValue( const OUString& aPropertyName )
    3164             :     throw(beans::UnknownPropertyException, lang::WrappedTargetException,
    3165             :           uno::RuntimeException, std::exception)
    3166             : {
    3167          52 :     SolarMutexGuard aGuard;
    3168          52 :     if (!pDocShell)
    3169           0 :         throw uno::RuntimeException();
    3170             : 
    3171          52 :     ScDocument& rDoc = pDocShell->GetDocument();
    3172         104 :     OUString aNameString(aPropertyName);
    3173          52 :     uno::Any aAny;
    3174             : 
    3175             :     //! loop over all columns for current state?
    3176             : 
    3177          52 :     if ( aNameString.equalsAscii( SC_UNONAME_CELLWID ) )
    3178             :     {
    3179             :         // for hidden column, return original height
    3180           0 :         sal_uInt16 nWidth = rDoc.GetOriginalWidth( nStartCol, nTab );
    3181           0 :         aAny <<= (sal_Int32)TwipsToHMM(nWidth);
    3182             :     }
    3183          52 :     else if ( aNameString.equalsAscii( SC_UNONAME_CELLVIS ) )
    3184             :     {
    3185          52 :         bool bVis = !rDoc.ColHidden(nStartCol, nTab);
    3186          52 :         ScUnoHelpFunctions::SetBoolInAny( aAny, bVis );
    3187             :     }
    3188           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_OWIDTH ) )
    3189             :     {
    3190           0 :         bool bOpt = !(rDoc.GetColFlags( nStartCol, nTab ) & CR_MANUALSIZE);
    3191           0 :         ScUnoHelpFunctions::SetBoolInAny( aAny, bOpt );
    3192             :     }
    3193           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_NEWPAGE ) )
    3194             :     {
    3195           0 :         ScBreakType nBreak = rDoc.HasColBreak(nStartCol, nTab);
    3196           0 :         ScUnoHelpFunctions::SetBoolInAny( aAny, nBreak );
    3197             :     }
    3198           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_MANPAGE ) )
    3199             :     {
    3200           0 :         ScBreakType nBreak = rDoc.HasColBreak(nStartCol, nTab);
    3201           0 :         ScUnoHelpFunctions::SetBoolInAny( aAny, (nBreak & BREAK_MANUAL) != 0 );
    3202             :     }
    3203             : 
    3204         104 :     return aAny;
    3205             : }
    3206             : 
    3207           0 : SC_IMPL_DUMMY_PROPERTY_LISTENER( ScTableColumnsObj )
    3208             : 
    3209        6910 : ScTableRowsObj::ScTableRowsObj(ScDocShell* pDocSh, SCTAB nT, SCROW nSR, SCROW nER) :
    3210             :     pDocShell( pDocSh ),
    3211             :     nTab     ( nT ),
    3212             :     nStartRow( nSR ),
    3213        6910 :     nEndRow  ( nER )
    3214             : {
    3215        6910 :     pDocShell->GetDocument().AddUnoObject(*this);
    3216        6910 : }
    3217             : 
    3218       20730 : ScTableRowsObj::~ScTableRowsObj()
    3219             : {
    3220        6910 :     SolarMutexGuard g;
    3221             : 
    3222        6910 :     if (pDocShell)
    3223        6900 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    3224       13820 : }
    3225             : 
    3226         256 : void ScTableRowsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    3227             : {
    3228         256 :     if ( dynamic_cast<const ScUpdateRefHint*>(&rHint) )
    3229             :     {
    3230             :         //! Referenz-Update fuer Tab und Start/Ende
    3231             :     }
    3232         504 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) &&
    3233         252 :             static_cast<const SfxSimpleHint&>(rHint).GetId() == SFX_HINT_DYING )
    3234             :     {
    3235          10 :         pDocShell = NULL;       // ungueltig geworden
    3236             :     }
    3237         256 : }
    3238             : 
    3239             : // XTableRows
    3240             : 
    3241         232 : ScTableRowObj* ScTableRowsObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const
    3242             : {
    3243         232 :     SCROW nRow = static_cast<SCROW>(nIndex) + nStartRow;
    3244         232 :     if ( pDocShell && nRow <= nEndRow )
    3245         230 :         return new ScTableRowObj( pDocShell, nRow, nTab );
    3246             : 
    3247           2 :     return NULL;    // falscher Index
    3248             : }
    3249             : 
    3250           4 : void SAL_CALL ScTableRowsObj::insertByIndex( sal_Int32 nPosition, sal_Int32 nCount )
    3251             :                                                 throw(uno::RuntimeException, std::exception)
    3252             : {
    3253           4 :     SolarMutexGuard aGuard;
    3254           4 :     bool bDone = false;
    3255           6 :     if ( pDocShell && nCount > 0 && nPosition >= 0 && nStartRow+nPosition <= nEndRow &&
    3256           2 :             nStartRow+nPosition+nCount-1 <= MAXROW )
    3257             :     {
    3258             :         ScRange aRange( 0, (SCROW)(nStartRow+nPosition), nTab,
    3259           2 :                         MAXCOL, (SCROW)(nStartRow+nPosition+nCount-1), nTab );
    3260           2 :         bDone = pDocShell->GetDocFunc().InsertCells( aRange, NULL, INS_INSROWS, true, true );
    3261             :     }
    3262           4 :     if (!bDone)
    3263           2 :         throw uno::RuntimeException();      // no other exceptions specified
    3264           2 : }
    3265             : 
    3266           4 : void SAL_CALL ScTableRowsObj::removeByIndex( sal_Int32 nIndex, sal_Int32 nCount )
    3267             :                                                 throw(uno::RuntimeException, std::exception)
    3268             : {
    3269           4 :     SolarMutexGuard aGuard;
    3270           4 :     bool bDone = false;
    3271             :     //  Der zu loeschende Bereich muss innerhalb des Objekts liegen
    3272           4 :     if ( pDocShell && nCount > 0 && nIndex >= 0 && nStartRow+nIndex+nCount-1 <= nEndRow )
    3273             :     {
    3274             :         ScRange aRange( 0, (SCROW)(nStartRow+nIndex), nTab,
    3275           2 :                         MAXCOL, (SCROW)(nStartRow+nIndex+nCount-1), nTab );
    3276           2 :         bDone = pDocShell->GetDocFunc().DeleteCells( aRange, NULL, DEL_DELROWS, true, true );
    3277             :     }
    3278           4 :     if (!bDone)
    3279           2 :         throw uno::RuntimeException();      // no other exceptions specified
    3280           2 : }
    3281             : 
    3282             : // XEnumerationAccess
    3283             : 
    3284           2 : uno::Reference<container::XEnumeration> SAL_CALL ScTableRowsObj::createEnumeration()
    3285             :                                                     throw(uno::RuntimeException, std::exception)
    3286             : {
    3287           2 :     SolarMutexGuard aGuard;
    3288           2 :     return new ScIndexEnumeration(this, OUString("com.sun.star.table.TableRowsEnumeration"));
    3289             : }
    3290             : 
    3291             : // XIndexAccess
    3292             : 
    3293         228 : sal_Int32 SAL_CALL ScTableRowsObj::getCount() throw(uno::RuntimeException, std::exception)
    3294             : {
    3295         228 :     SolarMutexGuard aGuard;
    3296         228 :     return nEndRow - nStartRow + 1;
    3297             : }
    3298             : 
    3299         232 : uno::Any SAL_CALL ScTableRowsObj::getByIndex( sal_Int32 nIndex )
    3300             :                             throw(lang::IndexOutOfBoundsException,
    3301             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    3302             : {
    3303         232 :     SolarMutexGuard aGuard;
    3304         464 :     uno::Reference<table::XCellRange> xRow(GetObjectByIndex_Impl(nIndex));
    3305         232 :     if (xRow.is())
    3306         460 :         return uno::makeAny(xRow);
    3307             :     else
    3308         234 :         throw lang::IndexOutOfBoundsException();
    3309             : }
    3310             : 
    3311           2 : uno::Type SAL_CALL ScTableRowsObj::getElementType() throw(uno::RuntimeException, std::exception)
    3312             : {
    3313           2 :     SolarMutexGuard aGuard;
    3314           2 :     return cppu::UnoType<table::XCellRange>::get();
    3315             : }
    3316             : 
    3317           2 : sal_Bool SAL_CALL ScTableRowsObj::hasElements() throw(uno::RuntimeException, std::exception)
    3318             : {
    3319           2 :     SolarMutexGuard aGuard;
    3320           2 :     return ( getCount() != 0 );
    3321             : }
    3322             : 
    3323             : // XPropertySet
    3324             : 
    3325        6500 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableRowsObj::getPropertySetInfo()
    3326             :                                                         throw(uno::RuntimeException, std::exception)
    3327             : {
    3328        6500 :     SolarMutexGuard aGuard;
    3329             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    3330        6500 :         new SfxItemPropertySetInfo( lcl_GetRowsPropertyMap() ));
    3331        6500 :     return aRef;
    3332             : }
    3333             : 
    3334        6992 : void SAL_CALL ScTableRowsObj::setPropertyValue(
    3335             :                         const OUString& aPropertyName, const uno::Any& aValue )
    3336             :                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
    3337             :                         lang::IllegalArgumentException, lang::WrappedTargetException,
    3338             :                         uno::RuntimeException, std::exception)
    3339             : {
    3340        6992 :     SolarMutexGuard aGuard;
    3341        6992 :     if (!pDocShell)
    3342           0 :         throw uno::RuntimeException();
    3343             : 
    3344        6992 :     ScDocFunc& rFunc = pDocShell->GetDocFunc();
    3345        6992 :     ScDocument& rDoc = pDocShell->GetDocument();
    3346       13984 :     std::vector<sc::ColRowSpan> aRowArr(1, sc::ColRowSpan(nStartRow,nEndRow));
    3347       13984 :     OUString aNameString(aPropertyName);
    3348             : 
    3349        6992 :     if ( aNameString.equalsAscii( SC_UNONAME_OHEIGHT ) )
    3350             :     {
    3351        6322 :         sal_Int32 nNewHeight = 0;
    3352        6322 :         if ( rDoc.IsImportingXML() && ( aValue >>= nNewHeight ) )
    3353             :         {
    3354             :             // used to set the stored row height for rows with optimal height when loading.
    3355             : 
    3356             :             // TODO: It's probably cleaner to use a different property name
    3357             :             // for this.
    3358        5730 :             rDoc.SetRowHeightOnly( nStartRow, nEndRow, nTab, (sal_uInt16)HMMToTwips(nNewHeight) );
    3359             :         }
    3360             :         else
    3361             :         {
    3362         592 :             bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    3363         592 :             if (bOpt)
    3364           0 :                 rFunc.SetWidthOrHeight(false, aRowArr, nTab, SC_SIZE_OPTIMAL, 0, true, true);
    3365             :             else
    3366             :             {
    3367             :                 //! manually set old heights again?
    3368             :             }
    3369             :         }
    3370             :     }
    3371         670 :     else if ( aNameString.equalsAscii( SC_UNONAME_CELLHGT ) )
    3372             :     {
    3373         592 :         sal_Int32 nNewHeight = 0;
    3374         592 :         if ( aValue >>= nNewHeight )
    3375             :         {
    3376         592 :             if (rDoc.IsImportingXML())
    3377             :             {
    3378             :                 // TODO: This is a band-aid fix.  Eventually we need to
    3379             :                 // re-work ods' style import to get it to set styles to
    3380             :                 // ScDocument directly.
    3381         592 :                 rDoc.SetRowHeightOnly( nStartRow, nEndRow, nTab, (sal_uInt16)HMMToTwips(nNewHeight) );
    3382         592 :                 rDoc.SetManualHeight( nStartRow, nEndRow, nTab, true );
    3383             :             }
    3384             :             else
    3385             :                 rFunc.SetWidthOrHeight(
    3386           0 :                     false, aRowArr, nTab, SC_SIZE_ORIGINAL, (sal_uInt16)HMMToTwips(nNewHeight), true, true);
    3387             :         }
    3388             :     }
    3389          78 :     else if ( aNameString.equalsAscii( SC_UNONAME_CELLVIS ) )
    3390             :     {
    3391          50 :         bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    3392          50 :         ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT;
    3393          50 :         rFunc.SetWidthOrHeight(false, aRowArr, nTab, eMode, 0, true, true);
    3394             :         //  SC_SIZE_DIRECT with size 0: hide
    3395             :     }
    3396          28 :     else if ( aNameString.equalsAscii( SC_UNONAME_VISFLAG ) )
    3397             :     {
    3398             :         // #i116460# Shortcut to only set the flag, without drawing layer update etc.
    3399             :         // Should only be used from import filters.
    3400           0 :         rDoc.SetRowHidden(nStartRow, nEndRow, nTab, !ScUnoHelpFunctions::GetBoolFromAny( aValue ));
    3401             :     }
    3402          28 :     else if ( aNameString.equalsAscii( SC_UNONAME_CELLFILT ) )
    3403             :     {
    3404             :         //! undo etc.
    3405          28 :         if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    3406          28 :             rDoc.SetRowFiltered(nStartRow, nEndRow, nTab, true);
    3407             :         else
    3408           0 :             rDoc.SetRowFiltered(nStartRow, nEndRow, nTab, false);
    3409             :     }
    3410           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_NEWPAGE) || aNameString.equalsAscii( SC_UNONAME_MANPAGE) )
    3411             :     {
    3412             :         //! single function to set/remove all breaks?
    3413           0 :         bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    3414           0 :         for (SCROW nRow=nStartRow; nRow<=nEndRow; nRow++)
    3415           0 :             if (bSet)
    3416           0 :                 rFunc.InsertPageBreak( false, ScAddress(0,nRow,nTab), true, true, true );
    3417             :             else
    3418           0 :                 rFunc.RemovePageBreak( false, ScAddress(0,nRow,nTab), true, true, true );
    3419             :     }
    3420           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_CELLBACK ) || aNameString.equalsAscii( SC_UNONAME_CELLTRAN ) )
    3421             :     {
    3422             :         // #i57867# Background color is specified for row styles in the file format,
    3423             :         // so it has to be supported along with the row properties (import only).
    3424             : 
    3425             :         // Use ScCellRangeObj to set the property for all cells in the rows
    3426             :         // (this means, the "row attribute" must be set before individual cell attributes).
    3427             : 
    3428           0 :         ScRange aRange( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab );
    3429           0 :         uno::Reference<beans::XPropertySet> xRangeObj = new ScCellRangeObj( pDocShell, aRange );
    3430           0 :         xRangeObj->setPropertyValue( aPropertyName, aValue );
    3431        6992 :     }
    3432        6992 : }
    3433             : 
    3434          90 : uno::Any SAL_CALL ScTableRowsObj::getPropertyValue( const OUString& aPropertyName )
    3435             :     throw(beans::UnknownPropertyException, lang::WrappedTargetException,
    3436             :           uno::RuntimeException, std::exception)
    3437             : {
    3438          90 :     SolarMutexGuard aGuard;
    3439          90 :     if (!pDocShell)
    3440           0 :         throw uno::RuntimeException();
    3441             : 
    3442          90 :     ScDocument& rDoc = pDocShell->GetDocument();
    3443         180 :     OUString aNameString(aPropertyName);
    3444          90 :     uno::Any aAny;
    3445             : 
    3446             :     //! loop over all rows for current state?
    3447             : 
    3448          90 :     if ( aNameString.equalsAscii( SC_UNONAME_CELLHGT ) )
    3449             :     {
    3450             :         // for hidden row, return original height
    3451           0 :         sal_uInt16 nHeight = rDoc.GetOriginalHeight( nStartRow, nTab );
    3452           0 :         aAny <<= (sal_Int32)TwipsToHMM(nHeight);
    3453             :     }
    3454          90 :     else if ( aNameString.equalsAscii( SC_UNONAME_CELLVIS ) )
    3455             :     {
    3456             :         SCROW nLastRow;
    3457          90 :         bool bVis = !rDoc.RowHidden(nStartRow, nTab, NULL, &nLastRow);
    3458          90 :         ScUnoHelpFunctions::SetBoolInAny( aAny, bVis );
    3459             :     }
    3460           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_CELLFILT ) )
    3461             :     {
    3462           0 :         bool bVis = rDoc.RowFiltered(nStartRow, nTab);
    3463           0 :         ScUnoHelpFunctions::SetBoolInAny( aAny, bVis );
    3464             :     }
    3465           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_OHEIGHT ) )
    3466             :     {
    3467           0 :         bool bOpt = !(rDoc.GetRowFlags( nStartRow, nTab ) & CR_MANUALSIZE);
    3468           0 :         ScUnoHelpFunctions::SetBoolInAny( aAny, bOpt );
    3469             :     }
    3470           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_NEWPAGE ) )
    3471             :     {
    3472           0 :         ScBreakType nBreak = rDoc.HasRowBreak(nStartRow, nTab);
    3473           0 :         ScUnoHelpFunctions::SetBoolInAny( aAny, nBreak );
    3474             :     }
    3475           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_MANPAGE ) )
    3476             :     {
    3477           0 :         ScBreakType nBreak = rDoc.HasRowBreak(nStartRow, nTab);
    3478           0 :         ScUnoHelpFunctions::SetBoolInAny( aAny, (nBreak & BREAK_MANUAL) != 0 );
    3479             :     }
    3480           0 :     else if ( aNameString.equalsAscii( SC_UNONAME_CELLBACK ) || aNameString.equalsAscii( SC_UNONAME_CELLTRAN ) )
    3481             :     {
    3482             :         // Use ScCellRangeObj to get the property from the cell range
    3483             :         // (for completeness only, this is not used by the XML filter).
    3484             : 
    3485           0 :         ScRange aRange( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab );
    3486           0 :         uno::Reference<beans::XPropertySet> xRangeObj = new ScCellRangeObj( pDocShell, aRange );
    3487           0 :         aAny = xRangeObj->getPropertyValue( aPropertyName );
    3488             :     }
    3489             : 
    3490         180 :     return aAny;
    3491             : }
    3492             : 
    3493           0 : SC_IMPL_DUMMY_PROPERTY_LISTENER( ScTableRowsObj )
    3494             : 
    3495           0 : ScSpreadsheetSettingsObj::~ScSpreadsheetSettingsObj()
    3496             : {
    3497           0 :     SolarMutexGuard g;
    3498             : 
    3499           0 :     if (pDocShell)
    3500           0 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    3501           0 : }
    3502             : 
    3503           0 : void ScSpreadsheetSettingsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    3504             : {
    3505             :     //  Referenz-Update interessiert hier nicht
    3506             : 
    3507           0 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
    3508           0 :     if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING )
    3509             :     {
    3510           0 :         pDocShell = NULL;       // ungueltig geworden
    3511             :     }
    3512           0 : }
    3513             : 
    3514             : // XPropertySet
    3515             : 
    3516           0 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScSpreadsheetSettingsObj::getPropertySetInfo()
    3517             :                                                         throw(uno::RuntimeException, std::exception)
    3518             : {
    3519             :     //! muss noch
    3520           0 :     return NULL;
    3521             : }
    3522             : 
    3523           0 : void SAL_CALL ScSpreadsheetSettingsObj::setPropertyValue(
    3524             :                         const OUString& /* aPropertyName */, const uno::Any& /* aValue */ )
    3525             :                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
    3526             :                         lang::IllegalArgumentException, lang::WrappedTargetException,
    3527             :                         uno::RuntimeException, std::exception)
    3528             : {
    3529             :     //! muss noch
    3530           0 : }
    3531             : 
    3532           0 : uno::Any SAL_CALL ScSpreadsheetSettingsObj::getPropertyValue( const OUString& /* aPropertyName */ )
    3533             :                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
    3534             :                         uno::RuntimeException, std::exception)
    3535             : {
    3536             :     //! muss noch
    3537           0 :     return uno::Any();
    3538             : }
    3539             : 
    3540           0 : SC_IMPL_DUMMY_PROPERTY_LISTENER( ScSpreadsheetSettingsObj )
    3541             : 
    3542          22 : ScAnnotationsObj::ScAnnotationsObj(ScDocShell* pDocSh, SCTAB nT) :
    3543             :     pDocShell( pDocSh ),
    3544          22 :     nTab( nT )
    3545             : {
    3546          22 :     pDocShell->GetDocument().AddUnoObject(*this);
    3547          22 : }
    3548             : 
    3549          66 : ScAnnotationsObj::~ScAnnotationsObj()
    3550             : {
    3551          22 :     SolarMutexGuard g;
    3552             : 
    3553          22 :     if (pDocShell)
    3554          18 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    3555          44 : }
    3556             : 
    3557          48 : void ScAnnotationsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    3558             : {
    3559             :     //! nTab bei Referenz-Update anpassen!!!
    3560             : 
    3561          48 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
    3562          48 :     if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING )
    3563             :     {
    3564           4 :         pDocShell = NULL;       // ungueltig geworden
    3565             :     }
    3566          48 : }
    3567             : 
    3568          14 : bool ScAnnotationsObj::GetAddressByIndex_Impl( sal_Int32 nIndex, ScAddress& rPos ) const
    3569             : {
    3570          14 :     if (!pDocShell)
    3571           0 :         return false;
    3572             : 
    3573          14 :     ScDocument& rDoc = pDocShell->GetDocument();
    3574          14 :     rPos = rDoc.GetNotePosition(nIndex, nTab);
    3575          14 :     return rPos.IsValid();
    3576             : }
    3577             : 
    3578          10 : ScAnnotationObj* ScAnnotationsObj::GetObjectByIndex_Impl( sal_Int32 nIndex ) const
    3579             : {
    3580          10 :     if (pDocShell)
    3581             :     {
    3582          10 :         ScAddress aPos;
    3583          10 :         if ( GetAddressByIndex_Impl( nIndex, aPos ) )
    3584           8 :             return new ScAnnotationObj( pDocShell, aPos );
    3585             :     }
    3586           2 :     return NULL;
    3587             : }
    3588             : 
    3589             : // XSheetAnnotations
    3590             : 
    3591          30 : void SAL_CALL ScAnnotationsObj::insertNew(
    3592             :         const table::CellAddress& aPosition, const OUString& rText )
    3593             :                                                 throw(uno::RuntimeException, std::exception)
    3594             : {
    3595          30 :     SolarMutexGuard aGuard;
    3596          30 :     if (pDocShell)
    3597             :     {
    3598             :         OSL_ENSURE( aPosition.Sheet == nTab, "addAnnotation mit falschem Sheet" );
    3599          30 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    3600          30 :         pDocShell->GetDocFunc().ReplaceNote( aPos, rText, 0, 0, true );
    3601          30 :     }
    3602          30 : }
    3603             : 
    3604           4 : void SAL_CALL ScAnnotationsObj::removeByIndex( sal_Int32 nIndex ) throw(uno::RuntimeException, std::exception)
    3605             : {
    3606           4 :     SolarMutexGuard aGuard;
    3607           4 :     if (pDocShell)
    3608             :     {
    3609           4 :         ScAddress aPos;
    3610           4 :         if ( GetAddressByIndex_Impl( nIndex, aPos ) )
    3611             :         {
    3612           4 :             ScMarkData aMarkData;
    3613           4 :             aMarkData.SelectTable( aPos.Tab(), true );
    3614           4 :             aMarkData.SetMultiMarkArea( ScRange(aPos) );
    3615             : 
    3616           4 :             pDocShell->GetDocFunc().DeleteContents( aMarkData, IDF_NOTE, true, true );
    3617             :         }
    3618           4 :     }
    3619           4 : }
    3620             : 
    3621             : // XEnumerationAccess
    3622             : 
    3623           4 : uno::Reference<container::XEnumeration> SAL_CALL ScAnnotationsObj::createEnumeration()
    3624             :                                                     throw(uno::RuntimeException, std::exception)
    3625             : {
    3626             :     //! iterate directly (more efficiently)?
    3627             : 
    3628           4 :     SolarMutexGuard aGuard;
    3629           4 :     return new ScIndexEnumeration(this, OUString("com.sun.star.sheet.CellAnnotationsEnumeration"));
    3630             : }
    3631             : 
    3632             : // XIndexAccess
    3633             : 
    3634          24 : sal_Int32 SAL_CALL ScAnnotationsObj::getCount()
    3635             :     throw(uno::RuntimeException, std::exception)
    3636             : {
    3637          24 :     SolarMutexGuard aGuard;
    3638          24 :     sal_Int32 nCount = 0;
    3639          24 :     if (pDocShell)
    3640             :     {
    3641          24 :         ScDocument& rDoc = pDocShell->GetDocument();
    3642          24 :         const ScRangeList aRangeList( ScRange( 0, 0, nTab, MAXCOL, MAXROW, nTab) );
    3643          48 :         std::vector<sc::NoteEntry> rNotes;
    3644          24 :         rDoc.GetNotesInRange(aRangeList, rNotes);
    3645          48 :         nCount = rNotes.size();
    3646             :     }
    3647          24 :     return nCount;
    3648             : }
    3649             : 
    3650          10 : uno::Any SAL_CALL ScAnnotationsObj::getByIndex( sal_Int32 nIndex )
    3651             :                             throw(lang::IndexOutOfBoundsException,
    3652             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    3653             : {
    3654          10 :     SolarMutexGuard aGuard;
    3655          20 :     uno::Reference<sheet::XSheetAnnotation> xAnnotation(GetObjectByIndex_Impl(nIndex));
    3656          10 :     if (xAnnotation.is())
    3657          16 :         return uno::makeAny(xAnnotation);
    3658             :     else
    3659          12 :         throw lang::IndexOutOfBoundsException();
    3660             : }
    3661             : 
    3662           0 : uno::Type SAL_CALL ScAnnotationsObj::getElementType() throw(uno::RuntimeException, std::exception)
    3663             : {
    3664           0 :     SolarMutexGuard aGuard;
    3665           0 :     return cppu::UnoType<sheet::XSheetAnnotation>::get();
    3666             : }
    3667             : 
    3668           0 : sal_Bool SAL_CALL ScAnnotationsObj::hasElements() throw(uno::RuntimeException, std::exception)
    3669             : {
    3670           0 :     SolarMutexGuard aGuard;
    3671           0 :     return ( getCount() != 0 );
    3672             : }
    3673             : 
    3674           4 : ScScenariosObj::ScScenariosObj(ScDocShell* pDocSh, SCTAB nT) :
    3675             :     pDocShell( pDocSh ),
    3676           4 :     nTab     ( nT )
    3677             : {
    3678           4 :     pDocShell->GetDocument().AddUnoObject(*this);
    3679           4 : }
    3680             : 
    3681          12 : ScScenariosObj::~ScScenariosObj()
    3682             : {
    3683           4 :     SolarMutexGuard g;
    3684             : 
    3685           4 :     if (pDocShell)
    3686           0 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    3687           8 : }
    3688             : 
    3689           6 : void ScScenariosObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    3690             : {
    3691           6 :     if ( dynamic_cast<const ScUpdateRefHint*>(&rHint) )
    3692             :     {
    3693             :         //! Referenz-Update fuer Tab und Start/Ende
    3694             :     }
    3695          12 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) &&
    3696           6 :             static_cast<const SfxSimpleHint&>(rHint).GetId() == SFX_HINT_DYING )
    3697             :     {
    3698           4 :         pDocShell = NULL;       // ungueltig geworden
    3699             :     }
    3700           6 : }
    3701             : 
    3702             : // XScenarios
    3703             : 
    3704           0 : bool ScScenariosObj::GetScenarioIndex_Impl( const OUString& rName, SCTAB& rIndex )
    3705             : {
    3706             :     //! Case-insensitiv ????
    3707             : 
    3708           0 :     if ( pDocShell )
    3709             :     {
    3710           0 :         OUString aTabName;
    3711           0 :         ScDocument& rDoc = pDocShell->GetDocument();
    3712           0 :         SCTAB nCount = (SCTAB)getCount();
    3713           0 :         for (SCTAB i=0; i<nCount; i++)
    3714           0 :             if (rDoc.GetName( nTab+i+1, aTabName ))
    3715           0 :                 if (aTabName.equals(rName))
    3716             :                 {
    3717           0 :                     rIndex = i;
    3718           0 :                     return true;
    3719           0 :                 }
    3720             :     }
    3721             : 
    3722           0 :     return false;
    3723             : }
    3724             : 
    3725           4 : ScTableSheetObj* ScScenariosObj::GetObjectByIndex_Impl(sal_Int32 nIndex)
    3726             : {
    3727           4 :     sal_uInt16 nCount = (sal_uInt16)getCount();
    3728           4 :     if ( pDocShell && nIndex >= 0 && nIndex < nCount )
    3729           2 :         return new ScTableSheetObj( pDocShell, nTab+static_cast<SCTAB>(nIndex)+1 );
    3730             : 
    3731           2 :     return NULL;    // kein Dokument oder falscher Index
    3732             : }
    3733             : 
    3734           0 : ScTableSheetObj* ScScenariosObj::GetObjectByName_Impl(const OUString& aName)
    3735             : {
    3736             :     SCTAB nIndex;
    3737           0 :     if ( pDocShell && GetScenarioIndex_Impl( aName, nIndex ) )
    3738           0 :         return new ScTableSheetObj( pDocShell, nTab+nIndex+1 );
    3739             : 
    3740           0 :     return NULL;    // nicht gefunden
    3741             : }
    3742             : 
    3743           2 : void SAL_CALL ScScenariosObj::addNewByName( const OUString& aName,
    3744             :                                 const uno::Sequence<table::CellRangeAddress>& aRanges,
    3745             :                                 const OUString& aComment )
    3746             :                                     throw(uno::RuntimeException, std::exception)
    3747             : {
    3748           2 :     SolarMutexGuard aGuard;
    3749           2 :     if ( pDocShell )
    3750             :     {
    3751           2 :         ScMarkData aMarkData;
    3752           2 :         aMarkData.SelectTable( nTab, true );
    3753             : 
    3754           2 :         sal_uInt16 nRangeCount = (sal_uInt16)aRanges.getLength();
    3755           2 :         if (nRangeCount)
    3756             :         {
    3757           2 :             const table::CellRangeAddress* pAry = aRanges.getConstArray();
    3758           4 :             for (sal_uInt16 i=0; i<nRangeCount; i++)
    3759             :             {
    3760             :                 OSL_ENSURE( pAry[i].Sheet == nTab, "addScenario mit falscher Tab" );
    3761           4 :                 ScRange aRange( (SCCOL)pAry[i].StartColumn, (SCROW)pAry[i].StartRow, nTab,
    3762           6 :                                 (SCCOL)pAry[i].EndColumn,   (SCROW)pAry[i].EndRow,   nTab );
    3763             : 
    3764           2 :                 aMarkData.SetMultiMarkArea( aRange );
    3765             :             }
    3766             :         }
    3767             : 
    3768           4 :         OUString aNameStr(aName);
    3769           4 :         OUString aCommStr(aComment);
    3770             : 
    3771           2 :         Color aColor( COL_LIGHTGRAY );  // Default
    3772           2 :         sal_uInt16 nFlags = SC_SCENARIO_SHOWFRAME | SC_SCENARIO_PRINTFRAME | SC_SCENARIO_TWOWAY | SC_SCENARIO_PROTECT;
    3773             : 
    3774           4 :         pDocShell->MakeScenario( nTab, aNameStr, aCommStr, aColor, nFlags, aMarkData );
    3775           2 :     }
    3776           2 : }
    3777             : 
    3778           0 : void SAL_CALL ScScenariosObj::removeByName( const OUString& aName )
    3779             :                                             throw(uno::RuntimeException, std::exception)
    3780             : {
    3781           0 :     SolarMutexGuard aGuard;
    3782             :     SCTAB nIndex;
    3783           0 :     if ( pDocShell && GetScenarioIndex_Impl( aName, nIndex ) )
    3784           0 :         pDocShell->GetDocFunc().DeleteTable( nTab+nIndex+1, true, true );
    3785           0 : }
    3786             : 
    3787             : // XEnumerationAccess
    3788             : 
    3789           2 : uno::Reference<container::XEnumeration> SAL_CALL ScScenariosObj::createEnumeration()
    3790             :                                                     throw(uno::RuntimeException, std::exception)
    3791             : {
    3792           2 :     SolarMutexGuard aGuard;
    3793           2 :     return new ScIndexEnumeration(this, OUString("com.sun.star.sheet.ScenariosEnumeration"));
    3794             : }
    3795             : 
    3796             : // XIndexAccess
    3797             : 
    3798           8 : sal_Int32 SAL_CALL ScScenariosObj::getCount() throw(uno::RuntimeException, std::exception)
    3799             : {
    3800           8 :     SolarMutexGuard aGuard;
    3801           8 :     SCTAB nCount = 0;
    3802           8 :     if ( pDocShell )
    3803             :     {
    3804           8 :         ScDocument& rDoc = pDocShell->GetDocument();
    3805           8 :         if (!rDoc.IsScenario(nTab))
    3806             :         {
    3807           8 :             SCTAB nTabCount = rDoc.GetTableCount();
    3808           8 :             SCTAB nNext = nTab + 1;
    3809          24 :             while (nNext < nTabCount && rDoc.IsScenario(nNext))
    3810             :             {
    3811           8 :                 ++nCount;
    3812           8 :                 ++nNext;
    3813             :             }
    3814             :         }
    3815             :     }
    3816           8 :     return nCount;
    3817             : }
    3818             : 
    3819           4 : uno::Any SAL_CALL ScScenariosObj::getByIndex( sal_Int32 nIndex )
    3820             :                             throw(lang::IndexOutOfBoundsException,
    3821             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    3822             : {
    3823           4 :     SolarMutexGuard aGuard;
    3824           8 :     uno::Reference<sheet::XScenario> xScen(GetObjectByIndex_Impl(nIndex));
    3825           4 :     if (xScen.is())
    3826           4 :         return uno::makeAny(xScen);
    3827             :     else
    3828           6 :         throw lang::IndexOutOfBoundsException();
    3829             : }
    3830             : 
    3831           0 : uno::Type SAL_CALL ScScenariosObj::getElementType() throw(uno::RuntimeException, std::exception)
    3832             : {
    3833           0 :     SolarMutexGuard aGuard;
    3834           0 :     return cppu::UnoType<sheet::XScenario>::get();
    3835             : }
    3836             : 
    3837           0 : sal_Bool SAL_CALL ScScenariosObj::hasElements() throw(uno::RuntimeException, std::exception)
    3838             : {
    3839           0 :     SolarMutexGuard aGuard;
    3840           0 :     return ( getCount() != 0 );
    3841             : }
    3842             : 
    3843           0 : uno::Any SAL_CALL ScScenariosObj::getByName( const OUString& aName )
    3844             :             throw(container::NoSuchElementException,
    3845             :                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    3846             : {
    3847           0 :     SolarMutexGuard aGuard;
    3848           0 :     uno::Reference<sheet::XScenario> xScen(GetObjectByName_Impl(aName));
    3849           0 :     if (xScen.is())
    3850           0 :         return uno::makeAny(xScen);
    3851             :     else
    3852           0 :         throw container::NoSuchElementException();
    3853             : }
    3854             : 
    3855           0 : uno::Sequence<OUString> SAL_CALL ScScenariosObj::getElementNames()
    3856             :                                                 throw(uno::RuntimeException, std::exception)
    3857             : {
    3858           0 :     SolarMutexGuard aGuard;
    3859           0 :     SCTAB nCount = (SCTAB)getCount();
    3860           0 :     uno::Sequence<OUString> aSeq(nCount);
    3861             : 
    3862           0 :     if ( pDocShell )    // sonst ist auch Count = 0
    3863             :     {
    3864           0 :         OUString aTabName;
    3865           0 :         ScDocument& rDoc = pDocShell->GetDocument();
    3866           0 :         OUString* pAry = aSeq.getArray();
    3867           0 :         for (SCTAB i=0; i<nCount; i++)
    3868           0 :             if (rDoc.GetName( nTab+i+1, aTabName ))
    3869           0 :                 pAry[i] = aTabName;
    3870             :     }
    3871             : 
    3872           0 :     return aSeq;
    3873             : }
    3874             : 
    3875           0 : sal_Bool SAL_CALL ScScenariosObj::hasByName( const OUString& aName )
    3876             :                                         throw(uno::RuntimeException, std::exception)
    3877             : {
    3878           0 :     SolarMutexGuard aGuard;
    3879             :     SCTAB nIndex;
    3880           0 :     return GetScenarioIndex_Impl( aName, nIndex );
    3881         228 : }
    3882             : 
    3883             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10