summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu8
-rw-r--r--sc/Library_sc.mk1
-rw-r--r--sc/inc/sc.hrc4
-rw-r--r--sc/sdi/cellsh.sdi2
-rw-r--r--sc/sdi/scalc.sdi26
-rw-r--r--sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx486
-rw-r--r--sc/source/ui/app/scdll.cxx2
-rw-r--r--sc/source/ui/inc/RandomNumberGeneratorDialog.hxx85
-rw-r--r--sc/source/ui/inc/reffact.hxx2
-rw-r--r--sc/source/ui/view/cellsh.cxx1
-rw-r--r--sc/source/ui/view/cellsh1.cxx8
-rw-r--r--sc/source/ui/view/reffact.cxx5
-rw-r--r--sc/source/ui/view/tabvwsh.cxx2
-rw-r--r--sc/source/ui/view/tabvwshc.cxx9
-rw-r--r--sc/uiconfig/scalc/menubar/menubar.xml1
-rw-r--r--sc/uiconfig/scalc/ui/randomnumbergenerator.ui388
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 &amp; 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>