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