[Libreoffice-commits] core.git: officecfg/registry sc/inc sc/Library_sc.mk sc/qa sc/sdi sc/source sc/uiconfig sc/UIConfig_scalc.mk solenv/sanitizers

Dennis Francis (via logerrit) logerrit at kemper.freedesktop.org
Tue Mar 26 13:33:49 UTC 2019


 officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu |    8 
 sc/Library_sc.mk                                                  |    1 
 sc/UIConfig_scalc.mk                                              |    1 
 sc/inc/sc.hrc                                                     |    1 
 sc/inc/strings.hrc                                                |   17 
 sc/qa/unit/screenshots/data/screenshots.txt                       |    1 
 sc/sdi/cellsh.sdi                                                 |    1 
 sc/sdi/scalc.sdi                                                  |   17 
 sc/source/ui/StatisticsDialogs/FourierAnalysisDialog.cxx          |  247 +++++
 sc/source/ui/StatisticsDialogs/StatisticsInputOutputDialog.cxx    |   28 
 sc/source/ui/app/scdll.cxx                                        |    1 
 sc/source/ui/inc/FourierAnalysisDialog.hxx                        |   60 +
 sc/source/ui/inc/StatisticsInputOutputDialog.hxx                  |    2 
 sc/source/ui/inc/reffact.hxx                                      |    7 
 sc/source/ui/view/cellsh1.cxx                                     |    9 
 sc/source/ui/view/tabvwsh.cxx                                     |    1 
 sc/source/ui/view/tabvwshc.cxx                                    |    7 
 sc/uiconfig/scalc/menubar/menubar.xml                             |    1 
 sc/uiconfig/scalc/ui/fourieranalysisdialog.ui                     |  423 ++++++++++
 sc/uiconfig/scalc/ui/notebookbar.ui                               |    7 
 sc/uiconfig/scalc/ui/notebookbar_compact.ui                       |    7 
 solenv/sanitizers/ui/modules/scalc.suppr                          |    1 
 22 files changed, 837 insertions(+), 11 deletions(-)

New commits:
commit 1b9f0e99f3ab0deb8ee2291b34c5c2e6a31de2d1
Author:     Dennis Francis <dennis.francis at collabora.com>
AuthorDate: Tue Mar 12 18:21:34 2019 +0530
Commit:     Dennis Francis <dennis.francis at collabora.com>
CommitDate: Tue Mar 26 14:33:23 2019 +0100

    tdf#74664 : add Fourier analysis tool
    
    Add Fourier analysis tool to Statistics submenu.
    Use FOURIER() formula to do all the work here.
    
    Change-Id: Ifdaa79d8ee367f1c1f5054248e01853ffe4c6823
    Reviewed-on: https://gerrit.libreoffice.org/69472
    Tested-by: Jenkins
    Reviewed-by: Dennis Francis <dennis.francis at collabora.com>

diff --git a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
index 996d3c1f029d..3a70c4f2fb2b 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
@@ -998,6 +998,14 @@
           <value>1</value>
         </prop>
       </node>
+      <node oor:name=".uno:FourierAnalysisDialog" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">F~ourier Analysis...</value>
+        </prop>
+        <prop oor:name="Properties" oor:type="xs:int">
+          <value>1</value>
+        </prop>
+      </node>
       <node oor:name=".uno:EditHeaderAndFooter" oor:op="replace">
         <prop oor:name="Label" oor:type="xs:string">
           <value xml:lang="en-US">~Headers and Footers...</value>
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index 9e67772d81f2..aa596d001a26 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -520,6 +520,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
     sc/source/ui/StatisticsDialogs/ChiSquareTestDialog \
     sc/source/ui/StatisticsDialogs/DescriptiveStatisticsDialog \
     sc/source/ui/StatisticsDialogs/ExponentialSmoothingDialog \
+    sc/source/ui/StatisticsDialogs/FourierAnalysisDialog \
     sc/source/ui/StatisticsDialogs/FTestDialog \
     sc/source/ui/StatisticsDialogs/MatrixComparisonGenerator \
     sc/source/ui/StatisticsDialogs/MovingAverageDialog \
diff --git a/sc/UIConfig_scalc.mk b/sc/UIConfig_scalc.mk
index 68f210509c2a..a80f9d2ea791 100644
--- a/sc/UIConfig_scalc.mk
+++ b/sc/UIConfig_scalc.mk
@@ -128,6 +128,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/scalc,\
 	sc/uiconfig/scalc/ui/footerdialog \
 	sc/uiconfig/scalc/ui/formatcellsdialog \
 	sc/uiconfig/scalc/ui/formulacalculationoptions \
+	sc/uiconfig/scalc/ui/fourieranalysisdialog \
 	sc/uiconfig/scalc/ui/floatingborderstyle \
 	sc/uiconfig/scalc/ui/floatinglinestyle \
 	sc/uiconfig/scalc/ui/functionpanel \
diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc
index 52b945ea9441..c8388a4e3c8d 100644
--- a/sc/inc/sc.hrc
+++ b/sc/inc/sc.hrc
@@ -237,6 +237,7 @@
 #define SID_WINDOW_FIX_COL                  (SC_MESSAGE_START + 85)
 #define SID_COLUMN_OPERATIONS               (SC_MESSAGE_START + 86)
 #define SID_ROW_OPERATIONS                  (SC_MESSAGE_START + 87)
