Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <config_mpl.h>
21 :
22 : #include "scitems.hxx"
23 : #include <vcl/msgbox.hxx>
24 : #include <sfx2/childwin.hxx>
25 : #include <sfx2/dispatch.hxx>
26 :
27 : #include "tabvwsh.hxx"
28 : #include "sc.hrc"
29 : #include "globstr.hrc"
30 : #include "global.hxx"
31 : #include "scmod.hxx"
32 : #include "docsh.hxx"
33 : #include "document.hxx"
34 : #include "uiitems.hxx"
35 : #include "pivot.hxx"
36 : #include "namedlg.hxx"
37 : #include "namedefdlg.hxx"
38 : #include "solvrdlg.hxx"
39 : #include "optsolver.hxx"
40 : #include "tabopdlg.hxx"
41 : #include "autoform.hxx"
42 : #include "autofmt.hxx"
43 : #include "consdlg.hxx"
44 : #include "filtdlg.hxx"
45 : #include "dbnamdlg.hxx"
46 : #include "areasdlg.hxx"
47 : #include "rangeutl.hxx"
48 : #include "crnrdlg.hxx"
49 : #include "formula.hxx"
50 : #include "formulacell.hxx"
51 : #include "acredlin.hxx"
52 : #include "highred.hxx"
53 : #include "simpref.hxx"
54 : #include "funcdesc.hxx"
55 : #include "dpobject.hxx"
56 : #include "markdata.hxx"
57 : #include "reffact.hxx"
58 : #include "condformatdlg.hxx"
59 : #include "xmlsourcedlg.hxx"
60 :
61 : #include "RandomNumberGeneratorDialog.hxx"
62 : #include "SamplingDialog.hxx"
63 : #include "DescriptiveStatisticsDialog.hxx"
64 : #include "AnalysisOfVarianceDialog.hxx"
65 : #include "CorrelationDialog.hxx"
66 : #include "CovarianceDialog.hxx"
67 : #include "ExponentialSmoothingDialog.hxx"
68 : #include "MovingAverageDialog.hxx"
69 : #include "TTestDialog.hxx"
70 : #include "FTestDialog.hxx"
71 : #include "ZTestDialog.hxx"
72 : #include "ChiSquareTestDialog.hxx"
73 :
74 : #include "PivotLayoutDialog.hxx"
75 :
76 : #include <config_orcus.h>
77 :
78 0 : void ScTabViewShell::SetCurRefDlgId( sal_uInt16 nNew )
79 : {
80 : // CurRefDlgId is stored in ScModule to find if a ref dialog is open,
81 : // and in the view to identify the view that has opened the dialog
82 0 : nCurRefDlgId = nNew;
83 0 : }
84 :
85 : //ugly hack to call Define Name from Manage Names
86 0 : void ScTabViewShell::SwitchBetweenRefDialogs(SfxModelessDialog* pDialog)
87 : {
88 0 : sal_uInt16 nSlotId = SC_MOD()->GetCurRefDlgId();
89 0 : if (nSlotId == FID_DEFINE_NAME)
90 : {
91 0 : mbInSwitch = true;
92 0 : static_cast<ScNameDlg*>(pDialog)->GetRangeNames(maRangeMap);
93 0 : static_cast<ScNameDlg*>(pDialog)->Close();
94 0 : sal_uInt16 nId = ScNameDefDlgWrapper::GetChildWindowId();
95 0 : SfxViewFrame* pViewFrm = GetViewFrame();
96 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
97 :
98 0 : SC_MOD()->SetRefDialog( nId, pWnd == nullptr );
99 : }
100 0 : else if( nSlotId == FID_ADD_NAME )
101 : {
102 0 : static_cast<ScNameDefDlg*>(pDialog)->GetNewData(maName, maScope);
103 0 : static_cast<ScNameDlg*>(pDialog)->Close();
104 0 : sal_uInt16 nId = ScNameDlgWrapper::GetChildWindowId();
105 0 : SfxViewFrame* pViewFrm = GetViewFrame();
106 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
107 :
108 0 : SC_MOD()->SetRefDialog( nId, pWnd == nullptr );
109 : }
110 : else
111 : {
112 :
113 : }
114 0 : }
115 :
116 0 : VclPtr<SfxModelessDialog> ScTabViewShell::CreateRefDialog(
117 : SfxBindings* pB, SfxChildWindow* pCW,
118 : SfxChildWinInfo* pInfo,
119 : vcl::Window* pParent, sal_uInt16 nSlotId )
120 : {
121 : // Dialog nur aufmachen, wenn ueber ScModule::SetRefDialog gerufen, damit
122 : // z.B. nach einem Absturz offene Ref-Dialoge nicht wiederkommen (#42341#).
123 :
124 0 : if ( SC_MOD()->GetCurRefDlgId() != nSlotId )
125 0 : return NULL;
126 :
127 0 : if ( nCurRefDlgId != nSlotId )
128 : {
129 : // the dialog has been opened in a different view
130 : // -> lock the dispatcher for this view (modal mode)
131 :
132 0 : GetViewData().GetDispatcher().Lock( true ); // lock is reset when closing dialog
133 0 : return NULL;
134 : }
135 :
136 0 : VclPtr<SfxModelessDialog> pResult;
137 :
138 0 : if(pCW)
139 0 : pCW->SetHideNotDelete(true);
140 :
141 0 : ScDocument* pDoc = GetViewData().GetDocument();
142 :
143 0 : switch( nSlotId )
144 : {
145 : case FID_DEFINE_NAME:
146 : {
147 0 : if (!mbInSwitch)
148 : {
149 0 : pResult = VclPtr<ScNameDlg>::Create( pB, pCW, pParent, &GetViewData(),
150 0 : ScAddress( GetViewData().GetCurX(),
151 0 : GetViewData().GetCurY(),
152 0 : GetViewData().GetTabNo() ) );
153 : }
154 : else
155 : {
156 0 : pResult = VclPtr<ScNameDlg>::Create( pB, pCW, pParent, &GetViewData(),
157 0 : ScAddress( GetViewData().GetCurX(),
158 0 : GetViewData().GetCurY(),
159 0 : GetViewData().GetTabNo() ), &maRangeMap);
160 0 : static_cast<ScNameDlg*>(pResult.get())->SetEntry( maName, maScope);
161 0 : mbInSwitch = false;
162 : }
163 : }
164 0 : break;
165 :
166 : case FID_ADD_NAME:
167 : {
168 0 : if (!mbInSwitch)
169 : {
170 0 : std::map<OUString, ScRangeName*> aRangeMap;
171 0 : pDoc->GetRangeNameMap(aRangeMap);
172 0 : pResult = VclPtr<ScNameDefDlg>::Create( pB, pCW, pParent, &GetViewData(), aRangeMap,
173 0 : ScAddress( GetViewData().GetCurX(),
174 0 : GetViewData().GetCurY(),
175 0 : GetViewData().GetTabNo() ), true );
176 : }
177 : else
178 : {
179 0 : std::map<OUString, ScRangeName*> aRangeMap;
180 0 : for (boost::ptr_map<OUString, ScRangeName>::iterator itr = maRangeMap.begin();
181 0 : itr != maRangeMap.end(); ++itr)
182 : {
183 0 : aRangeMap.insert(std::pair<OUString, ScRangeName*>(itr->first, itr->second));
184 : }
185 0 : pResult = VclPtr<ScNameDefDlg>::Create( pB, pCW, pParent, &GetViewData(), aRangeMap,
186 0 : ScAddress( GetViewData().GetCurX(),
187 0 : GetViewData().GetCurY(),
188 0 : GetViewData().GetTabNo() ), false );
189 : }
190 : }
191 0 : break;
192 :
193 : case SID_DEFINE_COLROWNAMERANGES:
194 : {
195 0 : pResult = VclPtr<ScColRowNameRangesDlg>::Create( pB, pCW, pParent, &GetViewData() );
196 : }
197 0 : break;
198 :
199 : case SID_OPENDLG_CONSOLIDATE:
200 : {
201 0 : SfxItemSet aArgSet( GetPool(),
202 : SCITEM_CONSOLIDATEDATA,
203 0 : SCITEM_CONSOLIDATEDATA );
204 :
205 : const ScConsolidateParam* pDlgData =
206 0 : pDoc->GetConsolidateDlgData();
207 :
208 0 : if ( !pDlgData )
209 : {
210 0 : ScConsolidateParam aConsParam;
211 : SCCOL nStartCol, nEndCol;
212 : SCROW nStartRow, nEndRow;
213 : SCTAB nStartTab, nEndTab;
214 :
215 0 : GetViewData().GetSimpleArea( nStartCol, nStartRow, nStartTab,
216 0 : nEndCol, nEndRow, nEndTab );
217 :
218 0 : PutInOrder( nStartCol, nEndCol );
219 0 : PutInOrder( nStartRow, nEndRow );
220 0 : PutInOrder( nStartTab, nEndTab );
221 :
222 0 : aConsParam.nCol = nStartCol;
223 0 : aConsParam.nRow = nStartRow;
224 0 : aConsParam.nTab = nStartTab;
225 :
226 : aArgSet.Put( ScConsolidateItem( SCITEM_CONSOLIDATEDATA,
227 0 : &aConsParam ) );
228 : }
229 : else
230 : {
231 0 : aArgSet.Put( ScConsolidateItem( SCITEM_CONSOLIDATEDATA, pDlgData ) );
232 : }
233 0 : pResult = VclPtr<ScConsolidateDlg>::Create( pB, pCW, pParent, aArgSet );
234 : }
235 0 : break;
236 :
237 : case SID_DEFINE_DBNAME:
238 : {
239 : // wenn auf einem bestehenden Bereich aufgerufen, den markieren
240 0 : GetDBData( true, SC_DB_OLD );
241 0 : const ScMarkData& rMark = GetViewData().GetMarkData();
242 0 : if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
243 0 : MarkDataArea( false );
244 :
245 0 : pResult = VclPtr<ScDbNameDlg>::Create( pB, pCW, pParent, &GetViewData() );
246 : }
247 0 : break;
248 :
249 : case SID_SPECIAL_FILTER:
250 : {
251 0 : ScQueryParam aQueryParam;
252 0 : SfxItemSet aArgSet( GetPool(),
253 : SCITEM_QUERYDATA,
254 0 : SCITEM_QUERYDATA );
255 :
256 0 : ScDBData* pDBData = GetDBData(false, SC_DB_MAKE, SC_DBSEL_ROW_DOWN);
257 0 : pDBData->ExtendDataArea(pDoc);
258 0 : pDBData->GetQueryParam( aQueryParam );
259 :
260 0 : ScRange aArea;
261 0 : pDBData->GetArea(aArea);
262 0 : MarkRange(aArea, false);
263 :
264 0 : ScQueryItem aItem( SCITEM_QUERYDATA, &GetViewData(), &aQueryParam );
265 0 : ScRange aAdvSource;
266 0 : if (pDBData->GetAdvancedQuerySource(aAdvSource))
267 0 : aItem.SetAdvancedQuerySource( &aAdvSource );
268 :
269 0 : aArgSet.Put( aItem );
270 :
271 : // aktuelle Tabelle merken (wg. RefInput im Dialog)
272 0 : GetViewData().SetRefTabNo( GetViewData().GetTabNo() );
273 :
274 0 : pResult = VclPtr<ScSpecialFilterDlg>::Create( pB, pCW, pParent, aArgSet );
275 : }
276 0 : break;
277 :
278 : case SID_FILTER:
279 : {
280 :
281 0 : ScQueryParam aQueryParam;
282 0 : SfxItemSet aArgSet( GetPool(),
283 : SCITEM_QUERYDATA,
284 0 : SCITEM_QUERYDATA );
285 :
286 0 : ScDBData* pDBData = GetDBData(false, SC_DB_MAKE, SC_DBSEL_ROW_DOWN);
287 0 : pDBData->ExtendDataArea(pDoc);
288 0 : pDBData->GetQueryParam( aQueryParam );
289 :
290 0 : ScRange aArea;
291 0 : pDBData->GetArea(aArea);
292 0 : MarkRange(aArea, false);
293 :
294 : aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA,
295 0 : &GetViewData(),
296 0 : &aQueryParam ) );
297 :
298 : // aktuelle Tabelle merken (wg. RefInput im Dialog)
299 0 : GetViewData().SetRefTabNo( GetViewData().GetTabNo() );
300 :
301 0 : pResult = VclPtr<ScFilterDlg>::Create( pB, pCW, pParent, aArgSet );
302 : }
303 0 : break;
304 :
305 : case SID_OPENDLG_TABOP:
306 : {
307 0 : ScViewData& rViewData = GetViewData();
308 0 : ScRefAddress aCurPos ( rViewData.GetCurX(),
309 : rViewData.GetCurY(),
310 0 : rViewData.GetTabNo(),
311 0 : false, false, false );
312 :
313 0 : pResult = VclPtr<ScTabOpDlg>::Create( pB, pCW, pParent, rViewData.GetDocument(), aCurPos );
314 : }
315 0 : break;
316 :
317 : case SID_OPENDLG_SOLVE:
318 : {
319 0 : ScViewData& rViewData = GetViewData();
320 0 : ScAddress aCurPos( rViewData.GetCurX(),
321 : rViewData.GetCurY(),
322 0 : rViewData.GetTabNo());
323 0 : pResult = VclPtr<ScSolverDlg>::Create( pB, pCW, pParent, rViewData.GetDocument(), aCurPos );
324 : }
325 0 : break;
326 :
327 : case SID_RANDOM_NUMBER_GENERATOR_DIALOG:
328 : {
329 0 : pResult = VclPtr<ScRandomNumberGeneratorDialog>::Create( pB, pCW, pParent, &GetViewData() );
330 : }
331 0 : break;
332 :
333 : case SID_SAMPLING_DIALOG:
334 : {
335 0 : pResult = VclPtr<ScSamplingDialog>::Create( pB, pCW, pParent, &GetViewData() );
336 : }
337 0 : break;
338 :
339 : case SID_DESCRIPTIVE_STATISTICS_DIALOG:
340 : {
341 0 : pResult = VclPtr<ScDescriptiveStatisticsDialog>::Create( pB, pCW, pParent, &GetViewData() );
342 : }
343 0 : break;
344 :
345 : case SID_ANALYSIS_OF_VARIANCE_DIALOG:
346 : {
347 0 : pResult = VclPtr<ScAnalysisOfVarianceDialog>::Create( pB, pCW, pParent, &GetViewData() );
348 : }
349 0 : break;
350 :
351 : case SID_CORRELATION_DIALOG:
352 : {
353 0 : pResult = VclPtr<ScCorrelationDialog>::Create( pB, pCW, pParent, &GetViewData() );
354 : }
355 0 : break;
356 :
357 : case SID_COVARIANCE_DIALOG:
358 : {
359 0 : pResult = VclPtr<ScCovarianceDialog>::Create( pB, pCW, pParent, &GetViewData() );
360 : }
361 0 : break;
362 :
363 : case SID_EXPONENTIAL_SMOOTHING_DIALOG:
364 : {
365 0 : pResult = VclPtr<ScExponentialSmoothingDialog>::Create( pB, pCW, pParent, &GetViewData() );
366 : }
367 0 : break;
368 :
369 : case SID_MOVING_AVERAGE_DIALOG:
370 : {
371 0 : pResult = VclPtr<ScMovingAverageDialog>::Create( pB, pCW, pParent, &GetViewData() );
372 : }
373 0 : break;
374 :
375 : case SID_TTEST_DIALOG:
376 : {
377 0 : pResult = VclPtr<ScTTestDialog>::Create( pB, pCW, pParent, &GetViewData() );
378 : }
379 0 : break;
380 :
381 : case SID_FTEST_DIALOG:
382 : {
383 0 : pResult = VclPtr<ScFTestDialog>::Create( pB, pCW, pParent, &GetViewData() );
384 : }
385 0 : break;
386 :
387 : case SID_ZTEST_DIALOG:
388 : {
389 0 : pResult = VclPtr<ScZTestDialog>::Create( pB, pCW, pParent, &GetViewData() );
390 : }
391 0 : break;
392 :
393 : case SID_CHI_SQUARE_TEST_DIALOG:
394 : {
395 0 : pResult = VclPtr<ScChiSquareTestDialog>::Create( pB, pCW, pParent, &GetViewData() );
396 : }
397 0 : break;
398 :
399 : case SID_OPENDLG_OPTSOLVER:
400 : {
401 0 : ScViewData& rViewData = GetViewData();
402 0 : ScAddress aCurPos( rViewData.GetCurX(), rViewData.GetCurY(), rViewData.GetTabNo());
403 0 : pResult = VclPtr<ScOptSolverDlg>::Create( pB, pCW, pParent, rViewData.GetDocShell(), aCurPos );
404 : }
405 0 : break;
406 :
407 : case SID_OPENDLG_PIVOTTABLE:
408 : {
409 : // all settings must be in pDialogDPObject
410 :
411 0 : if( pDialogDPObject )
412 : {
413 : // Check for an existing datapilot output.
414 0 : ScViewData& rViewData = GetViewData();
415 0 : rViewData.SetRefTabNo( rViewData.GetTabNo() );
416 0 : ScDPObject* pObj = pDoc->GetDPAtCursor(rViewData.GetCurX(), rViewData.GetCurY(), rViewData.GetTabNo());
417 0 : pResult = VclPtr<ScPivotLayoutDialog>::Create(pB, pCW, pParent, &rViewData, pDialogDPObject, pObj == nullptr);
418 : }
419 : }
420 0 : break;
421 :
422 : case SID_OPENDLG_EDIT_PRINTAREA:
423 : {
424 0 : pResult = VclPtr<ScPrintAreasDlg>::Create( pB, pCW, pParent );
425 : }
426 0 : break;
427 :
428 : case SID_OPENDLG_FUNCTION:
429 : {
430 : // Dialog schaut selber, was in der Zelle steht
431 :
432 0 : pResult = VclPtr<ScFormulaDlg>::Create( pB, pCW, pParent, &GetViewData(),ScGlobal::GetStarCalcFunctionMgr() );
433 : }
434 0 : break;
435 :
436 : case SID_MANAGE_XML_SOURCE:
437 : {
438 : #if ENABLE_ORCUS
439 0 : pResult = VclPtr<ScXMLSourceDlg>::Create(pB, pCW, pParent, pDoc);
440 : #endif
441 : }
442 0 : break;
443 :
444 : case FID_CHG_SHOW:
445 : {
446 : // Dialog schaut selber, was in der Zelle steht
447 :
448 0 : pResult = VclPtr<ScHighlightChgDlg>::Create( pB, pCW, pParent, &GetViewData() );
449 : }
450 0 : break;
451 :
452 : case WID_SIMPLE_REF:
453 : {
454 : // Dialog schaut selber, was in der Zelle steht
455 :
456 0 : ScViewData& rViewData = GetViewData();
457 0 : rViewData.SetRefTabNo( rViewData.GetTabNo() );
458 0 : pResult = VclPtr<ScSimpleRefDlg>::Create( pB, pCW, pParent );
459 : }
460 0 : break;
461 :
462 : case WID_CONDFRMT_REF:
463 : {
464 0 : sal_uInt32 nIndex = sal_uInt32(-1);
465 0 : sal_uInt8 nType = 0;
466 0 : bool bManaged = false;
467 0 : bool bFound = false;
468 :
469 0 : ScRangeList aRangeList;
470 : ScConditionalFormat* pCondFormat;
471 : condformat::dialog::ScCondFormatDialogType aDialogType;
472 :
473 : // Get the pool item stored it by Conditional Format Manager Dialog.
474 0 : const SfxPoolItem* pItem = NULL;
475 0 : sal_uInt32 nItems(GetPool().GetItemCount2( SCITEM_STRING ));
476 0 : for( sal_uInt32 nIter = 0; nIter < nItems; ++nIter )
477 : {
478 0 : if( NULL != (pItem = GetPool().GetItem2( SCITEM_STRING, nIter ) ) )
479 : {
480 0 : if ( ScCondFormatDlg::ParseXmlString(
481 0 : static_cast<const SfxStringItem*>(pItem)->GetValue(),
482 : nIndex, nType, bManaged))
483 : {
484 0 : bFound = true;
485 0 : break;
486 : }
487 : }
488 : }
489 :
490 0 : ScViewData& rViewData = GetViewData();
491 0 : rViewData.SetRefTabNo( rViewData.GetTabNo() );
492 :
493 0 : aDialogType = static_cast< condformat::dialog::ScCondFormatDialogType > ( nType );
494 0 : pCondFormat = pDoc->GetCondFormList(rViewData.GetTabNo())->GetFormat ( nIndex );
495 :
496 0 : if ( pCondFormat )
497 0 : aRangeList = pCondFormat->GetRange();
498 : else
499 : {
500 0 : rViewData.GetMarkData().FillRangeListWithMarks(&aRangeList, false);
501 0 : ScAddress aPos(rViewData.GetCurX(), rViewData.GetCurY(), rViewData.GetTabNo());
502 0 : if(aRangeList.empty())
503 : {
504 0 : ScRange* pRange = new ScRange(aPos);
505 0 : aRangeList.push_back(pRange);
506 : }
507 : }
508 :
509 0 : pResult = VclPtr<ScCondFormatDlg>::Create( pB, pCW, pParent, &rViewData, pCondFormat, aRangeList,
510 0 : aRangeList.GetTopLeftCorner(), aDialogType, bManaged );
511 :
512 : // Remove the pool item stored it by Conditional Format Manager Dialog.
513 0 : if ( bFound && pItem )
514 0 : GetPool().Remove( *pItem );
515 : }
516 0 : break;
517 : }
518 :
519 0 : if (pResult)
520 : {
521 : // Die Dialoge gehen immer mit eingeklapptem Zusaetze-Button auf,
522 : // darum muss die Groesse ueber das Initialize gerettet werden
523 : // (oder den Zusaetze-Status mit speichern !!!)
524 :
525 0 : Size aSize = pResult->GetSizePixel();
526 0 : pResult->Initialize( pInfo );
527 0 : pResult->SetSizePixel(aSize);
528 : }
529 :
530 0 : return pResult;
531 156 : }
532 :
533 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|