LibreOffice Module sc (master) 1
documen3.cxx
Go to the documentation of this file.
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 <com/sun/star/script/vba/XVBAEventProcessor.hpp>
21#include <com/sun/star/sheet/TableValidationVisibility.hpp>
22#include <scitems.hxx>
23#include <editeng/langitem.hxx>
24#include <svl/srchitem.hxx>
25#include <sfx2/linkmgr.hxx>
26#include <sfx2/bindings.hxx>
27#include <sfx2/objsh.hxx>
28#include <sfx2/viewsh.hxx>
29#include <vcl/svapp.hxx>
30#include <osl/thread.hxx>
31#include <osl/diagnose.h>
32#include <document.hxx>
33#include <attrib.hxx>
34#include <table.hxx>
35#include <rangenam.hxx>
36#include <dbdata.hxx>
37#include <docpool.hxx>
38#include <poolhelp.hxx>
39#include <rangelst.hxx>
40#include <chartlock.hxx>
41#include <refupdat.hxx>
42#include <docoptio.hxx>
43#include <scmod.hxx>
44#include <clipoptions.hxx>
45#include <viewopti.hxx>
46#include <scextopt.hxx>
47#include <tablink.hxx>
48#include <externalrefmgr.hxx>
49#include <markdata.hxx>
50#include <validat.hxx>
51#include <dociter.hxx>
52#include <detdata.hxx>
53#include <inputopt.hxx>
54#include <chartlis.hxx>
55#include <sc.hrc>
56#include <hints.hxx>
57#include <dpobject.hxx>
58#include <drwlayer.hxx>
59#include <unoreflist.hxx>
60#include <listenercalls.hxx>
61#include <tabprotection.hxx>
62#include <formulaparserpool.hxx>
63#include <clipparam.hxx>
64#include <sheetevents.hxx>
65#include <queryentry.hxx>
66#include <formulacell.hxx>
67#include <refupdatecontext.hxx>
68#include <scopetools.hxx>
69#include <filterentries.hxx>
70#include <queryparam.hxx>
71
72#include <globalnames.hxx>
73#include <LibreOfficeKit/LibreOfficeKitEnums.h>
74#include <comphelper/lok.hxx>
75#include <config_fuzzers.h>
76#include <memory>
77
78using namespace com::sun::star;
79
80namespace {
81
82void sortAndRemoveDuplicates(std::vector<ScTypedStrData>& rStrings, bool bCaseSens)
83{
84 if (bCaseSens)
85 {
86 std::stable_sort(rStrings.begin(), rStrings.end(), ScTypedStrData::LessCaseSensitive());
87 std::vector<ScTypedStrData>::iterator it =
88 std::unique(rStrings.begin(), rStrings.end(), ScTypedStrData::EqualCaseSensitive());
89 rStrings.erase(it, rStrings.end());
90 }
91 else
92 {
93 std::stable_sort(rStrings.begin(), rStrings.end(), ScTypedStrData::LessCaseInsensitive());
94 std::vector<ScTypedStrData>::iterator it =
95 std::unique(rStrings.begin(), rStrings.end(), ScTypedStrData::EqualCaseInsensitive());
96 rStrings.erase(it, rStrings.end());
97 }
98 if (std::any_of(rStrings.begin(), rStrings.end(),
99 [](ScTypedStrData& rString) { return rString.IsHiddenByFilter(); })) {
100 std::stable_sort(rStrings.begin(), rStrings.end(), ScTypedStrData::LessHiddenRows());
101 }
102}
103
104}
105
107{
109 for (SCTAB i = 0; i < static_cast<SCTAB>(maTabs.size()); ++i)
110 {
111 if (!maTabs[i])
112 // no more tables to iterate through.
113 break;
114
115 const ScRangeName* p = maTabs[i]->mpRangeName.get();
116 if (!p || p->empty())
117 // ignore empty ones.
118 continue;
119
120 aNames.emplace(i, p);
121 }
122 rNames.swap(aNames);
123}
124
125void ScDocument::SetAllRangeNames(const std::map<OUString, ScRangeName>& rRangeMap)
126{
127 for (const auto& [rName, rRangeName] : rRangeMap)
128 {
129 if (rName == STR_GLOBAL_RANGE_NAME)
130 {
131 pRangeName.reset();
132 if (!rRangeName.empty())
133 pRangeName.reset( new ScRangeName( rRangeName ) );
134 }
135 else
136 {
137 SCTAB nTab;
138 bool bFound = GetTable(rName, nTab);
139 assert(bFound); (void)bFound; // fouled up?
140 if (rRangeName.empty())
141 SetRangeName( nTab, nullptr );
142 else
143 SetRangeName( nTab, std::unique_ptr<ScRangeName>(new ScRangeName( rRangeName )) );
144 }
145 }
146}
147
148void ScDocument::GetRangeNameMap(std::map<OUString, ScRangeName*>& aRangeNameMap)
149{
150 for (SCTAB i = 0; i < static_cast<SCTAB>(maTabs.size()); ++i)
151 {
152 if (!maTabs[i])
153 continue;
154 ScRangeName* p = maTabs[i]->GetRangeName();
155 if (!p )
156 {
157 p = new ScRangeName();
158 SetRangeName(i, std::unique_ptr<ScRangeName>(p));
159 }
160 OUString aTableName = maTabs[i]->GetName();
161 aRangeNameMap.insert(std::pair<OUString, ScRangeName*>(aTableName,p));
162 }
163 if (!pRangeName)
164 {
165 pRangeName.reset(new ScRangeName());
166 }
167 aRangeNameMap.insert(std::pair<OUString, ScRangeName*>(STR_GLOBAL_RANGE_NAME, pRangeName.get()));
168}
169
171{
172 if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab])
173 return nullptr;
174
175 return maTabs[nTab]->GetRangeName();
176}
177
179{
180 if (!pRangeName)
181 pRangeName.reset(new ScRangeName);
182 return pRangeName.get();
183}
184
185void ScDocument::SetRangeName(SCTAB nTab, std::unique_ptr<ScRangeName> pNew)
186{
187 if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab])
188 return;
189
190 return maTabs[nTab]->SetRangeName(std::move(pNew));
191}
192
193void ScDocument::SetRangeName( std::unique_ptr<ScRangeName> pNewRangeName )
194{
195 pRangeName = std::move(pNewRangeName);
196}
197
199{
200 ScRangeName* pRangeNames;
201 ScRange aNameRange;
202
203 if (eScope == RangeNameScope::GLOBAL)
204 pRangeNames= GetRangeName();
205 else
206 pRangeNames= GetRangeName(rAddress.Tab());
207
208 for (const auto& rEntry : *pRangeNames)
209 {
210 if (rEntry.second->IsValidReference(aNameRange))
211 {
212 if (aNameRange.Contains(rAddress))
213 return true;
214 }
215 }
216
217 return false;
218}
219
220bool ScDocument::InsertNewRangeName( const OUString& rName, const ScAddress& rPos, const OUString& rExpr )
221{
222 ScRangeName* pGlobalNames = GetRangeName();
223 if (!pGlobalNames)
224 return false;
225
226 ScRangeData* pName = new ScRangeData(*this, rName, rExpr, rPos, ScRangeData::Type::Name, GetGrammar());
227 return pGlobalNames->insert(pName);
228}
229
230bool ScDocument::InsertNewRangeName( SCTAB nTab, const OUString& rName, const ScAddress& rPos, const OUString& rExpr )
231{
232 ScRangeName* pLocalNames = GetRangeName(nTab);
233 if (!pLocalNames)
234 return false;
235
236 ScRangeData* pName = new ScRangeData(*this, rName, rExpr, rPos, ScRangeData::Type::Name, GetGrammar());
237 return pLocalNames->insert(pName);
238}
239
240const ScRangeData* ScDocument::GetRangeAtBlock( const ScRange& rBlock, OUString& rName, bool* pSheetLocal ) const
241{
242 const ScRangeData* pData = nullptr;
243 if (rBlock.aStart.Tab() == rBlock.aEnd.Tab())
244 {
245 const ScRangeName* pLocalNames = GetRangeName(rBlock.aStart.Tab());
246 if (pLocalNames)
247 {
248 pData = pLocalNames->findByRange( rBlock );
249 if (pData)
250 {
251 rName = pData->GetName();
252 if (pSheetLocal)
253 *pSheetLocal = true;
254 return pData;
255 }
256 }
257 }
258 if ( pRangeName )
259 {
260 pData = pRangeName->findByRange( rBlock );
261 if (pData)
262 {
263 rName = pData->GetName();
264 if (pSheetLocal)
265 *pSheetLocal = false;
266 }
267 }
268 return pData;
269}
270
272{
273 const ScRangeName* pRN = (nTab < 0 ? GetRangeName() : GetRangeName(nTab));
274 return (pRN ? pRN->findByIndex( nIndex) : nullptr);
275}
276
277void ScDocument::SetDBCollection( std::unique_ptr<ScDBCollection> pNewDBCollection, bool bRemoveAutoFilter )
278{
279 if (pDBCollection && bRemoveAutoFilter)
280 {
281 // remove auto filter attribute if new db data don't contain auto filter flag
282 // start position is also compared, so bRemoveAutoFilter must not be set from ref-undo!
283
284 ScDBCollection::NamedDBs& rNamedDBs = pDBCollection->getNamedDBs();
285 for (const auto& rxNamedDB : rNamedDBs)
286 {
287 const ScDBData& rOldData = *rxNamedDB;
288 if (!rOldData.HasAutoFilter())
289 continue;
290
291 ScRange aOldRange;
292 rOldData.GetArea(aOldRange);
293
294 bool bFound = false;
295 if (pNewDBCollection)
296 {
297 ScDBData* pNewData = pNewDBCollection->getNamedDBs().findByUpperName(rOldData.GetUpperName());
298 if (pNewData)
299 {
300 if (pNewData->HasAutoFilter())
301 {
302 ScRange aNewRange;
303 pNewData->GetArea(aNewRange);
304 if (aOldRange.aStart == aNewRange.aStart)
305 bFound = true;
306 }
307 }
308 }
309
310 if (!bFound)
311 {
312 aOldRange.aEnd.SetRow(aOldRange.aStart.Row());
313 RemoveFlagsTab( aOldRange.aStart.Col(), aOldRange.aStart.Row(),
314 aOldRange.aEnd.Col(), aOldRange.aEnd.Row(),
315 aOldRange.aStart.Tab(), ScMF::Auto );
316 RepaintRange( aOldRange );
317 }
318 }
319 }
320
321 pDBCollection = std::move(pNewDBCollection);
322}
323
324const ScDBData* ScDocument::GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, ScDBDataPortion ePortion) const
325{
326 if (pDBCollection)
327 return pDBCollection->GetDBAtCursor(nCol, nRow, nTab, ePortion);
328 else
329 return nullptr;
330}
331
333{
334 if (pDBCollection)
335 return pDBCollection->GetDBAtCursor(nCol, nRow, nTab, ePortion);
336 else
337 return nullptr;
338}
339
340const ScDBData* ScDocument::GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const
341{
342 if (pDBCollection)
343 return pDBCollection->GetDBAtArea(nTab, nCol1, nRow1, nCol2, nRow2);
344 else
345 return nullptr;
346}
347
348ScDBData* ScDocument::GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
349{
350 if (pDBCollection)
351 return pDBCollection->GetDBAtArea(nTab, nCol1, nRow1, nCol2, nRow2);
352 else
353 return nullptr;
354}
355
357{
358 if (pDBCollection)
359 pDBCollection->RefreshDirtyTableColumnNames();
360}
361
363{
364 return pDPCollection && pDPCollection->GetCount();
365}
366
368{
369 if (!pDPCollection)
370 pDPCollection.reset( new ScDPCollection(*this) );
371 return pDPCollection.get();
372}
373
375{
376 return pDPCollection.get();
377}
378
380{
381 if (!pDPCollection)
382 return nullptr;
383
384 sal_uInt16 nCount = pDPCollection->GetCount();
385 ScAddress aPos( nCol, nRow, nTab );
386 for (sal_uInt16 i=0; i<nCount; i++)
387 if ( (*pDPCollection)[i].GetOutRange().Contains( aPos ) )
388 return &(*pDPCollection)[i];
389
390 return nullptr;
391}
392
394{
395 if (!pDPCollection)
396 return nullptr;
397
398 /* Walk the collection in reverse order to get something of an
399 * approximation of MS Excels 'most recent' effect. */
400 sal_uInt16 i = pDPCollection->GetCount();
401 while ( i-- > 0 )
402 if ( (*pDPCollection)[i].GetOutRange().Contains( rBlock ) )
403 return &(*pDPCollection)[i];
404
405 return nullptr;
406}
407
409{
411 apTemporaryChartLock->StopLocking();
412}
413
415 std::unique_ptr<ScChartListenerCollection> pNewChartListenerCollection,
416 bool bSetChartRangeLists )
417{
418 std::unique_ptr<ScChartListenerCollection> pOld = std::move(pChartListenerCollection);
419 pChartListenerCollection = std::move(pNewChartListenerCollection);
421 {
422 if ( pOld )
423 pChartListenerCollection->SetDiffDirty( *pOld, bSetChartRangeLists );
424 pChartListenerCollection->StartAllListeners();
425 }
426}
427
428void ScDocument::SetScenario( SCTAB nTab, bool bFlag )
429{
430 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
431 maTabs[nTab]->SetScenario(bFlag);
432}
433
435{
436 return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] &&maTabs[nTab]->IsScenario();
437}
438
439void ScDocument::SetScenarioData( SCTAB nTab, const OUString& rComment,
440 const Color& rColor, ScScenarioFlags nFlags )
441{
442 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario())
443 {
444 maTabs[nTab]->SetScenarioComment( rComment );
445 maTabs[nTab]->SetScenarioColor( rColor );
446 maTabs[nTab]->SetScenarioFlags( nFlags );
447 }
448}
449
451{
452 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
453 return maTabs[nTab]->GetTabBgColor();
454 return COL_AUTO;
455}
456
457void ScDocument::SetTabBgColor( SCTAB nTab, const Color& rColor )
458{
459 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
460 maTabs[nTab]->SetTabBgColor(rColor);
461}
462
464{
465 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
466 return maTabs[nTab]->GetTabBgColor() == COL_AUTO;
467 return true;
468}
469
470void ScDocument::GetScenarioData( SCTAB nTab, OUString& rComment,
471 Color& rColor, ScScenarioFlags& rFlags ) const
472{
473 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario())
474 {
475 maTabs[nTab]->GetScenarioComment( rComment );
476 rColor = maTabs[nTab]->GetScenarioColor();
477 rFlags = maTabs[nTab]->GetScenarioFlags();
478 }
479}
480
482{
483 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario())
484 rFlags = maTabs[nTab]->GetScenarioFlags();
485}
486
487bool ScDocument::IsLinked( SCTAB nTab ) const
488{
489 return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsLinked();
490 // equivalent to
491 //if (ValidTab(nTab) && pTab[nTab])
492 // return pTab[nTab]->IsLinked();
493 //return false;
494}
495
497{
499}
500
502{
503 eGrammar = eGram;
504}
505
507{
508 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
509 return maTabs[nTab]->GetLinkMode();
510 return ScLinkMode::NONE;
511}
512
513OUString ScDocument::GetLinkDoc( SCTAB nTab ) const
514{
515 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
516 return maTabs[nTab]->GetLinkDoc();
517 return OUString();
518}
519
520OUString ScDocument::GetLinkFlt( SCTAB nTab ) const
521{
522 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
523 return maTabs[nTab]->GetLinkFlt();
524 return OUString();
525}
526
527OUString ScDocument::GetLinkOpt( SCTAB nTab ) const
528{
529 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
530 return maTabs[nTab]->GetLinkOpt();
531 return OUString();
532}
533
534OUString ScDocument::GetLinkTab( SCTAB nTab ) const
535{
536 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
537 return maTabs[nTab]->GetLinkTab();
538 return OUString();
539}
540
542{
543 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
544 return maTabs[nTab]->GetLinkRefreshDelay();
545 return 0;
546}
547
548void ScDocument::SetLink( SCTAB nTab, ScLinkMode nMode, const OUString& rDoc,
549 const OUString& rFilter, const OUString& rOptions,
550 const OUString& rTabName, sal_uLong nRefreshDelay )
551{
552 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
553 maTabs[nTab]->SetLink( nMode, rDoc, rFilter, rOptions, rTabName, nRefreshDelay );
554}
555
556bool ScDocument::HasLink( std::u16string_view rDoc,
557 std::u16string_view rFilter, std::u16string_view rOptions ) const
558{
559 SCTAB nCount = static_cast<SCTAB>(maTabs.size());
560 for (SCTAB i=0; i<nCount; i++)
561 if (maTabs[i]->IsLinked()
562 && maTabs[i]->GetLinkDoc() == rDoc
563 && maTabs[i]->GetLinkFlt() == rFilter
564 && maTabs[i]->GetLinkOpt() == rOptions)
565 return true;
566
567 return false;
568}
569
570bool ScDocument::LinkExternalTab( SCTAB& rTab, const OUString& aDocTab,
571 const OUString& aFileName, const OUString& aTabName )
572{
573 if ( IsClipboard() )
574 {
575 OSL_FAIL( "LinkExternalTab in Clipboard" );
576 return false;
577 }
578 rTab = 0;
579#if ENABLE_FUZZERS
580 (void)aDocTab;
581 (void)aFileName;
582 (void)aTabName;
583 return false;
584#else
585 OUString aFilterName; // Is filled by the Loader
586 OUString aOptions; // Filter options
587 sal_uInt32 nLinkCnt = pExtDocOptions ? pExtDocOptions->GetDocSettings().mnLinkCnt : 0;
588 ScDocumentLoader aLoader( aFileName, aFilterName, aOptions, nLinkCnt + 1 );
589 if ( aLoader.IsError() )
590 return false;
591 ScDocument* pSrcDoc = aLoader.GetDocument();
592
593 // Copy table
594 SCTAB nSrcTab;
595 if ( pSrcDoc->GetTable( aTabName, nSrcTab ) )
596 {
597 if ( !InsertTab( SC_TAB_APPEND, aDocTab, true ) )
598 {
599 OSL_FAIL("can't insert external document table");
600 return false;
601 }
602 rTab = GetTableCount() - 1;
603 // Don't insert anew, just the results
604 TransferTab( *pSrcDoc, nSrcTab, rTab, false, true );
605 }
606 else
607 return false;
608
609 sal_uLong nRefreshDelay = 0;
610
611 bool bWasThere = HasLink( aFileName, aFilterName, aOptions );
612 SetLink( rTab, ScLinkMode::VALUE, aFileName, aFilterName, aOptions, aTabName, nRefreshDelay );
613 if ( !bWasThere ) // Add link only once per source document
614 {
615 ScTableLink* pLink = new ScTableLink( mpShell, aFileName, aFilterName, aOptions, nRefreshDelay );
616 pLink->SetInCreate( true );
617 OUString aFilName = aFilterName;
619 pLink->Update();
620 pLink->SetInCreate( false );
621 SfxBindings* pBindings = GetViewBindings();
622 if (pBindings)
623 pBindings->Invalidate( SID_LINKS );
624 }
625 return true;
626#endif
627}
628
630{
631 ScDocument* pThis = const_cast<ScDocument*>(this);
632 if (!pExternalRefMgr)
633 pThis->pExternalRefMgr.reset( new ScExternalRefManager(*pThis));
634
635 return pExternalRefMgr.get();
636}
637
639{
640 return pExternalRefMgr && pExternalRefMgr->isInReferenceMarking();
641}
642
644{
645 if (!pExternalRefMgr)
646 return;
647 if (!pExternalRefMgr->hasExternalData())
648 return;
649 // Charts.
650 pExternalRefMgr->markUsedByLinkListeners();
651 // Formula cells.
652 pExternalRefMgr->markUsedExternalRefCells();
653
654 /* NOTE: Conditional formats and validation objects are marked when
655 * collecting them during export. */
656}
657
659{
661 mxFormulaParserPool.reset( new ScFormulaParserPool( *this ) );
662 return *mxFormulaParserPool;
663}
664
666{
667 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
668 return maTabs[nTab]->GetSheetEvents();
669 return nullptr;
670}
671
672void ScDocument::SetSheetEvents( SCTAB nTab, std::unique_ptr<ScSheetEvents> pNew )
673{
674 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
675 maTabs[nTab]->SetSheetEvents( std::move(pNew) );
676}
677
678bool ScDocument::HasSheetEventScript( SCTAB nTab, ScSheetEventId nEvent, bool bWithVbaEvents ) const
679{
680 if (nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
681 {
682 // check if any event handler script has been configured
683 const ScSheetEvents* pEvents = maTabs[nTab]->GetSheetEvents();
684 if ( pEvents && pEvents->GetScript( nEvent ) )
685 return true;
686 // check if VBA event handlers exist
687 if (bWithVbaEvents && mxVbaEvents.is()) try
688 {
689 uno::Sequence< uno::Any > aArgs{ uno::Any(nTab) };
690 if (mxVbaEvents->hasVbaEventHandler( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs ) ||
691 mxVbaEvents->hasVbaEventHandler( ScSheetEvents::GetVbaDocumentEventId( nEvent ), uno::Sequence< uno::Any >() ))
692 return true;
693 }
694 catch( uno::Exception& )
695 {
696 }
697 }
698 return false;
699}
700
701bool ScDocument::HasAnySheetEventScript( ScSheetEventId nEvent, bool bWithVbaEvents ) const
702{
703 SCTAB nSize = static_cast<SCTAB>(maTabs.size());
704 for (SCTAB nTab = 0; nTab < nSize; nTab++)
705 if (HasSheetEventScript( nTab, nEvent, bWithVbaEvents ))
706 return true;
707 return false;
708}
709
711{
712 SCTAB nSize = static_cast<SCTAB>(maTabs.size());
713 for (SCTAB nTab = 0; nTab < nSize; nTab++)
714 if (maTabs[nTab] && maTabs[nTab]->GetCalcNotification())
715 return true;
716 return false;
717}
718
720{
721 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
722 return maTabs[nTab]->GetCalcNotification();
723 return false;
724}
725
727{
728 // set only if not set before
729 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && !maTabs[nTab]->GetCalcNotification())
730 maTabs[nTab]->SetCalcNotification(true);
731}
732
734{
735 SCTAB nSize = static_cast<SCTAB>(maTabs.size());
736 for (SCTAB nTab = 0; nTab < nSize; nTab++)
737 if (maTabs[nTab] && maTabs[nTab]->GetCalcNotification())
738 maTabs[nTab]->SetCalcNotification(false);
739}
740
742{
743 ScOutlineTable* pVal = nullptr;
744
745 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()))
746 if (maTabs[nTab])
747 {
748 pVal = maTabs[nTab]->GetOutlineTable();
749 if (!pVal && bCreate)
750 {
751 maTabs[nTab]->StartOutlineTable();
752 pVal = maTabs[nTab]->GetOutlineTable();
753 }
754 }
755
756 return pVal;
757}
758
759bool ScDocument::SetOutlineTable( SCTAB nTab, const ScOutlineTable* pNewOutline )
760{
761 return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->SetOutlineTable(pNewOutline);
762}
763
764void ScDocument::DoAutoOutline( SCCOL nStartCol, SCROW nStartRow,
765 SCCOL nEndCol, SCROW nEndRow, SCTAB nTab )
766{
767 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
768 maTabs[nTab]->DoAutoOutline( nStartCol, nStartRow, nEndCol, nEndRow );
769}
770
772{
773 return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->TestRemoveSubTotals( rParam );
774}
775
777{
778 if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
779 maTabs[nTab]->RemoveSubTotals( rParam );
780}
781
783{
784 return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->DoSubTotals( rParam );
785}
786
788{
789 ScCellIterator aIter(*this, rRange);
790 for (bool bHas = aIter.first(); bHas; bHas = aIter.next())
791 {
792 if (aIter.getType() != CELLTYPE_FORMULA)
793 continue;
794
795 if (aIter.getFormulaCell()->IsSubTotal())
796 return true;
797 }
798 return false; // none found
799}
800
806{
807 SCTAB nCount = static_cast<SCTAB>(maTabs.size());
808 for (SCTAB nTab=0; nTab<nCount; nTab++)
809 if (maTabs[nTab] && pPosDoc->maTabs[nTab] && pDestDoc->maTabs[nTab])
810 maTabs[nTab]->CopyUpdated( pPosDoc->maTabs[nTab].get(), pDestDoc->maTabs[nTab].get() );
811}
812
813void ScDocument::CopyScenario( SCTAB nSrcTab, SCTAB nDestTab, bool bNewScenario )
814{
815 if (!(ValidTab(nSrcTab) && ValidTab(nDestTab) && nSrcTab < static_cast<SCTAB>(maTabs.size())
816 && nDestTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nSrcTab] && maTabs[nDestTab]))
817 return;
818
819 // Set flags correctly for active scenarios
820 // and write current values back to recently active scenarios
821 ScRangeList aRanges = *maTabs[nSrcTab]->GetScenarioRanges();
822
823 // nDestTab is the target table
824 for ( SCTAB nTab = nDestTab+1;
825 nTab< static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario();
826 nTab++ )
827 {
828 if ( maTabs[nTab]->IsActiveScenario() ) // Even if it's the same scenario
829 {
830 bool bTouched = false;
831 for ( size_t nR=0, nRangeCount = aRanges.size(); nR < nRangeCount && !bTouched; nR++ )
832 {
833 const ScRange& rRange = aRanges[ nR ];
834 if ( maTabs[nTab]->HasScenarioRange( rRange ) )
835 bTouched = true;
836 }
837 if (bTouched)
838 {
839 maTabs[nTab]->SetActiveScenario(false);
841 maTabs[nTab]->CopyScenarioFrom( maTabs[nDestTab].get() );
842 }
843 }
844 }
845
846 maTabs[nSrcTab]->SetActiveScenario(true); // This is where it's from ...
847 if (!bNewScenario) // Copy data from the selected scenario
848 {
849 sc::AutoCalcSwitch aACSwitch(*this, false);
850 maTabs[nSrcTab]->CopyScenarioTo( maTabs[nDestTab].get() );
851
854 }
855}
856
857void ScDocument::MarkScenario( SCTAB nSrcTab, SCTAB nDestTab, ScMarkData& rDestMark,
858 bool bResetMark, ScScenarioFlags nNeededBits ) const
859{
860 if (bResetMark)
861 rDestMark.ResetMark();
862
863 if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nSrcTab])
864 maTabs[nSrcTab]->MarkScenarioIn( rDestMark, nNeededBits );
865
866 rDestMark.SetAreaTab( nDestTab );
867}
868
869bool ScDocument::HasScenarioRange( SCTAB nTab, const ScRange& rRange ) const
870{
871 return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->HasScenarioRange( rRange );
872}
873
875{
876 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
877 return maTabs[nTab]->GetScenarioRanges();
878
879 return nullptr;
880}
881
883{
884 return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsActiveScenario( );
885}
886
887void ScDocument::SetActiveScenario( SCTAB nTab, bool bActive )
888{
889 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
890 maTabs[nTab]->SetActiveScenario( bActive );
891}
892
893bool ScDocument::TestCopyScenario( SCTAB nSrcTab, SCTAB nDestTab ) const
894{
895 if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(maTabs.size())
896 && nDestTab < static_cast<SCTAB>(maTabs.size())&& ValidTab(nDestTab))
897 return maTabs[nSrcTab]->TestCopyScenarioTo( maTabs[nDestTab].get() );
898
899 OSL_FAIL("wrong table at TestCopyScenario");
900 return false;
901}
902
904{
905 if (!pUnoBroadcaster)
906 pUnoBroadcaster.reset( new SfxBroadcaster );
907
909}
910
912{
913 if (pUnoBroadcaster)
914 {
915 rObject.EndListening( *pUnoBroadcaster );
916
917 if ( bInUnoBroadcast )
918 {
919 // Broadcasts from ScDocument::BroadcastUno are the only way that
920 // uno object methods are called without holding a reference.
921 //
922 // If RemoveUnoObject is called from an object dtor in the finalizer thread
923 // while the main thread is calling BroadcastUno, the dtor thread must wait
924 // (or the object's Notify might try to access a deleted object).
925 // The SolarMutex can't be locked here because if a component is called from
926 // a VCL event, the main thread has the SolarMutex locked all the time.
927 //
928 // This check is done after calling EndListening, so a later BroadcastUno call
929 // won't touch this object.
930
932 if (g.isAcquired())
933 {
934 // BroadcastUno is always called with the SolarMutex locked, so if it
935 // can be acquired, this is within the same thread (should not happen)
936 OSL_FAIL( "RemoveUnoObject called from BroadcastUno" );
937 }
938 else
939 {
940 // Let the thread that called BroadcastUno continue
941 while ( bInUnoBroadcast )
942 {
943 osl::Thread::yield();
944 }
945 }
946 }
947 }
948 else
949 {
950 OSL_FAIL("No Uno broadcaster");
951 }
952}
953
955{
956 if (!pUnoBroadcaster)
957 return;
958
959 bInUnoBroadcast = true;
960 pUnoBroadcaster->Broadcast( rHint );
961 bInUnoBroadcast = false;
962
963 // During Broadcast notification, Uno objects can add to pUnoListenerCalls.
964 // The listener calls must be processed after completing the broadcast,
965 // because they can add or remove objects from pUnoBroadcaster.
966
967 if ( pUnoListenerCalls &&
968 rHint.GetId() == SfxHintId::DataChanged &&
970 {
971 // Listener calls may lead to BroadcastUno calls again. The listener calls
972 // are not nested, instead the calls are collected in the list, and the
973 // outermost call executes them all.
974
975 ScChartLockGuard aChartLockGuard(this);
976 bInUnoListenerCall = true;
977 pUnoListenerCalls->ExecuteAndClear();
978 bInUnoListenerCall = false;
979 }
980}
981
982void ScDocument::AddUnoListenerCall( const uno::Reference<util::XModifyListener>& rListener,
983 const lang::EventObject& rEvent )
984{
985 OSL_ENSURE( bInUnoBroadcast, "AddUnoListenerCall is supposed to be called from BroadcastUno only" );
986
987 if ( !pUnoListenerCalls )
989 pUnoListenerCalls->Add( rListener, rEvent );
990}
991
993{
994 OSL_ENSURE( !pUnoRefUndoList, "BeginUnoRefUndo twice" );
995 pUnoRefUndoList.reset( new ScUnoRefList );
996}
997
998std::unique_ptr<ScUnoRefList> ScDocument::EndUnoRefUndo()
999{
1000 return std::move(pUnoRefUndoList);
1001 // Must be deleted by caller!
1002}
1003
1004void ScDocument::AddUnoRefChange( sal_Int64 nId, const ScRangeList& rOldRanges )
1005{
1006 if ( pUnoRefUndoList )
1007 pUnoRefUndoList->Add( nId, rOldRanges );
1008}
1009
1011 sc::RefUpdateContext& rCxt, ScDocument* pUndoDoc, bool bIncludeDraw, bool bUpdateNoteCaptionPos )
1012{
1013 if (!ValidRange(rCxt.maRange) && !(rCxt.meMode == URM_INSDEL &&
1014 ((rCxt.mnColDelta < 0 && // convention from ScDocument::DeleteCol()
1015 rCxt.maRange.aStart.Col() == GetMaxColCount() && rCxt.maRange.aEnd.Col() == GetMaxColCount()) ||
1016 (rCxt.mnRowDelta < 0 && // convention from ScDocument::DeleteRow()
1017 rCxt.maRange.aStart.Row() == GetMaxRowCount() && rCxt.maRange.aEnd.Row() == GetMaxRowCount()))))
1018 return;
1019
1020 std::unique_ptr<sc::ExpandRefsSwitch> pExpandRefsSwitch;
1021 if (rCxt.isInserted())
1022 pExpandRefsSwitch.reset(new sc::ExpandRefsSwitch(*this, SC_MOD()->GetInputOptions().GetExpandRefs()));
1023
1024 size_t nFirstTab, nLastTab;
1025 if (rCxt.meMode == URM_COPY)
1026 {
1027 nFirstTab = rCxt.maRange.aStart.Tab();
1028 nLastTab = rCxt.maRange.aEnd.Tab();
1029 }
1030 else
1031 {
1032 // TODO: Have these methods use the context object directly.
1033 ScRange aRange = rCxt.maRange;
1034 UpdateRefMode eUpdateRefMode = rCxt.meMode;
1035 SCCOL nDx = rCxt.mnColDelta;
1036 SCROW nDy = rCxt.mnRowDelta;
1037 SCTAB nDz = rCxt.mnTabDelta;
1038 SCCOL nCol1 = rCxt.maRange.aStart.Col(), nCol2 = rCxt.maRange.aEnd.Col();
1039 SCROW nRow1 = rCxt.maRange.aStart.Row(), nRow2 = rCxt.maRange.aEnd.Row();
1040 SCTAB nTab1 = rCxt.maRange.aStart.Tab(), nTab2 = rCxt.maRange.aEnd.Tab();
1041
1042 xColNameRanges->UpdateReference( eUpdateRefMode, this, aRange, nDx, nDy, nDz );
1043 xRowNameRanges->UpdateReference( eUpdateRefMode, this, aRange, nDx, nDy, nDz );
1044 pDBCollection->UpdateReference( eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2, nDx, nDy, nDz );
1045 if (pRangeName)
1046 pRangeName->UpdateReference(rCxt);
1047 if ( pDPCollection )
1048 pDPCollection->UpdateReference( eUpdateRefMode, aRange, nDx, nDy, nDz );
1049 UpdateChartRef( eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2, nDx, nDy, nDz );
1050 UpdateRefAreaLinks( eUpdateRefMode, aRange, nDx, nDy, nDz );
1051 if ( pValidationList )
1052 {
1054 pValidationList->UpdateReference(rCxt);
1055 }
1056 if ( pDetOpList )
1057 pDetOpList->UpdateReference( this, eUpdateRefMode, aRange, nDx, nDy, nDz );
1058 if ( pUnoBroadcaster )
1059 pUnoBroadcaster->Broadcast( ScUpdateRefHint(
1060 eUpdateRefMode, aRange, nDx, nDy, nDz ) );
1061
1062 nFirstTab = 0;
1063 nLastTab = maTabs.size()-1;
1064 }
1065
1066 for (size_t i = nFirstTab, n = maTabs.size() ; i <= nLastTab && i < n; ++i)
1067 {
1068 if (!maTabs[i])
1069 continue;
1070
1071 maTabs[i]->UpdateReference(rCxt, pUndoDoc, bIncludeDraw, bUpdateNoteCaptionPos);
1072 }
1073
1074 if ( bIsEmbedded )
1075 {
1076 SCCOL theCol1;
1077 SCROW theRow1;
1078 SCTAB theTab1;
1079 SCCOL theCol2;
1080 SCROW theRow2;
1081 SCTAB theTab2;
1082 theCol1 = aEmbedRange.aStart.Col();
1083 theRow1 = aEmbedRange.aStart.Row();
1084 theTab1 = aEmbedRange.aStart.Tab();
1085 theCol2 = aEmbedRange.aEnd.Col();
1086 theRow2 = aEmbedRange.aEnd.Row();
1087 theTab2 = aEmbedRange.aEnd.Tab();
1088
1089 // TODO: Have ScRefUpdate::Update() use the context object directly.
1090 UpdateRefMode eUpdateRefMode = rCxt.meMode;
1091 SCCOL nDx = rCxt.mnColDelta;
1092 SCROW nDy = rCxt.mnRowDelta;
1093 SCTAB nDz = rCxt.mnTabDelta;
1094 SCCOL nCol1 = rCxt.maRange.aStart.Col(), nCol2 = rCxt.maRange.aEnd.Col();
1095 SCROW nRow1 = rCxt.maRange.aStart.Row(), nRow2 = rCxt.maRange.aEnd.Row();
1096 SCTAB nTab1 = rCxt.maRange.aStart.Tab(), nTab2 = rCxt.maRange.aEnd.Tab();
1097
1098 if ( ScRefUpdate::Update( this, eUpdateRefMode, nCol1,nRow1,nTab1, nCol2,nRow2,nTab2,
1099 nDx,nDy,nDz, theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 ) )
1100 {
1101 aEmbedRange = ScRange( theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 );
1102 }
1103 }
1104
1105 // After moving, no clipboard move ref-updates are possible
1106 if (rCxt.meMode != URM_COPY && IsClipboardSource())
1107 {
1108 ScDocument* pClipDoc = ScModule::GetClipDoc();
1109 if (pClipDoc)
1110 pClipDoc->GetClipParam().mbCutMode = false;
1111 }
1112}
1113
1114void ScDocument::UpdateTranspose( const ScAddress& rDestPos, ScDocument* pClipDoc,
1115 const ScMarkData& rMark, ScDocument* pUndoDoc )
1116{
1117 OSL_ENSURE(pClipDoc->bIsClip, "UpdateTranspose: No Clip");
1118
1119 ScRange aSource;
1120 ScClipParam& rClipParam = pClipDoc->GetClipParam();
1121 if (!rClipParam.maRanges.empty())
1122 aSource = rClipParam.maRanges.front();
1123 ScAddress aDest = rDestPos;
1124
1125 SCTAB nClipTab = 0;
1126 for (SCTAB nDestTab=0; nDestTab< static_cast<SCTAB>(maTabs.size()) && maTabs[nDestTab]; nDestTab++)
1127 if (rMark.GetTableSelect(nDestTab))
1128 {
1129 while (!pClipDoc->maTabs[nClipTab]) nClipTab = (nClipTab+1) % (MAXTAB+1);
1130 aSource.aStart.SetTab( nClipTab );
1131 aSource.aEnd.SetTab( nClipTab );
1132 aDest.SetTab( nDestTab );
1133
1134 // Like UpdateReference
1135 if (pRangeName)
1136 pRangeName->UpdateTranspose( aSource, aDest ); // Before the cells!
1137 for (SCTAB i=0; i< static_cast<SCTAB>(maTabs.size()); i++)
1138 if (maTabs[i])
1139 maTabs[i]->UpdateTranspose( aSource, aDest, pUndoDoc );
1140
1141 nClipTab = (nClipTab+1) % (MAXTAB+1);
1142 }
1143}
1144
1145void ScDocument::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY )
1146{
1147 //TODO: pDBCollection
1148 //TODO: pPivotCollection
1149 //TODO: UpdateChartRef
1150
1151 if (pRangeName)
1152 pRangeName->UpdateGrow( rArea, nGrowX, nGrowY );
1153
1154 for (SCTAB i=0; i< static_cast<SCTAB>(maTabs.size()) && maTabs[i]; i++)
1155 maTabs[i]->UpdateGrow( rArea, nGrowX, nGrowY );
1156}
1157
1158void ScDocument::Fill(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScProgress* pProgress, const ScMarkData& rMark,
1159 sal_uInt64 nFillCount, FillDir eFillDir, FillCmd eFillCmd, FillDateCmd eFillDateCmd,
1160 double nStepValue, double nMaxValue)
1161{
1162 PutInOrder( nCol1, nCol2 );
1163 PutInOrder( nRow1, nRow2 );
1164 const ScRange& aRange = rMark.GetMarkArea();
1165 SCTAB nMax = maTabs.size();
1166 for (const auto& rTab : rMark)
1167 {
1168 if (rTab >= nMax)
1169 break;
1170 if (maTabs[rTab])
1171 {
1172 maTabs[rTab]->Fill(nCol1, nRow1, nCol2, nRow2,
1173 nFillCount, eFillDir, eFillCmd, eFillDateCmd,
1174 nStepValue, nMaxValue, pProgress);
1175 RefreshAutoFilter(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), aRange.aEnd.Row(), rTab);
1176 }
1177 }
1178}
1179
1180OUString ScDocument::GetAutoFillPreview( const ScRange& rSource, SCCOL nEndX, SCROW nEndY )
1181{
1182 SCTAB nTab = rSource.aStart.Tab();
1183 if (nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
1184 return maTabs[nTab]->GetAutoFillPreview( rSource, nEndX, nEndY );
1185
1186 return OUString();
1187}
1188
1189void ScDocument::AutoFormat( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
1190 sal_uInt16 nFormatNo, const ScMarkData& rMark )
1191{
1192 PutInOrder( nStartCol, nEndCol );
1193 PutInOrder( nStartRow, nEndRow );
1194 SCTAB nMax = maTabs.size();
1195 for (const auto& rTab : rMark)
1196 {
1197 if (rTab >= nMax)
1198 break;
1199 if (maTabs[rTab])
1200 maTabs[rTab]->AutoFormat( nStartCol, nStartRow, nEndCol, nEndRow, nFormatNo );
1201 }
1202}
1203
1204void ScDocument::GetAutoFormatData(SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
1205 ScAutoFormatData& rData)
1206{
1207 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()))
1208 {
1209 if (maTabs[nTab])
1210 {
1211 PutInOrder(nStartCol, nEndCol);
1212 PutInOrder(nStartRow, nEndRow);
1213 maTabs[nTab]->GetAutoFormatData(nStartCol, nStartRow, nEndCol, nEndRow, rData);
1214 }
1215 }
1216}
1217
1219 SCCOL& rCol, SCROW& rRow )
1220{
1221 SvxSearchCmd nCommand = rSearchItem.GetCommand();
1222 bool bReplace = ( nCommand == SvxSearchCmd::REPLACE ||
1223 nCommand == SvxSearchCmd::REPLACE_ALL );
1224 if ( rSearchItem.GetBackward() )
1225 {
1226 if ( rSearchItem.GetRowDirection() )
1227 {
1228 if ( rSearchItem.GetPattern() )
1229 {
1230 rCol = MaxCol();
1231 rRow = MaxRow()+1;
1232 }
1233 else if ( bReplace )
1234 {
1235 rCol = MaxCol();
1236 rRow = MaxRow();
1237 }
1238 else
1239 {
1240 rCol = MaxCol()+1;
1241 rRow = MaxRow();
1242 }
1243 }
1244 else
1245 {
1246 if ( rSearchItem.GetPattern() )
1247 {
1248 rCol = MaxCol()+1;
1249 rRow = MaxRow();
1250 }
1251 else if ( bReplace )
1252 {
1253 rCol = MaxCol();
1254 rRow = MaxRow();
1255 }
1256 else
1257 {
1258 rCol = MaxCol();
1259 rRow = MaxRow()+1;
1260 }
1261 }
1262 }
1263 else
1264 {
1265 if ( rSearchItem.GetRowDirection() )
1266 {
1267 if ( rSearchItem.GetPattern() )
1268 {
1269 rCol = 0;
1270 rRow = SCROW(-1);
1271 }
1272 else if ( bReplace )
1273 {
1274 rCol = 0;
1275 rRow = 0;
1276 }
1277 else
1278 {
1279 rCol = SCCOL(-1);
1280 rRow = 0;
1281 }
1282 }
1283 else
1284 {
1285 if ( rSearchItem.GetPattern() )
1286 {
1287 rCol = SCCOL(-1);
1288 rRow = 0;
1289 }
1290 else if ( bReplace )
1291 {
1292 rCol = 0;
1293 rRow = 0;
1294 }
1295 else
1296 {
1297 rCol = 0;
1298 rRow = SCROW(-1);
1299 }
1300 }
1301 }
1302}
1303
1304// static
1306{
1307 return !rSearchItem.GetPattern() && (rSearchItem.GetCellType() != SvxSearchCellType::NOTE)
1308 && (rSearchItem.GetSearchOptions().searchString.isEmpty()
1309 || (rSearchItem.GetRegExp() && rSearchItem.GetSearchOptions().searchString == "^$"));
1310}
1311
1313 const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, SCTAB& rTab,
1314 const ScMarkData& rMark, ScRangeList& rMatchedRanges,
1315 OUString& rUndoStr, ScDocument* pUndoDoc, bool& bMatchedRangesWereClamped)
1316{
1317 // FIXME: Manage separated marks per table!
1318 bool bFound = false;
1319 if (rTab >= static_cast<SCTAB>(maTabs.size()))
1320 OSL_FAIL("table out of range");
1321 if (ValidTab(rTab))
1322 {
1323 SCCOL nCol;
1324 SCROW nRow;
1325 SCTAB nTab;
1326 SvxSearchCmd nCommand = rSearchItem.GetCommand();
1327 if ( nCommand == SvxSearchCmd::FIND_ALL ||
1328 nCommand == SvxSearchCmd::REPLACE_ALL )
1329 {
1330 SCTAB nMax = maTabs.size();
1331 for (const auto& rMarkedTab : rMark)
1332 {
1333 if (rMarkedTab >= nMax)
1334 break;
1335 if (maTabs[rMarkedTab])
1336 {
1337 nCol = 0;
1338 nRow = 0;
1339 bFound |= maTabs[rMarkedTab]->SearchAndReplace(
1340 rSearchItem, nCol, nRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc, bMatchedRangesWereClamped);
1341 }
1342 }
1343
1344 // Mark is set completely inside already
1345 }
1346 else
1347 {
1348 nCol = rCol;
1349 nRow = rRow;
1350 if (rSearchItem.GetBackward())
1351 {
1352 for (nTab = rTab; (nTab >= 0) && !bFound; nTab--)
1353 if (maTabs[nTab])
1354 {
1355 if (rMark.GetTableSelect(nTab))
1356 {
1357 bFound = maTabs[nTab]->SearchAndReplace(
1358 rSearchItem, nCol, nRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc, bMatchedRangesWereClamped);
1359 if (bFound)
1360 {
1361 rCol = nCol;
1362 rRow = nRow;
1363 rTab = nTab;
1364 }
1365 else
1366 {
1368 rSearchItem, nCol, nRow );
1369
1370 // notify LibreOfficeKit about changed page
1372 {
1373 OString aPayload = OString::number(nTab);
1374 if (SfxViewShell* pViewShell = SfxViewShell::Current())
1375 pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_SET_PART, aPayload);
1376 }
1377 }
1378 }
1379 }
1380 }
1381 else
1382 {
1383 for (nTab = rTab; (nTab < static_cast<SCTAB>(maTabs.size())) && !bFound; nTab++)
1384 if (maTabs[nTab])
1385 {
1386 if (rMark.GetTableSelect(nTab))
1387 {
1388 bFound = maTabs[nTab]->SearchAndReplace(
1389 rSearchItem, nCol, nRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc, bMatchedRangesWereClamped);
1390 if (bFound)
1391 {
1392 rCol = nCol;
1393 rRow = nRow;
1394 rTab = nTab;
1395 }
1396 else
1397 {
1399 rSearchItem, nCol, nRow );
1400
1401 // notify LibreOfficeKit about changed page
1403 {
1404 OString aPayload = OString::number(nTab);
1405 if(SfxViewShell* pViewShell = SfxViewShell::Current())
1406 pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_SET_PART, aPayload);
1407 }
1408 }
1409 }
1410 }
1411 }
1412 }
1413 }
1414 return bFound;
1415}
1416
1420bool ScDocument::UpdateOutlineCol( SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool bShow )
1421{
1422 if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
1423 return maTabs[nTab]->UpdateOutlineCol( nStartCol, nEndCol, bShow );
1424
1425 OSL_FAIL("missing tab");
1426 return false;
1427}
1428
1429bool ScDocument::UpdateOutlineRow( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bShow )
1430{
1431 if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
1432 return maTabs[nTab]->UpdateOutlineRow( nStartRow, nEndRow, bShow );
1433
1434 OSL_FAIL("missing tab");
1435 return false;
1436}
1437
1439 SCTAB nTab, const ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
1440 ScProgress* pProgress, sc::ReorderParam* pUndo )
1441{
1442 if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
1443 {
1444 bool bOldEnableIdle = IsIdleEnabled();
1445 EnableIdle(false);
1446 maTabs[nTab]->Sort(rSortParam, bKeepQuery, bUpdateRefs, pProgress, pUndo);
1447 EnableIdle(bOldEnableIdle);
1448 }
1449}
1450
1452{
1453 ScTable* pTab = FetchTable(rParam.maSortRange.aStart.Tab());
1454 if (!pTab)
1455 return;
1456
1457 bool bOldEnableIdle = IsIdleEnabled();
1458 EnableIdle(false);
1459 pTab->Reorder(rParam);
1460 EnableIdle(bOldEnableIdle);
1461}
1462
1464{
1465 if( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
1466 maTabs[nTab]->PrepareQuery(rQueryParam);
1467 else
1468 {
1469 OSL_FAIL("missing tab");
1470 return;
1471 }
1472}
1473
1474SCSIZE ScDocument::Query(SCTAB nTab, const ScQueryParam& rQueryParam, bool bKeepSub)
1475{
1476 if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
1477 return maTabs[nTab]->Query(rQueryParam, bKeepSub);
1478
1479 OSL_FAIL("missing tab");
1480 return 0;
1481}
1482
1484{
1485 if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
1486 return maTabs[nTab]->GetUpperCellString( nCol, nRow );
1487 else
1488 return OUString();
1489}
1490
1491bool ScDocument::CreateQueryParam( const ScRange& rRange, ScQueryParam& rQueryParam )
1492{
1493 ScTable* pTab = FetchTable(rRange.aStart.Tab());
1494 if (!pTab)
1495 {
1496 OSL_FAIL("missing tab");
1497 return false;
1498 }
1499
1500 return pTab->CreateQueryParam(
1501 rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Col(), rRange.aEnd.Row(), rQueryParam);
1502}
1503
1504bool ScDocument::HasAutoFilter( SCCOL nCurCol, SCROW nCurRow, SCTAB nCurTab )
1505{
1506 const ScDBData* pDBData = GetDBAtCursor( nCurCol, nCurRow, nCurTab, ScDBDataPortion::AREA );
1507 bool bHasAutoFilter = (pDBData != nullptr);
1508
1509 if ( pDBData )
1510 {
1511 if ( pDBData->HasHeader() )
1512 {
1513 SCCOL nCol;
1514 SCROW nRow;
1515 ScMF nFlag;
1516
1517 ScQueryParam aParam;
1518 pDBData->GetQueryParam( aParam );
1519 nRow = aParam.nRow1;
1520
1521 for ( nCol=aParam.nCol1; nCol<=aParam.nCol2 && bHasAutoFilter; nCol++ )
1522 {
1523 nFlag = GetAttr( nCol, nRow, nCurTab, ATTR_MERGE_FLAG )->GetValue();
1524
1525 if ( !(nFlag & ScMF::Auto) )
1526 bHasAutoFilter = false;
1527 }
1528 }
1529 else
1530 bHasAutoFilter = false;
1531 }
1532
1533 return bHasAutoFilter;
1534}
1535
1536bool ScDocument::HasColHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
1537 SCTAB nTab )
1538{
1539 return ValidTab(nTab) && maTabs[nTab] && maTabs[nTab]->HasColHeader( nStartCol, nStartRow, nEndCol, nEndRow );
1540}
1541
1542bool ScDocument::HasRowHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
1543 SCTAB nTab )
1544{
1545 return ValidTab(nTab) && maTabs[nTab] && maTabs[nTab]->HasRowHeader( nStartCol, nStartRow, nEndCol, nEndRow );
1546}
1547
1548void ScDocument::GetFilterSelCount( SCCOL nCol, SCROW nRow, SCTAB nTab, SCSIZE& nSelected, SCSIZE& nTotal )
1549{
1550 nSelected = 0;
1551 nTotal = 0;
1552 if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
1553 {
1554 ScDBData* pDBData = GetDBAtCursor( nCol, nRow, nTab, ScDBDataPortion::AREA );
1555 if( pDBData && pDBData->HasAutoFilter() )
1556 pDBData->GetFilterSelCount( nSelected, nTotal );
1557 }
1558}
1559
1564 SCCOL nCol, SCROW nRow, SCTAB nTab, ScFilterEntries& rFilterEntries )
1565{
1566 if ( !(ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && pDBCollection) )
1567 return;
1568
1569 ScDBData* pDBData = pDBCollection->GetDBAtCursor(nCol, nRow, nTab, ScDBDataPortion::AREA);
1570 if (!pDBData)
1571 return;
1572
1573 pDBData->ExtendDataArea(*this);
1574 SCTAB nAreaTab;
1575 SCCOL nStartCol;
1576 SCROW nStartRow;
1577 SCCOL nEndCol;
1578 SCROW nEndRow;
1579 pDBData->GetArea( nAreaTab, nStartCol, nStartRow, nEndCol, nEndRow );
1580
1581 if (pDBData->HasHeader())
1582 ++nStartRow;
1583
1584 ScQueryParam aParam;
1585 pDBData->GetQueryParam( aParam );
1586
1587 // Return all filter entries, if a filter condition is connected with a boolean OR
1588 bool bFilter = true;
1589 SCSIZE nEntryCount = aParam.GetEntryCount();
1590 for ( SCSIZE i = 0; i < nEntryCount && aParam.GetEntry(i).bDoQuery; ++i )
1591 {
1592 ScQueryEntry& rEntry = aParam.GetEntry(i);
1593 if ( rEntry.eConnect != SC_AND )
1594 {
1595 bFilter = false;
1596 break;
1597 }
1598 }
1599
1600 if ( bFilter )
1601 {
1602 maTabs[nTab]->GetFilteredFilterEntries( nCol, nStartRow, nEndRow, aParam, rFilterEntries, bFilter );
1603 }
1604 else
1605 {
1606 maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rFilterEntries );
1607 }
1608
1609 sortAndRemoveDuplicates( rFilterEntries.maStrData, aParam.bCaseSens);
1610}
1611
1616 SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bCaseSens,
1617 ScFilterEntries& rFilterEntries )
1618{
1619 if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
1620 {
1621 maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rFilterEntries, true );
1622 sortAndRemoveDuplicates( rFilterEntries.maStrData, bCaseSens);
1623 }
1624}
1625
1630 SCCOL nCol, SCROW nRow, SCTAB nTab,
1631 std::vector<ScTypedStrData>& rStrings, bool bValidation )
1632{
1633 if( bValidation )
1634 {
1635 /* Try to generate the list from list validation. This part is skipped,
1636 if bValidation==false, because in that case this function is called to get
1637 cell values for auto completion on input. */
1638 sal_uInt32 nValidation = GetAttr( nCol, nRow, nTab, ATTR_VALIDDATA )->GetValue();
1639 if( nValidation )
1640 {
1641 const ScValidationData* pData = GetValidationEntry( nValidation );
1642 if( pData && pData->FillSelectionList( rStrings, ScAddress( nCol, nRow, nTab ) ) )
1643 {
1644 if (pData->GetListType() == css::sheet::TableValidationVisibility::SORTEDASCENDING)
1645 sortAndRemoveDuplicates(rStrings, true/*bCaseSens*/);
1646
1647 return;
1648 }
1649 }
1650 }
1651
1652 if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()))
1653 return;
1654
1655 if (!maTabs[nTab])
1656 return;
1657
1658 std::set<ScTypedStrData> aStrings;
1659 if (maTabs[nTab]->GetDataEntries(nCol, nRow, aStrings))
1660 {
1661 rStrings.insert(rStrings.end(), aStrings.begin(), aStrings.end());
1662 sortAndRemoveDuplicates(rStrings, true/*bCaseSens*/);
1663 }
1664}
1665
1670{
1671
1672 // Range name
1673 if ( pRangeName )
1674 {
1675 for (const auto& rEntry : *pRangeName)
1676 rStrings.insert(ScTypedStrData(rEntry.second->GetName(), 0.0, 0.0, ScTypedStrData::Name));
1677 }
1678
1679 // Database collection
1680 if ( pDBCollection )
1681 {
1682 const ScDBCollection::NamedDBs& rDBs = pDBCollection->getNamedDBs();
1683 for (const auto& rxDB : rDBs)
1684 rStrings.insert(ScTypedStrData(rxDB->GetName(), 0.0, 0.0, ScTypedStrData::DbName));
1685 }
1686
1687 // Content of name ranges
1688 ScRangePairList* pLists[2];
1689 pLists[0] = GetColNameRanges();
1690 pLists[1] = GetRowNameRanges();
1691 for (ScRangePairList* pList : pLists)
1692 {
1693 if (!pList)
1694 continue;
1695
1696 for ( size_t i = 0, nPairs = pList->size(); i < nPairs; ++i )
1697 {
1698 const ScRangePair & rPair = (*pList)[i];
1699 const ScRange & rRange = rPair.GetRange(0);
1700 ScCellIterator aIter( *this, rRange );
1701 for (bool bHas = aIter.first(); bHas; bHas = aIter.next())
1702 {
1703 if (!aIter.hasString())
1704 continue;
1705
1706 OUString aStr = aIter.getString();
1707 rStrings.insert(ScTypedStrData(aStr, 0.0, 0.0, ScTypedStrData::Header));
1708 }
1709 }
1710 }
1711}
1712
1714{
1715 rRange = aEmbedRange;
1716}
1717
1719{
1720 tools::Rectangle aRect;
1721 ScTable* pTable = nullptr;
1722 if ( aEmbedRange.aStart.Tab() < static_cast<SCTAB>(maTabs.size()) )
1723 pTable = maTabs[aEmbedRange.aStart.Tab()].get();
1724 else
1725 OSL_FAIL("table out of range");
1726 if (!pTable)
1727 {
1728 OSL_FAIL("GetEmbeddedRect without a table");
1729 }
1730 else
1731 {
1732 SCCOL i;
1733
1734 for (i=0; i<aEmbedRange.aStart.Col(); i++)
1735 aRect.AdjustLeft(pTable->GetColWidth(i) );
1736 aRect.AdjustTop(pTable->GetRowHeight( 0, aEmbedRange.aStart.Row() - 1) );
1737 aRect.SetRight( aRect.Left() );
1738 for (i=aEmbedRange.aStart.Col(); i<=aEmbedRange.aEnd.Col(); i++)
1739 aRect.AdjustRight(pTable->GetColWidth(i) );
1740 aRect.SetBottom( aRect.Top() );
1742
1744 }
1745 return aRect;
1746}
1747
1749{
1750 bIsEmbedded = true;
1751 aEmbedRange = rRange;
1752}
1753
1755{
1756 bIsEmbedded = false;
1757 aEmbedRange = ScRange();
1758}
1759
1764static bool lcl_AddTwipsWhile( tools::Long & rTwips, tools::Long nStopTwips, SCROW & rPosY, SCROW nEndRow, const ScTable * pTable, bool bHiddenAsZero )
1765{
1766 SCROW nRow = rPosY;
1767 bool bAdded = false;
1768 bool bStop = false;
1769 while (rTwips < nStopTwips && nRow <= nEndRow && !bStop)
1770 {
1771 SCROW nHeightEndRow;
1772 sal_uInt16 nHeight = pTable->GetRowHeight( nRow, nullptr, &nHeightEndRow, bHiddenAsZero );
1773 if (nHeightEndRow > nEndRow)
1774 nHeightEndRow = nEndRow;
1775 if (!nHeight)
1776 nRow = nHeightEndRow + 1;
1777 else
1778 {
1779 SCROW nRows = nHeightEndRow - nRow + 1;
1780 sal_Int64 nAdd = static_cast<sal_Int64>(nHeight) * nRows;
1781 if (nAdd + rTwips >= nStopTwips)
1782 {
1783 sal_Int64 nDiff = nAdd + rTwips - nStopTwips;
1784 nRows -= static_cast<SCROW>(nDiff / nHeight);
1785 nAdd = static_cast<sal_Int64>(nHeight) * nRows;
1786 // We're looking for a value that satisfies loop condition.
1787 if (nAdd + rTwips >= nStopTwips)
1788 {
1789 --nRows;
1790 nAdd -= nHeight;
1791 }
1792 bStop = true;
1793 }
1794 rTwips += static_cast<tools::Long>(nAdd);
1795 nRow += nRows;
1796 }
1797 }
1798 if (nRow > rPosY)
1799 {
1800 --nRow;
1801 bAdded = true;
1802 }
1803 rPosY = nRow;
1804 return bAdded;
1805}
1806
1807ScRange ScDocument::GetRange( SCTAB nTab, const tools::Rectangle& rMMRect, bool bHiddenAsZero ) const
1808{
1809 ScTable* pTable = nullptr;
1810 if (nTab < static_cast<SCTAB>(maTabs.size()))
1811 pTable = maTabs[nTab].get();
1812 else
1813 OSL_FAIL("table out of range");
1814 if (!pTable)
1815 {
1816 OSL_FAIL("GetRange without a table");
1817 return ScRange();
1818 }
1819
1821 if ( IsNegativePage( nTab ) )
1822 ScDrawLayer::MirrorRectRTL( aPosRect ); // Always with positive (LTR) values
1823
1824 tools::Long nSize;
1825 tools::Long nTwips;
1826 tools::Long nAdd;
1827 bool bEnd;
1828
1829 nSize = 0;
1830 nTwips = aPosRect.Left();
1831
1832 SCCOL nX1 = 0;
1833 bEnd = false;
1834 while (!bEnd)
1835 {
1836 nAdd = pTable->GetColWidth(nX1, bHiddenAsZero);
1837 if (nSize+nAdd <= nTwips+1 && nX1<MaxCol())
1838 {
1839 nSize += nAdd;
1840 ++nX1;
1841 }
1842 else
1843 bEnd = true;
1844 }
1845
1846
1847 SCCOL nX2 = nX1;
1848 if (!aPosRect.IsEmpty())
1849 {
1850 bEnd = false;
1851 nTwips = aPosRect.Right();
1852 while (!bEnd)
1853 {
1854 nAdd = pTable->GetColWidth(nX2, bHiddenAsZero);
1855 if (nSize+nAdd < nTwips && nX2<MaxCol())
1856 {
1857 nSize += nAdd;
1858 ++nX2;
1859 }
1860 else
1861 bEnd = true;
1862 }
1863 }
1864
1865 nSize = 0;
1866 nTwips = aPosRect.Top();
1867
1868 SCROW nY1 = 0;
1869 // Was if(nSize+nAdd<=nTwips+1) inside loop => if(nSize+nAdd<nTwips+2)
1870 if (lcl_AddTwipsWhile( nSize, nTwips+2, nY1, MaxRow(), pTable, bHiddenAsZero) && nY1 < MaxRow())
1871 ++nY1; // original loop ended on last matched +1 unless that was rDoc.MaxRow()
1872
1873 SCROW nY2 = nY1;
1874 if (!aPosRect.IsEmpty())
1875 {
1876 nTwips = aPosRect.Bottom();
1877 // Was if(nSize+nAdd<nTwips) inside loop => if(nSize+nAdd<nTwips)
1878 if (lcl_AddTwipsWhile( nSize, nTwips, nY2, MaxRow(), pTable, bHiddenAsZero) && nY2 < MaxRow())
1879 ++nY2; // original loop ended on last matched +1 unless that was rDoc.MaxRow()
1880 }
1881
1882 return ScRange( nX1,nY1,nTab, nX2,nY2,nTab );
1883}
1884
1885void ScDocument::SetEmbedded( SCTAB nTab, const tools::Rectangle& rRect ) // From VisArea (1/100 mm)
1886{
1887 bIsEmbedded = true;
1888 aEmbedRange = GetRange( nTab, rRect );
1889}
1890
1892{
1893 return pDocProtection.get();
1894}
1895
1897{
1898 if (pProtect)
1899 pDocProtection.reset(new ScDocProtection(*pProtect));
1900 else
1901 pDocProtection.reset();
1902}
1903
1905{
1906 return pDocProtection && pDocProtection->isProtected();
1907}
1908
1910{
1911 // Import into read-only document is possible
1913}
1914
1916{
1917 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
1918 return maTabs[nTab]->IsProtected();
1919
1920 OSL_FAIL("Wrong table number");
1921 return false;
1922}
1923
1925{
1926 if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
1927 return maTabs[nTab]->GetProtection();
1928
1929 return nullptr;
1930}
1931
1933{
1934 if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()))
1935 return;
1936
1937 maTabs[nTab]->SetProtection(pProtect);
1938}
1939
1941{
1942 if (!ValidTab(nTabSrc) || nTabSrc >= static_cast<SCTAB>(maTabs.size()) || nTabDest >= static_cast<SCTAB>(maTabs.size()) || !ValidTab(nTabDest))
1943 return;
1944
1945 maTabs[nTabDest]->SetProtection( maTabs[nTabSrc]->GetProtection() );
1946}
1947
1949{
1950 assert(pDocOptions && "No DocOptions! :-(");
1951 return *pDocOptions;
1952}
1953
1955{
1956 assert(pDocOptions && "No DocOptions! :-(");
1957
1958 *pDocOptions = rOpt;
1959 if (mxPoolHelper)
1960 mxPoolHelper->SetFormTableOpt(rOpt);
1961}
1962
1964{
1965 assert(pViewOptions && "No ViewOptions! :-(");
1966 return *pViewOptions;
1967}
1968
1970{
1971 assert(pViewOptions && "No ViewOptions! :-(");
1972 *pViewOptions = rOpt;
1973}
1974
1976{
1977 rLatin = eLanguage;
1978 rCjk = eCjkLanguage;
1979 rCtl = eCtlLanguage;
1980}
1981
1983{
1984 eLanguage = eLatin;
1985 eCjkLanguage = eCjk;
1986 eCtlLanguage = eCtl;
1987 if ( mxPoolHelper.is() )
1988 {
1989 ScDocumentPool* pPool = mxPoolHelper->GetDocPool();
1993 }
1994
1995 UpdateDrawLanguages(); // Set edit engine defaults in drawing layer pool
1996}
1997
1998tools::Rectangle ScDocument::GetMMRect( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, bool bHiddenAsZero ) const
1999{
2000 if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab])
2001 {
2002 OSL_FAIL("GetMMRect: wrong table");
2003 return tools::Rectangle(0,0,0,0);
2004 }
2005
2006 SCCOL i;
2007 tools::Rectangle aRect;
2008
2009 for (i=0; i<nStartCol; i++)
2010 aRect.AdjustLeft(GetColWidth(i,nTab, bHiddenAsZero ) );
2011 aRect.AdjustTop(GetRowHeight( 0, nStartRow-1, nTab, bHiddenAsZero ) );
2012
2013 aRect.SetRight( aRect.Left() );
2014 aRect.SetBottom( aRect.Top() );
2015
2016 for (i=nStartCol; i<=nEndCol; i++)
2017 aRect.AdjustRight(GetColWidth(i,nTab, bHiddenAsZero) );
2018 aRect.AdjustBottom(GetRowHeight( nStartRow, nEndRow, nTab, bHiddenAsZero ) );
2019
2021
2022 if ( IsNegativePage( nTab ) )
2024
2025 return aRect;
2026}
2027
2028void ScDocument::SetExtDocOptions( std::unique_ptr<ScExtDocOptions> pNewOptions )
2029{
2030 pExtDocOptions = std::move(pNewOptions);
2031}
2032
2033void ScDocument::SetClipOptions(std::unique_ptr<ScClipOptions> pClipOptions)
2034{
2035 mpClipOptions = std::move(pClipOptions);
2036}
2037
2038void ScDocument::DoMergeContents( SCCOL nStartCol, SCROW nStartRow,
2039 SCCOL nEndCol, SCROW nEndRow, SCTAB nTab )
2040{
2041 OUStringBuffer aTotal;
2042 OUString aCellStr;
2043 SCCOL nCol;
2044 SCROW nRow;
2045 for (nRow=nStartRow; nRow<=nEndRow; nRow++)
2046 for (nCol=nStartCol; nCol<=nEndCol; nCol++)
2047 {
2048 aCellStr = GetString(nCol, nRow, nTab);
2049 if (!aCellStr.isEmpty())
2050 {
2051 if (!aTotal.isEmpty())
2052 aTotal.append(' ');
2053 aTotal.append(aCellStr);
2054 }
2055 if (nCol != nStartCol || nRow != nStartRow)
2056 SetString(nCol,nRow,nTab,"");
2057 }
2058
2059 SetString(nStartCol,nStartRow,nTab,aTotal.makeStringAndClear());
2060}
2061
2062void ScDocument::DoEmptyBlock( SCCOL nStartCol, SCROW nStartRow,
2063 SCCOL nEndCol, SCROW nEndRow, SCTAB nTab )
2064{
2065 SCCOL nCol;
2066 SCROW nRow;
2067 for (nRow=nStartRow; nRow<=nEndRow; nRow++)
2068 for (nCol=nStartCol; nCol<=nEndCol; nCol++)
2069 { // empty block except first cell
2070 if (nCol != nStartCol || nRow != nStartRow)
2071 SetString(nCol,nRow,nTab,"");
2072 }
2073}
2074
2075void ScDocument::DoMerge( SCCOL nStartCol, SCROW nStartRow,
2076 SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, bool bDeleteCaptions )
2077{
2078 ScTable* pTab = FetchTable(nTab);
2079 if (!pTab)
2080 return;
2081
2082 pTab->SetMergedCells(nStartCol, nStartRow, nEndCol, nEndRow);
2083
2084 // Remove all covered notes (removed captions are collected by drawing undo if active)
2086 if( nStartCol < nEndCol )
2087 DeleteAreaTab( nStartCol + 1, nStartRow, nEndCol, nStartRow, nTab, nDelFlag );
2088 if( nStartRow < nEndRow )
2089 DeleteAreaTab( nStartCol, nStartRow + 1, nEndCol, nEndRow, nTab, nDelFlag );
2090}
2091
2093{
2094 const ScMergeAttr* pAttr = GetAttr( nCol, nRow, nTab, ATTR_MERGE );
2095
2096 if ( pAttr->GetColMerge() <= 1 && pAttr->GetRowMerge() <= 1 )
2097 return;
2098
2099 SCCOL nEndCol = nCol + pAttr->GetColMerge() - 1;
2100 SCROW nEndRow = nRow + pAttr->GetRowMerge() - 1;
2101
2102 RemoveFlagsTab( nCol, nRow, nEndCol, nEndRow, nTab, ScMF::Hor | ScMF::Ver );
2103
2104 const ScMergeAttr* pDefAttr = &mxPoolHelper->GetDocPool()->GetDefaultItem( ATTR_MERGE );
2105 ApplyAttr( nCol, nRow, nTab, *pDefAttr );
2106}
2107
2109 SCCOL nStartCol, SCROW nStartRow, SCCOL& rEndCol, SCROW nEndRow ) const
2110{
2111 if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
2112 maTabs[nTab]->ExtendPrintArea( pDev, nStartCol, nStartRow, rEndCol, nEndRow );
2113}
2114
2116{
2117 if( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
2118 return maTabs[nTab]->GetPatternCount( nCol );
2119 else
2120 return 0;
2121}
2122
2123SCSIZE ScDocument::GetPatternCount( SCTAB nTab, SCCOL nCol, SCROW nRow1, SCROW nRow2 ) const
2124{
2125 if( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
2126 return maTabs[nTab]->GetPatternCount( nCol, nRow1, nRow2 );
2127 else
2128 return 0;
2129}
2130
2132{
2133 if( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
2134 maTabs[nTab]->ReservePatternCount( nCol, nReserve );
2135}
2136
2138{
2139 rParam = mSheetSortParams[ nTab ];
2140}
2141
2142void ScDocument::SetSortParam( const ScSortParam& rParam, SCTAB nTab )
2143{
2144 mSheetSortParams[ nTab ] = rParam;
2145}
2146
2148{
2149 return maTabs[nTab]->ClampToAllocatedColumns(nCol);
2150}
2151
2153{
2154 return maTabs[nTab]->GetAllocatedColumnsCount();
2155}
2156
2157/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const char * pName
bool ValidTab(SCTAB nTab)
Definition: address.hxx:111
const SCTAB MAXTAB
Definition: address.hxx:70
const SCTAB SC_TAB_APPEND
Definition: address.hxx:90
size_t SCSIZE
size_t typedef to be able to find places where code was changed from USHORT to size_t and is used to ...
Definition: address.hxx:44
void PutInOrder(T &nStart, T &nEnd)
Definition: address.hxx:150
ScMF
Definition: attrib.hxx:34
SCTAB Tab() const
Definition: address.hxx:283
SCROW Row() const
Definition: address.hxx:274
void SetRow(SCROW nRowP)
Definition: address.hxx:287
void SetTab(SCTAB nTabP)
Definition: address.hxx:295
SCCOL Col() const
Definition: address.hxx:279
Walk through all cells in an area.
Definition: dociter.hxx:206
CellType getType() const
Definition: dociter.hxx:233
ScFormulaCell * getFormulaCell()
Definition: dociter.hxx:236
bool hasString() const
Definition: dociter.cxx:994
OUString getString() const
Definition: dociter.cxx:968
All current charts in the calc will be locked in constructor and unlocked in destructor.
Definition: chartlock.hxx:36
Stores global named database ranges.
Definition: dbdata.hxx:243
bool HasAutoFilter() const
Definition: dbdata.hxx:212
bool HasHeader() const
Definition: dbdata.hxx:136
void GetFilterSelCount(SCSIZE &nSelected, SCSIZE &nTotal)
Definition: dbdata.cxx:981
void GetArea(SCTAB &rTab, SCCOL &rCol1, SCROW &rRow1, SCCOL &rCol2, SCROW &rRow2) const
Definition: dbdata.cxx:298
const OUString & GetUpperName() const
Definition: dbdata.hxx:128
SC_DLLPUBLIC void GetQueryParam(ScQueryParam &rQueryParam) const
Definition: dbdata.cxx:422
void ExtendDataArea(const ScDocument &rDoc)
Definition: dbdata.cxx:649
bool IsError() const
Definition: tablink.cxx:579
ScDocument * GetDocument()
Definition: tablink.cxx:574
SC_DLLPUBLIC bool InsertTab(SCTAB nPos, const OUString &rName, bool bExternalDocument=false, bool bUndoDeleteTab=false)
Definition: document.cxx:504
SC_DLLPUBLIC bool IsScenario(SCTAB nTab) const
Definition: documen3.cxx:434
SC_DLLPUBLIC SCCOL GetAllocatedColumnsCount(SCTAB nTab) const
Definition: documen3.cxx:2152
SC_DLLPUBLIC bool RemoveFlagsTab(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, ScMF nFlags)
Definition: document.cxx:5089
SC_DLLPUBLIC sal_uInt16 GetRowHeight(SCROW nRow, SCTAB nTab, bool bHiddenAsZero=true) const
Definition: document.cxx:4225
void UpdateGrow(const ScRange &rArea, SCCOL nGrowX, SCROW nGrowY)
Definition: documen3.cxx:1145
bool IsAddressInRangeName(RangeNameScope eScope, const ScAddress &rAddress)
Definition: documen3.cxx:198
SC_DLLPUBLIC void GetRangeNameMap(std::map< OUString, ScRangeName * > &rRangeName)
Definition: documen3.cxx:148
bool UpdateOutlineCol(SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool bShow)
Adapt Outline.
Definition: documen3.cxx:1420
void GetAutoFormatData(SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScAutoFormatData &rData)
Definition: documen3.cxx:1204
SC_DLLPUBLIC ScRange GetRange(SCTAB nTab, const tools::Rectangle &rMMRect, bool bHiddenAsZero=true) const
Definition: documen3.cxx:1807
bool RefreshAutoFilter(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab)
Definition: document.cxx:5775
tools::Rectangle GetEmbeddedRect() const
Definition: documen3.cxx:1718
SC_DLLPUBLIC bool LinkExternalTab(SCTAB &nTab, const OUString &aDocTab, const OUString &aFileName, const OUString &aTabName)
Definition: documen3.cxx:570
SC_DLLPUBLIC sal_uInt16 GetColWidth(SCCOL nCol, SCTAB nTab, bool bHiddenAsZero=true) const
Definition: document.cxx:4184
void SC_DLLPUBLIC GetSortParam(ScSortParam &rParam, SCTAB nTab)
Definition: documen3.cxx:2137
SC_DLLPUBLIC void SetAllRangeNames(const std::map< OUString, ScRangeName > &rRangeMap)
Definition: documen3.cxx:125
SC_DLLPUBLIC OUString GetLinkTab(SCTAB nTab) const
Definition: documen3.cxx:534
SC_DLLPUBLIC const ScTableProtection * GetTabProtection(SCTAB nTab) const
Definition: documen3.cxx:1924
void UpdateRefAreaLinks(UpdateRefMode eUpdateRefMode, const ScRange &r, SCCOL nDx, SCROW nDy, SCTAB nDz)
Definition: documen8.cxx:1083
SC_DLLPUBLIC void CopyUpdated(ScDocument *pPosDoc, ScDocument *pDestDoc)
From this document this method copies the cells of positions at which there are also cells in pPosDoc...
Definition: documen3.cxx:805
bool SetOutlineTable(SCTAB nTab, const ScOutlineTable *pNewOutline)
Definition: documen3.cxx:759
SC_DLLPUBLIC ScRangeName * GetRangeName() const
Definition: documen3.cxx:178
SC_DLLPUBLIC sal_uLong TransferTab(ScDocument &rSrcDoc, SCTAB nSrcPos, SCTAB nDestPos, bool bInsertNew=true, bool bResultsOnly=false)
Definition: documen2.cxx:948
SC_DLLPUBLIC ScTable * FetchTable(SCTAB nTab)
Definition: document.cxx:2535
ScFormulaParserPool & GetFormulaParserPool() const
Returns the pool containing external formula parsers.
Definition: documen3.cxx:658
SC_DLLPUBLIC bool IsDocProtected() const
Definition: documen3.cxx:1904
void SetRangeName(SCTAB nTab, std::unique_ptr< ScRangeName > pNew)
Definition: documen3.cxx:185
std::unique_ptr< ScUnoListenerCalls > pUnoListenerCalls
Definition: document.hxx:396
SC_DLLPUBLIC void Fill(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScProgress *pProgress, const ScMarkData &rMark, sal_uInt64 nFillCount, FillDir eFillDir=FILL_TO_BOTTOM, FillCmd eFillCmd=FILL_LINEAR, FillDateCmd eFillDateCmd=FILL_DAY, double nStepValue=1.0, double nMaxValue=1E307)
Definition: documen3.cxx:1158
ScClipParam & GetClipParam()
Definition: document.cxx:2591
std::unique_ptr< ScClipOptions > mpClipOptions
Definition: document.hxx:426
SC_DLLPUBLIC Color GetTabBgColor(SCTAB nTab) const
Definition: documen3.cxx:450
void PrepareQuery(SCTAB nTab, ScQueryParam &rQueryParam)
Definition: documen3.cxx:1463
SC_DLLPUBLIC bool GetTable(const OUString &rName, SCTAB &rTab) const
Definition: document.cxx:263
std::unique_ptr< ScDocOptions > pDocOptions
Definition: document.hxx:424
SC_DLLPUBLIC bool IsTabProtected(SCTAB nTab) const
Definition: documen3.cxx:1915
bool IsIdleEnabled() const
Definition: document.hxx:2206
LanguageType eCtlLanguage
Definition: document.hxx:454
ScRange aEmbedRange
Definition: document.hxx:438
ScRangePairList * GetRowNameRanges()
Definition: document.hxx:820
void MarkScenario(SCTAB nSrcTab, SCTAB nDestTab, ScMarkData &rDestMark, bool bResetMark=true, ScScenarioFlags nNeededBits=ScScenarioFlags::NONE) const
Definition: documen3.cxx:857
void RemoveSubTotals(SCTAB nTab, ScSubTotalParam &rParam)
Definition: documen3.cxx:776
SC_DLLPUBLIC SCCOL MaxCol() const
Definition: document.hxx:892
ScDPObject * GetDPAtBlock(const ScRange &rBlock) const
Definition: documen3.cxx:393
std::unique_ptr< ScDPCollection > pDPCollection
Definition: document.hxx:383
SC_DLLPUBLIC void SetScenarioData(SCTAB nTab, const OUString &rComment, const Color &rColor, ScScenarioFlags nFlags)
Definition: documen3.cxx:439
SC_DLLPUBLIC const ScValidationData * GetValidationEntry(sal_uInt32 nIndex) const
Definition: documen4.cxx:880
bool IsClipboard() const
Definition: document.hxx:1593
const ScDBData * GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, ScDBDataPortion ePortion) const
Definition: documen3.cxx:324
const ScSheetEvents * GetSheetEvents(SCTAB nTab) const
Definition: documen3.cxx:665
std::unique_ptr< ScFormulaParserPool > mxFormulaParserPool
Definition: document.hxx:415
SC_DLLPUBLIC SCROW GetMaxRowCount() const
Definition: document.hxx:895
SC_DLLPUBLIC void DoMergeContents(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab)
Definition: documen3.cxx:2038
formula::FormulaGrammar::Grammar eGrammar
Definition: document.hxx:545
OUString GetLinkOpt(SCTAB nTab) const
Definition: documen3.cxx:527
rtl::Reference< ScPoolHelper > mxPoolHelper
Definition: document.hxx:358
bool InsertNewRangeName(const OUString &rName, const ScAddress &rPos, const OUString &rExpr)
Insert a new named expression to the global scope.
Definition: documen3.cxx:220
void GetSearchAndReplaceStart(const SvxSearchItem &rSearchItem, SCCOL &rCol, SCROW &rRow)
Definition: documen3.cxx:1218
void SetCalcNotification(SCTAB nTab)
Definition: documen3.cxx:726
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
Definition: documen3.cxx:496
ScRangeData * FindRangeNameBySheetAndIndex(SCTAB nTab, sal_uInt16 nIndex) const
Find a named expression / range name in either global or a local scope.
Definition: documen3.cxx:271
SC_DLLPUBLIC SCROW MaxRow() const
Definition: document.hxx:893
SC_DLLPUBLIC bool HasPivotTable() const
Definition: documen3.cxx:362
void BeginUnoRefUndo()
Definition: documen3.cxx:992
bool HasLink(std::u16string_view rDoc, std::u16string_view rFilter, std::u16string_view rOptions) const
Definition: documen3.cxx:556
void AddUnoRefChange(sal_Int64 nId, const ScRangeList &rOldRanges)
Definition: documen3.cxx:1004
SC_DLLPUBLIC void DoMerge(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, bool bDeleteCaptions=true)
Definition: documen3.cxx:2075
void UpdateReference(sc::RefUpdateContext &rCxt, ScDocument *pUndoDoc=nullptr, bool bIncludeDraw=true, bool bUpdateNoteCaptionPos=true)
Definition: documen3.cxx:1010
bool DoSubTotals(SCTAB nTab, ScSubTotalParam &rParam)
Definition: documen3.cxx:782
SC_DLLPUBLIC const ScDBData * GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const
Definition: documen3.cxx:340
SfxBindings * GetViewBindings()
Definition: documen8.cxx:1188
std::unique_ptr< SfxBroadcaster > pUnoBroadcaster
Definition: document.hxx:395
SC_DLLPUBLIC void SetDocOptions(const ScDocOptions &rOpt)
Definition: documen3.cxx:1954
bool HasScenarioRange(SCTAB nTab, const ScRange &rRange) const
Definition: documen3.cxx:869
SC_DLLPUBLIC bool IsNegativePage(SCTAB nTab) const
Definition: document.cxx:1003
void RepaintRange(const ScRange &rRange)
Definition: documen8.cxx:689
std::unique_ptr< ScValidationDataList > pValidationList
Definition: document.hxx:376
void CopyScenario(SCTAB nSrcTab, SCTAB nDestTab, bool bNewScenario=false)
Definition: documen3.cxx:813
bool IsDocEditable() const
Definition: documen3.cxx:1909
ScRangePairListRef xRowNameRanges
Definition: document.hxx:421
bool bImportingXML
Definition: document.hxx:505
SC_DLLPUBLIC ScExternalRefManager * GetExternalRefManager() const
Definition: documen3.cxx:629
std::unique_ptr< ScUnoRefList > EndUnoRefUndo()
Definition: documen3.cxx:998
SC_DLLPUBLIC void GetScenarioData(SCTAB nTab, OUString &rComment, Color &rColor, ScScenarioFlags &rFlags) const
Definition: documen3.cxx:470
SC_DLLPUBLIC void GetAllTabRangeNames(ScRangeName::TabNameCopyMap &rRangeNames) const
Get all range names that are local to each table.
Definition: documen3.cxx:106
void RemoveMerge(SCCOL nCol, SCROW nRow, SCTAB nTab)
Definition: documen3.cxx:2092
SC_DLLPUBLIC void GetFilterEntriesArea(SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bCaseSens, ScFilterEntries &rFilterEntries)
Entries for Filter dialog.
Definition: documen3.cxx:1615
void CopyTabProtection(SCTAB nTabSrc, SCTAB nTabDest)
Definition: documen3.cxx:1940
void ReservePatternCount(SCTAB nTab, SCCOL nCol, SCSIZE nReserve)
Definition: documen3.cxx:2131
SC_DLLPUBLIC const ScViewOptions & GetViewOptions() const
Definition: documen3.cxx:1963
SC_DLLPUBLIC void DoEmptyBlock(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab)
Definition: documen3.cxx:2062
void AddUnoObject(SfxListener &rObject)
Definition: documen3.cxx:903
void ResetCalcNotifications()
Definition: documen3.cxx:733
void SetChartListenerCollection(std::unique_ptr< ScChartListenerCollection >, bool bSetChartRangeLists)
Definition: documen3.cxx:414
std::unique_ptr< ScDetOpList > pDetOpList
Definition: document.hxx:393
SC_DLLPUBLIC bool CreateQueryParam(const ScRange &rRange, ScQueryParam &rQueryParam)
Definition: documen3.cxx:1491
OUString GetUpperCellString(SCCOL nCol, SCROW nRow, SCTAB nTab)
Definition: documen3.cxx:1483
void SetLanguage(LanguageType eLatin, LanguageType eCjk, LanguageType eCtl)
Definition: documen3.cxx:1982
std::unique_ptr< ScExtDocOptions > pExtDocOptions
Definition: document.hxx:425
SC_DLLPUBLIC bool SetString(SCCOL nCol, SCROW nRow, SCTAB nTab, const OUString &rString, const ScSetStringParam *pParam=nullptr)
Definition: document.cxx:3422
ScRangePairList * GetColNameRanges()
Definition: document.hxx:819
void GetFilterEntries(SCCOL nCol, SCROW nRow, SCTAB nTab, ScFilterEntries &rFilterEntries)
Get a list of unique strings to use in filtering criteria.
Definition: documen3.cxx:1563
TableContainer maTabs
Definition: document.hxx:378
SC_DLLPUBLIC void SetGrammar(formula::FormulaGrammar::Grammar eGram)
Definition: documen3.cxx:501
bool HasAnyCalcNotification() const
Definition: documen3.cxx:710
LanguageType eLanguage
Definition: document.hxx:452
bool bIsClip
Definition: document.hxx:494
SC_DLLPUBLIC bool HasColHeader(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab)
Definition: documen3.cxx:1536
std::unique_ptr< ScExternalRefManager > pExternalRefMgr
Definition: document.hxx:410
void SetAllFormulasDirty(const sc::SetFormulaDirtyContext &rCxt)
Definition: document.cxx:3877
bool UpdateOutlineRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bShow)
Definition: documen3.cxx:1429
SC_DLLPUBLIC void SetViewOptions(const ScViewOptions &rOpt)
Definition: documen3.cxx:1969
void GetDataEntries(SCCOL nCol, SCROW nRow, SCTAB nTab, std::vector< ScTypedStrData > &rStrings, bool bValidation=false)
Entries for selection list listbox (no numbers/formulas)
Definition: documen3.cxx:1629
SC_DLLPUBLIC const ScRangeList * GetScenarioRanges(SCTAB nTab) const
Definition: documen3.cxx:874
void DoAutoOutline(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab)
Definition: documen3.cxx:764
void SC_DLLPUBLIC SetSortParam(const ScSortParam &rParam, SCTAB nTab)
Definition: documen3.cxx:2142
SC_DLLPUBLIC formula::FormulaGrammar::Grammar GetGrammar() const
Definition: document.hxx:1009
void Reorder(const sc::ReorderParam &rParam)
Definition: documen3.cxx:1451
void MarkUsedExternalReferences()
Definition: documen3.cxx:643
std::unique_ptr< ScUnoRefList > pUnoRefUndoList
Definition: document.hxx:397
SC_DLLPUBLIC const ScRangeData * GetRangeAtBlock(const ScRange &rBlock, OUString &rName, bool *pSheetLocal=nullptr) const
Definition: documen3.cxx:240
void GetEmbedded(ScRange &rRange) const
Definition: documen3.cxx:1713
bool HasCalcNotification(SCTAB nTab) const
Definition: documen3.cxx:719
SCSIZE GetPatternCount(SCTAB nTab, SCCOL nCol) const
Definition: documen3.cxx:2115
bool bIsEmbedded
Definition: document.hxx:499
SC_DLLPUBLIC ScDPObject * GetDPAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab) const
Definition: documen3.cxx:379
void EnableIdle(bool bDo)
Definition: document.hxx:2207
void StopTemporaryChartLock()
Definition: documen3.cxx:408
SC_DLLPUBLIC void ApplyAttr(SCCOL nCol, SCROW nRow, SCTAB nTab, const SfxPoolItem &rAttr)
Definition: document.cxx:4835
SC_DLLPUBLIC ScDocProtection * GetDocProtection() const
Definition: documen3.cxx:1891
SC_DLLPUBLIC void GetLanguage(LanguageType &rLatin, LanguageType &rCjk, LanguageType &rCtl) const
Definition: documen3.cxx:1975
SC_DLLPUBLIC ScOutlineTable * GetOutlineTable(SCTAB nTab, bool bCreate=false)
Definition: documen3.cxx:741
void ResetEmbedded()
Definition: documen3.cxx:1754
SCSIZE Query(SCTAB nTab, const ScQueryParam &rQueryParam, bool bKeepSub)
Definition: documen3.cxx:1474
bool bInUnoBroadcast
Definition: document.hxx:542
bool TestRemoveSubTotals(SCTAB nTab, const ScSubTotalParam &rParam)
Definition: documen3.cxx:771
SC_DLLPUBLIC SCCOL ClampToAllocatedColumns(SCTAB nTab, SCCOL nCol) const
Definition: documen3.cxx:2147
void SetSheetEvents(SCTAB nTab, std::unique_ptr< ScSheetEvents > pNew)
Definition: documen3.cxx:672
void SetClipOptions(std::unique_ptr< ScClipOptions > pClipOptions)
Definition: documen3.cxx:2033
bool HasSheetEventScript(SCTAB nTab, ScSheetEventId nEvent, bool bWithVbaEvents=false) const
Definition: documen3.cxx:678
LanguageType eCjkLanguage
Definition: document.hxx:453
sal_uLong GetLinkRefreshDelay(SCTAB nTab) const
Definition: documen3.cxx:541
void SetLink(SCTAB nTab, ScLinkMode nMode, const OUString &rDoc, const OUString &rFilter, const OUString &rOptions, const OUString &rTabName, sal_uLong nRefreshDelay)
Definition: documen3.cxx:548
SC_DLLPUBLIC void SetExtDocOptions(std::unique_ptr< ScExtDocOptions > pNewOptions)
Definition: documen3.cxx:2028
void AddUnoListenerCall(const css::uno::Reference< css::util::XModifyListener > &rListener, const css::lang::EventObject &rEvent)
Definition: documen3.cxx:982
bool HasAnySheetEventScript(ScSheetEventId nEvent, bool bWithVbaEvents=false) const
Definition: documen3.cxx:701
std::unique_ptr< ScDBCollection > pDBCollection
Definition: document.hxx:382
SC_DLLPUBLIC void SetActiveScenario(SCTAB nTab, bool bActive)
Definition: documen3.cxx:887
SC_DLLPUBLIC void SetDocProtection(const ScDocProtection *pProtect)
Definition: documen3.cxx:1896
SC_DLLPUBLIC bool HasRowHeader(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab)
Definition: documen3.cxx:1542
std::map< SCTAB, ScSortParam > mSheetSortParams
Definition: document.hxx:2700
std::unique_ptr< ScTemporaryChartLock > apTemporaryChartLock
Definition: document.hxx:384
OUString GetAutoFillPreview(const ScRange &rSource, SCCOL nEndX, SCROW nEndY)
Definition: documen3.cxx:1180
bool TestCopyScenario(SCTAB nSrcTab, SCTAB nDestTab) const
Definition: documen3.cxx:893
bool SearchAndReplace(const SvxSearchItem &rSearchItem, SCCOL &rCol, SCROW &rRow, SCTAB &rTab, const ScMarkData &rMark, ScRangeList &rMatchedRanges, OUString &rUndoStr, ScDocument *pUndoDoc, bool &bMatchedRangesWereClamped)
Definition: documen3.cxx:1312
void AutoFormat(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, sal_uInt16 nFormatNo, const ScMarkData &rMark)
Definition: documen3.cxx:1189
static bool IsEmptyCellSearch(const SvxSearchItem &rSearchItem)
Definition: documen3.cxx:1305
SC_DLLPUBLIC void DeleteAreaTab(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, SCTAB nTab, InsertDeleteFlags nDelFlag)
Definition: document.cxx:1948
SC_DLLPUBLIC OUString GetString(SCCOL nCol, SCROW nRow, SCTAB nTab, const ScInterpreterContext *pContext=nullptr) const
Definition: document.cxx:3545
void RemoveUnoObject(SfxListener &rObject)
Definition: documen3.cxx:911
void UpdateChartRef(UpdateRefMode eUpdateRefMode, SCCOL nCol1, SCROW nRow1, SCTAB nTab1, SCCOL nCol2, SCROW nRow2, SCTAB nTab2, SCCOL nDx, SCROW nDy, SCTAB nDz)
Definition: documen5.cxx:394
SC_DLLPUBLIC OUString GetLinkDoc(SCTAB nTab) const
Definition: documen3.cxx:513
void UpdateDrawLanguages()
Definition: documen9.cxx:182
SC_DLLPUBLIC void SetTabProtection(SCTAB nTab, const ScTableProtection *pProtect)
Definition: documen3.cxx:1932
bool IsLinked(SCTAB nTab) const
Definition: documen3.cxx:487
void RefreshDirtyTableColumnNames()
Definition: documen3.cxx:356
void SetDBCollection(std::unique_ptr< ScDBCollection > pNewDBCollection, bool bRemoveAutoFilter=false)
Definition: documen3.cxx:277
bool IsInExternalReferenceMarking() const
Definition: documen3.cxx:638
std::unique_ptr< ScDocProtection > pDocProtection
Definition: document.hxx:407
bool bInUnoListenerCall
Definition: document.hxx:543
css::uno::Reference< css::script::vba::XVBAEventProcessor > mxVbaEvents
Definition: document.hxx:444
bool HasSubTotalCells(const ScRange &rRange)
Definition: documen3.cxx:787
SC_DLLPUBLIC sfx2::LinkManager * GetLinkManager()
Definition: documen2.cxx:231
SfxObjectShell * mpShell
Definition: document.hxx:371
void GetFilterSelCount(SCCOL nCol, SCROW nRow, SCTAB nTab, SCSIZE &nSelected, SCSIZE &nTotal)
Definition: documen3.cxx:1548
std::unique_ptr< ScViewOptions > pViewOptions
Definition: document.hxx:423
SC_DLLPUBLIC void SetTabBgColor(SCTAB nTab, const Color &rColor)
Definition: documen3.cxx:457
OUString GetLinkFlt(SCTAB nTab) const
Definition: documen3.cxx:520
void ExtendPrintArea(OutputDevice *pDev, SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL &rEndCol, SCROW nEndRow) const
Find the maximum column position that contains printable data for the specified row range.
Definition: documen3.cxx:2108
SC_DLLPUBLIC void SetScenario(SCTAB nTab, bool bFlag)
Definition: documen3.cxx:428
bool IsClipboardSource() const
Definition: document.cxx:2604
bool ValidRange(const ScRange &rRange) const
Definition: document.hxx:903
bool mbChangeReadOnlyEnabled
Definition: document.hxx:551
SC_DLLPUBLIC const SfxPoolItem * GetAttr(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt16 nWhich) const
Definition: document.cxx:4778
bool HasAutoFilter(SCCOL nCol, SCROW nRow, SCTAB nTab)
Definition: documen3.cxx:1504
ScRangePairListRef xColNameRanges
Definition: document.hxx:420
void GetScenarioFlags(SCTAB nTab, ScScenarioFlags &rFlags) const
Definition: documen3.cxx:481
SC_DLLPUBLIC void UpdateTranspose(const ScAddress &rDestPos, ScDocument *pClipDoc, const ScMarkData &rMark, ScDocument *pUndoDoc)
Definition: documen3.cxx:1114
SC_DLLPUBLIC SCCOL GetMaxColCount() const
Definition: document.hxx:894
SC_DLLPUBLIC ScLkUpdMode GetLinkMode() const
Definition: document.hxx:2259
SC_DLLPUBLIC const ScDocOptions & GetDocOptions() const
Definition: documen3.cxx:1948
SC_DLLPUBLIC ScDPCollection * GetDPCollection()
Definition: documen3.cxx:367
std::unique_ptr< ScRangeName > pRangeName
Definition: document.hxx:381
void Sort(SCTAB nTab, const ScSortParam &rSortParam, bool bKeepQuery, bool bUpdateRefs, ScProgress *pProgress, sc::ReorderParam *pUndo)
Sort a range of data.
Definition: documen3.cxx:1438
SC_DLLPUBLIC bool IsActiveScenario(SCTAB nTab) const
Definition: documen3.cxx:882
SC_DLLPUBLIC bool IsDefaultTabBgColor(SCTAB nTab) const
Definition: documen3.cxx:463
SC_DLLPUBLIC tools::Rectangle GetMMRect(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, bool bHiddenAsZero=true) const
Definition: documen3.cxx:1998
void BroadcastUno(const SfxHint &rHint)
Definition: documen3.cxx:954
void GetFormulaEntries(ScTypedCaseStrSet &rStrings)
Entries for Formula auto input.
Definition: documen3.cxx:1669
SC_DLLPUBLIC SCTAB GetTableCount() const
Definition: document.cxx:316
std::unique_ptr< ScChartListenerCollection > pChartListenerCollection
Definition: document.hxx:391
void SetEmbedded(const ScRange &rRange)
Definition: documen3.cxx:1748
static void MirrorRectRTL(tools::Rectangle &rRect)
Definition: drwlayer.cxx:2377
bool IsSubTotal() const
Stores the used instances of the FilterFormulaParser service implementations, mapped by the formula n...
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
Definition: markdata.hxx:43
const ScRange & GetMarkArea() const
Definition: markdata.hxx:83
bool GetTableSelect(SCTAB nTab) const
Definition: markdata.cxx:169
void ResetMark()
Definition: markdata.cxx:80
void SetAreaTab(SCTAB nTab)
Definition: markdata.cxx:149
SCCOL GetColMerge() const
Definition: attrib.hxx:71
SCROW GetRowMerge() const
Definition: attrib.hxx:72
static ScDocument * GetClipDoc()
Definition: scmod.cxx:688
ScRange & front()
Definition: rangelst.hxx:92
bool empty() const
Definition: rangelst.hxx:88
size_t size() const
Definition: rangelst.hxx:89
SC_DLLPUBLIC ScRangeData * findByIndex(sal_uInt16 i) const
Definition: rangenam.cxx:716
::std::map< SCTAB, const ScRangeName * > TabNameCopyMap
Map that stores non-managed pointers to ScRangeName instances.
Definition: rangenam.hxx:201
SC_DLLPUBLIC bool insert(ScRangeData *p, bool bReuseFreeIndex=true)
Insert object into set.
Definition: rangenam.cxx:802
SC_DLLPUBLIC const ScRangeData * findByRange(const ScRange &rRange) const
Definition: rangenam.cxx:697
const ScRange & GetRange(sal_uInt16 n) const
Definition: address.hxx:810
ScAddress aEnd
Definition: address.hxx:498
bool Contains(const ScAddress &) const
is Address& fully in Range?
Definition: address.hxx:718
ScAddress aStart
Definition: address.hxx:497
static ScRefUpdateRes Update(const ScDocument *pDoc, UpdateRefMode eUpdateRefMode, SCCOL nCol1, SCROW nRow1, SCTAB nTab1, SCCOL nCol2, SCROW nRow2, SCTAB nTab2, SCCOL nDx, SCROW nDy, SCTAB nDz, SCCOL &theCol1, SCROW &theRow1, SCTAB &theTab1, SCCOL &theCol2, SCROW &theRow2, SCTAB &theTab2)
Definition: refupdat.cxx:188
const OUString * GetScript(ScSheetEventId nEvent) const
Definition: sheetevents.cxx:99
static sal_Int32 GetVbaDocumentEventId(ScSheetEventId nEvent)
Definition: sheetevents.cxx:58
static sal_Int32 GetVbaSheetEventId(ScSheetEventId nEvent)
Definition: sheetevents.cxx:39
sheet protection state container
sal_uInt16 GetColWidth(SCCOL nCol, bool bHiddenAsZero=true) const
Definition: table2.cxx:3452
sal_uInt16 GetRowHeight(SCROW nRow, SCROW *pStartRow, SCROW *pEndRow, bool bHiddenAsZero=true) const
Definition: table2.cxx:3550
void SetMergedCells(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
Definition: table2.cxx:2342
bool CreateQueryParam(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScQueryParam &rQueryParam)
Definition: table3.cxx:2915
void Reorder(const sc::ReorderParam &rParam)
Definition: table3.cxx:1907
ScUnoListenerCalls stores notifications to XModifyListener that can't be processed during BroadcastUn...
List of RefUpdate changes made to UNO objects during ScUpdateRefHint broadcast.
Definition: unoreflist.hxx:43
void Invalidate(sal_uInt16 nId)
SfxHintId GetId() const
void SetPoolDefaultItem(const SfxPoolItem &)
void StartListening(SfxBroadcaster &rBroadcaster, DuplicateHandling eDuplicateHanding=DuplicateHandling::Unexpected)
void EndListening(SfxBroadcaster &rBroadcaster, bool bRemoveAllDuplicates=false)
bool IsReadOnly() const
static SAL_WARN_UNUSED_RESULT SfxViewShell * Current()
SvxSearchCmd GetCommand() const
const i18nutil::SearchOptions2 & GetSearchOptions() const
bool GetRowDirection() const
SvxSearchCellType GetCellType() const
bool GetBackward() const
bool GetRegExp() const
bool GetPattern() const
static AddressConvention extractRefConvention(const Grammar eGrammar)
Temporarily switch on/off auto calculation mode.
Definition: scopetools.hxx:27
void InsertFileLink(sfx2::SvBaseLink &, SvBaseLinkObjectType nFileType, std::u16string_view rFileNm, const OUString *pFilterNm=nullptr, const OUString *pRange=nullptr)
constexpr tools::Long Top() const
constexpr void SetRight(tools::Long v)
constexpr tools::Long Right() const
tools::Long AdjustTop(tools::Long nVertMoveDelta)
tools::Long AdjustRight(tools::Long nHorzMoveDelta)
constexpr void SetBottom(tools::Long v)
tools::Long AdjustBottom(tools::Long nVertMoveDelta)
tools::Long AdjustLeft(tools::Long nHorzMoveDelta)
constexpr tools::Long Left() const
constexpr tools::Long Bottom() const
constexpr bool IsEmpty() const
constexpr ::Color COL_AUTO(ColorTransparency, 0xFF, 0xFF, 0xFF, 0xFF)
int nCount
ScDBDataPortion
Enum used to indicate which portion of the DBArea is to be considered.
Definition: dbdata.hxx:41
@ AREA
entire area
static bool lcl_AddTwipsWhile(tools::Long &rTwips, tools::Long nStopTwips, SCROW &rPosY, SCROW nEndRow, const ScTable *pTable, bool bHiddenAsZero)
Similar to ScViewData::AddPixelsWhile(), but add height twips and only while result is less than nSto...
Definition: documen3.cxx:1764
@ CORE
Definition: document.hxx:317
RangeNameScope
Definition: document.hxx:270
@ GLOBAL
Definition: document.hxx:271
@ SC_AND
Definition: global.hxx:855
@ CELLTYPE_FORMULA
Definition: global.hxx:276
UpdateRefMode
Definition: global.hxx:301
@ URM_COPY
Definition: global.hxx:303
@ URM_INSDEL
Definition: global.hxx:302
InsertDeleteFlags
Definition: global.hxx:149
@ NOTE
Strings (and string results if InsertDeleteFlags::FORMULA is not set).
@ NOCAPTIONS
Sparklines in a cell.
FillDateCmd
Definition: global.hxx:334
ScLinkMode
Definition: global.hxx:215
ScScenarioFlags
Definition: global.hxx:226
FillCmd
Definition: global.hxx:317
FillDir
Definition: global.hxx:309
constexpr OUStringLiteral STR_GLOBAL_RANGE_NAME
Definition: globalnames.hxx:17
sal_Int32 nIndex
void * p
sal_Int64 n
SvBaseLink * pLink
aStr
std::unique_ptr< sal_Int32[]> pData
int i
constexpr Point convert(const Point &rPoint, o3tl::Length eFrom, o3tl::Length eTo)
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
long Long
sal_Int16 nId
constexpr TypedWhichId< ScMergeFlagAttr > ATTR_MERGE_FLAG(145)
constexpr TypedWhichId< ScMergeAttr > ATTR_MERGE(144)
constexpr TypedWhichId< SvxLanguageItem > ATTR_CTL_FONT_LANGUAGE(120)
constexpr TypedWhichId< SvxLanguageItem > ATTR_FONT_LANGUAGE(110)
constexpr TypedWhichId< SfxUInt32Item > ATTR_VALIDDATA(153)
constexpr TypedWhichId< SvxLanguageItem > ATTR_CJK_FONT_LANGUAGE(115)
#define SC_MOD()
Definition: scmod.hxx:249
ScSheetEventId
Definition: sheetevents.hxx:27
sal_uIntPtr sal_uLong
SvxSearchCmd
This struct stores general clipboard parameters associated with a ScDocument instance created in clip...
Definition: clipparam.hxx:31
ScRangeList maRanges
Definition: clipparam.hxx:34
bool mbCutMode
Definition: clipparam.hxx:36
std::vector< ScTypedStrData > maStrData
A pretty assertion that checks that the relevant bits in the @nFlags are not set on the document at e...
Definition: document.hxx:2761
Each instance of this struct represents a single filtering criteria.
Definition: queryentry.hxx:34
ScQueryConnect eConnect
Definition: queryentry.hxx:63
SC_DLLPUBLIC const ScQueryEntry & GetEntry(SCSIZE n) const
Definition: queryparam.cxx:116
SC_DLLPUBLIC SCSIZE GetEntryCount() const
Definition: queryparam.cxx:111
Context for reference update during shifting, moving or copying of cell ranges.
SCROW mnRowDelta
Amount and direction of movement in the row direction.
UpdateRefMode meMode
update mode - insert/delete, copy, or move.
SCCOL mnColDelta
Amount and direction of movement in the column direction.
SCTAB mnTabDelta
Amount and direction of movement in the sheet direction.
ScRange maRange
Range of cells that are about to be moved for insert/delete/move modes.
ScRange maSortRange
This sort range already takes into account the presence or absence of header row / column i....
Definition: sortparam.hxx:160
std::set< ScTypedStrData, ScTypedStrData::LessCaseSensitive > ScTypedCaseStrSet
sal_Int16 SCTAB
Definition: types.hxx:22
sal_Int16 SCCOL
Definition: types.hxx:21
sal_Int32 SCROW
Definition: types.hxx:17