LibreOffice Module sc (master)  1
tabvwshc.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 <scitems.hxx>
21 #include <sfx2/childwin.hxx>
22 #include <sfx2/dispatch.hxx>
23 #include <editeng/editview.hxx>
24 #include <inputhdl.hxx>
25 
26 #include <tabvwsh.hxx>
27 #include <sc.hrc>
28 #include <scres.hrc>
29 #include <global.hxx>
30 #include <scmod.hxx>
31 #include <document.hxx>
32 #include <uiitems.hxx>
33 #include <namedlg.hxx>
34 #include <namedefdlg.hxx>
35 #include <solvrdlg.hxx>
36 #include <optsolver.hxx>
37 #include <tabopdlg.hxx>
38 #include <consdlg.hxx>
39 #include <filtdlg.hxx>
40 #include <dbnamdlg.hxx>
41 #include <areasdlg.hxx>
42 #include <crnrdlg.hxx>
43 #include <formula.hxx>
44 #include <highred.hxx>
45 #include <simpref.hxx>
46 #include <funcdesc.hxx>
47 #include <dpobject.hxx>
48 #include <markdata.hxx>
49 #include <reffact.hxx>
50 #include <condformatdlg.hxx>
51 #include <xmlsourcedlg.hxx>
52 #include <condformatdlgitem.hxx>
53 #include <formdata.hxx>
54 #include <inputwin.hxx>
55 
57 #include <SamplingDialog.hxx>
60 #include <CorrelationDialog.hxx>
61 #include <CovarianceDialog.hxx>
63 #include <MovingAverageDialog.hxx>
64 #include <RegressionDialog.hxx>
65 #include <TTestDialog.hxx>
66 #include <FTestDialog.hxx>
67 #include <ZTestDialog.hxx>
68 #include <ChiSquareTestDialog.hxx>
70 
71 #include <PivotLayoutDialog.hxx>
72 #include <SparklineDialog.hxx>
74 
75 #include <comphelper/lok.hxx>
76 #include <o3tl/make_shared.hxx>
77 #include <LibreOfficeKit/LibreOfficeKitEnums.h>
78 
79 void ScTabViewShell::SetCurRefDlgId( sal_uInt16 nNew )
80 {
81  // CurRefDlgId is stored in ScModule to find if a ref dialog is open,
82  // and in the view to identify the view that has opened the dialog
83  nCurRefDlgId = nNew;
84 }
85 
86 //ugly hack to call Define Name from Manage Names
88 {
89  sal_uInt16 nSlotId = SC_MOD()->GetCurRefDlgId();
90  if( nSlotId == FID_ADD_NAME )
91  {
92  static_cast<ScNameDefDlg*>(pDialog)->GetNewData(maName, maScope);
93  static_cast<ScNameDefDlg*>(pDialog)->Close();
94  sal_uInt16 nId = ScNameDlgWrapper::GetChildWindowId();
95  SfxViewFrame* pViewFrm = GetViewFrame();
96  SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
97 
98  SC_MOD()->SetRefDialog( nId, pWnd == nullptr );
99  }
100  else if (nSlotId == FID_DEFINE_NAME)
101  {
102  mbInSwitch = true;
103  static_cast<ScNameDlg*>(pDialog)->GetRangeNames(m_RangeMap);
104  static_cast<ScNameDlg*>(pDialog)->Close();
105  sal_uInt16 nId = ScNameDefDlgWrapper::GetChildWindowId();
106  SfxViewFrame* pViewFrm = GetViewFrame();
107  SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
108 
109  SC_MOD()->SetRefDialog( nId, pWnd == nullptr );
110  }
111 }
112 
113 std::shared_ptr<SfxModelessDialogController> ScTabViewShell::CreateRefDialogController(
114  SfxBindings* pB, SfxChildWindow* pCW,
115  const SfxChildWinInfo* pInfo,
116  weld::Window* pParent, sal_uInt16 nSlotId)
117 {
118  // only open dialog when called through ScModule::SetRefDialog,
119  // so that it does not re appear for instance after a crash (#42341#).
120 
121  if ( SC_MOD()->GetCurRefDlgId() != nSlotId )
122  return nullptr;
123 
124  if ( nCurRefDlgId != nSlotId )
125  {
126  if (!(comphelper::LibreOfficeKit::isActive() && nSlotId == SID_OPENDLG_FUNCTION))
127  {
128  // the dialog has been opened in a different view
129  // -> lock the dispatcher for this view (modal mode)
130 
131  GetViewData().GetDispatcher().Lock( true ); // lock is reset when closing dialog
132  }
133  return nullptr;
134  }
135 
136  std::shared_ptr<SfxModelessDialogController> xResult;
137 
138  if(pCW)
139  pCW->SetHideNotDelete(true);
140 
141  ScDocument& rDoc = GetViewData().GetDocument();
142 
143  switch( nSlotId )
144  {
145  case SID_CORRELATION_DIALOG:
146  xResult = std::make_shared<ScCorrelationDialog>(pB, pCW, pParent, GetViewData());
147  break;
148  case SID_SAMPLING_DIALOG:
149  xResult = std::make_shared<ScSamplingDialog>(pB, pCW, pParent, GetViewData());
150  break;
151  case SID_DESCRIPTIVE_STATISTICS_DIALOG:
152  xResult = std::make_shared<ScDescriptiveStatisticsDialog>(pB, pCW, pParent, GetViewData());
153  break;
154  case SID_ANALYSIS_OF_VARIANCE_DIALOG:
155  xResult = std::make_shared<ScAnalysisOfVarianceDialog>(pB, pCW, pParent, GetViewData());
156  break;
157  case SID_COVARIANCE_DIALOG:
158  xResult = std::make_shared<ScCovarianceDialog>(pB, pCW, pParent, GetViewData());
159  break;
160  case SID_EXPONENTIAL_SMOOTHING_DIALOG:
161  xResult = std::make_shared<ScExponentialSmoothingDialog>(pB, pCW, pParent, GetViewData());
162  break;
163  case SID_MOVING_AVERAGE_DIALOG:
164  xResult = std::make_shared<ScMovingAverageDialog>(pB, pCW, pParent, GetViewData());
165  break;
166  case SID_REGRESSION_DIALOG:
167  xResult = std::make_shared<ScRegressionDialog>(pB, pCW, pParent, GetViewData());
168  break;
169  case SID_FTEST_DIALOG:
170  xResult = std::make_shared<ScFTestDialog>(pB, pCW, pParent, GetViewData());
171  break;
172  case SID_TTEST_DIALOG:
173  xResult = std::make_shared<ScTTestDialog>(pB, pCW, pParent, GetViewData());
174  break;
175  case SID_ZTEST_DIALOG:
176  xResult = std::make_shared<ScZTestDialog>(pB, pCW, pParent, GetViewData());
177  break;
178  case SID_CHI_SQUARE_TEST_DIALOG:
179  xResult = std::make_shared<ScChiSquareTestDialog>(pB, pCW, pParent, GetViewData());
180  break;
181  case SID_FOURIER_ANALYSIS_DIALOG:
182  xResult = std::make_shared<ScFourierAnalysisDialog>(pB, pCW, pParent, GetViewData());
183  break;
184  case WID_SIMPLE_REF:
185  {
186  // dialog checks, what is in the cell
187 
188  ScViewData& rViewData = GetViewData();
189  rViewData.SetRefTabNo( rViewData.GetTabNo() );
190  xResult = std::make_shared<ScSimpleRefDlg>(pB, pCW, pParent);
191  break;
192  }
193  case FID_DEFINE_NAME:
194  {
195  if (!mbInSwitch)
196  {
197  xResult = std::make_shared<ScNameDlg>(pB, pCW, pParent, GetViewData(),
198  ScAddress( GetViewData().GetCurX(),
199  GetViewData().GetCurY(),
200  GetViewData().GetTabNo() ) );
201  }
202  else
203  {
204  xResult = std::make_shared<ScNameDlg>( pB, pCW, pParent, GetViewData(),
205  ScAddress( GetViewData().GetCurX(),
206  GetViewData().GetCurY(),
207  GetViewData().GetTabNo() ), &m_RangeMap);
208  static_cast<ScNameDlg*>(xResult.get())->SetEntry(maName, maScope);
209  mbInSwitch = false;
210  }
211  break;
212  }
213  case FID_ADD_NAME:
214  {
215  if (!mbInSwitch)
216  {
217  std::map<OUString, ScRangeName*> aRangeMap;
218  rDoc.GetRangeNameMap(aRangeMap);
219  xResult = std::make_shared<ScNameDefDlg>(pB, pCW, pParent, GetViewData(), std::move(aRangeMap),
220  ScAddress(GetViewData().GetCurX(),
221  GetViewData().GetCurY(),
222  GetViewData().GetTabNo()), true);
223  }
224  else
225  {
226  std::map<OUString, ScRangeName*> aRangeMap;
227  for (auto const& itr : m_RangeMap)
228  {
229  aRangeMap.insert(std::pair<OUString, ScRangeName*>(itr.first, itr.second.get()));
230  }
231  xResult = std::make_shared<ScNameDefDlg>(pB, pCW, pParent, GetViewData(), std::move(aRangeMap),
232  ScAddress(GetViewData().GetCurX(),
233  GetViewData().GetCurY(),
234  GetViewData().GetTabNo()), false);
235  }
236  break;
237  }
238  case SID_RANDOM_NUMBER_GENERATOR_DIALOG:
239  xResult = std::make_shared<ScRandomNumberGeneratorDialog>(pB, pCW, pParent, GetViewData());
240  break;
241  case SID_SPARKLINE_DIALOG:
242  {
243  xResult = std::make_shared<sc::SparklineDialog>(pB, pCW, pParent, GetViewData());
244  break;
245  }
246  case SID_SPARKLINE_DATA_RANGE_DIALOG:
247  {
248  xResult = std::make_shared<sc::SparklineDataRangeDialog>(pB, pCW, pParent, GetViewData());
249  break;
250  }
251  case SID_DEFINE_DBNAME:
252  {
253  // when called for an existing range, then mark
254  GetDBData( true, SC_DB_OLD );
255  const ScMarkData& rMark = GetViewData().GetMarkData();
256  if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
257  MarkDataArea( false );
258 
259  xResult = std::make_shared<ScDbNameDlg>(pB, pCW, pParent, GetViewData());
260  break;
261  }
262  case SID_OPENDLG_EDIT_PRINTAREA:
263  xResult = std::make_shared<ScPrintAreasDlg>(pB, pCW, pParent);
264  break;
265  case SID_DEFINE_COLROWNAMERANGES:
266  xResult = std::make_shared<ScColRowNameRangesDlg>(pB, pCW, pParent, GetViewData());
267  break;
268  case SID_OPENDLG_SOLVE:
269  {
270  ScViewData& rViewData = GetViewData();
271  ScAddress aCurPos( rViewData.GetCurX(),
272  rViewData.GetCurY(),
273  rViewData.GetTabNo());
274  xResult = std::make_shared<ScSolverDlg>(pB, pCW, pParent, &rViewData.GetDocument(), aCurPos);
275  break;
276  }
277  case SID_OPENDLG_TABOP:
278  {
279  ScViewData& rViewData = GetViewData();
280  ScRefAddress aCurPos ( rViewData.GetCurX(),
281  rViewData.GetCurY(),
282  rViewData.GetTabNo());
283 
284  xResult = std::make_shared<ScTabOpDlg>(pB, pCW, pParent, &rViewData.GetDocument(), aCurPos);
285  break;
286  }
287  case SID_OPENDLG_CONSOLIDATE:
288  {
290  SCITEM_CONSOLIDATEDATA> aArgSet( GetPool() );
291 
292  const ScConsolidateParam* pDlgData =
293  rDoc.GetConsolidateDlgData();
294 
295  if ( !pDlgData )
296  {
297  ScConsolidateParam aConsParam;
298  SCCOL nStartCol, nEndCol;
299  SCROW nStartRow, nEndRow;
300  SCTAB nStartTab, nEndTab;
301 
302  GetViewData().GetSimpleArea( nStartCol, nStartRow, nStartTab,
303  nEndCol, nEndRow, nEndTab );
304 
305  PutInOrder( nStartCol, nEndCol );
306  PutInOrder( nStartRow, nEndRow );
307  PutInOrder( nStartTab, nEndTab );
308 
309  aConsParam.nCol = nStartCol;
310  aConsParam.nRow = nStartRow;
311  aConsParam.nTab = nStartTab;
312 
313  aArgSet.Put( ScConsolidateItem( SCITEM_CONSOLIDATEDATA,
314  &aConsParam ) );
315  }
316  else
317  {
318  aArgSet.Put( ScConsolidateItem( SCITEM_CONSOLIDATEDATA, pDlgData ) );
319  }
320  xResult = std::make_shared<ScConsolidateDlg>(pB, pCW, pParent, aArgSet);
321  break;
322  }
323  case SID_FILTER:
324  {
325 
326  ScQueryParam aQueryParam;
328 
330  pDBData->ExtendDataArea(rDoc);
331  pDBData->GetQueryParam( aQueryParam );
332 
333  ScRange aArea;
334  pDBData->GetArea(aArea);
335  MarkRange(aArea, false);
336 
337  aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA,
338  &GetViewData(),
339  &aQueryParam ) );
340 
341  // mark current sheet (due to RefInput in dialog)
342  GetViewData().SetRefTabNo( GetViewData().GetTabNo() );
343 
344  xResult = std::make_shared<ScFilterDlg>(pB, pCW, pParent, aArgSet);
345  break;
346  }
347  case SID_SPECIAL_FILTER:
348  {
349  ScQueryParam aQueryParam;
351  SCITEM_QUERYDATA> aArgSet( GetPool() );
352 
354  pDBData->ExtendDataArea(rDoc);
355  pDBData->GetQueryParam( aQueryParam );
356 
357  ScRange aArea;
358  pDBData->GetArea(aArea);
359  MarkRange(aArea, false);
360 
361  ScQueryItem aItem( SCITEM_QUERYDATA, &GetViewData(), &aQueryParam );
362  ScRange aAdvSource;
363  if (pDBData->GetAdvancedQuerySource(aAdvSource))
364  aItem.SetAdvancedQuerySource( &aAdvSource );
365 
366  aArgSet.Put( aItem );
367 
368  // mark current sheet (due to RefInput in dialog)
369  GetViewData().SetRefTabNo( GetViewData().GetTabNo() );
370 
371  xResult = std::make_shared<ScSpecialFilterDlg>(pB, pCW, pParent, aArgSet);
372  break;
373  }
374  case SID_OPENDLG_OPTSOLVER:
375  {
376  ScViewData& rViewData = GetViewData();
377  ScAddress aCurPos( rViewData.GetCurX(), rViewData.GetCurY(), rViewData.GetTabNo());
378  xResult = std::make_shared<ScOptSolverDlg>(pB, pCW, pParent, rViewData.GetDocShell(), aCurPos);
379  break;
380  }
381  case FID_CHG_SHOW:
382  {
383  // dialog checks, what is in the cell
384  xResult = std::make_shared<ScHighlightChgDlg>(pB, pCW, pParent, GetViewData());
385  break;
386  }
387  case SID_MANAGE_XML_SOURCE:
388  {
389  xResult = std::make_shared<ScXMLSourceDlg>(pB, pCW, pParent, &rDoc);
390  break;
391  }
392  case SID_OPENDLG_PIVOTTABLE:
393  {
394  // all settings must be in pDialogDPObject
395 
396  if( pDialogDPObject )
397  {
398  // Check for an existing datapilot output.
399  ScViewData& rViewData = GetViewData();
400  rViewData.SetRefTabNo( rViewData.GetTabNo() );
401  ScDPObject* pObj = rDoc.GetDPAtCursor(rViewData.GetCurX(), rViewData.GetCurY(), rViewData.GetTabNo());
402  xResult = std::make_shared<ScPivotLayoutDialog>(pB, pCW, pParent, &rViewData, pDialogDPObject.get(), pObj == nullptr);
403  }
404 
405  break;
406  }
407  case SID_OPENDLG_FUNCTION:
408  {
409  if (!isLOKMobilePhone())
410  {
411  // dialog checks, what is in the cell
412  xResult = o3tl::make_shared<ScFormulaDlg>(pB, pCW, pParent, GetViewData(), ScGlobal::GetStarCalcFunctionMgr());
413  }
414  break;
415  }
416  case WID_CONDFRMT_REF:
417  {
418  const ScCondFormatDlgItem* pDlgItem = nullptr;
419  // Get the pool item stored by Conditional Format Manager Dialog.
421  if (itemsRange.begin() != itemsRange.end())
422  {
423  const SfxPoolItem* pItem = *itemsRange.begin();
424  pDlgItem = static_cast<const ScCondFormatDlgItem*>(pItem);
425  }
426 
427  if (pDlgItem)
428  {
429  ScViewData& rViewData = GetViewData();
430  rViewData.SetRefTabNo( rViewData.GetTabNo() );
431 
432  xResult = std::make_shared<ScCondFormatDlg>(pB, pCW, pParent, &rViewData, pDlgItem);
433 
434  // Remove the pool item stored by Conditional Format Manager Dialog.
435  GetPool().Remove(*pDlgItem);
436  }
437 
438  break;
439  }
440  }
441 
442  if (xResult)
443  xResult->Initialize( pInfo );
444  return xResult;
445 }
446 
448 {
449  return GetViewData().GetTabNo();
450 }
451 
453 {
454  UpdateInputHandler(true, false);
455 
456  ScInputHandler* pHdl = mpInputHandler ? mpInputHandler.get() : SC_MOD()->GetInputHdl();
457  if (pHdl)
458  {
459  ScInputWindow* pInputWindow = pHdl->GetInputWindow();
460  if (pInputWindow)
461  {
462  pInputWindow->NotifyLOKClient();
463  }
464  }
465 }
466 
468 {
469  ScDrawView* pDrView = const_cast<ScTabViewShell*>(this)->GetScDrawView();
470  if (pDrView)
471  {
472  if (pDrView->GetTextEditObject())
473  {
474  // Blinking cursor.
475  EditView& rEditView = pDrView->GetTextEditOutlinerView()->GetEditView();
476  rEditView.RegisterOtherShell(pOtherShell);
477  rEditView.ShowCursor();
478  rEditView.RegisterOtherShell(nullptr);
479  // Text selection, if any.
480  rEditView.DrawSelectionXOR(pOtherShell);
481  }
482  else
483  {
484  // Graphic selection.
485  pDrView->AdjustMarkHdl(pOtherShell);
486  }
487  }
488 
489  const ScGridWindow* pWin = GetViewData().GetActiveWin();
490  if (pWin)
491  pWin->updateKitCellCursor(pOtherShell);
492 }
493 
494 css::uno::Reference<css::datatransfer::XTransferable2> ScTabViewShell::GetClipData(vcl::Window* pWin)
495 {
496  SfxViewFrame* pViewFrame = nullptr;
497  css::uno::Reference<css::datatransfer::XTransferable2> xTransferable;
498  css::uno::Reference<css::datatransfer::clipboard::XClipboard> xClipboard;
499 
500  if (pWin)
501  xClipboard = pWin->GetClipboard();
502  else if ((pViewFrame = SfxViewFrame::GetFirst(nullptr, false)))
503  xClipboard = pViewFrame->GetWindow().GetClipboard();
504 
505  xTransferable.set(xClipboard.is() ? xClipboard->getContents() : nullptr, css::uno::UNO_QUERY);
506 
507  return xTransferable;
508 }
509 
510 void ScTabViewShell::notifyAllViewsHeaderInvalidation(const SfxViewShell* pForViewShell, HeaderType eHeaderType, SCTAB nCurrentTabIndex)
511 {
513  return;
514 
515  OString aPayload;
516  switch (eHeaderType)
517  {
518  case COLUMN_HEADER:
519  aPayload = "column";
520  break;
521  case ROW_HEADER:
522  aPayload = "row";
523  break;
524  case BOTH_HEADERS:
525  default:
526  aPayload = "all";
527  break;
528  }
529 
530  SfxViewShell* pViewShell = SfxViewShell::GetFirst();
531  while (pViewShell)
532  {
533  ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell);
534  if (pTabViewShell && pViewShell->GetDocId() == pForViewShell->GetDocId()
535  && (nCurrentTabIndex == -1 || pTabViewShell->getPart() == nCurrentTabIndex))
536  {
537  pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_INVALIDATE_HEADER, aPayload.getStr());
538  }
539  pViewShell = SfxViewShell::GetNext(*pViewShell);
540  }
541 }
542 
543 bool ScTabViewShell::isAnyEditViewInRange(const SfxViewShell* pForViewShell, bool bColumns, SCCOLROW nStart, SCCOLROW nEnd)
544 {
546  {
547  SfxViewShell* pViewShell = SfxViewShell::GetFirst();
548  while (pViewShell)
549  {
550  ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell);
551  if (pTabViewShell && pTabViewShell->GetDocId() == pForViewShell->GetDocId())
552  {
553  ScInputHandler* pInputHandler = pTabViewShell->GetInputHandler();
554  if (pInputHandler && pInputHandler->GetActiveView())
555  {
556  const ScViewData& rViewData = pTabViewShell->GetViewData();
557  SCCOLROW nPos = bColumns ? rViewData.GetCurX() : rViewData.GetCurY();
558  if (nStart <= nPos && nPos <= nEnd)
559  return true;
560  }
561  }
562  pViewShell = SfxViewShell::GetNext(*pViewShell);
563  }
564  }
565  return false;
566 }
567 
568 void ScTabViewShell::notifyAllViewsSheetGeomInvalidation(const SfxViewShell* pForViewShell, bool bColumns,
569  bool bRows, bool bSizes, bool bHidden, bool bFiltered,
570  bool bGroups, SCTAB nCurrentTabIndex)
571 {
574  comphelper::LibreOfficeKit::Compat::scPrintTwipsMsgs))
575  return;
576 
577  if (!bColumns && !bRows)
578  return;
579 
580  bool bAllTypes = bSizes && bHidden && bFiltered && bGroups;
581  bool bAllDims = bColumns && bRows;
582  OString aPayload = bAllDims ? "all" : bColumns ? "columns" : "rows";
583 
584  if (!bAllTypes)
585  {
586  if (bSizes)
587  aPayload += " sizes";
588 
589  if (bHidden)
590  aPayload += " hidden";
591 
592  if (bFiltered)
593  aPayload += " filtered";
594 
595  if (bGroups)
596  aPayload += " groups";
597  }
598 
599  SfxViewShell* pViewShell = SfxViewShell::GetFirst();
600  while (pViewShell)
601  {
602  ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell);
603  if (pTabViewShell && pViewShell->GetDocId() == pForViewShell->GetDocId() &&
604  (nCurrentTabIndex == -1 || pTabViewShell->getPart() == nCurrentTabIndex))
605  {
606  pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_INVALIDATE_SHEET_GEOMETRY, aPayload.getStr());
607  }
608  pViewShell = SfxViewShell::GetNext(*pViewShell);
609  }
610 }
611 
613 {
614  bool bSubTotal = false;
615  ScDocument& rDoc = GetViewData().GetDocument();
616  size_t nRangeCount (pRangeList->size());
617  size_t nRangeIndex (0);
618  while (!bSubTotal && nRangeIndex < nRangeCount)
619  {
620  const ScRange& rRange = (*pRangeList)[nRangeIndex];
621  SCTAB nTabEnd(rRange.aEnd.Tab());
622  SCTAB nTab(rRange.aStart.Tab());
623  while (!bSubTotal && nTab <= nTabEnd)
624  {
625  SCROW nRowEnd(rRange.aEnd.Row());
626  SCROW nRow(rRange.aStart.Row());
627  while (!bSubTotal && nRow <= nRowEnd)
628  {
629  if (rDoc.RowFiltered(nRow, nTab))
630  bSubTotal = true;
631  else
632  ++nRow;
633  }
634  ++nTab;
635  }
636  ++nRangeIndex;
637  }
638 
639  if (!bSubTotal)
640  {
641  const ScDBCollection::NamedDBs& rDBs = rDoc.GetDBCollection()->getNamedDBs();
642  for (const auto& rxDB : rDBs)
643  {
644  const ScDBData& rDB = *rxDB;
645  if (!rDB.HasAutoFilter())
646  continue;
647 
648  nRangeIndex = 0;
649  while (!bSubTotal && nRangeIndex < nRangeCount)
650  {
651  const ScRange & rRange = (*pRangeList)[nRangeIndex];
652  ScRange aDBArea;
653  rDB.GetArea(aDBArea);
654  if (aDBArea.Intersects(rRange))
655  bSubTotal = true;
656  ++nRangeIndex;
657  }
658 
659  if (bSubTotal)
660  break;
661  }
662  }
663  return bSubTotal;
664 }
665 
666 OUString ScTabViewShell::DoAutoSum(bool& rRangeFinder, bool& rSubTotal, const OpCode eCode)
667 {
668  OUString aFormula;
669  const ScMarkData& rMark = GetViewData().GetMarkData();
670  if ( rMark.IsMarked() || rMark.IsMultiMarked() )
671  {
672  ScRangeList aMarkRangeList;
673  rRangeFinder = rSubTotal = false;
674  rMark.FillRangeListWithMarks( &aMarkRangeList, false );
675  ScDocument& rDoc = GetViewData().GetDocument();
676 
677  // check if one of the marked ranges is empty
678  bool bEmpty = false;
679  const size_t nCount = aMarkRangeList.size();
680  for ( size_t i = 0; i < nCount; ++i )
681  {
682  const ScRange & rRange( aMarkRangeList[i] );
683  if ( rDoc.IsBlockEmpty( rRange.aStart.Col(), rRange.aStart.Row(),
684  rRange.aEnd.Col(), rRange.aEnd.Row(), rRange.aStart.Tab() ) )
685  {
686  bEmpty = true;
687  break;
688  }
689  }
690 
691  if ( bEmpty )
692  {
693  ScRangeList aRangeList;
694  const bool bDataFound = GetAutoSumArea( aRangeList );
695  if ( bDataFound )
696  {
697  ScAddress aAddr = aRangeList.back().aEnd;
698  aAddr.IncRow();
699  const bool bSubTotal( UseSubTotal( &aRangeList ) );
700  EnterAutoSum( aRangeList, bSubTotal, aAddr, eCode );
701  }
702  }
703  else
704  {
705  const bool bSubTotal( UseSubTotal( &aMarkRangeList ) );
706  for ( size_t i = 0; i < nCount; ++i )
707  {
708  const ScRange & rRange = aMarkRangeList[i];
709  const bool bSetCursor = ( i == nCount - 1 );
710  const bool bContinue = ( i != 0 );
711  if ( !AutoSum( rRange, bSubTotal, bSetCursor, bContinue, eCode ) )
712  {
713  MarkRange( rRange, false );
714  SetCursor( rRange.aEnd.Col(), rRange.aEnd.Row() );
715  const ScRangeList aRangeList;
716  ScAddress aAddr = rRange.aEnd;
717  aAddr.IncRow();
718  aFormula = GetAutoSumFormula( aRangeList, bSubTotal, aAddr , eCode);
719  break;
720  }
721  }
722  }
723  }
724  else // Only insert into input row
725  {
726  ScRangeList aRangeList;
727  rRangeFinder = GetAutoSumArea( aRangeList );
728  rSubTotal = UseSubTotal( &aRangeList );
729  ScAddress aAddr = GetViewData().GetCurPos();
730  aFormula = GetAutoSumFormula( aRangeList, rSubTotal, aAddr , eCode);
731  }
732  return aFormula;
733 }
734 
736 {
737  mpFormEditData.reset(new ScFormEditData);
738 }
739 
741 {
742  mpFormEditData.reset();
743 }
744 
745 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
ScMarkData & GetMarkData()
Definition: viewdata.cxx:3135
SfxViewFrame * GetViewFrame() const
SC_DLLPUBLIC ScDPObject * GetDPAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab) const
Definition: documen3.cxx:377
void MarkDataArea(bool bIncludeCursor=true)
Definition: tabview3.cxx:1658
bool HasAutoFilter() const
Definition: dbdata.hxx:204
SC_DLLPUBLIC ScDBCollection * GetDBCollection() const
Definition: document.hxx:825
ScDBData * GetDBData(bool bMarkArea=true, ScGetDBMode eMode=SC_DB_MAKE, ScGetDBSelection eSel=ScGetDBSelection::Keep)
Definition: dbfunc.cxx:81
ScAddress aStart
Definition: address.hxx:497
ScDocShell * GetDocShell() const
Definition: viewdata.hxx:354
std::unique_ptr< ScInputHandler, o3tl::default_delete< ScInputHandler > > mpInputHandler
Definition: tabvwsh.hxx:120
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
Definition: markdata.hxx:42
SfxChildWindow * GetChildWindow(sal_uInt16)
bool isLOKMobilePhone() const
SCROW Row() const
Definition: address.hxx:274
HeaderType
Definition: tabview.hxx:57
bool GetAutoSumArea(ScRangeList &rRangeList)
Definition: viewfun2.cxx:510
css::uno::Reference< css::datatransfer::clipboard::XClipboard > GetClipboard()
void MarkRange(const ScRange &rRange, bool bSetCursor=true, bool bContinue=false)
Definition: tabview3.cxx:1689
std::unique_ptr< ScDPObject > pDialogDPObject
Definition: tabvwsh.hxx:130
bool Intersects(const ScRange &rRange) const
Definition: address.hxx:734
int getPart() const override
See SfxViewShell::getPart().
Definition: tabvwshc.cxx:447
std::map< OUString, std::unique_ptr< ScRangeName > > m_RangeMap
Definition: tabvwsh.hxx:165
SdrTextObj * GetTextEditObject() const
SCROW GetCurY() const
Definition: viewdata.hxx:402
void ShowCursor(bool bGotoCursor=true, bool bForceVisCursor=true, bool bActivate=false)
sal_uInt16 nCurRefDlgId
Definition: tabvwsh.hxx:160
don't create
Definition: global.hxx:384
ViewShellDocId GetDocId() const override
void FillRangeListWithMarks(ScRangeList *pList, bool bClear, SCTAB nForTab=-1) const
Create a range list of marks.
Definition: markdata.cxx:372
sal_Int16 nId
SCTAB GetTabNo() const
Definition: viewdata.hxx:395
ScAddress aEnd
Definition: address.hxx:498
ScDocument & GetDocument() const
Definition: viewdata.hxx:380
static css::uno::Reference< css::datatransfer::XTransferable2 > GetClipData(vcl::Window *pWin)
Definition: tabvwshc.cxx:494
void Remove(const SfxPoolItem &)
SC_DLLPUBLIC void SetCursor(SCCOL nPosX, SCROW nPosY, bool bNew=false)
Definition: tabview3.cxx:363
#define SCITEM_QUERYDATA
Definition: scitems.hxx:91
OUString DoAutoSum(bool &rRangeFinder, bool &rSubTotal, const OpCode eCode)
Definition: tabvwshc.cxx:666
void ExtendDataArea(const ScDocument &rDoc)
Definition: dbdata.cxx:649
static void notifyAllViewsSheetGeomInvalidation(const SfxViewShell *pForViewShell, bool bColumns, bool bRows, bool bSizes, bool bHidden, bool bFiltered, bool bGroups, SCTAB nCurrentTabIndex)
Emits a LOK_CALLBACK_INVALIDATE_SHEET_GEOMETRY for all views whose current tab is equal to nCurrentTa...
Definition: tabvwshc.cxx:568
void updateKitCellCursor(const SfxViewShell *pOtherShell) const
Definition: gridwin.cxx:5971
EditView * GetActiveView()
Definition: inputhdl.cxx:2323
vcl::Window & GetWindow() const
sal_Int32 SCCOLROW
a type capable of holding either SCCOL or SCROW
Definition: types.hxx:23
bool IsMultiMarked() const
Definition: markdata.hxx:81
OpCode
void SetCurRefDlgId(sal_uInt16 nNew)
Definition: tabvwshc.cxx:79
void SetRefTabNo(SCTAB nNewTab)
Definition: viewdata.hxx:393
int nCount
static SfxViewShell * GetNext(const SfxViewShell &rPrev, bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
void RegisterOtherShell(OutlinerViewShell *pOtherShell)
ScInputWindow * GetInputWindow()
Definition: inputhdl.hxx:263
bool isCompatFlagSet(Compat flag)
virtual void libreOfficeKitViewCallback(int nType, const char *pPayload) const override
void UpdateInputHandler(bool bForce=false, bool bStopEditing=true)
Definition: tabvwsha.cxx:668
SCTAB Tab() const
Definition: address.hxx:283
If only one row or portion thereof is selected, shrink row to used data columns and select further ro...
OUString GetAutoSumFormula(const ScRangeList &rRangeList, bool bSubTotal, const ScAddress &rAddr, const OpCode eCode)
Definition: viewfun2.cxx:842
void SetHideNotDelete(bool bOn)
void ClearFormEditData()
Definition: tabvwshc.cxx:740
ScViewData & GetViewData()
Definition: tabview.hxx:333
#define SCITEM_CONDFORMATDLGDATA
Definition: scitems.hxx:97
EditView & GetEditView() const
SfxItemPool & GetPool() const
void PutInOrder(T &nStart, T &nEnd)
Definition: address.hxx:150
create "untitled" (if necessary)
Definition: global.hxx:381
bool IsBlockEmpty(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab) const
Definition: document.cxx:5391
void SetAdvancedQuerySource(const ScRange *pSource)
Definition: uiitems.cxx:203
bool IsMarked() const
Definition: markdata.hxx:80
SC_DLLPUBLIC void GetRangeNameMap(std::map< OUString, ScRangeName * > &rRangeName)
Definition: documen3.cxx:146
int i
SC_DLLPUBLIC bool RowFiltered(SCROW nRow, SCTAB nTab, SCROW *pFirstRow=nullptr, SCROW *pLastRow=nullptr) const
Definition: document.cxx:4549
sal_Int16 SCCOL
Definition: types.hxx:21
#define SC_MOD()
Definition: scmod.hxx:249
static ScFunctionMgr * GetStarCalcFunctionMgr()
Definition: global.cxx:629
size_t size() const
Definition: rangelst.hxx:89
OUString maScope
Definition: tabvwsh.hxx:168
void IncRow(SCROW nDelta=1)
Definition: address.hxx:312
ScMarkType GetSimpleArea(SCCOL &rStartCol, SCROW &rStartRow, SCTAB &rStartTab, SCCOL &rEndCol, SCROW &rEndRow, SCTAB &rEndTab) const
Definition: viewdata.cxx:1181
ScGridWindow * GetActiveWin()
Definition: viewdata.cxx:3151
const OutlinerView * GetTextEditOutlinerView() const
void DrawSelectionXOR(OutlinerViewShell *pOtherShell)
void Lock(bool bLock)
static SfxViewShell * GetFirst(bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
static void notifyAllViewsHeaderInvalidation(const SfxViewShell *pForViewShell, HeaderType eHeaderType, SCTAB nCurrentTabIndex)
Emits a LOK_CALLBACK_INVALIDATE_HEADER for all views whose current tab is equal to nCurrentTabIndex...
Definition: tabvwshc.cxx:510
ScRange & back()
Definition: rangelst.hxx:94
void GetArea(SCTAB &rTab, SCCOL &rCol1, SCROW &rRow1, SCCOL &rCol2, SCROW &rRow2) const
Definition: dbdata.cxx:300
SCCOL Col() const
Definition: address.hxx:279
ScAddress GetCurPos() const
Definition: viewdata.cxx:4121
void NotifyCursor(SfxViewShell *pViewShell) const override
See SfxViewShell::NotifyCursor().
Definition: tabvwshc.cxx:467
Stores global named database ranges.
Definition: dbdata.hxx:234
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
sal_Int32 SCROW
Definition: types.hxx:17
std::unique_ptr< ScFormEditData > mpFormEditData
Definition: tabvwsh.hxx:119
ScDrawView * GetScDrawView()
Definition: tabview.hxx:341
bool AutoSum(const ScRange &rRange, bool bSubTotal, bool bSetCursor, bool bContinue, const OpCode eCode)
Definition: viewfun2.cxx:622
bool UseSubTotal(ScRangeList *pRangeList)
Definition: tabvwshc.cxx:612
void InitFormEditData()
Definition: tabvwshc.cxx:735
std::shared_ptr< SfxModelessDialogController > CreateRefDialogController(SfxBindings *pB, SfxChildWindow *pCW, const SfxChildWinInfo *pInfo, weld::Window *pParent, sal_uInt16 nSlotId)
Definition: tabvwshc.cxx:113
Close
SfxDispatcher & GetDispatcher()
Definition: viewdata.cxx:3129
void AdjustMarkHdl(SfxViewShell *pOtherShell=nullptr)
Item2Range GetItemSurrogates(sal_uInt16 nWhich) const
void EnterAutoSum(const ScRangeList &rRangeList, bool bSubTotal, const ScAddress &rAddr, const OpCode eCode)
Definition: viewfun2.cxx:616
OUString maName
Definition: tabvwsh.hxx:167
const ScConsolidateParam * GetConsolidateDlgData() const
Definition: document.hxx:652
SC_DLLPUBLIC void GetQueryParam(ScQueryParam &rQueryParam) const
Definition: dbdata.cxx:424
NamedDBs & getNamedDBs()
Definition: dbdata.hxx:316
static bool isAnyEditViewInRange(const SfxViewShell *pForViewShell, bool bColumns, SCCOLROW nStart, SCCOLROW nEnd)
Definition: tabvwshc.cxx:543
void NotifyLOKClient()
Definition: inputwin.cxx:497
static SfxViewFrame * GetFirst(const SfxObjectShell *pDoc=nullptr, bool bOnlyVisible=true)
SC_DLLPUBLIC bool GetAdvancedQuerySource(ScRange &rSource) const
Definition: dbdata.cxx:457
const ScInputHandler * GetInputHandler() const
Definition: tabvwsh.hxx:238
#define SCITEM_CONSOLIDATEDATA
Definition: scitems.hxx:93
sal_uInt16 nPos
sal_Int16 SCTAB
Definition: types.hxx:22
void SwitchBetweenRefDialogs(SfxModelessDialogController *pDialog)
Definition: tabvwshc.cxx:87
SCCOL GetCurX() const
Definition: viewdata.hxx:401
void afterCallbackRegistered() override
See SfxViewShell::afterCallbackRegistered().
Definition: tabvwshc.cxx:452