+#define SID_FOURIER_ANALYSIS_DIALOG         (SC_MESSAGE_START + 88)
 
 // functions
 
diff --git a/sc/inc/strings.hrc b/sc/inc/strings.hrc
index f85aa46263f2..a3392a36b20c 100644
--- a/sc/inc/strings.hrc
+++ b/sc/inc/strings.hrc
@@ -289,6 +289,8 @@
 #define STR_CHI_SQUARE_TEST                         NC_("STR_CHI_SQUARE_TEST", "Test of Independence (Chi-Square)")
 #define STR_REGRESSION_UNDO_NAME                    NC_("STR_REGRESSION_UNDO_NAME", "Regression")
 #define STR_REGRESSION                              NC_("STR_REGRESSION", "Regression")
+#define STR_FOURIER_ANALYSIS_UNDO_NAME              NC_("STR_FOURIER_ANALYSIS_UNDO_NAME", "Fourier Analysis")
+#define STR_FOURIER_ANALYSIS                        NC_("STR_FOURIER_ANALYSIS", "Fourier Analysis")
 /* Common */
 #define STR_COLUMN_LABEL_TEMPLATE                   NC_("STR_COLUMN_LABEL_TEMPLATE", "Column %NUMBER%")
 #define STR_ROW_LABEL_TEMPLATE                      NC_("STR_ROW_LABEL_TEMPLATE", "Row %NUMBER%")
@@ -307,13 +309,14 @@
 #define STR_TEST_STATISTIC_LABEL                    NC_("STR_TEST_STATISTIC_LABEL", "Test Statistic")
 #define STR_LABEL_LOWER                             NC_("STR_LABEL_LOWER", "Lower")
 #define STR_LABEL_UPPER                             NC_("STR_LABEL_Upper", "Upper")
+#define STR_MESSAGE_INVALID_INPUT_RANGE             NC_("STR_MESSAGE_INVALID_INPUT_RANGE", "Input range is invalid.")
+#define STR_MESSAGE_INVALID_OUTPUT_ADDR             NC_("STR_MESSAGE_INVALID_OUTPUT_ADDR", "Output address is not valid.")
 /* RegressionDialog */
 #define STR_LABEL_LINEAR                            NC_("STR_LABEL_LINEAR", "Linear")
 #define STR_LABEL_LOGARITHMIC                       NC_("STR_LABEL_LOGARITHMIC", "Logarithmic")
 #define STR_LABEL_POWER                             NC_("STR_LABEL_POWER", "Power")
 #define STR_MESSAGE_XINVALID_RANGE                  NC_("STR_MESSAGE_XINVALID_RANGE", "Independent variable(s) range is not valid.")
 #define STR_MESSAGE_YINVALID_RANGE                  NC_("STR_MESSAGE_YINVALID_RANGE", "Dependent variable(s) range is not valid.")
-#define STR_MESSAGE_INVALID_OUTPUT_ADDR             NC_("STR_MESSAGE_INVALID_OUTPUT_ADDR", "Output range is not valid.")
 #define STR_MESSAGE_INVALID_CONFIDENCE_LEVEL        NC_("STR_MESSAGE_INVALID_CONFIDENCE_LEVEL", "Confidence level must be in the interval (0, 1).")
 #define STR_MESSAGE_YVARIABLE_MULTI_COLUMN          NC_("STR_MESSAGE_YVARIABLE_MULTI_COLUMN", "Y variable range cannot have more than 1 column.")
 #define STR_MESSAGE_YVARIABLE_MULTI_ROW             NC_("STR_MESSAGE_YVARIABLE_MULTI_ROW", "Y variable range cannot have more than 1 row.")
@@ -350,6 +353,18 @@
 #define STR_ZTEST_Z_CRITICAL_ONE_TAIL               NC_("STR_ZTEST_Z_CRITICAL_ONE_TAIL", "z Critical one-tail")
 #define STR_ZTEST_P_TWO_TAIL                        NC_("STR_ZTEST_P_TWO_TAIL", "P (Z<=z) two-tail")
 #define STR_ZTEST_Z_CRITICAL_TWO_TAIL               NC_("STR_ZTEST_Z_CRITICAL_TWO_TAIL", "z Critical two-tail")
+/*Fourier Analysis*/
+#define STR_FOURIER_TRANSFORM                       NC_("STR_FOURIER_TRANSFORM", "Fourier Transform")
+#define STR_INVERSE_FOURIER_TRANSFORM               NC_("STR_INVERSE_FOURIER_TRANSFORM", "Inverse Fourier Transform")
+#define STR_REAL_PART                               NC_("STR_REAL_PART", "Real")
+#define STR_IMAGINARY_PART                          NC_("STR_IMAGINARY_PART", "Imaginary")
+#define STR_MAGNITUDE_PART                          NC_("STR_MAGNITUDE_PART", "Magnitude")
+#define STR_PHASE_PART                              NC_("STR_PHASE_PART", "Phase")
+#define STR_MESSAGE_INVALID_NUMCOLS                 NC_("STR_MESSAGE_INVALID_NUMCOLS", "More than two columns selected in grouped by column mode.")
+#define STR_MESSAGE_INVALID_NUMROWS                 NC_("STR_MESSAGE_INVALID_NUMROWS", "More than two rows selected in grouped by row mode.")
+#define STR_MESSAGE_NODATA_IN_RANGE                 NC_("STR_MESSAGE_NODATA_IN_RANGE", "No data in input range.")
+#define STR_MESSAGE_OUTPUT_TOO_LONG                 NC_("STR_MESSAGE_OUTPUT_TOO_LONG", "Output is too long to write into the sheet.")
+#define STR_INPUT_DATA_RANGE                        NC_("STR_INPUT_DATA_RANGE", "Input data range")
 /*infobar for allowing links to update or not*/
 #define STR_ENABLE_CONTENT                          NC_("STR_ENABLE_CONTENT", "Enable Content")
 /*Insert image dialog*/
diff --git a/sc/qa/unit/screenshots/data/screenshots.txt b/sc/qa/unit/screenshots/data/screenshots.txt
index aa5553b7beab..2f795e601fa8 100644
--- a/sc/qa/unit/screenshots/data/screenshots.txt
+++ b/sc/qa/unit/screenshots/data/screenshots.txt
@@ -99,6 +99,7 @@ modules/scalc/ui/correlationdialog.ui
 modules/scalc/ui/ttestdialog.ui
 modules/scalc/ui/ztestdialog.ui
 modules/scalc/ui/chisquaretestdialog.ui
+modules/scalc/ui/fourieranalysisdialog.ui
 modules/scalc/ui/regressiondialog.ui
 modules/scalc/ui/exponentialsmoothingdialog.ui
 modules/scalc/ui/descriptivestatisticsdialog.ui
diff --git a/sc/sdi/cellsh.sdi b/sc/sdi/cellsh.sdi
index b7b279cdf0b6..4f2cd4d234b4 100644
--- a/sc/sdi/cellsh.sdi
+++ b/sc/sdi/cellsh.sdi
@@ -163,6 +163,7 @@ interface CellSelection
     SID_FTEST_DIALOG                    [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ]
     SID_ZTEST_DIALOG                    [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ]
     SID_CHI_SQUARE_TEST_DIALOG          [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ]
+    SID_FOURIER_ANALYSIS_DIALOG         [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ]
     SID_SEARCH_RESULTS_DIALOG [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ]
     SID_MARKDATAAREA    [ ExecMethod = ExecuteMove; StateMethod = GetStateCursor; ]
     SID_MARKARRAYFORMULA [ ExecMethod = ExecuteMove; StateMethod = GetStateCursor; ]
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index 87ef5950d333..05b43341fe8e 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -2253,6 +2253,23 @@ SfxVoidItem ChiSquareTestDialog SID_CHI_SQUARE_TEST_DIALOG
     GroupId = SfxGroupId::Options;
 ]
 
