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