diff options
author | Tomaž Vajngerl <quikee@gmail.com> | 2013-07-14 22:18:14 +0200 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2013-07-14 22:25:20 +0200 |
commit | 5c05b1cabcf7f6a7f490ae6fc4bc145e75229752 (patch) | |
tree | 5b6e09c12fd96156bff012769e767790680f10e4 | |
parent | bdb0619d6f28a2b0a9636077f576265d1305ca20 (diff) |
fdo#66477 Random Number Generation added to menu>fill.
Added dialog for random number generation to fill menu into calc.
Initial implementation has uniform, uniform integer, cauchy,
bernoulli, binomial, negative binomial, chi squared and geometric
distribution. Others can quickly be added.
Change-Id: Id5c1f27462f1fe87eddedf415b9c149fb943404a
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu | 8 | ||||
-rw-r--r-- | sc/Library_sc.mk | 1 | ||||
-rw-r--r-- | sc/inc/sc.hrc | 4 | ||||
-rw-r--r-- | sc/sdi/cellsh.sdi | 2 | ||||
-rw-r--r-- | sc/sdi/scalc.sdi | 26 | ||||
-rw-r--r-- | sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx | 486 | ||||
-rw-r--r-- | sc/source/ui/app/scdll.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/inc/RandomNumberGeneratorDialog.hxx | 85 | ||||
-rw-r--r-- | sc/source/ui/inc/reffact.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/view/cellsh.cxx | 1 | ||||
-rw-r--r-- | sc/source/ui/view/cellsh1.cxx | 8 | ||||
-rw-r--r-- | sc/source/ui/view/reffact.cxx | 5 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwsh.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwshc.cxx | 9 | ||||
-rw-r--r-- | sc/uiconfig/scalc/menubar/menubar.xml | 1 | ||||
-rw-r--r-- | sc/uiconfig/scalc/ui/randomnumbergenerator.ui | 388 |
16 files changed, 1028 insertions, 2 deletions
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu index bb7cdac479ec..3df5946ffd76 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu @@ -624,6 +624,14 @@ <value xml:lang="en-US">S~eries...</value> </prop> </node> + <node oor:name=".uno:RandomNumberGeneratorDialog" oor:op="replace"> + <prop oor:name="Label" oor:type="xs:string"> + <value xml:lang="en-US">Fill R~andom Number...</value> + </prop> + <prop oor:name="ContextLabel" oor:type="xs:string"> + <value xml:lang="en-US">R~andom Number...</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 & Footers...</value> diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk index d431c3c99f95..c72a967ce97c 100644 --- a/sc/Library_sc.mk +++ b/sc/Library_sc.mk @@ -473,6 +473,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\ sc/source/ui/sidebar/CellBorderStylePopup \ sc/source/ui/sidebar/NumberFormatPropertyPanel \ sc/source/ui/sidebar/ScPanelFactory \ + sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog \ sc/source/ui/undo/areasave \ sc/source/ui/undo/refundo \ sc/source/ui/undo/target \ diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc index 5bfe3138a0fd..d16348023c90 100644 --- a/sc/inc/sc.hrc +++ b/sc/inc/sc.hrc @@ -29,7 +29,7 @@ #include "helpids.h" #define VAR_ARGS 30 // variable Parameter in scfuncs.src -#define PAIRED_VAR_ARGS (VAR_ARGS + VAR_ARGS) +#define PAIRED_VAR_ARGS (VAR_ARGS + VAR_ARGS) // areas @@ -252,6 +252,8 @@ #define SID_OPENDLG_ICONSET (SC_MESSAGE_START + 68) #define SID_OPENDLG_CONDDATE (SC_MESSAGE_START + 69) +#define SID_OPENDLG_RANDOM_NUMBER_GENERATOR (SC_MESSAGE_START + 70) + // functions diff --git a/sc/sdi/cellsh.sdi b/sc/sdi/cellsh.sdi index b889801354e0..683ddc840c48 100644 --- a/sc/sdi/cellsh.sdi +++ b/sc/sdi/cellsh.sdi @@ -147,6 +147,7 @@ interface CellSelection FID_FILL_TAB [ ExecMethod = ExecuteEdit; StateMethod = GetState; ] FID_FILL_SERIES [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ] FID_FILL_AUTO [ ExecMethod = ExecuteEdit; StateMethod = GetState; ] + SID_OPENDLG_RANDOM_NUMBER_GENERATOR [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ] SID_MARKDATAAREA [ ExecMethod = ExecuteMove; StateMethod = GetStateCursor; ] SID_MARKARRAYFORMULA [ ExecMethod = ExecuteMove; StateMethod = GetStateCursor; ] SID_SETINPUTMODE [ ExecMethod = ExecuteMove; StateMethod = GetStateCursor; ] @@ -434,4 +435,3 @@ shell ScCellShell : ScFormatShell { import Cell[Automation]; } - diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi index ddcf8d4e736f..9520604ed9fa 100644 --- a/sc/sdi/scalc.sdi +++ b/sc/sdi/scalc.sdi @@ -2942,6 +2942,32 @@ SfxVoidItem GoalSeekDialog SID_OPENDLG_SOLVE GroupId = GID_OPTIONS; ] +SfxVoidItem RandomNumberGeneratorDialog SID_OPENDLG_RANDOM_NUMBER_GENERATOR +() +[ + /* flags: */ + AutoUpdate = FALSE, + Cachable = Cachable, + FastCall = FALSE, + HasCoreId = FALSE, + HasDialog = TRUE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Synchron; + + /* config: */ + AccelConfig = TRUE, + MenuConfig = TRUE, + StatusBarConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = GID_OPTIONS; +] + + + //-------------------------------------------------------------------------- SfxVoidItem SolverDialog SID_OPENDLG_OPTSOLVER () diff --git a/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx b/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx new file mode 100644 index 000000000000..80a2da714e21 --- /dev/null +++ b/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx @@ -0,0 +1,486 @@ +/* -*- 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 "rangelst.hxx" +#include "scitems.hxx" +#include "docsh.hxx" +#include "document.hxx" +#include "uiitems.hxx" +#include "reffact.hxx" +#include "scresid.hxx" +#include "random.hxx" +#include "docfunc.hxx" +#include "globstr.hrc" +#include "sc.hrc" + +#include <boost/random.hpp> +#include <boost/random/uniform_real_distribution.hpp> +#include <boost/random/uniform_int_distribution.hpp> +#include <boost/random/binomial_distribution.hpp> +#include <boost/random/normal_distribution.hpp> +#include <boost/random/cauchy_distribution.hpp> +#include <boost/random/bernoulli_distribution.hpp> +#include <boost/random/binomial_distribution.hpp> +#include <boost/random/chi_squared_distribution.hpp> +#include <boost/random/geometric_distribution.hpp> +#include <boost/random/negative_binomial_distribution.hpp> + +#include "RandomNumberGeneratorDialog.hxx" + +#define ABS_DREF3D SCA_VALID | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE | SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE | SCA_TAB_3D + +namespace +{ + +static const sal_Int64 DIST_UNIFORM = 0; +static const sal_Int64 DIST_NORMAL = 1; +static const sal_Int64 DIST_CAUCHY = 2; +static const sal_Int64 DIST_BERNOULLI = 3; +static const sal_Int64 DIST_BINOMIAL = 4; +static const sal_Int64 DIST_CHI_SQUARED = 5; +static const sal_Int64 DIST_GEOMETRIC = 6; +static const sal_Int64 DIST_NEGATIVE_BINOMIAL = 7; +static const sal_Int64 DIST_UNIFORM_INTEGER = 8; + +static const sal_Int64 PERCISION = 10000; +static const sal_Int64 DIGITS = 4; +} + +ScRandomNumberGeneratorDialog::ScRandomNumberGeneratorDialog( + SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, ScViewData* pViewData ) : + ScAnyRefDlg ( pB, pCW, pParent, "RandomNumberGeneratorDialog", "modules/scalc/ui/randomnumbergenerator.ui" ), + mViewData ( pViewData ), + mDocument ( pViewData->GetDocument() ), + mAddressDetails ( mDocument->GetAddressConvention(), 0, 0 ), + mDialogLostFocus( false ) +{ + get(mpFtVariableCell, "cell-range-label"); + get(mpEdVariableCell, "cell-range-edit"); + mpEdVariableCell->SetReferences(this, mpFtVariableCell); + get(mpRBVariableCell, "cell-range-button"); + mpRBVariableCell->SetReferences(this, mpEdVariableCell); + + get(mpButtonOk, "ok"); + get(mpButtonApply, "apply"); + get(mpButtonCancel, "cancel"); + + get(mpParameter1Value, "parameter1-spin"); + get(mpParameter1Text, "parameter1-label"); + get(mpParameter2Value, "parameter2-spin"); + get(mpParameter2Text, "parameter2-label"); + + get(mpEnableSeed, "enable-seed-check"); + get(mpSeed, "seed-spin"); + + get(mpDistributionCombo, "distribution-combo"); + + Init(); + GetRangeFromSelection(); +} + +void ScRandomNumberGeneratorDialog::Init() +{ + mpButtonOk->SetClickHdl( LINK( this, ScRandomNumberGeneratorDialog, OkClicked ) ); + mpButtonCancel->SetClickHdl( LINK( this, ScRandomNumberGeneratorDialog, CancelClicked ) ); + mpButtonApply->SetClickHdl( LINK( this, ScRandomNumberGeneratorDialog, ApplyClicked ) ); + + Link aLink = LINK( this, ScRandomNumberGeneratorDialog, GetFocusHandler ); + mpEdVariableCell->SetGetFocusHdl( aLink ); + mpRBVariableCell->SetGetFocusHdl( aLink ); + + aLink = LINK( this, ScRandomNumberGeneratorDialog, LoseFocusHandler ); + mpEdVariableCell->SetLoseFocusHdl ( aLink ); + mpRBVariableCell->SetLoseFocusHdl ( aLink ); + + mpParameter1Value->SetModifyHdl( LINK( this, ScRandomNumberGeneratorDialog, Parameter1ValueModified )); + mpParameter2Value->SetModifyHdl( LINK( this, ScRandomNumberGeneratorDialog, Parameter2ValueModified )); + + mpDistributionCombo->SetSelectHdl( LINK( this, ScRandomNumberGeneratorDialog, DistributionChanged )); + + mpEnableSeed->SetToggleHdl( LINK( this, ScRandomNumberGeneratorDialog, SeedCheckChanged )); + + mpParameter1Value->SetMin( SAL_MIN_INT64 ); + mpParameter1Value->SetMax( SAL_MAX_INT64 ); + mpParameter2Value->SetMin( SAL_MIN_INT64 ); + mpParameter2Value->SetMax( SAL_MAX_INT64 ); + + DistributionChanged(NULL); + SeedCheckChanged(NULL); +} + +void ScRandomNumberGeneratorDialog::GetRangeFromSelection() +{ + String aCurrentString; + + SCCOL nStartCol = 0; + SCROW nStartRow = 0; + SCTAB nStartTab = 0; + SCCOL nEndCol = 0; + SCROW nEndRow = 0; + SCTAB nEndTab = 0; + + mViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab, + nEndCol, nEndRow, nEndTab ); + + mCurrentRange = ScRange( ScAddress( nStartCol, nStartRow, nStartTab ), + ScAddress( nEndCol, nEndRow, nEndTab ) ); + + mCurrentRange.Format( aCurrentString, ABS_DREF3D, mDocument, mAddressDetails ); + + mpEdVariableCell->SetText( aCurrentString ); +} + + +ScRandomNumberGeneratorDialog::~ScRandomNumberGeneratorDialog() +{ +} + +void ScRandomNumberGeneratorDialog::SetActive() +{ + if ( mDialogLostFocus ) + { + mDialogLostFocus = false; + if( mpEdVariableCell ) + mpEdVariableCell->GrabFocus(); + } + else + { + GrabFocus(); + } + RefInputDone(); +} + +sal_Bool ScRandomNumberGeneratorDialog::Close() +{ + return DoClose( ScRandomNumberGeneratorDialogWrapper::GetChildWindowId() ); +} + +void ScRandomNumberGeneratorDialog::SetReference( const ScRange& rReferenceRange, ScDocument* pDocument ) +{ + if ( mpEdVariableCell->IsEnabled() ) + { + if ( rReferenceRange.aStart != rReferenceRange.aEnd ) + RefInputStart( mpEdVariableCell ); + + mCurrentRange = rReferenceRange; + + String aReferenceString; + mCurrentRange.Format( aReferenceString, ABS_DREF3D, pDocument, mAddressDetails ); + mpEdVariableCell->SetRefString( aReferenceString ); + } +} + +void ScRandomNumberGeneratorDialog::SelectGeneratorAndGenerateNumbers() +{ + sal_Int16 aSelectedIndex = mpDistributionCombo-> GetSelectEntryPos(); + sal_Int64 aSelectedId = (sal_Int64) mpDistributionCombo->GetEntryData(aSelectedIndex); + + sal_uInt32 seedValue; + + if( mpEnableSeed->IsChecked() ) + { + seedValue = mpSeed->GetValue(); + } + else + { + TimeValue now; + osl_getSystemTime(&now); + seedValue = now.Nanosec; + } + + boost::mt19937 seed(seedValue); + + sal_Int64 parameterInteger1 = mpParameter1Value->GetValue(); + sal_Int64 parameterInteger2 = mpParameter2Value->GetValue(); + + double parameter1 = parameterInteger1 / static_cast<double>(PERCISION); + double parameter2 = parameterInteger2 / static_cast<double>(PERCISION); + + switch(aSelectedId) + { + case DIST_UNIFORM: + { + boost::random::uniform_real_distribution<> distribution(parameter1, parameter2); + boost::variate_generator<boost::mt19937&, boost::random::uniform_real_distribution<> > rng(seed, distribution); + GenerateNumbers(rng, OUString("Uniform Real")); + break; + } + case DIST_UNIFORM_INTEGER: + { + boost::random::uniform_int_distribution<> distribution(parameterInteger1, parameterInteger2); + boost::variate_generator<boost::mt19937&, boost::random::uniform_int_distribution<> > rng(seed, distribution); + GenerateNumbers(rng, OUString("Uniform Integer")); + break; + } + case DIST_NORMAL: + { + boost::random::normal_distribution<> distribution(parameter1, parameter2); + boost::variate_generator<boost::mt19937&, boost::random::normal_distribution<> > rng(seed, distribution); + GenerateNumbers(rng, OUString("Normal")); + break; + } + case DIST_CAUCHY: + { + boost::random::cauchy_distribution<> distribution(parameter1); + boost::variate_generator<boost::mt19937&, boost::random::cauchy_distribution<> > rng(seed, distribution); + GenerateNumbers(rng, OUString("Cauchy")); + break; + } + case DIST_BERNOULLI: + { + boost::random::bernoulli_distribution<> distribution(parameter1); + boost::variate_generator<boost::mt19937&, boost::random::bernoulli_distribution<> > rng(seed, distribution); + GenerateNumbers(rng, OUString("Bernoulli")); + break; + } + case DIST_BINOMIAL: + { + boost::random::binomial_distribution<> distribution(parameterInteger2, parameter1); + boost::variate_generator<boost::mt19937&, boost::random::binomial_distribution<> > rng(seed, distribution); + GenerateNumbers(rng, OUString("Binomial")); + break; + } + case DIST_NEGATIVE_BINOMIAL: + { + boost::random::negative_binomial_distribution<> distribution(parameterInteger2, parameter1); + boost::variate_generator<boost::mt19937&, boost::random::negative_binomial_distribution<> > rng(seed, distribution); + GenerateNumbers(rng, OUString("Negative Binomial")); + break; + } + case DIST_CHI_SQUARED: + { + boost::random::chi_squared_distribution<> distribution(parameter1); + boost::variate_generator<boost::mt19937&, boost::random::chi_squared_distribution<> > rng(seed, distribution); + GenerateNumbers(rng, OUString("Chi Squared")); + break; + } + case DIST_GEOMETRIC: + { + boost::random::geometric_distribution<> distribution(parameter1); + boost::variate_generator<boost::mt19937&, boost::random::geometric_distribution<> > rng(seed, distribution); + GenerateNumbers(rng, OUString("Geometric")); + break; + } + } +} + +template<class RNG> +void ScRandomNumberGeneratorDialog::GenerateNumbers(RNG randomGenerator, OUString aDistributionName) +{ + OUString aUndo("Random ("); + aUndo += aDistributionName; + aUndo += ")"; + ScDocShell* pDocShell = mViewData->GetDocShell(); + svl::IUndoManager* pUndoManager = pDocShell->GetUndoManager(); + pUndoManager->EnterListAction( aUndo, aUndo ); + + SCROW nRowStart = mCurrentRange.aStart.Row(); + SCROW nRowEnd = mCurrentRange.aEnd.Row(); + SCCOL nColStart = mCurrentRange.aStart.Col(); + SCCOL nColEnd = mCurrentRange.aEnd.Col(); + SCTAB nTabStart = mCurrentRange.aStart.Tab(); + SCTAB nTabEnd = mCurrentRange.aEnd.Tab(); + + for (SCROW nTab = nTabStart; nTab <= nTabEnd; nTab++) + { + for (SCROW nRow = nRowStart; nRow <= nRowEnd; nRow++) + { + for (SCCOL nCol = nColStart; nCol <= nColEnd; nCol++) + { + pDocShell->GetDocFunc().SetValueCell(ScAddress(nCol, nRow, nTab), randomGenerator(), true); + } + } + } + + pUndoManager->LeaveListAction(); + + pDocShell->PostPaint( mCurrentRange, PAINT_GRID ); +} + +IMPL_LINK( ScRandomNumberGeneratorDialog, OkClicked, PushButton*, /*pButton*/ ) +{ + SelectGeneratorAndGenerateNumbers(); + Close(); + return 0; +} + + +IMPL_LINK( ScRandomNumberGeneratorDialog, ApplyClicked, PushButton*, /*pButton*/ ) +{ + SelectGeneratorAndGenerateNumbers(); + return 0; +} + +IMPL_LINK( ScRandomNumberGeneratorDialog, CancelClicked, PushButton*, /*pButton*/ ) +{ + Close(); + return 0; +} + +IMPL_LINK( ScRandomNumberGeneratorDialog, GetFocusHandler, Control*, pCtrl ) +{ + Edit* pEdit = NULL; + + if( (pCtrl == (Control*)mpEdVariableCell) || (pCtrl == (Control*)mpRBVariableCell) ) + pEdit = mpEdVariableCell; + + if( pEdit ) + pEdit->SetSelection( Selection( 0, SELECTION_MAX ) ); + + return 0; +} + +IMPL_LINK_NOARG(ScRandomNumberGeneratorDialog, LoseFocusHandler) +{ + mDialogLostFocus = !IsActive(); + return 0; +} + +IMPL_LINK_NOARG(ScRandomNumberGeneratorDialog, Parameter1ValueModified) +{ + sal_Int16 aSelectedIndex = mpDistributionCombo-> GetSelectEntryPos(); + sal_Int64 aSelectedId = (sal_Int64) mpDistributionCombo->GetEntryData(aSelectedIndex); + if (aSelectedId == DIST_UNIFORM || + aSelectedId == DIST_UNIFORM_INTEGER) + { + sal_Int64 min = mpParameter1Value->GetValue(); + sal_Int64 max = mpParameter2Value->GetValue(); + if(min > max) + { + mpParameter2Value->SetValue(min); + } + } + return 0; +} + +IMPL_LINK_NOARG(ScRandomNumberGeneratorDialog, Parameter2ValueModified) +{ + sal_Int16 aSelectedIndex = mpDistributionCombo-> GetSelectEntryPos(); + sal_Int64 aSelectedId = (sal_Int64) mpDistributionCombo->GetEntryData(aSelectedIndex); + if (aSelectedId == DIST_UNIFORM || + aSelectedId == DIST_UNIFORM_INTEGER) + { + sal_Int64 min = mpParameter1Value->GetValue(); + sal_Int64 max = mpParameter2Value->GetValue(); + if(min > max) + { + mpParameter1Value->SetValue(max); + } + } + return 0; +} + +IMPL_LINK_NOARG(ScRandomNumberGeneratorDialog, SeedCheckChanged) +{ + mpSeed->Enable(mpEnableSeed->IsChecked()); + return 0; +} + +IMPL_LINK_NOARG(ScRandomNumberGeneratorDialog, DistributionChanged) +{ + sal_Int16 aSelectedIndex = mpDistributionCombo-> GetSelectEntryPos(); + sal_Int64 aSelectedId = (sal_Int64) mpDistributionCombo->GetEntryData(aSelectedIndex); + + mpParameter1Value->SetMin( SAL_MIN_INT64 ); + mpParameter1Value->SetMax( SAL_MAX_INT64 ); + mpParameter2Value->SetMin( SAL_MIN_INT64 ); + mpParameter2Value->SetMax( SAL_MAX_INT64 ); + + mpParameter1Value->SetDecimalDigits(DIGITS); + mpParameter1Value->SetSpinSize(PERCISION); + + mpParameter2Value->SetDecimalDigits(DIGITS); + mpParameter2Value->SetSpinSize(PERCISION); + + switch(aSelectedId) + { + case DIST_UNIFORM: + { + mpParameter1Text->SetText(OUString("Minimum")); + mpParameter2Text->SetText(OUString("Maximum")); + mpParameter2Text->Show(); + mpParameter2Value->Show(); + break; + } + case DIST_UNIFORM_INTEGER: + { + mpParameter1Text->SetText(OUString("Minimum")); + mpParameter1Value->SetDecimalDigits(0); + mpParameter1Value->SetSpinSize(1); + + mpParameter2Text->SetText(OUString("Maximum")); + mpParameter2Value->SetDecimalDigits(0); + mpParameter2Value->SetSpinSize(1); + + mpParameter2Text->Show(); + mpParameter2Value->Show(); + break; + } + case DIST_NORMAL: + { + mpParameter1Text->SetText(OUString("Mean")); + mpParameter2Text->SetText(OUString("Standard Deviation")); + mpParameter2Text->Show(); + mpParameter2Value->Show(); + break; + } + case DIST_CAUCHY: + { + mpParameter1Text->SetText(OUString("Median")); + mpParameter2Text->SetText(OUString("Sigma")); + mpParameter2Text->Show(); + mpParameter2Value->Show(); + break; + } + case DIST_BERNOULLI: + case DIST_GEOMETRIC: + { + mpParameter1Text->SetText(OUString("p Value")); + mpParameter1Value->SetMin( 0 ); + mpParameter1Value->SetMax( PERCISION ); + mpParameter1Value->SetSpinSize(1000); + + mpParameter2Text->Hide(); + mpParameter2Value->Hide(); + break; + } + case DIST_BINOMIAL: + case DIST_NEGATIVE_BINOMIAL: + { + mpParameter1Text->SetText(OUString("p Value")); + mpParameter1Value->SetMin( 0 ); + mpParameter1Value->SetMax( PERCISION ); + mpParameter1Value->SetSpinSize(1000); + + mpParameter2Text->SetText(OUString("Number Of Trials")); + mpParameter2Text->Show(); + mpParameter2Value->Show(); + mpParameter2Value->SetDecimalDigits(0); + mpParameter2Value->SetSpinSize(1); + break; + } + case DIST_CHI_SQUARED: + { + mpParameter1Text->SetText(OUString("nu Value")); + + mpParameter2Text->Hide(); + mpParameter2Value->Hide(); + break; + } + } + return 0; +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/app/scdll.cxx b/sc/source/ui/app/scdll.cxx index b31a45e74874..553399fe2903 100644 --- a/sc/source/ui/app/scdll.cxx +++ b/sc/source/ui/app/scdll.cxx @@ -270,6 +270,8 @@ void ScDLL::Init() ScColRowNameRangesDlgWrapper::RegisterChildWindow(false, pMod); ScFormulaDlgWrapper ::RegisterChildWindow(false, pMod); + ScRandomNumberGeneratorDialogWrapper::RegisterChildWindow(false, pMod); + // First docking Window for Calc ScFunctionChildWindow ::RegisterChildWindow(false, pMod); diff --git a/sc/source/ui/inc/RandomNumberGeneratorDialog.hxx b/sc/source/ui/inc/RandomNumberGeneratorDialog.hxx new file mode 100644 index 000000000000..1f5ea8018bc9 --- /dev/null +++ b/sc/source/ui/inc/RandomNumberGeneratorDialog.hxx @@ -0,0 +1,85 @@ +/* -*- 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 RANDOM_NUMBER_GENERATION_HXX +#define RANDOM_NUMBER_GENERATION_HXX + +#include "global.hxx" +#include "address.hxx" +#include "anyrefdg.hxx" + + +#include <vcl/fixed.hxx> +#include <vcl/group.hxx> +#include <vcl/lstbox.hxx> + +class ScRandomNumberGeneratorDialog : public ScAnyRefDlg +{ +public: + ScRandomNumberGeneratorDialog( + SfxBindings* pB, SfxChildWindow* pCW, + Window* pParent, ScViewData* pViewData ); + + virtual ~ScRandomNumberGeneratorDialog(); + + virtual void SetReference( const ScRange& rRef, ScDocument* pDoc ); + virtual void SetActive(); + virtual sal_Bool Close(); + +private: + // Widgets + FixedText* mpFtVariableCell; + formula::RefEdit* mpEdVariableCell; + formula::RefButton* mpRBVariableCell; + ListBox* mpDistributionCombo; + FixedText* mpParameter1Text; + NumericField* mpParameter1Value; + FixedText* mpParameter2Text; + NumericField* mpParameter2Value; + NumericField* mpSeed; + CheckBox* mpEnableSeed; + PushButton* mpButtonApply; + OKButton* mpButtonOk; + CancelButton* mpButtonCancel; + + // Data + ScViewData* mViewData; + ScDocument* mDocument; + + ScRange mCurrentRange; + ScAddress::Details mAddressDetails; + + bool mDialogLostFocus; + + void Init(); + void GetRangeFromSelection(); + + template<class RNG> + void GenerateNumbers(RNG randomGenerator, OUString aDistributionName); + + void SelectGeneratorAndGenerateNumbers(); + + DECL_LINK( OkClicked, PushButton* ); + DECL_LINK( CancelClicked, PushButton* ); + DECL_LINK( ApplyClicked, PushButton* ); + DECL_LINK( GetFocusHandler, Control* ); + DECL_LINK( LoseFocusHandler, void* ); + + DECL_LINK( Parameter1ValueModified, void* ); + DECL_LINK( Parameter2ValueModified, void* ); + DECL_LINK( DistributionChanged, void* ); + DECL_LINK( SeedCheckChanged, void* ); + +}; + +#endif // SC_SOLVRDLG_HXX + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/inc/reffact.hxx b/sc/source/ui/inc/reffact.hxx index 215836c39876..aa94ff1108eb 100644 --- a/sc/source/ui/inc/reffact.hxx +++ b/sc/source/ui/inc/reffact.hxx @@ -50,6 +50,8 @@ DECL_WRAPPER_WITHID(ScColRowNameRangesDlgWrapper) DECL_WRAPPER_WITHID(ScFormulaDlgWrapper) DECL_WRAPPER_WITHID(ScHighlightChgDlgWrapper) +DECL_WRAPPER_WITHID(ScRandomNumberGeneratorDialogWrapper) + class ScAcceptChgDlgWrapper: public SfxChildWindow { public: diff --git a/sc/source/ui/view/cellsh.cxx b/sc/source/ui/view/cellsh.cxx index 9431b90729ed..05d55f4dee3e 100644 --- a/sc/source/ui/view/cellsh.cxx +++ b/sc/source/ui/view/cellsh.cxx @@ -171,6 +171,7 @@ void ScCellShell::GetBlockState( SfxItemSet& rSet ) } break; case FID_FILL_SERIES: // fill block + case SID_OPENDLG_RANDOM_NUMBER_GENERATOR: case SID_OPENDLG_TABOP: // multiple-cell operations, are at least 2 cells marked? if (pDoc->GetChangeTrack()!=NULL &&nWhich ==SID_OPENDLG_TABOP) bDisable = sal_True; diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx index 23bbec0b5501..daac7ec9ca4b 100644 --- a/sc/source/ui/view/cellsh1.cxx +++ b/sc/source/ui/view/cellsh1.cxx @@ -903,7 +903,15 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) } } break; + case SID_OPENDLG_RANDOM_NUMBER_GENERATOR: + { + sal_uInt16 nId = ScRandomNumberGeneratorDialogWrapper::GetChildWindowId(); + SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); + SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); + pScMod->SetRefDialog( nId, pWnd ? false : sal_True ); + } + break; // // disposal (Outlines) // SID_AUTO_OUTLINE, SID_OUTLINE_DELETEALL in Execute (in docsh.idl) diff --git a/sc/source/ui/view/reffact.cxx b/sc/source/ui/view/reffact.cxx index 687b5271c71b..cf7e796af408 100644 --- a/sc/source/ui/view/reffact.cxx +++ b/sc/source/ui/view/reffact.cxx @@ -50,6 +50,9 @@ SFX_IMPL_MODELESSDIALOG_WITHID(ScFormulaDlgWrapper, SID_OPENDLG_FUNCTION ) SFX_IMPL_MODELESSDIALOG_WITHID(ScAcceptChgDlgWrapper, FID_CHG_ACCEPT ) SFX_IMPL_MODELESSDIALOG_WITHID(ScHighlightChgDlgWrapper, FID_CHG_SHOW ) SFX_IMPL_MODELESSDIALOG_WITHID(ScSimpleRefDlgWrapper, WID_SIMPLE_REF ) + +SFX_IMPL_MODELESSDIALOG_WITHID(ScRandomNumberGeneratorDialogWrapper, SID_OPENDLG_RANDOM_NUMBER_GENERATOR ) + SFX_IMPL_CHILDWINDOW_WITHID(ScValidityRefChildWin, SID_VALIDITY_REFERENCE) SfxChildWinInfo ScValidityRefChildWin::GetInfo() const @@ -177,6 +180,8 @@ IMPL_CHILD_CTOR( ScPrintAreasDlgWrapper, SID_OPENDLG_EDIT_PRINTAREA ) IMPL_CHILD_CTOR( ScFormulaDlgWrapper, SID_OPENDLG_FUNCTION ) +IMPL_CHILD_CTOR( ScRandomNumberGeneratorDialogWrapper, SID_OPENDLG_RANDOM_NUMBER_GENERATOR ) + //------------------------------------------------------------------------- // ScSimpleRefDlgWrapper //------------------------------------------------------------------------- diff --git a/sc/source/ui/view/tabvwsh.cxx b/sc/source/ui/view/tabvwsh.cxx index 7949e1776b78..c53bf66f0e84 100644 --- a/sc/source/ui/view/tabvwsh.cxx +++ b/sc/source/ui/view/tabvwsh.cxx @@ -80,6 +80,8 @@ SFX_IMPL_INTERFACE(ScTabViewShell,SfxViewShell,ScResId(SCSTR_TABVIEWSHELL)) SFX_CHILDWINDOW_REGISTRATION(GalleryChildWindow::GetChildWindowId()); SFX_CHILDWINDOW_REGISTRATION(ScSpellDialogChildWindow::GetChildWindowId()); SFX_CHILDWINDOW_REGISTRATION(ScValidityRefChildWin::GetChildWindowId()); + + SFX_CHILDWINDOW_REGISTRATION(ScRandomNumberGeneratorDialogWrapper::GetChildWindowId()); } SFX_IMPL_NAMED_VIEWFACTORY( ScTabViewShell, "Default" ) diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx index f8e7763d35ad..a613c77b30d8 100644 --- a/sc/source/ui/view/tabvwshc.cxx +++ b/sc/source/ui/view/tabvwshc.cxx @@ -61,6 +61,8 @@ #include "condformatdlg.hxx" #include "xmlsourcedlg.hxx" +#include "RandomNumberGeneratorDialog.hxx" + //------------------------------------------------------------------ void ScTabViewShell::SetCurRefDlgId( sal_uInt16 nNew ) @@ -311,6 +313,13 @@ SfxModelessDialog* ScTabViewShell::CreateRefDialog( } break; + case SID_OPENDLG_RANDOM_NUMBER_GENERATOR: + { + ScViewData* pViewData = GetViewData(); + pResult = new ScRandomNumberGeneratorDialog( pB, pCW, pParent, pViewData ); + } + break; + case SID_OPENDLG_OPTSOLVER: { ScViewData* pViewData = GetViewData(); diff --git a/sc/uiconfig/scalc/menubar/menubar.xml b/sc/uiconfig/scalc/menubar/menubar.xml index 6b29652d83aa..428b52cf5e73 100644 --- a/sc/uiconfig/scalc/menubar/menubar.xml +++ b/sc/uiconfig/scalc/menubar/menubar.xml @@ -99,6 +99,7 @@ <menu:menuitem menu:id=".uno:FillLeft"/> <menu:menuitem menu:id=".uno:FillTable"/> <menu:menuitem menu:id=".uno:FillSeries"/> + <menu:menuitem menu:id=".uno:RandomNumberGeneratorDialog"/> </menu:menupopup> </menu:menu> <menu:menuitem menu:id=".uno:Delete"/> diff --git a/sc/uiconfig/scalc/ui/randomnumbergenerator.ui b/sc/uiconfig/scalc/ui/randomnumbergenerator.ui new file mode 100644 index 000000000000..fa0554054220 --- /dev/null +++ b/sc/uiconfig/scalc/ui/randomnumbergenerator.ui @@ -0,0 +1,388 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <!-- interface-requires gtk+ 3.0 --> + <!-- interface-requires LibreOffice 1.0 --> + <object class="GtkAdjustment" id="parameter1-adjustment"> + <property name="upper">100</property> + <property name="value">1</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkListStore" id="distribution-liststore"> + <columns> + <!-- column-name value --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gint"/> + </columns> + <data> + <row> + <col id="0" translatable="yes">Uniform</col> + <col id="1">0</col> + </row> + <row> + <col id="0" translatable="yes">Uniform Integer</col> + <col id="1">8</col> + </row> + <row> + <col id="0" translatable="yes">Normal</col> + <col id="1">1</col> + </row> + <row> + <col id="0" translatable="yes">Cauchy</col> + <col id="1">2</col> + </row> + <row> + <col id="0" translatable="yes">Bernoulli</col> + <col id="1">3</col> + </row> + <row> + <col id="0" translatable="yes">Binomial</col> + <col id="1">4</col> + </row> + <row> + <col id="0" translatable="yes">Chi Squared</col> + <col id="1">5</col> + </row> + <row> + <col id="0" translatable="yes">Geometric</col> + <col id="1">6</col> + </row> + <row> + <col id="0" translatable="yes">Negative Binomial</col> + <col id="1">7</col> + </row> + </data> + </object> + <object class="GtkAdjustment" id="parameter2-adjustment"> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkDialog" id="RandomNumberGeneratorDialog"> + <property name="can_focus">False</property> + <property name="border_width">5</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">2</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="apply"> + <property name="label">gtk-apply</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="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">1</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="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> + </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="frame1"> + <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="left_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="cell-range-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Cell Range</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="foruilo-RefEdit" id="cell-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="invisible_char">•</property> + <property name="invisible_char_set">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="foruilo-RefButton" id="cell-range-button"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="distribution-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Distribution</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="distribution-combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="model">distribution-liststore</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + <property name="width">2</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="seed-spin"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="invisible_char">•</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + <property name="width">2</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="seed-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Seed</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + <property name="width">1</property> + <property name="height">1</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">in</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="GtkLabel" id="parameter1-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">...</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="parameter2-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">...</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="parameter1-spin"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">True</property> + <property name="adjustment">parameter2-adjustment</property> + <property name="digits">4</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="parameter2-spin"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">True</property> + <property name="adjustment">parameter1-adjustment</property> + <property name="digits">4</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </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">Parameters</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">4</property> + <property name="width">3</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="enable-seed-check"> + <property name="label" translatable="yes">Enable Custom Seed</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="receives_default">False</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">3</property> + <property name="height">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="rng-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Random Number Generator</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="0">apply</action-widget> + <action-widget response="0">ok</action-widget> + <action-widget response="0">cancel</action-widget> + </action-widgets> + </object> +</interface> |