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 : */
10 :
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>
16 :
17 : #include "formulacell.hxx"
18 : #include "rangelst.hxx"
19 : #include "scitems.hxx"
20 : #include "docsh.hxx"
21 : #include "document.hxx"
22 : #include "uiitems.hxx"
23 : #include "reffact.hxx"
24 : #include "strload.hxx"
25 : #include "docfunc.hxx"
26 : #include "StatisticsDialogs.hrc"
27 : #include "TableFillingAndNavigationTools.hxx"
28 :
29 : #include "DescriptiveStatisticsDialog.hxx"
30 :
31 : namespace
32 : {
33 :
34 : struct StatisticCalculation {
35 : sal_Int16 aCalculationNameId;
36 : const char* aFormula;
37 : };
38 :
39 : static const StatisticCalculation lclCalcDefinitions[] =
40 : {
41 : { STRID_CALC_MEAN, "=AVERAGE(%RANGE%)" },
42 : { STRID_CALC_STD_ERROR, "=SQRT(VAR(%RANGE%)/COUNT(%RANGE%))"},
43 : { STRID_CALC_MODE, "=MODE(%RANGE%)"},
44 : { STRID_CALC_MEDIAN, "=MEDIAN(%RANGE%)"},
45 : { STRID_CALC_FIRST_QUARTILE, "=QUARTILE(%RANGE%; 1)" },
46 : { STRID_CALC_THIRD_QUARTILE, "=QUARTILE(%RANGE%; 3)" },
47 : { STRID_CALC_VARIANCE, "=VAR(%RANGE%)"},
48 : { STRID_CALC_STD_DEVIATION, "=STDEV(%RANGE%)"},
49 : { STRID_CALC_KURTOSIS, "=KURT(%RANGE%)"},
50 : { STRID_CALC_SKEWNESS, "=SKEW(%RANGE%)"},
51 : { STRID_CALC_RANGE, "=MAX(%RANGE%)-MIN(%RANGE%)"},
52 : { STRID_CALC_MIN, "=MIN(%RANGE%)"},
53 : { STRID_CALC_MAX, "=MAX(%RANGE%)"},
54 : { STRID_CALC_SUM, "=SUM(%RANGE%)"},
55 : { STRID_CALC_COUNT, "=COUNT(%RANGE%)" },
56 : { 0, NULL }
57 : };
58 :
59 : static const char strWildcardRange[] = "%RANGE%";
60 : static const char strWildcardNumber[] = "%NUMBER%";
61 :
62 : }
63 :
64 0 : ScDescriptiveStatisticsDialog::ScDescriptiveStatisticsDialog(
65 : SfxBindings* pSfxBindings, SfxChildWindow* pChildWindow,
66 : vcl::Window* pParent, ScViewData* pViewData ) :
67 : ScStatisticsInputOutputDialog(
68 : pSfxBindings, pChildWindow, pParent, pViewData,
69 0 : "DescriptiveStatisticsDialog", "modules/scalc/ui/descriptivestatisticsdialog.ui" )
70 0 : {}
71 :
72 0 : ScDescriptiveStatisticsDialog::~ScDescriptiveStatisticsDialog()
73 0 : {}
74 :
75 0 : bool ScDescriptiveStatisticsDialog::Close()
76 : {
77 0 : return DoClose( ScDescriptiveStatisticsDialogWrapper::GetChildWindowId() );
78 : }
79 :
80 0 : sal_Int16 ScDescriptiveStatisticsDialog::GetUndoNameId()
81 : {
82 0 : return STR_DESCRIPTIVE_STATISTICS_UNDO_NAME;
83 : }
84 :
85 0 : ScRange ScDescriptiveStatisticsDialog::ApplyOutput(ScDocShell* pDocShell)
86 : {
87 : AddressWalkerWriter aOutput(mOutputAddress, pDocShell, mDocument,
88 0 : formula::FormulaGrammar::mergeToGrammar( formula::FormulaGrammar::GRAM_ENGLISH, mAddressDetails.eConv));
89 0 : FormulaTemplate aTemplate(mDocument);
90 :
91 0 : boost::scoped_ptr<DataRangeIterator> pIterator;
92 0 : if (mGroupedBy == BY_COLUMN)
93 0 : pIterator.reset(new DataRangeByColumnIterator(mInputRange));
94 : else
95 0 : pIterator.reset(new DataRangeByRowIterator(mInputRange));
96 :
97 0 : aOutput.nextColumn();
98 :
99 : // Use explicit sheet name in case the input and output are on different sheets.
100 0 : bool b3DAddress = mInputRange.aStart.Tab() != mOutputAddress.Tab();
101 :
102 : // Write column/row labels
103 0 : for( ; pIterator->hasNext(); pIterator->next() )
104 : {
105 0 : if (mGroupedBy == BY_COLUMN)
106 0 : aTemplate.setTemplate(SC_STRLOAD(RID_STATISTICS_DLGS, STR_COLUMN_LABEL_TEMPLATE));
107 : else
108 0 : aTemplate.setTemplate(SC_STRLOAD(RID_STATISTICS_DLGS, STR_ROW_LABEL_TEMPLATE));
109 :
110 0 : aTemplate.applyNumber(strWildcardNumber, pIterator->index() + 1);
111 0 : aOutput.writeBoldString(aTemplate.getTemplate());
112 0 : aOutput.nextColumn();
113 : }
114 0 : aOutput.nextRow();
115 0 : aOutput.resetColumn();
116 0 : aOutput.push();
117 :
118 : // Write calculation labels
119 0 : for(sal_Int32 i = 0; lclCalcDefinitions[i].aFormula != NULL; i++)
120 : {
121 0 : OUString aLabel(SC_STRLOAD(RID_STATISTICS_DLGS, lclCalcDefinitions[i].aCalculationNameId));
122 0 : aOutput.writeString(aLabel);
123 0 : aOutput.nextRow();
124 0 : }
125 0 : aOutput.nextColumn();
126 :
127 0 : pIterator->reset();
128 :
129 0 : for( ; pIterator->hasNext(); pIterator->next() )
130 : {
131 0 : aOutput.resetRow();
132 :
133 0 : for(sal_Int32 i = 0; lclCalcDefinitions[i].aFormula != NULL; i++)
134 : {
135 0 : aTemplate.setTemplate(lclCalcDefinitions[i].aFormula);
136 0 : aTemplate.applyRange(strWildcardRange, pIterator->get(), b3DAddress);
137 0 : aOutput.writeFormula(aTemplate.getTemplate());
138 0 : aOutput.nextRow();
139 : }
140 0 : aOutput.nextColumn();
141 : }
142 :
143 0 : return ScRange(aOutput.mMinimumAddress, aOutput.mMaximumAddress);
144 156 : }
145 :
146 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|