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 :
12 : #include "PivotLayoutTreeList.hxx"
13 : #include "PivotLayoutDialog.hxx"
14 : #include <reffact.hxx>
15 : #include <svtools/treelistentry.hxx>
16 :
17 : #include "rangeutl.hxx"
18 : #include "uiitems.hxx"
19 : #include "dputil.hxx"
20 :
21 : #include <vector>
22 :
23 : #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
24 : #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
25 :
26 : using namespace css::uno;
27 : using namespace css::sheet;
28 :
29 0 : ScItemValue::ScItemValue(OUString const & aName, SCCOL nColumn, sal_uInt16 nFunctionMask) :
30 : maName(aName),
31 : maFunctionData(nColumn, nFunctionMask),
32 0 : mpOriginalItemValue(this)
33 0 : {}
34 :
35 0 : ScItemValue::ScItemValue(ScItemValue* pInputItemValue) :
36 : maName(pInputItemValue->maName),
37 : maFunctionData(pInputItemValue->maFunctionData),
38 0 : mpOriginalItemValue(this)
39 0 : {}
40 :
41 0 : ScItemValue::~ScItemValue()
42 0 : {}
43 :
44 : namespace
45 : {
46 :
47 0 : ScRange lclGetRangeForNamedRange(OUString const & aName, ScDocument* pDocument)
48 : {
49 0 : ScRange aInvalidRange(ScAddress::INITIALIZE_INVALID);
50 0 : ScRangeName* pRangeName = pDocument->GetRangeName();
51 0 : if (pRangeName == NULL)
52 0 : return aInvalidRange;
53 :
54 0 : const ScRangeData* pData = pRangeName->findByUpperName(aName.toAsciiUpperCase());
55 0 : if (pData == NULL)
56 0 : return aInvalidRange;
57 :
58 0 : ScRange aRange;
59 0 : if (pData->IsReference(aRange))
60 0 : return aRange;
61 :
62 0 : return aInvalidRange;
63 : }
64 :
65 : }
66 :
67 0 : ScPivotLayoutDialog::ScPivotLayoutDialog(
68 : SfxBindings* pSfxBindings, SfxChildWindow* pChildWindow, vcl::Window* pParent,
69 : ScViewData* pViewData, const ScDPObject* pPivotTableObject, bool bNewPivotTable) :
70 : ScAnyRefDlg (pSfxBindings, pChildWindow, pParent, "PivotTableLayout", "modules/scalc/ui/pivottablelayoutdialog.ui"),
71 : maPivotTableObject (*pPivotTableObject),
72 : mpPreviouslyFocusedListBox(NULL),
73 : mpCurrentlyFocusedListBox(NULL),
74 : mpViewData (pViewData),
75 0 : mpDocument (pViewData->GetDocument()),
76 : mbNewPivotTable (bNewPivotTable),
77 : mpActiveEdit (NULL),
78 : maAddressDetails (mpDocument->GetAddressConvention(), 0, 0),
79 0 : mbDialogLostFocus (false)
80 : {
81 0 : Link<> aLink;
82 :
83 0 : get(mpListBoxField, "listbox-fields");
84 0 : get(mpListBoxPage, "listbox-page");
85 0 : get(mpListBoxColumn, "listbox-column");
86 0 : get(mpListBoxRow, "listbox-row");
87 0 : get(mpListBoxData, "listbox-data");
88 :
89 0 : get(mpCheckIgnoreEmptyRows, "check-ignore-empty-rows");
90 0 : get(mpCheckTotalColumns, "check-total-columns");
91 0 : get(mpCheckAddFilter, "check-add-filter");
92 0 : get(mpCheckIdentifyCategories, "check-identify-categories");
93 0 : get(mpCheckTotalRows, "check-total-rows");
94 0 : get(mpCheckDrillToDetail, "check-drill-to-details");
95 :
96 0 : get(mpBtnOK, "ok");
97 0 : get(mpBtnCancel, "cancel");
98 :
99 0 : get(mpSourceRadioNamedRange, "source-radio-named-range");
100 0 : get(mpSourceRadioSelection, "source-radio-selection");
101 0 : get(mpSourceListBox, "source-list");
102 0 : get(mpSourceEdit, "source-edit");
103 0 : get(mpSourceButton, "source-button");
104 :
105 0 : get(mpDestinationRadioNewSheet, "destination-radio-new-sheet");
106 0 : get(mpDestinationRadioNamedRange, "destination-radio-named-range");
107 0 : get(mpDestinationRadioSelection, "destination-radio-selection");
108 0 : get(mpDestinationListBox, "destination-list");
109 0 : get(mpDestinationEdit, "destination-edit");
110 0 : get(mpDestinationButton, "destination-button");
111 :
112 : // Source UI
113 0 : aLink = LINK(this, ScPivotLayoutDialog, ToggleSource);
114 0 : mpSourceRadioNamedRange->SetToggleHdl(aLink);
115 0 : mpSourceRadioSelection->SetToggleHdl(aLink);
116 :
117 0 : mpSourceEdit->SetReferences(this, mpSourceRadioSelection);
118 0 : mpSourceButton->SetReferences(this, mpSourceEdit);
119 :
120 0 : aLink = LINK(this, ScPivotLayoutDialog, GetFocusHandler);
121 0 : mpSourceEdit->SetGetFocusHdl(aLink);
122 0 : mpSourceButton->SetGetFocusHdl(aLink);
123 :
124 0 : aLink = LINK(this, ScPivotLayoutDialog, LoseFocusHandler);
125 0 : mpSourceEdit->SetLoseFocusHdl(aLink);
126 0 : mpSourceButton->SetLoseFocusHdl(aLink);
127 :
128 0 : mpSourceEdit->SetModifyHdl(LINK(this, ScPivotLayoutDialog, SourceEditModified));
129 0 : mpSourceListBox->SetSelectHdl(LINK(this, ScPivotLayoutDialog, SourceEditModified));
130 :
131 : // Destination UI
132 0 : aLink = LINK(this, ScPivotLayoutDialog, ToggleDestination);
133 0 : mpDestinationRadioNewSheet->SetToggleHdl(aLink);
134 0 : mpDestinationRadioNamedRange->SetToggleHdl(aLink);
135 0 : mpDestinationRadioSelection->SetToggleHdl(aLink);
136 :
137 0 : mpDestinationEdit->SetReferences(this, mpDestinationRadioNewSheet);
138 0 : mpDestinationButton->SetReferences(this, mpDestinationEdit);
139 :
140 0 : aLink = LINK(this, ScPivotLayoutDialog, GetFocusHandler);
141 0 : mpDestinationEdit->SetGetFocusHdl(aLink);
142 0 : mpDestinationButton->SetGetFocusHdl(aLink);
143 :
144 0 : aLink = LINK(this, ScPivotLayoutDialog, LoseFocusHandler);
145 0 : mpDestinationEdit->SetLoseFocusHdl(aLink);
146 0 : mpDestinationButton->SetLoseFocusHdl(aLink);
147 :
148 : // Buttons
149 0 : mpBtnCancel->SetClickHdl(LINK(this, ScPivotLayoutDialog, CancelClicked));
150 0 : mpBtnOK->SetClickHdl(LINK(this, ScPivotLayoutDialog, OKClicked));
151 :
152 : // Initialize Data
153 0 : maPivotTableObject.FillOldParam(maPivotParameters);
154 0 : maPivotTableObject.FillLabelData(maPivotParameters);
155 :
156 0 : mpListBoxField->Setup (this);
157 0 : mpListBoxPage->Setup (this, ScPivotLayoutTreeList::PAGE_LIST);
158 0 : mpListBoxColumn->Setup(this, ScPivotLayoutTreeList::COLUMN_LIST);
159 0 : mpListBoxRow->Setup (this, ScPivotLayoutTreeList::ROW_LIST);
160 0 : mpListBoxData->Setup (this);
161 :
162 0 : FillValuesToListBoxes();
163 :
164 : // Initialize Options
165 0 : const ScDPSaveData* pSaveData = maPivotTableObject.GetSaveData();
166 0 : if (pSaveData == NULL)
167 : {
168 0 : mpCheckAddFilter->Check(false);
169 0 : mpCheckDrillToDetail->Check(false);
170 : }
171 : else
172 : {
173 0 : mpCheckAddFilter->Check(pSaveData->GetFilterButton());
174 0 : mpCheckDrillToDetail->Check(pSaveData->GetDrillDown());
175 : }
176 :
177 0 : mpCheckIgnoreEmptyRows->Check(maPivotParameters.bIgnoreEmptyRows);
178 0 : mpCheckIdentifyCategories->Check(maPivotParameters.bDetectCategories);
179 0 : mpCheckTotalColumns->Check(maPivotParameters.bMakeTotalCol);
180 0 : mpCheckTotalRows->Check(maPivotParameters.bMakeTotalRow);
181 :
182 0 : SetupSource();
183 0 : SetupDestination();
184 0 : }
185 :
186 0 : ScPivotLayoutDialog::~ScPivotLayoutDialog()
187 : {
188 0 : disposeOnce();
189 0 : }
190 :
191 0 : void ScPivotLayoutDialog::dispose()
192 : {
193 0 : mpPreviouslyFocusedListBox.clear();
194 0 : mpCurrentlyFocusedListBox.clear();
195 0 : mpListBoxField.clear();
196 0 : mpListBoxPage.clear();
197 0 : mpListBoxColumn.clear();
198 0 : mpListBoxRow.clear();
199 0 : mpListBoxData.clear();
200 0 : mpCheckIgnoreEmptyRows.clear();
201 0 : mpCheckTotalColumns.clear();
202 0 : mpCheckAddFilter.clear();
203 0 : mpCheckIdentifyCategories.clear();
204 0 : mpCheckTotalRows.clear();
205 0 : mpCheckDrillToDetail.clear();
206 0 : mpSourceRadioNamedRange.clear();
207 0 : mpSourceRadioSelection.clear();
208 0 : mpSourceListBox.clear();
209 0 : mpSourceEdit.clear();
210 0 : mpSourceButton.clear();
211 0 : mpDestinationRadioNewSheet.clear();
212 0 : mpDestinationRadioNamedRange.clear();
213 0 : mpDestinationRadioSelection.clear();
214 0 : mpDestinationListBox.clear();
215 0 : mpDestinationEdit.clear();
216 0 : mpDestinationButton.clear();
217 0 : mpBtnOK.clear();
218 0 : mpBtnCancel.clear();
219 0 : mpActiveEdit.clear();
220 0 : ScAnyRefDlg::dispose();
221 0 : }
222 :
223 0 : void ScPivotLayoutDialog::SetupSource()
224 : {
225 0 : mpSourceListBox->Clear();
226 :
227 0 : ScRange aSourceRange;
228 0 : OUString sSourceNamedRangeName;
229 :
230 0 : if (maPivotTableObject.GetSheetDesc())
231 : {
232 0 : const ScSheetSourceDesc* pSheetSourceDesc = maPivotTableObject.GetSheetDesc();
233 0 : aSourceRange = pSheetSourceDesc->GetSourceRange();
234 :
235 0 : if(!aSourceRange.IsValid())
236 : {
237 : // Source is probably a DB Range
238 0 : mpSourceRadioNamedRange->Disable();
239 0 : mpSourceRadioSelection->Disable();
240 0 : ToggleSource(NULL);
241 0 : return;
242 : }
243 : else
244 : {
245 0 : OUString aSourceRangeName = aSourceRange.Format(SCR_ABS_3D, mpDocument, maAddressDetails);
246 0 : mpSourceEdit->SetText(aSourceRangeName);
247 : }
248 : }
249 : else
250 : {
251 0 : mpSourceRadioNamedRange->Disable();
252 0 : mpSourceRadioSelection->Disable();
253 0 : ToggleSource(NULL);
254 0 : return;
255 : }
256 :
257 : // Setup Named Ranges
258 0 : bool bIsNamedRange = false;
259 :
260 0 : ScAreaNameIterator aIterator(mpDocument);
261 0 : OUString aEachName;
262 0 : ScRange aEachRange;
263 :
264 0 : while (aIterator.Next(aEachName, aEachRange))
265 : {
266 0 : if (!aIterator.WasDBName())
267 : {
268 0 : mpSourceListBox->InsertEntry(aEachName);
269 0 : if (aEachRange == aSourceRange)
270 : {
271 0 : sSourceNamedRangeName = aEachName;
272 0 : bIsNamedRange = true;
273 : }
274 : }
275 : }
276 :
277 0 : if (bIsNamedRange)
278 : {
279 0 : mpSourceListBox->SelectEntry(sSourceNamedRangeName, true);
280 0 : mpSourceRadioNamedRange->Check(true);
281 : }
282 : else
283 : {
284 0 : mpSourceListBox->SelectEntryPos(0, true);
285 0 : mpSourceRadioSelection->Check(true);
286 : }
287 :
288 : // If entries - select first entry, otherwise disable the radio button.
289 0 : if (mpSourceListBox->GetEntryCount() <= 0)
290 0 : mpSourceRadioNamedRange->Disable();
291 :
292 0 : ToggleSource(NULL);
293 : }
294 :
295 0 : void ScPivotLayoutDialog::SetupDestination()
296 : {
297 0 : mpDestinationListBox->Clear();
298 :
299 : // Fill up named ranges
300 0 : ScAreaNameIterator aIterator(mpDocument);
301 0 : OUString aName;
302 0 : ScRange aRange;
303 :
304 0 : while (aIterator.Next(aName, aRange))
305 : {
306 0 : if (!aIterator.WasDBName())
307 : {
308 0 : mpDestinationListBox->InsertEntry(aName);
309 : }
310 : }
311 :
312 : // If entries - select first entry, otherwise disable the radio button.
313 0 : if (mpDestinationListBox->GetEntryCount() > 0)
314 0 : mpDestinationListBox->SelectEntryPos(0, true);
315 : else
316 0 : mpDestinationRadioNamedRange->Disable();
317 :
318 : //
319 0 : if (mbNewPivotTable)
320 : {
321 0 : mpDestinationRadioNewSheet->Check(true);
322 : }
323 : else
324 : {
325 0 : if (maPivotParameters.nTab != MAXTAB + 1)
326 : {
327 0 : ScAddress aAddress(maPivotParameters.nCol, maPivotParameters.nRow, maPivotParameters.nTab);
328 0 : OUString aAddressString = aAddress.Format(SCA_VALID | SCA_TAB_3D | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE, mpDocument, maAddressDetails);
329 0 : mpDestinationEdit->SetText(aAddressString);
330 0 : mpDestinationRadioSelection->Check(true);
331 : }
332 : }
333 :
334 0 : ToggleDestination(NULL);
335 0 : }
336 :
337 0 : void ScPivotLayoutDialog::FillValuesToListBoxes()
338 : {
339 0 : mpListBoxField->FillLabelFields(maPivotParameters.maLabelArray);
340 0 : mpListBoxData->FillDataField(maPivotParameters.maDataFields);
341 0 : mpListBoxColumn->FillFields(maPivotParameters.maColFields);
342 0 : mpListBoxRow->FillFields(maPivotParameters.maRowFields);
343 0 : mpListBoxPage->FillFields(maPivotParameters.maPageFields);
344 0 : }
345 :
346 0 : void ScPivotLayoutDialog::SetActive()
347 : {
348 0 : if (mbDialogLostFocus)
349 : {
350 0 : mbDialogLostFocus = false;
351 0 : if(mpActiveEdit != nullptr)
352 : {
353 0 : mpActiveEdit->GrabFocus();
354 0 : if (mpActiveEdit == mpSourceEdit)
355 0 : UpdateSourceRange();
356 : }
357 : }
358 : else
359 : {
360 0 : GrabFocus();
361 : }
362 :
363 0 : RefInputDone();
364 0 : }
365 :
366 0 : void ScPivotLayoutDialog::SetReference(const ScRange& rReferenceRange, ScDocument* pDocument)
367 : {
368 0 : if (!mbDialogLostFocus)
369 0 : return;
370 :
371 0 : if (mpActiveEdit == nullptr)
372 0 : return;
373 :
374 0 : if (rReferenceRange.aStart != rReferenceRange.aEnd)
375 0 : RefInputStart(mpActiveEdit);
376 :
377 0 : OUString aReferenceString = rReferenceRange.Format(SCR_ABS_3D, pDocument, maAddressDetails);
378 :
379 0 : if (mpActiveEdit == mpSourceEdit)
380 : {
381 0 : mpSourceEdit->SetRefString(aReferenceString);
382 : }
383 0 : else if (mpActiveEdit == mpDestinationEdit)
384 : {
385 0 : mpDestinationEdit->SetRefString(aReferenceString);
386 0 : }
387 : }
388 :
389 0 : bool ScPivotLayoutDialog::IsRefInputMode() const
390 : {
391 0 : return mbDialogLostFocus;
392 : }
393 :
394 0 : void ScPivotLayoutDialog::ItemInserted(ScItemValue* pItemValue, ScPivotLayoutTreeList::SvPivotTreeListType eType)
395 : {
396 0 : if (pItemValue == NULL)
397 0 : return;
398 :
399 0 : switch (eType)
400 : {
401 : case ScPivotLayoutTreeList::ROW_LIST:
402 : case ScPivotLayoutTreeList::COLUMN_LIST:
403 : case ScPivotLayoutTreeList::PAGE_LIST:
404 : {
405 0 : mpListBoxRow->RemoveEntryForItem(pItemValue);
406 0 : mpListBoxColumn->RemoveEntryForItem(pItemValue);
407 0 : mpListBoxPage->RemoveEntryForItem(pItemValue);
408 : }
409 : case ScPivotLayoutTreeList::LABEL_LIST:
410 : {
411 0 : mpListBoxRow->RemoveEntryForItem(pItemValue);
412 0 : mpListBoxColumn->RemoveEntryForItem(pItemValue);
413 0 : mpListBoxPage->RemoveEntryForItem(pItemValue);
414 0 : mpListBoxData->RemoveEntryForItem(pItemValue);
415 : }
416 0 : break;
417 : default:
418 0 : break;
419 : }
420 : }
421 :
422 0 : void ScPivotLayoutDialog::UpdateSourceRange()
423 : {
424 0 : if (!maPivotTableObject.GetSheetDesc())
425 0 : return;
426 :
427 0 : ScSheetSourceDesc aSourceSheet = *maPivotTableObject.GetSheetDesc();
428 :
429 0 : if (mpSourceRadioNamedRange->IsChecked())
430 : {
431 0 : OUString aEntryString = mpSourceListBox->GetSelectEntry();
432 0 : ScRange aSourceRange = lclGetRangeForNamedRange(aEntryString, mpDocument);
433 0 : if (!aSourceRange.IsValid() || aSourceSheet.GetSourceRange() == aSourceRange)
434 0 : return;
435 0 : aSourceSheet.SetRangeName(aEntryString);
436 : }
437 0 : else if (mpSourceRadioSelection->IsChecked())
438 : {
439 0 : OUString aSourceString = mpSourceEdit->GetText();
440 0 : ScRange aSourceRange;
441 0 : sal_uInt16 nResult = aSourceRange.Parse(aSourceString, mpDocument, maAddressDetails);
442 :
443 0 : bool bIsValid = (nResult & SCA_VALID) == SCA_VALID; // aSourceString is valid
444 :
445 0 : mpSourceEdit->SetRefValid(true);
446 :
447 0 : if (bIsValid)
448 : {
449 0 : ScRefAddress aStart;
450 0 : ScRefAddress aEnd;
451 :
452 0 : ConvertDoubleRef(mpDocument, aSourceString, 1, aStart, aEnd, maAddressDetails);
453 0 : aSourceRange.aStart = aStart.GetAddress();
454 0 : aSourceRange.aEnd = aEnd.GetAddress();
455 : }
456 : else
457 : {
458 0 : aSourceRange = lclGetRangeForNamedRange(aSourceString, mpDocument);
459 : }
460 :
461 0 : if (!aSourceRange.IsValid())
462 : {
463 0 : mpSourceEdit->SetRefValid(false);
464 0 : return;
465 : }
466 :
467 0 : if (aSourceSheet.GetSourceRange() == aSourceRange)
468 0 : return;
469 :
470 0 : aSourceSheet.SetSourceRange(aSourceRange);
471 0 : if (aSourceSheet.CheckSourceRange() != 0)
472 : {
473 0 : mpSourceEdit->SetRefValid(false);
474 0 : return;
475 0 : }
476 : }
477 : else
478 : {
479 0 : return;
480 : }
481 :
482 0 : maPivotTableObject.SetSheetDesc(aSourceSheet);
483 0 : maPivotTableObject.FillOldParam(maPivotParameters);
484 0 : maPivotTableObject.FillLabelData(maPivotParameters);
485 :
486 0 : FillValuesToListBoxes();
487 : }
488 :
489 0 : bool ScPivotLayoutDialog::ApplyChanges()
490 : {
491 0 : ScDPSaveData aSaveData;
492 0 : ApplySaveData(aSaveData);
493 0 : ApplyLabelData(aSaveData);
494 :
495 0 : ScRange aDestinationRange;
496 0 : bool bToNewSheet = false;
497 :
498 0 : if (!GetDestination(aDestinationRange, bToNewSheet))
499 0 : return false;
500 :
501 0 : SetDispatcherLock(false);
502 0 : SwitchToDocument();
503 :
504 0 : sal_uInt16 nWhichPivot = SC_MOD()->GetPool().GetWhich(SID_PIVOT_TABLE);
505 0 : ScPivotItem aPivotItem(nWhichPivot, &aSaveData, &aDestinationRange, bToNewSheet);
506 0 : mpViewData->GetViewShell()->SetDialogDPObject(&maPivotTableObject);
507 :
508 0 : SfxDispatcher* pDispatcher = GetBindings().GetDispatcher();
509 0 : SfxCallMode nCallMode = SfxCallMode::SLOT | SfxCallMode::RECORD;
510 0 : const SfxPoolItem* pResult = pDispatcher->Execute(SID_PIVOT_TABLE, nCallMode, &aPivotItem, NULL, 0);
511 :
512 0 : if (pResult != NULL)
513 : {
514 0 : const SfxBoolItem* pItem = reinterpret_cast<const SfxBoolItem*>(pResult);
515 0 : if (pItem)
516 : {
517 0 : return pItem->GetValue();
518 : }
519 : }
520 :
521 0 : SetDispatcherLock(true);
522 0 : return true;
523 : }
524 :
525 0 : void ScPivotLayoutDialog::ApplySaveData(ScDPSaveData& rSaveData)
526 : {
527 0 : rSaveData.SetIgnoreEmptyRows(mpCheckIgnoreEmptyRows->IsChecked());
528 0 : rSaveData.SetRepeatIfEmpty(mpCheckIdentifyCategories->IsChecked());
529 0 : rSaveData.SetColumnGrand(mpCheckTotalColumns->IsChecked());
530 0 : rSaveData.SetRowGrand(mpCheckTotalRows->IsChecked());
531 0 : rSaveData.SetFilterButton(mpCheckAddFilter->IsChecked());
532 0 : rSaveData.SetDrillDown(mpCheckDrillToDetail->IsChecked());
533 :
534 0 : Reference<XDimensionsSupplier> xSource = maPivotTableObject.GetSource();
535 :
536 0 : ScPivotFieldVector aPageFieldVector;
537 0 : mpListBoxPage->PushEntriesToPivotFieldVector(aPageFieldVector);
538 : ScDPObject::ConvertOrientation(rSaveData, aPageFieldVector, DataPilotFieldOrientation_PAGE,
539 0 : xSource, maPivotParameters.maLabelArray);
540 :
541 0 : ScPivotFieldVector aColFieldVector;
542 0 : mpListBoxColumn->PushEntriesToPivotFieldVector(aColFieldVector);
543 : ScDPObject::ConvertOrientation(rSaveData, aColFieldVector, DataPilotFieldOrientation_COLUMN,
544 0 : xSource, maPivotParameters.maLabelArray);
545 :
546 0 : ScPivotFieldVector aRowFieldVector;
547 0 : mpListBoxRow->PushEntriesToPivotFieldVector(aRowFieldVector);
548 : ScDPObject::ConvertOrientation(rSaveData, aRowFieldVector, DataPilotFieldOrientation_ROW,
549 0 : xSource, maPivotParameters.maLabelArray);
550 :
551 0 : ScPivotFieldVector aDataFieldVector;
552 0 : mpListBoxData->PushEntriesToPivotFieldVector(aDataFieldVector);
553 : ScDPObject::ConvertOrientation(rSaveData, aDataFieldVector, DataPilotFieldOrientation_DATA,
554 : xSource, maPivotParameters.maLabelArray,
555 0 : &aColFieldVector, &aRowFieldVector, &aPageFieldVector);
556 0 : }
557 :
558 0 : void ScPivotLayoutDialog::ApplyLabelData(ScDPSaveData& rSaveData)
559 : {
560 0 : ScDPLabelDataVector::const_iterator it;
561 0 : ScDPLabelDataVector& rLabelDataVector = GetLabelDataVector();
562 :
563 0 : for (it = rLabelDataVector.begin(); it != rLabelDataVector.end(); ++it)
564 : {
565 0 : const ScDPLabelData& pLabelData = *it;
566 :
567 0 : OUString aUnoName = ScDPUtil::createDuplicateDimensionName(pLabelData.maName, pLabelData.mnDupCount);
568 0 : ScDPSaveDimension* pSaveDimensions = rSaveData.GetExistingDimensionByName(aUnoName);
569 :
570 0 : if (pSaveDimensions == NULL)
571 0 : continue;
572 :
573 0 : pSaveDimensions->SetUsedHierarchy(pLabelData.mnUsedHier);
574 0 : pSaveDimensions->SetShowEmpty(pLabelData.mbShowAll);
575 0 : pSaveDimensions->SetRepeatItemLabels(pLabelData.mbRepeatItemLabels);
576 0 : pSaveDimensions->SetSortInfo(&pLabelData.maSortInfo);
577 0 : pSaveDimensions->SetLayoutInfo(&pLabelData.maLayoutInfo);
578 0 : pSaveDimensions->SetAutoShowInfo(&pLabelData.maShowInfo);
579 :
580 0 : bool bManualSort = (pLabelData.maSortInfo.Mode == DataPilotFieldSortMode::MANUAL);
581 :
582 0 : std::vector<ScDPLabelData::Member>::const_iterator itMember;
583 0 : for (itMember = pLabelData.maMembers.begin(); itMember != pLabelData.maMembers.end(); ++itMember)
584 : {
585 0 : const ScDPLabelData::Member& rLabelMember = *itMember;
586 0 : ScDPSaveMember* pMember = pSaveDimensions->GetMemberByName(rLabelMember.maName);
587 :
588 0 : if (bManualSort || !rLabelMember.mbVisible || !rLabelMember.mbShowDetails)
589 : {
590 0 : pMember->SetIsVisible(rLabelMember.mbVisible);
591 0 : pMember->SetShowDetails(rLabelMember.mbShowDetails);
592 : }
593 : }
594 0 : }
595 0 : }
596 :
597 0 : bool ScPivotLayoutDialog::GetDestination(ScRange& aDestinationRange, bool& bToNewSheet)
598 : {
599 0 : bToNewSheet = false;
600 :
601 0 : if (mpDestinationRadioNamedRange->IsChecked())
602 : {
603 0 : OUString aName = mpDestinationListBox->GetSelectEntry();
604 0 : aDestinationRange = lclGetRangeForNamedRange(aName, mpDocument);
605 0 : if (!aDestinationRange.IsValid())
606 0 : return false;
607 : }
608 0 : else if (mpDestinationRadioSelection->IsChecked())
609 : {
610 0 : ScAddress aAddress;
611 0 : aAddress.Parse(mpDestinationEdit->GetText(), mpDocument, maAddressDetails);
612 0 : aDestinationRange = ScRange(aAddress);
613 : }
614 : else
615 : {
616 0 : bToNewSheet = true;
617 0 : aDestinationRange = ScRange(maPivotParameters.nCol, maPivotParameters.nRow, maPivotParameters.nTab);
618 : }
619 0 : return true;
620 : }
621 :
622 0 : ScItemValue* ScPivotLayoutDialog::GetItem(SCCOL nColumn)
623 : {
624 0 : return mpListBoxField->GetItem(nColumn);
625 : }
626 :
627 0 : bool ScPivotLayoutDialog::IsDataElement(SCCOL nColumn)
628 : {
629 0 : return mpListBoxField->IsDataElement(nColumn);
630 : }
631 :
632 0 : ScDPLabelData* ScPivotLayoutDialog::GetLabelData(SCCOL nColumn)
633 : {
634 0 : return &maPivotParameters.maLabelArray[nColumn];
635 : }
636 :
637 0 : void ScPivotLayoutDialog::PushDataFieldNames(std::vector<ScDPName>& rDataFieldNames)
638 : {
639 0 : return mpListBoxData->PushDataFieldNames(rDataFieldNames);
640 : }
641 :
642 0 : bool ScPivotLayoutDialog::Close()
643 : {
644 0 : return DoClose( ScPivotLayoutWrapper::GetChildWindowId() );
645 : }
646 :
647 0 : IMPL_LINK( ScPivotLayoutDialog, OKClicked, PushButton*, /*pButton*/ )
648 : {
649 0 : ApplyChanges();
650 0 : Close();
651 0 : return 0;
652 : }
653 :
654 0 : IMPL_LINK( ScPivotLayoutDialog, CancelClicked, PushButton*, /*pButton*/ )
655 : {
656 0 : Close();
657 0 : return 0;
658 : }
659 :
660 0 : IMPL_LINK(ScPivotLayoutDialog, GetFocusHandler, Control*, pCtrl)
661 : {
662 0 : mpActiveEdit = NULL;
663 :
664 0 : if (pCtrl == static_cast<Control*>(mpSourceEdit) ||
665 0 : pCtrl == static_cast<Control*>(mpSourceButton))
666 : {
667 0 : mpActiveEdit = mpSourceEdit;
668 : }
669 0 : else if (pCtrl == static_cast<Control*>(mpDestinationEdit) ||
670 0 : pCtrl == static_cast<Control*>(mpDestinationButton))
671 : {
672 0 : mpActiveEdit = mpDestinationEdit;
673 : }
674 :
675 0 : if (mpActiveEdit)
676 0 : mpActiveEdit->SetSelection(Selection(0, SELECTION_MAX));
677 :
678 0 : return 0;
679 : }
680 :
681 0 : IMPL_LINK_NOARG(ScPivotLayoutDialog, LoseFocusHandler)
682 : {
683 0 : mbDialogLostFocus = !IsActive();
684 0 : return 0;
685 : }
686 :
687 0 : IMPL_LINK_NOARG(ScPivotLayoutDialog, SourceEditModified)
688 : {
689 0 : UpdateSourceRange();
690 0 : return 0;
691 : }
692 :
693 0 : IMPL_LINK_NOARG(ScPivotLayoutDialog, ToggleSource)
694 : {
695 0 : bool bNamedRange = mpSourceRadioNamedRange->IsChecked();
696 0 : bool bSelection = mpSourceRadioSelection->IsChecked();
697 0 : mpSourceListBox->Enable(bNamedRange);
698 0 : mpSourceButton->Enable(bSelection);
699 0 : mpSourceEdit->Enable(bSelection);
700 0 : UpdateSourceRange();
701 0 : return 0;
702 : }
703 :
704 0 : IMPL_LINK_NOARG(ScPivotLayoutDialog, ToggleDestination)
705 : {
706 0 : bool bNamedRange = mpDestinationRadioNamedRange->IsChecked();
707 0 : bool bSelection = mpDestinationRadioSelection->IsChecked();
708 0 : mpDestinationListBox->Enable(bNamedRange);
709 0 : mpDestinationButton->Enable(bSelection);
710 0 : mpDestinationEdit->Enable(bSelection);
711 0 : return 0;
712 156 : }
713 :
714 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|