+SfxVoidItem FourierAnalysisDialog SID_FOURIER_ANALYSIS_DIALOG
+()
+[
+    AutoUpdate = FALSE,
+    FastCall = FALSE,
+    ReadOnlyDoc = TRUE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    AccelConfig = TRUE,
+    MenuConfig = TRUE,
+    ToolBoxConfig = TRUE,
+    GroupId = SfxGroupId::Options;
+]
+
 SfxVoidItem SolverDialog SID_OPENDLG_OPTSOLVER
 ()
 [
diff --git a/sc/source/ui/StatisticsDialogs/FourierAnalysisDialog.cxx b/sc/source/ui/StatisticsDialogs/FourierAnalysisDialog.cxx
new file mode 100644
index 000000000000..7ccabfcb0ed5
--- /dev/null
+++ b/sc/source/ui/StatisticsDialogs/FourierAnalysisDialog.cxx
@@ -0,0 +1,247 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#include <sfx2/dispatch.hxx>
+#include <svl/zforlist.hxx>
+#include <svl/undo.hxx>
+
+#include <formulacell.hxx>
+#include <rangelst.hxx>
+#include <scitems.hxx>
+#include <docsh.hxx>
+#include <document.hxx>
+#include <uiitems.hxx>
+#include <reffact.hxx>
+#include <docfunc.hxx>
+#include <TableFillingAndNavigationTools.hxx>
+#include <FourierAnalysisDialog.hxx>
+#include <scresid.hxx>
+#include <strings.hrc>
+
+ScFourierAnalysisDialog::ScFourierAnalysisDialog(SfxBindings* pSfxBindings,
+                                                 SfxChildWindow* pChildWindow, vcl::Window* pParent,
+                                                 ScViewData* pViewData)
+    : ScStatisticsInputOutputDialog(pSfxBindings, pChildWindow, pParent, pViewData,
+                                    "FourierAnalysisDialog",
+                                    "modules/scalc/ui/fourieranalysisdialog.ui")
+    , maLabelAddr(ScAddress::INITIALIZE_INVALID)
+    , maActualInputRange(ScAddress::INITIALIZE_INVALID)
+    , mnLen(0)
+    , mfMinMag(0.0)
+    , mbUse3DAddresses(false)
+    , mbGroupedByColumn(true)
+    , mbWithLabels(false)
+    , mbInverse(false)
+    , mbPolar(false)
+{
+    SetText(ScResId(STR_FOURIER_ANALYSIS));
+    get(mpWithLabelsCheckBox, "withlabels-check");
+    get(mpInverseCheckBox, "inverse-check");
+    get(mpPolarCheckBox, "polar-check");
+    get(mpMinMagnitudeField, "minmagnitude-spin");
+    get(mpErrorMessage, "error-message");
+
+    mpWithLabelsCheckBox->SetToggleHdl(LINK(this, ScFourierAnalysisDialog, CheckBoxHdl));
+}
+
+ScFourierAnalysisDialog::~ScFourierAnalysisDialog() { disposeOnce(); }
+
+bool ScFourierAnalysisDialog::Close()
+{
+    return DoClose(ScFourierAnalysisDialogWrapper::GetChildWindowId());
+}
+
+void ScFourierAnalysisDialog::dispose()
+{
+    mpWithLabelsCheckBox.disposeAndClear();
+    mpInverseCheckBox.disposeAndClear();
+    mpPolarCheckBox.disposeAndClear();
+    mpMinMagnitudeField.disposeAndClear();
+    mpErrorMessage.disposeAndClear();
+    ScStatisticsInputOutputDialog::dispose();
+}
+
+const char* ScFourierAnalysisDialog::GetUndoNameId() { return STR_FOURIER_ANALYSIS; }
+
+ScRange ScFourierAnalysisDialog::ApplyOutput(ScDocShell* pDocShell)
+{
+    getOptions();
+    AddressWalkerWriter aOutput(mOutputAddress, pDocShell, mDocument,
+                                formula::FormulaGrammar::mergeToGrammar(
+                                    formula::FormulaGrammar::GRAM_ENGLISH, mAddressDetails.eConv));
+    FormulaTemplate aTemplate(mDocument);
+    aTemplate.autoReplaceUses3D(mbUse3DAddresses);
+
+    aOutput.writeBoldString(mbInverse ? ScResId(STR_INVERSE_FOURIER_TRANSFORM)
+                                      : ScResId(STR_FOURIER_TRANSFORM));
+    aOutput.newLine();
+    OUString aLabel;
+    getDataLabel(aLabel);
+    if (aLabel.startsWith("="))
+        aOutput.writeFormula(aLabel);
+    else
+        aOutput.writeString(aLabel);
+
+    aOutput.newLine();
+    // Components header
+    if (!mbPolar)
+    {
+        aOutput.writeString(ScResId(STR_REAL_PART));
+        aOutput.nextColumn();
+        aOutput.writeString(ScResId(STR_IMAGINARY_PART));
+    }
+    else
+    {
+        aOutput.writeString(ScResId(STR_MAGNITUDE_PART));
+        aOutput.nextColumn();
+        aOutput.writeString(ScResId(STR_PHASE_PART));
+    }
+
+    aOutput.newLine();
+    aTemplate.autoReplaceRange("%INPUTRANGE%", maActualInputRange);
+
+    OUString aFormula;
+    genFormula(aFormula);
+
+    aTemplate.setTemplate(aFormula);
+    aOutput.writeMatrixFormula(aTemplate.getTemplate(), 2, mnLen);
+
+    return ScRange(aOutput.mMinimumAddress, aOutput.mMaximumAddress);
+}
+
+bool ScFourierAnalysisDialog::InputRangesValid()
+{
+    if (!mInputRange.IsValid())
+    {
+        mpErrorMessage->SetText(ScResId(STR_MESSAGE_INVALID_INPUT_RANGE));
+        return false;
+    }
+
+    if (!mOutputAddress.IsValid())
+    {
+        mpErrorMessage->SetText(ScResId(STR_MESSAGE_INVALID_OUTPUT_ADDR));
+        return false;
+    }
+
+    mInputRange.PutInOrder();
+
+    mbGroupedByColumn = mGroupedBy == BY_COLUMN;
+    mbWithLabels = mpWithLabelsCheckBox->IsChecked();
+
+    mbUse3DAddresses = mInputRange.aStart.Tab() != mOutputAddress.Tab();
+
+    SCSIZE nRows = mInputRange.aEnd.Row() - mInputRange.aStart.Row() + 1;
+    SCSIZE nCols = mInputRange.aEnd.Col() - mInputRange.aStart.Col() + 1;
+
+    SCSIZE nLen = mbGroupedByColumn ? nRows : nCols;
+    SCSIZE nComponents = mbGroupedByColumn ? nCols : nRows;
+
+    if (nComponents > 2)
+    {
+        OUString aMsg = mbGroupedByColumn ? ScResId(STR_MESSAGE_INVALID_NUMCOLS)
+                                          : ScResId(STR_MESSAGE_INVALID_NUMROWS);
+        mpErrorMessage->SetText(aMsg);
+        return false;
+    }
+
+    if (mbWithLabels && nLen < 2)
+    {
+        mpErrorMessage->SetText(ScResId(STR_MESSAGE_NODATA_IN_RANGE));
+        return false;
+    }
+
+    // Include space for writing the title, label and Real/Imaginary/Magnitude/Phase heading.
+    SCSIZE nLastOutputRow = mOutputAddress.Row() + nLen + 2;
+    if (mbWithLabels)
+        --nLastOutputRow;
+
+    if (nLastOutputRow > MAXROW)
+    {
+        mpErrorMessage->SetText(ScResId(STR_MESSAGE_OUTPUT_TOO_LONG));
+        return false;
+    }
+
+    ScAddress aActualStart(mInputRange.aStart);
+
+    if (mbWithLabels)
+    {
+        if (mbGroupedByColumn)
+            aActualStart.IncRow();
+        else
+            aActualStart.IncCol();
+
+        if (nComponents == 1)
+            maLabelAddr = mInputRange.aStart;
+        else
+            mbWithLabels = false;
+
+        mnLen = nLen - 1;
+    }
+    else
+    {
+        mnLen = nLen;
+    }
+
+    maActualInputRange = ScRange(aActualStart, mInputRange.aEnd);
+    mpErrorMessage->SetText("");
+
+    return true;
+}
+
+void ScFourierAnalysisDialog::getOptions()
+{
+    mbInverse = mpInverseCheckBox->IsChecked();
+    mbPolar = mpPolarCheckBox->IsChecked();
+
+    sal_Int32 nDeciBels = static_cast<sal_Int32>(mpMinMagnitudeField->GetValue());
+    if (nDeciBels <= -150)
+        mfMinMag = 0.0;
+    else
+        mfMinMag = pow(10.0, static_cast<double>(nDeciBels) / 10.0);
+}
+
+void ScFourierAnalysisDialog::getDataLabel(OUString& rLabel)
+{
+    if (mbWithLabels)
+    {
+        rLabel = "="
+                 + maLabelAddr.Format(mbUse3DAddresses ? ScRefFlags::ADDR_ABS_3D
+                                                       : ScRefFlags::ADDR_ABS,
+                                      mDocument, mAddressDetails);
+
+        return;
+    }
+
+    OUString aDataSrc(
+        mInputRange.Format(mbUse3DAddresses ? ScRefFlags::RANGE_ABS_3D : ScRefFlags::RANGE_ABS,
+                           mDocument, mAddressDetails));
+
+    rLabel = ScResId(STR_INPUT_DATA_RANGE) + " : " + aDataSrc;
+    return;
+}
+
+void ScFourierAnalysisDialog::genFormula(OUString& rFormula)
+{
+    static const OUString aSep(";");
+
+    if (!mbPolar)
+    {
+        rFormula = "FOURIER(%INPUTRANGE%;" + OUString::boolean(mbGroupedByColumn) + aSep
+                   + OUString::boolean(mbInverse) + ")";
+        return;
+    }
+
+    rFormula = "FOURIER(%INPUTRANGE%;" + OUString::boolean(mbGroupedByColumn) + aSep
+               + OUString::boolean(mbInverse) + ";true;" + OUString::number(mfMinMag) + ")";
+}
+
+IMPL_LINK_NOARG(ScFourierAnalysisDialog, CheckBoxHdl, CheckBox&, void) { ValidateDialogInput(); }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/StatisticsDialogs/StatisticsInputOutputDialog.cxx b/sc/source/ui/StatisticsDialogs/StatisticsInputOutputDialog.cxx
index 7cb6e8724774..8d630ebc7e63 100644
--- a/sc/source/ui/StatisticsDialogs/StatisticsInputOutputDialog.cxx
+++ b/sc/source/ui/StatisticsDialogs/StatisticsInputOutputDialog.cxx
@@ -180,11 +180,7 @@ void ScStatisticsInputOutputDialog::SetReference( const ScRange& rReferenceRange
         }
     }
 
-    // Enable OK if both, input range and output address are set.
-    if (mInputRange.IsValid() && mOutputAddress.IsValid())
-        mpButtonOk->Enable();
-    else
-        mpButtonOk->Disable();
+    ValidateDialogInput();
 }
 
 IMPL_LINK_NOARG( ScStatisticsInputOutputDialog, OkClicked, Button*, void )
@@ -217,6 +213,8 @@ IMPL_LINK_NOARG( ScStatisticsInputOutputDialog, GroupByChanged, RadioButton&, vo
         mGroupedBy = BY_COLUMN;
     else if (mpGroupByRowsRadio->IsChecked())
         mGroupedBy = BY_ROW;
+
+    ValidateDialogInput();
 }
 
 IMPL_LINK_NOARG( ScStatisticsInputOutputDialog, RefInputModifyHandler, Edit&, void )
@@ -268,11 +266,7 @@ IMPL_LINK_NOARG( ScStatisticsInputOutputDialog, RefInputModifyHandler, Edit&, vo
         }
     }
 
-    // Enable OK if both, input range and output address are set.
-    if (mInputRange.IsValid() && mOutputAddress.IsValid())
-        mpButtonOk->Enable();
-    else
-        mpButtonOk->Disable();
+    ValidateDialogInput();
 }
 
 void ScStatisticsInputOutputDialog::CalculateInputAndWriteToOutput()
@@ -288,4 +282,18 @@ void ScStatisticsInputOutputDialog::CalculateInputAndWriteToOutput()
     pDocShell->PostPaint( aOutputRange, PaintPartFlags::Grid );
 }
 
+bool ScStatisticsInputOutputDialog::InputRangesValid()
+{
+    return mInputRange.IsValid() && mOutputAddress.IsValid();
+}
+
+void ScStatisticsInputOutputDialog::ValidateDialogInput()
+{
+    // Enable OK button if all inputs are ok.
+    if (InputRangesValid())
+        mpButtonOk->Enable();
+    else
+        mpButtonOk->Disable();
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/app/scdll.cxx b/sc/source/ui/app/scdll.cxx
index 69bf6a33d28a..59faba24ece2 100644
--- a/sc/source/ui/app/scdll.cxx
+++ b/sc/source/ui/app/scdll.cxx
@@ -227,6 +227,7 @@ void ScDLL::Init()
     ScFTestDialogWrapper                ::RegisterChildWindow(false, pMod);
     ScZTestDialogWrapper                ::RegisterChildWindow(false, pMod);
     ScChiSquareTestDialogWrapper        ::RegisterChildWindow(false, pMod);
+    ScFourierAnalysisDialogWrapper      ::RegisterChildWindow(false, pMod);
 
     // Redlining Window
     ScAcceptChgDlgWrapper       ::RegisterChildWindow(false, pMod);
diff --git a/sc/source/ui/inc/FourierAnalysisDialog.hxx b/sc/source/ui/inc/FourierAnalysisDialog.hxx
new file mode 100644
index 000000000000..14e0dbf83be4
--- /dev/null
+++ b/sc/source/ui/inc/FourierAnalysisDialog.hxx
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#ifndef INCLUDED_SC_SOURCE_UI_INC_FOURIERANALYSISDIALOG_HXX
+#define INCLUDED_SC_SOURCE_UI_INC_FOURIERANALYSISDIALOG_HXX
+
+#include "StatisticsInputOutputDialog.hxx"
+
+class ScFourierAnalysisDialog : public ScStatisticsInputOutputDialog
+{
+    VclPtr<CheckBox> mpWithLabelsCheckBox;
+    VclPtr<CheckBox> mpInverseCheckBox;
+    VclPtr<CheckBox> mpPolarCheckBox;
+    VclPtr<NumericField> mpMinMagnitudeField;
+    VclPtr<FixedText> mpErrorMessage;
+
+    ScAddress maLabelAddr;
+    ScRange maActualInputRange;
+    SCSIZE mnLen;
+
+    double mfMinMag;
+
+    bool mbUse3DAddresses : 1;
+    bool mbGroupedByColumn : 1;
+    bool mbWithLabels : 1;
+    bool mbInverse : 1;
+    bool mbPolar : 1;
+
+public:
+    ScFourierAnalysisDialog(SfxBindings* pB, SfxChildWindow* pCW, vcl::Window* pParent,
+                            ScViewData* pViewData);
+
+    virtual ~ScFourierAnalysisDialog() override;
+
+    virtual bool Close() override;
+
+protected:
+    void dispose() override;
+    virtual const char* GetUndoNameId() override;
+    virtual ScRange ApplyOutput(ScDocShell* pDocShell) override;
+    virtual bool InputRangesValid() override;
+
+private:
+    void getOptions();
+    void getDataLabel(OUString& rLabel);
+    void genFormula(OUString& rFormula);
+
+    DECL_LINK(CheckBoxHdl, CheckBox&, void);
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/StatisticsInputOutputDialog.hxx b/sc/source/ui/inc/StatisticsInputOutputDialog.hxx
index 849197e34eb5..b63ccd35c78e 100644
--- a/sc/source/ui/inc/StatisticsInputOutputDialog.hxx
+++ b/sc/source/ui/inc/StatisticsInputOutputDialog.hxx
@@ -41,6 +41,8 @@ protected:
 
     virtual ScRange ApplyOutput(ScDocShell* pDocShell) = 0;
     virtual const char* GetUndoNameId() = 0;
+    virtual bool InputRangesValid();
+    void ValidateDialogInput();
 
     // Widgets
     VclPtr<FixedText>          mpInputRangeLabel;
diff --git a/sc/source/ui/inc/reffact.hxx b/sc/source/ui/inc/reffact.hxx
index 9165fc22e62c..a49f80c0de97 100644
--- a/sc/source/ui/inc/reffact.hxx
+++ b/sc/source/ui/inc/reffact.hxx
@@ -141,6 +141,13 @@ private:
     ScChiSquareTestDialogWrapper() = delete;
 };
 
+class ScFourierAnalysisDialogWrapper :
+    public ChildWindowWrapper<SID_FOURIER_ANALYSIS_DIALOG>
+{
+private:
+    ScFourierAnalysisDialogWrapper() = delete;
+};
+
 class ScAcceptChgDlgWrapper: public SfxChildWindow
 {
     public:
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index 6cb83664879e..40cf98549757 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -1037,7 +1037,16 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
 
             }
             break;
+        case SID_FOURIER_ANALYSIS_DIALOG:
+            {
+                sal_uInt16 nId  = ScFourierAnalysisDialogWrapper::GetChildWindowId();
+                SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
+                SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
 
+                pScMod->SetRefDialog( nId, pWnd == nullptr );
+
+            }
+            break;
         case SID_SEARCH_RESULTS_DIALOG:
         {
             const SfxPoolItem* pItem = nullptr;
diff --git a/sc/source/ui/view/tabvwsh.cxx b/sc/source/ui/view/tabvwsh.cxx
index 665252f87ccb..a193d20431f4 100644
--- a/sc/source/ui/view/tabvwsh.cxx
+++ b/sc/source/ui/view/tabvwsh.cxx
@@ -100,6 +100,7 @@ void ScTabViewShell::InitInterface_Impl()
     GetStaticInterface()->RegisterChildWindow(ScFTestDialogWrapper::GetChildWindowId());
     GetStaticInterface()->RegisterChildWindow(ScZTestDialogWrapper::GetChildWindowId());
     GetStaticInterface()->RegisterChildWindow(ScChiSquareTestDialogWrapper::GetChildWindowId());
+    GetStaticInterface()->RegisterChildWindow(ScFourierAnalysisDialogWrapper::GetChildWindowId());
     GetStaticInterface()->RegisterChildWindow(ScCondFormatDlgWrapper::GetChildWindowId());
 }
 
diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx
index ad2bf5a57a77..649af1829361 100644
--- a/sc/source/ui/view/tabvwshc.cxx
+++ b/sc/source/ui/view/tabvwshc.cxx
@@ -73,6 +73,7 @@
 #include <FTestDialog.hxx>
 #include <ZTestDialog.hxx>
 #include <ChiSquareTestDialog.hxx>
+#include <FourierAnalysisDialog.hxx>
 
 #include <PivotLayoutDialog.hxx>
 
@@ -401,6 +402,12 @@ VclPtr<SfxModelessDialog> ScTabViewShell::CreateRefDialog(
         }
         break;
 
+        case SID_FOURIER_ANALYSIS_DIALOG:
+        {
+            pResult = VclPtr<ScFourierAnalysisDialog>::Create( pB, pCW, pParent, &GetViewData() );
+        }
+        break;
+
         case SID_OPENDLG_OPTSOLVER:
         {
             ScViewData& rViewData = GetViewData();
diff --git a/sc/uiconfig/scalc/menubar/menubar.xml b/sc/uiconfig/scalc/menubar/menubar.xml
index e9b93c238740..dca448df2b1a 100644
--- a/sc/uiconfig/scalc/menubar/menubar.xml
+++ b/sc/uiconfig/scalc/menubar/menubar.xml
@@ -674,6 +674,7 @@
                     <menu:menuitem menu:id=".uno:FTestDialog"/>
                     <menu:menuitem menu:id=".uno:ZTestDialog"/>
                     <menu:menuitem menu:id=".uno:ChiSquareTestDialog"/>
+                    <menu:menuitem menu:id=".uno:FourierAnalysisDialog"/>
                 </menu:menupopup>
             </menu:menu>
         </menu:menupopup>
diff --git a/sc/uiconfig/scalc/ui/fourieranalysisdialog.ui b/sc/uiconfig/scalc/ui/fourieranalysisdialog.ui
new file mode 100644
index 000000000000..6a56d3e77bb4
--- /dev/null
+++ b/sc/uiconfig/scalc/ui/fourieranalysisdialog.ui
@@ -0,0 +1,423 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sc">
+  <requires lib="gtk+" version="3.18"/>
+  <requires lib="LibreOffice" version="1.0"/>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="lower">-150</property>
+    <property name="upper">150</property>
+    <property name="value">-150</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkDialog" id="FourierAnalysisDialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <property name="title" translatable="yes" context="fourieranalysisdialog|FourierAnalysisDialog">Fourier Analysis</property>
+    <property name="resizable">False</property>
+    <property name="type_hint">dialog</property>
+    <child>
+      <placeholder/>
+    </child>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">12</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="ok">
+                <property name="label">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="cancel">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="help">
+                <property name="label">gtk-help</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+                <property name="secondary">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="framedata">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="top_padding">6</property>
+                <property name="bottom_padding">6</property>
+                <property name="left_padding">12</property>
+                <property name="right_padding">12</property>
+                <child>
+                  <object class="GtkGrid" id="grid1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="row_spacing">6</property>
+                    <property name="column_spacing">12</property>
+                    <child>
+                      <object class="GtkLabel" id="input-range-label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes" context="fourieranalysisdialog|input-range-label">Input range:</property>
+                        <property name="use_underline">True</property>
+                        <property name="mnemonic_widget">input-range-edit</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="foruilo-RefEdit" id="input-range-edit">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="valign">center</property>
+                        <property name="hexpand">True</property>
+                        <property name="width_chars">30</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="foruilo-RefButton" id="input-range-button">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="output-range-label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes" context="fourieranalysisdialog|output-range-label">Results to:</property>
+                        <property name="use_underline">True</property>
+                        <property name="mnemonic_widget">output-range-edit</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="foruilo-RefEdit" id="output-range-edit">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="valign">center</property>
+                        <property name="hexpand">True</property>
+                        <property name="width_chars">30</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="foruilo-RefButton" id="output-range-button">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="withlabels-check">
+                        <property name="label" translatable="yes" context="fourieranalysisdialog|withlabels-check">Input range has label</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="halign">start</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">2</property>
+                        <property name="width">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" context="fourieranalysisdialog|label1">Data</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkAlignment" id="alignment2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="top_padding">6</property>
+                <property name="bottom_padding">6</property>
+                <property name="left_padding">12</property>
+                <property name="right_padding">12</property>
+                <child>
+                  <object class="GtkGrid" id="grid2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="row_spacing">6</property>
+                    <property name="column_spacing">12</property>
+                    <child>
+                      <object class="GtkRadioButton" id="groupedby-columns-radio">
+                        <property name="label" translatable="yes" context="fourieranalysisdialog|groupedby-columns-radio">_Columns</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="xalign">0</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkRadioButton" id="groupedby-rows-radio">
+                        <property name="label" translatable="yes" context="fourieranalysisdialog|groupedby-rows-radio">_Rows</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                        <property name="group">groupedby-columns-radio</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" context="fourieranalysisdialog|label2">Grouped by</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkAlignment">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <object class="GtkGrid">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="margin_top">6</property>
+                    <child>
+                      <object class="GtkCheckButton" id="inverse-check">
+                        <property name="label" translatable="yes" context="fourieranalysisdialog|inverse-check">Inverse</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="halign">start</property>
+                        <property name="valign">center</property>
+                        <property name="margin_bottom">3</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="polar-check">
+                        <property name="label" translatable="yes" context="fourieranalysisdialog|polar-check">Output in polar form</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="halign">start</property>
+                        <property name="valign">center</property>
+                        <property name="margin_bottom">3</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label4">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="valign">center</property>
+                        <property name="margin_right">5</property>
+                        <property name="margin_top">4</property>
+                        <property name="label" translatable="yes" context="fourieranalysisdialog|label4">Minimum magnitude for polar form output (in dB)</property>
+                        <property name="wrap">True</property>
+                        <property name="mnemonic_widget">minmagnitude-spin</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSpinButton" id="minmagnitude-spin">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="adjustment">adjustment1</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label3">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" context="fourieranalysisdialog|label3">Options</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="error-message">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="ellipsize">end</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-5">ok</action-widget>
+      <action-widget response="-11">help</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkSizeGroup" id="sizegroup1">
+    <widgets>
+      <widget name="input-range-label"/>
+      <widget name="output-range-label"/>
+      <widget name="groupedby-columns-radio"/>
+      <widget name="groupedby-rows-radio"/>
+    </widgets>
+  </object>
+</interface>
diff --git a/sc/uiconfig/scalc/ui/notebookbar.ui b/sc/uiconfig/scalc/ui/notebookbar.ui
index ee4435c6f4ba..64dc2d982336 100644
--- a/sc/uiconfig/scalc/ui/notebookbar.ui
+++ b/sc/uiconfig/scalc/ui/notebookbar.ui
@@ -1701,6 +1701,13 @@
         <property name="action_name">.uno:ChiSquareTestDialog</property>
       </object>
     </child>
+    <child>
+      <object class="GtkMenuItem" id="MenuStatistic-FourierAnalysisDialog">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="action_name">.uno:FourierAnalysisDialog</property>
+      </object>
+    </child>
   </object>
   <object class="GtkMenu" id="MenuTools">
     <property name="visible">True</property>
diff --git a/sc/uiconfig/scalc/ui/notebookbar_compact.ui b/sc/uiconfig/scalc/ui/notebookbar_compact.ui
index 1301829c7932..53a2d1444341 100644
--- a/sc/uiconfig/scalc/ui/notebookbar_compact.ui
+++ b/sc/uiconfig/scalc/ui/notebookbar_compact.ui
@@ -1542,6 +1542,13 @@
         <property name="action_name">.uno:ChiSquareTestDialog</property>
       </object>
     </child>
+    <child>
+      <object class="GtkMenuItem" id="FourierAnalysisDialogD1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="action_name">.uno:FourierAnalysisDialog</property>
+      </object>
+    </child>
   </object>
   <object class="GtkMenu" id="MenuTools">
     <property name="visible">True</property>
diff --git a/solenv/sanitizers/ui/modules/scalc.suppr b/solenv/sanitizers/ui/modules/scalc.suppr
index 1ba13132a84e..f15bbf423067 100644
--- a/solenv/sanitizers/ui/modules/scalc.suppr
+++ b/solenv/sanitizers/ui/modules/scalc.suppr
@@ -69,6 +69,7 @@ sc/uiconfig/scalc/ui/doubledialog.ui://GtkEntry[@id='value'] no-labelled-by
 sc/uiconfig/scalc/ui/externaldata.ui://GtkTreeView[@id='ranges'] no-labelled-by
 sc/uiconfig/scalc/ui/externaldata.ui://GtkTreeViewColumn[@id='treeviewcolumn1'] no-labelled-by
 sc/uiconfig/scalc/ui/externaldata.ui://GtkLabel[@id='secondsft'] orphan-label
+sc/uiconfig/scalc/ui/fourieranalysisdialog.ui://GtkLabel[@id='error-message'] orphan-label
 sc/uiconfig/scalc/ui/functionpanel.ui://GtkComboBoxText[@id='category'] no-labelled-by
 sc/uiconfig/scalc/ui/functionpanel.ui://GtkTreeView[@id='funclist:border'] no-labelled-by
 sc/uiconfig/scalc/ui/functionpanel.ui://GtkLabel[@id='funcdesc:border'] orphan-label


More information about the Libreoffice-commits mailing list