diff options
-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> |