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 0 : {}
188 :
189 0 : void ScPivotLayoutDialog::SetupSource()
190 : {
191 0 : mpSourceListBox->Clear();
192 :
193 0 : ScRange aSourceRange;
194 0 : OUString sSourceNamedRangeName;
195 :
196 0 : if (maPivotTableObject.GetSheetDesc())
197 : {
198 0 : const ScSheetSourceDesc* pSheetSourceDesc = maPivotTableObject.GetSheetDesc();
199 0 : aSourceRange = pSheetSourceDesc->GetSourceRange();
200 :
201 0 : if(!aSourceRange.IsValid())
202 : {
203 : // Source is probably a DB Range
204 0 : mpSourceRadioNamedRange->Disable();
205 0 : mpSourceRadioSelection->Disable();
206 0 : ToggleSource(NULL);
207 0 : return;
208 : }
209 : else
210 : {
211 0 : OUString aSourceRangeName = aSourceRange.Format(SCR_ABS_3D, mpDocument, maAddressDetails);
212 0 : mpSourceEdit->SetText(aSourceRangeName);
213 : }
214 : }
215 : else
216 : {
217 0 : mpSourceRadioNamedRange->Disable();
218 0 : mpSourceRadioSelection->Disable();
219 0 : ToggleSource(NULL);
220 0 : return;
221 : }
222 :
223 : // Setup Named Ranges
224 0 : bool bIsNamedRange = false;
225 :
226 0 : ScAreaNameIterator aIterator(mpDocument);
227 0 : OUString aEachName;
228 0 : ScRange aEachRange;
229 :
230 0 : while (aIterator.Next(aEachName, aEachRange))
231 : {
232 0 : if (!aIterator.WasDBName())
233 : {
234 0 : mpSourceListBox->InsertEntry(aEachName);
235 0 : if (aEachRange == aSourceRange)
236 : {
237 0 : sSourceNamedRangeName = aEachName;
238 0 : bIsNamedRange = true;
239 : }
240 : }
241 : }
242 :
243 0 : if (bIsNamedRange)
244 : {
245 0 : mpSourceListBox->SelectEntry(sSourceNamedRangeName, true);
246 0 : mpSourceRadioNamedRange->Check(true);
247 : }
248 : else
249 : {
250 0 : mpSourceListBox->SelectEntryPos(0, true);
251 0 : mpSourceRadioSelection->Check(true);
252 : }
253 :
254 : // If entries - select first entry, otherwise disable the radio button.
255 0 : if (mpSourceListBox->GetEntryCount() <= 0)
256 0 : mpSourceRadioNamedRange->Disable();
257 :
258 0 : ToggleSource(NULL);
259 : }
260 :
261 0 : void ScPivotLayoutDialog::SetupDestination()
262 : {
263 0 : mpDestinationListBox->Clear();
264 :
265 : // Fill up named ranges
266 0 : ScAreaNameIterator aIterator(mpDocument);
267 0 : OUString aName;
268 0 : ScRange aRange;
269 :
270 0 : while (aIterator.Next(aName, aRange))
271 : {
272 0 : if (!aIterator.WasDBName())
273 : {
274 0 : mpDestinationListBox->InsertEntry(aName);
275 : }
276 : }
277 :
278 : // If entries - select first entry, otherwise disable the radio button.
279 0 : if (mpDestinationListBox->GetEntryCount() > 0)
280 0 : mpDestinationListBox->SelectEntryPos(0, true);
281 : else
282 0 : mpDestinationRadioNamedRange->Disable();
283 :
284 : //
285 0 : if (mbNewPivotTable)
286 : {
287 0 : mpDestinationRadioNewSheet->Check(true);
288 : }
289 : else
290 : {
291 0 : if (maPivotParameters.nTab != MAXTAB + 1)
292 : {
293 0 : ScAddress aAddress(maPivotParameters.nCol, maPivotParameters.nRow, maPivotParameters.nTab);
294 0 : OUString aAddressString = aAddress.Format(SCA_VALID | SCA_TAB_3D | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE, mpDocument, maAddressDetails);
295 0 : mpDestinationEdit->SetText(aAddressString);
296 0 : mpDestinationRadioSelection->Check(true);
297 : }
298 : }
299 :
300 0 : ToggleDestination(NULL);
301 0 : }
302 :
303 0 : void ScPivotLayoutDialog::FillValuesToListBoxes()
304 : {
305 0 : mpListBoxField->FillLabelFields(maPivotParameters.maLabelArray);
306 0 : mpListBoxData->FillDataField(maPivotParameters.maDataFields);
307 0 : mpListBoxColumn->FillFields(maPivotParameters.maColFields);
308 0 : mpListBoxRow->FillFields(maPivotParameters.maRowFields);
309 0 : mpListBoxPage->FillFields(maPivotParameters.maPageFields);
310 0 : }
311 :
312 0 : void ScPivotLayoutDialog::SetActive()
313 : {
314 0 : if (mbDialogLostFocus)
315 : {
316 0 : mbDialogLostFocus = false;
317 0 : if(mpActiveEdit != NULL)
318 : {
319 0 : mpActiveEdit->GrabFocus();
320 0 : if (mpActiveEdit == mpSourceEdit)
321 0 : UpdateSourceRange();
322 : }
323 : }
324 : else
325 : {
326 0 : GrabFocus();
327 : }
328 :
329 0 : RefInputDone();
330 0 : }
331 :
332 0 : void ScPivotLayoutDialog::SetReference(const ScRange& rReferenceRange, ScDocument* pDocument)
333 : {
334 0 : if (!mbDialogLostFocus)
335 0 : return;
336 :
337 0 : if (mpActiveEdit == NULL)
338 0 : return;
339 :
340 0 : if (rReferenceRange.aStart != rReferenceRange.aEnd)
341 0 : RefInputStart(mpActiveEdit);
342 :
343 0 : OUString aReferenceString = rReferenceRange.Format(SCR_ABS_3D, pDocument, maAddressDetails);
344 :
345 0 : if (mpActiveEdit == mpSourceEdit)
346 : {
347 0 : mpSourceEdit->SetRefString(aReferenceString);
348 : }
349 0 : else if (mpActiveEdit == mpDestinationEdit)
350 : {
351 0 : mpDestinationEdit->SetRefString(aReferenceString);
352 0 : }
353 : }
354 :
355 0 : bool ScPivotLayoutDialog::IsRefInputMode() const
356 : {
357 0 : return mbDialogLostFocus;
358 : }
359 :
360 0 : void ScPivotLayoutDialog::ItemInserted(ScItemValue* pItemValue, ScPivotLayoutTreeList::SvPivotTreeListType eType)
361 : {
362 0 : if (pItemValue == NULL)
363 0 : return;
364 :
365 0 : switch (eType)
366 : {
367 : case ScPivotLayoutTreeList::ROW_LIST:
368 : case ScPivotLayoutTreeList::COLUMN_LIST:
369 : case ScPivotLayoutTreeList::PAGE_LIST:
370 : {
371 0 : mpListBoxRow->RemoveEntryForItem(pItemValue);
372 0 : mpListBoxColumn->RemoveEntryForItem(pItemValue);
373 0 : mpListBoxPage->RemoveEntryForItem(pItemValue);
374 : }
375 : case ScPivotLayoutTreeList::LABEL_LIST:
376 : {
377 0 : mpListBoxRow->RemoveEntryForItem(pItemValue);
378 0 : mpListBoxColumn->RemoveEntryForItem(pItemValue);
379 0 : mpListBoxPage->RemoveEntryForItem(pItemValue);
380 0 : mpListBoxData->RemoveEntryForItem(pItemValue);
381 : }
382 0 : break;
383 : default:
384 0 : break;
385 : }
386 : }
387 :
388 0 : void ScPivotLayoutDialog::UpdateSourceRange()
389 : {
390 0 : ScSheetSourceDesc aSourceSheet = *maPivotTableObject.GetSheetDesc();
391 :
392 0 : if (mpSourceRadioNamedRange->IsChecked())
393 : {
394 0 : OUString aEntryString = mpSourceListBox->GetSelectEntry();
395 0 : ScRange aSourceRange = lclGetRangeForNamedRange(aEntryString, mpDocument);
396 0 : if (!aSourceRange.IsValid() || aSourceSheet.GetSourceRange() == aSourceRange)
397 0 : return;
398 0 : aSourceSheet.SetRangeName(aEntryString);
399 : }
400 0 : else if (mpSourceRadioSelection->IsChecked())
401 : {
402 0 : OUString aSourceString = mpSourceEdit->GetText();
403 0 : ScRange aSourceRange;
404 0 : sal_uInt16 nResult = aSourceRange.Parse(aSourceString, mpDocument, maAddressDetails);
405 :
406 0 : bool bIsValid = (nResult & SCA_VALID) == SCA_VALID; // aSourceString is valid
407 :
408 0 : mpSourceEdit->SetRefValid(true);
409 :
410 0 : if (bIsValid)
411 : {
412 0 : ScRefAddress aStart;
413 0 : ScRefAddress aEnd;
414 :
415 0 : ConvertDoubleRef(mpDocument, aSourceString, 1, aStart, aEnd, maAddressDetails);
416 0 : aSourceRange.aStart = aStart.GetAddress();
417 0 : aSourceRange.aEnd = aEnd.GetAddress();
418 : }
419 : else
420 : {
421 0 : aSourceRange = lclGetRangeForNamedRange(aSourceString, mpDocument);
422 : }
423 :
424 0 : if (!aSourceRange.IsValid())
425 : {
426 0 : mpSourceEdit->SetRefValid(false);
427 0 : return;
428 : }
429 :
430 0 : if (aSourceSheet.GetSourceRange() == aSourceRange)
431 0 : return;
432 :
433 0 : aSourceSheet.SetSourceRange(aSourceRange);
434 0 : if (aSourceSheet.CheckSourceRange() != 0)
435 : {
436 0 : mpSourceEdit->SetRefValid(false);
437 0 : return;
438 0 : }
439 : }
440 : else
441 : {
442 0 : return;
443 : }
444 :
445 0 : maPivotTableObject.SetSheetDesc(aSourceSheet);
446 0 : maPivotTableObject.FillOldParam(maPivotParameters);
447 0 : maPivotTableObject.FillLabelData(maPivotParameters);
448 :
449 0 : FillValuesToListBoxes();
450 : }
451 :
452 0 : bool ScPivotLayoutDialog::ApplyChanges()
453 : {
454 0 : ScDPSaveData aSaveData;
455 0 : ApplySaveData(aSaveData);
456 0 : ApplyLabelData(aSaveData);
457 :
458 0 : ScRange aDestinationRange;
459 0 : bool bToNewSheet = false;
460 :
461 0 : if (!GetDestination(aDestinationRange, bToNewSheet))
462 0 : return false;
463 :
464 0 : SetDispatcherLock(false);
465 0 : SwitchToDocument();
466 :
467 0 : sal_uInt16 nWhichPivot = SC_MOD()->GetPool().GetWhich(SID_PIVOT_TABLE);
468 0 : ScPivotItem aPivotItem(nWhichPivot, &aSaveData, &aDestinationRange, bToNewSheet);
469 0 : mpViewData->GetViewShell()->SetDialogDPObject(&maPivotTableObject);
470 :
471 0 : SfxDispatcher* pDispatcher = GetBindings().GetDispatcher();
472 0 : SfxCallMode nCallMode = SfxCallMode::SLOT | SfxCallMode::RECORD;
473 0 : const SfxPoolItem* pResult = pDispatcher->Execute(SID_PIVOT_TABLE, nCallMode, &aPivotItem, NULL, 0);
474 :
475 0 : if (pResult != NULL)
476 : {
477 0 : const SfxBoolItem* pItem = reinterpret_cast<const SfxBoolItem*>(pResult);
478 0 : if (pItem)
479 : {
480 0 : return pItem->GetValue();
481 : }
482 : }
483 :
484 0 : SetDispatcherLock(true);
485 0 : return true;
486 : }
487 :
488 0 : void ScPivotLayoutDialog::ApplySaveData(ScDPSaveData& rSaveData)
489 : {
490 0 : rSaveData.SetIgnoreEmptyRows(mpCheckIgnoreEmptyRows->IsChecked());
491 0 : rSaveData.SetRepeatIfEmpty(mpCheckIdentifyCategories->IsChecked());
492 0 : rSaveData.SetColumnGrand(mpCheckTotalColumns->IsChecked());
493 0 : rSaveData.SetRowGrand(mpCheckTotalRows->IsChecked());
494 0 : rSaveData.SetFilterButton(mpCheckAddFilter->IsChecked());
495 0 : rSaveData.SetDrillDown(mpCheckDrillToDetail->IsChecked());
496 :
497 0 : Reference<XDimensionsSupplier> xSource = maPivotTableObject.GetSource();
498 :
499 0 : ScPivotFieldVector aPageFieldVector;
500 0 : mpListBoxPage->PushEntriesToPivotFieldVector(aPageFieldVector);
501 : ScDPObject::ConvertOrientation(rSaveData, aPageFieldVector, DataPilotFieldOrientation_PAGE,
502 0 : xSource, maPivotParameters.maLabelArray);
503 :
504 0 : ScPivotFieldVector aColFieldVector;
505 0 : mpListBoxColumn->PushEntriesToPivotFieldVector(aColFieldVector);
506 : ScDPObject::ConvertOrientation(rSaveData, aColFieldVector, DataPilotFieldOrientation_COLUMN,
507 0 : xSource, maPivotParameters.maLabelArray);
508 :
509 0 : ScPivotFieldVector aRowFieldVector;
510 0 : mpListBoxRow->PushEntriesToPivotFieldVector(aRowFieldVector);
511 : ScDPObject::ConvertOrientation(rSaveData, aRowFieldVector, DataPilotFieldOrientation_ROW,
512 0 : xSource, maPivotParameters.maLabelArray);
513 :
514 0 : ScPivotFieldVector aDataFieldVector;
515 0 : mpListBoxData->PushEntriesToPivotFieldVector(aDataFieldVector);
516 : ScDPObject::ConvertOrientation(rSaveData, aDataFieldVector, DataPilotFieldOrientation_DATA,
517 : xSource, maPivotParameters.maLabelArray,
518 0 : &aColFieldVector, &aRowFieldVector, &aPageFieldVector);
519 0 : }
520 :
521 0 : void ScPivotLayoutDialog::ApplyLabelData(ScDPSaveData& rSaveData)
522 : {
523 0 : ScDPLabelDataVector::const_iterator it;
524 0 : ScDPLabelDataVector& rLabelDataVector = GetLabelDataVector();
525 :
526 0 : for (it = rLabelDataVector.begin(); it != rLabelDataVector.end(); ++it)
527 : {
528 0 : const ScDPLabelData& pLabelData = *it;
529 :
530 0 : OUString aUnoName = ScDPUtil::createDuplicateDimensionName(pLabelData.maName, pLabelData.mnDupCount);
531 0 : ScDPSaveDimension* pSaveDimensions = rSaveData.GetExistingDimensionByName(aUnoName);
532 :
533 0 : if (pSaveDimensions == NULL)
534 0 : continue;
535 :
536 0 : pSaveDimensions->SetUsedHierarchy(pLabelData.mnUsedHier);
537 0 : pSaveDimensions->SetShowEmpty(pLabelData.mbShowAll);
538 0 : pSaveDimensions->SetSortInfo(&pLabelData.maSortInfo);
539 0 : pSaveDimensions->SetLayoutInfo(&pLabelData.maLayoutInfo);
540 0 : pSaveDimensions->SetAutoShowInfo(&pLabelData.maShowInfo);
541 :
542 0 : bool bManualSort = (pLabelData.maSortInfo.Mode == DataPilotFieldSortMode::MANUAL);
543 :
544 0 : std::vector<ScDPLabelData::Member>::const_iterator itMember;
545 0 : for (itMember = pLabelData.maMembers.begin(); itMember != pLabelData.maMembers.end(); ++itMember)
546 : {
547 0 : const ScDPLabelData::Member& rLabelMember = *itMember;
548 0 : ScDPSaveMember* pMember = pSaveDimensions->GetMemberByName(rLabelMember.maName);
549 :
550 0 : if (bManualSort || !rLabelMember.mbVisible || !rLabelMember.mbShowDetails)
551 : {
552 0 : pMember->SetIsVisible(rLabelMember.mbVisible);
553 0 : pMember->SetShowDetails(rLabelMember.mbShowDetails);
554 : }
555 : }
556 0 : }
557 0 : }
558 :
559 0 : bool ScPivotLayoutDialog::GetDestination(ScRange& aDestinationRange, bool& bToNewSheet)
560 : {
561 0 : bToNewSheet = false;
562 :
563 0 : if (mpDestinationRadioNamedRange->IsChecked())
564 : {
565 0 : OUString aName = mpDestinationListBox->GetSelectEntry();
566 0 : aDestinationRange = lclGetRangeForNamedRange(aName, mpDocument);
567 0 : if (!aDestinationRange.IsValid())
568 0 : return false;
569 : }
570 0 : else if (mpDestinationRadioSelection->IsChecked())
571 : {
572 0 : ScAddress aAddress;
573 0 : aAddress.Parse(mpDestinationEdit->GetText(), mpDocument, maAddressDetails);
574 0 : aDestinationRange = ScRange(aAddress);
575 : }
576 : else
577 : {
578 0 : bToNewSheet = true;
579 0 : aDestinationRange = ScRange(maPivotParameters.nCol, maPivotParameters.nRow, maPivotParameters.nTab);
580 : }
581 0 : return true;
582 : }
583 :
584 0 : ScItemValue* ScPivotLayoutDialog::GetItem(SCCOL nColumn)
585 : {
586 0 : return mpListBoxField->GetItem(nColumn);
587 : }
588 :
589 0 : bool ScPivotLayoutDialog::IsDataElement(SCCOL nColumn)
590 : {
591 0 : return mpListBoxField->IsDataElement(nColumn);
592 : }
593 :
594 0 : ScDPLabelData* ScPivotLayoutDialog::GetLabelData(SCCOL nColumn)
595 : {
596 0 : return &maPivotParameters.maLabelArray[nColumn];
597 : }
598 :
599 0 : void ScPivotLayoutDialog::PushDataFieldNames(std::vector<ScDPName>& rDataFieldNames)
600 : {
601 0 : return mpListBoxData->PushDataFieldNames(rDataFieldNames);
602 : }
603 :
604 0 : IMPL_LINK( ScPivotLayoutDialog, OKClicked, PushButton*, /*pButton*/ )
605 : {
606 0 : ApplyChanges();
607 0 : DoClose( ScPivotLayoutWrapper::GetChildWindowId() );
608 0 : return 0;
609 : }
610 :
611 0 : IMPL_LINK( ScPivotLayoutDialog, CancelClicked, PushButton*, /*pButton*/ )
612 : {
613 0 : DoClose( ScPivotLayoutWrapper::GetChildWindowId() );
614 0 : return 0;
615 : }
616 :
617 0 : IMPL_LINK(ScPivotLayoutDialog, GetFocusHandler, Control*, pCtrl)
618 : {
619 0 : mpActiveEdit = NULL;
620 :
621 0 : if (pCtrl == (Control*) mpSourceEdit ||
622 0 : pCtrl == (Control*) mpSourceButton)
623 : {
624 0 : mpActiveEdit = mpSourceEdit;
625 : }
626 0 : else if (pCtrl == (Control*) mpDestinationEdit ||
627 0 : pCtrl == (Control*) mpDestinationButton)
628 : {
629 0 : mpActiveEdit = mpDestinationEdit;
630 : }
631 :
632 0 : if (mpActiveEdit)
633 0 : mpActiveEdit->SetSelection(Selection(0, SELECTION_MAX));
634 :
635 0 : return 0;
636 : }
637 :
638 0 : IMPL_LINK_NOARG(ScPivotLayoutDialog, LoseFocusHandler)
639 : {
640 0 : mbDialogLostFocus = !IsActive();
641 0 : return 0;
642 : }
643 :
644 0 : IMPL_LINK_NOARG(ScPivotLayoutDialog, SourceEditModified)
645 : {
646 0 : UpdateSourceRange();
647 0 : return 0;
648 : }
649 :
650 0 : IMPL_LINK_NOARG(ScPivotLayoutDialog, ToggleSource)
651 : {
652 0 : bool bNamedRange = mpSourceRadioNamedRange->IsChecked();
653 0 : bool bSelection = mpSourceRadioSelection->IsChecked();
654 0 : mpSourceListBox->Enable(bNamedRange);
655 0 : mpSourceButton->Enable(bSelection);
656 0 : mpSourceEdit->Enable(bSelection);
657 0 : UpdateSourceRange();
658 0 : return 0;
659 : }
660 :
661 0 : IMPL_LINK_NOARG(ScPivotLayoutDialog, ToggleDestination)
662 : {
663 0 : bool bNamedRange = mpDestinationRadioNamedRange->IsChecked();
664 0 : bool bSelection = mpDestinationRadioSelection->IsChecked();
665 0 : mpDestinationListBox->Enable(bNamedRange);
666 0 : mpDestinationButton->Enable(bSelection);
667 0 : mpDestinationEdit->Enable(bSelection);
668 0 : return 0;
669 228 : }
670 :
671 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|