tdf#154872 Add Poisson distribution to Random Number Generators

Change-Id: I325a76423a98a405dfb0f69fbd89eb9253c36390
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151439
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
diff --git a/sc/inc/strings.hrc b/sc/inc/strings.hrc
index e860263..6c85b3d 100644
--- a/sc/inc/strings.hrc
+++ b/sc/inc/strings.hrc
@@ -266,9 +266,10 @@
#define STR_DISTRIBUTION_CAUCHY                     NC_("STR_DISTRIBUTION_CAUCHY", "Cauchy")
#define STR_DISTRIBUTION_BERNOULLI                  NC_("STR_DISTRIBUTION_BERNOULLI", "Bernoulli")
#define STR_DISTRIBUTION_BINOMIAL                   NC_("STR_DISTRIBUTION_BINOMIAL", "Binomial")
#define STR_DISTRIBUTION_NEGATIVE_BINOMIAL          NC_("STR_DISTRIBUTION_NEGATIVE_BINOMIAL", "Negative Binomial")
#define STR_DISTRIBUTION_CHI_SQUARED                NC_("STR_DISTRIBUTION_CHI_SQUARED", "Chi Squared")
#define STR_DISTRIBUTION_GEOMETRIC                  NC_("STR_DISTRIBUTION_GEOMETRIC", "Geometric")
#define STR_DISTRIBUTION_NEGATIVE_BINOMIAL          NC_("STR_DISTRIBUTION_NEGATIVE_BINOMIAL", "Negative Binomial")
#define STR_DISTRIBUTION_POISSON                    NC_("STR_DISTRIBUTION_POISSON", "Poisson")
#define STR_RNG_PARAMETER_MINIMUM                   NC_("STR_RNG_PARAMETER_MINIMUM", "Minimum")
#define STR_RNG_PARAMETER_MAXIMUM                   NC_("STR_RNG_PARAMETER_MAXIMUM", "Maximum")
#define STR_RNG_PARAMETER_MEAN                      NC_("STR_RNG_PARAMETER_MEAN", "Mean")
diff --git a/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx b/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx
index 91b43cb..2490ebf 100644
--- a/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx
+++ b/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx
@@ -36,6 +36,7 @@ const sal_Int64 DIST_CHI_SQUARED         = 5;
const sal_Int64 DIST_GEOMETRIC           = 6;
const sal_Int64 DIST_NEGATIVE_BINOMIAL   = 7;
const sal_Int64 DIST_UNIFORM_INTEGER     = 8;
const sal_Int64 DIST_POISSON             = 9;

const sal_Int64 PRECISION   = 10000;
const sal_Int64 DIGITS      = 4;
@@ -225,13 +226,6 @@ void ScRandomNumberGeneratorDialog::SelectGeneratorAndGenerateNumbers()
            GenerateNumbers(rng, STR_DISTRIBUTION_BINOMIAL, aDecimalPlaces);
            break;
        }
        case DIST_NEGATIVE_BINOMIAL:
        {
            std::negative_binomial_distribution<> distribution(parameterInteger2, parameter1);
            auto rng = std::bind(distribution, seed);
            GenerateNumbers(rng, STR_DISTRIBUTION_NEGATIVE_BINOMIAL, aDecimalPlaces);
            break;
        }
        case DIST_CHI_SQUARED:
        {
            std::chi_squared_distribution<> distribution(parameter1);
@@ -246,6 +240,20 @@ void ScRandomNumberGeneratorDialog::SelectGeneratorAndGenerateNumbers()
            GenerateNumbers(rng, STR_DISTRIBUTION_GEOMETRIC, aDecimalPlaces);
            break;
        }
        case DIST_NEGATIVE_BINOMIAL:
        {
            std::negative_binomial_distribution<> distribution(parameterInteger2, parameter1);
            auto rng = std::bind(distribution, seed);
            GenerateNumbers(rng, STR_DISTRIBUTION_NEGATIVE_BINOMIAL, aDecimalPlaces);
            break;
        }
        case DIST_POISSON:
        {
            std::poisson_distribution<> distribution(parameter1);
            auto rng = std::bind(distribution, seed);
            GenerateNumbers(rng, STR_DISTRIBUTION_POISSON, aDecimalPlaces);
            break;
        }
    }
}

@@ -476,6 +484,16 @@ IMPL_LINK_NOARG(ScRandomNumberGeneratorDialog, DistributionChanged, weld::ComboB
            mxParameter2Value->hide();
            break;
        }
        case DIST_POISSON:
        {
            mxParameter1Text->set_label(ScResId(STR_RNG_PARAMETER_MEAN));
            mxParameter1Value->set_value(PRECISION);
            mxParameter1Value->set_increments(1000, 10000);
            mxParameter1Value->set_min(1000);
            mxParameter2Text->hide();
            mxParameter2Value->hide();
            break;
        }
    }
}

diff --git a/sc/uiconfig/scalc/ui/randomnumbergenerator.ui b/sc/uiconfig/scalc/ui/randomnumbergenerator.ui
index e6f8f93..d948104 100644
--- a/sc/uiconfig/scalc/ui/randomnumbergenerator.ui
+++ b/sc/uiconfig/scalc/ui/randomnumbergenerator.ui
@@ -240,6 +240,7 @@
                      <item id="5" translatable="yes" context="randomnumbergenerator|distribution-liststore">Chi Squared</item>
                      <item id="6" translatable="yes" context="randomnumbergenerator|distribution-liststore">Geometric</item>
                      <item id="7" translatable="yes" context="randomnumbergenerator|distribution-liststore">Negative Binomial</item>
                      <item id="9" translatable="yes" context="randomnumbergenerator|distribution-liststore">Poisson</item>
                    </items>
                    <child internal-child="accessible">
                      <object class="AtkObject" id="distribution-combo-atkobject">