1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
11 #include <sfx2/dispatch.hxx>
12 #include <svl/zforlist.hxx>
13 #include <svl/undo.hxx>
14 #include <boost/random.hpp>
15 #include <boost/scoped_ptr.hpp>
17 #include "formulacell.hxx"
18 #include "rangelst.hxx"
19 #include "scitems.hxx"
21 #include "document.hxx"
22 #include "uiitems.hxx"
23 #include "reffact.hxx"
24 #include "strload.hxx"
26 #include "docfunc.hxx"
27 #include "StatisticsDialogs.hrc"
28 #include "TableFillingAndNavigationTools.hxx"
30 #include "DescriptiveStatisticsDialog.hxx"
35 struct StatisticCalculation
{
36 sal_Int16 aCalculationNameId
;
40 static const StatisticCalculation lclCalcDefinitions
[] =
42 { STRID_CALC_MEAN
, "=AVERAGE(%RANGE%)" },
43 { STRID_CALC_STD_ERROR
, "=SQRT(VAR(%RANGE%)/COUNT(%RANGE%))"},
44 { STRID_CALC_MODE
, "=MODE(%RANGE%)"},
45 { STRID_CALC_MEDIAN
, "=MEDIAN(%RANGE%)"},
46 { STRID_CALC_VARIANCE
, "=VAR(%RANGE%)"},
47 { STRID_CALC_STD_DEVIATION
, "=STDEV(%RANGE%)"},
48 { STRID_CALC_KURTOSIS
, "=KURT(%RANGE%)"},
49 { STRID_CALC_SKEWNESS
, "=SKEW(%RANGE%)"},
50 { STRID_CALC_RANGE
, "=MAX(%RANGE%)-MIN(%RANGE%)"},
51 { STRID_CALC_MIN
, "=MIN(%RANGE%)"},
52 { STRID_CALC_MAX
, "=MAX(%RANGE%)"},
53 { STRID_CALC_SUM
, "=SUM(%RANGE%)"},
54 { STRID_CALC_COUNT
, "=COUNT(%RANGE%)" },
58 static const OUString
strWildcardRange("%RANGE%");
59 static const OUString
strWildcardNumber("%NUMBER%");
63 ScDescriptiveStatisticsDialog::ScDescriptiveStatisticsDialog(
64 SfxBindings
* pSfxBindings
, SfxChildWindow
* pChildWindow
,
65 Window
* pParent
, ScViewData
* pViewData
) :
66 ScStatisticsInputOutputDialog(
67 pSfxBindings
, pChildWindow
, pParent
, pViewData
,
68 "DescriptiveStatisticsDialog", "modules/scalc/ui/descriptivestatisticsdialog.ui" )
71 ScDescriptiveStatisticsDialog::~ScDescriptiveStatisticsDialog()
74 sal_Bool
ScDescriptiveStatisticsDialog::Close()
76 return DoClose( ScDescriptiveStatisticsDialogWrapper::GetChildWindowId() );
79 sal_Int16
ScDescriptiveStatisticsDialog::GetUndoNameId()
81 return STR_DESCRIPTIVE_STATISTICS_UNDO_NAME
;
84 ScRange
ScDescriptiveStatisticsDialog::ApplyOutput(ScDocShell
* pDocShell
)
86 AddressWalkerWriter
aOutput(mOutputAddress
, pDocShell
, mDocument
,
87 formula::FormulaGrammar::mergeToGrammar( formula::FormulaGrammar::GRAM_ENGLISH
, mAddressDetails
.eConv
));
88 FormulaTemplate
aTemplate(mDocument
, mAddressDetails
);
90 boost::scoped_ptr
<DataRangeIterator
> pIterator
;
91 if (mGroupedBy
== BY_COLUMN
)
92 pIterator
.reset(new DataRangeByColumnIterator(mInputRange
));
94 pIterator
.reset(new DataRangeByRowIterator(mInputRange
));
98 // Write column/row labels
99 for( ; pIterator
->hasNext(); pIterator
->next() )
101 if (mGroupedBy
== BY_COLUMN
)
102 aTemplate
.setTemplate(SC_STRLOAD(RID_STATISTICS_DLGS
, STR_COLUMN_LABEL_TEMPLATE
));
104 aTemplate
.setTemplate(SC_STRLOAD(RID_STATISTICS_DLGS
, STR_ROW_LABEL_TEMPLATE
));
106 aTemplate
.applyNumber(strWildcardNumber
, pIterator
->index() + 1);
107 aOutput
.writeBoldString(aTemplate
.getTemplate());
108 aOutput
.nextColumn();
111 aOutput
.resetColumn();
114 // Write calculation labels
115 for(sal_Int32 i
= 0; lclCalcDefinitions
[i
].aFormula
!= NULL
; i
++)
117 OUString
aLabel(SC_STRLOAD(RID_STATISTICS_DLGS
, lclCalcDefinitions
[i
].aCalculationNameId
));
118 aOutput
.writeString(aLabel
);
121 aOutput
.nextColumn();
125 for( ; pIterator
->hasNext(); pIterator
->next() )
129 for(sal_Int32 i
= 0; lclCalcDefinitions
[i
].aFormula
!= NULL
; i
++)
131 aTemplate
.setTemplate(lclCalcDefinitions
[i
].aFormula
);
132 aTemplate
.applyRange(strWildcardRange
, pIterator
->get());
133 aOutput
.writeFormula(aTemplate
.getTemplate());
136 aOutput
.nextColumn();
139 return ScRange(aOutput
.mMinimumAddress
, aOutput
.mMaximumAddress
);
142 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */