From 7397f8b78c655b5c8bc721834e12c35ef14b6b2b Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Fri, 22 Jul 2022 16:08:27 +0300 Subject: [PATCH 001/122] Added Extremes Parameters --- instat/sdgExtremesMethod.Designer.vb | 616 +++++++++++++++++++++++++-- 1 file changed, 583 insertions(+), 33 deletions(-) diff --git a/instat/sdgExtremesMethod.Designer.vb b/instat/sdgExtremesMethod.Designer.vb index 637c0356615..df6caf98049 100644 --- a/instat/sdgExtremesMethod.Designer.vb +++ b/instat/sdgExtremesMethod.Designer.vb @@ -22,22 +22,298 @@ Partial Class sdgExtremesMethod 'Do not modify it using the code editor. _ Private Sub InitializeComponent() + Me.ucrBase = New instat.ucrButtonsSubdialogue() + Me.ucrPanelExtreme = New instat.UcrPanel() + Me.tbRegOptions = New System.Windows.Forms.TabControl() + Me.tbFitMethod = New System.Windows.Forms.TabPage() + Me.grpInitialValues = New System.Windows.Forms.GroupBox() + Me.ucrNudIterations = New instat.ucrNud() + Me.lblNumberOfIterations = New System.Windows.Forms.Label() + Me.ucrNudLocationPrior = New instat.ucrNud() + Me.ucrNudScalePrior = New instat.ucrNud() + Me.ucrNudShapePrior = New instat.ucrNud() + Me.ucrNudLocationInitial = New instat.ucrNud() + Me.ucrNudScaleInitial = New instat.ucrNud() + Me.ucrNudShapeInitial = New instat.ucrNud() + Me.lblLocationInitial = New System.Windows.Forms.Label() + Me.lblScaleInitial = New System.Windows.Forms.Label() + Me.lblShapeInitial = New System.Windows.Forms.Label() + Me.lblLocationPrior = New System.Windows.Forms.Label() + Me.lblScalePrior = New System.Windows.Forms.Label() + Me.lblShapePrior = New System.Windows.Forms.Label() Me.rdoLmoments = New System.Windows.Forms.RadioButton() Me.rdoBayesian = New System.Windows.Forms.RadioButton() Me.rdoGMLE = New System.Windows.Forms.RadioButton() Me.rdoMLE = New System.Windows.Forms.RadioButton() - Me.ucrBase = New instat.ucrButtonsSubdialogue() - Me.ucrPanelExtreme = New instat.UcrPanel() + Me.grpPriorParameters = New System.Windows.Forms.GroupBox() + Me.tbDisplayOptions = New System.Windows.Forms.TabPage() + Me.ucrSavePlots = New instat.ucrSave() + Me.grpPlots = New System.Windows.Forms.GroupBox() + Me.rdoNoPlot = New System.Windows.Forms.RadioButton() + Me.rdoTrace = New System.Windows.Forms.RadioButton() + Me.rdoRlplot = New System.Windows.Forms.RadioButton() + Me.rdoHist = New System.Windows.Forms.RadioButton() + Me.rdoDensity = New System.Windows.Forms.RadioButton() + Me.rdoZPlot = New System.Windows.Forms.RadioButton() + Me.rdoProbprob = New System.Windows.Forms.RadioButton() + Me.rdoQQPlot = New System.Windows.Forms.RadioButton() + Me.rdoQQ2 = New System.Windows.Forms.RadioButton() + Me.rdoPrimary = New System.Windows.Forms.RadioButton() + Me.ucrPnlExtreme = New instat.UcrPanel() + Me.tbConfidenceInterval = New System.Windows.Forms.TabPage() + Me.lblReturnLevel = New System.Windows.Forms.Label() + Me.ucrNudReturnLevel = New instat.ucrNud() + Me.ucrInputType = New instat.ucrInputComboBox() + Me.ucrChkType = New instat.ucrCheck() + Me.tbRegOptions.SuspendLayout() + Me.tbFitMethod.SuspendLayout() + Me.tbDisplayOptions.SuspendLayout() + Me.grpPlots.SuspendLayout() + Me.tbConfidenceInterval.SuspendLayout() Me.SuspendLayout() ' + 'ucrBase + ' + Me.ucrBase.AutoSize = True + Me.ucrBase.Location = New System.Drawing.Point(9, 518) + Me.ucrBase.Margin = New System.Windows.Forms.Padding(6) + Me.ucrBase.Name = "ucrBase" + Me.ucrBase.Size = New System.Drawing.Size(336, 45) + Me.ucrBase.TabIndex = 5 + ' + 'ucrPanelExtreme + ' + Me.ucrPanelExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPanelExtreme.Location = New System.Drawing.Point(8, 16) + Me.ucrPanelExtreme.Margin = New System.Windows.Forms.Padding(9) + Me.ucrPanelExtreme.Name = "ucrPanelExtreme" + Me.ucrPanelExtreme.Size = New System.Drawing.Size(320, 178) + Me.ucrPanelExtreme.TabIndex = 0 + ' + 'tbRegOptions + ' + Me.tbRegOptions.Controls.Add(Me.tbFitMethod) + Me.tbRegOptions.Controls.Add(Me.tbDisplayOptions) + Me.tbRegOptions.Controls.Add(Me.tbConfidenceInterval) + Me.tbRegOptions.Location = New System.Drawing.Point(5, 6) + Me.tbRegOptions.Margin = New System.Windows.Forms.Padding(4) + Me.tbRegOptions.Name = "tbRegOptions" + Me.tbRegOptions.SelectedIndex = 0 + Me.tbRegOptions.Size = New System.Drawing.Size(557, 461) + Me.tbRegOptions.TabIndex = 6 + ' + 'tbFitMethod + ' + Me.tbFitMethod.Controls.Add(Me.ucrNudIterations) + Me.tbFitMethod.Controls.Add(Me.lblNumberOfIterations) + Me.tbFitMethod.Controls.Add(Me.ucrNudLocationPrior) + Me.tbFitMethod.Controls.Add(Me.ucrNudScalePrior) + Me.tbFitMethod.Controls.Add(Me.ucrNudShapePrior) + Me.tbFitMethod.Controls.Add(Me.ucrNudLocationInitial) + Me.tbFitMethod.Controls.Add(Me.ucrNudScaleInitial) + Me.tbFitMethod.Controls.Add(Me.ucrNudShapeInitial) + Me.tbFitMethod.Controls.Add(Me.lblLocationInitial) + Me.tbFitMethod.Controls.Add(Me.lblScaleInitial) + Me.tbFitMethod.Controls.Add(Me.lblShapeInitial) + Me.tbFitMethod.Controls.Add(Me.lblLocationPrior) + Me.tbFitMethod.Controls.Add(Me.lblScalePrior) + Me.tbFitMethod.Controls.Add(Me.lblShapePrior) + Me.tbFitMethod.Controls.Add(Me.rdoLmoments) + Me.tbFitMethod.Controls.Add(Me.rdoBayesian) + Me.tbFitMethod.Controls.Add(Me.rdoGMLE) + Me.tbFitMethod.Controls.Add(Me.rdoMLE) + Me.tbFitMethod.Controls.Add(Me.grpPriorParameters) + Me.tbFitMethod.Controls.Add(Me.grpInitialValues) + Me.tbFitMethod.Location = New System.Drawing.Point(4, 29) + Me.tbFitMethod.Margin = New System.Windows.Forms.Padding(4) + Me.tbFitMethod.Name = "tbFitMethod" + Me.tbFitMethod.Padding = New System.Windows.Forms.Padding(4) + Me.tbFitMethod.Size = New System.Drawing.Size(549, 428) + Me.tbFitMethod.TabIndex = 0 + Me.tbFitMethod.Tag = "Display" + Me.tbFitMethod.Text = "Fit Method" + Me.tbFitMethod.UseVisualStyleBackColor = True + ' + 'grpInitialValues + ' + Me.grpInitialValues.Location = New System.Drawing.Point(333, 195) + Me.grpInitialValues.Name = "grpInitialValues" + Me.grpInitialValues.Size = New System.Drawing.Size(214, 136) + Me.grpInitialValues.TabIndex = 24 + Me.grpInitialValues.TabStop = False + Me.grpInitialValues.Text = "Initial Values" + ' + 'ucrNudIterations + ' + Me.ucrNudIterations.AutoSize = True + Me.ucrNudIterations.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudIterations.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudIterations.Location = New System.Drawing.Point(197, 348) + Me.ucrNudIterations.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudIterations.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudIterations.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudIterations.Name = "ucrNudIterations" + Me.ucrNudIterations.Size = New System.Drawing.Size(75, 30) + Me.ucrNudIterations.TabIndex = 22 + Me.ucrNudIterations.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'lblNumberOfIterations + ' + Me.lblNumberOfIterations.AutoSize = True + Me.lblNumberOfIterations.Location = New System.Drawing.Point(26, 352) + Me.lblNumberOfIterations.Name = "lblNumberOfIterations" + Me.lblNumberOfIterations.Size = New System.Drawing.Size(158, 20) + Me.lblNumberOfIterations.TabIndex = 21 + Me.lblNumberOfIterations.Text = "Number of Iterations:" + ' + 'ucrNudLocationPrior + ' + Me.ucrNudLocationPrior.AutoSize = True + Me.ucrNudLocationPrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocationPrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudLocationPrior.Location = New System.Drawing.Point(142, 216) + Me.ucrNudLocationPrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudLocationPrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudLocationPrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocationPrior.Name = "ucrNudLocationPrior" + Me.ucrNudLocationPrior.Size = New System.Drawing.Size(75, 30) + Me.ucrNudLocationPrior.TabIndex = 20 + Me.ucrNudLocationPrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudScalePrior + ' + Me.ucrNudScalePrior.AutoSize = True + Me.ucrNudScalePrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScalePrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudScalePrior.Location = New System.Drawing.Point(139, 256) + Me.ucrNudScalePrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudScalePrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudScalePrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScalePrior.Name = "ucrNudScalePrior" + Me.ucrNudScalePrior.Size = New System.Drawing.Size(75, 30) + Me.ucrNudScalePrior.TabIndex = 19 + Me.ucrNudScalePrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudShapePrior + ' + Me.ucrNudShapePrior.AutoSize = True + Me.ucrNudShapePrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudShapePrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudShapePrior.Location = New System.Drawing.Point(143, 299) + Me.ucrNudShapePrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudShapePrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudShapePrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudShapePrior.Name = "ucrNudShapePrior" + Me.ucrNudShapePrior.Size = New System.Drawing.Size(75, 30) + Me.ucrNudShapePrior.TabIndex = 18 + Me.ucrNudShapePrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudLocationInitial + ' + Me.ucrNudLocationInitial.AutoSize = True + Me.ucrNudLocationInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocationInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudLocationInitial.Location = New System.Drawing.Point(448, 219) + Me.ucrNudLocationInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudLocationInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudLocationInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocationInitial.Name = "ucrNudLocationInitial" + Me.ucrNudLocationInitial.Size = New System.Drawing.Size(75, 30) + Me.ucrNudLocationInitial.TabIndex = 17 + Me.ucrNudLocationInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudScaleInitial + ' + Me.ucrNudScaleInitial.AutoSize = True + Me.ucrNudScaleInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScaleInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudScaleInitial.Location = New System.Drawing.Point(448, 262) + Me.ucrNudScaleInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudScaleInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudScaleInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScaleInitial.Name = "ucrNudScaleInitial" + Me.ucrNudScaleInitial.Size = New System.Drawing.Size(75, 30) + Me.ucrNudScaleInitial.TabIndex = 16 + Me.ucrNudScaleInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudShapeInitial + ' + Me.ucrNudShapeInitial.AutoSize = True + Me.ucrNudShapeInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudShapeInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudShapeInitial.Location = New System.Drawing.Point(452, 301) + Me.ucrNudShapeInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudShapeInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudShapeInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudShapeInitial.Name = "ucrNudShapeInitial" + Me.ucrNudShapeInitial.Size = New System.Drawing.Size(75, 30) + Me.ucrNudShapeInitial.TabIndex = 15 + Me.ucrNudShapeInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'lblLocationInitial + ' + Me.lblLocationInitial.AutoSize = True + Me.lblLocationInitial.Location = New System.Drawing.Point(340, 223) + Me.lblLocationInitial.Name = "lblLocationInitial" + Me.lblLocationInitial.Size = New System.Drawing.Size(74, 20) + Me.lblLocationInitial.TabIndex = 14 + Me.lblLocationInitial.Text = "Location:" + Me.lblLocationInitial.TextAlign = System.Drawing.ContentAlignment.TopCenter + ' + 'lblScaleInitial + ' + Me.lblScaleInitial.AutoSize = True + Me.lblScaleInitial.Location = New System.Drawing.Point(341, 267) + Me.lblScaleInitial.Name = "lblScaleInitial" + Me.lblScaleInitial.Size = New System.Drawing.Size(53, 20) + Me.lblScaleInitial.TabIndex = 13 + Me.lblScaleInitial.Text = "Scale:" + ' + 'lblShapeInitial + ' + Me.lblShapeInitial.AutoSize = True + Me.lblShapeInitial.Location = New System.Drawing.Point(343, 305) + Me.lblShapeInitial.Name = "lblShapeInitial" + Me.lblShapeInitial.Size = New System.Drawing.Size(60, 20) + Me.lblShapeInitial.TabIndex = 12 + Me.lblShapeInitial.Text = "Shape:" + ' + 'lblLocationPrior + ' + Me.lblLocationPrior.AutoSize = True + Me.lblLocationPrior.Location = New System.Drawing.Point(23, 220) + Me.lblLocationPrior.Name = "lblLocationPrior" + Me.lblLocationPrior.Size = New System.Drawing.Size(74, 20) + Me.lblLocationPrior.TabIndex = 11 + Me.lblLocationPrior.Text = "Location:" + ' + 'lblScalePrior + ' + Me.lblScalePrior.AutoSize = True + Me.lblScalePrior.Location = New System.Drawing.Point(31, 260) + Me.lblScalePrior.Name = "lblScalePrior" + Me.lblScalePrior.Size = New System.Drawing.Size(53, 20) + Me.lblScalePrior.TabIndex = 10 + Me.lblScalePrior.Text = "Scale:" + ' + 'lblShapePrior + ' + Me.lblShapePrior.AutoSize = True + Me.lblShapePrior.Location = New System.Drawing.Point(31, 297) + Me.lblShapePrior.Name = "lblShapePrior" + Me.lblShapePrior.Size = New System.Drawing.Size(60, 20) + Me.lblShapePrior.TabIndex = 9 + Me.lblShapePrior.Text = "Shape:" + ' 'rdoLmoments ' Me.rdoLmoments.AutoSize = True Me.rdoLmoments.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoLmoments.Location = New System.Drawing.Point(12, 101) + Me.rdoLmoments.Location = New System.Drawing.Point(20, 151) + Me.rdoLmoments.Margin = New System.Windows.Forms.Padding(4) Me.rdoLmoments.Name = "rdoLmoments" - Me.rdoLmoments.Size = New System.Drawing.Size(76, 17) - Me.rdoLmoments.TabIndex = 4 + Me.rdoLmoments.Size = New System.Drawing.Size(114, 24) + Me.rdoLmoments.TabIndex = 8 Me.rdoLmoments.TabStop = True Me.rdoLmoments.Text = "L-moments" Me.rdoLmoments.UseVisualStyleBackColor = True @@ -46,10 +322,11 @@ Partial Class sdgExtremesMethod ' Me.rdoBayesian.AutoSize = True Me.rdoBayesian.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoBayesian.Location = New System.Drawing.Point(12, 78) + Me.rdoBayesian.Location = New System.Drawing.Point(20, 116) + Me.rdoBayesian.Margin = New System.Windows.Forms.Padding(4) Me.rdoBayesian.Name = "rdoBayesian" - Me.rdoBayesian.Size = New System.Drawing.Size(68, 17) - Me.rdoBayesian.TabIndex = 3 + Me.rdoBayesian.Size = New System.Drawing.Size(99, 24) + Me.rdoBayesian.TabIndex = 7 Me.rdoBayesian.TabStop = True Me.rdoBayesian.Text = "Bayesian" Me.rdoBayesian.UseVisualStyleBackColor = True @@ -58,10 +335,11 @@ Partial Class sdgExtremesMethod ' Me.rdoGMLE.AutoSize = True Me.rdoGMLE.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoGMLE.Location = New System.Drawing.Point(12, 42) + Me.rdoGMLE.Location = New System.Drawing.Point(20, 63) + Me.rdoGMLE.Margin = New System.Windows.Forms.Padding(4) Me.rdoGMLE.Name = "rdoGMLE" - Me.rdoGMLE.Size = New System.Drawing.Size(206, 30) - Me.rdoGMLE.TabIndex = 2 + Me.rdoGMLE.Size = New System.Drawing.Size(309, 44) + Me.rdoGMLE.TabIndex = 6 Me.rdoGMLE.TabStop = True Me.rdoGMLE.Text = "General Maximum Likelihood Estimator" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "(GMLE)" Me.rdoGMLE.UseVisualStyleBackColor = True @@ -70,57 +348,329 @@ Partial Class sdgExtremesMethod ' Me.rdoMLE.AutoSize = True Me.rdoMLE.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoMLE.Location = New System.Drawing.Point(12, 19) + Me.rdoMLE.Location = New System.Drawing.Point(20, 27) + Me.rdoMLE.Margin = New System.Windows.Forms.Padding(4) Me.rdoMLE.Name = "rdoMLE" - Me.rdoMLE.Size = New System.Drawing.Size(151, 17) - Me.rdoMLE.TabIndex = 1 + Me.rdoMLE.Size = New System.Drawing.Size(223, 24) + Me.rdoMLE.TabIndex = 5 Me.rdoMLE.TabStop = True Me.rdoMLE.Text = "Maximum Likelihood (MLE)" Me.rdoMLE.UseVisualStyleBackColor = True ' - 'ucrBase + 'grpPriorParameters ' - Me.ucrBase.AutoSize = True - Me.ucrBase.Location = New System.Drawing.Point(6, 126) - Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(224, 30) - Me.ucrBase.TabIndex = 5 + Me.grpPriorParameters.Location = New System.Drawing.Point(20, 182) + Me.grpPriorParameters.Name = "grpPriorParameters" + Me.grpPriorParameters.Size = New System.Drawing.Size(233, 149) + Me.grpPriorParameters.TabIndex = 23 + Me.grpPriorParameters.TabStop = False + Me.grpPriorParameters.Text = "Prior Parameters" ' - 'ucrPanelExtreme + 'tbDisplayOptions ' - Me.ucrPanelExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrPanelExtreme.Location = New System.Drawing.Point(5, 11) - Me.ucrPanelExtreme.Name = "ucrPanelExtreme" - Me.ucrPanelExtreme.Size = New System.Drawing.Size(213, 119) - Me.ucrPanelExtreme.TabIndex = 0 + Me.tbDisplayOptions.Controls.Add(Me.ucrSavePlots) + Me.tbDisplayOptions.Controls.Add(Me.grpPlots) + Me.tbDisplayOptions.Location = New System.Drawing.Point(4, 29) + Me.tbDisplayOptions.Margin = New System.Windows.Forms.Padding(4) + Me.tbDisplayOptions.Name = "tbDisplayOptions" + Me.tbDisplayOptions.Padding = New System.Windows.Forms.Padding(4) + Me.tbDisplayOptions.Size = New System.Drawing.Size(549, 428) + Me.tbDisplayOptions.TabIndex = 1 + Me.tbDisplayOptions.Tag = "Graphics" + Me.tbDisplayOptions.Text = "Display Options" + Me.tbDisplayOptions.UseVisualStyleBackColor = True + ' + 'ucrSavePlots + ' + Me.ucrSavePlots.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrSavePlots.Location = New System.Drawing.Point(29, 238) + Me.ucrSavePlots.Margin = New System.Windows.Forms.Padding(6, 8, 6, 8) + Me.ucrSavePlots.Name = "ucrSavePlots" + Me.ucrSavePlots.Size = New System.Drawing.Size(392, 36) + Me.ucrSavePlots.TabIndex = 3 + ' + 'grpPlots + ' + Me.grpPlots.Controls.Add(Me.rdoNoPlot) + Me.grpPlots.Controls.Add(Me.rdoTrace) + Me.grpPlots.Controls.Add(Me.rdoRlplot) + Me.grpPlots.Controls.Add(Me.rdoHist) + Me.grpPlots.Controls.Add(Me.rdoDensity) + Me.grpPlots.Controls.Add(Me.rdoZPlot) + Me.grpPlots.Controls.Add(Me.rdoProbprob) + Me.grpPlots.Controls.Add(Me.rdoQQPlot) + Me.grpPlots.Controls.Add(Me.rdoQQ2) + Me.grpPlots.Controls.Add(Me.rdoPrimary) + Me.grpPlots.Controls.Add(Me.ucrPnlExtreme) + Me.grpPlots.Location = New System.Drawing.Point(29, 14) + Me.grpPlots.Margin = New System.Windows.Forms.Padding(4) + Me.grpPlots.Name = "grpPlots" + Me.grpPlots.Padding = New System.Windows.Forms.Padding(4) + Me.grpPlots.Size = New System.Drawing.Size(392, 212) + Me.grpPlots.TabIndex = 2 + Me.grpPlots.TabStop = False + Me.grpPlots.Text = "Plots" + ' + 'rdoNoPlot + ' + Me.rdoNoPlot.AutoSize = True + Me.rdoNoPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoNoPlot.Location = New System.Drawing.Point(20, 34) + Me.rdoNoPlot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoNoPlot.Name = "rdoNoPlot" + Me.rdoNoPlot.Size = New System.Drawing.Size(85, 24) + Me.rdoNoPlot.TabIndex = 1 + Me.rdoNoPlot.Text = "No Plot" + Me.rdoNoPlot.UseVisualStyleBackColor = True + ' + 'rdoTrace + ' + Me.rdoTrace.AutoSize = True + Me.rdoTrace.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoTrace.Location = New System.Drawing.Point(20, 172) + Me.rdoTrace.Margin = New System.Windows.Forms.Padding(4) + Me.rdoTrace.Name = "rdoTrace" + Me.rdoTrace.Size = New System.Drawing.Size(105, 24) + Me.rdoTrace.TabIndex = 5 + Me.rdoTrace.Text = "Trace Plot" + Me.rdoTrace.UseVisualStyleBackColor = True + ' + 'rdoRlplot + ' + Me.rdoRlplot.AutoSize = True + Me.rdoRlplot.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoRlplot.Location = New System.Drawing.Point(20, 138) + Me.rdoRlplot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoRlplot.Name = "rdoRlplot" + Me.rdoRlplot.Size = New System.Drawing.Size(80, 24) + Me.rdoRlplot.TabIndex = 4 + Me.rdoRlplot.Text = "Rl Plot" + Me.rdoRlplot.UseVisualStyleBackColor = True + ' + 'rdoHist + ' + Me.rdoHist.AutoSize = True + Me.rdoHist.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoHist.Location = New System.Drawing.Point(224, 104) + Me.rdoHist.Margin = New System.Windows.Forms.Padding(4) + Me.rdoHist.Name = "rdoHist" + Me.rdoHist.Size = New System.Drawing.Size(93, 24) + Me.rdoHist.TabIndex = 8 + Me.rdoHist.Text = "Hist Plot" + Me.rdoHist.UseVisualStyleBackColor = True + ' + 'rdoDensity + ' + Me.rdoDensity.AutoSize = True + Me.rdoDensity.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoDensity.Location = New System.Drawing.Point(224, 140) + Me.rdoDensity.Margin = New System.Windows.Forms.Padding(4) + Me.rdoDensity.Name = "rdoDensity" + Me.rdoDensity.Size = New System.Drawing.Size(118, 24) + Me.rdoDensity.TabIndex = 9 + Me.rdoDensity.Text = "Density Plot" + Me.rdoDensity.UseVisualStyleBackColor = True + ' + 'rdoZPlot + ' + Me.rdoZPlot.AutoSize = True + Me.rdoZPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoZPlot.Location = New System.Drawing.Point(224, 69) + Me.rdoZPlot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoZPlot.Name = "rdoZPlot" + Me.rdoZPlot.Size = New System.Drawing.Size(101, 24) + Me.rdoZPlot.TabIndex = 7 + Me.rdoZPlot.Text = "Zplot Plot" + Me.rdoZPlot.UseVisualStyleBackColor = True + ' + 'rdoProbprob + ' + Me.rdoProbprob.AutoSize = True + Me.rdoProbprob.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoProbprob.Location = New System.Drawing.Point(20, 104) + Me.rdoProbprob.Margin = New System.Windows.Forms.Padding(4) + Me.rdoProbprob.Name = "rdoProbprob" + Me.rdoProbprob.Size = New System.Drawing.Size(135, 24) + Me.rdoProbprob.TabIndex = 3 + Me.rdoProbprob.Text = "Prob-prob Plot" + Me.rdoProbprob.UseVisualStyleBackColor = True + ' + 'rdoQQPlot + ' + Me.rdoQQPlot.AutoSize = True + Me.rdoQQPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoQQPlot.Location = New System.Drawing.Point(224, 34) + Me.rdoQQPlot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoQQPlot.Name = "rdoQQPlot" + Me.rdoQQPlot.Size = New System.Drawing.Size(89, 24) + Me.rdoQQPlot.TabIndex = 6 + Me.rdoQQPlot.Text = "QQ Plot" + Me.rdoQQPlot.UseVisualStyleBackColor = True + ' + 'rdoQQ2 + ' + Me.rdoQQ2.AutoSize = True + Me.rdoQQ2.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoQQ2.Location = New System.Drawing.Point(224, 172) + Me.rdoQQ2.Margin = New System.Windows.Forms.Padding(4) + Me.rdoQQ2.Name = "rdoQQ2" + Me.rdoQQ2.Size = New System.Drawing.Size(98, 24) + Me.rdoQQ2.TabIndex = 10 + Me.rdoQQ2.Text = "QQ2 Plot" + Me.rdoQQ2.UseVisualStyleBackColor = True + ' + 'rdoPrimary + ' + Me.rdoPrimary.AutoSize = True + Me.rdoPrimary.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoPrimary.Location = New System.Drawing.Point(20, 69) + Me.rdoPrimary.Margin = New System.Windows.Forms.Padding(4) + Me.rdoPrimary.Name = "rdoPrimary" + Me.rdoPrimary.Size = New System.Drawing.Size(86, 24) + Me.rdoPrimary.TabIndex = 2 + Me.rdoPrimary.Text = "Primary" + Me.rdoPrimary.UseVisualStyleBackColor = True + ' + 'ucrPnlExtreme + ' + Me.ucrPnlExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlExtreme.Location = New System.Drawing.Point(12, 23) + Me.ucrPnlExtreme.Margin = New System.Windows.Forms.Padding(9) + Me.ucrPnlExtreme.Name = "ucrPnlExtreme" + Me.ucrPnlExtreme.Size = New System.Drawing.Size(358, 176) + Me.ucrPnlExtreme.TabIndex = 0 + ' + 'tbConfidenceInterval + ' + Me.tbConfidenceInterval.Controls.Add(Me.lblReturnLevel) + Me.tbConfidenceInterval.Controls.Add(Me.ucrNudReturnLevel) + Me.tbConfidenceInterval.Controls.Add(Me.ucrInputType) + Me.tbConfidenceInterval.Controls.Add(Me.ucrChkType) + Me.tbConfidenceInterval.Location = New System.Drawing.Point(4, 29) + Me.tbConfidenceInterval.Margin = New System.Windows.Forms.Padding(4) + Me.tbConfidenceInterval.Name = "tbConfidenceInterval" + Me.tbConfidenceInterval.Padding = New System.Windows.Forms.Padding(4) + Me.tbConfidenceInterval.Size = New System.Drawing.Size(549, 428) + Me.tbConfidenceInterval.TabIndex = 2 + Me.tbConfidenceInterval.Tag = "Save" + Me.tbConfidenceInterval.Text = "Confidence Interval" + Me.tbConfidenceInterval.UseVisualStyleBackColor = True + ' + 'lblReturnLevel + ' + Me.lblReturnLevel.AutoSize = True + Me.lblReturnLevel.Location = New System.Drawing.Point(356, 17) + Me.lblReturnLevel.Name = "lblReturnLevel" + Me.lblReturnLevel.Size = New System.Drawing.Size(103, 20) + Me.lblReturnLevel.TabIndex = 3 + Me.lblReturnLevel.Text = "Return Level:" + ' + 'ucrNudReturnLevel + ' + Me.ucrNudReturnLevel.AutoSize = True + Me.ucrNudReturnLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudReturnLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudReturnLevel.Location = New System.Drawing.Point(466, 13) + Me.ucrNudReturnLevel.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudReturnLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudReturnLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudReturnLevel.Name = "ucrNudReturnLevel" + Me.ucrNudReturnLevel.Size = New System.Drawing.Size(75, 30) + Me.ucrNudReturnLevel.TabIndex = 2 + Me.ucrNudReturnLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrInputType + ' + Me.ucrInputType.AddQuotesIfUnrecognised = True + Me.ucrInputType.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputType.GetSetSelectedIndex = -1 + Me.ucrInputType.IsReadOnly = False + Me.ucrInputType.Location = New System.Drawing.Point(174, 13) + Me.ucrInputType.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) + Me.ucrInputType.Name = "ucrInputType" + Me.ucrInputType.Size = New System.Drawing.Size(175, 32) + Me.ucrInputType.TabIndex = 1 + ' + 'ucrChkType + ' + Me.ucrChkType.AutoSize = True + Me.ucrChkType.Checked = False + Me.ucrChkType.Location = New System.Drawing.Point(12, 14) + Me.ucrChkType.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrChkType.Name = "ucrChkType" + Me.ucrChkType.Size = New System.Drawing.Size(150, 34) + Me.ucrChkType.TabIndex = 0 ' 'sdgExtremesMethod ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) + Me.AutoScaleDimensions = New System.Drawing.SizeF(144.0!, 144.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(230, 160) + Me.ClientSize = New System.Drawing.Size(575, 641) + Me.Controls.Add(Me.tbRegOptions) Me.Controls.Add(Me.ucrBase) - Me.Controls.Add(Me.rdoLmoments) - Me.Controls.Add(Me.rdoBayesian) - Me.Controls.Add(Me.rdoGMLE) - Me.Controls.Add(Me.rdoMLE) Me.Controls.Add(Me.ucrPanelExtreme) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow + Me.Margin = New System.Windows.Forms.Padding(4) Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "sdgExtremesMethod" Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Text = "Extremes Method" + Me.tbRegOptions.ResumeLayout(False) + Me.tbFitMethod.ResumeLayout(False) + Me.tbFitMethod.PerformLayout() + Me.tbDisplayOptions.ResumeLayout(False) + Me.grpPlots.ResumeLayout(False) + Me.grpPlots.PerformLayout() + Me.tbConfidenceInterval.ResumeLayout(False) + Me.tbConfidenceInterval.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() End Sub Friend WithEvents ucrBase As ucrButtonsSubdialogue + Friend WithEvents ucrPanelExtreme As UcrPanel + Friend WithEvents tbRegOptions As TabControl + Friend WithEvents tbFitMethod As TabPage Friend WithEvents rdoLmoments As RadioButton Friend WithEvents rdoBayesian As RadioButton Friend WithEvents rdoGMLE As RadioButton Friend WithEvents rdoMLE As RadioButton - Friend WithEvents ucrPanelExtreme As UcrPanel + Friend WithEvents tbDisplayOptions As TabPage + Friend WithEvents tbConfidenceInterval As TabPage + Friend WithEvents grpPlots As GroupBox + Friend WithEvents rdoNoPlot As RadioButton + Friend WithEvents rdoTrace As RadioButton + Friend WithEvents rdoRlplot As RadioButton + Friend WithEvents rdoHist As RadioButton + Friend WithEvents rdoDensity As RadioButton + Friend WithEvents rdoZPlot As RadioButton + Friend WithEvents rdoProbprob As RadioButton + Friend WithEvents rdoQQPlot As RadioButton + Friend WithEvents rdoQQ2 As RadioButton + Friend WithEvents rdoPrimary As RadioButton + Friend WithEvents ucrPnlExtreme As UcrPanel + Friend WithEvents ucrSavePlots As ucrSave + Friend WithEvents ucrInputType As ucrInputComboBox + Friend WithEvents ucrChkType As ucrCheck + Friend WithEvents ucrNudReturnLevel As ucrNud + Friend WithEvents lblReturnLevel As Label + Friend WithEvents lblLocationInitial As Label + Friend WithEvents lblScaleInitial As Label + Friend WithEvents lblShapeInitial As Label + Friend WithEvents lblLocationPrior As Label + Friend WithEvents lblScalePrior As Label + Friend WithEvents lblShapePrior As Label + Friend WithEvents ucrNudLocationPrior As ucrNud + Friend WithEvents ucrNudScalePrior As ucrNud + Friend WithEvents ucrNudShapePrior As ucrNud + Friend WithEvents ucrNudLocationInitial As ucrNud + Friend WithEvents ucrNudScaleInitial As ucrNud + Friend WithEvents ucrNudShapeInitial As ucrNud + Friend WithEvents grpInitialValues As GroupBox + Friend WithEvents ucrNudIterations As ucrNud + Friend WithEvents lblNumberOfIterations As Label + Friend WithEvents grpPriorParameters As GroupBox End Class From c7f9fa26041f79e3cc53c9c2b047d482b25a635c Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Mon, 25 Jul 2022 17:22:50 +0300 Subject: [PATCH 002/122] Updating Extremes Dialogue --- instat/dlgExtremes.Designer.vb | 198 +++--- instat/dlgExtremes.vb | 10 +- instat/sdgExtremesMethod.Designer.vb | 980 ++++++++++++++------------- instat/sdgExtremesMethod.vb | 99 ++- 4 files changed, 691 insertions(+), 596 deletions(-) diff --git a/instat/dlgExtremes.Designer.vb b/instat/dlgExtremes.Designer.vb index 3f51b652d18..9cea18c0095 100644 --- a/instat/dlgExtremes.Designer.vb +++ b/instat/dlgExtremes.Designer.vb @@ -59,7 +59,6 @@ Partial Class dlgExtremes Me.cmdZero = New System.Windows.Forms.Button() Me.cmdMinus = New System.Windows.Forms.Button() Me.lblFevdType = New System.Windows.Forms.Label() - Me.cmdDisplayOptions = New System.Windows.Forms.Button() Me.cmdFittingOptions = New System.Windows.Forms.Button() Me.lblDataToFit = New System.Windows.Forms.Label() Me.ucrInputThresholdforLocation = New instat.ucrInputTextBox() @@ -78,10 +77,10 @@ Partial Class dlgExtremes 'cmdSqrt ' Me.cmdSqrt.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdSqrt.Location = New System.Drawing.Point(4, 10) - Me.cmdSqrt.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdSqrt.Location = New System.Drawing.Point(6, 15) + Me.cmdSqrt.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdSqrt.Name = "cmdSqrt" - Me.cmdSqrt.Size = New System.Drawing.Size(56, 30) + Me.cmdSqrt.Size = New System.Drawing.Size(84, 45) Me.cmdSqrt.TabIndex = 0 Me.cmdSqrt.Text = "sqrt" Me.cmdSqrt.UseVisualStyleBackColor = True @@ -89,10 +88,10 @@ Partial Class dlgExtremes 'cmdLog ' Me.cmdLog.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdLog.Location = New System.Drawing.Point(4, 40) - Me.cmdLog.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdLog.Location = New System.Drawing.Point(6, 60) + Me.cmdLog.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdLog.Name = "cmdLog" - Me.cmdLog.Size = New System.Drawing.Size(56, 30) + Me.cmdLog.Size = New System.Drawing.Size(84, 45) Me.cmdLog.TabIndex = 2 Me.cmdLog.Text = "log" Me.cmdLog.UseVisualStyleBackColor = True @@ -100,10 +99,10 @@ Partial Class dlgExtremes 'cmdTan ' Me.cmdTan.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdTan.Location = New System.Drawing.Point(60, 70) - Me.cmdTan.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdTan.Location = New System.Drawing.Point(90, 105) + Me.cmdTan.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdTan.Name = "cmdTan" - Me.cmdTan.Size = New System.Drawing.Size(56, 30) + Me.cmdTan.Size = New System.Drawing.Size(84, 45) Me.cmdTan.TabIndex = 5 Me.cmdTan.Text = "tan" Me.cmdTan.UseVisualStyleBackColor = True @@ -111,10 +110,10 @@ Partial Class dlgExtremes 'cmdExp ' Me.cmdExp.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdExp.Location = New System.Drawing.Point(4, 70) - Me.cmdExp.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdExp.Location = New System.Drawing.Point(6, 105) + Me.cmdExp.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdExp.Name = "cmdExp" - Me.cmdExp.Size = New System.Drawing.Size(56, 30) + Me.cmdExp.Size = New System.Drawing.Size(84, 45) Me.cmdExp.TabIndex = 4 Me.cmdExp.Text = "exp" Me.cmdExp.UseVisualStyleBackColor = True @@ -123,19 +122,20 @@ Partial Class dlgExtremes ' Me.lblThreshold.AutoSize = True Me.lblThreshold.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblThreshold.Location = New System.Drawing.Point(10, 235) + Me.lblThreshold.Location = New System.Drawing.Point(15, 352) + Me.lblThreshold.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0) Me.lblThreshold.Name = "lblThreshold" - Me.lblThreshold.Size = New System.Drawing.Size(57, 13) + Me.lblThreshold.Size = New System.Drawing.Size(83, 20) Me.lblThreshold.TabIndex = 9 Me.lblThreshold.Text = "Threshold:" ' 'cmdSin ' Me.cmdSin.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdSin.Location = New System.Drawing.Point(60, 40) - Me.cmdSin.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdSin.Location = New System.Drawing.Point(90, 60) + Me.cmdSin.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdSin.Name = "cmdSin" - Me.cmdSin.Size = New System.Drawing.Size(56, 30) + Me.cmdSin.Size = New System.Drawing.Size(84, 45) Me.cmdSin.TabIndex = 3 Me.cmdSin.Text = "sin" Me.cmdSin.UseVisualStyleBackColor = True @@ -148,19 +148,21 @@ Partial Class dlgExtremes Me.grpSecondCalc.Controls.Add(Me.cmdLog) Me.grpSecondCalc.Controls.Add(Me.cmdTan) Me.grpSecondCalc.Controls.Add(Me.cmdExp) - Me.grpSecondCalc.Location = New System.Drawing.Point(390, 139) + Me.grpSecondCalc.Location = New System.Drawing.Point(585, 208) + Me.grpSecondCalc.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) Me.grpSecondCalc.Name = "grpSecondCalc" - Me.grpSecondCalc.Size = New System.Drawing.Size(119, 104) + Me.grpSecondCalc.Padding = New System.Windows.Forms.Padding(4, 4, 4, 4) + Me.grpSecondCalc.Size = New System.Drawing.Size(178, 156) Me.grpSecondCalc.TabIndex = 6 Me.grpSecondCalc.TabStop = False ' 'cmdCos ' Me.cmdCos.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdCos.Location = New System.Drawing.Point(60, 10) - Me.cmdCos.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdCos.Location = New System.Drawing.Point(90, 15) + Me.cmdCos.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdCos.Name = "cmdCos" - Me.cmdCos.Size = New System.Drawing.Size(56, 30) + Me.cmdCos.Size = New System.Drawing.Size(84, 45) Me.cmdCos.TabIndex = 1 Me.cmdCos.Text = "cos" Me.cmdCos.UseVisualStyleBackColor = True @@ -178,9 +180,11 @@ Partial Class dlgExtremes Me.grpFirstCalc.Controls.Add(Me.cmdClear) Me.grpFirstCalc.Controls.Add(Me.cmdZero) Me.grpFirstCalc.Controls.Add(Me.cmdMinus) - Me.grpFirstCalc.Location = New System.Drawing.Point(258, 139) + Me.grpFirstCalc.Location = New System.Drawing.Point(387, 208) + Me.grpFirstCalc.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) Me.grpFirstCalc.Name = "grpFirstCalc" - Me.grpFirstCalc.Size = New System.Drawing.Size(127, 104) + Me.grpFirstCalc.Padding = New System.Windows.Forms.Padding(4, 4, 4, 4) + Me.grpFirstCalc.Size = New System.Drawing.Size(190, 156) Me.grpFirstCalc.TabIndex = 5 Me.grpFirstCalc.TabStop = False ' @@ -188,10 +192,10 @@ Partial Class dlgExtremes ' Me.cmdMultiply.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdMultiply.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdMultiply.Location = New System.Drawing.Point(64, 10) - Me.cmdMultiply.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdMultiply.Location = New System.Drawing.Point(96, 15) + Me.cmdMultiply.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdMultiply.Name = "cmdMultiply" - Me.cmdMultiply.Size = New System.Drawing.Size(29, 30) + Me.cmdMultiply.Size = New System.Drawing.Size(44, 45) Me.cmdMultiply.TabIndex = 2 Me.cmdMultiply.Text = "*" Me.cmdMultiply.UseVisualStyleBackColor = True @@ -200,10 +204,10 @@ Partial Class dlgExtremes ' Me.cmdColon.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdColon.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdColon.Location = New System.Drawing.Point(35, 10) - Me.cmdColon.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdColon.Location = New System.Drawing.Point(52, 15) + Me.cmdColon.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdColon.Name = "cmdColon" - Me.cmdColon.Size = New System.Drawing.Size(29, 30) + Me.cmdColon.Size = New System.Drawing.Size(44, 45) Me.cmdColon.TabIndex = 1 Me.cmdColon.Text = ":" Me.cmdColon.UseVisualStyleBackColor = True @@ -212,10 +216,10 @@ Partial Class dlgExtremes ' Me.cmdPlus.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdPlus.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdPlus.Location = New System.Drawing.Point(6, 10) - Me.cmdPlus.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdPlus.Location = New System.Drawing.Point(9, 15) + Me.cmdPlus.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdPlus.Name = "cmdPlus" - Me.cmdPlus.Size = New System.Drawing.Size(29, 30) + Me.cmdPlus.Size = New System.Drawing.Size(44, 45) Me.cmdPlus.TabIndex = 0 Me.cmdPlus.Text = "+" Me.cmdPlus.UseVisualStyleBackColor = True @@ -224,10 +228,10 @@ Partial Class dlgExtremes ' Me.cmdPower.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdPower.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdPower.Location = New System.Drawing.Point(93, 40) - Me.cmdPower.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdPower.Location = New System.Drawing.Point(140, 60) + Me.cmdPower.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdPower.Name = "cmdPower" - Me.cmdPower.Size = New System.Drawing.Size(29, 30) + Me.cmdPower.Size = New System.Drawing.Size(44, 45) Me.cmdPower.TabIndex = 7 Me.cmdPower.Text = "^" Me.cmdPower.UseVisualStyleBackColor = True @@ -236,10 +240,10 @@ Partial Class dlgExtremes ' Me.cmdClosingBracket.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!) Me.cmdClosingBracket.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdClosingBracket.Location = New System.Drawing.Point(64, 40) - Me.cmdClosingBracket.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdClosingBracket.Location = New System.Drawing.Point(96, 60) + Me.cmdClosingBracket.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdClosingBracket.Name = "cmdClosingBracket" - Me.cmdClosingBracket.Size = New System.Drawing.Size(29, 30) + Me.cmdClosingBracket.Size = New System.Drawing.Size(44, 45) Me.cmdClosingBracket.TabIndex = 6 Me.cmdClosingBracket.Text = ")" Me.cmdClosingBracket.UseVisualStyleBackColor = True @@ -248,10 +252,10 @@ Partial Class dlgExtremes ' Me.cmdOpeningBracket.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!) Me.cmdOpeningBracket.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdOpeningBracket.Location = New System.Drawing.Point(35, 40) - Me.cmdOpeningBracket.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdOpeningBracket.Location = New System.Drawing.Point(52, 60) + Me.cmdOpeningBracket.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdOpeningBracket.Name = "cmdOpeningBracket" - Me.cmdOpeningBracket.Size = New System.Drawing.Size(29, 30) + Me.cmdOpeningBracket.Size = New System.Drawing.Size(44, 45) Me.cmdOpeningBracket.TabIndex = 5 Me.cmdOpeningBracket.Text = "(" Me.cmdOpeningBracket.UseVisualStyleBackColor = True @@ -260,10 +264,10 @@ Partial Class dlgExtremes ' Me.cmdDiv.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdDiv.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdDiv.Location = New System.Drawing.Point(93, 10) - Me.cmdDiv.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdDiv.Location = New System.Drawing.Point(140, 15) + Me.cmdDiv.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdDiv.Name = "cmdDiv" - Me.cmdDiv.Size = New System.Drawing.Size(29, 30) + Me.cmdDiv.Size = New System.Drawing.Size(44, 45) Me.cmdDiv.TabIndex = 3 Me.cmdDiv.Text = "/" Me.cmdDiv.UseVisualStyleBackColor = True @@ -272,10 +276,10 @@ Partial Class dlgExtremes ' Me.cmdDoubleBracket.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!) Me.cmdDoubleBracket.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdDoubleBracket.Location = New System.Drawing.Point(6, 40) - Me.cmdDoubleBracket.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdDoubleBracket.Location = New System.Drawing.Point(9, 60) + Me.cmdDoubleBracket.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdDoubleBracket.Name = "cmdDoubleBracket" - Me.cmdDoubleBracket.Size = New System.Drawing.Size(29, 30) + Me.cmdDoubleBracket.Size = New System.Drawing.Size(44, 45) Me.cmdDoubleBracket.TabIndex = 4 Me.cmdDoubleBracket.Text = "( )" Me.cmdDoubleBracket.UseVisualStyleBackColor = True @@ -283,10 +287,10 @@ Partial Class dlgExtremes 'cmdClear ' Me.cmdClear.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdClear.Location = New System.Drawing.Point(64, 70) - Me.cmdClear.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdClear.Location = New System.Drawing.Point(96, 105) + Me.cmdClear.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdClear.Name = "cmdClear" - Me.cmdClear.Size = New System.Drawing.Size(58, 30) + Me.cmdClear.Size = New System.Drawing.Size(87, 45) Me.cmdClear.TabIndex = 10 Me.cmdClear.Text = "Clear" Me.cmdClear.UseVisualStyleBackColor = True @@ -295,10 +299,10 @@ Partial Class dlgExtremes ' Me.cmdZero.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.75!) Me.cmdZero.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdZero.Location = New System.Drawing.Point(35, 70) - Me.cmdZero.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdZero.Location = New System.Drawing.Point(52, 105) + Me.cmdZero.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdZero.Name = "cmdZero" - Me.cmdZero.Size = New System.Drawing.Size(29, 30) + Me.cmdZero.Size = New System.Drawing.Size(44, 45) Me.cmdZero.TabIndex = 9 Me.cmdZero.Text = "l()" Me.cmdZero.UseVisualStyleBackColor = True @@ -307,10 +311,10 @@ Partial Class dlgExtremes ' Me.cmdMinus.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdMinus.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdMinus.Location = New System.Drawing.Point(6, 70) - Me.cmdMinus.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdMinus.Location = New System.Drawing.Point(9, 105) + Me.cmdMinus.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) Me.cmdMinus.Name = "cmdMinus" - Me.cmdMinus.Size = New System.Drawing.Size(29, 30) + Me.cmdMinus.Size = New System.Drawing.Size(44, 45) Me.cmdMinus.TabIndex = 8 Me.cmdMinus.Text = "-" Me.cmdMinus.UseVisualStyleBackColor = True @@ -319,39 +323,32 @@ Partial Class dlgExtremes ' Me.lblFevdType.AutoSize = True Me.lblFevdType.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblFevdType.Location = New System.Drawing.Point(10, 207) + Me.lblFevdType.Location = New System.Drawing.Point(15, 310) + Me.lblFevdType.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0) Me.lblFevdType.Name = "lblFevdType" - Me.lblFevdType.Size = New System.Drawing.Size(62, 13) + Me.lblFevdType.Size = New System.Drawing.Size(93, 20) Me.lblFevdType.TabIndex = 7 Me.lblFevdType.Text = "Distribution:" ' - 'cmdDisplayOptions - ' - Me.cmdDisplayOptions.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdDisplayOptions.Location = New System.Drawing.Point(401, 290) - Me.cmdDisplayOptions.Name = "cmdDisplayOptions" - Me.cmdDisplayOptions.Size = New System.Drawing.Size(108, 23) - Me.cmdDisplayOptions.TabIndex = 14 - Me.cmdDisplayOptions.Text = "Display Options" - Me.cmdDisplayOptions.UseVisualStyleBackColor = True - ' 'cmdFittingOptions ' Me.cmdFittingOptions.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdFittingOptions.Location = New System.Drawing.Point(401, 261) + Me.cmdFittingOptions.Location = New System.Drawing.Point(602, 392) + Me.cmdFittingOptions.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) Me.cmdFittingOptions.Name = "cmdFittingOptions" - Me.cmdFittingOptions.Size = New System.Drawing.Size(108, 23) + Me.cmdFittingOptions.Size = New System.Drawing.Size(162, 34) Me.cmdFittingOptions.TabIndex = 12 - Me.cmdFittingOptions.Text = "Fitting Options" + Me.cmdFittingOptions.Text = "Options" Me.cmdFittingOptions.UseVisualStyleBackColor = True ' 'lblDataToFit ' Me.lblDataToFit.AutoSize = True Me.lblDataToFit.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblDataToFit.Location = New System.Drawing.Point(258, 45) + Me.lblDataToFit.Location = New System.Drawing.Point(387, 68) + Me.lblDataToFit.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0) Me.lblDataToFit.Name = "lblDataToFit" - Me.lblDataToFit.Size = New System.Drawing.Size(99, 13) + Me.lblDataToFit.Size = New System.Drawing.Size(148, 20) Me.lblDataToFit.TabIndex = 1 Me.lblDataToFit.Tag = "Data_to_be_fitted" Me.lblDataToFit.Text = "Response Variable:" @@ -362,37 +359,41 @@ Partial Class dlgExtremes Me.ucrInputThresholdforLocation.AutoSize = True Me.ucrInputThresholdforLocation.IsMultiline = False Me.ucrInputThresholdforLocation.IsReadOnly = False - Me.ucrInputThresholdforLocation.Location = New System.Drawing.Point(79, 231) + Me.ucrInputThresholdforLocation.Location = New System.Drawing.Point(118, 346) + Me.ucrInputThresholdforLocation.Margin = New System.Windows.Forms.Padding(14, 14, 14, 14) Me.ucrInputThresholdforLocation.Name = "ucrInputThresholdforLocation" - Me.ucrInputThresholdforLocation.Size = New System.Drawing.Size(79, 21) + Me.ucrInputThresholdforLocation.Size = New System.Drawing.Size(118, 32) Me.ucrInputThresholdforLocation.TabIndex = 10 ' 'ucrTryModelling ' Me.ucrTryModelling.AutoSize = True - Me.ucrTryModelling.Location = New System.Drawing.Point(1, 258) + Me.ucrTryModelling.Location = New System.Drawing.Point(2, 387) + Me.ucrTryModelling.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) Me.ucrTryModelling.Name = "ucrTryModelling" Me.ucrTryModelling.RunCommandAsMultipleLines = False - Me.ucrTryModelling.Size = New System.Drawing.Size(389, 33) + Me.ucrTryModelling.Size = New System.Drawing.Size(594, 55) Me.ucrTryModelling.TabIndex = 11 ' 'ucrChkExplanatoryModelForLocationParameter ' Me.ucrChkExplanatoryModelForLocationParameter.AutoSize = True Me.ucrChkExplanatoryModelForLocationParameter.Checked = False - Me.ucrChkExplanatoryModelForLocationParameter.Location = New System.Drawing.Point(258, 85) + Me.ucrChkExplanatoryModelForLocationParameter.Location = New System.Drawing.Point(387, 128) + Me.ucrChkExplanatoryModelForLocationParameter.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) Me.ucrChkExplanatoryModelForLocationParameter.Name = "ucrChkExplanatoryModelForLocationParameter" - Me.ucrChkExplanatoryModelForLocationParameter.Size = New System.Drawing.Size(270, 23) + Me.ucrChkExplanatoryModelForLocationParameter.Size = New System.Drawing.Size(405, 34) Me.ucrChkExplanatoryModelForLocationParameter.TabIndex = 3 ' 'ucrReceiverExpressionExplanatoryModelForLocParam ' Me.ucrReceiverExpressionExplanatoryModelForLocParam.AutoSize = True Me.ucrReceiverExpressionExplanatoryModelForLocParam.frmParent = Me - Me.ucrReceiverExpressionExplanatoryModelForLocParam.Location = New System.Drawing.Point(258, 108) + Me.ucrReceiverExpressionExplanatoryModelForLocParam.Location = New System.Drawing.Point(387, 162) + Me.ucrReceiverExpressionExplanatoryModelForLocParam.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) Me.ucrReceiverExpressionExplanatoryModelForLocParam.Name = "ucrReceiverExpressionExplanatoryModelForLocParam" Me.ucrReceiverExpressionExplanatoryModelForLocParam.Selector = Nothing - Me.ucrReceiverExpressionExplanatoryModelForLocParam.Size = New System.Drawing.Size(251, 22) + Me.ucrReceiverExpressionExplanatoryModelForLocParam.Size = New System.Drawing.Size(376, 33) Me.ucrReceiverExpressionExplanatoryModelForLocParam.strNcFilePath = "" Me.ucrReceiverExpressionExplanatoryModelForLocParam.TabIndex = 4 Me.ucrReceiverExpressionExplanatoryModelForLocParam.ucrSelector = Nothing @@ -403,18 +404,19 @@ Partial Class dlgExtremes Me.ucrInputExtremes.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink Me.ucrInputExtremes.GetSetSelectedIndex = -1 Me.ucrInputExtremes.IsReadOnly = False - Me.ucrInputExtremes.Location = New System.Drawing.Point(79, 204) + Me.ucrInputExtremes.Location = New System.Drawing.Point(118, 306) + Me.ucrInputExtremes.Margin = New System.Windows.Forms.Padding(14, 14, 14, 14) Me.ucrInputExtremes.Name = "ucrInputExtremes" - Me.ucrInputExtremes.Size = New System.Drawing.Size(79, 21) + Me.ucrInputExtremes.Size = New System.Drawing.Size(118, 32) Me.ucrInputExtremes.TabIndex = 8 ' 'ucrSaveExtremes ' Me.ucrSaveExtremes.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrSaveExtremes.Location = New System.Drawing.Point(10, 292) - Me.ucrSaveExtremes.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) + Me.ucrSaveExtremes.Location = New System.Drawing.Point(15, 441) + Me.ucrSaveExtremes.Margin = New System.Windows.Forms.Padding(6, 8, 6, 8) Me.ucrSaveExtremes.Name = "ucrSaveExtremes" - Me.ucrSaveExtremes.Size = New System.Drawing.Size(320, 22) + Me.ucrSaveExtremes.Size = New System.Drawing.Size(480, 33) Me.ucrSaveExtremes.TabIndex = 13 ' 'ucrSelectorExtremes @@ -423,21 +425,21 @@ Partial Class dlgExtremes Me.ucrSelectorExtremes.bDropUnusedFilterLevels = False Me.ucrSelectorExtremes.bShowHiddenColumns = False Me.ucrSelectorExtremes.bUseCurrentFilter = True - Me.ucrSelectorExtremes.Location = New System.Drawing.Point(10, 10) + Me.ucrSelectorExtremes.Location = New System.Drawing.Point(15, 15) Me.ucrSelectorExtremes.Margin = New System.Windows.Forms.Padding(0) Me.ucrSelectorExtremes.Name = "ucrSelectorExtremes" - Me.ucrSelectorExtremes.Size = New System.Drawing.Size(213, 183) + Me.ucrSelectorExtremes.Size = New System.Drawing.Size(320, 274) Me.ucrSelectorExtremes.TabIndex = 0 ' 'ucrReceiverVariable ' Me.ucrReceiverVariable.AutoSize = True Me.ucrReceiverVariable.frmParent = Me - Me.ucrReceiverVariable.Location = New System.Drawing.Point(258, 60) + Me.ucrReceiverVariable.Location = New System.Drawing.Point(387, 90) Me.ucrReceiverVariable.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverVariable.Name = "ucrReceiverVariable" Me.ucrReceiverVariable.Selector = Nothing - Me.ucrReceiverVariable.Size = New System.Drawing.Size(127, 22) + Me.ucrReceiverVariable.Size = New System.Drawing.Size(190, 33) Me.ucrReceiverVariable.strNcFilePath = "" Me.ucrReceiverVariable.TabIndex = 2 Me.ucrReceiverVariable.ucrSelector = Nothing @@ -446,17 +448,18 @@ Partial Class dlgExtremes ' Me.ucrBase.AutoSize = True Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrBase.Location = New System.Drawing.Point(10, 321) + Me.ucrBase.Location = New System.Drawing.Point(15, 482) + Me.ucrBase.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(405, 52) + Me.ucrBase.Size = New System.Drawing.Size(611, 77) Me.ucrBase.TabIndex = 15 ' 'dlgExtremes ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) + Me.AutoScaleDimensions = New System.Drawing.SizeF(144.0!, 144.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(533, 378) + Me.ClientSize = New System.Drawing.Size(800, 567) Me.Controls.Add(Me.ucrInputThresholdforLocation) Me.Controls.Add(Me.lblThreshold) Me.Controls.Add(Me.ucrTryModelling) @@ -467,13 +470,13 @@ Partial Class dlgExtremes Me.Controls.Add(Me.lblFevdType) Me.Controls.Add(Me.ucrInputExtremes) Me.Controls.Add(Me.ucrSaveExtremes) - Me.Controls.Add(Me.cmdDisplayOptions) Me.Controls.Add(Me.cmdFittingOptions) Me.Controls.Add(Me.ucrSelectorExtremes) Me.Controls.Add(Me.lblDataToFit) Me.Controls.Add(Me.ucrReceiverVariable) Me.Controls.Add(Me.ucrBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow + Me.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "dlgExtremes" @@ -514,7 +517,6 @@ Partial Class dlgExtremes Friend WithEvents lblFevdType As Label Friend WithEvents ucrInputExtremes As ucrInputComboBox Friend WithEvents ucrSaveExtremes As ucrSave - Friend WithEvents cmdDisplayOptions As Button Friend WithEvents cmdFittingOptions As Button Friend WithEvents ucrSelectorExtremes As ucrSelectorByDataFrameAddRemove Friend WithEvents lblDataToFit As Label diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index 419be357250..6bf8496b631 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -153,16 +153,16 @@ Public Class dlgExtremes bResettingDialogue = False End Sub - Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click - sdgExtremesDisplayOptions.SetRCode(clsNewPlotFunction:=clsPlotsFunction, clsNewRSyntax:=ucrBase.clsRsyntax) - sdgExtremesDisplayOptions.ShowDialog() - End Sub + 'Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click + ' sdgExtremesDisplayOptions.SetRCode(clsNewPlotFunction:=clsPlotsFunction, clsNewRSyntax:=ucrBase.clsRsyntax) + ' sdgExtremesDisplayOptions.ShowDialog() + 'End Sub Private Sub TestOkEnabled() ucrBase.OKEnabled(Not ucrReceiverVariable.IsEmpty) End Sub Private Sub cmdFittingOptions_Click(sender As Object, e As EventArgs) Handles cmdFittingOptions.Click - sdgExtremesMethod.SetRCode(clsNewFevdFunction:=clsFevdFunction) + sdgExtremesMethod.SetRCode(clsNewFevdFunction:=clsFevdFunction, clsNewPlotFunction:=clsPlotsFunction, clsNewRSyntax:=ucrBase.clsRsyntax) sdgExtremesMethod.ShowDialog() End Sub diff --git a/instat/sdgExtremesMethod.Designer.vb b/instat/sdgExtremesMethod.Designer.vb index df6caf98049..829e066b3a8 100644 --- a/instat/sdgExtremesMethod.Designer.vb +++ b/instat/sdgExtremesMethod.Designer.vb @@ -22,30 +22,11 @@ Partial Class sdgExtremesMethod 'Do not modify it using the code editor. _ Private Sub InitializeComponent() - Me.ucrBase = New instat.ucrButtonsSubdialogue() - Me.ucrPanelExtreme = New instat.UcrPanel() - Me.tbRegOptions = New System.Windows.Forms.TabControl() - Me.tbFitMethod = New System.Windows.Forms.TabPage() - Me.grpInitialValues = New System.Windows.Forms.GroupBox() - Me.ucrNudIterations = New instat.ucrNud() - Me.lblNumberOfIterations = New System.Windows.Forms.Label() - Me.ucrNudLocationPrior = New instat.ucrNud() - Me.ucrNudScalePrior = New instat.ucrNud() - Me.ucrNudShapePrior = New instat.ucrNud() - Me.ucrNudLocationInitial = New instat.ucrNud() - Me.ucrNudScaleInitial = New instat.ucrNud() - Me.ucrNudShapeInitial = New instat.ucrNud() - Me.lblLocationInitial = New System.Windows.Forms.Label() - Me.lblScaleInitial = New System.Windows.Forms.Label() - Me.lblShapeInitial = New System.Windows.Forms.Label() - Me.lblLocationPrior = New System.Windows.Forms.Label() - Me.lblScalePrior = New System.Windows.Forms.Label() - Me.lblShapePrior = New System.Windows.Forms.Label() - Me.rdoLmoments = New System.Windows.Forms.RadioButton() - Me.rdoBayesian = New System.Windows.Forms.RadioButton() - Me.rdoGMLE = New System.Windows.Forms.RadioButton() - Me.rdoMLE = New System.Windows.Forms.RadioButton() - Me.grpPriorParameters = New System.Windows.Forms.GroupBox() + Me.tbConfidenceInterval = New System.Windows.Forms.TabPage() + Me.lblReturnLevel = New System.Windows.Forms.Label() + Me.ucrInputType = New instat.ucrInputComboBox() + Me.ucrChkType = New instat.ucrCheck() + Me.ucrNudReturnLevel = New instat.ucrNud() Me.tbDisplayOptions = New System.Windows.Forms.TabPage() Me.ucrSavePlots = New instat.ucrSave() Me.grpPlots = New System.Windows.Forms.GroupBox() @@ -60,311 +41,99 @@ Partial Class sdgExtremesMethod Me.rdoQQ2 = New System.Windows.Forms.RadioButton() Me.rdoPrimary = New System.Windows.Forms.RadioButton() Me.ucrPnlExtreme = New instat.UcrPanel() - Me.tbConfidenceInterval = New System.Windows.Forms.TabPage() - Me.lblReturnLevel = New System.Windows.Forms.Label() - Me.ucrNudReturnLevel = New instat.ucrNud() - Me.ucrInputType = New instat.ucrInputComboBox() - Me.ucrChkType = New instat.ucrCheck() - Me.tbRegOptions.SuspendLayout() - Me.tbFitMethod.SuspendLayout() + Me.tbRegOptions = New System.Windows.Forms.TabControl() + Me.tbFitMethod = New System.Windows.Forms.TabPage() + Me.rdoMle = New System.Windows.Forms.RadioButton() + Me.rdoBayesian = New System.Windows.Forms.RadioButton() + Me.rdoGMLE = New System.Windows.Forms.RadioButton() + Me.rdoLmoments = New System.Windows.Forms.RadioButton() + Me.ucrNudNumberOfIterations = New instat.ucrNud() + Me.lblNumberOfIterations = New System.Windows.Forms.Label() + Me.ucrNudLocationPrior = New instat.ucrNud() + Me.ucrNudScalePrior = New instat.ucrNud() + Me.ucrNudShapePrior = New instat.ucrNud() + Me.ucrNudLocationInitial = New instat.ucrNud() + Me.ucrNudScaleInitial = New instat.ucrNud() + Me.ucrNudshapeInitial = New instat.ucrNud() + Me.lblLocationInitial = New System.Windows.Forms.Label() + Me.lblScaleInitial = New System.Windows.Forms.Label() + Me.lblShapeInitial = New System.Windows.Forms.Label() + Me.lblLocationPrior = New System.Windows.Forms.Label() + Me.lblScalePrior = New System.Windows.Forms.Label() + Me.lblShapePrior = New System.Windows.Forms.Label() + Me.grpPrior = New System.Windows.Forms.GroupBox() + Me.GroupBox5 = New System.Windows.Forms.GroupBox() + Me.grpFitMethod = New System.Windows.Forms.GroupBox() + Me.ucrPnlExtremes = New instat.UcrPanel() + Me.ucrBase = New instat.ucrButtonsSubdialogue() + Me.tbConfidenceInterval.SuspendLayout() Me.tbDisplayOptions.SuspendLayout() Me.grpPlots.SuspendLayout() - Me.tbConfidenceInterval.SuspendLayout() + Me.tbRegOptions.SuspendLayout() + Me.tbFitMethod.SuspendLayout() + Me.grpFitMethod.SuspendLayout() Me.SuspendLayout() ' - 'ucrBase - ' - Me.ucrBase.AutoSize = True - Me.ucrBase.Location = New System.Drawing.Point(9, 518) - Me.ucrBase.Margin = New System.Windows.Forms.Padding(6) - Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(336, 45) - Me.ucrBase.TabIndex = 5 - ' - 'ucrPanelExtreme - ' - Me.ucrPanelExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrPanelExtreme.Location = New System.Drawing.Point(8, 16) - Me.ucrPanelExtreme.Margin = New System.Windows.Forms.Padding(9) - Me.ucrPanelExtreme.Name = "ucrPanelExtreme" - Me.ucrPanelExtreme.Size = New System.Drawing.Size(320, 178) - Me.ucrPanelExtreme.TabIndex = 0 - ' - 'tbRegOptions - ' - Me.tbRegOptions.Controls.Add(Me.tbFitMethod) - Me.tbRegOptions.Controls.Add(Me.tbDisplayOptions) - Me.tbRegOptions.Controls.Add(Me.tbConfidenceInterval) - Me.tbRegOptions.Location = New System.Drawing.Point(5, 6) - Me.tbRegOptions.Margin = New System.Windows.Forms.Padding(4) - Me.tbRegOptions.Name = "tbRegOptions" - Me.tbRegOptions.SelectedIndex = 0 - Me.tbRegOptions.Size = New System.Drawing.Size(557, 461) - Me.tbRegOptions.TabIndex = 6 - ' - 'tbFitMethod - ' - Me.tbFitMethod.Controls.Add(Me.ucrNudIterations) - Me.tbFitMethod.Controls.Add(Me.lblNumberOfIterations) - Me.tbFitMethod.Controls.Add(Me.ucrNudLocationPrior) - Me.tbFitMethod.Controls.Add(Me.ucrNudScalePrior) - Me.tbFitMethod.Controls.Add(Me.ucrNudShapePrior) - Me.tbFitMethod.Controls.Add(Me.ucrNudLocationInitial) - Me.tbFitMethod.Controls.Add(Me.ucrNudScaleInitial) - Me.tbFitMethod.Controls.Add(Me.ucrNudShapeInitial) - Me.tbFitMethod.Controls.Add(Me.lblLocationInitial) - Me.tbFitMethod.Controls.Add(Me.lblScaleInitial) - Me.tbFitMethod.Controls.Add(Me.lblShapeInitial) - Me.tbFitMethod.Controls.Add(Me.lblLocationPrior) - Me.tbFitMethod.Controls.Add(Me.lblScalePrior) - Me.tbFitMethod.Controls.Add(Me.lblShapePrior) - Me.tbFitMethod.Controls.Add(Me.rdoLmoments) - Me.tbFitMethod.Controls.Add(Me.rdoBayesian) - Me.tbFitMethod.Controls.Add(Me.rdoGMLE) - Me.tbFitMethod.Controls.Add(Me.rdoMLE) - Me.tbFitMethod.Controls.Add(Me.grpPriorParameters) - Me.tbFitMethod.Controls.Add(Me.grpInitialValues) - Me.tbFitMethod.Location = New System.Drawing.Point(4, 29) - Me.tbFitMethod.Margin = New System.Windows.Forms.Padding(4) - Me.tbFitMethod.Name = "tbFitMethod" - Me.tbFitMethod.Padding = New System.Windows.Forms.Padding(4) - Me.tbFitMethod.Size = New System.Drawing.Size(549, 428) - Me.tbFitMethod.TabIndex = 0 - Me.tbFitMethod.Tag = "Display" - Me.tbFitMethod.Text = "Fit Method" - Me.tbFitMethod.UseVisualStyleBackColor = True - ' - 'grpInitialValues - ' - Me.grpInitialValues.Location = New System.Drawing.Point(333, 195) - Me.grpInitialValues.Name = "grpInitialValues" - Me.grpInitialValues.Size = New System.Drawing.Size(214, 136) - Me.grpInitialValues.TabIndex = 24 - Me.grpInitialValues.TabStop = False - Me.grpInitialValues.Text = "Initial Values" - ' - 'ucrNudIterations - ' - Me.ucrNudIterations.AutoSize = True - Me.ucrNudIterations.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudIterations.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudIterations.Location = New System.Drawing.Point(197, 348) - Me.ucrNudIterations.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudIterations.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudIterations.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudIterations.Name = "ucrNudIterations" - Me.ucrNudIterations.Size = New System.Drawing.Size(75, 30) - Me.ucrNudIterations.TabIndex = 22 - Me.ucrNudIterations.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'lblNumberOfIterations - ' - Me.lblNumberOfIterations.AutoSize = True - Me.lblNumberOfIterations.Location = New System.Drawing.Point(26, 352) - Me.lblNumberOfIterations.Name = "lblNumberOfIterations" - Me.lblNumberOfIterations.Size = New System.Drawing.Size(158, 20) - Me.lblNumberOfIterations.TabIndex = 21 - Me.lblNumberOfIterations.Text = "Number of Iterations:" - ' - 'ucrNudLocationPrior - ' - Me.ucrNudLocationPrior.AutoSize = True - Me.ucrNudLocationPrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudLocationPrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudLocationPrior.Location = New System.Drawing.Point(142, 216) - Me.ucrNudLocationPrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudLocationPrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudLocationPrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudLocationPrior.Name = "ucrNudLocationPrior" - Me.ucrNudLocationPrior.Size = New System.Drawing.Size(75, 30) - Me.ucrNudLocationPrior.TabIndex = 20 - Me.ucrNudLocationPrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudScalePrior - ' - Me.ucrNudScalePrior.AutoSize = True - Me.ucrNudScalePrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudScalePrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudScalePrior.Location = New System.Drawing.Point(139, 256) - Me.ucrNudScalePrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudScalePrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudScalePrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudScalePrior.Name = "ucrNudScalePrior" - Me.ucrNudScalePrior.Size = New System.Drawing.Size(75, 30) - Me.ucrNudScalePrior.TabIndex = 19 - Me.ucrNudScalePrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudShapePrior - ' - Me.ucrNudShapePrior.AutoSize = True - Me.ucrNudShapePrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudShapePrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudShapePrior.Location = New System.Drawing.Point(143, 299) - Me.ucrNudShapePrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudShapePrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudShapePrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudShapePrior.Name = "ucrNudShapePrior" - Me.ucrNudShapePrior.Size = New System.Drawing.Size(75, 30) - Me.ucrNudShapePrior.TabIndex = 18 - Me.ucrNudShapePrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudLocationInitial - ' - Me.ucrNudLocationInitial.AutoSize = True - Me.ucrNudLocationInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudLocationInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudLocationInitial.Location = New System.Drawing.Point(448, 219) - Me.ucrNudLocationInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudLocationInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudLocationInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudLocationInitial.Name = "ucrNudLocationInitial" - Me.ucrNudLocationInitial.Size = New System.Drawing.Size(75, 30) - Me.ucrNudLocationInitial.TabIndex = 17 - Me.ucrNudLocationInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudScaleInitial - ' - Me.ucrNudScaleInitial.AutoSize = True - Me.ucrNudScaleInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudScaleInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudScaleInitial.Location = New System.Drawing.Point(448, 262) - Me.ucrNudScaleInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudScaleInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudScaleInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudScaleInitial.Name = "ucrNudScaleInitial" - Me.ucrNudScaleInitial.Size = New System.Drawing.Size(75, 30) - Me.ucrNudScaleInitial.TabIndex = 16 - Me.ucrNudScaleInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudShapeInitial - ' - Me.ucrNudShapeInitial.AutoSize = True - Me.ucrNudShapeInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudShapeInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudShapeInitial.Location = New System.Drawing.Point(452, 301) - Me.ucrNudShapeInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudShapeInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudShapeInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudShapeInitial.Name = "ucrNudShapeInitial" - Me.ucrNudShapeInitial.Size = New System.Drawing.Size(75, 30) - Me.ucrNudShapeInitial.TabIndex = 15 - Me.ucrNudShapeInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'lblLocationInitial - ' - Me.lblLocationInitial.AutoSize = True - Me.lblLocationInitial.Location = New System.Drawing.Point(340, 223) - Me.lblLocationInitial.Name = "lblLocationInitial" - Me.lblLocationInitial.Size = New System.Drawing.Size(74, 20) - Me.lblLocationInitial.TabIndex = 14 - Me.lblLocationInitial.Text = "Location:" - Me.lblLocationInitial.TextAlign = System.Drawing.ContentAlignment.TopCenter - ' - 'lblScaleInitial - ' - Me.lblScaleInitial.AutoSize = True - Me.lblScaleInitial.Location = New System.Drawing.Point(341, 267) - Me.lblScaleInitial.Name = "lblScaleInitial" - Me.lblScaleInitial.Size = New System.Drawing.Size(53, 20) - Me.lblScaleInitial.TabIndex = 13 - Me.lblScaleInitial.Text = "Scale:" - ' - 'lblShapeInitial - ' - Me.lblShapeInitial.AutoSize = True - Me.lblShapeInitial.Location = New System.Drawing.Point(343, 305) - Me.lblShapeInitial.Name = "lblShapeInitial" - Me.lblShapeInitial.Size = New System.Drawing.Size(60, 20) - Me.lblShapeInitial.TabIndex = 12 - Me.lblShapeInitial.Text = "Shape:" - ' - 'lblLocationPrior - ' - Me.lblLocationPrior.AutoSize = True - Me.lblLocationPrior.Location = New System.Drawing.Point(23, 220) - Me.lblLocationPrior.Name = "lblLocationPrior" - Me.lblLocationPrior.Size = New System.Drawing.Size(74, 20) - Me.lblLocationPrior.TabIndex = 11 - Me.lblLocationPrior.Text = "Location:" - ' - 'lblScalePrior - ' - Me.lblScalePrior.AutoSize = True - Me.lblScalePrior.Location = New System.Drawing.Point(31, 260) - Me.lblScalePrior.Name = "lblScalePrior" - Me.lblScalePrior.Size = New System.Drawing.Size(53, 20) - Me.lblScalePrior.TabIndex = 10 - Me.lblScalePrior.Text = "Scale:" - ' - 'lblShapePrior - ' - Me.lblShapePrior.AutoSize = True - Me.lblShapePrior.Location = New System.Drawing.Point(31, 297) - Me.lblShapePrior.Name = "lblShapePrior" - Me.lblShapePrior.Size = New System.Drawing.Size(60, 20) - Me.lblShapePrior.TabIndex = 9 - Me.lblShapePrior.Text = "Shape:" - ' - 'rdoLmoments + 'tbConfidenceInterval ' - Me.rdoLmoments.AutoSize = True - Me.rdoLmoments.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoLmoments.Location = New System.Drawing.Point(20, 151) - Me.rdoLmoments.Margin = New System.Windows.Forms.Padding(4) - Me.rdoLmoments.Name = "rdoLmoments" - Me.rdoLmoments.Size = New System.Drawing.Size(114, 24) - Me.rdoLmoments.TabIndex = 8 - Me.rdoLmoments.TabStop = True - Me.rdoLmoments.Text = "L-moments" - Me.rdoLmoments.UseVisualStyleBackColor = True + Me.tbConfidenceInterval.Controls.Add(Me.lblReturnLevel) + Me.tbConfidenceInterval.Controls.Add(Me.ucrInputType) + Me.tbConfidenceInterval.Controls.Add(Me.ucrChkType) + Me.tbConfidenceInterval.Controls.Add(Me.ucrNudReturnLevel) + Me.tbConfidenceInterval.Location = New System.Drawing.Point(4, 29) + Me.tbConfidenceInterval.Margin = New System.Windows.Forms.Padding(4) + Me.tbConfidenceInterval.Name = "tbConfidenceInterval" + Me.tbConfidenceInterval.Padding = New System.Windows.Forms.Padding(4) + Me.tbConfidenceInterval.Size = New System.Drawing.Size(549, 433) + Me.tbConfidenceInterval.TabIndex = 2 + Me.tbConfidenceInterval.Tag = "Save" + Me.tbConfidenceInterval.Text = "Confidence Interval" + Me.tbConfidenceInterval.UseVisualStyleBackColor = True ' - 'rdoBayesian + 'lblReturnLevel ' - Me.rdoBayesian.AutoSize = True - Me.rdoBayesian.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoBayesian.Location = New System.Drawing.Point(20, 116) - Me.rdoBayesian.Margin = New System.Windows.Forms.Padding(4) - Me.rdoBayesian.Name = "rdoBayesian" - Me.rdoBayesian.Size = New System.Drawing.Size(99, 24) - Me.rdoBayesian.TabIndex = 7 - Me.rdoBayesian.TabStop = True - Me.rdoBayesian.Text = "Bayesian" - Me.rdoBayesian.UseVisualStyleBackColor = True + Me.lblReturnLevel.AutoSize = True + Me.lblReturnLevel.Location = New System.Drawing.Point(356, 17) + Me.lblReturnLevel.Name = "lblReturnLevel" + Me.lblReturnLevel.Size = New System.Drawing.Size(103, 20) + Me.lblReturnLevel.TabIndex = 3 + Me.lblReturnLevel.Text = "Return Level:" ' - 'rdoGMLE + 'ucrInputType ' - Me.rdoGMLE.AutoSize = True - Me.rdoGMLE.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoGMLE.Location = New System.Drawing.Point(20, 63) - Me.rdoGMLE.Margin = New System.Windows.Forms.Padding(4) - Me.rdoGMLE.Name = "rdoGMLE" - Me.rdoGMLE.Size = New System.Drawing.Size(309, 44) - Me.rdoGMLE.TabIndex = 6 - Me.rdoGMLE.TabStop = True - Me.rdoGMLE.Text = "General Maximum Likelihood Estimator" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "(GMLE)" - Me.rdoGMLE.UseVisualStyleBackColor = True + Me.ucrInputType.AddQuotesIfUnrecognised = True + Me.ucrInputType.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputType.GetSetSelectedIndex = -1 + Me.ucrInputType.IsReadOnly = False + Me.ucrInputType.Location = New System.Drawing.Point(174, 13) + Me.ucrInputType.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) + Me.ucrInputType.Name = "ucrInputType" + Me.ucrInputType.Size = New System.Drawing.Size(175, 32) + Me.ucrInputType.TabIndex = 1 ' - 'rdoMLE + 'ucrChkType ' - Me.rdoMLE.AutoSize = True - Me.rdoMLE.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoMLE.Location = New System.Drawing.Point(20, 27) - Me.rdoMLE.Margin = New System.Windows.Forms.Padding(4) - Me.rdoMLE.Name = "rdoMLE" - Me.rdoMLE.Size = New System.Drawing.Size(223, 24) - Me.rdoMLE.TabIndex = 5 - Me.rdoMLE.TabStop = True - Me.rdoMLE.Text = "Maximum Likelihood (MLE)" - Me.rdoMLE.UseVisualStyleBackColor = True + Me.ucrChkType.AutoSize = True + Me.ucrChkType.Checked = False + Me.ucrChkType.Location = New System.Drawing.Point(12, 14) + Me.ucrChkType.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrChkType.Name = "ucrChkType" + Me.ucrChkType.Size = New System.Drawing.Size(150, 34) + Me.ucrChkType.TabIndex = 0 ' - 'grpPriorParameters + 'ucrNudReturnLevel ' - Me.grpPriorParameters.Location = New System.Drawing.Point(20, 182) - Me.grpPriorParameters.Name = "grpPriorParameters" - Me.grpPriorParameters.Size = New System.Drawing.Size(233, 149) - Me.grpPriorParameters.TabIndex = 23 - Me.grpPriorParameters.TabStop = False - Me.grpPriorParameters.Text = "Prior Parameters" + Me.ucrNudReturnLevel.AutoSize = True + Me.ucrNudReturnLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudReturnLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudReturnLevel.Location = New System.Drawing.Point(466, 13) + Me.ucrNudReturnLevel.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudReturnLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudReturnLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudReturnLevel.Name = "ucrNudReturnLevel" + Me.ucrNudReturnLevel.Size = New System.Drawing.Size(75, 30) + Me.ucrNudReturnLevel.TabIndex = 2 + Me.ucrNudReturnLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'tbDisplayOptions ' @@ -374,7 +143,7 @@ Partial Class sdgExtremesMethod Me.tbDisplayOptions.Margin = New System.Windows.Forms.Padding(4) Me.tbDisplayOptions.Name = "tbDisplayOptions" Me.tbDisplayOptions.Padding = New System.Windows.Forms.Padding(4) - Me.tbDisplayOptions.Size = New System.Drawing.Size(549, 428) + Me.tbDisplayOptions.Size = New System.Drawing.Size(549, 433) Me.tbDisplayOptions.TabIndex = 1 Me.tbDisplayOptions.Tag = "Graphics" Me.tbDisplayOptions.Text = "Display Options" @@ -435,181 +204,420 @@ Partial Class sdgExtremesMethod Me.rdoTrace.Text = "Trace Plot" Me.rdoTrace.UseVisualStyleBackColor = True ' - 'rdoRlplot + 'rdoRlplot + ' + Me.rdoRlplot.AutoSize = True + Me.rdoRlplot.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoRlplot.Location = New System.Drawing.Point(20, 138) + Me.rdoRlplot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoRlplot.Name = "rdoRlplot" + Me.rdoRlplot.Size = New System.Drawing.Size(80, 24) + Me.rdoRlplot.TabIndex = 4 + Me.rdoRlplot.Text = "Rl Plot" + Me.rdoRlplot.UseVisualStyleBackColor = True + ' + 'rdoHist + ' + Me.rdoHist.AutoSize = True + Me.rdoHist.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoHist.Location = New System.Drawing.Point(224, 104) + Me.rdoHist.Margin = New System.Windows.Forms.Padding(4) + Me.rdoHist.Name = "rdoHist" + Me.rdoHist.Size = New System.Drawing.Size(93, 24) + Me.rdoHist.TabIndex = 8 + Me.rdoHist.Text = "Hist Plot" + Me.rdoHist.UseVisualStyleBackColor = True + ' + 'rdoDensity + ' + Me.rdoDensity.AutoSize = True + Me.rdoDensity.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoDensity.Location = New System.Drawing.Point(224, 140) + Me.rdoDensity.Margin = New System.Windows.Forms.Padding(4) + Me.rdoDensity.Name = "rdoDensity" + Me.rdoDensity.Size = New System.Drawing.Size(118, 24) + Me.rdoDensity.TabIndex = 9 + Me.rdoDensity.Text = "Density Plot" + Me.rdoDensity.UseVisualStyleBackColor = True + ' + 'rdoZPlot + ' + Me.rdoZPlot.AutoSize = True + Me.rdoZPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoZPlot.Location = New System.Drawing.Point(224, 69) + Me.rdoZPlot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoZPlot.Name = "rdoZPlot" + Me.rdoZPlot.Size = New System.Drawing.Size(101, 24) + Me.rdoZPlot.TabIndex = 7 + Me.rdoZPlot.Text = "Zplot Plot" + Me.rdoZPlot.UseVisualStyleBackColor = True + ' + 'rdoProbprob + ' + Me.rdoProbprob.AutoSize = True + Me.rdoProbprob.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoProbprob.Location = New System.Drawing.Point(20, 104) + Me.rdoProbprob.Margin = New System.Windows.Forms.Padding(4) + Me.rdoProbprob.Name = "rdoProbprob" + Me.rdoProbprob.Size = New System.Drawing.Size(135, 24) + Me.rdoProbprob.TabIndex = 3 + Me.rdoProbprob.Text = "Prob-prob Plot" + Me.rdoProbprob.UseVisualStyleBackColor = True + ' + 'rdoQQPlot + ' + Me.rdoQQPlot.AutoSize = True + Me.rdoQQPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoQQPlot.Location = New System.Drawing.Point(224, 34) + Me.rdoQQPlot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoQQPlot.Name = "rdoQQPlot" + Me.rdoQQPlot.Size = New System.Drawing.Size(89, 24) + Me.rdoQQPlot.TabIndex = 6 + Me.rdoQQPlot.Text = "QQ Plot" + Me.rdoQQPlot.UseVisualStyleBackColor = True + ' + 'rdoQQ2 + ' + Me.rdoQQ2.AutoSize = True + Me.rdoQQ2.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoQQ2.Location = New System.Drawing.Point(224, 172) + Me.rdoQQ2.Margin = New System.Windows.Forms.Padding(4) + Me.rdoQQ2.Name = "rdoQQ2" + Me.rdoQQ2.Size = New System.Drawing.Size(98, 24) + Me.rdoQQ2.TabIndex = 10 + Me.rdoQQ2.Text = "QQ2 Plot" + Me.rdoQQ2.UseVisualStyleBackColor = True + ' + 'rdoPrimary + ' + Me.rdoPrimary.AutoSize = True + Me.rdoPrimary.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoPrimary.Location = New System.Drawing.Point(20, 69) + Me.rdoPrimary.Margin = New System.Windows.Forms.Padding(4) + Me.rdoPrimary.Name = "rdoPrimary" + Me.rdoPrimary.Size = New System.Drawing.Size(86, 24) + Me.rdoPrimary.TabIndex = 2 + Me.rdoPrimary.Text = "Primary" + Me.rdoPrimary.UseVisualStyleBackColor = True + ' + 'ucrPnlExtreme + ' + Me.ucrPnlExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlExtreme.Location = New System.Drawing.Point(12, 23) + Me.ucrPnlExtreme.Margin = New System.Windows.Forms.Padding(9) + Me.ucrPnlExtreme.Name = "ucrPnlExtreme" + Me.ucrPnlExtreme.Size = New System.Drawing.Size(358, 176) + Me.ucrPnlExtreme.TabIndex = 0 + ' + 'tbRegOptions + ' + Me.tbRegOptions.Controls.Add(Me.tbFitMethod) + Me.tbRegOptions.Controls.Add(Me.tbDisplayOptions) + Me.tbRegOptions.Controls.Add(Me.tbConfidenceInterval) + Me.tbRegOptions.Location = New System.Drawing.Point(5, 6) + Me.tbRegOptions.Margin = New System.Windows.Forms.Padding(4) + Me.tbRegOptions.Name = "tbRegOptions" + Me.tbRegOptions.SelectedIndex = 0 + Me.tbRegOptions.Size = New System.Drawing.Size(557, 466) + Me.tbRegOptions.TabIndex = 6 + ' + 'tbFitMethod + ' + Me.tbFitMethod.Controls.Add(Me.rdoMle) + Me.tbFitMethod.Controls.Add(Me.rdoBayesian) + Me.tbFitMethod.Controls.Add(Me.rdoGMLE) + Me.tbFitMethod.Controls.Add(Me.rdoLmoments) + Me.tbFitMethod.Controls.Add(Me.ucrNudNumberOfIterations) + Me.tbFitMethod.Controls.Add(Me.lblNumberOfIterations) + Me.tbFitMethod.Controls.Add(Me.ucrNudLocationPrior) + Me.tbFitMethod.Controls.Add(Me.ucrNudScalePrior) + Me.tbFitMethod.Controls.Add(Me.ucrNudShapePrior) + Me.tbFitMethod.Controls.Add(Me.ucrNudLocationInitial) + Me.tbFitMethod.Controls.Add(Me.ucrNudScaleInitial) + Me.tbFitMethod.Controls.Add(Me.ucrNudshapeInitial) + Me.tbFitMethod.Controls.Add(Me.lblLocationInitial) + Me.tbFitMethod.Controls.Add(Me.lblScaleInitial) + Me.tbFitMethod.Controls.Add(Me.lblShapeInitial) + Me.tbFitMethod.Controls.Add(Me.lblLocationPrior) + Me.tbFitMethod.Controls.Add(Me.lblScalePrior) + Me.tbFitMethod.Controls.Add(Me.lblShapePrior) + Me.tbFitMethod.Controls.Add(Me.grpPrior) + Me.tbFitMethod.Controls.Add(Me.GroupBox5) + Me.tbFitMethod.Controls.Add(Me.grpFitMethod) + Me.tbFitMethod.Location = New System.Drawing.Point(4, 29) + Me.tbFitMethod.Margin = New System.Windows.Forms.Padding(4) + Me.tbFitMethod.Name = "tbFitMethod" + Me.tbFitMethod.Padding = New System.Windows.Forms.Padding(4) + Me.tbFitMethod.Size = New System.Drawing.Size(549, 433) + Me.tbFitMethod.TabIndex = 0 + Me.tbFitMethod.Tag = "Display" + Me.tbFitMethod.Text = "Fit Method" + Me.tbFitMethod.UseVisualStyleBackColor = True + ' + 'rdoMle + ' + Me.rdoMle.AutoSize = True + Me.rdoMle.Location = New System.Drawing.Point(23, 33) + Me.rdoMle.Name = "rdoMle" + Me.rdoMle.Size = New System.Drawing.Size(219, 24) + Me.rdoMle.TabIndex = 72 + Me.rdoMle.TabStop = True + Me.rdoMle.Text = "Maximum Likelihood(MLE)" + Me.rdoMle.UseVisualStyleBackColor = True + ' + 'rdoBayesian + ' + Me.rdoBayesian.AutoSize = True + Me.rdoBayesian.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoBayesian.Location = New System.Drawing.Point(23, 99) + Me.rdoBayesian.Margin = New System.Windows.Forms.Padding(4) + Me.rdoBayesian.Name = "rdoBayesian" + Me.rdoBayesian.Size = New System.Drawing.Size(99, 24) + Me.rdoBayesian.TabIndex = 71 + Me.rdoBayesian.Text = "Bayesian" + Me.rdoBayesian.UseVisualStyleBackColor = True + ' + 'rdoGMLE + ' + Me.rdoGMLE.AutoSize = True + Me.rdoGMLE.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoGMLE.Location = New System.Drawing.Point(23, 65) + Me.rdoGMLE.Margin = New System.Windows.Forms.Padding(4) + Me.rdoGMLE.Name = "rdoGMLE" + Me.rdoGMLE.Size = New System.Drawing.Size(365, 24) + Me.rdoGMLE.TabIndex = 70 + Me.rdoGMLE.Text = "General Maximum Likelihood Estimator(GMLE)" + Me.rdoGMLE.UseVisualStyleBackColor = True + ' + 'rdoLmoments + ' + Me.rdoLmoments.AutoSize = True + Me.rdoLmoments.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoLmoments.Location = New System.Drawing.Point(23, 132) + Me.rdoLmoments.Margin = New System.Windows.Forms.Padding(4) + Me.rdoLmoments.Name = "rdoLmoments" + Me.rdoLmoments.Size = New System.Drawing.Size(114, 24) + Me.rdoLmoments.TabIndex = 69 + Me.rdoLmoments.Text = "L-Moments" + Me.rdoLmoments.UseVisualStyleBackColor = True + ' + 'ucrNudNumberOfIterations + ' + Me.ucrNudNumberOfIterations.AutoSize = True + Me.ucrNudNumberOfIterations.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudNumberOfIterations.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudNumberOfIterations.Location = New System.Drawing.Point(193, 372) + Me.ucrNudNumberOfIterations.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudNumberOfIterations.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudNumberOfIterations.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudNumberOfIterations.Name = "ucrNudNumberOfIterations" + Me.ucrNudNumberOfIterations.Size = New System.Drawing.Size(75, 30) + Me.ucrNudNumberOfIterations.TabIndex = 64 + Me.ucrNudNumberOfIterations.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'lblNumberOfIterations + ' + Me.lblNumberOfIterations.AutoSize = True + Me.lblNumberOfIterations.Location = New System.Drawing.Point(22, 376) + Me.lblNumberOfIterations.Name = "lblNumberOfIterations" + Me.lblNumberOfIterations.Size = New System.Drawing.Size(158, 20) + Me.lblNumberOfIterations.TabIndex = 63 + Me.lblNumberOfIterations.Text = "Number of Iterations:" + ' + 'ucrNudLocationPrior + ' + Me.ucrNudLocationPrior.AutoSize = True + Me.ucrNudLocationPrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocationPrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudLocationPrior.Location = New System.Drawing.Point(138, 240) + Me.ucrNudLocationPrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudLocationPrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudLocationPrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocationPrior.Name = "ucrNudLocationPrior" + Me.ucrNudLocationPrior.Size = New System.Drawing.Size(75, 30) + Me.ucrNudLocationPrior.TabIndex = 62 + Me.ucrNudLocationPrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudScalePrior + ' + Me.ucrNudScalePrior.AutoSize = True + Me.ucrNudScalePrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScalePrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudScalePrior.Location = New System.Drawing.Point(135, 280) + Me.ucrNudScalePrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudScalePrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudScalePrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScalePrior.Name = "ucrNudScalePrior" + Me.ucrNudScalePrior.Size = New System.Drawing.Size(75, 30) + Me.ucrNudScalePrior.TabIndex = 61 + Me.ucrNudScalePrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudShapePrior ' - Me.rdoRlplot.AutoSize = True - Me.rdoRlplot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoRlplot.Location = New System.Drawing.Point(20, 138) - Me.rdoRlplot.Margin = New System.Windows.Forms.Padding(4) - Me.rdoRlplot.Name = "rdoRlplot" - Me.rdoRlplot.Size = New System.Drawing.Size(80, 24) - Me.rdoRlplot.TabIndex = 4 - Me.rdoRlplot.Text = "Rl Plot" - Me.rdoRlplot.UseVisualStyleBackColor = True + Me.ucrNudShapePrior.AutoSize = True + Me.ucrNudShapePrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudShapePrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudShapePrior.Location = New System.Drawing.Point(139, 323) + Me.ucrNudShapePrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudShapePrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudShapePrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudShapePrior.Name = "ucrNudShapePrior" + Me.ucrNudShapePrior.Size = New System.Drawing.Size(75, 30) + Me.ucrNudShapePrior.TabIndex = 60 + Me.ucrNudShapePrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'rdoHist + 'ucrNudLocationInitial ' - Me.rdoHist.AutoSize = True - Me.rdoHist.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoHist.Location = New System.Drawing.Point(224, 104) - Me.rdoHist.Margin = New System.Windows.Forms.Padding(4) - Me.rdoHist.Name = "rdoHist" - Me.rdoHist.Size = New System.Drawing.Size(93, 24) - Me.rdoHist.TabIndex = 8 - Me.rdoHist.Text = "Hist Plot" - Me.rdoHist.UseVisualStyleBackColor = True + Me.ucrNudLocationInitial.AutoSize = True + Me.ucrNudLocationInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocationInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudLocationInitial.Location = New System.Drawing.Point(444, 243) + Me.ucrNudLocationInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudLocationInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudLocationInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocationInitial.Name = "ucrNudLocationInitial" + Me.ucrNudLocationInitial.Size = New System.Drawing.Size(75, 30) + Me.ucrNudLocationInitial.TabIndex = 59 + Me.ucrNudLocationInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'rdoDensity + 'ucrNudScaleInitial ' - Me.rdoDensity.AutoSize = True - Me.rdoDensity.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoDensity.Location = New System.Drawing.Point(224, 140) - Me.rdoDensity.Margin = New System.Windows.Forms.Padding(4) - Me.rdoDensity.Name = "rdoDensity" - Me.rdoDensity.Size = New System.Drawing.Size(118, 24) - Me.rdoDensity.TabIndex = 9 - Me.rdoDensity.Text = "Density Plot" - Me.rdoDensity.UseVisualStyleBackColor = True + Me.ucrNudScaleInitial.AutoSize = True + Me.ucrNudScaleInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScaleInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudScaleInitial.Location = New System.Drawing.Point(444, 286) + Me.ucrNudScaleInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudScaleInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudScaleInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScaleInitial.Name = "ucrNudScaleInitial" + Me.ucrNudScaleInitial.Size = New System.Drawing.Size(75, 30) + Me.ucrNudScaleInitial.TabIndex = 58 + Me.ucrNudScaleInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'rdoZPlot + 'ucrNudshapeInitial ' - Me.rdoZPlot.AutoSize = True - Me.rdoZPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoZPlot.Location = New System.Drawing.Point(224, 69) - Me.rdoZPlot.Margin = New System.Windows.Forms.Padding(4) - Me.rdoZPlot.Name = "rdoZPlot" - Me.rdoZPlot.Size = New System.Drawing.Size(101, 24) - Me.rdoZPlot.TabIndex = 7 - Me.rdoZPlot.Text = "Zplot Plot" - Me.rdoZPlot.UseVisualStyleBackColor = True + Me.ucrNudshapeInitial.AutoSize = True + Me.ucrNudshapeInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudshapeInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudshapeInitial.Location = New System.Drawing.Point(448, 325) + Me.ucrNudshapeInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudshapeInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudshapeInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudshapeInitial.Name = "ucrNudshapeInitial" + Me.ucrNudshapeInitial.Size = New System.Drawing.Size(75, 30) + Me.ucrNudshapeInitial.TabIndex = 57 + Me.ucrNudshapeInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'rdoProbprob + 'lblLocationInitial ' - Me.rdoProbprob.AutoSize = True - Me.rdoProbprob.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoProbprob.Location = New System.Drawing.Point(20, 104) - Me.rdoProbprob.Margin = New System.Windows.Forms.Padding(4) - Me.rdoProbprob.Name = "rdoProbprob" - Me.rdoProbprob.Size = New System.Drawing.Size(135, 24) - Me.rdoProbprob.TabIndex = 3 - Me.rdoProbprob.Text = "Prob-prob Plot" - Me.rdoProbprob.UseVisualStyleBackColor = True + Me.lblLocationInitial.AutoSize = True + Me.lblLocationInitial.Location = New System.Drawing.Point(336, 247) + Me.lblLocationInitial.Name = "lblLocationInitial" + Me.lblLocationInitial.Size = New System.Drawing.Size(74, 20) + Me.lblLocationInitial.TabIndex = 56 + Me.lblLocationInitial.Text = "Location:" + Me.lblLocationInitial.TextAlign = System.Drawing.ContentAlignment.TopCenter ' - 'rdoQQPlot + 'lblScaleInitial ' - Me.rdoQQPlot.AutoSize = True - Me.rdoQQPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoQQPlot.Location = New System.Drawing.Point(224, 34) - Me.rdoQQPlot.Margin = New System.Windows.Forms.Padding(4) - Me.rdoQQPlot.Name = "rdoQQPlot" - Me.rdoQQPlot.Size = New System.Drawing.Size(89, 24) - Me.rdoQQPlot.TabIndex = 6 - Me.rdoQQPlot.Text = "QQ Plot" - Me.rdoQQPlot.UseVisualStyleBackColor = True + Me.lblScaleInitial.AutoSize = True + Me.lblScaleInitial.Location = New System.Drawing.Point(337, 291) + Me.lblScaleInitial.Name = "lblScaleInitial" + Me.lblScaleInitial.Size = New System.Drawing.Size(53, 20) + Me.lblScaleInitial.TabIndex = 55 + Me.lblScaleInitial.Text = "Scale:" ' - 'rdoQQ2 + 'lblShapeInitial ' - Me.rdoQQ2.AutoSize = True - Me.rdoQQ2.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoQQ2.Location = New System.Drawing.Point(224, 172) - Me.rdoQQ2.Margin = New System.Windows.Forms.Padding(4) - Me.rdoQQ2.Name = "rdoQQ2" - Me.rdoQQ2.Size = New System.Drawing.Size(98, 24) - Me.rdoQQ2.TabIndex = 10 - Me.rdoQQ2.Text = "QQ2 Plot" - Me.rdoQQ2.UseVisualStyleBackColor = True + Me.lblShapeInitial.AutoSize = True + Me.lblShapeInitial.Location = New System.Drawing.Point(339, 329) + Me.lblShapeInitial.Name = "lblShapeInitial" + Me.lblShapeInitial.Size = New System.Drawing.Size(60, 20) + Me.lblShapeInitial.TabIndex = 54 + Me.lblShapeInitial.Text = "Shape:" ' - 'rdoPrimary + 'lblLocationPrior ' - Me.rdoPrimary.AutoSize = True - Me.rdoPrimary.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoPrimary.Location = New System.Drawing.Point(20, 69) - Me.rdoPrimary.Margin = New System.Windows.Forms.Padding(4) - Me.rdoPrimary.Name = "rdoPrimary" - Me.rdoPrimary.Size = New System.Drawing.Size(86, 24) - Me.rdoPrimary.TabIndex = 2 - Me.rdoPrimary.Text = "Primary" - Me.rdoPrimary.UseVisualStyleBackColor = True + Me.lblLocationPrior.AutoSize = True + Me.lblLocationPrior.Location = New System.Drawing.Point(19, 244) + Me.lblLocationPrior.Name = "lblLocationPrior" + Me.lblLocationPrior.Size = New System.Drawing.Size(74, 20) + Me.lblLocationPrior.TabIndex = 53 + Me.lblLocationPrior.Text = "Location:" ' - 'ucrPnlExtreme + 'lblScalePrior ' - Me.ucrPnlExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrPnlExtreme.Location = New System.Drawing.Point(12, 23) - Me.ucrPnlExtreme.Margin = New System.Windows.Forms.Padding(9) - Me.ucrPnlExtreme.Name = "ucrPnlExtreme" - Me.ucrPnlExtreme.Size = New System.Drawing.Size(358, 176) - Me.ucrPnlExtreme.TabIndex = 0 + Me.lblScalePrior.AutoSize = True + Me.lblScalePrior.Location = New System.Drawing.Point(27, 284) + Me.lblScalePrior.Name = "lblScalePrior" + Me.lblScalePrior.Size = New System.Drawing.Size(53, 20) + Me.lblScalePrior.TabIndex = 52 + Me.lblScalePrior.Text = "Scale:" ' - 'tbConfidenceInterval + 'lblShapePrior ' - Me.tbConfidenceInterval.Controls.Add(Me.lblReturnLevel) - Me.tbConfidenceInterval.Controls.Add(Me.ucrNudReturnLevel) - Me.tbConfidenceInterval.Controls.Add(Me.ucrInputType) - Me.tbConfidenceInterval.Controls.Add(Me.ucrChkType) - Me.tbConfidenceInterval.Location = New System.Drawing.Point(4, 29) - Me.tbConfidenceInterval.Margin = New System.Windows.Forms.Padding(4) - Me.tbConfidenceInterval.Name = "tbConfidenceInterval" - Me.tbConfidenceInterval.Padding = New System.Windows.Forms.Padding(4) - Me.tbConfidenceInterval.Size = New System.Drawing.Size(549, 428) - Me.tbConfidenceInterval.TabIndex = 2 - Me.tbConfidenceInterval.Tag = "Save" - Me.tbConfidenceInterval.Text = "Confidence Interval" - Me.tbConfidenceInterval.UseVisualStyleBackColor = True + Me.lblShapePrior.AutoSize = True + Me.lblShapePrior.Location = New System.Drawing.Point(27, 321) + Me.lblShapePrior.Name = "lblShapePrior" + Me.lblShapePrior.Size = New System.Drawing.Size(60, 20) + Me.lblShapePrior.TabIndex = 51 + Me.lblShapePrior.Text = "Shape:" ' - 'lblReturnLevel + 'grpPrior ' - Me.lblReturnLevel.AutoSize = True - Me.lblReturnLevel.Location = New System.Drawing.Point(356, 17) - Me.lblReturnLevel.Name = "lblReturnLevel" - Me.lblReturnLevel.Size = New System.Drawing.Size(103, 20) - Me.lblReturnLevel.TabIndex = 3 - Me.lblReturnLevel.Text = "Return Level:" + Me.grpPrior.Location = New System.Drawing.Point(16, 206) + Me.grpPrior.Name = "grpPrior" + Me.grpPrior.Size = New System.Drawing.Size(233, 149) + Me.grpPrior.TabIndex = 65 + Me.grpPrior.TabStop = False + Me.grpPrior.Text = "Prior Parameters" + Me.grpPrior.Visible = False ' - 'ucrNudReturnLevel + 'GroupBox5 ' - Me.ucrNudReturnLevel.AutoSize = True - Me.ucrNudReturnLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudReturnLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudReturnLevel.Location = New System.Drawing.Point(466, 13) - Me.ucrNudReturnLevel.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudReturnLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudReturnLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudReturnLevel.Name = "ucrNudReturnLevel" - Me.ucrNudReturnLevel.Size = New System.Drawing.Size(75, 30) - Me.ucrNudReturnLevel.TabIndex = 2 - Me.ucrNudReturnLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + Me.GroupBox5.Location = New System.Drawing.Point(329, 219) + Me.GroupBox5.Name = "GroupBox5" + Me.GroupBox5.Size = New System.Drawing.Size(214, 136) + Me.GroupBox5.TabIndex = 66 + Me.GroupBox5.TabStop = False + Me.GroupBox5.Text = "Initial Values" ' - 'ucrInputType + 'grpFitMethod ' - Me.ucrInputType.AddQuotesIfUnrecognised = True - Me.ucrInputType.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputType.GetSetSelectedIndex = -1 - Me.ucrInputType.IsReadOnly = False - Me.ucrInputType.Location = New System.Drawing.Point(174, 13) - Me.ucrInputType.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) - Me.ucrInputType.Name = "ucrInputType" - Me.ucrInputType.Size = New System.Drawing.Size(175, 32) - Me.ucrInputType.TabIndex = 1 + Me.grpFitMethod.Controls.Add(Me.ucrPnlExtremes) + Me.grpFitMethod.Location = New System.Drawing.Point(7, 7) + Me.grpFitMethod.Name = "grpFitMethod" + Me.grpFitMethod.Size = New System.Drawing.Size(403, 169) + Me.grpFitMethod.TabIndex = 73 + Me.grpFitMethod.TabStop = False + Me.grpFitMethod.Text = "Fit Method" ' - 'ucrChkType + 'ucrPnlExtremes ' - Me.ucrChkType.AutoSize = True - Me.ucrChkType.Checked = False - Me.ucrChkType.Location = New System.Drawing.Point(12, 14) - Me.ucrChkType.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrChkType.Name = "ucrChkType" - Me.ucrChkType.Size = New System.Drawing.Size(150, 34) - Me.ucrChkType.TabIndex = 0 + Me.ucrPnlExtremes.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlExtremes.Location = New System.Drawing.Point(9, 22) + Me.ucrPnlExtremes.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrPnlExtremes.Name = "ucrPnlExtremes" + Me.ucrPnlExtremes.Size = New System.Drawing.Size(370, 138) + Me.ucrPnlExtremes.TabIndex = 74 + ' + 'ucrBase + ' + Me.ucrBase.AutoSize = True + Me.ucrBase.Location = New System.Drawing.Point(9, 518) + Me.ucrBase.Margin = New System.Windows.Forms.Padding(6) + Me.ucrBase.Name = "ucrBase" + Me.ucrBase.Size = New System.Drawing.Size(336, 45) + Me.ucrBase.TabIndex = 5 ' 'sdgExtremesMethod ' Me.AutoScaleDimensions = New System.Drawing.SizeF(144.0!, 144.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(575, 641) + Me.ClientSize = New System.Drawing.Size(575, 600) Me.Controls.Add(Me.tbRegOptions) Me.Controls.Add(Me.ucrBase) - Me.Controls.Add(Me.ucrPanelExtreme) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.Margin = New System.Windows.Forms.Padding(4) Me.MaximizeBox = False @@ -617,29 +625,28 @@ Partial Class sdgExtremesMethod Me.Name = "sdgExtremesMethod" Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Text = "Extremes Method" - Me.tbRegOptions.ResumeLayout(False) - Me.tbFitMethod.ResumeLayout(False) - Me.tbFitMethod.PerformLayout() + Me.tbConfidenceInterval.ResumeLayout(False) + Me.tbConfidenceInterval.PerformLayout() Me.tbDisplayOptions.ResumeLayout(False) Me.grpPlots.ResumeLayout(False) Me.grpPlots.PerformLayout() - Me.tbConfidenceInterval.ResumeLayout(False) - Me.tbConfidenceInterval.PerformLayout() + Me.tbRegOptions.ResumeLayout(False) + Me.tbFitMethod.ResumeLayout(False) + Me.tbFitMethod.PerformLayout() + Me.grpFitMethod.ResumeLayout(False) Me.ResumeLayout(False) Me.PerformLayout() End Sub Friend WithEvents ucrBase As ucrButtonsSubdialogue - Friend WithEvents ucrPanelExtreme As UcrPanel - Friend WithEvents tbRegOptions As TabControl - Friend WithEvents tbFitMethod As TabPage - Friend WithEvents rdoLmoments As RadioButton - Friend WithEvents rdoBayesian As RadioButton - Friend WithEvents rdoGMLE As RadioButton - Friend WithEvents rdoMLE As RadioButton - Friend WithEvents tbDisplayOptions As TabPage Friend WithEvents tbConfidenceInterval As TabPage + Friend WithEvents lblReturnLevel As Label + Friend WithEvents ucrInputType As ucrInputComboBox + Friend WithEvents ucrChkType As ucrCheck + Friend WithEvents ucrNudReturnLevel As ucrNud + Friend WithEvents tbDisplayOptions As TabPage + Friend WithEvents ucrSavePlots As ucrSave Friend WithEvents grpPlots As GroupBox Friend WithEvents rdoNoPlot As RadioButton Friend WithEvents rdoTrace As RadioButton @@ -652,25 +659,28 @@ Partial Class sdgExtremesMethod Friend WithEvents rdoQQ2 As RadioButton Friend WithEvents rdoPrimary As RadioButton Friend WithEvents ucrPnlExtreme As UcrPanel - Friend WithEvents ucrSavePlots As ucrSave - Friend WithEvents ucrInputType As ucrInputComboBox - Friend WithEvents ucrChkType As ucrCheck - Friend WithEvents ucrNudReturnLevel As ucrNud - Friend WithEvents lblReturnLevel As Label + Friend WithEvents tbRegOptions As TabControl + Friend WithEvents tbFitMethod As TabPage + Friend WithEvents rdoMle As RadioButton + Friend WithEvents rdoBayesian As RadioButton + Friend WithEvents rdoGMLE As RadioButton + Friend WithEvents rdoLmoments As RadioButton + Friend WithEvents ucrNudNumberOfIterations As ucrNud + Friend WithEvents lblNumberOfIterations As Label + Friend WithEvents ucrNudLocationPrior As ucrNud + Friend WithEvents ucrNudScalePrior As ucrNud + Friend WithEvents ucrNudShapePrior As ucrNud + Friend WithEvents ucrNudLocationInitial As ucrNud + Friend WithEvents ucrNudScaleInitial As ucrNud + Friend WithEvents ucrNudshapeInitial As ucrNud Friend WithEvents lblLocationInitial As Label Friend WithEvents lblScaleInitial As Label Friend WithEvents lblShapeInitial As Label Friend WithEvents lblLocationPrior As Label Friend WithEvents lblScalePrior As Label Friend WithEvents lblShapePrior As Label - Friend WithEvents ucrNudLocationPrior As ucrNud - Friend WithEvents ucrNudScalePrior As ucrNud - Friend WithEvents ucrNudShapePrior As ucrNud - Friend WithEvents ucrNudLocationInitial As ucrNud - Friend WithEvents ucrNudScaleInitial As ucrNud - Friend WithEvents ucrNudShapeInitial As ucrNud - Friend WithEvents grpInitialValues As GroupBox - Friend WithEvents ucrNudIterations As ucrNud - Friend WithEvents lblNumberOfIterations As Label - Friend WithEvents grpPriorParameters As GroupBox + Friend WithEvents grpPrior As GroupBox + Friend WithEvents GroupBox5 As GroupBox + Friend WithEvents grpFitMethod As GroupBox + Friend WithEvents ucrPnlExtremes As UcrPanel End Class diff --git a/instat/sdgExtremesMethod.vb b/instat/sdgExtremesMethod.vb index 0f8bffa7850..7641b59ec6d 100644 --- a/instat/sdgExtremesMethod.vb +++ b/instat/sdgExtremesMethod.vb @@ -15,21 +15,104 @@ ' along with this program. If not, see . Public Class sdgExtremesMethod Private clsFevdFunction As New RFunction + Public clsPlotFunction As New RFunction + Public clsRsyntax As New RSyntax Public bControlsInitialised As Boolean = False Public Sub InitialiseControls() - ucrPanelExtreme.SetParameter(New RParameter("method", 2)) - ucrPanelExtreme.AddRadioButton(rdoMLE, Chr(34) & "MLE" & Chr(34)) - ucrPanelExtreme.AddRadioButton(rdoBayesian, Chr(34) & "Bayesian" & Chr(34)) - ucrPanelExtreme.AddRadioButton(rdoGMLE, Chr(34) & "GMLE" & Chr(34)) - ucrPanelExtreme.AddRadioButton(rdoLmoments, Chr(34) & "Lmoments" & Chr(34)) + ucrPnlExtremes.SetParameter(New RParameter("method", 2)) + ucrPnlExtremes.AddRadioButton(rdoMle, Chr(34) & "MLE" & Chr(34)) + ucrPnlExtremes.AddRadioButton(rdoBayesian, Chr(34) & "Bayesian" & Chr(34)) + ucrPnlExtremes.AddRadioButton(rdoGMLE, Chr(34) & "GMLE" & Chr(34)) + ucrPnlExtremes.AddRadioButton(rdoLmoments, Chr(34) & "Lmoments" & Chr(34)) + + ucrNudLocationPrior.SetLinkedDisplayControl(lblLocationPrior) + ucrNudScalePrior.SetLinkedDisplayControl(lblScalePrior) + ucrNudShapePrior.SetLinkedDisplayControl(lblShapePrior) + ucrNudLocationInitial.SetLinkedDisplayControl(lblLocationInitial) + ucrNudScaleInitial.SetLinkedDisplayControl(lblScaleInitial) + ucrNudshapeInitial.SetLinkedDisplayControl(lblShapeInitial) + ucrNudNumberOfIterations.SetLinkedDisplayControl(lblNumberOfIterations) + + + 'ucrPnlExtremes.AddToLinkedControls({ucrNudLocationInitial, ucrNudLocationPrior, ucrNudScaleInitial, ucrNudScalePrior, ucrNudshapeInitial, ucrNudShapePrior, ucrNudNumberOfIterations}, {rdoBayesian}) + + + + ucrPnlExtreme.SetParameter(New RParameter("type", 1)) + + ucrPnlExtreme.AddRadioButton(rdoPrimary, Chr(34) & "primary" & Chr(34)) + ucrPnlExtreme.AddRadioButton(rdoDensity, Chr(34) & "density" & Chr(34)) + ucrPnlExtreme.AddRadioButton(rdoHist, Chr(34) & "hist" & Chr(34)) + ucrPnlExtreme.AddRadioButton(rdoProbprob, Chr(34) & "probprob" & Chr(34)) + ucrPnlExtreme.AddRadioButton(rdoQQ2, Chr(34) & "qq2" & Chr(34)) + ucrPnlExtreme.AddRadioButton(rdoQQPlot, Chr(34) & "qq" & Chr(34)) + ucrPnlExtreme.AddRadioButton(rdoRlplot, Chr(34) & "rl" & Chr(34)) + ucrPnlExtreme.AddRadioButton(rdoZPlot, Chr(34) & "Zplot" & Chr(34)) + ucrPnlExtreme.AddRadioButton(rdoTrace, Chr(34) & "trace" & Chr(34)) + ucrPnlExtreme.AddRadioButton(rdoNoPlot) + + ucrPnlExtreme.AddParameterPresentCondition(rdoNoPlot, "type", False) + ucrPnlExtreme.AddParameterValuesCondition(rdoPrimary, "type", Chr(34) & "primary" & Chr(34)) + ucrPnlExtreme.AddParameterValuesCondition(rdoDensity, "type", Chr(34) & "density" & Chr(34)) + ucrPnlExtreme.AddParameterValuesCondition(rdoHist, "type", Chr(34) & "hist" & Chr(34)) + ucrPnlExtreme.AddParameterValuesCondition(rdoProbprob, "type", Chr(34) & "probprob" & Chr(34)) + ucrPnlExtreme.AddParameterValuesCondition(rdoQQ2, "type", Chr(34) & "qq2" & Chr(34)) + ucrPnlExtreme.AddParameterValuesCondition(rdoQQPlot, "type", Chr(34) & "qq" & Chr(34)) + ucrPnlExtreme.AddParameterValuesCondition(rdoRlplot, "type", Chr(34) & "rl" & Chr(34)) + ucrPnlExtreme.AddParameterValuesCondition(rdoZPlot, "type", Chr(34) & "Zplot" & Chr(34)) + ucrPnlExtreme.AddParameterValuesCondition(rdoTrace, "type", Chr(34) & "trace" & Chr(34)) + + ucrSavePlots.SetPrefix("plot") + ucrSavePlots.SetSaveTypeAsGraph() + ucrSavePlots.SetDataFrameSelector(dlgExtremes.ucrSelectorExtremes.ucrAvailableDataFrames) + ucrSavePlots.SetCheckBoxText("Save Graph:") + ucrSavePlots.SetIsComboBox() + ucrSavePlots.SetAssignToIfUncheckedValue("last_graph") + bControlsInitialised = True End Sub - - Public Sub SetRCode(clsNewFevdFunction As RFunction) + Public Sub SetRCode(clsNewFevdFunction As RFunction, clsNewPlotFunction As RFunction, clsNewRSyntax As RSyntax, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If clsFevdFunction = clsNewFevdFunction - ucrPanelExtreme.SetRCode(clsFevdFunction) + clsRsyntax = clsNewRSyntax + clsPlotFunction = clsNewPlotFunction + + ucrPnlExtremes.SetRCode(clsFevdFunction) + ucrPnlExtreme.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) + ucrSavePlots.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) + End Sub + Private Sub ucrPnlExtreme_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlExtreme.ControlValueChanged + If rdoNoPlot.Checked Then + clsPlotFunction.RemoveParameterByName("type") + clsRsyntax.RemoveFromAfterCodes(clsPlotFunction) + Else + clsRsyntax.AddToAfterCodes(clsPlotFunction, iPosition:=0) + End If + End Sub + Private Sub InitialPriorParametres() + + If rdoBayesian.Checked Then + ucrNudLocationPrior.Visible = True + ucrNudScalePrior.Visible = True + ucrNudShapePrior.Visible = True + ucrNudLocationInitial.Visible = True + ucrNudScaleInitial.Visible = True + ucrNudshapeInitial.Visible = True + ucrNudNumberOfIterations.Visible = True + Else + ucrNudLocationPrior.Visible = False + ucrNudScalePrior.Visible = False + ucrNudShapePrior.Visible = False + ucrNudLocationInitial.Visible = False + ucrNudScaleInitial.Visible = False + ucrNudshapeInitial.Visible = False + ucrNudNumberOfIterations.Visible = False + End If + End Sub + + Private Sub ucrPnlExtremes_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlExtremes.ControlValueChanged + InitialPriorParametres() End Sub End Class \ No newline at end of file From a65cf05b4623467c7bcf3d1ea199038fff54674a Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Tue, 26 Jul 2022 17:35:07 +0300 Subject: [PATCH 003/122] Extremes Update --- instat/dlgExtremes.vb | 18 +- instat/sdgExtremesMethod.Designer.vb | 254 ++++++--------------------- instat/sdgExtremesMethod.vb | 68 ++++--- 3 files changed, 116 insertions(+), 224 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index 6bf8496b631..81b2b2f57bb 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -20,7 +20,7 @@ Public Class dlgExtremes Private clsAttachFunction As New RFunction Private clsDetachFunction As New RFunction - Private clsFevdFunction, clsPlotsFunction As New RFunction + Private clsFevdFunction, clsListFunction, clsPlotsFunction, clsConcatenateFunction, clsListInitialFunction As New RFunction 'clsLocationScaleResetOperator is not run but affects reset of the check box.Any better method of implementation? Private clsLocationScaleResetOperator As New ROperator Private clsLocationParamOperator As New ROperator @@ -92,10 +92,13 @@ Public Class dlgExtremes Private Sub SetDefaults() clsFevdFunction = New RFunction clsPlotsFunction = New RFunction + clsListFunction = New RFunction + clsListInitialFunction = New RFunction clsLocationParamOperator = New ROperator clsLocationScaleResetOperator = New ROperator clsAttachFunction = New RFunction clsDetachFunction = New RFunction + clsConcatenateFunction = New RFunction ucrBase.clsRsyntax.ClearCodes() @@ -104,6 +107,7 @@ Public Class dlgExtremes ucrInputThresholdforLocation.SetText("0") ucrSaveExtremes.Reset() + clsLocationScaleResetOperator.SetOperation("") clsLocationScaleResetOperator.bBrackets = False @@ -115,6 +119,12 @@ Public Class dlgExtremes clsPlotsFunction.iCallType = 3 clsPlotsFunction.bExcludeAssignedFunctionOutput = False + clsListFunction.SetRCommand("list") + clsListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=0) + + clsListInitialFunction.SetRCommand("list") + clsListInitialFunction.AddParameter("l", clsRFunctionParameter:=clsConcatenateFunction, bIncludeArgumentName:=False, iPosition:=0) + clsFevdFunction.SetPackageName("extRemes") clsFevdFunction.SetRCommand("fevd") @@ -132,6 +142,8 @@ Public Class dlgExtremes clsDetachFunction.AddParameter("name", clsRFunctionParameter:=ucrSelectorExtremes.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) clsDetachFunction.AddParameter("unload", "TRUE", iPosition:=2) + clsConcatenateFunction.SetRCommand("c") + ucrBase.clsRsyntax.AddToBeforeCodes(clsAttachFunction) ucrBase.clsRsyntax.AddToAfterCodes(clsDetachFunction, iPosition:=1) ucrBase.clsRsyntax.SetBaseRFunction(clsFevdFunction) @@ -162,7 +174,9 @@ Public Class dlgExtremes ucrBase.OKEnabled(Not ucrReceiverVariable.IsEmpty) End Sub Private Sub cmdFittingOptions_Click(sender As Object, e As EventArgs) Handles cmdFittingOptions.Click - sdgExtremesMethod.SetRCode(clsNewFevdFunction:=clsFevdFunction, clsNewPlotFunction:=clsPlotsFunction, clsNewRSyntax:=ucrBase.clsRsyntax) + sdgExtremesMethod.SetRCode(clsNewFevdFunction:=clsFevdFunction, clsNewListFunction:=clsListFunction, + clsNewPlotFunction:=clsPlotsFunction, clsNewConcatenateFunction:=clsConcatenateFunction, + clsNewListInitialFunction:=clsListInitialFunction, clsNewRSyntax:=ucrBase.clsRsyntax) sdgExtremesMethod.ShowDialog() End Sub diff --git a/instat/sdgExtremesMethod.Designer.vb b/instat/sdgExtremesMethod.Designer.vb index 829e066b3a8..abc5bd4a490 100644 --- a/instat/sdgExtremesMethod.Designer.vb +++ b/instat/sdgExtremesMethod.Designer.vb @@ -43,26 +43,16 @@ Partial Class sdgExtremesMethod Me.ucrPnlExtreme = New instat.UcrPanel() Me.tbRegOptions = New System.Windows.Forms.TabControl() Me.tbFitMethod = New System.Windows.Forms.TabPage() + Me.ucrInputInitial = New instat.ucrInputComboBox() + Me.ucrInputPrior = New instat.ucrInputComboBox() + Me.lblInitial = New System.Windows.Forms.Label() + Me.lblPrior = New System.Windows.Forms.Label() Me.rdoMle = New System.Windows.Forms.RadioButton() Me.rdoBayesian = New System.Windows.Forms.RadioButton() Me.rdoGMLE = New System.Windows.Forms.RadioButton() Me.rdoLmoments = New System.Windows.Forms.RadioButton() Me.ucrNudNumberOfIterations = New instat.ucrNud() Me.lblNumberOfIterations = New System.Windows.Forms.Label() - Me.ucrNudLocationPrior = New instat.ucrNud() - Me.ucrNudScalePrior = New instat.ucrNud() - Me.ucrNudShapePrior = New instat.ucrNud() - Me.ucrNudLocationInitial = New instat.ucrNud() - Me.ucrNudScaleInitial = New instat.ucrNud() - Me.ucrNudshapeInitial = New instat.ucrNud() - Me.lblLocationInitial = New System.Windows.Forms.Label() - Me.lblScaleInitial = New System.Windows.Forms.Label() - Me.lblShapeInitial = New System.Windows.Forms.Label() - Me.lblLocationPrior = New System.Windows.Forms.Label() - Me.lblScalePrior = New System.Windows.Forms.Label() - Me.lblShapePrior = New System.Windows.Forms.Label() - Me.grpPrior = New System.Windows.Forms.GroupBox() - Me.GroupBox5 = New System.Windows.Forms.GroupBox() Me.grpFitMethod = New System.Windows.Forms.GroupBox() Me.ucrPnlExtremes = New instat.UcrPanel() Me.ucrBase = New instat.ucrButtonsSubdialogue() @@ -323,26 +313,16 @@ Partial Class sdgExtremesMethod ' 'tbFitMethod ' + Me.tbFitMethod.Controls.Add(Me.ucrInputInitial) + Me.tbFitMethod.Controls.Add(Me.ucrInputPrior) + Me.tbFitMethod.Controls.Add(Me.lblInitial) + Me.tbFitMethod.Controls.Add(Me.lblPrior) Me.tbFitMethod.Controls.Add(Me.rdoMle) Me.tbFitMethod.Controls.Add(Me.rdoBayesian) Me.tbFitMethod.Controls.Add(Me.rdoGMLE) Me.tbFitMethod.Controls.Add(Me.rdoLmoments) Me.tbFitMethod.Controls.Add(Me.ucrNudNumberOfIterations) Me.tbFitMethod.Controls.Add(Me.lblNumberOfIterations) - Me.tbFitMethod.Controls.Add(Me.ucrNudLocationPrior) - Me.tbFitMethod.Controls.Add(Me.ucrNudScalePrior) - Me.tbFitMethod.Controls.Add(Me.ucrNudShapePrior) - Me.tbFitMethod.Controls.Add(Me.ucrNudLocationInitial) - Me.tbFitMethod.Controls.Add(Me.ucrNudScaleInitial) - Me.tbFitMethod.Controls.Add(Me.ucrNudshapeInitial) - Me.tbFitMethod.Controls.Add(Me.lblLocationInitial) - Me.tbFitMethod.Controls.Add(Me.lblScaleInitial) - Me.tbFitMethod.Controls.Add(Me.lblShapeInitial) - Me.tbFitMethod.Controls.Add(Me.lblLocationPrior) - Me.tbFitMethod.Controls.Add(Me.lblScalePrior) - Me.tbFitMethod.Controls.Add(Me.lblShapePrior) - Me.tbFitMethod.Controls.Add(Me.grpPrior) - Me.tbFitMethod.Controls.Add(Me.GroupBox5) Me.tbFitMethod.Controls.Add(Me.grpFitMethod) Me.tbFitMethod.Location = New System.Drawing.Point(4, 29) Me.tbFitMethod.Margin = New System.Windows.Forms.Padding(4) @@ -354,6 +334,48 @@ Partial Class sdgExtremesMethod Me.tbFitMethod.Text = "Fit Method" Me.tbFitMethod.UseVisualStyleBackColor = True ' + 'ucrInputInitial + ' + Me.ucrInputInitial.AddQuotesIfUnrecognised = True + Me.ucrInputInitial.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputInitial.GetSetSelectedIndex = -1 + Me.ucrInputInitial.IsReadOnly = False + Me.ucrInputInitial.Location = New System.Drawing.Point(143, 291) + Me.ucrInputInitial.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) + Me.ucrInputInitial.Name = "ucrInputInitial" + Me.ucrInputInitial.Size = New System.Drawing.Size(206, 32) + Me.ucrInputInitial.TabIndex = 79 + ' + 'ucrInputPrior + ' + Me.ucrInputPrior.AddQuotesIfUnrecognised = True + Me.ucrInputPrior.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputPrior.GetSetSelectedIndex = -1 + Me.ucrInputPrior.IsReadOnly = False + Me.ucrInputPrior.Location = New System.Drawing.Point(143, 222) + Me.ucrInputPrior.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) + Me.ucrInputPrior.Name = "ucrInputPrior" + Me.ucrInputPrior.Size = New System.Drawing.Size(206, 32) + Me.ucrInputPrior.TabIndex = 78 + ' + 'lblInitial + ' + Me.lblInitial.AutoSize = True + Me.lblInitial.Location = New System.Drawing.Point(9, 291) + Me.lblInitial.Name = "lblInitial" + Me.lblInitial.Size = New System.Drawing.Size(103, 20) + Me.lblInitial.TabIndex = 77 + Me.lblInitial.Text = "Initial Values:" + ' + 'lblPrior + ' + Me.lblPrior.AutoSize = True + Me.lblPrior.Location = New System.Drawing.Point(3, 222) + Me.lblPrior.Name = "lblPrior" + Me.lblPrior.Size = New System.Drawing.Size(131, 20) + Me.lblPrior.TabIndex = 76 + Me.lblPrior.Text = "Prior Parameters:" + ' 'rdoMle ' Me.rdoMle.AutoSize = True @@ -424,164 +446,6 @@ Partial Class sdgExtremesMethod Me.lblNumberOfIterations.TabIndex = 63 Me.lblNumberOfIterations.Text = "Number of Iterations:" ' - 'ucrNudLocationPrior - ' - Me.ucrNudLocationPrior.AutoSize = True - Me.ucrNudLocationPrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudLocationPrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudLocationPrior.Location = New System.Drawing.Point(138, 240) - Me.ucrNudLocationPrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudLocationPrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudLocationPrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudLocationPrior.Name = "ucrNudLocationPrior" - Me.ucrNudLocationPrior.Size = New System.Drawing.Size(75, 30) - Me.ucrNudLocationPrior.TabIndex = 62 - Me.ucrNudLocationPrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudScalePrior - ' - Me.ucrNudScalePrior.AutoSize = True - Me.ucrNudScalePrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudScalePrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudScalePrior.Location = New System.Drawing.Point(135, 280) - Me.ucrNudScalePrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudScalePrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudScalePrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudScalePrior.Name = "ucrNudScalePrior" - Me.ucrNudScalePrior.Size = New System.Drawing.Size(75, 30) - Me.ucrNudScalePrior.TabIndex = 61 - Me.ucrNudScalePrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudShapePrior - ' - Me.ucrNudShapePrior.AutoSize = True - Me.ucrNudShapePrior.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudShapePrior.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudShapePrior.Location = New System.Drawing.Point(139, 323) - Me.ucrNudShapePrior.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudShapePrior.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudShapePrior.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudShapePrior.Name = "ucrNudShapePrior" - Me.ucrNudShapePrior.Size = New System.Drawing.Size(75, 30) - Me.ucrNudShapePrior.TabIndex = 60 - Me.ucrNudShapePrior.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudLocationInitial - ' - Me.ucrNudLocationInitial.AutoSize = True - Me.ucrNudLocationInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudLocationInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudLocationInitial.Location = New System.Drawing.Point(444, 243) - Me.ucrNudLocationInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudLocationInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudLocationInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudLocationInitial.Name = "ucrNudLocationInitial" - Me.ucrNudLocationInitial.Size = New System.Drawing.Size(75, 30) - Me.ucrNudLocationInitial.TabIndex = 59 - Me.ucrNudLocationInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudScaleInitial - ' - Me.ucrNudScaleInitial.AutoSize = True - Me.ucrNudScaleInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudScaleInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudScaleInitial.Location = New System.Drawing.Point(444, 286) - Me.ucrNudScaleInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudScaleInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudScaleInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudScaleInitial.Name = "ucrNudScaleInitial" - Me.ucrNudScaleInitial.Size = New System.Drawing.Size(75, 30) - Me.ucrNudScaleInitial.TabIndex = 58 - Me.ucrNudScaleInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudshapeInitial - ' - Me.ucrNudshapeInitial.AutoSize = True - Me.ucrNudshapeInitial.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudshapeInitial.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudshapeInitial.Location = New System.Drawing.Point(448, 325) - Me.ucrNudshapeInitial.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudshapeInitial.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudshapeInitial.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudshapeInitial.Name = "ucrNudshapeInitial" - Me.ucrNudshapeInitial.Size = New System.Drawing.Size(75, 30) - Me.ucrNudshapeInitial.TabIndex = 57 - Me.ucrNudshapeInitial.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'lblLocationInitial - ' - Me.lblLocationInitial.AutoSize = True - Me.lblLocationInitial.Location = New System.Drawing.Point(336, 247) - Me.lblLocationInitial.Name = "lblLocationInitial" - Me.lblLocationInitial.Size = New System.Drawing.Size(74, 20) - Me.lblLocationInitial.TabIndex = 56 - Me.lblLocationInitial.Text = "Location:" - Me.lblLocationInitial.TextAlign = System.Drawing.ContentAlignment.TopCenter - ' - 'lblScaleInitial - ' - Me.lblScaleInitial.AutoSize = True - Me.lblScaleInitial.Location = New System.Drawing.Point(337, 291) - Me.lblScaleInitial.Name = "lblScaleInitial" - Me.lblScaleInitial.Size = New System.Drawing.Size(53, 20) - Me.lblScaleInitial.TabIndex = 55 - Me.lblScaleInitial.Text = "Scale:" - ' - 'lblShapeInitial - ' - Me.lblShapeInitial.AutoSize = True - Me.lblShapeInitial.Location = New System.Drawing.Point(339, 329) - Me.lblShapeInitial.Name = "lblShapeInitial" - Me.lblShapeInitial.Size = New System.Drawing.Size(60, 20) - Me.lblShapeInitial.TabIndex = 54 - Me.lblShapeInitial.Text = "Shape:" - ' - 'lblLocationPrior - ' - Me.lblLocationPrior.AutoSize = True - Me.lblLocationPrior.Location = New System.Drawing.Point(19, 244) - Me.lblLocationPrior.Name = "lblLocationPrior" - Me.lblLocationPrior.Size = New System.Drawing.Size(74, 20) - Me.lblLocationPrior.TabIndex = 53 - Me.lblLocationPrior.Text = "Location:" - ' - 'lblScalePrior - ' - Me.lblScalePrior.AutoSize = True - Me.lblScalePrior.Location = New System.Drawing.Point(27, 284) - Me.lblScalePrior.Name = "lblScalePrior" - Me.lblScalePrior.Size = New System.Drawing.Size(53, 20) - Me.lblScalePrior.TabIndex = 52 - Me.lblScalePrior.Text = "Scale:" - ' - 'lblShapePrior - ' - Me.lblShapePrior.AutoSize = True - Me.lblShapePrior.Location = New System.Drawing.Point(27, 321) - Me.lblShapePrior.Name = "lblShapePrior" - Me.lblShapePrior.Size = New System.Drawing.Size(60, 20) - Me.lblShapePrior.TabIndex = 51 - Me.lblShapePrior.Text = "Shape:" - ' - 'grpPrior - ' - Me.grpPrior.Location = New System.Drawing.Point(16, 206) - Me.grpPrior.Name = "grpPrior" - Me.grpPrior.Size = New System.Drawing.Size(233, 149) - Me.grpPrior.TabIndex = 65 - Me.grpPrior.TabStop = False - Me.grpPrior.Text = "Prior Parameters" - Me.grpPrior.Visible = False - ' - 'GroupBox5 - ' - Me.GroupBox5.Location = New System.Drawing.Point(329, 219) - Me.GroupBox5.Name = "GroupBox5" - Me.GroupBox5.Size = New System.Drawing.Size(214, 136) - Me.GroupBox5.TabIndex = 66 - Me.GroupBox5.TabStop = False - Me.GroupBox5.Text = "Initial Values" - ' 'grpFitMethod ' Me.grpFitMethod.Controls.Add(Me.ucrPnlExtremes) @@ -667,20 +531,10 @@ Partial Class sdgExtremesMethod Friend WithEvents rdoLmoments As RadioButton Friend WithEvents ucrNudNumberOfIterations As ucrNud Friend WithEvents lblNumberOfIterations As Label - Friend WithEvents ucrNudLocationPrior As ucrNud - Friend WithEvents ucrNudScalePrior As ucrNud - Friend WithEvents ucrNudShapePrior As ucrNud - Friend WithEvents ucrNudLocationInitial As ucrNud - Friend WithEvents ucrNudScaleInitial As ucrNud - Friend WithEvents ucrNudshapeInitial As ucrNud - Friend WithEvents lblLocationInitial As Label - Friend WithEvents lblScaleInitial As Label - Friend WithEvents lblShapeInitial As Label - Friend WithEvents lblLocationPrior As Label - Friend WithEvents lblScalePrior As Label - Friend WithEvents lblShapePrior As Label - Friend WithEvents grpPrior As GroupBox - Friend WithEvents GroupBox5 As GroupBox Friend WithEvents grpFitMethod As GroupBox Friend WithEvents ucrPnlExtremes As UcrPanel + Friend WithEvents lblInitial As Label + Friend WithEvents lblPrior As Label + Friend WithEvents ucrInputInitial As ucrInputComboBox + Friend WithEvents ucrInputPrior As ucrInputComboBox End Class diff --git a/instat/sdgExtremesMethod.vb b/instat/sdgExtremesMethod.vb index 7641b59ec6d..4cedd8debf5 100644 --- a/instat/sdgExtremesMethod.vb +++ b/instat/sdgExtremesMethod.vb @@ -16,6 +16,9 @@ Public Class sdgExtremesMethod Private clsFevdFunction As New RFunction Public clsPlotFunction As New RFunction + Public clsListFunction As New RFunction + Public clsListInitialFunction As New RFunction + Public clsConcatenateFunction As New RFunction Public clsRsyntax As New RSyntax Public bControlsInitialised As Boolean = False Public Sub InitialiseControls() @@ -25,19 +28,29 @@ Public Class sdgExtremesMethod ucrPnlExtremes.AddRadioButton(rdoGMLE, Chr(34) & "GMLE" & Chr(34)) ucrPnlExtremes.AddRadioButton(rdoLmoments, Chr(34) & "Lmoments" & Chr(34)) - ucrNudLocationPrior.SetLinkedDisplayControl(lblLocationPrior) - ucrNudScalePrior.SetLinkedDisplayControl(lblScalePrior) - ucrNudShapePrior.SetLinkedDisplayControl(lblShapePrior) - ucrNudLocationInitial.SetLinkedDisplayControl(lblLocationInitial) - ucrNudScaleInitial.SetLinkedDisplayControl(lblScaleInitial) - ucrNudshapeInitial.SetLinkedDisplayControl(lblShapeInitial) + + ucrChkType.SetText("Type") + ucrChkType.AddToLinkedControls(ucrInputType, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrInputPrior.SetParameter(New RParameter("priorParams", 5)) + ucrInputPrior.AddQuotesIfUnrecognised = False + ucrInputPrior.SetValidationTypeAsNumericList() + ucrInputPrior.SetLinkedDisplayControl(lblPrior) + + ucrInputInitial.SetParameter(New RParameter("initial", 6)) + ucrInputInitial.AddQuotesIfUnrecognised = False + ucrInputInitial.SetValidationTypeAsNumericList() + ucrInputInitial.SetLinkedDisplayControl(lblInitial) + + + ucrNudNumberOfIterations.SetParameter(New RParameter("iter", 7)) + ucrNudNumberOfIterations.SetMinMax(0, 30000) + ucrNudNumberOfIterations.SetRDefault(9999) ucrNudNumberOfIterations.SetLinkedDisplayControl(lblNumberOfIterations) 'ucrPnlExtremes.AddToLinkedControls({ucrNudLocationInitial, ucrNudLocationPrior, ucrNudScaleInitial, ucrNudScalePrior, ucrNudshapeInitial, ucrNudShapePrior, ucrNudNumberOfIterations}, {rdoBayesian}) - ucrPnlExtreme.SetParameter(New RParameter("type", 1)) ucrPnlExtreme.AddRadioButton(rdoPrimary, Chr(34) & "primary" & Chr(34)) @@ -71,15 +84,21 @@ Public Class sdgExtremesMethod bControlsInitialised = True End Sub - Public Sub SetRCode(clsNewFevdFunction As RFunction, clsNewPlotFunction As RFunction, clsNewRSyntax As RSyntax, Optional bReset As Boolean = False) + Public Sub SetRCode(clsNewFevdFunction As RFunction, clsNewListFunction As RFunction, clsNewPlotFunction As RFunction, + clsNewRSyntax As RSyntax, clsNewListInitialFunction As RFunction, clsNewConcatenateFunction As RFunction, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If clsFevdFunction = clsNewFevdFunction clsRsyntax = clsNewRSyntax clsPlotFunction = clsNewPlotFunction - - ucrPnlExtremes.SetRCode(clsFevdFunction) + clsListFunction = clsNewListFunction + clsListInitialFunction = clsNewListInitialFunction + clsConcatenateFunction = clsNewConcatenateFunction + ucrInputPrior.SetRCode(clsListFunction, bReset) + ucrInputInitial.SetRCode(clsListInitialFunction, bReset) + ucrNudNumberOfIterations.SetRCode(clsFevdFunction, bReset) + ucrPnlExtremes.SetRCode(clsFevdFunction, bReset) ucrPnlExtreme.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) ucrSavePlots.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) End Sub @@ -94,25 +113,30 @@ Public Class sdgExtremesMethod Private Sub InitialPriorParametres() If rdoBayesian.Checked Then - ucrNudLocationPrior.Visible = True - ucrNudScalePrior.Visible = True - ucrNudShapePrior.Visible = True - ucrNudLocationInitial.Visible = True - ucrNudScaleInitial.Visible = True - ucrNudshapeInitial.Visible = True + ucrInputInitial.Visible = True + ucrInputPrior.Visible = True ucrNudNumberOfIterations.Visible = True Else - ucrNudLocationPrior.Visible = False - ucrNudScalePrior.Visible = False - ucrNudShapePrior.Visible = False - ucrNudLocationInitial.Visible = False - ucrNudScaleInitial.Visible = False - ucrNudshapeInitial.Visible = False + ucrInputInitial.Visible = False + ucrInputPrior.Visible = False ucrNudNumberOfIterations.Visible = False + End If End Sub Private Sub ucrPnlExtremes_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlExtremes.ControlValueChanged InitialPriorParametres() End Sub + + Private Sub ucrInputInitial_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputInitial.ControlValueChanged + clsFevdFunction.AddParameter("x", "c(" & ucrInputInitial.GetText & ")", iPosition:=6) + 'ucrInputInitial.SetName("0.25,0.5,0.75") + 'ucrInputInitial.SetItems({"0.25,0.5,0.75", "0, 0.2, 0.4, 0.6, 0.8, 1", "0.5, 0.8, 1"}) + End Sub + + Private Sub ucrInputPrior_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputPrior.ControlValueChanged + clsFevdFunction.AddParameter("v", "c(" & ucrInputPrior.GetText & ")", iPosition:=5) + 'ucrInputPrior.SetName("0.25,0.5,0.75") + 'ucrInputPrior.SetItems({"0.25,0.5,0.75", "0, 0.2, 0.4, 0.6, 0.8, 1", "0.5, 0.8, 1"}) + End Sub End Class \ No newline at end of file From 2f11c21182acf73ae71655ba055be6f40d340282 Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Wed, 27 Jul 2022 15:45:59 +0300 Subject: [PATCH 004/122] changes made --- instat/dlgExtremes.vb | 25 +++-- instat/sdgExtremesMethod.Designer.vb | 146 ++++++++++++++++++++------- instat/sdgExtremesMethod.vb | 90 +++++++++++++---- 3 files changed, 195 insertions(+), 66 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index 81b2b2f57bb..605aaaaf1ee 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -20,7 +20,8 @@ Public Class dlgExtremes Private clsAttachFunction As New RFunction Private clsDetachFunction As New RFunction - Private clsFevdFunction, clsListFunction, clsPlotsFunction, clsConcatenateFunction, clsListInitialFunction As New RFunction + Private clsFevdFunction, clsListFunction, clsPlotsFunction, clsConcatenateFunction, clsConfidenceIntervalFunction, +clsListInitialFunction As New RFunction 'clsLocationScaleResetOperator is not run but affects reset of the check box.Any better method of implementation? Private clsLocationScaleResetOperator As New ROperator Private clsLocationParamOperator As New ROperator @@ -98,8 +99,8 @@ Public Class dlgExtremes clsLocationScaleResetOperator = New ROperator clsAttachFunction = New RFunction clsDetachFunction = New RFunction + clsConfidenceIntervalFunction = New RFunction clsConcatenateFunction = New RFunction - ucrBase.clsRsyntax.ClearCodes() ucrReceiverVariable.SetMeAsReceiver() @@ -107,6 +108,8 @@ Public Class dlgExtremes ucrInputThresholdforLocation.SetText("0") ucrSaveExtremes.Reset() + clsConcatenateFunction.SetRCommand("c") + clsConcatenateFunction.AddParameter("first", "0.1,10,0.1", iPosition:=0, bIncludeArgumentName:=False) clsLocationScaleResetOperator.SetOperation("") clsLocationScaleResetOperator.bBrackets = False @@ -120,13 +123,22 @@ Public Class dlgExtremes clsPlotsFunction.bExcludeAssignedFunctionOutput = False clsListFunction.SetRCommand("list") - clsListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=0) + clsListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=5) clsListInitialFunction.SetRCommand("list") - clsListInitialFunction.AddParameter("l", clsRFunctionParameter:=clsConcatenateFunction, bIncludeArgumentName:=False, iPosition:=0) + clsListInitialFunction.AddParameter("location", "0", iPosition:=0) + clsListInitialFunction.AddParameter("scale", "0.1", iPosition:=1) + clsListInitialFunction.AddParameter("shape", "-0.5", iPosition:=2) + + clsConfidenceIntervalFunction.SetPackageName("extRemes") + clsConfidenceIntervalFunction.SetRCommand("ci.fevd") + 'clsConfidenceIntervalFunction.AddParameter("type", Chr(34) & "parameter" & Chr(34), iPosition:=0) clsFevdFunction.SetPackageName("extRemes") clsFevdFunction.SetRCommand("fevd") + clsFevdFunction.AddParameter("priorParams", clsRFunctionParameter:=clsListFunction, iPosition:=4) + clsFevdFunction.AddParameter("initial", clsRFunctionParameter:=clsListInitialFunction, iPosition:=5) + clsFevdFunction.AddParameter("iter", "9999", iPosition:=6) clsFevdFunction.AddParameter("type", Chr(34) & "GEV" & Chr(34), iPosition:=0) clsFevdFunction.AddParameter("method", Chr(34) & "MLE" & Chr(34), iPosition:=1) @@ -142,8 +154,6 @@ Public Class dlgExtremes clsDetachFunction.AddParameter("name", clsRFunctionParameter:=ucrSelectorExtremes.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) clsDetachFunction.AddParameter("unload", "TRUE", iPosition:=2) - clsConcatenateFunction.SetRCommand("c") - ucrBase.clsRsyntax.AddToBeforeCodes(clsAttachFunction) ucrBase.clsRsyntax.AddToAfterCodes(clsDetachFunction, iPosition:=1) ucrBase.clsRsyntax.SetBaseRFunction(clsFevdFunction) @@ -175,7 +185,8 @@ Public Class dlgExtremes End Sub Private Sub cmdFittingOptions_Click(sender As Object, e As EventArgs) Handles cmdFittingOptions.Click sdgExtremesMethod.SetRCode(clsNewFevdFunction:=clsFevdFunction, clsNewListFunction:=clsListFunction, - clsNewPlotFunction:=clsPlotsFunction, clsNewConcatenateFunction:=clsConcatenateFunction, + clsNewConcatenateFunction:=clsConcatenateFunction, + clsNewPlotFunction:=clsPlotsFunction, clsNewConfidenceIntervalFunction:=clsConfidenceIntervalFunction, clsNewListInitialFunction:=clsListInitialFunction, clsNewRSyntax:=ucrBase.clsRsyntax) sdgExtremesMethod.ShowDialog() End Sub diff --git a/instat/sdgExtremesMethod.Designer.vb b/instat/sdgExtremesMethod.Designer.vb index abc5bd4a490..7515d4a2c0b 100644 --- a/instat/sdgExtremesMethod.Designer.vb +++ b/instat/sdgExtremesMethod.Designer.vb @@ -43,9 +43,13 @@ Partial Class sdgExtremesMethod Me.ucrPnlExtreme = New instat.UcrPanel() Me.tbRegOptions = New System.Windows.Forms.TabControl() Me.tbFitMethod = New System.Windows.Forms.TabPage() - Me.ucrInputInitial = New instat.ucrInputComboBox() - Me.ucrInputPrior = New instat.ucrInputComboBox() - Me.lblInitial = New System.Windows.Forms.Label() + Me.lblLocation = New System.Windows.Forms.Label() + Me.lblScale = New System.Windows.Forms.Label() + Me.lblShape = New System.Windows.Forms.Label() + Me.ucrNudScale = New instat.ucrNud() + Me.ucrNudLocation = New instat.ucrNud() + Me.ucrNudShape = New instat.ucrNud() + Me.ucrInputPrior = New instat.ucrInputTextBox() Me.lblPrior = New System.Windows.Forms.Label() Me.rdoMle = New System.Windows.Forms.RadioButton() Me.rdoBayesian = New System.Windows.Forms.RadioButton() @@ -55,6 +59,7 @@ Partial Class sdgExtremesMethod Me.lblNumberOfIterations = New System.Windows.Forms.Label() Me.grpFitMethod = New System.Windows.Forms.GroupBox() Me.ucrPnlExtremes = New instat.UcrPanel() + Me.grpInitial = New System.Windows.Forms.GroupBox() Me.ucrBase = New instat.ucrButtonsSubdialogue() Me.tbConfidenceInterval.SuspendLayout() Me.tbDisplayOptions.SuspendLayout() @@ -67,9 +72,9 @@ Partial Class sdgExtremesMethod 'tbConfidenceInterval ' Me.tbConfidenceInterval.Controls.Add(Me.lblReturnLevel) - Me.tbConfidenceInterval.Controls.Add(Me.ucrInputType) Me.tbConfidenceInterval.Controls.Add(Me.ucrChkType) Me.tbConfidenceInterval.Controls.Add(Me.ucrNudReturnLevel) + Me.tbConfidenceInterval.Controls.Add(Me.ucrInputType) Me.tbConfidenceInterval.Location = New System.Drawing.Point(4, 29) Me.tbConfidenceInterval.Margin = New System.Windows.Forms.Padding(4) Me.tbConfidenceInterval.Name = "tbConfidenceInterval" @@ -95,7 +100,7 @@ Partial Class sdgExtremesMethod Me.ucrInputType.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink Me.ucrInputType.GetSetSelectedIndex = -1 Me.ucrInputType.IsReadOnly = False - Me.ucrInputType.Location = New System.Drawing.Point(174, 13) + Me.ucrInputType.Location = New System.Drawing.Point(163, 18) Me.ucrInputType.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) Me.ucrInputType.Name = "ucrInputType" Me.ucrInputType.Size = New System.Drawing.Size(175, 32) @@ -174,7 +179,7 @@ Partial Class sdgExtremesMethod ' Me.rdoNoPlot.AutoSize = True Me.rdoNoPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoNoPlot.Location = New System.Drawing.Point(20, 34) + Me.rdoNoPlot.Location = New System.Drawing.Point(20, 33) Me.rdoNoPlot.Margin = New System.Windows.Forms.Padding(4) Me.rdoNoPlot.Name = "rdoNoPlot" Me.rdoNoPlot.Size = New System.Drawing.Size(85, 24) @@ -313,9 +318,13 @@ Partial Class sdgExtremesMethod ' 'tbFitMethod ' - Me.tbFitMethod.Controls.Add(Me.ucrInputInitial) + Me.tbFitMethod.Controls.Add(Me.lblLocation) + Me.tbFitMethod.Controls.Add(Me.lblScale) + Me.tbFitMethod.Controls.Add(Me.lblShape) + Me.tbFitMethod.Controls.Add(Me.ucrNudScale) + Me.tbFitMethod.Controls.Add(Me.ucrNudLocation) + Me.tbFitMethod.Controls.Add(Me.ucrNudShape) Me.tbFitMethod.Controls.Add(Me.ucrInputPrior) - Me.tbFitMethod.Controls.Add(Me.lblInitial) Me.tbFitMethod.Controls.Add(Me.lblPrior) Me.tbFitMethod.Controls.Add(Me.rdoMle) Me.tbFitMethod.Controls.Add(Me.rdoBayesian) @@ -324,6 +333,7 @@ Partial Class sdgExtremesMethod Me.tbFitMethod.Controls.Add(Me.ucrNudNumberOfIterations) Me.tbFitMethod.Controls.Add(Me.lblNumberOfIterations) Me.tbFitMethod.Controls.Add(Me.grpFitMethod) + Me.tbFitMethod.Controls.Add(Me.grpInitial) Me.tbFitMethod.Location = New System.Drawing.Point(4, 29) Me.tbFitMethod.Margin = New System.Windows.Forms.Padding(4) Me.tbFitMethod.Name = "tbFitMethod" @@ -334,43 +344,91 @@ Partial Class sdgExtremesMethod Me.tbFitMethod.Text = "Fit Method" Me.tbFitMethod.UseVisualStyleBackColor = True ' - 'ucrInputInitial - ' - Me.ucrInputInitial.AddQuotesIfUnrecognised = True - Me.ucrInputInitial.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputInitial.GetSetSelectedIndex = -1 - Me.ucrInputInitial.IsReadOnly = False - Me.ucrInputInitial.Location = New System.Drawing.Point(143, 291) - Me.ucrInputInitial.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) - Me.ucrInputInitial.Name = "ucrInputInitial" - Me.ucrInputInitial.Size = New System.Drawing.Size(206, 32) - Me.ucrInputInitial.TabIndex = 79 + 'lblLocation + ' + Me.lblLocation.AutoSize = True + Me.lblLocation.Location = New System.Drawing.Point(34, 268) + Me.lblLocation.Name = "lblLocation" + Me.lblLocation.Size = New System.Drawing.Size(74, 20) + Me.lblLocation.TabIndex = 85 + Me.lblLocation.Text = "Location:" + ' + 'lblScale + ' + Me.lblScale.AutoSize = True + Me.lblScale.Location = New System.Drawing.Point(39, 306) + Me.lblScale.Name = "lblScale" + Me.lblScale.Size = New System.Drawing.Size(53, 20) + Me.lblScale.TabIndex = 84 + Me.lblScale.Text = "Scale:" + ' + 'lblShape + ' + Me.lblShape.AutoSize = True + Me.lblShape.Location = New System.Drawing.Point(32, 343) + Me.lblShape.Name = "lblShape" + Me.lblShape.Size = New System.Drawing.Size(60, 20) + Me.lblShape.TabIndex = 83 + Me.lblShape.Text = "Shape:" + ' + 'ucrNudScale + ' + Me.ucrNudScale.AutoSize = True + Me.ucrNudScale.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScale.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudScale.Location = New System.Drawing.Point(122, 302) + Me.ucrNudScale.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudScale.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudScale.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudScale.Name = "ucrNudScale" + Me.ucrNudScale.Size = New System.Drawing.Size(75, 30) + Me.ucrNudScale.TabIndex = 82 + Me.ucrNudScale.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudLocation + ' + Me.ucrNudLocation.AutoSize = True + Me.ucrNudLocation.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocation.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudLocation.Location = New System.Drawing.Point(124, 264) + Me.ucrNudLocation.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudLocation.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudLocation.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLocation.Name = "ucrNudLocation" + Me.ucrNudLocation.Size = New System.Drawing.Size(75, 30) + Me.ucrNudLocation.TabIndex = 81 + Me.ucrNudLocation.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudShape + ' + Me.ucrNudShape.AutoSize = True + Me.ucrNudShape.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudShape.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudShape.Location = New System.Drawing.Point(124, 339) + Me.ucrNudShape.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudShape.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudShape.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudShape.Name = "ucrNudShape" + Me.ucrNudShape.Size = New System.Drawing.Size(75, 30) + Me.ucrNudShape.TabIndex = 80 + Me.ucrNudShape.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'ucrInputPrior ' Me.ucrInputPrior.AddQuotesIfUnrecognised = True - Me.ucrInputPrior.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputPrior.GetSetSelectedIndex = -1 + Me.ucrInputPrior.AutoSize = True + Me.ucrInputPrior.IsMultiline = False Me.ucrInputPrior.IsReadOnly = False - Me.ucrInputPrior.Location = New System.Drawing.Point(143, 222) + Me.ucrInputPrior.Location = New System.Drawing.Point(153, 193) Me.ucrInputPrior.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) Me.ucrInputPrior.Name = "ucrInputPrior" Me.ucrInputPrior.Size = New System.Drawing.Size(206, 32) Me.ucrInputPrior.TabIndex = 78 ' - 'lblInitial - ' - Me.lblInitial.AutoSize = True - Me.lblInitial.Location = New System.Drawing.Point(9, 291) - Me.lblInitial.Name = "lblInitial" - Me.lblInitial.Size = New System.Drawing.Size(103, 20) - Me.lblInitial.TabIndex = 77 - Me.lblInitial.Text = "Initial Values:" - ' 'lblPrior ' Me.lblPrior.AutoSize = True - Me.lblPrior.Location = New System.Drawing.Point(3, 222) + Me.lblPrior.Location = New System.Drawing.Point(10, 193) Me.lblPrior.Name = "lblPrior" Me.lblPrior.Size = New System.Drawing.Size(131, 20) Me.lblPrior.TabIndex = 76 @@ -428,7 +486,7 @@ Partial Class sdgExtremesMethod Me.ucrNudNumberOfIterations.AutoSize = True Me.ucrNudNumberOfIterations.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudNumberOfIterations.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudNumberOfIterations.Location = New System.Drawing.Point(193, 372) + Me.ucrNudNumberOfIterations.Location = New System.Drawing.Point(193, 384) Me.ucrNudNumberOfIterations.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) Me.ucrNudNumberOfIterations.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudNumberOfIterations.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) @@ -440,7 +498,7 @@ Partial Class sdgExtremesMethod 'lblNumberOfIterations ' Me.lblNumberOfIterations.AutoSize = True - Me.lblNumberOfIterations.Location = New System.Drawing.Point(22, 376) + Me.lblNumberOfIterations.Location = New System.Drawing.Point(22, 388) Me.lblNumberOfIterations.Name = "lblNumberOfIterations" Me.lblNumberOfIterations.Size = New System.Drawing.Size(158, 20) Me.lblNumberOfIterations.TabIndex = 63 @@ -465,6 +523,15 @@ Partial Class sdgExtremesMethod Me.ucrPnlExtremes.Size = New System.Drawing.Size(370, 138) Me.ucrPnlExtremes.TabIndex = 74 ' + 'grpInitial + ' + Me.grpInitial.Location = New System.Drawing.Point(22, 236) + Me.grpInitial.Name = "grpInitial" + Me.grpInitial.Size = New System.Drawing.Size(200, 138) + Me.grpInitial.TabIndex = 86 + Me.grpInitial.TabStop = False + Me.grpInitial.Text = "Initial Values:" + ' 'ucrBase ' Me.ucrBase.AutoSize = True @@ -533,8 +600,13 @@ Partial Class sdgExtremesMethod Friend WithEvents lblNumberOfIterations As Label Friend WithEvents grpFitMethod As GroupBox Friend WithEvents ucrPnlExtremes As UcrPanel - Friend WithEvents lblInitial As Label Friend WithEvents lblPrior As Label - Friend WithEvents ucrInputInitial As ucrInputComboBox - Friend WithEvents ucrInputPrior As ucrInputComboBox + Friend WithEvents ucrInputPrior As ucrInputTextBox + Friend WithEvents lblLocation As Label + Friend WithEvents lblScale As Label + Friend WithEvents lblShape As Label + Friend WithEvents ucrNudScale As ucrNud + Friend WithEvents ucrNudLocation As ucrNud + Friend WithEvents ucrNudShape As ucrNud + Friend WithEvents grpInitial As GroupBox End Class diff --git a/instat/sdgExtremesMethod.vb b/instat/sdgExtremesMethod.vb index 4cedd8debf5..945bd0063ca 100644 --- a/instat/sdgExtremesMethod.vb +++ b/instat/sdgExtremesMethod.vb @@ -15,6 +15,7 @@ ' along with this program. If not, see . Public Class sdgExtremesMethod Private clsFevdFunction As New RFunction + Public clsConfidenceIntervalFunction As New RFunction Public clsPlotFunction As New RFunction Public clsListFunction As New RFunction Public clsListInitialFunction As New RFunction @@ -22,6 +23,8 @@ Public Class sdgExtremesMethod Public clsRsyntax As New RSyntax Public bControlsInitialised As Boolean = False Public Sub InitialiseControls() + Dim dctType As New Dictionary(Of String, String) + ucrPnlExtremes.SetParameter(New RParameter("method", 2)) ucrPnlExtremes.AddRadioButton(rdoMle, Chr(34) & "MLE" & Chr(34)) ucrPnlExtremes.AddRadioButton(rdoBayesian, Chr(34) & "Bayesian" & Chr(34)) @@ -30,21 +33,52 @@ Public Class sdgExtremesMethod ucrChkType.SetText("Type") - ucrChkType.AddToLinkedControls(ucrInputType, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrInputPrior.SetParameter(New RParameter("priorParams", 5)) + ucrChkType.AddParameterPresentCondition(True, "type") + ucrChkType.AddParameterPresentCondition(False, "type", False) + + ucrInputType.SetParameter(New RParameter("type", 1)) + dctType.Add("parameter", Chr(34) & "parameter" & Chr(34)) + dctType.Add("return.level", Chr(34) & "return.level" & Chr(34)) + ucrInputType.SetItems(dctType) + 'ucrInputType.SetRDefault(Chr(34) & "parameter" & Chr(34)) + ucrInputType.SetDropDownStyleAsNonEditable() + + ucrNudReturnLevel.SetParameter(New RParameter("return.period", 2)) + ucrNudReturnLevel.SetMinMax(20, 100) + ucrNudReturnLevel.SetRDefault(20) + ucrNudReturnLevel.SetLinkedDisplayControl(lblReturnLevel) + ucrInputType.AddToLinkedControls(ucrNudReturnLevel, {"return.level"}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkType.AddToLinkedControls(ucrInputType, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, + bNewLinkedUpdateFunction:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=Chr(34) & "parameter" & Chr(34)) + + ucrInputPrior.SetParameter(New RParameter("first", 5, bNewIncludeArgumentName:=False)) ucrInputPrior.AddQuotesIfUnrecognised = False ucrInputPrior.SetValidationTypeAsNumericList() ucrInputPrior.SetLinkedDisplayControl(lblPrior) - ucrInputInitial.SetParameter(New RParameter("initial", 6)) - ucrInputInitial.AddQuotesIfUnrecognised = False - ucrInputInitial.SetValidationTypeAsNumericList() - ucrInputInitial.SetLinkedDisplayControl(lblInitial) + ucrNudLocation.SetParameter(New RParameter("location", 1)) + ucrNudLocation.SetMinMax(-5, 10) + ucrNudLocation.DecimalPlaces = 1 + ucrNudLocation.Increment = 0.1 + + ucrNudScale.SetParameter(New RParameter("scale", 2)) + ucrNudScale.SetMinMax(-5, 10) + ucrNudScale.DecimalPlaces = 1 + ucrNudScale.Increment = 0.1 + 'ucrNudScale.SetRDefault(0.1) + + ucrNudShape.SetParameter(New RParameter("shape", 3)) + ucrNudShape.SetMinMax(-5, 10) + ucrNudShape.DecimalPlaces = 1 + ucrNudShape.Increment = 1 + 'ucrNudShape.SetRDefault(-0.5) + ucrNudLocation.SetLinkedDisplayControl(lblLocation) + ucrNudScale.SetLinkedDisplayControl(lblScale) + ucrNudShape.SetLinkedDisplayControl(lblShape) ucrNudNumberOfIterations.SetParameter(New RParameter("iter", 7)) ucrNudNumberOfIterations.SetMinMax(0, 30000) - ucrNudNumberOfIterations.SetRDefault(9999) ucrNudNumberOfIterations.SetLinkedDisplayControl(lblNumberOfIterations) @@ -85,7 +119,8 @@ Public Class sdgExtremesMethod bControlsInitialised = True End Sub Public Sub SetRCode(clsNewFevdFunction As RFunction, clsNewListFunction As RFunction, clsNewPlotFunction As RFunction, - clsNewRSyntax As RSyntax, clsNewListInitialFunction As RFunction, clsNewConcatenateFunction As RFunction, Optional bReset As Boolean = False) + clsNewRSyntax As RSyntax, clsNewListInitialFunction As RFunction, clsNewConfidenceIntervalFunction As RFunction, + Optional clsNewConcatenateFunction As RFunction = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If @@ -95,9 +130,16 @@ Public Class sdgExtremesMethod clsListFunction = clsNewListFunction clsListInitialFunction = clsNewListInitialFunction clsConcatenateFunction = clsNewConcatenateFunction - ucrInputPrior.SetRCode(clsListFunction, bReset) - ucrInputInitial.SetRCode(clsListInitialFunction, bReset) + clsConfidenceIntervalFunction = clsNewConfidenceIntervalFunction + ucrChkType.SetRCode(clsConfidenceIntervalFunction) + ucrNudReturnLevel.SetRCode(clsConfidenceIntervalFunction, bReset) + ucrInputPrior.SetRCode(clsConcatenateFunction, bReset) ucrNudNumberOfIterations.SetRCode(clsFevdFunction, bReset) + + ucrNudLocation.SetRCode(clsListInitialFunction, bReset) + ucrNudScale.SetRCode(clsListInitialFunction, bReset) + ucrNudShape.SetRCode(clsListInitialFunction, bReset) + ucrPnlExtremes.SetRCode(clsFevdFunction, bReset) ucrPnlExtreme.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) ucrSavePlots.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) @@ -113,13 +155,19 @@ Public Class sdgExtremesMethod Private Sub InitialPriorParametres() If rdoBayesian.Checked Then - ucrInputInitial.Visible = True + ucrNudScale.Visible = True + ucrNudLocation.Visible = True + ucrNudShape.Visible = True ucrInputPrior.Visible = True ucrNudNumberOfIterations.Visible = True + grpInitial.Visible = True Else - ucrInputInitial.Visible = False + ucrNudScale.Visible = False + ucrNudLocation.Visible = False + ucrNudShape.Visible = False ucrInputPrior.Visible = False ucrNudNumberOfIterations.Visible = False + grpInitial.Visible = False End If End Sub @@ -128,15 +176,13 @@ Public Class sdgExtremesMethod InitialPriorParametres() End Sub - Private Sub ucrInputInitial_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputInitial.ControlValueChanged - clsFevdFunction.AddParameter("x", "c(" & ucrInputInitial.GetText & ")", iPosition:=6) - 'ucrInputInitial.SetName("0.25,0.5,0.75") - 'ucrInputInitial.SetItems({"0.25,0.5,0.75", "0, 0.2, 0.4, 0.6, 0.8, 1", "0.5, 0.8, 1"}) - End Sub - - Private Sub ucrInputPrior_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputPrior.ControlValueChanged - clsFevdFunction.AddParameter("v", "c(" & ucrInputPrior.GetText & ")", iPosition:=5) - 'ucrInputPrior.SetName("0.25,0.5,0.75") - 'ucrInputPrior.SetItems({"0.25,0.5,0.75", "0, 0.2, 0.4, 0.6, 0.8, 1", "0.5, 0.8, 1"}) + Private Sub ucrChkType_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkType.ControlValueChanged, ucrInputType.ControlValueChanged, ucrNudReturnLevel.ControlValueChanged + If ucrChkType.Checked Then + clsConfidenceIntervalFunction.AddParameter("x", clsRFunctionParameter:=clsFevdFunction, iPosition:=0) + clsRsyntax.SetBaseRFunction(clsConfidenceIntervalFunction) + Else + clsConfidenceIntervalFunction.RemoveParameterByName("x") + clsRsyntax.SetBaseRFunction(clsFevdFunction) + End If End Sub End Class \ No newline at end of file From f0d2f60d584b20280566c8de7d6ebc1a46d4606e Mon Sep 17 00:00:00 2001 From: IVAN LUVISIA Date: Fri, 29 Jul 2022 10:48:22 +0300 Subject: [PATCH 005/122] addding reset subdialogue feature --- instat/dlgExtremes.vb | 6 ++++-- instat/sdgExtremesMethod.vb | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index 605aaaaf1ee..fd1c88101c1 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -28,7 +28,7 @@ clsListInitialFunction As New RFunction Private bFirstLoad As Boolean = True Private bReset As Boolean = True Private bResettingDialogue As Boolean = False - + Private bResetSubDialogue As Boolean = False Private Sub dlgExtremes_Load(sender As Object, e As EventArgs) Handles MyBase.Load If bFirstLoad Then InitialiseDialog() @@ -107,6 +107,7 @@ clsListInitialFunction As New RFunction ucrSelectorExtremes.Reset() ucrInputThresholdforLocation.SetText("0") ucrSaveExtremes.Reset() + bResetSubDialogue = True clsConcatenateFunction.SetRCommand("c") clsConcatenateFunction.AddParameter("first", "0.1,10,0.1", iPosition:=0, bIncludeArgumentName:=False) @@ -185,10 +186,11 @@ clsListInitialFunction As New RFunction End Sub Private Sub cmdFittingOptions_Click(sender As Object, e As EventArgs) Handles cmdFittingOptions.Click sdgExtremesMethod.SetRCode(clsNewFevdFunction:=clsFevdFunction, clsNewListFunction:=clsListFunction, - clsNewConcatenateFunction:=clsConcatenateFunction, + clsNewConcatenateFunction:=clsConcatenateFunction, bReset:=bResetSubDialogue, clsNewPlotFunction:=clsPlotsFunction, clsNewConfidenceIntervalFunction:=clsConfidenceIntervalFunction, clsNewListInitialFunction:=clsListInitialFunction, clsNewRSyntax:=ucrBase.clsRsyntax) sdgExtremesMethod.ShowDialog() + bResetSubDialogue = False End Sub Private Sub cmdPlus_Click(sender As Object, e As EventArgs) Handles cmdPlus.Click diff --git a/instat/sdgExtremesMethod.vb b/instat/sdgExtremesMethod.vb index 945bd0063ca..0b4dba4f59a 100644 --- a/instat/sdgExtremesMethod.vb +++ b/instat/sdgExtremesMethod.vb @@ -49,7 +49,7 @@ Public Class sdgExtremesMethod ucrNudReturnLevel.SetLinkedDisplayControl(lblReturnLevel) ucrInputType.AddToLinkedControls(ucrNudReturnLevel, {"return.level"}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkType.AddToLinkedControls(ucrInputType, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, - bNewLinkedUpdateFunction:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=Chr(34) & "parameter" & Chr(34)) + bNewLinkedUpdateFunction:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="parameter") ucrInputPrior.SetParameter(New RParameter("first", 5, bNewIncludeArgumentName:=False)) ucrInputPrior.AddQuotesIfUnrecognised = False @@ -131,7 +131,7 @@ Public Class sdgExtremesMethod clsListInitialFunction = clsNewListInitialFunction clsConcatenateFunction = clsNewConcatenateFunction clsConfidenceIntervalFunction = clsNewConfidenceIntervalFunction - ucrChkType.SetRCode(clsConfidenceIntervalFunction) + ucrChkType.SetRCode(clsConfidenceIntervalFunction, bReset) ucrNudReturnLevel.SetRCode(clsConfidenceIntervalFunction, bReset) ucrInputPrior.SetRCode(clsConcatenateFunction, bReset) ucrNudNumberOfIterations.SetRCode(clsFevdFunction, bReset) From 1bad8bee8b2f39fb0b7090bd93463ce582c6af61 Mon Sep 17 00:00:00 2001 From: IVAN LUVISIA Date: Tue, 2 Aug 2022 13:37:57 +0300 Subject: [PATCH 006/122] Minor change --- instat/dlgExtremes.Designer.vb | 189 +++++------ instat/dlgExtremes.vb | 28 +- instat/sdgExtremesMethod.Designer.vb | 474 +++++++++++++-------------- instat/sdgExtremesMethod.vb | 119 +++---- 4 files changed, 384 insertions(+), 426 deletions(-) diff --git a/instat/dlgExtremes.Designer.vb b/instat/dlgExtremes.Designer.vb index 9cea18c0095..51a97ad0db9 100644 --- a/instat/dlgExtremes.Designer.vb +++ b/instat/dlgExtremes.Designer.vb @@ -77,10 +77,10 @@ Partial Class dlgExtremes 'cmdSqrt ' Me.cmdSqrt.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdSqrt.Location = New System.Drawing.Point(6, 15) - Me.cmdSqrt.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdSqrt.Location = New System.Drawing.Point(4, 10) + Me.cmdSqrt.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdSqrt.Name = "cmdSqrt" - Me.cmdSqrt.Size = New System.Drawing.Size(84, 45) + Me.cmdSqrt.Size = New System.Drawing.Size(56, 30) Me.cmdSqrt.TabIndex = 0 Me.cmdSqrt.Text = "sqrt" Me.cmdSqrt.UseVisualStyleBackColor = True @@ -88,10 +88,10 @@ Partial Class dlgExtremes 'cmdLog ' Me.cmdLog.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdLog.Location = New System.Drawing.Point(6, 60) - Me.cmdLog.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdLog.Location = New System.Drawing.Point(4, 40) + Me.cmdLog.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdLog.Name = "cmdLog" - Me.cmdLog.Size = New System.Drawing.Size(84, 45) + Me.cmdLog.Size = New System.Drawing.Size(56, 30) Me.cmdLog.TabIndex = 2 Me.cmdLog.Text = "log" Me.cmdLog.UseVisualStyleBackColor = True @@ -99,10 +99,10 @@ Partial Class dlgExtremes 'cmdTan ' Me.cmdTan.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdTan.Location = New System.Drawing.Point(90, 105) - Me.cmdTan.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdTan.Location = New System.Drawing.Point(60, 70) + Me.cmdTan.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdTan.Name = "cmdTan" - Me.cmdTan.Size = New System.Drawing.Size(84, 45) + Me.cmdTan.Size = New System.Drawing.Size(56, 30) Me.cmdTan.TabIndex = 5 Me.cmdTan.Text = "tan" Me.cmdTan.UseVisualStyleBackColor = True @@ -110,10 +110,10 @@ Partial Class dlgExtremes 'cmdExp ' Me.cmdExp.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdExp.Location = New System.Drawing.Point(6, 105) - Me.cmdExp.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdExp.Location = New System.Drawing.Point(4, 70) + Me.cmdExp.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdExp.Name = "cmdExp" - Me.cmdExp.Size = New System.Drawing.Size(84, 45) + Me.cmdExp.Size = New System.Drawing.Size(56, 30) Me.cmdExp.TabIndex = 4 Me.cmdExp.Text = "exp" Me.cmdExp.UseVisualStyleBackColor = True @@ -122,20 +122,19 @@ Partial Class dlgExtremes ' Me.lblThreshold.AutoSize = True Me.lblThreshold.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblThreshold.Location = New System.Drawing.Point(15, 352) - Me.lblThreshold.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0) + Me.lblThreshold.Location = New System.Drawing.Point(10, 235) Me.lblThreshold.Name = "lblThreshold" - Me.lblThreshold.Size = New System.Drawing.Size(83, 20) + Me.lblThreshold.Size = New System.Drawing.Size(57, 13) Me.lblThreshold.TabIndex = 9 Me.lblThreshold.Text = "Threshold:" ' 'cmdSin ' Me.cmdSin.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdSin.Location = New System.Drawing.Point(90, 60) - Me.cmdSin.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdSin.Location = New System.Drawing.Point(60, 40) + Me.cmdSin.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdSin.Name = "cmdSin" - Me.cmdSin.Size = New System.Drawing.Size(84, 45) + Me.cmdSin.Size = New System.Drawing.Size(56, 30) Me.cmdSin.TabIndex = 3 Me.cmdSin.Text = "sin" Me.cmdSin.UseVisualStyleBackColor = True @@ -148,21 +147,19 @@ Partial Class dlgExtremes Me.grpSecondCalc.Controls.Add(Me.cmdLog) Me.grpSecondCalc.Controls.Add(Me.cmdTan) Me.grpSecondCalc.Controls.Add(Me.cmdExp) - Me.grpSecondCalc.Location = New System.Drawing.Point(585, 208) - Me.grpSecondCalc.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) + Me.grpSecondCalc.Location = New System.Drawing.Point(390, 139) Me.grpSecondCalc.Name = "grpSecondCalc" - Me.grpSecondCalc.Padding = New System.Windows.Forms.Padding(4, 4, 4, 4) - Me.grpSecondCalc.Size = New System.Drawing.Size(178, 156) + Me.grpSecondCalc.Size = New System.Drawing.Size(119, 104) Me.grpSecondCalc.TabIndex = 6 Me.grpSecondCalc.TabStop = False ' 'cmdCos ' Me.cmdCos.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdCos.Location = New System.Drawing.Point(90, 15) - Me.cmdCos.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdCos.Location = New System.Drawing.Point(60, 10) + Me.cmdCos.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdCos.Name = "cmdCos" - Me.cmdCos.Size = New System.Drawing.Size(84, 45) + Me.cmdCos.Size = New System.Drawing.Size(56, 30) Me.cmdCos.TabIndex = 1 Me.cmdCos.Text = "cos" Me.cmdCos.UseVisualStyleBackColor = True @@ -180,11 +177,9 @@ Partial Class dlgExtremes Me.grpFirstCalc.Controls.Add(Me.cmdClear) Me.grpFirstCalc.Controls.Add(Me.cmdZero) Me.grpFirstCalc.Controls.Add(Me.cmdMinus) - Me.grpFirstCalc.Location = New System.Drawing.Point(387, 208) - Me.grpFirstCalc.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) + Me.grpFirstCalc.Location = New System.Drawing.Point(258, 139) Me.grpFirstCalc.Name = "grpFirstCalc" - Me.grpFirstCalc.Padding = New System.Windows.Forms.Padding(4, 4, 4, 4) - Me.grpFirstCalc.Size = New System.Drawing.Size(190, 156) + Me.grpFirstCalc.Size = New System.Drawing.Size(127, 104) Me.grpFirstCalc.TabIndex = 5 Me.grpFirstCalc.TabStop = False ' @@ -192,10 +187,10 @@ Partial Class dlgExtremes ' Me.cmdMultiply.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdMultiply.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdMultiply.Location = New System.Drawing.Point(96, 15) - Me.cmdMultiply.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdMultiply.Location = New System.Drawing.Point(64, 10) + Me.cmdMultiply.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdMultiply.Name = "cmdMultiply" - Me.cmdMultiply.Size = New System.Drawing.Size(44, 45) + Me.cmdMultiply.Size = New System.Drawing.Size(29, 30) Me.cmdMultiply.TabIndex = 2 Me.cmdMultiply.Text = "*" Me.cmdMultiply.UseVisualStyleBackColor = True @@ -204,10 +199,10 @@ Partial Class dlgExtremes ' Me.cmdColon.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdColon.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdColon.Location = New System.Drawing.Point(52, 15) - Me.cmdColon.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdColon.Location = New System.Drawing.Point(35, 10) + Me.cmdColon.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdColon.Name = "cmdColon" - Me.cmdColon.Size = New System.Drawing.Size(44, 45) + Me.cmdColon.Size = New System.Drawing.Size(29, 30) Me.cmdColon.TabIndex = 1 Me.cmdColon.Text = ":" Me.cmdColon.UseVisualStyleBackColor = True @@ -216,10 +211,10 @@ Partial Class dlgExtremes ' Me.cmdPlus.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdPlus.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdPlus.Location = New System.Drawing.Point(9, 15) - Me.cmdPlus.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdPlus.Location = New System.Drawing.Point(6, 10) + Me.cmdPlus.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdPlus.Name = "cmdPlus" - Me.cmdPlus.Size = New System.Drawing.Size(44, 45) + Me.cmdPlus.Size = New System.Drawing.Size(29, 30) Me.cmdPlus.TabIndex = 0 Me.cmdPlus.Text = "+" Me.cmdPlus.UseVisualStyleBackColor = True @@ -228,10 +223,10 @@ Partial Class dlgExtremes ' Me.cmdPower.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdPower.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdPower.Location = New System.Drawing.Point(140, 60) - Me.cmdPower.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdPower.Location = New System.Drawing.Point(93, 40) + Me.cmdPower.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdPower.Name = "cmdPower" - Me.cmdPower.Size = New System.Drawing.Size(44, 45) + Me.cmdPower.Size = New System.Drawing.Size(29, 30) Me.cmdPower.TabIndex = 7 Me.cmdPower.Text = "^" Me.cmdPower.UseVisualStyleBackColor = True @@ -240,10 +235,10 @@ Partial Class dlgExtremes ' Me.cmdClosingBracket.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!) Me.cmdClosingBracket.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdClosingBracket.Location = New System.Drawing.Point(96, 60) - Me.cmdClosingBracket.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdClosingBracket.Location = New System.Drawing.Point(64, 40) + Me.cmdClosingBracket.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdClosingBracket.Name = "cmdClosingBracket" - Me.cmdClosingBracket.Size = New System.Drawing.Size(44, 45) + Me.cmdClosingBracket.Size = New System.Drawing.Size(29, 30) Me.cmdClosingBracket.TabIndex = 6 Me.cmdClosingBracket.Text = ")" Me.cmdClosingBracket.UseVisualStyleBackColor = True @@ -252,10 +247,10 @@ Partial Class dlgExtremes ' Me.cmdOpeningBracket.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!) Me.cmdOpeningBracket.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdOpeningBracket.Location = New System.Drawing.Point(52, 60) - Me.cmdOpeningBracket.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdOpeningBracket.Location = New System.Drawing.Point(35, 40) + Me.cmdOpeningBracket.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdOpeningBracket.Name = "cmdOpeningBracket" - Me.cmdOpeningBracket.Size = New System.Drawing.Size(44, 45) + Me.cmdOpeningBracket.Size = New System.Drawing.Size(29, 30) Me.cmdOpeningBracket.TabIndex = 5 Me.cmdOpeningBracket.Text = "(" Me.cmdOpeningBracket.UseVisualStyleBackColor = True @@ -264,10 +259,10 @@ Partial Class dlgExtremes ' Me.cmdDiv.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdDiv.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdDiv.Location = New System.Drawing.Point(140, 15) - Me.cmdDiv.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdDiv.Location = New System.Drawing.Point(93, 10) + Me.cmdDiv.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdDiv.Name = "cmdDiv" - Me.cmdDiv.Size = New System.Drawing.Size(44, 45) + Me.cmdDiv.Size = New System.Drawing.Size(29, 30) Me.cmdDiv.TabIndex = 3 Me.cmdDiv.Text = "/" Me.cmdDiv.UseVisualStyleBackColor = True @@ -276,10 +271,10 @@ Partial Class dlgExtremes ' Me.cmdDoubleBracket.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!) Me.cmdDoubleBracket.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdDoubleBracket.Location = New System.Drawing.Point(9, 60) - Me.cmdDoubleBracket.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdDoubleBracket.Location = New System.Drawing.Point(6, 40) + Me.cmdDoubleBracket.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdDoubleBracket.Name = "cmdDoubleBracket" - Me.cmdDoubleBracket.Size = New System.Drawing.Size(44, 45) + Me.cmdDoubleBracket.Size = New System.Drawing.Size(29, 30) Me.cmdDoubleBracket.TabIndex = 4 Me.cmdDoubleBracket.Text = "( )" Me.cmdDoubleBracket.UseVisualStyleBackColor = True @@ -287,10 +282,10 @@ Partial Class dlgExtremes 'cmdClear ' Me.cmdClear.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdClear.Location = New System.Drawing.Point(96, 105) - Me.cmdClear.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdClear.Location = New System.Drawing.Point(64, 70) + Me.cmdClear.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdClear.Name = "cmdClear" - Me.cmdClear.Size = New System.Drawing.Size(87, 45) + Me.cmdClear.Size = New System.Drawing.Size(58, 30) Me.cmdClear.TabIndex = 10 Me.cmdClear.Text = "Clear" Me.cmdClear.UseVisualStyleBackColor = True @@ -299,10 +294,10 @@ Partial Class dlgExtremes ' Me.cmdZero.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.75!) Me.cmdZero.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdZero.Location = New System.Drawing.Point(52, 105) - Me.cmdZero.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdZero.Location = New System.Drawing.Point(35, 70) + Me.cmdZero.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdZero.Name = "cmdZero" - Me.cmdZero.Size = New System.Drawing.Size(44, 45) + Me.cmdZero.Size = New System.Drawing.Size(29, 30) Me.cmdZero.TabIndex = 9 Me.cmdZero.Text = "l()" Me.cmdZero.UseVisualStyleBackColor = True @@ -311,10 +306,10 @@ Partial Class dlgExtremes ' Me.cmdMinus.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!) Me.cmdMinus.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdMinus.Location = New System.Drawing.Point(9, 105) - Me.cmdMinus.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.cmdMinus.Location = New System.Drawing.Point(6, 70) + Me.cmdMinus.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdMinus.Name = "cmdMinus" - Me.cmdMinus.Size = New System.Drawing.Size(44, 45) + Me.cmdMinus.Size = New System.Drawing.Size(29, 30) Me.cmdMinus.TabIndex = 8 Me.cmdMinus.Text = "-" Me.cmdMinus.UseVisualStyleBackColor = True @@ -323,20 +318,18 @@ Partial Class dlgExtremes ' Me.lblFevdType.AutoSize = True Me.lblFevdType.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblFevdType.Location = New System.Drawing.Point(15, 310) - Me.lblFevdType.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0) + Me.lblFevdType.Location = New System.Drawing.Point(10, 207) Me.lblFevdType.Name = "lblFevdType" - Me.lblFevdType.Size = New System.Drawing.Size(93, 20) + Me.lblFevdType.Size = New System.Drawing.Size(62, 13) Me.lblFevdType.TabIndex = 7 Me.lblFevdType.Text = "Distribution:" ' 'cmdFittingOptions ' Me.cmdFittingOptions.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdFittingOptions.Location = New System.Drawing.Point(602, 392) - Me.cmdFittingOptions.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) + Me.cmdFittingOptions.Location = New System.Drawing.Point(401, 261) Me.cmdFittingOptions.Name = "cmdFittingOptions" - Me.cmdFittingOptions.Size = New System.Drawing.Size(162, 34) + Me.cmdFittingOptions.Size = New System.Drawing.Size(108, 23) Me.cmdFittingOptions.TabIndex = 12 Me.cmdFittingOptions.Text = "Options" Me.cmdFittingOptions.UseVisualStyleBackColor = True @@ -345,10 +338,9 @@ Partial Class dlgExtremes ' Me.lblDataToFit.AutoSize = True Me.lblDataToFit.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblDataToFit.Location = New System.Drawing.Point(387, 68) - Me.lblDataToFit.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0) + Me.lblDataToFit.Location = New System.Drawing.Point(258, 45) Me.lblDataToFit.Name = "lblDataToFit" - Me.lblDataToFit.Size = New System.Drawing.Size(148, 20) + Me.lblDataToFit.Size = New System.Drawing.Size(99, 13) Me.lblDataToFit.TabIndex = 1 Me.lblDataToFit.Tag = "Data_to_be_fitted" Me.lblDataToFit.Text = "Response Variable:" @@ -359,41 +351,41 @@ Partial Class dlgExtremes Me.ucrInputThresholdforLocation.AutoSize = True Me.ucrInputThresholdforLocation.IsMultiline = False Me.ucrInputThresholdforLocation.IsReadOnly = False - Me.ucrInputThresholdforLocation.Location = New System.Drawing.Point(118, 346) - Me.ucrInputThresholdforLocation.Margin = New System.Windows.Forms.Padding(14, 14, 14, 14) + Me.ucrInputThresholdforLocation.Location = New System.Drawing.Point(79, 231) + Me.ucrInputThresholdforLocation.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) Me.ucrInputThresholdforLocation.Name = "ucrInputThresholdforLocation" - Me.ucrInputThresholdforLocation.Size = New System.Drawing.Size(118, 32) + Me.ucrInputThresholdforLocation.Size = New System.Drawing.Size(79, 21) Me.ucrInputThresholdforLocation.TabIndex = 10 ' 'ucrTryModelling ' Me.ucrTryModelling.AutoSize = True - Me.ucrTryModelling.Location = New System.Drawing.Point(2, 387) - Me.ucrTryModelling.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrTryModelling.Location = New System.Drawing.Point(1, 258) + Me.ucrTryModelling.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) Me.ucrTryModelling.Name = "ucrTryModelling" Me.ucrTryModelling.RunCommandAsMultipleLines = False - Me.ucrTryModelling.Size = New System.Drawing.Size(594, 55) + Me.ucrTryModelling.Size = New System.Drawing.Size(396, 37) Me.ucrTryModelling.TabIndex = 11 ' 'ucrChkExplanatoryModelForLocationParameter ' Me.ucrChkExplanatoryModelForLocationParameter.AutoSize = True Me.ucrChkExplanatoryModelForLocationParameter.Checked = False - Me.ucrChkExplanatoryModelForLocationParameter.Location = New System.Drawing.Point(387, 128) - Me.ucrChkExplanatoryModelForLocationParameter.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) + Me.ucrChkExplanatoryModelForLocationParameter.Location = New System.Drawing.Point(258, 85) + Me.ucrChkExplanatoryModelForLocationParameter.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) Me.ucrChkExplanatoryModelForLocationParameter.Name = "ucrChkExplanatoryModelForLocationParameter" - Me.ucrChkExplanatoryModelForLocationParameter.Size = New System.Drawing.Size(405, 34) + Me.ucrChkExplanatoryModelForLocationParameter.Size = New System.Drawing.Size(270, 23) Me.ucrChkExplanatoryModelForLocationParameter.TabIndex = 3 ' 'ucrReceiverExpressionExplanatoryModelForLocParam ' Me.ucrReceiverExpressionExplanatoryModelForLocParam.AutoSize = True Me.ucrReceiverExpressionExplanatoryModelForLocParam.frmParent = Me - Me.ucrReceiverExpressionExplanatoryModelForLocParam.Location = New System.Drawing.Point(387, 162) - Me.ucrReceiverExpressionExplanatoryModelForLocParam.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) + Me.ucrReceiverExpressionExplanatoryModelForLocParam.Location = New System.Drawing.Point(258, 108) + Me.ucrReceiverExpressionExplanatoryModelForLocParam.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) Me.ucrReceiverExpressionExplanatoryModelForLocParam.Name = "ucrReceiverExpressionExplanatoryModelForLocParam" Me.ucrReceiverExpressionExplanatoryModelForLocParam.Selector = Nothing - Me.ucrReceiverExpressionExplanatoryModelForLocParam.Size = New System.Drawing.Size(376, 33) + Me.ucrReceiverExpressionExplanatoryModelForLocParam.Size = New System.Drawing.Size(251, 22) Me.ucrReceiverExpressionExplanatoryModelForLocParam.strNcFilePath = "" Me.ucrReceiverExpressionExplanatoryModelForLocParam.TabIndex = 4 Me.ucrReceiverExpressionExplanatoryModelForLocParam.ucrSelector = Nothing @@ -404,19 +396,19 @@ Partial Class dlgExtremes Me.ucrInputExtremes.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink Me.ucrInputExtremes.GetSetSelectedIndex = -1 Me.ucrInputExtremes.IsReadOnly = False - Me.ucrInputExtremes.Location = New System.Drawing.Point(118, 306) - Me.ucrInputExtremes.Margin = New System.Windows.Forms.Padding(14, 14, 14, 14) + Me.ucrInputExtremes.Location = New System.Drawing.Point(79, 204) + Me.ucrInputExtremes.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) Me.ucrInputExtremes.Name = "ucrInputExtremes" - Me.ucrInputExtremes.Size = New System.Drawing.Size(118, 32) + Me.ucrInputExtremes.Size = New System.Drawing.Size(79, 21) Me.ucrInputExtremes.TabIndex = 8 ' 'ucrSaveExtremes ' Me.ucrSaveExtremes.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrSaveExtremes.Location = New System.Drawing.Point(15, 441) - Me.ucrSaveExtremes.Margin = New System.Windows.Forms.Padding(6, 8, 6, 8) + Me.ucrSaveExtremes.Location = New System.Drawing.Point(10, 303) + Me.ucrSaveExtremes.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) Me.ucrSaveExtremes.Name = "ucrSaveExtremes" - Me.ucrSaveExtremes.Size = New System.Drawing.Size(480, 33) + Me.ucrSaveExtremes.Size = New System.Drawing.Size(320, 22) Me.ucrSaveExtremes.TabIndex = 13 ' 'ucrSelectorExtremes @@ -425,21 +417,21 @@ Partial Class dlgExtremes Me.ucrSelectorExtremes.bDropUnusedFilterLevels = False Me.ucrSelectorExtremes.bShowHiddenColumns = False Me.ucrSelectorExtremes.bUseCurrentFilter = True - Me.ucrSelectorExtremes.Location = New System.Drawing.Point(15, 15) + Me.ucrSelectorExtremes.Location = New System.Drawing.Point(10, 10) Me.ucrSelectorExtremes.Margin = New System.Windows.Forms.Padding(0) Me.ucrSelectorExtremes.Name = "ucrSelectorExtremes" - Me.ucrSelectorExtremes.Size = New System.Drawing.Size(320, 274) + Me.ucrSelectorExtremes.Size = New System.Drawing.Size(213, 183) Me.ucrSelectorExtremes.TabIndex = 0 ' 'ucrReceiverVariable ' Me.ucrReceiverVariable.AutoSize = True Me.ucrReceiverVariable.frmParent = Me - Me.ucrReceiverVariable.Location = New System.Drawing.Point(387, 90) + Me.ucrReceiverVariable.Location = New System.Drawing.Point(258, 60) Me.ucrReceiverVariable.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverVariable.Name = "ucrReceiverVariable" Me.ucrReceiverVariable.Selector = Nothing - Me.ucrReceiverVariable.Size = New System.Drawing.Size(190, 33) + Me.ucrReceiverVariable.Size = New System.Drawing.Size(127, 22) Me.ucrReceiverVariable.strNcFilePath = "" Me.ucrReceiverVariable.TabIndex = 2 Me.ucrReceiverVariable.ucrSelector = Nothing @@ -448,18 +440,18 @@ Partial Class dlgExtremes ' Me.ucrBase.AutoSize = True Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrBase.Location = New System.Drawing.Point(15, 482) - Me.ucrBase.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrBase.Location = New System.Drawing.Point(10, 330) + Me.ucrBase.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(611, 77) + Me.ucrBase.Size = New System.Drawing.Size(408, 52) Me.ucrBase.TabIndex = 15 ' 'dlgExtremes ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(144.0!, 144.0!) + Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(800, 567) + Me.ClientSize = New System.Drawing.Size(533, 389) Me.Controls.Add(Me.ucrInputThresholdforLocation) Me.Controls.Add(Me.lblThreshold) Me.Controls.Add(Me.ucrTryModelling) @@ -476,7 +468,6 @@ Partial Class dlgExtremes Me.Controls.Add(Me.ucrReceiverVariable) Me.Controls.Add(Me.ucrBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow - Me.Margin = New System.Windows.Forms.Padding(4, 4, 4, 4) Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "dlgExtremes" diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index fd1c88101c1..1a01a4049a9 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -20,8 +20,8 @@ Public Class dlgExtremes Private clsAttachFunction As New RFunction Private clsDetachFunction As New RFunction - Private clsFevdFunction, clsListFunction, clsPlotsFunction, clsConcatenateFunction, clsConfidenceIntervalFunction, -clsListInitialFunction As New RFunction + Private clsFevdFunction, clsPriorParamListFunction, clsPlotsFunction, clsConcatenateFunction, clsConfidenceIntervalFunction, +clsInitialListFunction As New RFunction 'clsLocationScaleResetOperator is not run but affects reset of the check box.Any better method of implementation? Private clsLocationScaleResetOperator As New ROperator Private clsLocationParamOperator As New ROperator @@ -93,8 +93,8 @@ clsListInitialFunction As New RFunction Private Sub SetDefaults() clsFevdFunction = New RFunction clsPlotsFunction = New RFunction - clsListFunction = New RFunction - clsListInitialFunction = New RFunction + clsPriorParamListFunction = New RFunction + clsInitialListFunction = New RFunction clsLocationParamOperator = New ROperator clsLocationScaleResetOperator = New ROperator clsAttachFunction = New RFunction @@ -123,13 +123,13 @@ clsListInitialFunction As New RFunction clsPlotsFunction.iCallType = 3 clsPlotsFunction.bExcludeAssignedFunctionOutput = False - clsListFunction.SetRCommand("list") - clsListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=5) + clsPriorParamListFunction.SetRCommand("list") + clsPriorParamListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=5) - clsListInitialFunction.SetRCommand("list") - clsListInitialFunction.AddParameter("location", "0", iPosition:=0) - clsListInitialFunction.AddParameter("scale", "0.1", iPosition:=1) - clsListInitialFunction.AddParameter("shape", "-0.5", iPosition:=2) + clsInitialListFunction.SetRCommand("list") + clsInitialListFunction.AddParameter("location", "0", iPosition:=0) + clsInitialListFunction.AddParameter("scale", "0.1", iPosition:=1) + clsInitialListFunction.AddParameter("shape", "-0.5", iPosition:=2) clsConfidenceIntervalFunction.SetPackageName("extRemes") clsConfidenceIntervalFunction.SetRCommand("ci.fevd") @@ -137,8 +137,8 @@ clsListInitialFunction As New RFunction clsFevdFunction.SetPackageName("extRemes") clsFevdFunction.SetRCommand("fevd") - clsFevdFunction.AddParameter("priorParams", clsRFunctionParameter:=clsListFunction, iPosition:=4) - clsFevdFunction.AddParameter("initial", clsRFunctionParameter:=clsListInitialFunction, iPosition:=5) + clsFevdFunction.AddParameter("priorParams", clsRFunctionParameter:=clsPriorParamListFunction, iPosition:=4) + clsFevdFunction.AddParameter("initial", clsRFunctionParameter:=clsInitialListFunction, iPosition:=5) clsFevdFunction.AddParameter("iter", "9999", iPosition:=6) clsFevdFunction.AddParameter("type", Chr(34) & "GEV" & Chr(34), iPosition:=0) @@ -185,10 +185,10 @@ clsListInitialFunction As New RFunction ucrBase.OKEnabled(Not ucrReceiverVariable.IsEmpty) End Sub Private Sub cmdFittingOptions_Click(sender As Object, e As EventArgs) Handles cmdFittingOptions.Click - sdgExtremesMethod.SetRCode(clsNewFevdFunction:=clsFevdFunction, clsNewListFunction:=clsListFunction, + sdgExtremesMethod.SetRCode(clsNewFevdFunction:=clsFevdFunction, clsNewPriorParamListFunction:=clsPriorParamListFunction, clsNewConcatenateFunction:=clsConcatenateFunction, bReset:=bResetSubDialogue, clsNewPlotFunction:=clsPlotsFunction, clsNewConfidenceIntervalFunction:=clsConfidenceIntervalFunction, - clsNewListInitialFunction:=clsListInitialFunction, clsNewRSyntax:=ucrBase.clsRsyntax) + clsNewInitialListFunction:=clsInitialListFunction, clsNewRSyntax:=ucrBase.clsRsyntax) sdgExtremesMethod.ShowDialog() bResetSubDialogue = False End Sub diff --git a/instat/sdgExtremesMethod.Designer.vb b/instat/sdgExtremesMethod.Designer.vb index 7515d4a2c0b..669d809a460 100644 --- a/instat/sdgExtremesMethod.Designer.vb +++ b/instat/sdgExtremesMethod.Designer.vb @@ -24,11 +24,7 @@ Partial Class sdgExtremesMethod Private Sub InitializeComponent() Me.tbConfidenceInterval = New System.Windows.Forms.TabPage() Me.lblReturnLevel = New System.Windows.Forms.Label() - Me.ucrInputType = New instat.ucrInputComboBox() - Me.ucrChkType = New instat.ucrCheck() - Me.ucrNudReturnLevel = New instat.ucrNud() Me.tbDisplayOptions = New System.Windows.Forms.TabPage() - Me.ucrSavePlots = New instat.ucrSave() Me.grpPlots = New System.Windows.Forms.GroupBox() Me.rdoNoPlot = New System.Windows.Forms.RadioButton() Me.rdoTrace = New System.Windows.Forms.RadioButton() @@ -40,26 +36,30 @@ Partial Class sdgExtremesMethod Me.rdoQQPlot = New System.Windows.Forms.RadioButton() Me.rdoQQ2 = New System.Windows.Forms.RadioButton() Me.rdoPrimary = New System.Windows.Forms.RadioButton() - Me.ucrPnlExtreme = New instat.UcrPanel() Me.tbRegOptions = New System.Windows.Forms.TabControl() Me.tbFitMethod = New System.Windows.Forms.TabPage() - Me.lblLocation = New System.Windows.Forms.Label() - Me.lblScale = New System.Windows.Forms.Label() - Me.lblShape = New System.Windows.Forms.Label() - Me.ucrNudScale = New instat.ucrNud() - Me.ucrNudLocation = New instat.ucrNud() - Me.ucrNudShape = New instat.ucrNud() - Me.ucrInputPrior = New instat.ucrInputTextBox() Me.lblPrior = New System.Windows.Forms.Label() Me.rdoMle = New System.Windows.Forms.RadioButton() Me.rdoBayesian = New System.Windows.Forms.RadioButton() Me.rdoGMLE = New System.Windows.Forms.RadioButton() Me.rdoLmoments = New System.Windows.Forms.RadioButton() - Me.ucrNudNumberOfIterations = New instat.ucrNud() Me.lblNumberOfIterations = New System.Windows.Forms.Label() Me.grpFitMethod = New System.Windows.Forms.GroupBox() - Me.ucrPnlExtremes = New instat.UcrPanel() Me.grpInitial = New System.Windows.Forms.GroupBox() + Me.lblLocation = New System.Windows.Forms.Label() + Me.lblScale = New System.Windows.Forms.Label() + Me.lblShape = New System.Windows.Forms.Label() + Me.ucrNudScale = New instat.ucrNud() + Me.ucrNudLocation = New instat.ucrNud() + Me.ucrNudShape = New instat.ucrNud() + Me.ucrInputPrior = New instat.ucrInputTextBox() + Me.ucrNudNumberOfIterations = New instat.ucrNud() + Me.ucrPnlFitMethodExtremes = New instat.UcrPanel() + Me.ucrSavePlots = New instat.ucrSave() + Me.ucrPnlDisplayOptionsExtreme = New instat.UcrPanel() + Me.ucrChkType = New instat.ucrCheck() + Me.ucrNudReturnLevel = New instat.ucrNud() + Me.ucrInputType = New instat.ucrInputComboBox() Me.ucrBase = New instat.ucrButtonsSubdialogue() Me.tbConfidenceInterval.SuspendLayout() Me.tbDisplayOptions.SuspendLayout() @@ -67,6 +67,7 @@ Partial Class sdgExtremesMethod Me.tbRegOptions.SuspendLayout() Me.tbFitMethod.SuspendLayout() Me.grpFitMethod.SuspendLayout() + Me.grpInitial.SuspendLayout() Me.SuspendLayout() ' 'tbConfidenceInterval @@ -75,11 +76,10 @@ Partial Class sdgExtremesMethod Me.tbConfidenceInterval.Controls.Add(Me.ucrChkType) Me.tbConfidenceInterval.Controls.Add(Me.ucrNudReturnLevel) Me.tbConfidenceInterval.Controls.Add(Me.ucrInputType) - Me.tbConfidenceInterval.Location = New System.Drawing.Point(4, 29) - Me.tbConfidenceInterval.Margin = New System.Windows.Forms.Padding(4) + Me.tbConfidenceInterval.Location = New System.Drawing.Point(4, 22) Me.tbConfidenceInterval.Name = "tbConfidenceInterval" - Me.tbConfidenceInterval.Padding = New System.Windows.Forms.Padding(4) - Me.tbConfidenceInterval.Size = New System.Drawing.Size(549, 433) + Me.tbConfidenceInterval.Padding = New System.Windows.Forms.Padding(3) + Me.tbConfidenceInterval.Size = New System.Drawing.Size(363, 285) Me.tbConfidenceInterval.TabIndex = 2 Me.tbConfidenceInterval.Tag = "Save" Me.tbConfidenceInterval.Text = "Confidence Interval" @@ -88,71 +88,26 @@ Partial Class sdgExtremesMethod 'lblReturnLevel ' Me.lblReturnLevel.AutoSize = True - Me.lblReturnLevel.Location = New System.Drawing.Point(356, 17) + Me.lblReturnLevel.Location = New System.Drawing.Point(237, 11) + Me.lblReturnLevel.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) Me.lblReturnLevel.Name = "lblReturnLevel" - Me.lblReturnLevel.Size = New System.Drawing.Size(103, 20) + Me.lblReturnLevel.Size = New System.Drawing.Size(71, 13) Me.lblReturnLevel.TabIndex = 3 Me.lblReturnLevel.Text = "Return Level:" ' - 'ucrInputType - ' - Me.ucrInputType.AddQuotesIfUnrecognised = True - Me.ucrInputType.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputType.GetSetSelectedIndex = -1 - Me.ucrInputType.IsReadOnly = False - Me.ucrInputType.Location = New System.Drawing.Point(163, 18) - Me.ucrInputType.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) - Me.ucrInputType.Name = "ucrInputType" - Me.ucrInputType.Size = New System.Drawing.Size(175, 32) - Me.ucrInputType.TabIndex = 1 - ' - 'ucrChkType - ' - Me.ucrChkType.AutoSize = True - Me.ucrChkType.Checked = False - Me.ucrChkType.Location = New System.Drawing.Point(12, 14) - Me.ucrChkType.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrChkType.Name = "ucrChkType" - Me.ucrChkType.Size = New System.Drawing.Size(150, 34) - Me.ucrChkType.TabIndex = 0 - ' - 'ucrNudReturnLevel - ' - Me.ucrNudReturnLevel.AutoSize = True - Me.ucrNudReturnLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudReturnLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudReturnLevel.Location = New System.Drawing.Point(466, 13) - Me.ucrNudReturnLevel.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrNudReturnLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudReturnLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudReturnLevel.Name = "ucrNudReturnLevel" - Me.ucrNudReturnLevel.Size = New System.Drawing.Size(75, 30) - Me.ucrNudReturnLevel.TabIndex = 2 - Me.ucrNudReturnLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' 'tbDisplayOptions ' Me.tbDisplayOptions.Controls.Add(Me.ucrSavePlots) Me.tbDisplayOptions.Controls.Add(Me.grpPlots) - Me.tbDisplayOptions.Location = New System.Drawing.Point(4, 29) - Me.tbDisplayOptions.Margin = New System.Windows.Forms.Padding(4) + Me.tbDisplayOptions.Location = New System.Drawing.Point(4, 22) Me.tbDisplayOptions.Name = "tbDisplayOptions" - Me.tbDisplayOptions.Padding = New System.Windows.Forms.Padding(4) - Me.tbDisplayOptions.Size = New System.Drawing.Size(549, 433) + Me.tbDisplayOptions.Padding = New System.Windows.Forms.Padding(3) + Me.tbDisplayOptions.Size = New System.Drawing.Size(363, 285) Me.tbDisplayOptions.TabIndex = 1 Me.tbDisplayOptions.Tag = "Graphics" Me.tbDisplayOptions.Text = "Display Options" Me.tbDisplayOptions.UseVisualStyleBackColor = True ' - 'ucrSavePlots - ' - Me.ucrSavePlots.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrSavePlots.Location = New System.Drawing.Point(29, 238) - Me.ucrSavePlots.Margin = New System.Windows.Forms.Padding(6, 8, 6, 8) - Me.ucrSavePlots.Name = "ucrSavePlots" - Me.ucrSavePlots.Size = New System.Drawing.Size(392, 36) - Me.ucrSavePlots.TabIndex = 3 - ' 'grpPlots ' Me.grpPlots.Controls.Add(Me.rdoNoPlot) @@ -165,12 +120,10 @@ Partial Class sdgExtremesMethod Me.grpPlots.Controls.Add(Me.rdoQQPlot) Me.grpPlots.Controls.Add(Me.rdoQQ2) Me.grpPlots.Controls.Add(Me.rdoPrimary) - Me.grpPlots.Controls.Add(Me.ucrPnlExtreme) - Me.grpPlots.Location = New System.Drawing.Point(29, 14) - Me.grpPlots.Margin = New System.Windows.Forms.Padding(4) + Me.grpPlots.Controls.Add(Me.ucrPnlDisplayOptionsExtreme) + Me.grpPlots.Location = New System.Drawing.Point(19, 9) Me.grpPlots.Name = "grpPlots" - Me.grpPlots.Padding = New System.Windows.Forms.Padding(4) - Me.grpPlots.Size = New System.Drawing.Size(392, 212) + Me.grpPlots.Size = New System.Drawing.Size(261, 141) Me.grpPlots.TabIndex = 2 Me.grpPlots.TabStop = False Me.grpPlots.Text = "Plots" @@ -179,10 +132,9 @@ Partial Class sdgExtremesMethod ' Me.rdoNoPlot.AutoSize = True Me.rdoNoPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoNoPlot.Location = New System.Drawing.Point(20, 33) - Me.rdoNoPlot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoNoPlot.Location = New System.Drawing.Point(13, 22) Me.rdoNoPlot.Name = "rdoNoPlot" - Me.rdoNoPlot.Size = New System.Drawing.Size(85, 24) + Me.rdoNoPlot.Size = New System.Drawing.Size(60, 17) Me.rdoNoPlot.TabIndex = 1 Me.rdoNoPlot.Text = "No Plot" Me.rdoNoPlot.UseVisualStyleBackColor = True @@ -191,10 +143,9 @@ Partial Class sdgExtremesMethod ' Me.rdoTrace.AutoSize = True Me.rdoTrace.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoTrace.Location = New System.Drawing.Point(20, 172) - Me.rdoTrace.Margin = New System.Windows.Forms.Padding(4) + Me.rdoTrace.Location = New System.Drawing.Point(13, 115) Me.rdoTrace.Name = "rdoTrace" - Me.rdoTrace.Size = New System.Drawing.Size(105, 24) + Me.rdoTrace.Size = New System.Drawing.Size(74, 17) Me.rdoTrace.TabIndex = 5 Me.rdoTrace.Text = "Trace Plot" Me.rdoTrace.UseVisualStyleBackColor = True @@ -203,10 +154,9 @@ Partial Class sdgExtremesMethod ' Me.rdoRlplot.AutoSize = True Me.rdoRlplot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoRlplot.Location = New System.Drawing.Point(20, 138) - Me.rdoRlplot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoRlplot.Location = New System.Drawing.Point(13, 92) Me.rdoRlplot.Name = "rdoRlplot" - Me.rdoRlplot.Size = New System.Drawing.Size(80, 24) + Me.rdoRlplot.Size = New System.Drawing.Size(56, 17) Me.rdoRlplot.TabIndex = 4 Me.rdoRlplot.Text = "Rl Plot" Me.rdoRlplot.UseVisualStyleBackColor = True @@ -215,10 +165,9 @@ Partial Class sdgExtremesMethod ' Me.rdoHist.AutoSize = True Me.rdoHist.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoHist.Location = New System.Drawing.Point(224, 104) - Me.rdoHist.Margin = New System.Windows.Forms.Padding(4) + Me.rdoHist.Location = New System.Drawing.Point(149, 69) Me.rdoHist.Name = "rdoHist" - Me.rdoHist.Size = New System.Drawing.Size(93, 24) + Me.rdoHist.Size = New System.Drawing.Size(64, 17) Me.rdoHist.TabIndex = 8 Me.rdoHist.Text = "Hist Plot" Me.rdoHist.UseVisualStyleBackColor = True @@ -227,10 +176,9 @@ Partial Class sdgExtremesMethod ' Me.rdoDensity.AutoSize = True Me.rdoDensity.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoDensity.Location = New System.Drawing.Point(224, 140) - Me.rdoDensity.Margin = New System.Windows.Forms.Padding(4) + Me.rdoDensity.Location = New System.Drawing.Point(149, 93) Me.rdoDensity.Name = "rdoDensity" - Me.rdoDensity.Size = New System.Drawing.Size(118, 24) + Me.rdoDensity.Size = New System.Drawing.Size(81, 17) Me.rdoDensity.TabIndex = 9 Me.rdoDensity.Text = "Density Plot" Me.rdoDensity.UseVisualStyleBackColor = True @@ -239,10 +187,9 @@ Partial Class sdgExtremesMethod ' Me.rdoZPlot.AutoSize = True Me.rdoZPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoZPlot.Location = New System.Drawing.Point(224, 69) - Me.rdoZPlot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoZPlot.Location = New System.Drawing.Point(149, 46) Me.rdoZPlot.Name = "rdoZPlot" - Me.rdoZPlot.Size = New System.Drawing.Size(101, 24) + Me.rdoZPlot.Size = New System.Drawing.Size(70, 17) Me.rdoZPlot.TabIndex = 7 Me.rdoZPlot.Text = "Zplot Plot" Me.rdoZPlot.UseVisualStyleBackColor = True @@ -251,10 +198,9 @@ Partial Class sdgExtremesMethod ' Me.rdoProbprob.AutoSize = True Me.rdoProbprob.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoProbprob.Location = New System.Drawing.Point(20, 104) - Me.rdoProbprob.Margin = New System.Windows.Forms.Padding(4) + Me.rdoProbprob.Location = New System.Drawing.Point(13, 69) Me.rdoProbprob.Name = "rdoProbprob" - Me.rdoProbprob.Size = New System.Drawing.Size(135, 24) + Me.rdoProbprob.Size = New System.Drawing.Size(92, 17) Me.rdoProbprob.TabIndex = 3 Me.rdoProbprob.Text = "Prob-prob Plot" Me.rdoProbprob.UseVisualStyleBackColor = True @@ -263,10 +209,9 @@ Partial Class sdgExtremesMethod ' Me.rdoQQPlot.AutoSize = True Me.rdoQQPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoQQPlot.Location = New System.Drawing.Point(224, 34) - Me.rdoQQPlot.Margin = New System.Windows.Forms.Padding(4) + Me.rdoQQPlot.Location = New System.Drawing.Point(149, 23) Me.rdoQQPlot.Name = "rdoQQPlot" - Me.rdoQQPlot.Size = New System.Drawing.Size(89, 24) + Me.rdoQQPlot.Size = New System.Drawing.Size(62, 17) Me.rdoQQPlot.TabIndex = 6 Me.rdoQQPlot.Text = "QQ Plot" Me.rdoQQPlot.UseVisualStyleBackColor = True @@ -275,10 +220,9 @@ Partial Class sdgExtremesMethod ' Me.rdoQQ2.AutoSize = True Me.rdoQQ2.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoQQ2.Location = New System.Drawing.Point(224, 172) - Me.rdoQQ2.Margin = New System.Windows.Forms.Padding(4) + Me.rdoQQ2.Location = New System.Drawing.Point(149, 115) Me.rdoQQ2.Name = "rdoQQ2" - Me.rdoQQ2.Size = New System.Drawing.Size(98, 24) + Me.rdoQQ2.Size = New System.Drawing.Size(68, 17) Me.rdoQQ2.TabIndex = 10 Me.rdoQQ2.Text = "QQ2 Plot" Me.rdoQQ2.UseVisualStyleBackColor = True @@ -287,43 +231,26 @@ Partial Class sdgExtremesMethod ' Me.rdoPrimary.AutoSize = True Me.rdoPrimary.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoPrimary.Location = New System.Drawing.Point(20, 69) - Me.rdoPrimary.Margin = New System.Windows.Forms.Padding(4) + Me.rdoPrimary.Location = New System.Drawing.Point(13, 46) Me.rdoPrimary.Name = "rdoPrimary" - Me.rdoPrimary.Size = New System.Drawing.Size(86, 24) + Me.rdoPrimary.Size = New System.Drawing.Size(59, 17) Me.rdoPrimary.TabIndex = 2 Me.rdoPrimary.Text = "Primary" Me.rdoPrimary.UseVisualStyleBackColor = True ' - 'ucrPnlExtreme - ' - Me.ucrPnlExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrPnlExtreme.Location = New System.Drawing.Point(12, 23) - Me.ucrPnlExtreme.Margin = New System.Windows.Forms.Padding(9) - Me.ucrPnlExtreme.Name = "ucrPnlExtreme" - Me.ucrPnlExtreme.Size = New System.Drawing.Size(358, 176) - Me.ucrPnlExtreme.TabIndex = 0 - ' 'tbRegOptions ' Me.tbRegOptions.Controls.Add(Me.tbFitMethod) Me.tbRegOptions.Controls.Add(Me.tbDisplayOptions) Me.tbRegOptions.Controls.Add(Me.tbConfidenceInterval) - Me.tbRegOptions.Location = New System.Drawing.Point(5, 6) - Me.tbRegOptions.Margin = New System.Windows.Forms.Padding(4) + Me.tbRegOptions.Location = New System.Drawing.Point(3, 4) Me.tbRegOptions.Name = "tbRegOptions" Me.tbRegOptions.SelectedIndex = 0 - Me.tbRegOptions.Size = New System.Drawing.Size(557, 466) + Me.tbRegOptions.Size = New System.Drawing.Size(371, 311) Me.tbRegOptions.TabIndex = 6 ' 'tbFitMethod ' - Me.tbFitMethod.Controls.Add(Me.lblLocation) - Me.tbFitMethod.Controls.Add(Me.lblScale) - Me.tbFitMethod.Controls.Add(Me.lblShape) - Me.tbFitMethod.Controls.Add(Me.ucrNudScale) - Me.tbFitMethod.Controls.Add(Me.ucrNudLocation) - Me.tbFitMethod.Controls.Add(Me.ucrNudShape) Me.tbFitMethod.Controls.Add(Me.ucrInputPrior) Me.tbFitMethod.Controls.Add(Me.lblPrior) Me.tbFitMethod.Controls.Add(Me.rdoMle) @@ -334,40 +261,136 @@ Partial Class sdgExtremesMethod Me.tbFitMethod.Controls.Add(Me.lblNumberOfIterations) Me.tbFitMethod.Controls.Add(Me.grpFitMethod) Me.tbFitMethod.Controls.Add(Me.grpInitial) - Me.tbFitMethod.Location = New System.Drawing.Point(4, 29) - Me.tbFitMethod.Margin = New System.Windows.Forms.Padding(4) + Me.tbFitMethod.Location = New System.Drawing.Point(4, 22) Me.tbFitMethod.Name = "tbFitMethod" - Me.tbFitMethod.Padding = New System.Windows.Forms.Padding(4) - Me.tbFitMethod.Size = New System.Drawing.Size(549, 433) + Me.tbFitMethod.Padding = New System.Windows.Forms.Padding(3) + Me.tbFitMethod.Size = New System.Drawing.Size(363, 285) Me.tbFitMethod.TabIndex = 0 Me.tbFitMethod.Tag = "Display" Me.tbFitMethod.Text = "Fit Method" Me.tbFitMethod.UseVisualStyleBackColor = True ' + 'lblPrior + ' + Me.lblPrior.AutoSize = True + Me.lblPrior.Location = New System.Drawing.Point(12, 129) + Me.lblPrior.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) + Me.lblPrior.Name = "lblPrior" + Me.lblPrior.Size = New System.Drawing.Size(87, 13) + Me.lblPrior.TabIndex = 76 + Me.lblPrior.Text = "Prior Parameters:" + ' + 'rdoMle + ' + Me.rdoMle.AutoSize = True + Me.rdoMle.Location = New System.Drawing.Point(15, 22) + Me.rdoMle.Margin = New System.Windows.Forms.Padding(2) + Me.rdoMle.Name = "rdoMle" + Me.rdoMle.Size = New System.Drawing.Size(148, 17) + Me.rdoMle.TabIndex = 72 + Me.rdoMle.TabStop = True + Me.rdoMle.Text = "Maximum Likelihood(MLE)" + Me.rdoMle.UseVisualStyleBackColor = True + ' + 'rdoBayesian + ' + Me.rdoBayesian.AutoSize = True + Me.rdoBayesian.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoBayesian.Location = New System.Drawing.Point(15, 66) + Me.rdoBayesian.Name = "rdoBayesian" + Me.rdoBayesian.Size = New System.Drawing.Size(68, 17) + Me.rdoBayesian.TabIndex = 71 + Me.rdoBayesian.Text = "Bayesian" + Me.rdoBayesian.UseVisualStyleBackColor = True + ' + 'rdoGMLE + ' + Me.rdoGMLE.AutoSize = True + Me.rdoGMLE.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoGMLE.Location = New System.Drawing.Point(15, 43) + Me.rdoGMLE.Name = "rdoGMLE" + Me.rdoGMLE.Size = New System.Drawing.Size(242, 17) + Me.rdoGMLE.TabIndex = 70 + Me.rdoGMLE.Text = "General Maximum Likelihood Estimator(GMLE)" + Me.rdoGMLE.UseVisualStyleBackColor = True + ' + 'rdoLmoments + ' + Me.rdoLmoments.AutoSize = True + Me.rdoLmoments.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoLmoments.Location = New System.Drawing.Point(15, 88) + Me.rdoLmoments.Name = "rdoLmoments" + Me.rdoLmoments.Size = New System.Drawing.Size(77, 17) + Me.rdoLmoments.TabIndex = 69 + Me.rdoLmoments.Text = "L-Moments" + Me.rdoLmoments.UseVisualStyleBackColor = True + ' + 'lblNumberOfIterations + ' + Me.lblNumberOfIterations.AutoSize = True + Me.lblNumberOfIterations.Location = New System.Drawing.Point(12, 265) + Me.lblNumberOfIterations.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) + Me.lblNumberOfIterations.Name = "lblNumberOfIterations" + Me.lblNumberOfIterations.Size = New System.Drawing.Size(105, 13) + Me.lblNumberOfIterations.TabIndex = 63 + Me.lblNumberOfIterations.Text = "Number of Iterations:" + ' + 'grpFitMethod + ' + Me.grpFitMethod.Controls.Add(Me.ucrPnlFitMethodExtremes) + Me.grpFitMethod.Location = New System.Drawing.Point(5, 5) + Me.grpFitMethod.Margin = New System.Windows.Forms.Padding(2) + Me.grpFitMethod.Name = "grpFitMethod" + Me.grpFitMethod.Padding = New System.Windows.Forms.Padding(2) + Me.grpFitMethod.Size = New System.Drawing.Size(269, 113) + Me.grpFitMethod.TabIndex = 73 + Me.grpFitMethod.TabStop = False + Me.grpFitMethod.Text = "Fit Method" + ' + 'grpInitial + ' + Me.grpInitial.Controls.Add(Me.ucrNudScale) + Me.grpInitial.Controls.Add(Me.ucrNudLocation) + Me.grpInitial.Controls.Add(Me.lblLocation) + Me.grpInitial.Controls.Add(Me.ucrNudShape) + Me.grpInitial.Controls.Add(Me.lblScale) + Me.grpInitial.Controls.Add(Me.lblShape) + Me.grpInitial.Location = New System.Drawing.Point(15, 154) + Me.grpInitial.Margin = New System.Windows.Forms.Padding(2) + Me.grpInitial.Name = "grpInitial" + Me.grpInitial.Padding = New System.Windows.Forms.Padding(2) + Me.grpInitial.Size = New System.Drawing.Size(133, 92) + Me.grpInitial.TabIndex = 86 + Me.grpInitial.TabStop = False + Me.grpInitial.Text = "Initial Values:" + ' 'lblLocation ' Me.lblLocation.AutoSize = True - Me.lblLocation.Location = New System.Drawing.Point(34, 268) + Me.lblLocation.Location = New System.Drawing.Point(8, 23) + Me.lblLocation.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) Me.lblLocation.Name = "lblLocation" - Me.lblLocation.Size = New System.Drawing.Size(74, 20) + Me.lblLocation.Size = New System.Drawing.Size(51, 13) Me.lblLocation.TabIndex = 85 Me.lblLocation.Text = "Location:" ' 'lblScale ' Me.lblScale.AutoSize = True - Me.lblScale.Location = New System.Drawing.Point(39, 306) + Me.lblScale.Location = New System.Drawing.Point(22, 47) + Me.lblScale.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) Me.lblScale.Name = "lblScale" - Me.lblScale.Size = New System.Drawing.Size(53, 20) + Me.lblScale.Size = New System.Drawing.Size(37, 13) Me.lblScale.TabIndex = 84 Me.lblScale.Text = "Scale:" ' 'lblShape ' Me.lblShape.AutoSize = True - Me.lblShape.Location = New System.Drawing.Point(32, 343) + Me.lblShape.Location = New System.Drawing.Point(18, 72) + Me.lblShape.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) Me.lblShape.Name = "lblShape" - Me.lblShape.Size = New System.Drawing.Size(60, 20) + Me.lblShape.Size = New System.Drawing.Size(41, 13) Me.lblShape.TabIndex = 83 Me.lblShape.Text = "Shape:" ' @@ -376,12 +399,12 @@ Partial Class sdgExtremesMethod Me.ucrNudScale.AutoSize = True Me.ucrNudScale.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudScale.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudScale.Location = New System.Drawing.Point(122, 302) - Me.ucrNudScale.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudScale.Location = New System.Drawing.Point(65, 40) + Me.ucrNudScale.Margin = New System.Windows.Forms.Padding(4) Me.ucrNudScale.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudScale.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudScale.Name = "ucrNudScale" - Me.ucrNudScale.Size = New System.Drawing.Size(75, 30) + Me.ucrNudScale.Size = New System.Drawing.Size(50, 20) Me.ucrNudScale.TabIndex = 82 Me.ucrNudScale.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' @@ -390,12 +413,12 @@ Partial Class sdgExtremesMethod Me.ucrNudLocation.AutoSize = True Me.ucrNudLocation.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudLocation.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudLocation.Location = New System.Drawing.Point(124, 264) - Me.ucrNudLocation.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudLocation.Location = New System.Drawing.Point(65, 15) + Me.ucrNudLocation.Margin = New System.Windows.Forms.Padding(4) Me.ucrNudLocation.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudLocation.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudLocation.Name = "ucrNudLocation" - Me.ucrNudLocation.Size = New System.Drawing.Size(75, 30) + Me.ucrNudLocation.Size = New System.Drawing.Size(50, 20) Me.ucrNudLocation.TabIndex = 81 Me.ucrNudLocation.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' @@ -404,12 +427,12 @@ Partial Class sdgExtremesMethod Me.ucrNudShape.AutoSize = True Me.ucrNudShape.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudShape.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudShape.Location = New System.Drawing.Point(124, 339) - Me.ucrNudShape.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudShape.Location = New System.Drawing.Point(65, 65) + Me.ucrNudShape.Margin = New System.Windows.Forms.Padding(4) Me.ucrNudShape.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudShape.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudShape.Name = "ucrNudShape" - Me.ucrNudShape.Size = New System.Drawing.Size(75, 30) + Me.ucrNudShape.Size = New System.Drawing.Size(50, 20) Me.ucrNudShape.TabIndex = 80 Me.ucrNudShape.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' @@ -419,138 +442,107 @@ Partial Class sdgExtremesMethod Me.ucrInputPrior.AutoSize = True Me.ucrInputPrior.IsMultiline = False Me.ucrInputPrior.IsReadOnly = False - Me.ucrInputPrior.Location = New System.Drawing.Point(153, 193) - Me.ucrInputPrior.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) + Me.ucrInputPrior.Location = New System.Drawing.Point(123, 129) + Me.ucrInputPrior.Margin = New System.Windows.Forms.Padding(6) Me.ucrInputPrior.Name = "ucrInputPrior" - Me.ucrInputPrior.Size = New System.Drawing.Size(206, 32) + Me.ucrInputPrior.Size = New System.Drawing.Size(137, 21) Me.ucrInputPrior.TabIndex = 78 ' - 'lblPrior - ' - Me.lblPrior.AutoSize = True - Me.lblPrior.Location = New System.Drawing.Point(10, 193) - Me.lblPrior.Name = "lblPrior" - Me.lblPrior.Size = New System.Drawing.Size(131, 20) - Me.lblPrior.TabIndex = 76 - Me.lblPrior.Text = "Prior Parameters:" - ' - 'rdoMle - ' - Me.rdoMle.AutoSize = True - Me.rdoMle.Location = New System.Drawing.Point(23, 33) - Me.rdoMle.Name = "rdoMle" - Me.rdoMle.Size = New System.Drawing.Size(219, 24) - Me.rdoMle.TabIndex = 72 - Me.rdoMle.TabStop = True - Me.rdoMle.Text = "Maximum Likelihood(MLE)" - Me.rdoMle.UseVisualStyleBackColor = True - ' - 'rdoBayesian - ' - Me.rdoBayesian.AutoSize = True - Me.rdoBayesian.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoBayesian.Location = New System.Drawing.Point(23, 99) - Me.rdoBayesian.Margin = New System.Windows.Forms.Padding(4) - Me.rdoBayesian.Name = "rdoBayesian" - Me.rdoBayesian.Size = New System.Drawing.Size(99, 24) - Me.rdoBayesian.TabIndex = 71 - Me.rdoBayesian.Text = "Bayesian" - Me.rdoBayesian.UseVisualStyleBackColor = True - ' - 'rdoGMLE - ' - Me.rdoGMLE.AutoSize = True - Me.rdoGMLE.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoGMLE.Location = New System.Drawing.Point(23, 65) - Me.rdoGMLE.Margin = New System.Windows.Forms.Padding(4) - Me.rdoGMLE.Name = "rdoGMLE" - Me.rdoGMLE.Size = New System.Drawing.Size(365, 24) - Me.rdoGMLE.TabIndex = 70 - Me.rdoGMLE.Text = "General Maximum Likelihood Estimator(GMLE)" - Me.rdoGMLE.UseVisualStyleBackColor = True - ' - 'rdoLmoments - ' - Me.rdoLmoments.AutoSize = True - Me.rdoLmoments.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoLmoments.Location = New System.Drawing.Point(23, 132) - Me.rdoLmoments.Margin = New System.Windows.Forms.Padding(4) - Me.rdoLmoments.Name = "rdoLmoments" - Me.rdoLmoments.Size = New System.Drawing.Size(114, 24) - Me.rdoLmoments.TabIndex = 69 - Me.rdoLmoments.Text = "L-Moments" - Me.rdoLmoments.UseVisualStyleBackColor = True - ' 'ucrNudNumberOfIterations ' Me.ucrNudNumberOfIterations.AutoSize = True Me.ucrNudNumberOfIterations.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudNumberOfIterations.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudNumberOfIterations.Location = New System.Drawing.Point(193, 384) - Me.ucrNudNumberOfIterations.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudNumberOfIterations.Location = New System.Drawing.Point(123, 261) + Me.ucrNudNumberOfIterations.Margin = New System.Windows.Forms.Padding(4) Me.ucrNudNumberOfIterations.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudNumberOfIterations.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudNumberOfIterations.Name = "ucrNudNumberOfIterations" - Me.ucrNudNumberOfIterations.Size = New System.Drawing.Size(75, 30) + Me.ucrNudNumberOfIterations.Size = New System.Drawing.Size(50, 20) Me.ucrNudNumberOfIterations.TabIndex = 64 Me.ucrNudNumberOfIterations.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'lblNumberOfIterations + 'ucrPnlFitMethodExtremes ' - Me.lblNumberOfIterations.AutoSize = True - Me.lblNumberOfIterations.Location = New System.Drawing.Point(22, 388) - Me.lblNumberOfIterations.Name = "lblNumberOfIterations" - Me.lblNumberOfIterations.Size = New System.Drawing.Size(158, 20) - Me.lblNumberOfIterations.TabIndex = 63 - Me.lblNumberOfIterations.Text = "Number of Iterations:" + Me.ucrPnlFitMethodExtremes.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlFitMethodExtremes.Location = New System.Drawing.Point(6, 15) + Me.ucrPnlFitMethodExtremes.Margin = New System.Windows.Forms.Padding(4) + Me.ucrPnlFitMethodExtremes.Name = "ucrPnlFitMethodExtremes" + Me.ucrPnlFitMethodExtremes.Size = New System.Drawing.Size(247, 92) + Me.ucrPnlFitMethodExtremes.TabIndex = 74 ' - 'grpFitMethod + 'ucrSavePlots ' - Me.grpFitMethod.Controls.Add(Me.ucrPnlExtremes) - Me.grpFitMethod.Location = New System.Drawing.Point(7, 7) - Me.grpFitMethod.Name = "grpFitMethod" - Me.grpFitMethod.Size = New System.Drawing.Size(403, 169) - Me.grpFitMethod.TabIndex = 73 - Me.grpFitMethod.TabStop = False - Me.grpFitMethod.Text = "Fit Method" + Me.ucrSavePlots.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrSavePlots.Location = New System.Drawing.Point(19, 159) + Me.ucrSavePlots.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) + Me.ucrSavePlots.Name = "ucrSavePlots" + Me.ucrSavePlots.Size = New System.Drawing.Size(261, 24) + Me.ucrSavePlots.TabIndex = 3 ' - 'ucrPnlExtremes + 'ucrPnlDisplayOptionsExtreme ' - Me.ucrPnlExtremes.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrPnlExtremes.Location = New System.Drawing.Point(9, 22) - Me.ucrPnlExtremes.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) - Me.ucrPnlExtremes.Name = "ucrPnlExtremes" - Me.ucrPnlExtremes.Size = New System.Drawing.Size(370, 138) - Me.ucrPnlExtremes.TabIndex = 74 + Me.ucrPnlDisplayOptionsExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlDisplayOptionsExtreme.Location = New System.Drawing.Point(8, 15) + Me.ucrPnlDisplayOptionsExtreme.Margin = New System.Windows.Forms.Padding(6) + Me.ucrPnlDisplayOptionsExtreme.Name = "ucrPnlDisplayOptionsExtreme" + Me.ucrPnlDisplayOptionsExtreme.Size = New System.Drawing.Size(239, 117) + Me.ucrPnlDisplayOptionsExtreme.TabIndex = 0 ' - 'grpInitial + 'ucrChkType ' - Me.grpInitial.Location = New System.Drawing.Point(22, 236) - Me.grpInitial.Name = "grpInitial" - Me.grpInitial.Size = New System.Drawing.Size(200, 138) - Me.grpInitial.TabIndex = 86 - Me.grpInitial.TabStop = False - Me.grpInitial.Text = "Initial Values:" + Me.ucrChkType.AutoSize = True + Me.ucrChkType.Checked = False + Me.ucrChkType.Location = New System.Drawing.Point(8, 9) + Me.ucrChkType.Margin = New System.Windows.Forms.Padding(4) + Me.ucrChkType.Name = "ucrChkType" + Me.ucrChkType.Size = New System.Drawing.Size(100, 23) + Me.ucrChkType.TabIndex = 0 + ' + 'ucrNudReturnLevel + ' + Me.ucrNudReturnLevel.AutoSize = True + Me.ucrNudReturnLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudReturnLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudReturnLevel.Location = New System.Drawing.Point(311, 9) + Me.ucrNudReturnLevel.Margin = New System.Windows.Forms.Padding(4) + Me.ucrNudReturnLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudReturnLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudReturnLevel.Name = "ucrNudReturnLevel" + Me.ucrNudReturnLevel.Size = New System.Drawing.Size(50, 20) + Me.ucrNudReturnLevel.TabIndex = 2 + Me.ucrNudReturnLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrInputType + ' + Me.ucrInputType.AddQuotesIfUnrecognised = True + Me.ucrInputType.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputType.GetSetSelectedIndex = -1 + Me.ucrInputType.IsReadOnly = False + Me.ucrInputType.Location = New System.Drawing.Point(109, 12) + Me.ucrInputType.Margin = New System.Windows.Forms.Padding(6) + Me.ucrInputType.Name = "ucrInputType" + Me.ucrInputType.Size = New System.Drawing.Size(117, 21) + Me.ucrInputType.TabIndex = 1 ' 'ucrBase ' Me.ucrBase.AutoSize = True - Me.ucrBase.Location = New System.Drawing.Point(9, 518) - Me.ucrBase.Margin = New System.Windows.Forms.Padding(6) + Me.ucrBase.Location = New System.Drawing.Point(6, 345) + Me.ucrBase.Margin = New System.Windows.Forms.Padding(4) Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(336, 45) + Me.ucrBase.Size = New System.Drawing.Size(224, 30) Me.ucrBase.TabIndex = 5 ' 'sdgExtremesMethod ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(144.0!, 144.0!) + Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(575, 600) + Me.ClientSize = New System.Drawing.Size(383, 400) Me.Controls.Add(Me.tbRegOptions) Me.Controls.Add(Me.ucrBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow - Me.Margin = New System.Windows.Forms.Padding(4) Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "sdgExtremesMethod" @@ -565,6 +557,8 @@ Partial Class sdgExtremesMethod Me.tbFitMethod.ResumeLayout(False) Me.tbFitMethod.PerformLayout() Me.grpFitMethod.ResumeLayout(False) + Me.grpInitial.ResumeLayout(False) + Me.grpInitial.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -589,7 +583,7 @@ Partial Class sdgExtremesMethod Friend WithEvents rdoQQPlot As RadioButton Friend WithEvents rdoQQ2 As RadioButton Friend WithEvents rdoPrimary As RadioButton - Friend WithEvents ucrPnlExtreme As UcrPanel + Friend WithEvents ucrPnlDisplayOptionsExtreme As UcrPanel Friend WithEvents tbRegOptions As TabControl Friend WithEvents tbFitMethod As TabPage Friend WithEvents rdoMle As RadioButton @@ -599,7 +593,7 @@ Partial Class sdgExtremesMethod Friend WithEvents ucrNudNumberOfIterations As ucrNud Friend WithEvents lblNumberOfIterations As Label Friend WithEvents grpFitMethod As GroupBox - Friend WithEvents ucrPnlExtremes As UcrPanel + Friend WithEvents ucrPnlFitMethodExtremes As UcrPanel Friend WithEvents lblPrior As Label Friend WithEvents ucrInputPrior As ucrInputTextBox Friend WithEvents lblLocation As Label diff --git a/instat/sdgExtremesMethod.vb b/instat/sdgExtremesMethod.vb index 0b4dba4f59a..8b330b602f1 100644 --- a/instat/sdgExtremesMethod.vb +++ b/instat/sdgExtremesMethod.vb @@ -17,20 +17,24 @@ Public Class sdgExtremesMethod Private clsFevdFunction As New RFunction Public clsConfidenceIntervalFunction As New RFunction Public clsPlotFunction As New RFunction - Public clsListFunction As New RFunction - Public clsListInitialFunction As New RFunction + Public clsPriorParamListFunction As New RFunction + Public clsInitialListFunction As New RFunction Public clsConcatenateFunction As New RFunction Public clsRsyntax As New RSyntax Public bControlsInitialised As Boolean = False Public Sub InitialiseControls() Dim dctType As New Dictionary(Of String, String) - ucrPnlExtremes.SetParameter(New RParameter("method", 2)) - ucrPnlExtremes.AddRadioButton(rdoMle, Chr(34) & "MLE" & Chr(34)) - ucrPnlExtremes.AddRadioButton(rdoBayesian, Chr(34) & "Bayesian" & Chr(34)) - ucrPnlExtremes.AddRadioButton(rdoGMLE, Chr(34) & "GMLE" & Chr(34)) - ucrPnlExtremes.AddRadioButton(rdoLmoments, Chr(34) & "Lmoments" & Chr(34)) + ucrPnlFitMethodExtremes.SetParameter(New RParameter("method", 2)) + ucrPnlFitMethodExtremes.AddRadioButton(rdoMle, Chr(34) & "MLE" & Chr(34)) + ucrPnlFitMethodExtremes.AddRadioButton(rdoBayesian, Chr(34) & "Bayesian" & Chr(34)) + ucrPnlFitMethodExtremes.AddRadioButton(rdoGMLE, Chr(34) & "GMLE" & Chr(34)) + ucrPnlFitMethodExtremes.AddRadioButton(rdoLmoments, Chr(34) & "Lmoments" & Chr(34)) + ucrPnlFitMethodExtremes.AddToLinkedControls(ucrInputPrior, {rdoBayesian}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlFitMethodExtremes.AddToLinkedControls({ucrNudNumberOfIterations, ucrNudScale, + ucrNudShape, ucrNudLocation}, {rdoBayesian}, + bNewLinkedHideIfParameterMissing:=True) ucrChkType.SetText("Type") ucrChkType.AddParameterPresentCondition(True, "type") @@ -40,7 +44,6 @@ Public Class sdgExtremesMethod dctType.Add("parameter", Chr(34) & "parameter" & Chr(34)) dctType.Add("return.level", Chr(34) & "return.level" & Chr(34)) ucrInputType.SetItems(dctType) - 'ucrInputType.SetRDefault(Chr(34) & "parameter" & Chr(34)) ucrInputType.SetDropDownStyleAsNonEditable() ucrNudReturnLevel.SetParameter(New RParameter("return.period", 2)) @@ -60,54 +63,46 @@ Public Class sdgExtremesMethod ucrNudLocation.SetMinMax(-5, 10) ucrNudLocation.DecimalPlaces = 1 ucrNudLocation.Increment = 0.1 + ucrNudLocation.SetLinkedDisplayControl(grpInitial) ucrNudScale.SetParameter(New RParameter("scale", 2)) ucrNudScale.SetMinMax(-5, 10) ucrNudScale.DecimalPlaces = 1 ucrNudScale.Increment = 0.1 - 'ucrNudScale.SetRDefault(0.1) ucrNudShape.SetParameter(New RParameter("shape", 3)) ucrNudShape.SetMinMax(-5, 10) ucrNudShape.DecimalPlaces = 1 ucrNudShape.Increment = 1 - 'ucrNudShape.SetRDefault(-0.5) - - ucrNudLocation.SetLinkedDisplayControl(lblLocation) - ucrNudScale.SetLinkedDisplayControl(lblScale) - ucrNudShape.SetLinkedDisplayControl(lblShape) ucrNudNumberOfIterations.SetParameter(New RParameter("iter", 7)) ucrNudNumberOfIterations.SetMinMax(0, 30000) ucrNudNumberOfIterations.SetLinkedDisplayControl(lblNumberOfIterations) - 'ucrPnlExtremes.AddToLinkedControls({ucrNudLocationInitial, ucrNudLocationPrior, ucrNudScaleInitial, ucrNudScalePrior, ucrNudshapeInitial, ucrNudShapePrior, ucrNudNumberOfIterations}, {rdoBayesian}) - - - ucrPnlExtreme.SetParameter(New RParameter("type", 1)) - - ucrPnlExtreme.AddRadioButton(rdoPrimary, Chr(34) & "primary" & Chr(34)) - ucrPnlExtreme.AddRadioButton(rdoDensity, Chr(34) & "density" & Chr(34)) - ucrPnlExtreme.AddRadioButton(rdoHist, Chr(34) & "hist" & Chr(34)) - ucrPnlExtreme.AddRadioButton(rdoProbprob, Chr(34) & "probprob" & Chr(34)) - ucrPnlExtreme.AddRadioButton(rdoQQ2, Chr(34) & "qq2" & Chr(34)) - ucrPnlExtreme.AddRadioButton(rdoQQPlot, Chr(34) & "qq" & Chr(34)) - ucrPnlExtreme.AddRadioButton(rdoRlplot, Chr(34) & "rl" & Chr(34)) - ucrPnlExtreme.AddRadioButton(rdoZPlot, Chr(34) & "Zplot" & Chr(34)) - ucrPnlExtreme.AddRadioButton(rdoTrace, Chr(34) & "trace" & Chr(34)) - ucrPnlExtreme.AddRadioButton(rdoNoPlot) - - ucrPnlExtreme.AddParameterPresentCondition(rdoNoPlot, "type", False) - ucrPnlExtreme.AddParameterValuesCondition(rdoPrimary, "type", Chr(34) & "primary" & Chr(34)) - ucrPnlExtreme.AddParameterValuesCondition(rdoDensity, "type", Chr(34) & "density" & Chr(34)) - ucrPnlExtreme.AddParameterValuesCondition(rdoHist, "type", Chr(34) & "hist" & Chr(34)) - ucrPnlExtreme.AddParameterValuesCondition(rdoProbprob, "type", Chr(34) & "probprob" & Chr(34)) - ucrPnlExtreme.AddParameterValuesCondition(rdoQQ2, "type", Chr(34) & "qq2" & Chr(34)) - ucrPnlExtreme.AddParameterValuesCondition(rdoQQPlot, "type", Chr(34) & "qq" & Chr(34)) - ucrPnlExtreme.AddParameterValuesCondition(rdoRlplot, "type", Chr(34) & "rl" & Chr(34)) - ucrPnlExtreme.AddParameterValuesCondition(rdoZPlot, "type", Chr(34) & "Zplot" & Chr(34)) - ucrPnlExtreme.AddParameterValuesCondition(rdoTrace, "type", Chr(34) & "trace" & Chr(34)) + ucrPnlDisplayOptionsExtreme.SetParameter(New RParameter("type", 1)) + + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoPrimary, Chr(34) & "primary" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoDensity, Chr(34) & "density" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoHist, Chr(34) & "hist" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoProbprob, Chr(34) & "probprob" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoQQ2, Chr(34) & "qq2" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoQQPlot, Chr(34) & "qq" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoRlplot, Chr(34) & "rl" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoZPlot, Chr(34) & "Zplot" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoTrace, Chr(34) & "trace" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoNoPlot) + + ucrPnlDisplayOptionsExtreme.AddParameterPresentCondition(rdoNoPlot, "type", False) + ucrPnlDisplayOptionsExtreme.AddParameterValuesCondition(rdoPrimary, "type", Chr(34) & "primary" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddParameterValuesCondition(rdoDensity, "type", Chr(34) & "density" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddParameterValuesCondition(rdoHist, "type", Chr(34) & "hist" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddParameterValuesCondition(rdoProbprob, "type", Chr(34) & "probprob" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddParameterValuesCondition(rdoQQ2, "type", Chr(34) & "qq2" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddParameterValuesCondition(rdoQQPlot, "type", Chr(34) & "qq" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddParameterValuesCondition(rdoRlplot, "type", Chr(34) & "rl" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddParameterValuesCondition(rdoZPlot, "type", Chr(34) & "Zplot" & Chr(34)) + ucrPnlDisplayOptionsExtreme.AddParameterValuesCondition(rdoTrace, "type", Chr(34) & "trace" & Chr(34)) ucrSavePlots.SetPrefix("plot") ucrSavePlots.SetSaveTypeAsGraph() @@ -118,8 +113,9 @@ Public Class sdgExtremesMethod bControlsInitialised = True End Sub - Public Sub SetRCode(clsNewFevdFunction As RFunction, clsNewListFunction As RFunction, clsNewPlotFunction As RFunction, - clsNewRSyntax As RSyntax, clsNewListInitialFunction As RFunction, clsNewConfidenceIntervalFunction As RFunction, + Public Sub SetRCode(clsNewFevdFunction As RFunction, clsNewPriorParamListFunction As RFunction, + clsNewPlotFunction As RFunction, clsNewRSyntax As RSyntax, + clsNewInitialListFunction As RFunction, clsNewConfidenceIntervalFunction As RFunction, Optional clsNewConcatenateFunction As RFunction = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() @@ -127,8 +123,8 @@ Public Class sdgExtremesMethod clsFevdFunction = clsNewFevdFunction clsRsyntax = clsNewRSyntax clsPlotFunction = clsNewPlotFunction - clsListFunction = clsNewListFunction - clsListInitialFunction = clsNewListInitialFunction + clsPriorParamListFunction = clsNewPriorParamListFunction + clsInitialListFunction = clsNewInitialListFunction clsConcatenateFunction = clsNewConcatenateFunction clsConfidenceIntervalFunction = clsNewConfidenceIntervalFunction ucrChkType.SetRCode(clsConfidenceIntervalFunction, bReset) @@ -136,15 +132,15 @@ Public Class sdgExtremesMethod ucrInputPrior.SetRCode(clsConcatenateFunction, bReset) ucrNudNumberOfIterations.SetRCode(clsFevdFunction, bReset) - ucrNudLocation.SetRCode(clsListInitialFunction, bReset) - ucrNudScale.SetRCode(clsListInitialFunction, bReset) - ucrNudShape.SetRCode(clsListInitialFunction, bReset) + ucrNudLocation.SetRCode(clsInitialListFunction, bReset) + ucrNudScale.SetRCode(clsInitialListFunction, bReset) + ucrNudShape.SetRCode(clsInitialListFunction, bReset) - ucrPnlExtremes.SetRCode(clsFevdFunction, bReset) - ucrPnlExtreme.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) + ucrPnlFitMethodExtremes.SetRCode(clsFevdFunction, bReset) + ucrPnlDisplayOptionsExtreme.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) ucrSavePlots.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) End Sub - Private Sub ucrPnlExtreme_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlExtreme.ControlValueChanged + Private Sub ucrPnlExtreme_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlDisplayOptionsExtreme.ControlValueChanged If rdoNoPlot.Checked Then clsPlotFunction.RemoveParameterByName("type") clsRsyntax.RemoveFromAfterCodes(clsPlotFunction) @@ -152,29 +148,6 @@ Public Class sdgExtremesMethod clsRsyntax.AddToAfterCodes(clsPlotFunction, iPosition:=0) End If End Sub - Private Sub InitialPriorParametres() - - If rdoBayesian.Checked Then - ucrNudScale.Visible = True - ucrNudLocation.Visible = True - ucrNudShape.Visible = True - ucrInputPrior.Visible = True - ucrNudNumberOfIterations.Visible = True - grpInitial.Visible = True - Else - ucrNudScale.Visible = False - ucrNudLocation.Visible = False - ucrNudShape.Visible = False - ucrInputPrior.Visible = False - ucrNudNumberOfIterations.Visible = False - grpInitial.Visible = False - - End If - End Sub - - Private Sub ucrPnlExtremes_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlExtremes.ControlValueChanged - InitialPriorParametres() - End Sub Private Sub ucrChkType_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkType.ControlValueChanged, ucrInputType.ControlValueChanged, ucrNudReturnLevel.ControlValueChanged If ucrChkType.Checked Then From c6f8665a02b164d7eb01d712ca1a0d86042a9439 Mon Sep 17 00:00:00 2001 From: Fidel Lumbasi Date: Tue, 2 Aug 2022 18:19:57 +0300 Subject: [PATCH 007/122] minor change --- instat/dlgClimaticSummary.vb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instat/dlgClimaticSummary.vb b/instat/dlgClimaticSummary.vb index 53a67e26187..c1473ac7261 100644 --- a/instat/dlgClimaticSummary.vb +++ b/instat/dlgClimaticSummary.vb @@ -87,7 +87,8 @@ Public Class dlgClimaticSummary ucrReceiverWithinYear.SetParameter(New RParameter("within_variable", 2, False)) ucrReceiverWithinYear.SetParameterIsString() - 'ucrReceiverWithinYear.strSelectorHeading = "Factors" + ucrReceiverWithinYear.SetClimaticType("month") + ucrReceiverWithinYear.bAutoFill = True ucrReceiverWithinYear.Selector = ucrSelectorVariable ucrReceiverWithinYear.SetIncludedDataTypes({"numeric", "factor"}) From ae88291809bd92fa05f260cfc49a3c3913ef4c55 Mon Sep 17 00:00:00 2001 From: IVAN LUVISIA Date: Wed, 3 Aug 2022 10:31:22 +0300 Subject: [PATCH 008/122] minor fix --- instat/dlgExtremes.vb | 4 +--- instat/sdgExtremesMethod.vb | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index 1a01a4049a9..920e53febf5 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -137,9 +137,7 @@ clsInitialListFunction As New RFunction clsFevdFunction.SetPackageName("extRemes") clsFevdFunction.SetRCommand("fevd") - clsFevdFunction.AddParameter("priorParams", clsRFunctionParameter:=clsPriorParamListFunction, iPosition:=4) - clsFevdFunction.AddParameter("initial", clsRFunctionParameter:=clsInitialListFunction, iPosition:=5) - clsFevdFunction.AddParameter("iter", "9999", iPosition:=6) + clsFevdFunction.AddParameter("type", Chr(34) & "GEV" & Chr(34), iPosition:=0) clsFevdFunction.AddParameter("method", Chr(34) & "MLE" & Chr(34), iPosition:=1) diff --git a/instat/sdgExtremesMethod.vb b/instat/sdgExtremesMethod.vb index 8b330b602f1..41b5e6eea9a 100644 --- a/instat/sdgExtremesMethod.vb +++ b/instat/sdgExtremesMethod.vb @@ -32,9 +32,13 @@ Public Class sdgExtremesMethod ucrPnlFitMethodExtremes.AddRadioButton(rdoLmoments, Chr(34) & "Lmoments" & Chr(34)) ucrPnlFitMethodExtremes.AddToLinkedControls(ucrInputPrior, {rdoBayesian}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlFitMethodExtremes.AddToLinkedControls({ucrNudNumberOfIterations, ucrNudScale, + ucrPnlFitMethodExtremes.AddToLinkedControls({ucrNudScale, ucrNudShape, ucrNudLocation}, {rdoBayesian}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlFitMethodExtremes.AddToLinkedControls(ucrNudNumberOfIterations, {rdoBayesian}, bNewLinkedHideIfParameterMissing:=True, + bNewLinkedAddRemoveParameter:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=999, + bNewLinkedUpdateFunction:=True) + ucrChkType.SetText("Type") ucrChkType.AddParameterPresentCondition(True, "type") @@ -130,12 +134,9 @@ Public Class sdgExtremesMethod ucrChkType.SetRCode(clsConfidenceIntervalFunction, bReset) ucrNudReturnLevel.SetRCode(clsConfidenceIntervalFunction, bReset) ucrInputPrior.SetRCode(clsConcatenateFunction, bReset) - ucrNudNumberOfIterations.SetRCode(clsFevdFunction, bReset) - ucrNudLocation.SetRCode(clsInitialListFunction, bReset) ucrNudScale.SetRCode(clsInitialListFunction, bReset) ucrNudShape.SetRCode(clsInitialListFunction, bReset) - ucrPnlFitMethodExtremes.SetRCode(clsFevdFunction, bReset) ucrPnlDisplayOptionsExtreme.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) ucrSavePlots.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) @@ -158,4 +159,14 @@ Public Class sdgExtremesMethod clsRsyntax.SetBaseRFunction(clsFevdFunction) End If End Sub + + Private Sub ucrPnlFitMethodExtremes_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlFitMethodExtremes.ControlValueChanged + If rdoBayesian.Checked Then + clsFevdFunction.AddParameter("priorParams", clsRFunctionParameter:=clsPriorParamListFunction, iPosition:=4) + clsFevdFunction.AddParameter("initial", clsRFunctionParameter:=clsInitialListFunction, iPosition:=5) + Else + clsFevdFunction.RemoveParameterByName("priorParams") + clsFevdFunction.RemoveParameterByName("initial") + End If + End Sub End Class \ No newline at end of file From 604451994c8a7c7d6b82e561d642fb5a754a3b68 Mon Sep 17 00:00:00 2001 From: IVAN LUVISIA Date: Wed, 3 Aug 2022 10:48:07 +0300 Subject: [PATCH 009/122] Minor text change --- instat/dlgRPackages.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/dlgRPackages.vb b/instat/dlgRPackages.vb index 7fa4c5302b6..22015dd58c2 100644 --- a/instat/dlgRPackages.vb +++ b/instat/dlgRPackages.vb @@ -100,7 +100,7 @@ Public Class dlgInstallRPackage ucrInputMessage.SetText("Cannot get package information.") End If Else - ucrInputMessage.SetText("Cannot get package information. Check your internet connection.") + ucrInputMessage.SetText("Not a current CRAN package. Perhaps it has been archived") End If End Sub From 49d8e9fbcadf851872e20cdae6fe4f217149d9ca Mon Sep 17 00:00:00 2001 From: Fidel Lumbasi Date: Wed, 3 Aug 2022 11:14:43 +0300 Subject: [PATCH 010/122] Revert "minor change" This reverts commit c6f8665a02b164d7eb01d712ca1a0d86042a9439. --- instat/dlgClimaticSummary.vb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/instat/dlgClimaticSummary.vb b/instat/dlgClimaticSummary.vb index c1473ac7261..53a67e26187 100644 --- a/instat/dlgClimaticSummary.vb +++ b/instat/dlgClimaticSummary.vb @@ -87,8 +87,7 @@ Public Class dlgClimaticSummary ucrReceiverWithinYear.SetParameter(New RParameter("within_variable", 2, False)) ucrReceiverWithinYear.SetParameterIsString() - ucrReceiverWithinYear.SetClimaticType("month") - ucrReceiverWithinYear.bAutoFill = True + 'ucrReceiverWithinYear.strSelectorHeading = "Factors" ucrReceiverWithinYear.Selector = ucrSelectorVariable ucrReceiverWithinYear.SetIncludedDataTypes({"numeric", "factor"}) From c6187ed092165af82af2d87ff9c7464accb9fed7 Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Wed, 3 Aug 2022 11:25:11 +0300 Subject: [PATCH 011/122] Improving the Extremes Dialogue. --- instat/dlgExtremes.vb | 15 +++------------ instat/sdgExtremesMethod.vb | 5 ++--- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index 920e53febf5..d2e4662181f 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -133,12 +133,10 @@ clsInitialListFunction As New RFunction clsConfidenceIntervalFunction.SetPackageName("extRemes") clsConfidenceIntervalFunction.SetRCommand("ci.fevd") - 'clsConfidenceIntervalFunction.AddParameter("type", Chr(34) & "parameter" & Chr(34), iPosition:=0) clsFevdFunction.SetPackageName("extRemes") clsFevdFunction.SetRCommand("fevd") - clsFevdFunction.AddParameter("type", Chr(34) & "GEV" & Chr(34), iPosition:=0) clsFevdFunction.AddParameter("method", Chr(34) & "MLE" & Chr(34), iPosition:=1) clsFevdFunction.AddParameter("na.action", "na.omit", iPosition:=3) @@ -174,11 +172,6 @@ clsInitialListFunction As New RFunction bResettingDialogue = False End Sub - 'Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click - ' sdgExtremesDisplayOptions.SetRCode(clsNewPlotFunction:=clsPlotsFunction, clsNewRSyntax:=ucrBase.clsRsyntax) - ' sdgExtremesDisplayOptions.ShowDialog() - 'End Sub - Private Sub TestOkEnabled() ucrBase.OKEnabled(Not ucrReceiverVariable.IsEmpty) End Sub @@ -299,9 +292,9 @@ clsInitialListFunction As New RFunction clsLocationScaleResetOperator.AddParameter("scaleLocation", clsROperatorParameter:=clsLocationParamOperator, iPosition:=0) End If grpFirstCalc.Visible = True - grpSecondCalc.Visible = True - Else - ucrReceiverVariable.SetMeAsReceiver() + grpSecondCalc.Visible = True + Else + ucrReceiverVariable.SetMeAsReceiver() clsFevdFunction.RemoveParameterByName("scale.fun") clsFevdFunction.RemoveParameterByName("location.fun") clsLocationScaleResetOperator.RemoveParameterByName("scaleLocation") @@ -309,7 +302,5 @@ clsInitialListFunction As New RFunction grpFirstCalc.Visible = False grpSecondCalc.Visible = False End If - - End Sub End Class diff --git a/instat/sdgExtremesMethod.vb b/instat/sdgExtremesMethod.vb index 41b5e6eea9a..dfa5faa7981 100644 --- a/instat/sdgExtremesMethod.vb +++ b/instat/sdgExtremesMethod.vb @@ -52,7 +52,7 @@ Public Class sdgExtremesMethod ucrNudReturnLevel.SetParameter(New RParameter("return.period", 2)) ucrNudReturnLevel.SetMinMax(20, 100) - ucrNudReturnLevel.SetRDefault(20) + ucrNudReturnLevel.SetRDefault(100) ucrNudReturnLevel.SetLinkedDisplayControl(lblReturnLevel) ucrInputType.AddToLinkedControls(ucrNudReturnLevel, {"return.level"}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkType.AddToLinkedControls(ucrInputType, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, @@ -83,9 +83,7 @@ Public Class sdgExtremesMethod ucrNudNumberOfIterations.SetMinMax(0, 30000) ucrNudNumberOfIterations.SetLinkedDisplayControl(lblNumberOfIterations) - ucrPnlDisplayOptionsExtreme.SetParameter(New RParameter("type", 1)) - ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoPrimary, Chr(34) & "primary" & Chr(34)) ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoDensity, Chr(34) & "density" & Chr(34)) ucrPnlDisplayOptionsExtreme.AddRadioButton(rdoHist, Chr(34) & "hist" & Chr(34)) @@ -141,6 +139,7 @@ Public Class sdgExtremesMethod ucrPnlDisplayOptionsExtreme.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) ucrSavePlots.SetRCode(clsPlotFunction, bReset, bCloneIfNeeded:=True) End Sub + Private Sub ucrPnlExtreme_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlDisplayOptionsExtreme.ControlValueChanged If rdoNoPlot.Checked Then clsPlotFunction.RemoveParameterByName("type") From b33bedc90d5612fa278b23849953702363ab0f51 Mon Sep 17 00:00:00 2001 From: Fidel Lumbasi Date: Wed, 3 Aug 2022 11:42:08 +0300 Subject: [PATCH 012/122] Fixes minor bug in the dialogue --- instat/dlgClimaticSummary.vb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/instat/dlgClimaticSummary.vb b/instat/dlgClimaticSummary.vb index 53a67e26187..08d6306939f 100644 --- a/instat/dlgClimaticSummary.vb +++ b/instat/dlgClimaticSummary.vb @@ -87,6 +87,8 @@ Public Class dlgClimaticSummary ucrReceiverWithinYear.SetParameter(New RParameter("within_variable", 2, False)) ucrReceiverWithinYear.SetParameterIsString() + ucrReceiverWithinYear.SetClimaticType("month") + ucrReceiverWithinYear.bAutoFill = True 'ucrReceiverWithinYear.strSelectorHeading = "Factors" ucrReceiverWithinYear.Selector = ucrSelectorVariable ucrReceiverWithinYear.SetIncludedDataTypes({"numeric", "factor"}) From e6884b49aa0fdafda92365e0bf20957113bb6bcd Mon Sep 17 00:00:00 2001 From: IVAN LUVISIA Date: Thu, 4 Aug 2022 14:15:18 +0300 Subject: [PATCH 013/122] Minor change --- instat/dlgRPackages.vb | 23 +++++----- .../InstatObject/R/stand_alone_functions.R | 45 ++++++++++--------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/instat/dlgRPackages.vb b/instat/dlgRPackages.vb index 22015dd58c2..61f07299cd4 100644 --- a/instat/dlgRPackages.vb +++ b/instat/dlgRPackages.vb @@ -78,13 +78,7 @@ Public Class dlgInstallRPackage If expOutput IsNot Nothing AndAlso Not expOutput.Type = Internals.SymbolicExpressionType.Null Then chrOutput = expOutput.AsCharacter If chrOutput.Count >= 1 Then - If chrOutput(0) = "0" Then - ucrInputMessage.SetText("No package with this name.") - ucrInputMessage.txtInput.BackColor = Color.LightCoral - ElseIf chrOutput(0) = "2" Then - ucrInputMessage.SetText("Package exists and not currently installed.") - ucrInputMessage.txtInput.BackColor = Color.LightGreen - ElseIf chrOutput(0) = "1" Then + If chrOutput(0) = "1" Then If chrOutput.Count = 4 Then If chrOutput(1) = "0" Then ucrInputMessage.SetText("Package is installed and up to date.") @@ -95,12 +89,21 @@ Public Class dlgInstallRPackage Else ucrInputMessage.SetText("Package is installed. No version information available.") End If + ElseIf chrOutput(0) = "2" Then + ucrInputMessage.SetText("Package exists and not currently installed.") + ucrInputMessage.txtInput.BackColor = Color.LightGreen + ElseIf chrOutput(0) = "3" Then + ucrInputMessage.SetText("Package is installed but not a current CRAN package") + ucrInputMessage.txtInput.BackColor = Color.LightBlue + ElseIf chrOutput(0) = "4" Then + ucrInputMessage.SetText("Not a current CRAN package. Perhaps it has been archived") + ucrInputMessage.txtInput.BackColor = Color.LightSkyBlue + ElseIf chrOutput(0) = "5" Then + ucrInputMessage.SetText("No internet connection.Try reconnecting") + ucrInputMessage.txtInput.BackColor = Color.LightCoral End If - Else - ucrInputMessage.SetText("Cannot get package information.") End If Else - ucrInputMessage.SetText("Not a current CRAN package. Perhaps it has been archived") End If End Sub diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index a21ee0e8e54..0727e3b6c2b 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -1251,30 +1251,33 @@ create_av_packs <- function() { package_check <- function(package) { out <- c() - if(!exists("av_packs")) { - create_av_packs() - } - if(package %in% rownames(installed.packages())) { - out[[1]] <- "1" - v_machine <- as.character(packageVersion(package)) - v_web <- as.character(av_packs[av_packs$Package == package, "Version"]) - out[[2]] <- compareVersion(v_machine, v_web) - out[[3]] <- v_machine - out[[4]] <- v_web - return(out) - } - else { - #check if the package name is typed right - if(package %in% av_packs$Package) { - out[[1]] <- "2" - return(out) + if (!pingr::is_online()) out[[1]] <- "5" + else{ + if(!exists("av_packs")) { + create_av_packs() + } + #CHECK the Package is a CRAN package + if (package %in% av_packs$Package){ + #PACKAGE IS INSTALLED + if (package %in% rownames(installed.packages())){ + out[[1]] <- "1" + v_machine <- as.character(packageVersion(package)) + v_web <- as.character(av_packs[av_packs$Package == package, "Version"]) + out[[2]] <- compareVersion(v_machine, v_web) + out[[3]] <- v_machine + out[[4]] <- v_web + } + else out[[1]] <- "2" } - else { - #wrong spelling check you spelling - out[[1]] <- "0" - return(out) + else{ + #PACKAGE IS INSTALLED BUT NOT IN THE CRAN REPO + if (package %in% rownames(installed.packages())) out[[1]] <- "3" + #PACKAGE IS NOT INSTALLED AND NOT IN THE CRAN REPO + else out[[1]] <- "4" } + } + return(out) } in_top_n <- function(x, n = 10, wt, fun = sum) { From d14d60851e2da00dc973c4da02a373eb5483b2a3 Mon Sep 17 00:00:00 2001 From: IVAN LUVISIA Date: Fri, 5 Aug 2022 12:07:23 +0300 Subject: [PATCH 014/122] Minor chnages --- instat/dlgRPackages.vb | 63 +++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/instat/dlgRPackages.vb b/instat/dlgRPackages.vb index 61f07299cd4..79363d1682c 100644 --- a/instat/dlgRPackages.vb +++ b/instat/dlgRPackages.vb @@ -75,36 +75,43 @@ Public Class dlgInstallRPackage clsPackageCheck.AddParameter("package", Chr(34) & ucrInputTextBoxRPackage.GetText() & Chr(34)) expOutput = frmMain.clsRLink.RunInternalScriptGetValue(clsPackageCheck.ToScript(), bSilent:=True) - If expOutput IsNot Nothing AndAlso Not expOutput.Type = Internals.SymbolicExpressionType.Null Then - chrOutput = expOutput.AsCharacter - If chrOutput.Count >= 1 Then - If chrOutput(0) = "1" Then - If chrOutput.Count = 4 Then - If chrOutput(1) = "0" Then - ucrInputMessage.SetText("Package is installed and up to date.") - ucrInputMessage.txtInput.BackColor = Color.Yellow - ElseIf chrOutput(1) = "-1" Then - ucrInputMessage.SetText("Package is installed. Newer version available: " & chrOutput(3) & " (current: " & chrOutput(2) & ").") - End If - Else - ucrInputMessage.SetText("Package is installed. No version information available.") + + If expOutput Is Nothing OrElse expOutput.Type = Internals.SymbolicExpressionType.Null Then + ucrInputMessage.SetText("Cannot get package information.") + Exit Sub + End If + + chrOutput = expOutput.AsCharacter + If chrOutput.Count < 1 Then + ucrInputMessage.SetText("Cannot get package information.") + Exit Sub + End If + + Select Case chrOutput(0) + Case "1" + If chrOutput.Count = 4 Then + If chrOutput(1) = "0" Then + ucrInputMessage.SetText("Package is installed and up to date.") + ucrInputMessage.txtInput.BackColor = Color.Yellow + ElseIf chrOutput(1) = "-1" Then + ucrInputMessage.SetText("Package is installed. Newer version available: " & chrOutput(3) & " (current: " & chrOutput(2) & ").") End If - ElseIf chrOutput(0) = "2" Then - ucrInputMessage.SetText("Package exists and not currently installed.") - ucrInputMessage.txtInput.BackColor = Color.LightGreen - ElseIf chrOutput(0) = "3" Then - ucrInputMessage.SetText("Package is installed but not a current CRAN package") - ucrInputMessage.txtInput.BackColor = Color.LightBlue - ElseIf chrOutput(0) = "4" Then - ucrInputMessage.SetText("Not a current CRAN package. Perhaps it has been archived") - ucrInputMessage.txtInput.BackColor = Color.LightSkyBlue - ElseIf chrOutput(0) = "5" Then - ucrInputMessage.SetText("No internet connection.Try reconnecting") - ucrInputMessage.txtInput.BackColor = Color.LightCoral + Else + ucrInputMessage.SetText("Package is installed. No version information available.") End If - End If - Else - End If + Case "2" + ucrInputMessage.SetText("Package exists and not currently installed.") + ucrInputMessage.txtInput.BackColor = Color.LightGreen + Case "3" + ucrInputMessage.SetText("Package is installed but not a current CRAN package") + ucrInputMessage.txtInput.BackColor = Color.LightBlue + Case "4" + ucrInputMessage.SetText("Not a current CRAN package. Perhaps it has been archived") + ucrInputMessage.txtInput.BackColor = Color.LightSkyBlue + Case "5" + ucrInputMessage.SetText("No internet connection.Try reconnecting") + ucrInputMessage.txtInput.BackColor = Color.LightCoral + End Select End Sub Private Sub CheckEnable() From c528e2a2daea49da6c4edac63123d6fb9f540c19 Mon Sep 17 00:00:00 2001 From: Fidel Lumbasi Date: Thu, 11 Aug 2022 17:54:01 +0300 Subject: [PATCH 015/122] Fixes translation layout --- instat/dlgLinePlot.designer.vb | 252 ++++++++++++++++----------------- instat/dlgLinePlot.vb | 8 ++ 2 files changed, 134 insertions(+), 126 deletions(-) diff --git a/instat/dlgLinePlot.designer.vb b/instat/dlgLinePlot.designer.vb index 0f09b01dc13..d847876d2d6 100644 --- a/instat/dlgLinePlot.designer.vb +++ b/instat/dlgLinePlot.designer.vb @@ -51,13 +51,6 @@ Partial Class dlgLinePlot Me.lblMethod = New System.Windows.Forms.Label() Me.lblFamily = New System.Windows.Forms.Label() Me.grpSmoothOptions = New System.Windows.Forms.GroupBox() - Me.ucrInputFormula = New instat.ucrInputComboBox() - Me.ucrChkSpan = New instat.ucrCheck() - Me.ucrChkFormula = New instat.ucrCheck() - Me.ucrChkAddSE = New instat.ucrCheck() - Me.ucrNudSpan = New instat.ucrNud() - Me.ucrFamilyInput = New instat.ucrInputComboBox() - Me.ucrInputMethod = New instat.ucrInputComboBox() Me.rdoSlope = New System.Windows.Forms.RadioButton() Me.rdoDumbbell = New System.Windows.Forms.RadioButton() Me.lblXEnd = New System.Windows.Forms.Label() @@ -86,20 +79,23 @@ Partial Class dlgLinePlot Me.ucrInputSlopeLabelColour = New instat.ucrInputComboBox() Me.ucrNudSlopeTextSize = New instat.ucrNud() Me.ucrNudSlopeLabelSize = New instat.ucrNud() - Me.ucrChkSlopeLabelOptions = New instat.ucrCheck() - Me.ucrChkSlopeTextOptions = New instat.ucrCheck() Me.ucrInputDumbbellLine = New instat.ucrInputComboBox() Me.ucrInputDumbbellXEnd = New instat.ucrInputComboBox() Me.ucrInputDumbbellX = New instat.ucrInputComboBox() Me.ucrNudDumbbellLine = New instat.ucrNud() Me.ucrNudDumbbellXEnd = New instat.ucrNud() Me.ucrNudDumbbellX = New instat.ucrNud() - Me.ucrChkDumbbellColour = New instat.ucrCheck() Me.ucrChkDumbbellSize = New instat.ucrCheck() Me.ucrReceiverGroup = New instat.ucrReceiverSingle() Me.ucrReceiverSlopeY = New instat.ucrReceiverSingle() + Me.ucrInputFormula = New instat.ucrInputComboBox() + Me.ucrChkSpan = New instat.ucrCheck() + Me.ucrChkFormula = New instat.ucrCheck() + Me.ucrChkAddSE = New instat.ucrCheck() + Me.ucrNudSpan = New instat.ucrNud() + Me.ucrFamilyInput = New instat.ucrInputComboBox() + Me.ucrInputMethod = New instat.ucrInputComboBox() Me.ucrChkAddLine = New instat.ucrCheck() - Me.ucrChkAddPoints = New instat.ucrCheck() Me.ucrPnlOptions = New instat.UcrPanel() Me.ucrPnlStepOrPath = New instat.UcrPanel() Me.ucrChkPathOrStep = New instat.ucrCheck() @@ -118,6 +114,10 @@ Partial Class dlgLinePlot Me.ucrFactorOptionalReceiver = New instat.ucrReceiverSingle() Me.ucrChkSlopeLineOptions = New instat.ucrCheck() Me.UcrNudSlopeYTextSize = New instat.ucrNud() + Me.ucrChkDumbbellColour = New instat.ucrCheck() + Me.ucrChkAddPoints = New instat.ucrCheck() + Me.ucrChkSlopeLabelOptions = New instat.ucrCheck() + Me.ucrChkSlopeTextOptions = New instat.ucrCheck() Me.grpSmoothOptions.SuspendLayout() Me.SuspendLayout() ' @@ -284,79 +284,6 @@ Partial Class dlgLinePlot Me.grpSmoothOptions.TabStop = False Me.grpSmoothOptions.Text = "Smooth Options" ' - 'ucrInputFormula - ' - Me.ucrInputFormula.AddQuotesIfUnrecognised = True - Me.ucrInputFormula.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputFormula.GetSetSelectedIndex = -1 - Me.ucrInputFormula.IsReadOnly = False - Me.ucrInputFormula.Location = New System.Drawing.Point(73, 46) - Me.ucrInputFormula.Name = "ucrInputFormula" - Me.ucrInputFormula.Size = New System.Drawing.Size(110, 23) - Me.ucrInputFormula.TabIndex = 7 - ' - 'ucrChkSpan - ' - Me.ucrChkSpan.AutoSize = True - Me.ucrChkSpan.Checked = False - Me.ucrChkSpan.Location = New System.Drawing.Point(185, 20) - Me.ucrChkSpan.Name = "ucrChkSpan" - Me.ucrChkSpan.Size = New System.Drawing.Size(54, 23) - Me.ucrChkSpan.TabIndex = 3 - ' - 'ucrChkFormula - ' - Me.ucrChkFormula.AutoSize = True - Me.ucrChkFormula.Checked = False - Me.ucrChkFormula.Location = New System.Drawing.Point(5, 49) - Me.ucrChkFormula.Name = "ucrChkFormula" - Me.ucrChkFormula.Size = New System.Drawing.Size(66, 23) - Me.ucrChkFormula.TabIndex = 6 - ' - 'ucrChkAddSE - ' - Me.ucrChkAddSE.AutoSize = True - Me.ucrChkAddSE.Checked = False - Me.ucrChkAddSE.Location = New System.Drawing.Point(183, 49) - Me.ucrChkAddSE.Name = "ucrChkAddSE" - Me.ucrChkAddSE.Size = New System.Drawing.Size(75, 23) - Me.ucrChkAddSE.TabIndex = 8 - ' - 'ucrNudSpan - ' - Me.ucrNudSpan.AutoSize = True - Me.ucrNudSpan.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSpan.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudSpan.Location = New System.Drawing.Point(239, 20) - Me.ucrNudSpan.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudSpan.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSpan.Name = "ucrNudSpan" - Me.ucrNudSpan.Size = New System.Drawing.Size(50, 20) - Me.ucrNudSpan.TabIndex = 5 - Me.ucrNudSpan.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrFamilyInput - ' - Me.ucrFamilyInput.AddQuotesIfUnrecognised = True - Me.ucrFamilyInput.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrFamilyInput.GetSetSelectedIndex = -1 - Me.ucrFamilyInput.IsReadOnly = False - Me.ucrFamilyInput.Location = New System.Drawing.Point(210, 20) - Me.ucrFamilyInput.Name = "ucrFamilyInput" - Me.ucrFamilyInput.Size = New System.Drawing.Size(110, 24) - Me.ucrFamilyInput.TabIndex = 4 - ' - 'ucrInputMethod - ' - Me.ucrInputMethod.AddQuotesIfUnrecognised = True - Me.ucrInputMethod.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputMethod.GetSetSelectedIndex = -1 - Me.ucrInputMethod.IsReadOnly = False - Me.ucrInputMethod.Location = New System.Drawing.Point(52, 20) - Me.ucrInputMethod.Name = "ucrInputMethod" - Me.ucrInputMethod.Size = New System.Drawing.Size(90, 21) - Me.ucrInputMethod.TabIndex = 1 - ' 'rdoSlope ' Me.rdoSlope.Appearance = System.Windows.Forms.Appearance.Button @@ -503,7 +430,7 @@ Partial Class dlgLinePlot ' Me.lblSlopeLabelSize.AutoSize = True Me.lblSlopeLabelSize.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSlopeLabelSize.Location = New System.Drawing.Point(216, 321) + Me.lblSlopeLabelSize.Location = New System.Drawing.Point(198, 322) Me.lblSlopeLabelSize.Name = "lblSlopeLabelSize" Me.lblSlopeLabelSize.Size = New System.Drawing.Size(30, 13) Me.lblSlopeLabelSize.TabIndex = 68 @@ -533,7 +460,7 @@ Partial Class dlgLinePlot ' Me.lblSlopeTextSize.AutoSize = True Me.lblSlopeTextSize.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSlopeTextSize.Location = New System.Drawing.Point(213, 351) + Me.lblSlopeTextSize.Location = New System.Drawing.Point(202, 355) Me.lblSlopeTextSize.Name = "lblSlopeTextSize" Me.lblSlopeTextSize.Size = New System.Drawing.Size(30, 13) Me.lblSlopeTextSize.TabIndex = 65 @@ -673,24 +600,6 @@ Partial Class dlgLinePlot Me.ucrNudSlopeLabelSize.TabIndex = 57 Me.ucrNudSlopeLabelSize.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'ucrChkSlopeLabelOptions - ' - Me.ucrChkSlopeLabelOptions.AutoSize = True - Me.ucrChkSlopeLabelOptions.Checked = False - Me.ucrChkSlopeLabelOptions.Location = New System.Drawing.Point(10, 322) - Me.ucrChkSlopeLabelOptions.Name = "ucrChkSlopeLabelOptions" - Me.ucrChkSlopeLabelOptions.Size = New System.Drawing.Size(80, 24) - Me.ucrChkSlopeLabelOptions.TabIndex = 59 - ' - 'ucrChkSlopeTextOptions - ' - Me.ucrChkSlopeTextOptions.AutoSize = True - Me.ucrChkSlopeTextOptions.Checked = False - Me.ucrChkSlopeTextOptions.Location = New System.Drawing.Point(10, 352) - Me.ucrChkSlopeTextOptions.Name = "ucrChkSlopeTextOptions" - Me.ucrChkSlopeTextOptions.Size = New System.Drawing.Size(80, 24) - Me.ucrChkSlopeTextOptions.TabIndex = 58 - ' 'ucrInputDumbbellLine ' Me.ucrInputDumbbellLine.AddQuotesIfUnrecognised = True @@ -763,15 +672,6 @@ Partial Class dlgLinePlot Me.ucrNudDumbbellX.TabIndex = 9 Me.ucrNudDumbbellX.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'ucrChkDumbbellColour - ' - Me.ucrChkDumbbellColour.AutoSize = True - Me.ucrChkDumbbellColour.Checked = False - Me.ucrChkDumbbellColour.Location = New System.Drawing.Point(9, 322) - Me.ucrChkDumbbellColour.Name = "ucrChkDumbbellColour" - Me.ucrChkDumbbellColour.Size = New System.Drawing.Size(80, 24) - Me.ucrChkDumbbellColour.TabIndex = 45 - ' 'ucrChkDumbbellSize ' Me.ucrChkDumbbellSize.AutoSize = True @@ -807,24 +707,88 @@ Partial Class dlgLinePlot Me.ucrReceiverSlopeY.TabIndex = 10 Me.ucrReceiverSlopeY.ucrSelector = Nothing ' + 'ucrInputFormula + ' + Me.ucrInputFormula.AddQuotesIfUnrecognised = True + Me.ucrInputFormula.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputFormula.GetSetSelectedIndex = -1 + Me.ucrInputFormula.IsReadOnly = False + Me.ucrInputFormula.Location = New System.Drawing.Point(73, 46) + Me.ucrInputFormula.Name = "ucrInputFormula" + Me.ucrInputFormula.Size = New System.Drawing.Size(110, 23) + Me.ucrInputFormula.TabIndex = 7 + ' + 'ucrChkSpan + ' + Me.ucrChkSpan.AutoSize = True + Me.ucrChkSpan.Checked = False + Me.ucrChkSpan.Location = New System.Drawing.Point(185, 20) + Me.ucrChkSpan.Name = "ucrChkSpan" + Me.ucrChkSpan.Size = New System.Drawing.Size(54, 23) + Me.ucrChkSpan.TabIndex = 3 + ' + 'ucrChkFormula + ' + Me.ucrChkFormula.AutoSize = True + Me.ucrChkFormula.Checked = False + Me.ucrChkFormula.Location = New System.Drawing.Point(5, 49) + Me.ucrChkFormula.Name = "ucrChkFormula" + Me.ucrChkFormula.Size = New System.Drawing.Size(66, 23) + Me.ucrChkFormula.TabIndex = 6 + ' + 'ucrChkAddSE + ' + Me.ucrChkAddSE.AutoSize = True + Me.ucrChkAddSE.Checked = False + Me.ucrChkAddSE.Location = New System.Drawing.Point(183, 49) + Me.ucrChkAddSE.Name = "ucrChkAddSE" + Me.ucrChkAddSE.Size = New System.Drawing.Size(75, 23) + Me.ucrChkAddSE.TabIndex = 8 + ' + 'ucrNudSpan + ' + Me.ucrNudSpan.AutoSize = True + Me.ucrNudSpan.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSpan.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudSpan.Location = New System.Drawing.Point(239, 20) + Me.ucrNudSpan.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudSpan.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSpan.Name = "ucrNudSpan" + Me.ucrNudSpan.Size = New System.Drawing.Size(50, 20) + Me.ucrNudSpan.TabIndex = 5 + Me.ucrNudSpan.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrFamilyInput + ' + Me.ucrFamilyInput.AddQuotesIfUnrecognised = True + Me.ucrFamilyInput.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrFamilyInput.GetSetSelectedIndex = -1 + Me.ucrFamilyInput.IsReadOnly = False + Me.ucrFamilyInput.Location = New System.Drawing.Point(210, 20) + Me.ucrFamilyInput.Name = "ucrFamilyInput" + Me.ucrFamilyInput.Size = New System.Drawing.Size(110, 24) + Me.ucrFamilyInput.TabIndex = 4 + ' + 'ucrInputMethod + ' + Me.ucrInputMethod.AddQuotesIfUnrecognised = True + Me.ucrInputMethod.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputMethod.GetSetSelectedIndex = -1 + Me.ucrInputMethod.IsReadOnly = False + Me.ucrInputMethod.Location = New System.Drawing.Point(52, 20) + Me.ucrInputMethod.Name = "ucrInputMethod" + Me.ucrInputMethod.Size = New System.Drawing.Size(90, 21) + Me.ucrInputMethod.TabIndex = 1 + ' 'ucrChkAddLine ' Me.ucrChkAddLine.AutoSize = True Me.ucrChkAddLine.Checked = False - Me.ucrChkAddLine.Location = New System.Drawing.Point(90, 337) + Me.ucrChkAddLine.Location = New System.Drawing.Point(133, 337) Me.ucrChkAddLine.Name = "ucrChkAddLine" Me.ucrChkAddLine.Size = New System.Drawing.Size(77, 24) Me.ucrChkAddLine.TabIndex = 24 ' - 'ucrChkAddPoints - ' - Me.ucrChkAddPoints.AutoSize = True - Me.ucrChkAddPoints.Checked = False - Me.ucrChkAddPoints.Location = New System.Drawing.Point(9, 337) - Me.ucrChkAddPoints.Name = "ucrChkAddPoints" - Me.ucrChkAddPoints.Size = New System.Drawing.Size(80, 24) - Me.ucrChkAddPoints.TabIndex = 23 - ' 'ucrPnlOptions ' Me.ucrPnlOptions.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink @@ -872,7 +836,7 @@ Partial Class dlgLinePlot ' Me.ucrChkWithSE.AutoSize = True Me.ucrChkWithSE.Checked = False - Me.ucrChkWithSE.Location = New System.Drawing.Point(161, 367) + Me.ucrChkWithSE.Location = New System.Drawing.Point(258, 363) Me.ucrChkWithSE.Name = "ucrChkWithSE" Me.ucrChkWithSE.Size = New System.Drawing.Size(72, 23) Me.ucrChkWithSE.TabIndex = 26 @@ -883,7 +847,7 @@ Partial Class dlgLinePlot Me.ucrChkLineofBestFit.Checked = False Me.ucrChkLineofBestFit.Location = New System.Drawing.Point(9, 363) Me.ucrChkLineofBestFit.Name = "ucrChkLineofBestFit" - Me.ucrChkLineofBestFit.Size = New System.Drawing.Size(149, 24) + Me.ucrChkLineofBestFit.Size = New System.Drawing.Size(253, 24) Me.ucrChkLineofBestFit.TabIndex = 34 ' 'ucrSave @@ -926,7 +890,7 @@ Partial Class dlgLinePlot Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink Me.ucrBase.Location = New System.Drawing.Point(9, 467) Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(405, 52) + Me.ucrBase.Size = New System.Drawing.Size(408, 52) Me.ucrBase.TabIndex = 0 ' 'ucrReceiverXEnd @@ -1016,6 +980,42 @@ Partial Class dlgLinePlot Me.UcrNudSlopeYTextSize.TabIndex = 61 Me.UcrNudSlopeYTextSize.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' + 'ucrChkDumbbellColour + ' + Me.ucrChkDumbbellColour.AutoSize = True + Me.ucrChkDumbbellColour.Checked = False + Me.ucrChkDumbbellColour.Location = New System.Drawing.Point(9, 322) + Me.ucrChkDumbbellColour.Name = "ucrChkDumbbellColour" + Me.ucrChkDumbbellColour.Size = New System.Drawing.Size(80, 24) + Me.ucrChkDumbbellColour.TabIndex = 45 + ' + 'ucrChkAddPoints + ' + Me.ucrChkAddPoints.AutoSize = True + Me.ucrChkAddPoints.Checked = False + Me.ucrChkAddPoints.Location = New System.Drawing.Point(9, 337) + Me.ucrChkAddPoints.Name = "ucrChkAddPoints" + Me.ucrChkAddPoints.Size = New System.Drawing.Size(141, 24) + Me.ucrChkAddPoints.TabIndex = 23 + ' + 'ucrChkSlopeLabelOptions + ' + Me.ucrChkSlopeLabelOptions.AutoSize = True + Me.ucrChkSlopeLabelOptions.Checked = False + Me.ucrChkSlopeLabelOptions.Location = New System.Drawing.Point(10, 322) + Me.ucrChkSlopeLabelOptions.Name = "ucrChkSlopeLabelOptions" + Me.ucrChkSlopeLabelOptions.Size = New System.Drawing.Size(80, 24) + Me.ucrChkSlopeLabelOptions.TabIndex = 59 + ' + 'ucrChkSlopeTextOptions + ' + Me.ucrChkSlopeTextOptions.AutoSize = True + Me.ucrChkSlopeTextOptions.Checked = False + Me.ucrChkSlopeTextOptions.Location = New System.Drawing.Point(10, 352) + Me.ucrChkSlopeTextOptions.Name = "ucrChkSlopeTextOptions" + Me.ucrChkSlopeTextOptions.Size = New System.Drawing.Size(80, 24) + Me.ucrChkSlopeTextOptions.TabIndex = 58 + ' 'dlgLinePlot ' Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) diff --git a/instat/dlgLinePlot.vb b/instat/dlgLinePlot.vb index 716df37157a..12188b97f4b 100644 --- a/instat/dlgLinePlot.vb +++ b/instat/dlgLinePlot.vb @@ -730,4 +730,12 @@ Public Class dlgLinePlot clsOptionsFunction.RemoveParameterByName("formula") End If End Sub + + Private Sub AllControl_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrVariablesAsFactorForLinePlot.ControlContentsChanged, ucrSave.ControlContentsChanged, ucrReceiverXEnd.ControlContentsChanged, ucrReceiverX.ControlContentsChanged, ucrReceiverSlopeY.ControlContentsChanged, ucrReceiverSlopeX.ControlContentsChanged, ucrReceiverSlopeColour.ControlContentsChanged, ucrFactorOptionalReceiver.ControlContentsChanged + + End Sub + + Private Sub UcrVariablesAsFactor_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrVariablesAsFactorForLinePlot.ControlValueChanged + + End Sub End Class \ No newline at end of file From 3cc59757a0520350b97bb19c10c9f73d4d01a457 Mon Sep 17 00:00:00 2001 From: Fidel Lumbasi Date: Fri, 12 Aug 2022 15:03:29 +0300 Subject: [PATCH 016/122] Removing empty subs --- instat/dlgLinePlot.vb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/instat/dlgLinePlot.vb b/instat/dlgLinePlot.vb index 12188b97f4b..716df37157a 100644 --- a/instat/dlgLinePlot.vb +++ b/instat/dlgLinePlot.vb @@ -730,12 +730,4 @@ Public Class dlgLinePlot clsOptionsFunction.RemoveParameterByName("formula") End If End Sub - - Private Sub AllControl_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrVariablesAsFactorForLinePlot.ControlContentsChanged, ucrSave.ControlContentsChanged, ucrReceiverXEnd.ControlContentsChanged, ucrReceiverX.ControlContentsChanged, ucrReceiverSlopeY.ControlContentsChanged, ucrReceiverSlopeX.ControlContentsChanged, ucrReceiverSlopeColour.ControlContentsChanged, ucrFactorOptionalReceiver.ControlContentsChanged - - End Sub - - Private Sub UcrVariablesAsFactor_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrVariablesAsFactorForLinePlot.ControlValueChanged - - End Sub End Class \ No newline at end of file From 5b6456ca09feabf47b49d2f627b9cee25bd09929 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Thu, 8 Sep 2022 00:13:17 +0300 Subject: [PATCH 017/122] First complete VB.Net code additions --- .gitignore | 8 + instat/Enum/OutputType.vb | 8 +- instat/Enum/RObjectFormat.vb | 12 + instat/Enum/RObjectTypeLabel.vb | 17 + instat/Model/Output/clsOutputElement.vb | 73 +- instat/Model/Output/clsOutputLogger.vb | 107 +- instat/UserControl/ucrOutputPage.vb | 146 +- .../Webview/Windows/CefRuntimeWrapper.vb | 111 ++ .../Webview/Windows/ucrWebViewer.vb | 88 ++ instat/UserControls/ucrTextViewer.vb | 94 ++ instat/app.manifest | 79 ++ instat/clsRCodeStructure.vb | 257 ++-- instat/clsRFunction.vb | 454 +++--- instat/clsRLink.vb | 614 ++++---- instat/clsROperator.vb | 606 ++++---- instat/clsRSyntax.vb | 2 - instat/dlgOneVariableSummarise.Designer.vb | 610 ++++---- instat/dlgOneVariableSummarise.vb | 612 ++++---- instat/dlgScatterPlot.vb | 584 ++++---- instat/dlgSummaryTables.vb | 1237 +++++++++-------- instat/dlgThreeVariablePivotTable.Designer.vb | 8 +- instat/dlgThreeVariablePivotTable.vb | 81 +- instat/dlgViewLabelsAndLevels.vb | 429 +++--- instat/frmGraphDisplay.Designer.vb | 71 - instat/frmGraphDisplay.sw-KE.resx | 15 - instat/frmGraphDisplay.vb | 31 - instat/frmMaximiseOutput.Designer.vb | 89 ++ ...aphDisplay.resx => frmMaximiseOutput.resx} | 57 +- instat/frmMaximiseOutput.vb | 81 ++ instat/instat.vbproj | 35 +- 30 files changed, 3715 insertions(+), 2901 deletions(-) create mode 100644 instat/Enum/RObjectFormat.vb create mode 100644 instat/Enum/RObjectTypeLabel.vb create mode 100644 instat/UserControls/Webview/Windows/CefRuntimeWrapper.vb create mode 100644 instat/UserControls/Webview/Windows/ucrWebViewer.vb create mode 100644 instat/UserControls/ucrTextViewer.vb create mode 100644 instat/app.manifest delete mode 100644 instat/frmGraphDisplay.Designer.vb delete mode 100644 instat/frmGraphDisplay.sw-KE.resx delete mode 100644 instat/frmGraphDisplay.vb create mode 100644 instat/frmMaximiseOutput.Designer.vb rename instat/{frmGraphDisplay.resx => frmMaximiseOutput.resx} (91%) create mode 100644 instat/frmMaximiseOutput.vb diff --git a/.gitignore b/.gitignore index a183fb43274..fbceb13cfd7 100644 --- a/.gitignore +++ b/.gitignore @@ -239,3 +239,11 @@ installer/Output/ /instat/dlgFrequency.sw-KE.resx /instat/dlgFrequency.resx /instat/dlgFrequency.Designer.vb + +# PR #7782 adds a feature to display html in the output window. +# This requires the cef packages. These packages are more than 0.4 GB. +# We want to prevent these packages from being stored in the R-Instat GitHub repository. +/packages/cef.redist.x64.104.4.18/ +/packages/cef.redist.x86.104.4.18/ +/packages/CefSharp.Common.104.4.180/ +/packages/CefSharp.WinForms.104.4.180/ diff --git a/instat/Enum/OutputType.vb b/instat/Enum/OutputType.vb index bb68b2c3b9d..f362d168b44 100644 --- a/instat/Enum/OutputType.vb +++ b/instat/Enum/OutputType.vb @@ -1,6 +1,8 @@ - -Public Enum OutputType +Public Enum OutputType Script = 1 TextOutput = 2 ImageOutput = 4 -End Enum + HtmlOutput = 8 + 'the other reserved numbers are for for bitwise operations + 'todo. add the attribute? +End Enum \ No newline at end of file diff --git a/instat/Enum/RObjectFormat.vb b/instat/Enum/RObjectFormat.vb new file mode 100644 index 00000000000..20c73c16cbc --- /dev/null +++ b/instat/Enum/RObjectFormat.vb @@ -0,0 +1,12 @@ +''' +''' represents display formats for R objects that are internally supported by R-Instat +''' at both R and .Net level +''' +Public Structure RObjectFormat + '------------------- + 'note an Enum would have been ideal, but VB.Net does not support String Enums + '------------------ + Public Const Image As String = "image" + Public Const Text As String = "text" 'e.g objects of type "table" + Public Const Html As String = "html" 'e.g objects of type "htmlwidget", "sjTable", "gt_tbl" +End Structure \ No newline at end of file diff --git a/instat/Enum/RObjectTypeLabel.vb b/instat/Enum/RObjectTypeLabel.vb new file mode 100644 index 00000000000..f1839baa00f --- /dev/null +++ b/instat/Enum/RObjectTypeLabel.vb @@ -0,0 +1,17 @@ +''' +''' Represents R object types that are internally supported by R-Instat +''' at both R and .Net level. +''' They correspond to the object labels at R level +''' +Public Structure RObjectTypeLabel + '------------------- + 'note an Enum would have been ideal, but VB.Net does not support String Enums + '------------------ + Public Const Dataframe As String = "dataframe" + Public Const Column As String = "column" + Public Const Graph As String = "graph" + Public Const Table As String = "table" + Public Const Model As String = "model" + Public Const Structure_label As String = "structure" + Public Const Summary As String = "summary" +End Structure \ No newline at end of file diff --git a/instat/Model/Output/clsOutputElement.vb b/instat/Model/Output/clsOutputElement.vb index 098f881d24f..adc5582a3cf 100644 --- a/instat/Model/Output/clsOutputElement.vb +++ b/instat/Model/Output/clsOutputElement.vb @@ -13,39 +13,38 @@ ' ' You should have received a copy of the GNU General Public License ' along with this program. If not, see . - Imports RScript - ''' ''' Output element for a r command, the output element could be just the script or the script with ''' an image or output text ''' Public Class clsOutputElement - Private _formattedRScript As List(Of clsRScriptElement) Private _id As Integer - Private _lstBmpImage As List(Of Bitmap) - Private _lstStringOutput As List(Of String) + 'hold the script elements that form the R script that produced the output + Private _lstRScriptElements As New List(Of clsRScriptElement) Private _outputType As OutputType - + 'todo. deprecate this list with _lstTextOutput ? + Private _lstStringOutput As New List(Of String) + 'holds the file paths to the text outputs + Private _lstTextOutput As New List(Of String) + 'holds the file paths to the image outputs + Private _lstImageOutput As New List(Of String) + 'holds the file paths to the html outputs + Private _lstHtmlOutput As New List(Of String) ''' ''' Constructor ''' Public Sub New() - _formattedRScript = New List(Of clsRScriptElement) - _lstStringOutput = New List(Of String) - _lstBmpImage = New List(Of Bitmap) End Sub - ''' ''' Holds formated R Script, split into R Script Elements ''' ''' Public ReadOnly Property FormatedRScript As List(Of clsRScriptElement) Get - Return _formattedRScript + Return _lstRScriptElements End Get End Property - ''' ''' ID used for ordering elements ''' @@ -58,17 +57,25 @@ Public Class clsOutputElement _id = value End Set End Property - + Public ReadOnly Property TextOutput As String + Get + Return _lstTextOutput.FirstOrDefault() + End Get + End Property ''' - ''' Holds image if outputType is image + ''' Holds image file path if outputType is image file ''' ''' - Public ReadOnly Property ImageOutput As Bitmap + Public ReadOnly Property ImageOutput As String Get - Return _lstBmpImage.FirstOrDefault() + Return _lstImageOutput.FirstOrDefault() + End Get + End Property + Public ReadOnly Property HtmlOutput As String + Get + Return _lstHtmlOutput.FirstOrDefault End Get End Property - ''' ''' Defines the type of output ''' @@ -78,7 +85,6 @@ Public Class clsOutputElement Return _outputType End Get End Property - ''' ''' Holds the string output. Not the R Script ''' @@ -88,21 +94,29 @@ Public Class clsOutputElement Return _lstStringOutput.FirstOrDefault() End Get End Property - Public Function Clone() As clsOutputElement Return Me.MemberwiseClone End Function - + Public Sub AddTextOutput(strFileName As String, script As List(Of clsRScriptElement)) + _lstTextOutput.Add(strFileName) + _lstRScriptElements = script + _outputType = OutputType.TextOutput + End Sub ''' ''' When adding Output the script must always be added too ''' - ''' - Public Sub AddImageOutputFromR(image As Bitmap, script As List(Of clsRScriptElement)) - _lstBmpImage.Add(image) - _formattedRScript = script + ''' + ''' + Public Sub AddImageOutput(strFileName As String, script As List(Of clsRScriptElement)) + _lstImageOutput.Add(strFileName) + _lstRScriptElements = script _outputType = OutputType.ImageOutput End Sub - + Public Sub AddHtmlOutput(strFileName As String, script As List(Of clsRScriptElement)) + _lstHtmlOutput.Add(strFileName) + _lstRScriptElements = script + _outputType = OutputType.HtmlOutput + End Sub ''' ''' Adds script and passes through RScript to split into elements ''' @@ -111,10 +125,9 @@ Public Class clsOutputElement Try Dim rScript As New clsRScript(strScript) Dim lstTokens As List(Of clsRToken) = rScript.GetLstTokens(rScript.GetLstLexemes(strScript)) 'rScript.lstTokens - If lstTokens IsNot Nothing Then For Each rToken In lstTokens - _formattedRScript.Add(New clsRScriptElement With + _lstRScriptElements.Add(New clsRScriptElement With { .Text = rToken.strTxt, .Type = rToken.enuToken @@ -130,15 +143,13 @@ Public Class clsOutputElement MessageBoxIcon.Error) End Try End Sub - ''' ''' When adding Output the script must always be added too ''' ''' - Public Sub AddStringOutputFromR(strOutput As String, script As List(Of clsRScriptElement)) + Public Sub AddStringOutput(strOutput As String, script As List(Of clsRScriptElement)) _lstStringOutput.Add(strOutput) - _formattedRScript = script + _lstRScriptElements = script _outputType = OutputType.TextOutput End Sub - End Class \ No newline at end of file diff --git a/instat/Model/Output/clsOutputLogger.vb b/instat/Model/Output/clsOutputLogger.vb index ce018f48496..d43533efb5a 100644 --- a/instat/Model/Output/clsOutputLogger.vb +++ b/instat/Model/Output/clsOutputLogger.vb @@ -13,7 +13,7 @@ ' ' You should have received a copy of the GNU General Public License ' along with this program. If not, see . - +Imports System.IO ''' ''' Logging class to hold all scripts and outputs ran. ''' Holds multiple lists of outputs @@ -29,7 +29,6 @@ Public Class clsOutputLogger Return _output End Get End Property - ''' ''' Constructor ''' @@ -37,26 +36,22 @@ Public Class clsOutputLogger _output = New List(Of clsOutputElement) _filteredOutputs = New List(Of clsOutputList) End Sub - ''' ''' Event to show a new filtered list has been added ''' ''' Public Event NewFilteredListAdded(listName As String) - ''' ''' Event to show a new output as been added ''' ''' Public Event NewOutputAdded(outputElement As clsOutputElement) - ''' ''' Event to show an output as been added to a new filtered list ''' ''' ''' Public Event NewOutputAddedToFilteredList(outputElement As clsOutputElement, listName As String) - ''' ''' Holds a list of outputs that can be edited ''' @@ -69,27 +64,80 @@ Public Class clsOutputLogger _filteredOutputs = value End Set End Property + Public Sub AddFileOutput(strFileName As String) + Dim strFileExtension As String = Path.GetExtension(strFileName).ToLower + Select Case strFileExtension + Case ".png" + AddImageOutput(strFileName) + Case ".html" + AddHtmlOutput(strFileName) + Case ".txt" + AddTextOutput(strFileName) + Case Else + 'todo. developer error + Return + End Select + End Sub ''' - ''' Adds image to be displayed within the output + ''' Adds string output to be displayed within the output + ''' + ''' + Public Sub AddStringOutput(strOutput As String) + 'Note this is always takes the last script added as corresponding script + If _lastScriptElement Is Nothing Then + Throw New Exception("Cannot find script to attach output to.") + Else + Dim outputElement As New clsOutputElement + outputElement.AddStringOutput(strOutput, _lastScriptElement.FormatedRScript) + _output.Add(outputElement) + RaiseEvent NewOutputAdded(outputElement) + End If + End Sub + ''' + ''' Adds text file to be displayed within the output + ''' + ''' + Public Sub AddTextOutput(strFilename As String) + 'Note this always takes the last script added as corresponding script + If _lastScriptElement Is Nothing Then + Throw New Exception("Cannot find script to attach output to.") + Else + Dim outputElement As New clsOutputElement + outputElement.AddTextOutput(strFilename, _lastScriptElement.FormatedRScript) + _output.Add(outputElement) + RaiseEvent NewOutputAdded(outputElement) + End If + End Sub + ''' + ''' Adds image file to be displayed within the output ''' ''' Public Sub AddImageOutput(strFilename As String) - Dim image As Bitmap - 'Note this is always takes the last script added as corresponding script + 'Note this always takes the last script added as corresponding script If _lastScriptElement Is Nothing Then Throw New Exception("Cannot find script to attach output to.") Else - Using fs As New IO.FileStream(strFilename, IO.FileMode.Open) - image = New Bitmap(Drawing.Image.FromStream(fs)) - End Using Dim outputElement As New clsOutputElement - outputElement.AddImageOutputFromR(image, _lastScriptElement.FormatedRScript) + outputElement.AddImageOutput(strFilename, _lastScriptElement.FormatedRScript) + _output.Add(outputElement) + RaiseEvent NewOutputAdded(outputElement) + End If + End Sub + ''' + ''' Adds html output to be displayed within the output + ''' + ''' + Public Sub AddHtmlOutput(strFilename As String) + 'Note this always takes the last script added as corresponding script + If _lastScriptElement Is Nothing Then + Throw New Exception("Cannot find script to attach output to.") + Else + Dim outputElement As New clsOutputElement + outputElement.AddHtmlOutput(strFilename, _lastScriptElement.FormatedRScript) _output.Add(outputElement) RaiseEvent NewOutputAdded(outputElement) End If - End Sub - ''' ''' Adds an output to the given filtered list ''' @@ -102,7 +150,6 @@ Public Class clsOutputLogger filteredList.Output.Add(outputElement) RaiseEvent NewOutputAddedToFilteredList(outputElement, strListName) End Sub - ''' ''' Adds script to be displayed within the output ''' @@ -115,23 +162,6 @@ Public Class clsOutputLogger _output.Add(_lastScriptElement) RaiseEvent NewOutputAdded(_lastScriptElement) End Sub - - ''' - ''' Adds text output to be displayed within the output - ''' - ''' - Public Sub AddStringOutput(strOutput As String) - 'Note this is always takes the last script added as corresponding script - If _lastScriptElement Is Nothing Then - Throw New Exception("Cannot find script to attach output to.") - Else - Dim outputElement As New clsOutputElement - outputElement.AddStringOutputFromR(strOutput, _lastScriptElement.FormatedRScript) - _output.Add(outputElement) - RaiseEvent NewOutputAdded(outputElement) - End If - End Sub - ''' ''' Deletes output from a filtered list ''' @@ -146,7 +176,6 @@ Public Class clsOutputLogger element.Id -= 1 Next End Sub - ''' ''' Deletes output from main output list ''' @@ -154,7 +183,6 @@ Public Class clsOutputLogger Public Sub DeleteOutputFromMainList(outputElement As clsOutputElement) _output.RemoveAll(Function(x) x Is outputElement) End Sub - ''' ''' Returns the filtered list given the name. Will create the list if doesnt already exist. ''' @@ -171,7 +199,6 @@ Public Class clsOutputLogger End If Return filteredList End Function - ''' ''' Checks to see if list name is a valid name for a filtered list ''' @@ -184,4 +211,10 @@ Public Class clsOutputLogger End If Return True End Function -End Class \ No newline at end of file +End Class + + + + + + diff --git a/instat/UserControl/ucrOutputPage.vb b/instat/UserControl/ucrOutputPage.vb index f8ff320d6f0..92552c6d8fc 100644 --- a/instat/UserControl/ucrOutputPage.vb +++ b/instat/UserControl/ucrOutputPage.vb @@ -11,7 +11,7 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . Imports System.Runtime.InteropServices @@ -121,6 +121,8 @@ Public Class ucrOutputPage AddNewTextOutput(outputElement) Case OutputType.ImageOutput AddNewImageOutput(outputElement) + Case OutputType.HtmlOutput + AddNewHtmlOutput(outputElement) End Select pnlMain.VerticalScroll.Value = pnlMain.VerticalScroll.Maximum pnlMain.PerformLayout() @@ -160,9 +162,9 @@ Public Class ucrOutputPage End If Dim panel As New Panel With { - .Height = 10, ' = 10 'small height as panel will grow - .AutoSize = True, - .Dock = DockStyle.Top + .Height = 10, ' = 10 'small height as panel will grow + .AutoSize = True, + .Dock = DockStyle.Top } pnlMain.Controls.Add(panel) pnlMain.Controls.SetChildIndex(panel, 0) @@ -173,11 +175,11 @@ Public Class ucrOutputPage Private Sub AddCheckBoxToElementPanel(panel As Panel, outputElement As clsOutputElement) Dim checkBox As New CheckBox With { - .Text = "", - .CheckAlign = ContentAlignment.TopLeft, - .Dock = DockStyle.Left, - .AutoSize = True, - .Tag = outputElement + .Text = "", + .CheckAlign = ContentAlignment.TopLeft, + .Dock = DockStyle.Left, + .AutoSize = True, + .Tag = outputElement } panel.Controls.Add(checkBox) _checkBoxes.Add(checkBox) @@ -187,8 +189,8 @@ Public Class ucrOutputPage Private Sub AddNewScript(outputElement As clsOutputElement) Dim richTextBox As New RichTextBox With { - .Dock = DockStyle.Top, - .BorderStyle = BorderStyle.None + .Dock = DockStyle.Top, + .BorderStyle = BorderStyle.None } FillRichTextBoxWithFormatedRScript(richTextBox, outputElement.FormatedRScript) Dim panel As Panel = AddElementPanel(outputElement) @@ -203,7 +205,7 @@ Public Class ucrOutputPage If SelectedElements.Count = 1 AndAlso SelectedElements(0).OutputType = OutputType.ImageOutput Then Dim element As clsOutputElement = SelectedElements(0) Clipboard.Clear() - Clipboard.SetImage(element.ImageOutput) + Clipboard.SetImage(GetBitmapFromFile(element.ImageOutput)) Return True End If Return False @@ -217,13 +219,24 @@ Public Class ucrOutputPage AddFormatedTextToRichTextBox(richText, element.StringOutput, OutputFont.ROutputFont, OutputFont.ROutputColour) Case OutputType.ImageOutput Clipboard.Clear() - Clipboard.SetImage(element.ImageOutput) + 'todo. instead of copy paste, add image to rtf directly from file? + Clipboard.SetImage(GetBitmapFromFile(element.ImageOutput)) richText.Paste() + Case OutputType.HtmlOutput + 'todo End Select richText.AppendText(Environment.NewLine) richText.AppendText(Environment.NewLine) End Sub + Private Function GetBitmapFromFile(strFilename As String) As Bitmap + Dim image As Bitmap + Using fs As New IO.FileStream(strFilename, IO.FileMode.Open) + image = New Bitmap(Drawing.Image.FromStream(fs)) + End Using + Return image + End Function + Private Sub AddFormatedTextToRichTextBox(richTextBox As RichTextBox, text As String, font As Font, colour As Color) Dim intStartSelection As Integer = richTextBox.Text.Length richTextBox.AppendText(text) @@ -248,28 +261,109 @@ Public Class ucrOutputPage End Sub Private Sub AddNewTextOutput(outputElement As clsOutputElement) - Dim richTextBox As New RichTextBox With { - .Dock = DockStyle.Top, - .BorderStyle = BorderStyle.None - } - AddFormatedTextToRichTextBox(richTextBox, outputElement.StringOutput, OutputFont.ROutputFont, OutputFont.ROutputColour) Dim panel As Panel = AddElementPanel(outputElement) - panel.Controls.Add(richTextBox) - panel.Controls.SetChildIndex(richTextBox, 0) - SetRichTextBoxHeight(richTextBox) - AddHandler richTextBox.KeyUp, AddressOf richTextBox_CopySelectedText - AddHandler richTextBox.MouseLeave, AddressOf panelContents_MouseLeave + + If outputElement.StringOutput IsNot Nothing Then + Dim richTextBox As New RichTextBox With { + .Dock = DockStyle.Top, + .BorderStyle = BorderStyle.None + } + AddFormatedTextToRichTextBox(richTextBox, outputElement.StringOutput, OutputFont.ROutputFont, OutputFont.ROutputColour) + panel.Controls.Add(richTextBox) + panel.Controls.SetChildIndex(richTextBox, 0) + SetRichTextBoxHeight(richTextBox) + AddHandler richTextBox.KeyUp, AddressOf richTextBox_CopySelectedText + AddHandler richTextBox.MouseLeave, AddressOf panelContents_MouseLeave + Else + Dim linkLabel As New LinkLabel + Dim ucrTextViewer As New ucrTextViewer + + linkLabel.Text = "Maximise" + AddHandler linkLabel.Click, Sub() + Dim frmMaximiseOutput As New frmMaximiseOutput + frmMaximiseOutput.Show(strFileName:=outputElement.TextOutput) + End Sub + + ucrTextViewer.LoadTextFile(strFileName:=outputElement.TextOutput) + ucrTextViewer.FormatText(OutputFont.ROutputFont, OutputFont.ROutputColour) + + AddHandler ucrTextViewer._richTextBox.MouseLeave, AddressOf panelContents_MouseLeave + + panel.Controls.Add(linkLabel) + panel.Controls.Add(ucrTextViewer) + panel.Controls.SetChildIndex(linkLabel, 0) + panel.Controls.SetChildIndex(ucrTextViewer, 0) + linkLabel.Dock = DockStyle.Top + ucrTextViewer.Dock = DockStyle.Top + End If + End Sub Private Sub AddNewImageOutput(outputElement As clsOutputElement) - Dim pictureBox As New PictureBox - pictureBox.Image = outputElement.ImageOutput Dim panel As Panel = AddElementPanel(outputElement) + Dim linkLabel As New LinkLabel + Dim pictureBox As New PictureBox + + linkLabel.Text = "Maximise" + + pictureBox.Load(outputElement.ImageOutput) + panel.Controls.Add(linkLabel) panel.Controls.Add(pictureBox) + panel.Controls.SetChildIndex(linkLabel, 0) panel.Controls.SetChildIndex(pictureBox, 0) + linkLabel.Dock = DockStyle.Top pictureBox.Dock = DockStyle.Top pictureBox.SizeMode = PictureBoxSizeMode.Zoom SetPictureBoxHeight(pictureBox) + + AddHandler linkLabel.Click, Sub() + Dim frmMaximiseOutput As New frmMaximiseOutput + frmMaximiseOutput.Show(strFileName:=outputElement.ImageOutput) + End Sub + End Sub + + Private Sub AddNewHtmlOutput(outputElement As clsOutputElement) + Dim panel As Panel = AddElementPanel(outputElement) + Dim linkLabel As New LinkLabel + + If RuntimeInformation.IsOSPlatform(OSPlatform.Windows) AndAlso CefRuntimeWrapper.isCefInitilised Then + Dim ucrWebview As New ucrWebViewer() + linkLabel.Text = "Maximise" + AddHandler linkLabel.Click, Sub() + Dim frmMaximiseOutput As New frmMaximiseOutput + frmMaximiseOutput.Show(strFileName:=outputElement.HtmlOutput) + End Sub + + ucrWebview.LoadHtmlFile(outputElement.HtmlOutput) + + panel.Controls.Add(linkLabel) + panel.Controls.Add(ucrWebview) + panel.Controls.SetChildIndex(linkLabel, 0) + panel.Controls.SetChildIndex(ucrWebview, 0) + + linkLabel.Dock = DockStyle.Top + ucrWebview.Dock = DockStyle.Top + Else + + linkLabel.Text = "View html file" + AddHandler linkLabel.Click, Sub() + 'display the html output in default browser + Cursor = Cursors.WaitCursor + Process.Start(outputElement.HtmlOutput) + Cursor = Cursors.Default + End Sub + + panel.Controls.Add(linkLabel) + panel.Controls.SetChildIndex(linkLabel, 0) + + linkLabel.Dock = DockStyle.Top + + 'display the html output in default browser + Cursor = Cursors.WaitCursor + Process.Start(outputElement.HtmlOutput) + Cursor = Cursors.Default + End If + End Sub Private Sub SetRichTextBoxHeight(richTextBox As RichTextBox) @@ -326,4 +420,4 @@ Public Class ucrOutputPage Next End Sub -End Class +End Class \ No newline at end of file diff --git a/instat/UserControls/Webview/Windows/CefRuntimeWrapper.vb b/instat/UserControls/Webview/Windows/CefRuntimeWrapper.vb new file mode 100644 index 00000000000..819c5fd85a1 --- /dev/null +++ b/instat/UserControls/Webview/Windows/CefRuntimeWrapper.vb @@ -0,0 +1,111 @@ +Imports System.IO +Imports System.Runtime.ConstrainedExecution +Imports CefSharp +Imports CefSharp.SchemeHandler +Imports CefSharp.WinForms +'''------------------------------------------------------------------------------------------------ +''' +''' +''' Note: This class is intended to be used solely as a 'static' class (i.e. contains only shared +''' members, cannot be instantiated and cannot be inherited from). +''' In order to enforce this (and prevent developers from using this class in an unintended way), +''' the class is declared as 'NotInheritable` and the constructor is declared as 'Private'. +''' +''' +''' '''------------------------------------------------------------------------------------------------ +Public NotInheritable Class CefRuntimeWrapper + + '''-------------------------------------------------------------------------------------------- + ''' + ''' Declare constructor 'Private' to prevent instantiation of this class (see class comments + ''' for more details). + ''' + '''-------------------------------------------------------------------------------------------- + Private Sub New() + End Sub + + Public Shared Function InitialiseCefRuntime() As Boolean + + Try + If IsCefInitilised() Then + Return False + End If + + + 'If ANYCPU Then + CefRuntime.SubscribeAnyCpuAssemblyResolver() + 'End If + + 'Programmatically enable DPI Aweness + 'Can also be done via app.manifest Or app.config + 'https://github.com/cefsharp/CefSharp/wiki/General-Usage#high-dpi-displayssupport + 'If set via app.manifest this call will have no effect. + 'Cef.EnableHighDPISupport() + + 'By default CefSharp will use an in-memory cache, you need to specify a Cache Folder to persist data + Dim settings As New CefSettings With { + .CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Cache") + } + + 'Example of setting a command line argument + 'Enables WebRTC + ' - CEF Doesn't currently support permissions on a per browser basis see https://bitbucket.org/chromiumembedded/cef/issues/2582/allow-run-time-handling-of-media-access + ' - CEF Doesn't currently support displaying a UI for media access permissions + ' + 'NOTE: WebRTC Device Id's aren't persisted as they are in Chrome see https://bitbucket.org/chromiumembedded/cef/issues/2064/persist-webrtc-deviceids-across-restart + settings.CefCommandLineArgs.Add("enable-media-stream") + 'https://peter.sh/experiments/chromium-command-line-switches/#use-fake-ui-for-media-stream + settings.CefCommandLineArgs.Add("use-fake-ui-for-media-stream") + 'For screen sharing add (see https://bitbucket.org/chromiumembedded/cef/issues/2582/allow-run-time-handling-of-media-access#comment-58677180) + settings.CefCommandLineArgs.Add("enable-usermedia-screen-capturing") + + 'todo. explore this further once we find the limitations of File:/// + 'settings.RegisterScheme(GetCustomSheme()) + + 'Perform dependency check to make sure all relevant resources are in our output directory then initialise cef + Return Cef.Initialize(settings, performDependencyCheck:=True, browserProcessHandler:=Nothing) + + Catch ex As Exception + 'An excpetion "Could not load file or assembly 'CefSharp.Core.Runtime.dll' or one of its dependencies. The specified module could not be found.":"CefSharp.Core.Runtime.dll" + 'could be thrown. + Return False + End Try + + End Function + + + + Public Shared Function IsCefInitilised() As Boolean + Try + 'An excpetion "Could not load file or assembly 'CefSharp.Core.Runtime.dll' or one of its dependencies. The specified module could not be found.":"CefSharp.Core.Runtime.dll" + 'could be thrown. + Return Cef.IsInitialized + Catch ex As Exception + Return False + End Try + End Function + + Public Shared Sub ShutDownCef() + If IsCefInitilised() Then + Cef.Shutdown() + End If + End Sub + + + 'todo. left here for future reference + 'Private Shared Function GetCustomSheme() As CefCustomScheme + ' Dim cefCustomScheme As New CefCustomScheme + ' cefCustomScheme.SchemeName = "rinstat_temp_local_folder" + ' cefCustomScheme.DomainName = "rinstat_output" + ' cefCustomScheme.SchemeHandlerFactory = New FolderSchemeHandlerFactory( + ' rootFolder:="C:\RInstatInstallationFolder\tempfiles", + ' hostName:="rinstat_output", + ' defaultPage:="rinstat_default_page.html") + + ' 'usage example; strUrl = "rinstat_temp_local_folder://rinstat_output/anyFileDisplayable" + ' 'browser.LoadUrl(strUrl) + ' Return cefCustomScheme + + 'End Function + +End Class \ No newline at end of file diff --git a/instat/UserControls/Webview/Windows/ucrWebViewer.vb b/instat/UserControls/Webview/Windows/ucrWebViewer.vb new file mode 100644 index 00000000000..5f8f6d9584a --- /dev/null +++ b/instat/UserControls/Webview/Windows/ucrWebViewer.vb @@ -0,0 +1,88 @@ +' R- Instat +' Copyright (C) 2015-2017 +' +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU General Public License for more details. +' +' You should have received a copy of the GNU General Public License +' along with this program. If not, see . + +Imports CefSharp.WinForms +Imports CefSharp +Imports CefSharp.DevTools.DOM +Imports System.Windows + +'todo. inherit panel? +Public Class ucrWebViewer + Inherits Panel + + Private ReadOnly _browser As ChromiumWebBrowser + + Public Sub New() + _browser = New ChromiumWebBrowser() + AddHandler _browser.LoadingStateChanged, AddressOf OnLoadingStateChanged + Me.Controls.Add(_browser) + End Sub + + Public Sub LoadHtmlFile(strFileName As String) + If _browser Is Nothing Then + Return + End If + 'todo. this implementation may need to be changed if we face it's limitations + 'the use of file:/// is not preferred + 'see reason in https://github.com/cefsharp/CefSharp/wiki/General-Usage#file-uri-file + 'it's not yet clear how we can implement a custom schema at this point, + 'not unless we specify R-Instat temp output folder in the R commands. + 'that should be the first step + + Dim strUrl As String = "file:///" + strFileName.Replace("\", "/") + _browser.LoadUrl(strUrl) + _browser.Dock = DockStyle.Fill + End Sub + + Private Sub OnLoadingStateChanged(sender As Object, e As LoadingStateChangedEventArgs) + 'by default always set the height of this control to correspond to the html document after loading. + If Not e.IsLoading Then + 'Get the height of the html document and set it as the controls height + Dim task2 As Task(Of Rect) = _browser.GetContentSizeAsync() + task2.ContinueWith(Sub(t) + If Not t.IsFaulted Then + Dim response As Rect = t.Result + If response IsNot Nothing Then + Me.Invoke(Sub() + Me.Height = response.Height + End Sub) + End If + + End If + End Sub) + End If + End Sub + + Protected Overrides Sub Dispose(bDisposing As Boolean) + If _browser IsNot Nothing Then + _browser.Dispose() + End If + MyBase.Dispose(bDisposing) + End Sub + + + 'Public Sub LoadUrl(strUrl As String) + ' 'todo. left here for reference + ' 'example; www.google.com + ' ' browser.LoadUrl(strUrl) + 'End Sub + + 'Public Sub LoadHtml(strHtml As String) + ' 'todo. left here for reference + ' 'browser.LoadHtml(strHtml) + 'End Sub + +End Class \ No newline at end of file diff --git a/instat/UserControls/ucrTextViewer.vb b/instat/UserControls/ucrTextViewer.vb new file mode 100644 index 00000000000..f1994fa36f3 --- /dev/null +++ b/instat/UserControls/ucrTextViewer.vb @@ -0,0 +1,94 @@ +Imports System.IO +Imports System.Runtime.InteropServices + +Public Class ucrTextViewer + Inherits Panel + + Public ReadOnly _richTextBox As RichTextBox + + Public Sub New() + _richTextBox = New RichTextBox + _richTextBox.BorderStyle = BorderStyle.None + Me.Controls.Add(_richTextBox) + _richTextBox.Dock = DockStyle.Fill + AddHandler _richTextBox.KeyUp, AddressOf richTextBox_CopySelectedText + End Sub + + Public ReadOnly Property TextLength As Integer + Get + Return _richTextBox.Text.Length + End Get + End Property + + Public Sub LoadTextFile(strFileName As String) + Dim strOutput As String = "" + For Each strLine As String In File.ReadLines(strFileName) + strOutput = strOutput & strLine & Environment.NewLine + Next strLine + AddText(strOutput) + End Sub + + Public Sub AddText(text As String) + _richTextBox.AppendText(text) + 'by default always set the height of this control to correspond to the heigh of the rich text box contents + 'todo. what happens when the rich text box has multiple fonts? + Me.Height = (_richTextBox.GetLineFromCharIndex(_richTextBox.Text.Length) + 1) * (_richTextBox.Font.Height + _richTextBox.Margin.Vertical) + 5 + End Sub + + Public Sub AddTextAndFormat(text As String, font As Font, color As Color) + Dim intStartSelection As Integer = _richTextBox.Text.Length + AddText(text) + FormatText(font, color, intStartSelection, text.Length) + End Sub + + Public Sub FormatText(font As Font, color As Color, + Optional iSelectionStart As Integer = 0, + Optional iSelectionLength As Integer = -1) + + If iSelectionLength = -1 Then + iSelectionLength = _richTextBox.Text.Length + End If + + If RuntimeInformation.IsOSPlatform(OSPlatform.Linux) Then + 'Mono cannot have multiple fonts and colours within RichTextBox + _richTextBox.SelectAll() + _richTextBox.Font = font + _richTextBox.ForeColor = color + _richTextBox.SelectionLength = 0 + Else + _richTextBox.SelectionStart = iSelectionStart + _richTextBox.SelectionLength = iSelectionLength + _richTextBox.SelectionFont = font + _richTextBox.SelectionColor = color + _richTextBox.SelectionLength = 0 + End If + End Sub + + Private Sub richTextBox_CopySelectedText(sender As Object, e As KeyEventArgs) + If e.KeyData = Keys.Control + Keys.C Then + Try + Dim richText As RichTextBox = CType(sender, RichTextBox) + Dim richSelectedText As New RichTextBox + richSelectedText.AppendText(richText.SelectedText) + CopySelectedTextToClipBoard(richSelectedText, richText.SelectedRtf) + Catch ex As Exception + MsgBox(ex.Message) + End Try + End If + End Sub + + Private Sub CopySelectedTextToClipBoard(richText As RichTextBox, richTextFormat As String) + Dim strClip As String = String.Empty + Dim dto As New DataObject() + + For Each Line As String In richText.Lines + strClip &= Line & Environment.NewLine + Next + + dto.SetText(richTextFormat, TextDataFormat.Rtf) + dto.SetText(strClip, TextDataFormat.UnicodeText) + Clipboard.Clear() + Clipboard.SetDataObject(dto) + End Sub + +End Class \ No newline at end of file diff --git a/instat/app.manifest b/instat/app.manifest new file mode 100644 index 00000000000..99ca084ee50 --- /dev/null +++ b/instat/app.manifest @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index 4aed3b6dcdc..d91e2fa5f6f 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -48,33 +48,24 @@ Public Class RCodeStructure ''' The name of the data frame to assign to ''' (i.e. the data frame name associated with the R "data_name" parameter). ''' + ''' todo. deprecate Public strAssignToDataFrame As String ''' The name of the column to assign to ''' (i.e. the column name associated with the R "col_name" or "col_names" ''' parameters). ''' + ''' todo. deprecate Public strAssignToColumn As String - ''' The name of the model to assign to - ''' (i.e. the model name associated with the R "model_name" parameter). - ''' - Public strAssignToModel As String - - ''' The name of the graph to assign to - ''' (i.e. the graph name associated with the R "graph_name" parameter). - ''' - Public strAssignToGraph As String + '------------------------- + Public _rDataFrameNameToAddObjectTo As String + Public _rObjectToAssignTo As String + Public _rObjectNameToAssignTo As String + Public _rObjectTypeToAssignTo As String + Public _rObjectFormatToAssignTo As String - ''' The name of the surv to assign to - ''' (i.e. the surv name associated with the R "surv_name" parameter). - ''' - Public strAssignToSurv As String - - ''' The name of the table to assign to - ''' (i.e. the table name associated with the R "table_name" parameter). - ''' - Public strAssignToTable As String + '-------------------------------- ''' If true then a list of data frames is assigned (i.e. the R "data_names" ''' parameter needs to be set). @@ -250,8 +241,22 @@ Public Class RCodeStructure ''' names of new data frames if data frame list is ''' not named. ''' (Optional) The new value for strAdjacentColumn. - '''-------------------------------------------------------------------------------------------- - Public Sub SetAssignTo(strTemp As String, Optional strTempDataframe As String = "", Optional strTempColumn As String = "", Optional strTempModel As String = "", Optional strTempGraph As String = "", Optional strTempSurv As String = "", Optional strTempTable As String = "", Optional bAssignToIsPrefix As Boolean = False, Optional bAssignToColumnWithoutNames As Boolean = False, Optional bInsertColumnBefore As Boolean = False, Optional bRequireCorrectLength As Boolean = True, Optional bDataFrameList As Boolean = False, Optional strDataFrameNames As String = "", Optional strAdjacentColumn As String = "") + ''' todo. deprecate some of the options + '''-------------------------------------------------------------------------------------------- + Public Sub SetAssignTo(strTemp As String, + Optional strTempDataframe As String = "", + Optional strTempColumn As String = "", + Optional strTempModel As String = "", + Optional strTempGraph As String = "", + Optional strTempSurv As String = "", + Optional strTempTable As String = "", + Optional bAssignToIsPrefix As Boolean = False, + Optional bAssignToColumnWithoutNames As Boolean = False, + Optional bInsertColumnBefore As Boolean = False, + Optional bRequireCorrectLength As Boolean = True, + Optional bDataFrameList As Boolean = False, + Optional strDataFrameNames As String = "", + Optional strAdjacentColumn As String = "") strAssignTo = strTemp If Not strTempDataframe = "" Then strAssignToDataFrame = strTempDataframe @@ -259,19 +264,7 @@ Public Class RCodeStructure strAssignToColumn = strTempColumn End If End If - If Not strTempModel = "" Then - strAssignToModel = strTempModel - End If - If Not strTempGraph = "" Then - strAssignToGraph = strTempGraph - End If - If Not strTempSurv = "" Then - strAssignToSurv = strTempSurv - End If - If Not strTempTable = "" Then - strAssignToTable = strTempTable - End If bToBeAssigned = True bIsAssigned = False Me.bAssignToIsPrefix = bAssignToIsPrefix @@ -281,8 +274,82 @@ Public Class RCodeStructure Me.bRequireCorrectLength = bRequireCorrectLength Me.bDataFrameList = bDataFrameList Me.strDataFrameNames = strDataFrameNames + + '----------------------------------------------------------------------- + 'for dialogs that produce objects shown to the output viewer + 'using this deprecated subroutine. call the SetAssignToRObject subroutine + 'this part can be deleted once all the dialogs that have these types of outputs are refactored + Dim strNewRObjectTypeToAssignTo As String = "" + Dim strNewRObjectTypeLabelToAssignTo As String = "" + Dim strNewRObjectFormatToAssignTo As String = "" + + If Not strTempGraph = "" Then + strNewRObjectTypeToAssignTo = strTempGraph + strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.Graph + 'assumption is by default a model is in image format + strNewRObjectFormatToAssignTo = RObjectFormat.Image + End If + + If Not strTempModel = "" Then + strNewRObjectTypeToAssignTo = strTempModel + strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.Model + 'assumption is by default a model is in text format + strNewRObjectFormatToAssignTo = RObjectFormat.Text + End If + + If Not strTempTable = "" Then + strNewRObjectTypeToAssignTo = strTempTable + strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.Table + 'assumption is by default a table is in text format + strNewRObjectFormatToAssignTo = RObjectFormat.Text + End If + + If Not strTempSurv = "" Then + strNewRObjectTypeToAssignTo = strTempSurv + strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.Structure_label + 'assumption is by default a survival is in text format + strNewRObjectFormatToAssignTo = RObjectFormat.Text + End If + + If Not strNewRObjectTypeToAssignTo = "" Then + SetAssignToRObject(strRObjectToAssignTo:=strNewRObjectTypeToAssignTo, + strRObjectTypeLabelToAssignTo:=strNewRObjectTypeLabelToAssignTo, + strRObjectFormatToAssignTo:=strNewRObjectFormatToAssignTo, + strRDataFrameNameToAddObjectTo:=strTempDataframe, + strObjectName:=strNewRObjectTypeToAssignTo, + bAssignToIsPrefix:=bAssignToIsPrefix) + End If + '---------------------------------------------------------- + + End Sub + + 'Not used for assigning columns + Public Sub SetAssignToRObject(strRObjectToAssignTo As String, + strRObjectTypeLabelToAssignTo As String, + strRObjectFormatToAssignTo As String, + Optional strRDataFrameNameToAddObjectTo As String = "", + Optional strObjectName As String = "", + Optional bAssignToIsPrefix As Boolean = False) + + If strRObjectTypeLabelToAssignTo = RObjectTypeLabel.Dataframe OrElse strRObjectTypeLabelToAssignTo = RObjectTypeLabel.Column Then + MsgBox("Developer Error: Incorrect Set Assign." & + Environment.NewLine & + "This can only be done for objects that can be displayed in the output viewer") + Return + End If + + Me._rObjectToAssignTo = strRObjectToAssignTo + Me._rObjectTypeToAssignTo = strRObjectTypeLabelToAssignTo + Me._rObjectFormatToAssignTo = strRObjectFormatToAssignTo + Me._rDataFrameNameToAddObjectTo = strRDataFrameNameToAddObjectTo + Me._rObjectNameToAssignTo = strObjectName + Me.bAssignToIsPrefix = bAssignToIsPrefix + Me.bToBeAssigned = True + Me.bIsAssigned = False End Sub + + '''-------------------------------------------------------------------------------------------- ''' Resets all the 'AssignTo' variables. ''' String variables are set to "". @@ -294,15 +361,16 @@ Public Class RCodeStructure strAssignTo = "" strAssignToDataFrame = "" strAssignToColumn = "" - strAssignToModel = "" - strAssignToGraph = "" - strAssignToSurv = "" - strAssignToTable = "" bToBeAssigned = False bIsAssigned = False bAssignToIsPrefix = False bAssignToColumnWithoutNames = False bInsertColumnBefore = False + + Me._rObjectToAssignTo = "" + Me._rObjectNameToAssignTo = "" + Me._rObjectTypeToAssignTo = "" + Me._rObjectFormatToAssignTo = "" End Sub '''-------------------------------------------------------------------------------------------- @@ -372,7 +440,7 @@ Public Class RCodeStructure Dim clsAddModels As New RFunction Dim clsGetModels As New RFunction Dim clsAddGraphs As New RFunction - Dim clsGetGraphs As New RFunction + Dim clsViewGraphObjects As New RFunction Dim clsAddSurv As New RFunction Dim clsGetSurv As New RFunction Dim clsAddTables As New RFunction @@ -392,10 +460,45 @@ Public Class RCodeStructure 'Note1: The append allows 'strScript' to be built up into a multi-line string through successive calls of 'ToScript' 'Note2: Initially, 'strAssignTo' is typically the name of the variable to assign the result of 'strTemp' to, e.g. ' 'guinea_two_stations'. - strScript = strScript & ConstructAssignTo(strAssignTo, strTemp) & Environment.NewLine - 'if we need to assign to a column in a data frame - If Not strAssignToDataFrame = "" AndAlso (Not strAssignToColumn = "" OrElse bAssignToColumnWithoutNames) Then + 'todo + If Not String.IsNullOrEmpty(Me._rObjectToAssignTo) Then + strScript = strScript & ConstructAssignTo(Me._rObjectToAssignTo, strTemp) & Environment.NewLine + Else + strScript = strScript & ConstructAssignTo(strAssignTo, strTemp) & Environment.NewLine + End If + + If Not String.IsNullOrEmpty(Me._rObjectTypeToAssignTo) AndAlso Not String.IsNullOrEmpty(Me._rObjectFormatToAssignTo) Then + Dim clsAddObject As New RFunction + Dim clsViewObject As New RFunction + + 'set the R command and parameters for the add object R function + clsAddObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_object") + If Not String.IsNullOrEmpty(Me._rDataFrameNameToAddObjectTo) Then + clsAddObject.AddParameter("data_name", Chr(34) & Me._rDataFrameNameToAddObjectTo & Chr(34)) + End If + If Not String.IsNullOrEmpty(Me._rObjectNameToAssignTo) Then + clsAddObject.AddParameter("object_name", Chr(34) & Me._rObjectNameToAssignTo & Chr(34)) + End If + clsAddObject.AddParameter("object_type_label", Chr(34) & Me._rObjectTypeToAssignTo & Chr(34)) + clsAddObject.AddParameter("object_format", Chr(34) & Me._rObjectFormatToAssignTo & Chr(34)) + clsAddObject.AddParameter("object", Me._rObjectToAssignTo) + + 'todo. once the R level code has been refactored this parameter will not be necessary. + 'it's important for it to alway be false. + 'This can be changed once saving of objects as part of R-Instat session is correctly implemented + clsAddObject.AddParameter("internal", "FALSE") + + 'set the R command and parameters for the view object R function + clsViewObject.SetRCommand("view_object") + clsViewObject.AddParameter("object", Me._rObjectToAssignTo) + clsViewObject.AddParameter("object_format", Chr(34) & Me._rObjectFormatToAssignTo & Chr(34)) + + 'construct the scripts + strScript = strScript & clsAddObject.ToScript() & Environment.NewLine + strAssignTo = clsViewObject.ToScript() + ElseIf Not strAssignToDataFrame = "" AndAlso (Not strAssignToColumn = "" OrElse bAssignToColumnWithoutNames) Then + 'if we need to assign to a column in a data frame clsAddColumns.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") clsAddColumns.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) 'if we need to assign to a named column @@ -426,60 +529,6 @@ Public Class RCodeStructure clsGetColumns.AddParameter("col_names", Chr(34) & strAssignToColumn & Chr(34)) ' set 'strAssignTo' to e.g. "data_book$get_columns_from_data(data_name=""survey"", col_names=""row_names1"")" strAssignTo = clsGetColumns.ToScript() - ElseIf Not strAssignToModel = "" Then 'else if we need to assign to a model - clsAddModels.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_model") - clsAddModels.AddParameter("model_name", Chr(34) & strAssignToModel & Chr(34)) - clsAddModels.AddParameter("model", strAssignTo) - clsAddModels.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - If Not strAssignToDataFrame = "" Then - clsAddModels.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - clsGetModels.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - End If - strScript = strScript & clsAddModels.ToScript() & Environment.NewLine - - clsGetModels.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_models") - clsGetModels.AddParameter("model_name", Chr(34) & strAssignToModel & Chr(34)) - strAssignTo = clsGetModels.ToScript() - ElseIf Not strAssignToGraph = "" Then 'else if we need to assign to a graph - clsAddGraphs.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_graph") - clsAddGraphs.AddParameter("graph_name", Chr(34) & strAssignToGraph & Chr(34)) - clsAddGraphs.AddParameter("graph", strAssignTo) - If Not strAssignToDataFrame = "" Then - clsAddGraphs.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - clsGetGraphs.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - End If - strScript = strScript & clsAddGraphs.ToScript() & Environment.NewLine - - clsGetGraphs.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_graphs") - clsGetGraphs.AddParameter("graph_name", Chr(34) & strAssignToGraph & Chr(34)) - strAssignTo = clsGetGraphs.ToScript() - ElseIf Not strAssignToSurv = "" Then 'else if we need to assign to a surv - clsAddSurv.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_surv") - clsAddSurv.AddParameter("surv_name", Chr(34) & strAssignToSurv & Chr(34)) - clsAddSurv.AddParameter("surv", strAssignTo) - If Not strAssignToDataFrame = "" Then - clsAddSurv.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - clsGetSurv.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - End If - strScript = strScript & clsAddSurv.ToScript() & Environment.NewLine - - clsGetSurv.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_surv") - clsGetSurv.AddParameter("surv_name", Chr(34) & strAssignToSurv & Chr(34)) - strAssignTo = clsGetSurv.ToScript() - - ElseIf Not strAssignToTable = "" Then 'else if we need to assign to a table - clsAddTables.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_table") - clsAddTables.AddParameter("table_name", Chr(34) & strAssignToTable & Chr(34)) - clsAddTables.AddParameter("table", strAssignTo) - If Not strAssignToDataFrame = "" Then - clsAddTables.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - clsGetTables.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - End If - strScript = strScript & clsAddTables.ToScript() & Environment.NewLine - - clsGetTables.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_tables") - clsGetTables.AddParameter("table_name", Chr(34) & strAssignToTable & Chr(34)) - strAssignTo = clsGetTables.ToScript() ElseIf Not strAssignToDataFrame = "" Then 'else if we need to assign to a data frame clsAddData.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_data") @@ -534,6 +583,7 @@ Public Class RCodeStructure ''' The constructed assignment statement. '''-------------------------------------------------------------------------------------------- Private Function ConstructAssignTo(strAssignTo As String, strTemp As String) As String + 'todo. Use the R script library or move this function to a module Dim strReconstructed As String = "" Dim arrScriptParts As String() If Not String.IsNullOrEmpty(strTemp) Then @@ -903,13 +953,15 @@ Public Class RCodeStructure Dim clsTempCode As New RCodeStructure Dim clsRParam As RParameter + clsTempCode._rObjectToAssignTo = Me._rObjectToAssignTo + clsTempCode._rObjectNameToAssignTo = Me._rObjectNameToAssignTo + clsTempCode._rObjectTypeToAssignTo = Me._rObjectTypeToAssignTo + clsTempCode._rObjectFormatToAssignTo = Me._rObjectFormatToAssignTo + clsTempCode._rDataFrameNameToAddObjectTo = Me._rDataFrameNameToAddObjectTo + clsTempCode.strAssignTo = strAssignTo clsTempCode.strAssignToDataFrame = strAssignToDataFrame clsTempCode.strAssignToColumn = strAssignToColumn - clsTempCode.strAssignToModel = strAssignToModel - clsTempCode.strAssignToGraph = strAssignToGraph - clsTempCode.strAssignToSurv = strAssignToSurv - clsTempCode.strAssignToTable = strAssignToTable clsTempCode.bDataFrameList = bDataFrameList clsTempCode.strDataFrameNames = strDataFrameNames clsTempCode.bToBeAssigned = bToBeAssigned @@ -948,7 +1000,12 @@ Public Class RCodeStructure If bToBeAssigned AndAlso Not lstCodes.Contains(Me) Then 'add this object and its assign script to the respective lists lstCodes.Add(Me) - lstValues.Add(strAssignTo) + If Not String.IsNullOrEmpty(Me._rObjectToAssignTo) Then + lstValues.Add(_rObjectToAssignTo) + Else + lstValues.Add(strAssignTo) + End If + End If For Each clsTempParam As RParameter In clsParameters ' if parameter is a function or operator then also add its respective RCodeStructure @@ -956,4 +1013,4 @@ Public Class RCodeStructure clsTempParam.GetAllAssignTo(lstCodes, lstValues) Next End Sub -End Class +End Class \ No newline at end of file diff --git a/instat/clsRFunction.vb b/instat/clsRFunction.vb index 6dda2ff23ab..647ff7f5178 100644 --- a/instat/clsRFunction.vb +++ b/instat/clsRFunction.vb @@ -11,7 +11,7 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . '''-------------------------------------------------------------------------------------------- @@ -30,228 +30,232 @@ ''' ''' '''-------------------------------------------------------------------------------------------- -Public Class RFunction - Inherits RCodeStructure - - ''' The R command associated with this object (e.g. "plot"). - ''' Note that this variable only stores the command's name, it doesn't include any - ''' the parameters associated with the command. - Public strRCommand As String - - ''' The R command's package name. - Private strPackageName As String = "" - - ''' Initializes a new instance of this class. - Public Sub New() - OnParametersChanged() 'TODO SJL is this still needed? - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' Sets the R command's name (e.g. "facet_grid") and flags that the R script - ''' associated with this object is no longer correctly assigned. - ''' - ''' Name of the R command. - '''-------------------------------------------------------------------------------------------- - Public Sub SetRCommand(strTemp As String) - strRCommand = strTemp - bIsAssigned = False - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' Sets package name. - ''' - ''' The package name - '''-------------------------------------------------------------------------------------------- - Public Sub SetPackageName(strName As String) - strPackageName = strName - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' - ''' Creates, updates and returns the script that generates the expected output for this - ''' object. This script will have the form 'RCommand(param1=param1Val, param2=param2Val, ...)'. - ''' - ''' - ''' [in,out] (Optional) The existing script including any - ''' assignment part. - ''' This script is passed to the 'ToScript' function of the base - ''' class. This script is also passed to the 'ToScript' function - ''' of the operator's parameters. - ''' (Optional) Ignored, only included so that this function overrides - ''' its parent function. - ''' - ''' The script that generates the expected output for this object. - ''' - '''-------------------------------------------------------------------------------------------- - Public Overrides Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String - Dim i As Integer - 'TODO Legacy comment:'For method with OrderedIndices, replace clsParameters.count by Mybase.OrderedIndices.count and i by Mybase.OrderedIndices(i)' - - SortParameters() - 'if the object has an associated package name, then prefix the script with the package name - If strPackageName <> "" Then - strTemp = strPackageName & "::" - End If - - 'add each parameter to the script (e.g. "source(file=""Rsetup.R"")" - strTemp = strTemp & strRCommand & "(" - For i = 0 To clsParameters.Count - 1 'e,g, set strTemp to "data_book$get_data_frame(convert_to_character=TRUE, max_cols=30, data_name=""survey""" - If i > 0 Then - strTemp = strTemp & ", " - End If - 'append the script associated with the parameter (e.g. "max_cols=30") - strTemp = strTemp & clsParameters(i).ToScript(strScript) - Next - - 'close final bracket e.g. set strTemp to "data_book$get_data_frame(convert_to_character=TRUE, max_cols=30, data_name=""survey"")" - strTemp = strTemp & ")" - - 'if the string needs to be passed directly to R - If bToScriptAsRString Then - 'if string is intended to be assigned to a script then raise error (because modified script will no longer suitable for this) - 'TODO SJL if we only allow these 3 flags to be accessed through 'set/get' functions then we can guarantee that this error situation doesn't occur - 'TODO legacy comment:'should also check assignment of parameters' - If bToBeAssigned OrElse bIsAssigned Then - MsgBox("Developer error: Using bToScriptAsRString = True when RFunction is assigned will not produce the correct script. Remove assignment to use this options correctly.") - End If - - 'replace double quotes with single quotes - ' Note : Can't have double quotes ("") in the string because strTemp will be wrapped - ' with "". In most cases single quotes (') will give the same functionality, - ' though it's preferable to avoid this when constructing the RFunction. - strTemp = strTemp.Replace(Chr(34), Chr(39)) - - 'wrap the entire string in double quotes - strTemp = Chr(34) & strTemp & Chr(34) - End If - - 'if object needs to be assigned to then create/update the assignment script (if needed) - ' and return the assignment script. Otherwise just return 'strTemp'. - Return MyBase.ToScript(strScript, strTemp) - End Function - - '''-------------------------------------------------------------------------------------------- - ''' - ''' Adds a parameter to this function. Sets the parameter's name to - ''' . - ''' Sets the parameter's argument to one of , - ''' , , - ''' or . - ''' - ''' - ''' (Optional) Name of the parameter. - ''' (Optional) The parameter value. - ''' (Optional) The R function parameter. - ''' (Optional) The R operator parameter. - ''' (Optional) The R code structure parameter. - ''' (Optional) True to include, false to exclude the - ''' argument name. - ''' (Optional) The relative position of the - ''' parameter in this object's parameter list. - '''-------------------------------------------------------------------------------------------- - Public Overrides Sub AddParameter(Optional strParameterName As String = "", Optional strParameterValue As String = "", Optional clsRFunctionParameter As RFunction = Nothing, Optional clsROperatorParameter As ROperator = Nothing, Optional clsRCodeStructureParameter As RCodeStructure = Nothing, Optional bIncludeArgumentName As Boolean = True, Optional iPosition As Integer = -1) - 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? - MyBase.AddParameter(strParameterName, strParameterValue, clsRFunctionParameter, clsROperatorParameter, clsRCodeStructureParameter, bIncludeArgumentName, iPosition) - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' - ''' If the R function already has a parameter with the same name then changes the parameter's - ''' value to the value in . Else adds - ''' to the object as a new parameter. - ''' - ''' This function also ensures that there is no existing parameter with the same position as - ''' the newly added/updated parameter. - ''' - ''' - ''' The new parameter to add. - '''-------------------------------------------------------------------------------------------- - Public Overrides Sub AddParameter(clsParam As RParameter) - 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? - MyBase.AddParameter(clsParam) - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' - ''' Returns the parameter object named . - ''' - ''' - ''' The name of the parameter to return. - ''' - ''' The parameter object named . If the parameter - ''' doesn't exist then returns 'Nothing'. - '''-------------------------------------------------------------------------------------------- - Public Overrides Function GetParameter(strName As String) As RParameter - Dim iTempIndex As Integer = -1 'TODO SJL remove this variable? - If Not clsParameters Is Nothing Then - iTempIndex = clsParameters.FindIndex(Function(x) x.strArgumentName = strName) - If iTempIndex <> -1 Then - Return clsParameters(iTempIndex) - End If - End If - Return Nothing - End Function - - ''' Clears this object to its blank/initial state. - Public Overrides Sub Clear() - SetRCommand("") - SetPackageName("") - MyBase.Clear() - End Sub - - ''' Clears the parameters. - Public Overrides Sub ClearParameters() - 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? - MyBase.ClearParameters() - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' Makes a deep copy of this object. - ''' - ''' A copy of this object. - '''-------------------------------------------------------------------------------------------- - Public Overrides Function Clone() As RCodeStructure - Dim clsRFunction As New RFunction - Dim clsRParam As RParameter - - 'RCode properties - clsRFunction.strAssignTo = strAssignTo - clsRFunction.strAssignToDataFrame = strAssignToDataFrame - clsRFunction.strAssignToColumn = strAssignToColumn - clsRFunction.strAssignToModel = strAssignToModel - clsRFunction.strAssignToGraph = strAssignToGraph - clsRFunction.strAssignToTable = strAssignToTable - clsRFunction.bToBeAssigned = bToBeAssigned - clsRFunction.bIsAssigned = bIsAssigned - clsRFunction.bAssignToIsPrefix = bAssignToIsPrefix - clsRFunction.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames - clsRFunction.bInsertColumnBefore = bInsertColumnBefore - clsRFunction.iNumberOfAddedParameters = iNumberOfAddedParameters - clsRFunction.iPosition = iPosition - clsRFunction.iCallType = iCallType - clsRFunction.bExcludeAssignedFunctionOutput = bExcludeAssignedFunctionOutput - clsRFunction.bClearFromGlobal = bClearFromGlobal - clsRFunction.bToScriptAsRString = bToScriptAsRString - clsRFunction.Tag = Tag - For Each clsRParam In clsParameters - clsRFunction.AddParameter(clsRParam.Clone) - Next - - 'RFunction specific properties - clsRFunction.strPackageName = strPackageName - clsRFunction.strRCommand = strRCommand - - Return clsRFunction - End Function - - '''-------------------------------------------------------------------------------------------- - ''' Gets the number of parameters. - ''' - ''' The number of parameters. - '''-------------------------------------------------------------------------------------------- - Public ReadOnly Property iParameterCount() As Integer - Get - Return clsParameters.Count - End Get - End Property +Public Class RFunction + Inherits RCodeStructure + + ''' The R command associated with this object (e.g. "plot"). + ''' Note that this variable only stores the command's name, it doesn't include any + ''' the parameters associated with the command. + Public strRCommand As String + + ''' The R command's package name. + Private strPackageName As String = "" + + ''' Initializes a new instance of this class. + Public Sub New() + OnParametersChanged() 'TODO SJL is this still needed? + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' Sets the R command's name (e.g. "facet_grid") and flags that the R script + ''' associated with this object is no longer correctly assigned. + ''' + ''' Name of the R command. + '''-------------------------------------------------------------------------------------------- + Public Sub SetRCommand(strTemp As String) + strRCommand = strTemp + bIsAssigned = False + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' Sets package name. + ''' + ''' The package name + '''-------------------------------------------------------------------------------------------- + Public Sub SetPackageName(strName As String) + strPackageName = strName + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' + ''' Creates, updates and returns the script that generates the expected output for this + ''' object. This script will have the form 'RCommand(param1=param1Val, param2=param2Val, ...)'. + ''' + ''' + ''' [in,out] (Optional) The existing script including any + ''' assignment part. + ''' This script is passed to the 'ToScript' function of the base + ''' class. This script is also passed to the 'ToScript' function + ''' of the operator's parameters. + ''' (Optional) Ignored, only included so that this function overrides + ''' its parent function. + ''' + ''' The script that generates the expected output for this object. + ''' + '''-------------------------------------------------------------------------------------------- + Public Overrides Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String + Dim i As Integer + 'TODO Legacy comment:'For method with OrderedIndices, replace clsParameters.count by Mybase.OrderedIndices.count and i by Mybase.OrderedIndices(i)' + + SortParameters() + 'if the object has an associated package name, then prefix the script with the package name + If strPackageName <> "" Then + strTemp = strPackageName & "::" + End If + + 'add each parameter to the script (e.g. "source(file=""Rsetup.R"")" + strTemp = strTemp & strRCommand & "(" + For i = 0 To clsParameters.Count - 1 'e,g, set strTemp to "data_book$get_data_frame(convert_to_character=TRUE, max_cols=30, data_name=""survey""" + If i > 0 Then + strTemp = strTemp & ", " + End If + 'append the script associated with the parameter (e.g. "max_cols=30") + strTemp = strTemp & clsParameters(i).ToScript(strScript) + Next + + 'close final bracket e.g. set strTemp to "data_book$get_data_frame(convert_to_character=TRUE, max_cols=30, data_name=""survey"")" + strTemp = strTemp & ")" + + 'if the string needs to be passed directly to R + If bToScriptAsRString Then + 'if string is intended to be assigned to a script then raise error (because modified script will no longer suitable for this) + 'TODO SJL if we only allow these 3 flags to be accessed through 'set/get' functions then we can guarantee that this error situation doesn't occur + 'TODO legacy comment:'should also check assignment of parameters' + If bToBeAssigned OrElse bIsAssigned Then + MsgBox("Developer error: Using bToScriptAsRString = True when RFunction is assigned will not produce the correct script. Remove assignment to use this options correctly.") + End If + + 'replace double quotes with single quotes + ' Note : Can't have double quotes ("") in the string because strTemp will be wrapped + ' with "". In most cases single quotes (') will give the same functionality, + ' though it's preferable to avoid this when constructing the RFunction. + strTemp = strTemp.Replace(Chr(34), Chr(39)) + + 'wrap the entire string in double quotes + strTemp = Chr(34) & strTemp & Chr(34) + End If + + 'if object needs to be assigned to then create/update the assignment script (if needed) + ' and return the assignment script. Otherwise just return 'strTemp'. + Return MyBase.ToScript(strScript, strTemp) + End Function + + '''-------------------------------------------------------------------------------------------- + ''' + ''' Adds a parameter to this function. Sets the parameter's name to + ''' . + ''' Sets the parameter's argument to one of , + ''' , , + ''' or . + ''' + ''' + ''' (Optional) Name of the parameter. + ''' (Optional) The parameter value. + ''' (Optional) The R function parameter. + ''' (Optional) The R operator parameter. + ''' (Optional) The R code structure parameter. + ''' (Optional) True to include, false to exclude the + ''' argument name. + ''' (Optional) The relative position of the + ''' parameter in this object's parameter list. + '''-------------------------------------------------------------------------------------------- + Public Overrides Sub AddParameter(Optional strParameterName As String = "", Optional strParameterValue As String = "", Optional clsRFunctionParameter As RFunction = Nothing, Optional clsROperatorParameter As ROperator = Nothing, Optional clsRCodeStructureParameter As RCodeStructure = Nothing, Optional bIncludeArgumentName As Boolean = True, Optional iPosition As Integer = -1) + 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? + MyBase.AddParameter(strParameterName, strParameterValue, clsRFunctionParameter, clsROperatorParameter, clsRCodeStructureParameter, bIncludeArgumentName, iPosition) + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' + ''' If the R function already has a parameter with the same name then changes the parameter's + ''' value to the value in . Else adds + ''' to the object as a new parameter. + ''' + ''' This function also ensures that there is no existing parameter with the same position as + ''' the newly added/updated parameter. + ''' + ''' + ''' The new parameter to add. + '''-------------------------------------------------------------------------------------------- + Public Overrides Sub AddParameter(clsParam As RParameter) + 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? + MyBase.AddParameter(clsParam) + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' + ''' Returns the parameter object named . + ''' + ''' + ''' The name of the parameter to return. + ''' + ''' The parameter object named . If the parameter + ''' doesn't exist then returns 'Nothing'. + '''-------------------------------------------------------------------------------------------- + Public Overrides Function GetParameter(strName As String) As RParameter + Dim iTempIndex As Integer = -1 'TODO SJL remove this variable? + If Not clsParameters Is Nothing Then + iTempIndex = clsParameters.FindIndex(Function(x) x.strArgumentName = strName) + If iTempIndex <> -1 Then + Return clsParameters(iTempIndex) + End If + End If + Return Nothing + End Function + + ''' Clears this object to its blank/initial state. + Public Overrides Sub Clear() + SetRCommand("") + SetPackageName("") + MyBase.Clear() + End Sub + + ''' Clears the parameters. + Public Overrides Sub ClearParameters() + 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? + MyBase.ClearParameters() + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' Makes a deep copy of this object. + ''' + ''' A copy of this object. + '''-------------------------------------------------------------------------------------------- + Public Overrides Function Clone() As RCodeStructure + Dim clsRFunction As New RFunction + Dim clsRParam As RParameter + + 'RCode properties + 'todo. why not use the MyBase.Clone() for some of these inherited from the parent properties? + clsRFunction._rObjectToAssignTo = Me._rObjectToAssignTo + clsRFunction._rObjectNameToAssignTo = Me._rObjectNameToAssignTo + clsRFunction._rObjectTypeToAssignTo = Me._rObjectTypeToAssignTo + clsRFunction._rObjectFormatToAssignTo = Me._rObjectFormatToAssignTo + clsRFunction._rDataFrameNameToAddObjectTo = Me._rDataFrameNameToAddObjectTo + + clsRFunction.strAssignTo = strAssignTo + clsRFunction.strAssignToDataFrame = strAssignToDataFrame + clsRFunction.strAssignToColumn = strAssignToColumn + clsRFunction.bToBeAssigned = bToBeAssigned + clsRFunction.bIsAssigned = bIsAssigned + clsRFunction.bAssignToIsPrefix = bAssignToIsPrefix + clsRFunction.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames + clsRFunction.bInsertColumnBefore = bInsertColumnBefore + clsRFunction.iNumberOfAddedParameters = iNumberOfAddedParameters + clsRFunction.iPosition = iPosition + clsRFunction.iCallType = iCallType + clsRFunction.bExcludeAssignedFunctionOutput = bExcludeAssignedFunctionOutput + clsRFunction.bClearFromGlobal = bClearFromGlobal + clsRFunction.bToScriptAsRString = bToScriptAsRString + clsRFunction.Tag = Tag + For Each clsRParam In clsParameters + clsRFunction.AddParameter(clsRParam.Clone) + Next + + 'RFunction specific properties + clsRFunction.strPackageName = strPackageName + clsRFunction.strRCommand = strRCommand + + Return clsRFunction + End Function + + '''-------------------------------------------------------------------------------------------- + ''' Gets the number of parameters. + ''' + ''' The number of parameters. + '''-------------------------------------------------------------------------------------------- + Public ReadOnly Property iParameterCount() As Integer + Get + Return clsParameters.Count + End Get + End Property End Class \ No newline at end of file diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 47cc3710ad3..5372bf15766 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -101,11 +101,17 @@ Public Class RLink ''' The log window. Public txtLog As New TextBox - ''' True if the log window is defined - Public bLog As Boolean = False + ''' + ''' Is set to True when the log window is defined. + ''' If set to False, R scripts will not be logged. + ''' + Public bLogRScripts As Boolean = False - ''' True if the R output window is defined. - Public bOutput As Boolean = True + ''' + ''' Is set to True when the R output window is defined. + ''' If set to False, R scripts will not be shouwn in the output viewer + ''' + Public bOutputRscripts As Boolean = True ''' True to climate object exists. @@ -312,80 +318,6 @@ Public Class RLink Return bClose End Function - '''-------------------------------------------------------------------------------------------- - ''' This method executes the R script and displays - ''' the output as text or graph (determined by ). - ''' R commands may be split over multiple lines. This is only allowed if the - ''' non-final line ends with '+', ',', or '%>%'; or there are one or more '{' - ''' brackets that have not been closed with an equivalent '}' bracket. - ''' This function is named '...FromWindow' because it's designed to execute scripts - ''' entered by a human from a dialog window (e.g. a script window). These scripts - ''' may contain R commands split over multiple lines to make the commands more - ''' readable. - ''' - ''' The R script to execute. - ''' Shown as a comment. If this parameter is "" then shows - ''' as the comment. - ''' - ''' Any text at the end of that was not executed. - ''' If all the text in was executed then returns "". - ''' - '''-------------------------------------------------------------------------------------------- - Public Function RunScriptFromWindow(strNewScript As String, strNewComment As String) As String - Dim strScriptCmd As String = "" - - - 'for each line in script - For Each strScriptLine As String In strNewScript.Split(Environment.NewLine) - 'remove any comments (character '#' and anything after) - Dim iCommentPos As Integer = strScriptLine.IndexOf("#") - Select Case iCommentPos - Case 0 'a normal comment line (starts with '#') - Continue For - Case Is > 0 ' a line with an appended comment (e.g. 'x <- 1 # generate data' converted to 'x <- 1 ') - strScriptLine = strScriptLine.Substring(0, iCommentPos - 1) - End Select - - 'if line is empty or only whitespace then ignore line - Dim strTrimmedLine As String = strScriptLine.Trim(vbLf).Trim() - If strTrimmedLine.Length <= 0 Then - Continue For - End If - - 'else append line of script to command - strScriptCmd &= strScriptLine - - 'if line ends in a '+', ',', or '%>%'; or there are open curly braces; or open quotations, - ' then assume command is not complete - Dim cLastChar As Char = strTrimmedLine.Last - Dim strLast3Chars As String = "" - Dim iNumOpenRound As Integer = strScriptCmd.Where(Function(c) c = "("c).Count - Dim iNumClosedRound As Integer = strScriptCmd.Where(Function(c) c = ")"c).Count - Dim iNumOpenCurlies As Integer = strScriptCmd.Where(Function(c) c = "{"c).Count - Dim iNumClosedCurlies As Integer = strScriptCmd.Where(Function(c) c = "}"c).Count - Dim iNumDoubleQuotes As Integer = strScriptCmd.Where(Function(c) c = """"c).Count - If strTrimmedLine.Length >= 3 Then - strLast3Chars = strTrimmedLine.Substring(strTrimmedLine.Length - 3) - End If - If cLastChar = "+" OrElse cLastChar = "," OrElse strLast3Chars = "%>%" _ - OrElse iNumOpenRound <> iNumClosedRound _ - OrElse iNumOpenCurlies <> iNumClosedCurlies _ - OrElse iNumDoubleQuotes Mod 2 Then - Continue For - End If - - 'else execute command - Dim iCallType As Integer = 5 - If strScriptCmd.Contains(strInstatDataObject & "$get_graphs") Then - iCallType = 3 - End If - RunScript(strScriptCmd.Trim(vbLf), iCallType:=iCallType, strComment:=strNewComment, bSeparateThread:=False, bSilent:=False) - strScriptCmd = "" - strNewComment = "" - Next - Return strScriptCmd - End Function - ''' ''' Extracts all the complete runnable R commands from . ''' The command lines returned are re-formatted in a format that the R.Net engine can execute. @@ -393,6 +325,7 @@ Public Class RLink ''' R script command. Can be a multiline script command ''' an array that contains individual complete runnable R scripts Public Function GetRunnableCommandLines(strScript As String) As String() + 'todo. move this implementation to another module or class or R script library? Dim lstRunnableCommandLines As New List(Of String) Dim arrScriptCommands As String() = strScript.Split(New String() {Environment.NewLine, vbLf}, StringSplitOptions.RemoveEmptyEntries) Dim strSplitScriptCmd As String = "" @@ -553,7 +486,7 @@ Public Class RLink '''-------------------------------------------------------------------------------------------- Public Sub SetLog(tempLog As TextBox) txtLog = tempLog - bLog = True + bLogRScripts = True End Sub '''-------------------------------------------------------------------------------------------- @@ -768,6 +701,48 @@ Public Class RLink End Try End Sub + '''-------------------------------------------------------------------------------------------- + ''' Returns an assignment statement of the form: + ''' + ''' <- + ''' + ''' If is multiple lines then the assignment is done + ''' on 's last line. All previous lines are returned + ''' unchanged. + ''' + ''' + ''' The variable to assign to (i.e. the left side of the + ''' assignment). + ''' The script command(s) that contains the command to assign (i.e. the right side of the + ''' assignment). + ''' + ''' The constructed assignment statement. + ''' + '''-------------------------------------------------------------------------------------------- + Public Function ConstructAssignTo(strAssignTo As String, strScripts As String) As String + + 'todo. move to another class or module or in R script library? + If String.IsNullOrEmpty(strScripts) Then + Return "" + Else + Dim strReconstructed As String = "" + Dim arrScriptParts As String() + 'if string contains more than one line, assign the last line of the multi-line string + arrScriptParts = GetRunnableCommandLines(strScripts) + If arrScriptParts.Length > 1 Then + 're-assemble the string, apart from the last line + strReconstructed = String.Join(Environment.NewLine, arrScriptParts, 0, arrScriptParts.Length - 1) + 'assign the last line of the multi-line string + strReconstructed = strReconstructed & Environment.NewLine & strAssignTo & " <- " & arrScriptParts.Last + Else + 'else if string has only one line, then assign to the whole string + strReconstructed = strAssignTo & " <- " & strScripts + End If + Return strReconstructed + End If + + End Function + '''-------------------------------------------------------------------------------------------- ''' ''' This method executes the R script and displays the output. The @@ -813,11 +788,11 @@ Public Class RLink ''' if false and an exception is raised then open a message box that ''' displays the exception message. '''-------------------------------------------------------------------------------------------- - Public Sub RunScript(strScript As String, Optional iCallType As Integer = 0, Optional strComment As String = "", Optional bSeparateThread As Boolean = True, Optional bShowWaitDialogOverride As Nullable(Of Boolean) = Nothing, Optional bUpdateGrids As Boolean = True, Optional bSilent As Boolean = False) + Public Sub RunScript(strScript As String, Optional iCallType As Integer = 0, Optional bAddOutputInLog As Boolean = True, Optional strComment As String = "", Optional bSeparateThread As Boolean = True, Optional bShowWaitDialogOverride As Nullable(Of Boolean) = Nothing, Optional bUpdateGrids As Boolean = True, Optional bSilent As Boolean = False) Dim strCapturedScript As String Dim expTemp As RDotNet.SymbolicExpression Dim strTemp As String = "" - Dim strOutput As String + Dim strOutput As String = "" Dim strScriptWithComment As String Dim strSplitScript As String Dim strTempGraphsDirectory As String @@ -833,21 +808,21 @@ Public Class RLink Directory.CreateDirectory(strTempGraphsDirectory) End If - strOutput = "" + ' if comment provided If strComment <> "" Then ' Prefix comment to script, e.g. "# Code generated by the dialog, Import Dataset" & vbCrLf & "new_RDS <- readRDS(file=""C:/Users/myName ... - strComment = GetFormattedComment(strComment) - strScriptWithComment = strComment & Environment.NewLine & strScript + strScriptWithComment = GetFormattedComment(strComment) & Environment.NewLine & strScript Else strScriptWithComment = strScript End If - If bLog Then + + If bLogRScripts Then txtLog.Text = txtLog.Text & strScriptWithComment & Environment.NewLine End If ' if the output window is defined then output comments (if exists) and script (if 'bShowCommands' is true). - If bOutput Then + If bOutputRscripts Then clsOutputLogger.AddRScript(strScriptWithComment) End If @@ -855,40 +830,79 @@ Public Class RLink 'If strScript.Length > 2000 Then ' MsgBox("The following command cannot be run because it exceeds the character limit of 2000 characters for a command in R-Instat." & Environment.NewLine & strScript & Environment.NewLine & Environment.NewLine & "It may be possible to run the command directly in R.", MsgBoxStyle.Critical, "Cannot run command") - ' if script output should be ignored, or returned as a graph - If iCallType = 0 OrElse iCallType = 3 Then - Try - 'if output should be returned as a graph - If iCallType = 3 Then - If strGraphDisplayOption = "view_output_window" OrElse strGraphDisplayOption = "view_separate_window" Then - clsPNGFunction.SetPackageName("grDevices") - clsPNGFunction.SetRCommand("png") - clsPNGFunction.AddParameter("filename", Chr(34) & System.IO.Path.Combine(strTempGraphsDirectory & "/Graph.png").Replace("\", "/") & Chr(34)) - 'TODO make these options - clsPNGFunction.AddParameter("width", 4000) - clsPNGFunction.AddParameter("height", 4000) - clsPNGFunction.AddParameter("res", 500) - bSuccess = Evaluate(clsPNGFunction.ToScript(), bSilent:=True, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) - ' Temporary solution to being unable to save graphs in a temporary location for display. - ' This can occur if System.IO.Path.GetTempPath() returns a path that is not writable. - If Not bSuccess Then - Evaluate("graphics.off()", bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) - strGraphDisplayOption = "view_R_viewer" - MsgBox("A problem occured saving graphs in the temporary location " & strTempGraphsDirectory & vbNewLine & vbNewLine & "To ensure graphs can still be viewed, graphs will now appear in a pop up R viewer." & vbNewLine & "Restarting R-Instat and/or your machine usually resolves this. You can change this setting back in Tools > Options: 'Graph Display' if this later becomes resolved.", MsgBoxStyle.Exclamation) + Try + 'get the last R script command + Dim strLastScript As String = GetRunnableCommandLines(strScript).Last + If strLastScript.Contains("view_object") Then 'if output should be returned as a file + Try + Dim strNewAssignedToScript As String = ConstructAssignTo(strTempAssignTo, strScript) + Evaluate(strNewAssignedToScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) + expTemp = GetSymbol(strTempAssignTo) + If expTemp IsNot Nothing Then + 'get the file path name + strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) + If strTemp <> "" Then + If bAddOutputInLog Then + clsOutputLogger.AddFileOutput(strTemp) + Else + Dim frmMaximiseOutput As New frmMaximiseOutput + frmMaximiseOutput.Show(strFileName:=strTemp) + End If End If - 'need to boost resolution of the devices, it's not as good as with ggsave. End If - End If - If iCallType = 3 AndAlso strGraphDisplayOption = "view_R_viewer" Then - Evaluate(strScript, bSilent:=bSilent, bSeparateThread:=False, bShowWaitDialogOverride:=bShowWaitDialogOverride) - Else 'TODO SJL this is the only line executed if iCallType is 0. Move outside if block to simplify logic? - Evaluate(strScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) - End If - If iCallType = 3 Then - If strGraphDisplayOption = "view_output_window" OrElse strGraphDisplayOption = "view_separate_window" Then + Catch e As Exception + MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + End Try + ElseIf strLastScript.Contains("view_html_object") Then 'if output should be returned as a html then + Try + Dim strNewAssignedToScript As String = ConstructAssignTo(strTempAssignTo, strScript) + Evaluate(strNewAssignedToScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) + expTemp = GetSymbol(strTempAssignTo) + If expTemp IsNot Nothing Then + 'get the html file path name + strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) + If strTemp <> "" Then + If bAddOutputInLog Then + clsOutputLogger.AddHtmlOutput(strTemp) + Else + Dim frmMaximiseOutput As New frmMaximiseOutput + frmMaximiseOutput.Show(strFileName:=strTemp) + End If + End If + End If + Catch e As Exception + MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + End Try + + ElseIf iCallType = 0 Then 'if script output should be ignored. to do. deprecated + Evaluate(strScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) + ElseIf iCallType = 3 Then + 'else if output should be returned as a graph. + 'todo. deprecate this block. currently used view last graph mainly and viewing graph objects dialog + + If strGraphDisplayOption = "view_output_window" OrElse strGraphDisplayOption = "view_separate_window" Then + 'run R command for taking a snapshot of the graph image + clsPNGFunction.SetPackageName("grDevices") + clsPNGFunction.SetRCommand("png") + clsPNGFunction.AddParameter("filename", Chr(34) & System.IO.Path.Combine(strTempGraphsDirectory & "/Graph.png").Replace("\", "/") & Chr(34)) + 'TODO make these options + clsPNGFunction.AddParameter("width", 4000) + clsPNGFunction.AddParameter("height", 4000) + clsPNGFunction.AddParameter("res", 500) + ' temporary solution to being unable to save graphs in a temporary location for display. + ' this can occur if System.IO.Path.GetTempPath() returns a path that is not writable. + bSuccess = Evaluate(clsPNGFunction.ToScript(), bSilent:=True, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) + If bSuccess Then + 'need to boost resolution of the devices, it's not as good as with ggsave. + Evaluate(strScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) + 'switch of taking of graph snapshots + 'todo. not quite sure if this would work, otherwise find the right way to close the appropriate devices. + Evaluate("graphics.off()", bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) + + 'Get the graph images for display. + 'todo in future do the following 'add an R script (maybe in the form of one of our methods) that copies divices to the temp directory, using the default device production... use dev.list() and dev.copy() with arguments device = the devices in the list and which = jpeg devices with different paths leading to the temp directory, using a paste() method to find different names for the files - Evaluate("graphics.off()", bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) 'not quite sure if this would work, otherwise find the right way to close the appropriate devices. 'clsEngine.Evaluate("ggsave(" & Chr(34) & strTempGraphsDirectory.Replace("\", "/") & "Graph.jpg" & Chr(34) & ")") 'This sub is used to display graphics in the output window when necessary. 'This sub is checking the temp directory "R_Instat_Temp_Graphs", created during setup to see if there are any graphs to display. If there are some, then it sends them to the output window, and removes them from the directory. @@ -902,15 +916,13 @@ Public Class RLink lstTempGraphFiles = Nothing MsgBox(e.Message & Environment.NewLine & "A problem occured in getting the content of the temporary graphs directory: " & strTempGraphsDirectory & " Possible exceptions are described here: https://msdn.microsoft.com/en-us/library/kf41fdf4.aspx", MsgBoxStyle.Critical) End Try - If lstTempGraphFiles IsNot Nothing Then - iNumberOfFiles = CStr(lstTempGraphFiles.Count) - End If - If iNumberOfFiles > 0 Then + If lstTempGraphFiles IsNot Nothing AndAlso lstTempGraphFiles.Count > 0 Then For Each strFileName As String In lstTempGraphFiles If strGraphDisplayOption = "view_output_window" Then clsOutputLogger.AddImageOutput(strFileName) ElseIf strGraphDisplayOption = "view_separate_window" Then - frmMain.AddGraphForm(strFileName) + Dim frmMaximiseOutput As New frmMaximiseOutput + frmMaximiseOutput.Show(strTemp) End If Try My.Computer.FileSystem.DeleteFile(strFileName) @@ -919,76 +931,90 @@ Public Class RLink End Try Next End If + Else + 'switch of taking of graph snapshots + 'todo. not quite sure if this would work, otherwise find the right way to close the appropriate devices. + Evaluate("graphics.off()", bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) + strGraphDisplayOption = "view_R_viewer" + MsgBox("A problem occured saving graphs in the temporary location " & strTempGraphsDirectory & vbNewLine & vbNewLine & "To ensure graphs can still be viewed, graphs will now appear in a pop up R viewer." & vbNewLine & "Restarting R-Instat and/or your machine usually resolves this. You can change this setting back in Tools > Options: 'Graph Display' if this later becomes resolved.", MsgBoxStyle.Exclamation) + 'will launch the R viewer + Evaluate(strScript, bSilent:=bSilent, bSeparateThread:=False, bShowWaitDialogOverride:=bShowWaitDialogOverride) End If + + ElseIf strGraphDisplayOption = "view_R_viewer" Then + Evaluate(strScript, bSilent:=bSilent, bSeparateThread:=False, bShowWaitDialogOverride:=bShowWaitDialogOverride) End If - Catch e As Exception - MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") - End Try - ElseIf iCallType = 1 OrElse iCallType = 4 Then 'else if script output should be stored in a temp variable - ' TODO SJL In RInstat, iCallType only seems to be 0, 2 or 3. Are call types 1 and 4 used? - Try - 'TODO check this is valid syntax in all cases - ' i.e. this is potentially: x <- y <- 1 - Evaluate(strTempAssignTo & " <- " & strScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) - expTemp = GetSymbol(strTempAssignTo) - If expTemp IsNot Nothing Then - strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) - strOutput = strOutput & strTemp & Environment.NewLine - End If - Catch e As Exception - MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") - End Try - Else ' else if script output should not be ignored, not stored in a graph and not stored in a variable - 'if script comes from script window, or else script is a single line - If iCallType = 5 OrElse strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray) = -1 Then - 'wrap the whole script in 'capture.output' - ' 'capture.output' returns the result of the R command as a string. - ' This string can be displayed later in the output window. - strCapturedScript = "capture.output(" & strScript & ")" - Else 'else if script is multi-line - 'execute all lines apart from the final line - strSplitScript = Left(strScript, strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray)) - If strSplitScript <> "" Then - Try - bError = Not Evaluate(strSplitScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) - Catch e As Exception - MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") - End Try + + ElseIf iCallType = 1 OrElse iCallType = 4 Then 'else if script output should be stored in a temp variable + ' TODO SJL In RInstat, iCallType only seems to be 0, 2 or 3. Are call types 1 and 4 used? + Try + 'TODO check this is valid syntax in all cases + ' i.e. this is potentially: x <- y <- 1 + Evaluate(strTempAssignTo & " <- " & strScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) + expTemp = GetSymbol(strTempAssignTo) + If expTemp IsNot Nothing Then + strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) + strOutput = strOutput & strTemp & Environment.NewLine + End If + Catch e As Exception + MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + End Try + Else ' else if script output should not be ignored, not stored in a graph and not stored in a variable + 'if script comes from script window, or else script is a single line + If iCallType = 5 OrElse strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray) = -1 Then + 'wrap the whole script in 'capture.output' + ' 'capture.output' returns the result of the R command as a string. + ' This string can be displayed later in the output window. + strCapturedScript = "capture.output(" & strScript & ")" + Else 'else if script is multi-line + 'execute all lines apart from the final line + strSplitScript = Left(strScript, strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray)) + If strSplitScript <> "" Then + Try + bError = Not Evaluate(strSplitScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) + Catch e As Exception + MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + End Try + End If + 'ensure that the final line of the script will be executed next + strSplitScript = Right(strScript, strScript.Length - strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray) - 2) + 'wrap the final line in 'capture.output' so that when it's executed, the result can be displayed in the output window + strCapturedScript = "capture.output(" & strSplitScript & ")" End If - 'ensure that the final line of the script will be executed next - strSplitScript = Right(strScript, strScript.Length - strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray) - 2) - 'wrap the final line in 'capture.output' so that when it's executed, the result can be displayed in the output window - strCapturedScript = "capture.output(" & strSplitScript & ")" - End If - Try - If Not bError Then - 'execute the script and assign the result to a temporary variable - If Evaluate(strTempAssignTo & " <- " & strCapturedScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) Then - expTemp = GetSymbol(strTempAssignTo) - Evaluate("rm(" & strTempAssignTo & ")", bSilent:=True) - If expTemp IsNot Nothing Then - strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) - If strTemp <> "" Then - 'ensure that the data returned from the script will be displayed in the output window - strOutput = strOutput & strTemp & Environment.NewLine + Try + If Not bError Then + 'execute the script and assign the result to a temporary variable + If Evaluate(strTempAssignTo & " <- " & strCapturedScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) Then + expTemp = GetSymbol(strTempAssignTo) + Evaluate("rm(" & strTempAssignTo & ")", bSilent:=True) + If expTemp IsNot Nothing Then + strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) + If strTemp <> "" Then + 'ensure that the data returned from the script will be displayed in the output window + strOutput = strOutput & strTemp & Environment.NewLine + End If End If End If End If - End If - Catch e As Exception - MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") - End Try - End If + Catch e As Exception + MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + End Try + End If + + Catch e As Exception + MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + End Try ' if output window is defined, and there's something to output - If bOutput AndAlso strOutput IsNot Nothing AndAlso strOutput <> "" Then + If bOutputRscripts AndAlso strOutput IsNot Nothing AndAlso strOutput <> "" Then ' if output should be sent to web browser - If iCallType = 4 Then - ' rtbOutput.AddIntoWebBrowser(strHtmlCode:=strOutput) - 'TODO Add to web browser - Else - clsOutputLogger.AddStringOutput(strOutput) - End If + 'If iCallType = 4 Then + ' ' rtbOutput.AddIntoWebBrowser(strHtmlCode:=strOutput) + ' 'TODO Add to web browser + 'Else + ' clsOutputLogger.AddStringOutput(strOutput) + 'End If + clsOutputLogger.AddStringOutput(strOutput) End If AppendToAutoSaveLog(strScriptWithComment & Environment.NewLine) If bUpdateGrids Then @@ -996,6 +1022,126 @@ Public Class RLink End If End Sub + '''-------------------------------------------------------------------------------------------- + ''' This method executes the R script and displays + ''' the output as text or graph (determined by ). + ''' R commands may be split over multiple lines. This is only allowed if the + ''' non-final line ends with '+', ',', or '%>%'; or there are one or more '{' + ''' brackets that have not been closed with an equivalent '}' bracket. + ''' This function is named '...FromWindow' because it's designed to execute scripts + ''' entered by a human from a dialog window (e.g. a script window). These scripts + ''' may contain R commands split over multiple lines to make the commands more + ''' readable. + ''' + ''' The R script to execute. + ''' Shown as a comment. If this parameter is "" then shows + ''' as the comment. + ''' + ''' Any text at the end of that was not executed. + ''' If all the text in was executed then returns "". + ''' + '''-------------------------------------------------------------------------------------------- + Public Function RunScriptFromWindow(strNewScript As String, strNewComment As String) As String + Dim strScriptCmd As String = "" + + + 'for each line in script + For Each strScriptLine As String In strNewScript.Split(Environment.NewLine) + 'remove any comments (character '#' and anything after) + Dim iCommentPos As Integer = strScriptLine.IndexOf("#") + Select Case iCommentPos + Case 0 'a normal comment line (starts with '#') + Continue For + Case Is > 0 ' a line with an appended comment (e.g. 'x <- 1 # generate data' converted to 'x <- 1 ') + strScriptLine = strScriptLine.Substring(0, iCommentPos - 1) + End Select + + 'if line is empty or only whitespace then ignore line + Dim strTrimmedLine As String = strScriptLine.Trim(vbLf).Trim() + If strTrimmedLine.Length <= 0 Then + Continue For + End If + + 'else append line of script to command + strScriptCmd &= strScriptLine + + 'if line ends in a '+', ',', or '%>%'; or there are open curly braces; or open quotations, + ' then assume command is not complete + Dim cLastChar As Char = strTrimmedLine.Last + Dim strLast3Chars As String = "" + Dim iNumOpenRound As Integer = strScriptCmd.Where(Function(c) c = "("c).Count + Dim iNumClosedRound As Integer = strScriptCmd.Where(Function(c) c = ")"c).Count + Dim iNumOpenCurlies As Integer = strScriptCmd.Where(Function(c) c = "{"c).Count + Dim iNumClosedCurlies As Integer = strScriptCmd.Where(Function(c) c = "}"c).Count + Dim iNumDoubleQuotes As Integer = strScriptCmd.Where(Function(c) c = """"c).Count + If strTrimmedLine.Length >= 3 Then + strLast3Chars = strTrimmedLine.Substring(strTrimmedLine.Length - 3) + End If + If cLastChar = "+" OrElse cLastChar = "," OrElse strLast3Chars = "%>%" _ + OrElse iNumOpenRound <> iNumClosedRound _ + OrElse iNumOpenCurlies <> iNumClosedCurlies _ + OrElse iNumDoubleQuotes Mod 2 Then + Continue For + End If + + 'else execute command + Dim iCallType As Integer = 5 + If strScriptCmd.Contains(strInstatDataObject & "$get_graphs") Then + iCallType = 3 + End If + RunScript(strScriptCmd.Trim(vbLf), iCallType:=iCallType, strComment:=strNewComment, bSeparateThread:=False, bSilent:=False) + strScriptCmd = "" + strNewComment = "" + Next + Return strScriptCmd + End Function + + + '''-------------------------------------------------------------------------------------------- + ''' View last graph. + ''' + ''' (Optional) If true then view last graph as plotly. + '''-------------------------------------------------------------------------------------------- + Public Sub ViewLastGraph(Optional bAsPlotly As Boolean = False, + Optional bInRViewer As Boolean = False) + Dim clsLastGraph As New RFunction + clsLastGraph.SetRCommand(strInstatDataObject & "$get_last_graph") + clsLastGraph.AddParameter("print_graph", "FALSE", iPosition:=0) + If bAsPlotly Then + Dim clsViewObjectFunction As New RFunction + Dim clsInteractivePlot As New RFunction + + clsInteractivePlot.SetPackageName("plotly") + clsInteractivePlot.SetRCommand("ggplotly") + clsInteractivePlot.AddParameter("p", clsRFunctionParameter:=clsLastGraph, iPosition:=0) + + clsViewObjectFunction.SetRCommand("view_object") + clsViewObjectFunction.AddParameter(strParameterName:="object", + clsRFunctionParameter:=clsInteractivePlot) + clsViewObjectFunction.AddParameter(strParameterName:="object_format", + strParameterValue:=Chr(34) & RObjectFormat.Html & Chr(34)) + + 'Need to set iCallType = 2 to obtain a graph in an interactive viewer. + RunScript(clsViewObjectFunction.ToScript(), bAddOutputInLog:=False, strComment:="View last graph as Plotly", bSeparateThread:=False) + ElseIf bInRViewer Then + Dim strGlobalGraphDisplayOption As String + 'store the current set graph display option, to restore after display + strGlobalGraphDisplayOption = Me.strGraphDisplayOption + Me.strGraphDisplayOption = "view_R_viewer" + clsLastGraph.AddParameter("print_graph", "TRUE", iPosition:=0) + RunScript(clsLastGraph.ToScript(), iCallType:=3, bAddOutputInLog:=False, strComment:="View last graph", bSeparateThread:=False) + 'restore the graph display option + Me.strGraphDisplayOption = strGlobalGraphDisplayOption + Else + Dim clsViewObjectFunction As New RFunction + clsViewObjectFunction.SetRCommand("view_object") + clsViewObjectFunction.AddParameter(strParameterName:="object", clsRFunctionParameter:=clsLastGraph) + clsViewObjectFunction.AddParameter(strParameterName:="object_format", + strParameterValue:=Chr(34) & RObjectFormat.Image & Chr(34)) + RunScript(clsViewObjectFunction.ToScript(), bAddOutputInLog:=False, strComment:="View last graph", bSeparateThread:=False) + End If + End Sub + '''-------------------------------------------------------------------------------------------- ''' Executes the the R script and returns the result ''' as a 'SymbolicExpression' object. @@ -1232,7 +1378,7 @@ Public Class RLink frmSetupLoading.Show() End If End If - While thrRScript.IsAlive + While thrRScript.IsAlive If bErrorMessageOpen Then If Not RuntimeInformation.IsOSPlatform(OSPlatform.Linux) Then frmSetupLoading.Close() @@ -1748,27 +1894,6 @@ Public Class RLink Return iColumnCount End Function - '''-------------------------------------------------------------------------------------------- - ''' Gets the names of the data frame's models. - ''' - ''' (Optional) The data frame name. - ''' - ''' The names of the data frame's models. - '''-------------------------------------------------------------------------------------------- - Public Function GetModelNames(Optional strDataFrameName As String = "") As List(Of String) - Return GetNames(strDataFrameName, "$get_model_names") - End Function - - '''-------------------------------------------------------------------------------------------- - ''' Gets the names of the data frame's tables. - ''' - ''' (Optional) The data frame name. - ''' - ''' The names of the data frame's tables. - '''-------------------------------------------------------------------------------------------- - Public Function GetTableNames(Optional strDataFrameName As String = "") As List(Of String) - Return GetNames(strDataFrameName, "$get_table_names") - End Function '''-------------------------------------------------------------------------------------------- ''' Gets the names of the data frame's filters. @@ -1791,27 +1916,7 @@ Public Class RLink Public Function GetColumnSelectionNames(strDataFrameName As String) As List(Of String) Return GetNames(strDataFrameName, "$get_column_selection_names") End Function - '''-------------------------------------------------------------------------------------------- - ''' Gets the names of the data frame's graphs. - ''' - ''' (Optional) The data frame name. - ''' - ''' The names of the data frame's graphs. - '''-------------------------------------------------------------------------------------------- - Public Function GetGraphNames(Optional strDataFrameName As String = "") As List(Of String) - Return GetNames(strDataFrameName, "$get_graph_names") - End Function - '''-------------------------------------------------------------------------------------------- - ''' Gets the names of the data frame's survs. - ''' - ''' (Optional) The data frame name. - ''' - ''' The names of the data frame's survs. - '''-------------------------------------------------------------------------------------------- - Public Function GetSurvNames(Optional strDataFrameName As String = "") As List(Of String) - Return GetNames(strDataFrameName, "$get_surv_names") - End Function '''-------------------------------------------------------------------------------------------- ''' Gets the names of the data frame's keys. @@ -1863,6 +1968,35 @@ Public Class RLink End Function + '''-------------------------------------------------------------------------------------------- + ''' + ''' Gets the names of the data frame's objects. + ''' + ''' (Optional) The data frame name. + ''' (Optional) The object type label to get. + ''' + '''-------------------------------------------------------------------------------------------- + Public Function GetObjectNames(Optional strDataFrameName As String = "", + Optional strRObjectTypeLabel As String = "") As List(Of String) + Dim lstObjectNames As New List(Of String) + Dim clsGetObjectNamesRFunction As New RFunction + Dim expNames As SymbolicExpression + + clsGetObjectNamesRFunction.SetRCommand(strInstatDataObject & "$get_object_names") + If Not String.IsNullOrEmpty(strDataFrameName) Then + clsGetObjectNamesRFunction.AddParameter("data_name", Chr(34) & strDataFrameName & Chr(34)) + End If + If Not String.IsNullOrEmpty(strRObjectTypeLabel) Then + clsGetObjectNamesRFunction.AddParameter("object_type_label", Chr(34) & strDataFrameName & Chr(34)) + End If + expNames = RunInternalScriptGetValue(clsGetObjectNamesRFunction.ToScript(), bSilent:=True) + If expNames IsNot Nothing AndAlso Not expNames.Type = Internals.SymbolicExpressionType.Null Then + lstObjectNames = expNames.AsCharacter.ToArray.ToList + End If + Return lstObjectNames + End Function + + '''-------------------------------------------------------------------------------------------- ''' Gets the data type of the column in the ''' data frame. @@ -2203,34 +2337,6 @@ Public Class RLink RunScript(clsCreateIO.ToScript(), strComment:="Creating New Instat Object") End Sub - '''-------------------------------------------------------------------------------------------- - ''' View last graph. - ''' - ''' (Optional) If true then view last graph as plotly. - '''-------------------------------------------------------------------------------------------- - Public Sub ViewLastGraph(Optional bAsPlotly As Boolean = False) - Dim clsLastGraph As New RFunction - clsLastGraph.SetRCommand(strInstatDataObject & "$get_last_graph") - - If bAsPlotly Then - Dim clsInteractivePlot As New RFunction - clsLastGraph.AddParameter("print_graph", "FALSE", iPosition:=0) - clsInteractivePlot.SetPackageName("plotly") - clsInteractivePlot.SetRCommand("ggplotly") - clsInteractivePlot.AddParameter("p", clsRFunctionParameter:=clsLastGraph, iPosition:=0) - 'Need to set iCallType = 2 to obtain a graph in an interactive viewer. - RunScript(clsInteractivePlot.ToScript(), iCallType:=2, strComment:="View last graph as Plotly", bSeparateThread:=False) - Else - Dim strGlobalGraphDisplayOption As String - 'store the current set graph display option, to restore after display - strGlobalGraphDisplayOption = Me.strGraphDisplayOption - Me.strGraphDisplayOption = "view_R_viewer" - RunScript(clsLastGraph.ToScript(), iCallType:=3, strComment:="View last graph", bSeparateThread:=False) - 'restore the graph display option - Me.strGraphDisplayOption = strGlobalGraphDisplayOption - End If - End Sub - '''-------------------------------------------------------------------------------------------- ''' Prefixes each line of text in with '# '. ''' @@ -2280,7 +2386,7 @@ Public Class RLink 'Note: this function is not currently called but it will be used in future ' functionality to populate dialogs from script. ' Please do not delete this function. (@lloyddewit 24/11/21) - + 'temporary object that retrieves the output from the environment Dim strTempAssignTo As String = ".temp_func" Dim expTemp As SymbolicExpression @@ -2354,4 +2460,4 @@ Public Class RLink Return lstRParameters End Function -End Class +End Class \ No newline at end of file diff --git a/instat/clsROperator.vb b/instat/clsROperator.vb index e6a8e14501d..988c35eaf81 100644 --- a/instat/clsROperator.vb +++ b/instat/clsROperator.vb @@ -11,7 +11,7 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . '''-------------------------------------------------------------------------------------------- @@ -28,304 +28,308 @@ ''' ''' '''-------------------------------------------------------------------------------------------- -Public Class ROperator - Inherits RCodeStructure - - 'TODO Danny Parsons 15/04/20: - ' There is some tidying of the code that can be done around this class relating to its - ' inheritance from RCodeStructure. - ' - ' There are a number of functions which have both an RFunction And an ROperator as optional - ' parameters, with the idea that you usually pass in one or the other. These could be - ' replaced with a single RCodeStructure parameter. There are also classes which may store both - ' an RFunction and an ROperator but only ever expect one, so this may be able to be replaced - ' by an RCodeStructure. - ' - ' There may be some functions within the RFunction And ROperator classes which could be pushed - ' down to the RCodeStructure because they actually do the same thing regardless of which one it - ' is. I think this has mostly already been done but I think I remember seeing one example of - ' this recently. <-- Note from Lloyd - GetParameter? - ' - ' Both of these things exist because originally these two classes were separate before we - ' realised they should inherit from a common class. So RCodeStructure was created later as the - ' parent class, so I think you can see the remains of this sort of being done backwards. - ' - ' Another reason this hasn't been done is that much of this tidying up could affect every single - ' dialog so it's not clear how we coordinate this with all developers so that it doesn't cause a - ' huge number of conflicts. But it's something we should do at some point to improve the code. - - ''' If true then include the operation symbol in the script even if there's - ''' only a single parameter (e.g. to create a script such as '!x'). - ''' Else don't include the operation symbol in a script with only one parameter. - ''' - Public bForceIncludeOperation As Boolean = False - - ''' The operation symbol (e.g. "+"). - Public strOperation As String - - ''' If true then enclose first parameter in brackets. - Public bBrackets As Boolean = True - - ''' If true then enclose second, and any subsequent parameters, in brackets. - Public bAllBrackets As Boolean = False - - ''' If true then put spaces around operator e.g. " + ". - Public bSpaceAroundOperation As Boolean = True - - '''-------------------------------------------------------------------------------------------- - ''' Constructor. - ''' - ''' (Optional) The operation symbol (e.g. "+"). - ''' (Optional) If true then enclose first parameter in brackets. - ''' - '''-------------------------------------------------------------------------------------------- - Public Sub New(Optional strOp As String = "", Optional bBracketsTemp As Boolean = True) - SetOperation(strOp, bBracketsTemp) - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' Sets the operation's symbol (e.g. "+") and defines whether to include the first - ''' operation parameter in brackets. - ''' - ''' The operation symbol (e.g. "+"). - ''' (Optional) If true then enclose first parameter in brackets. - ''' - '''-------------------------------------------------------------------------------------------- - Public Sub SetOperation(strTemp As String, Optional bBracketsTemp As Boolean = True) - strOperation = strTemp - bBrackets = bBracketsTemp - bIsAssigned = False - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' - ''' Creates, updates and returns the script that generates the expected output for this - ''' operation. An operation will have an operation symbol (e.g. '+') and parameters. - ''' - ''' This function aims to create a human-readable script. It appends the first parameter - ''' to and then appends the operation symbol (e.g. appends'x+'). - ''' It then appends the remaining parameters using the same symbol (e.g. 'x+y+z'). - ''' Finally it calls the 'ToScript' function of the base class. This completes the script - ''' by adding the assignment part. - ''' - ''' Additional options: - ''' - ''' - ''' If there's only one parameter, then the operation symbol may be put first (e.g. '!x'). - ''' - ''' The operation symbol may be surrounded by spaces (e.g. '+' becomes ' + '). - ''' - ''' Each parameter may be surrounded by brackets '()'. - ''' - ''' "There is one further use of the operator which has proved really useful. That - ''' is the use of the ',' operator to define additional optional parameters. This Is - ''' sort of a cheat because of course it is not an operator in R but there are a number - ''' of cases where it has been useful to manage a set of parameters together. This also - ''' provides the reason why in that context it can make sense for that operator to have - ''' no operator symbols and no parameters!" - David Stern 15/04/20 - ''' - ''' - ''' [in,out] (Optional) The existing script including any - ''' assignment part. - ''' This script is passed to the 'ToScript' function of the base - ''' class. This script is also passed to the 'ToScript' function - ''' of the operator's parameters. - ''' (Optional) The current expression to assign. The script for - ''' this operation is appended to this parameter and then passed - ''' to the 'ToScript' function of the base class. - ''' - ''' If object needs to be assigned to, then returns the complete assign-to script. - ''' Else returns the script without an assignment part. - '''-------------------------------------------------------------------------------------------- - Public Overrides Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String - Dim strAdjustedOperation As String - 'TODO SJL 03/04/20 Parts of this function seem to duplicate the ToScript function in RFunction. Refactor? - - SortParameters() - - 'if needed, put spaces around operator e.g. " <- " - If bSpaceAroundOperation Then - strAdjustedOperation = Chr(32) & strOperation & Chr(32) - Else - strAdjustedOperation = strOperation - End If - - 'if operator has parameters - If clsParameters.Count > 0 Then - - 'process first parameter - If clsParameters(0) IsNot Nothing Then - 'if first parameter needs brackets, then append the first parameter inside brackets - If clsParameters(0).bIsOperator AndAlso bBrackets Then - strTemp = strTemp & "(" & clsParameters(0).ToScript(strScript) & ")" - Else 'else just append the parameter without brackets - strTemp = strTemp & clsParameters(0).ToScript(strScript) - End If - - 'if there is only one parameter, and we need to include the operation symbol - If bForceIncludeOperation AndAlso clsParameters.Count = 1 Then - 'if parameter's position is 0 then put parameter's script on left side - If clsParameters(0).Position = 0 Then - strTemp = strTemp & strAdjustedOperation - Else 'else put parameter's script on right side - strTemp = strAdjustedOperation & strTemp - End If - End If - Else - 'TODO message - End If - - 'for each remaining parameter (starting from 2nd parameter) - 'Note: an operation may have >2 parameters (e.g. x+y+z ...) - For Each clsParam In clsParameters.GetRange(1, clsParameters.Count - 1) - 'append the operator to the script - strTemp = strTemp & strAdjustedOperation - - 'if parameter needs brackets, then append the parameter inside brackets - 'TODO SJL 03/04/20 repeats code above. Refactor? - If bAllBrackets AndAlso (clsParam.bIsFunction OrElse clsParam.bIsOperator) Then - strTemp = strTemp & "(" & clsParam.ToScript(strScript) & ")" - Else 'else just append the parameter without brackets - strTemp = strTemp & clsParam.ToScript(strScript) - End If - Next - - 'if the string needs to be passed directly to R - ' TODO SJL 15/04/20 This functionality is duplicated in RFunction. Move this functionality to a shared function in RCodeStructure? - If bToScriptAsRString Then - 'if string is intended to be assigned to a script then raise error (because modified script will no longer suitable for this) - 'TODO SJL 03/04/20 if we only allow these 3 flags to be accessed through 'set/get' functions then we can guarantee that this error situation doesn't occur - 'TODO Legacy comment:'should also check assignment of parameters' - If bToBeAssigned OrElse bIsAssigned Then - MsgBox("Developer error: Using bToScriptAsRString = True when RFunction is assigned will not produce the correct script. Remove assignment to use this options correctly.") - End If - - 'replace double quotes with single quotes - ' Note : Can't have double quotes ("") in the string because strTemp will be wrapped - ' with "". In most cases single quotes (') will give the same functionality, - ' though it's preferable to avoid this when constructing the RFunction. - strTemp = strTemp.Replace(Chr(34), Chr(39)) - - 'wrap the entire string in double quotes - strTemp = Chr(34) & strTemp & Chr(34) - End If - End If - - 'if object needs to be assigned to, then create/update the assignment script (if needed) - ' and return the assignment script. Otherwise just return 'strTemp'. - Return MyBase.ToScript(strScript, strTemp) - End Function - - '''-------------------------------------------------------------------------------------------- - ''' - ''' If the object already has a parameter with the same name then changes the parameter's - ''' value to the value in . Else adds - ''' to the object as a new parameter. - ''' - ''' This function also ensures that there is no existing parameter with the same position as - ''' the newly added/updated parameter. - ''' - ''' Note about parameter names for operators: They are not named in the display when you do - ''' ToScript() on an ROperator compared to an RFunction, but they are named within this - ''' class since the naming is used to be able to identify them for the purpose of adding - ''' and removing. We usually use the naming convention "0", "1", "2"... for ROperator - ''' parameters so that there is no confusion about the order. - ''' - ''' Note about parameter position for operators: By default, when the script for this - ''' operator is created then the operator is placed after the parameter (e.g. 'x + '). - ''' However, if an operator has only one parameter, and that parameter's position is 0, - ''' then this parameter will be put on the left side of the operation symbol (e.g. '!x'). - ''' - ''' - ''' The new parameter to add. - '''-------------------------------------------------------------------------------------------- - Public Overrides Sub AddParameter(clsParam As RParameter) - clsParam.bIncludeArgumentName = False 'an operator parameter shouldn't be named in the script - MyBase.AddParameter(clsParam) - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' - ''' Returns the parameter object named . - ''' - ''' - ''' The name of the parameter to return. - ''' - ''' A new RParameter object. - '''-------------------------------------------------------------------------------------------- - Public Overrides Function GetParameter(strName As String) As RParameter - Dim iTempIndex As Integer = -1 - If Not clsParameters Is Nothing Then - iTempIndex = clsParameters.FindIndex(Function(x) x.strArgumentName = strName) - If iTempIndex <> -1 Then - Return clsParameters(iTempIndex) - End If - End If - Return Nothing - End Function - - ''' Removes all additional parameters. - Public Sub RemoveAllAdditionalParameters() - 'TODO SJL 03/04/20 this function is only used by 1 dialog. This hints that there may be an alternative way of doing the same thing. - ' It's also suspicious that the other RCodeStructure classes don't have such a function. Why is it only needed for an operator? - ' Can this function be removed? - SortParameters() 'This is used to bring the parameter with position 0 to the front if it exists, then clear all the others using range. - If clsParameters(0).Position = 0 Then - If clsParameters.Count > 1 Then - clsParameters.RemoveRange(1, clsParameters.Count - 1) - End If - Else - clsParameters.Clear() - End If - OnParametersChanged() - End Sub - - ''' Clears this object to its blank/initial state. - Public Overrides Sub Clear() - SetOperation("") - bForceIncludeOperation = False - MyBase.Clear() - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' Makes a deep copy of this object. - ''' - ''' A copy of this object. - '''-------------------------------------------------------------------------------------------- - Public Overrides Function Clone() As RCodeStructure - Dim clsTempROperator As New ROperator - Dim clsRParam As RParameter - - 'RCode properties - clsTempROperator.strAssignTo = strAssignTo - clsTempROperator.strAssignToDataFrame = strAssignToDataFrame - clsTempROperator.strAssignToColumn = strAssignToColumn - clsTempROperator.strAssignToModel = strAssignToModel - clsTempROperator.strAssignToGraph = strAssignToGraph - clsTempROperator.strAssignToTable = strAssignToTable - clsTempROperator.bToBeAssigned = bToBeAssigned - clsTempROperator.bIsAssigned = bIsAssigned - clsTempROperator.bAssignToIsPrefix = bAssignToIsPrefix - clsTempROperator.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames - clsTempROperator.bInsertColumnBefore = bInsertColumnBefore - clsTempROperator.iNumberOfAddedParameters = iNumberOfAddedParameters - clsTempROperator.iPosition = iPosition - clsTempROperator.iCallType = iCallType - clsTempROperator.bExcludeAssignedFunctionOutput = bExcludeAssignedFunctionOutput - clsTempROperator.bClearFromGlobal = bClearFromGlobal - clsTempROperator.bToScriptAsRString = bToScriptAsRString - clsTempROperator.Tag = Tag - For Each clsRParam In clsParameters - clsTempROperator.AddParameter(clsRParam.Clone()) - Next - - 'ROperator specific properties - clsTempROperator.bForceIncludeOperation = bForceIncludeOperation - clsTempROperator.strOperation = strOperation - clsTempROperator.bBrackets = bBrackets - clsTempROperator.bAllBrackets = bAllBrackets - clsTempROperator.bSpaceAroundOperation = bSpaceAroundOperation - - Return clsTempROperator - End Function +Public Class ROperator + Inherits RCodeStructure + + 'TODO Danny Parsons 15/04/20: + ' There is some tidying of the code that can be done around this class relating to its + ' inheritance from RCodeStructure. + ' + ' There are a number of functions which have both an RFunction And an ROperator as optional + ' parameters, with the idea that you usually pass in one or the other. These could be + ' replaced with a single RCodeStructure parameter. There are also classes which may store both + ' an RFunction and an ROperator but only ever expect one, so this may be able to be replaced + ' by an RCodeStructure. + ' + ' There may be some functions within the RFunction And ROperator classes which could be pushed + ' down to the RCodeStructure because they actually do the same thing regardless of which one it + ' is. I think this has mostly already been done but I think I remember seeing one example of + ' this recently. <-- Note from Lloyd - GetParameter? + ' + ' Both of these things exist because originally these two classes were separate before we + ' realised they should inherit from a common class. So RCodeStructure was created later as the + ' parent class, so I think you can see the remains of this sort of being done backwards. + ' + ' Another reason this hasn't been done is that much of this tidying up could affect every single + ' dialog so it's not clear how we coordinate this with all developers so that it doesn't cause a + ' huge number of conflicts. But it's something we should do at some point to improve the code. + + ''' If true then include the operation symbol in the script even if there's + ''' only a single parameter (e.g. to create a script such as '!x'). + ''' Else don't include the operation symbol in a script with only one parameter. + ''' + Public bForceIncludeOperation As Boolean = False + + ''' The operation symbol (e.g. "+"). + Public strOperation As String + + ''' If true then enclose first parameter in brackets. + Public bBrackets As Boolean = True + + ''' If true then enclose second, and any subsequent parameters, in brackets. + Public bAllBrackets As Boolean = False + + ''' If true then put spaces around operator e.g. " + ". + Public bSpaceAroundOperation As Boolean = True + + '''-------------------------------------------------------------------------------------------- + ''' Constructor. + ''' + ''' (Optional) The operation symbol (e.g. "+"). + ''' (Optional) If true then enclose first parameter in brackets. + ''' + '''-------------------------------------------------------------------------------------------- + Public Sub New(Optional strOp As String = "", Optional bBracketsTemp As Boolean = True) + SetOperation(strOp, bBracketsTemp) + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' Sets the operation's symbol (e.g. "+") and defines whether to include the first + ''' operation parameter in brackets. + ''' + ''' The operation symbol (e.g. "+"). + ''' (Optional) If true then enclose first parameter in brackets. + ''' + '''-------------------------------------------------------------------------------------------- + Public Sub SetOperation(strTemp As String, Optional bBracketsTemp As Boolean = True) + strOperation = strTemp + bBrackets = bBracketsTemp + bIsAssigned = False + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' + ''' Creates, updates and returns the script that generates the expected output for this + ''' operation. An operation will have an operation symbol (e.g. '+') and parameters. + ''' + ''' This function aims to create a human-readable script. It appends the first parameter + ''' to and then appends the operation symbol (e.g. appends'x+'). + ''' It then appends the remaining parameters using the same symbol (e.g. 'x+y+z'). + ''' Finally it calls the 'ToScript' function of the base class. This completes the script + ''' by adding the assignment part. + ''' + ''' Additional options: + ''' + ''' + ''' If there's only one parameter, then the operation symbol may be put first (e.g. '!x'). + ''' + ''' The operation symbol may be surrounded by spaces (e.g. '+' becomes ' + '). + ''' + ''' Each parameter may be surrounded by brackets '()'. + ''' + ''' "There is one further use of the operator which has proved really useful. That + ''' is the use of the ',' operator to define additional optional parameters. This Is + ''' sort of a cheat because of course it is not an operator in R but there are a number + ''' of cases where it has been useful to manage a set of parameters together. This also + ''' provides the reason why in that context it can make sense for that operator to have + ''' no operator symbols and no parameters!" - David Stern 15/04/20 + ''' + ''' + ''' [in,out] (Optional) The existing script including any + ''' assignment part. + ''' This script is passed to the 'ToScript' function of the base + ''' class. This script is also passed to the 'ToScript' function + ''' of the operator's parameters. + ''' (Optional) The current expression to assign. The script for + ''' this operation is appended to this parameter and then passed + ''' to the 'ToScript' function of the base class. + ''' + ''' If object needs to be assigned to, then returns the complete assign-to script. + ''' Else returns the script without an assignment part. + '''-------------------------------------------------------------------------------------------- + Public Overrides Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String + Dim strAdjustedOperation As String + 'TODO SJL 03/04/20 Parts of this function seem to duplicate the ToScript function in RFunction. Refactor? + + SortParameters() + + 'if needed, put spaces around operator e.g. " <- " + If bSpaceAroundOperation Then + strAdjustedOperation = Chr(32) & strOperation & Chr(32) + Else + strAdjustedOperation = strOperation + End If + + 'if operator has parameters + If clsParameters.Count > 0 Then + + 'process first parameter + If clsParameters(0) IsNot Nothing Then + 'if first parameter needs brackets, then append the first parameter inside brackets + If clsParameters(0).bIsOperator AndAlso bBrackets Then + strTemp = strTemp & "(" & clsParameters(0).ToScript(strScript) & ")" + Else 'else just append the parameter without brackets + strTemp = strTemp & clsParameters(0).ToScript(strScript) + End If + + 'if there is only one parameter, and we need to include the operation symbol + If bForceIncludeOperation AndAlso clsParameters.Count = 1 Then + 'if parameter's position is 0 then put parameter's script on left side + If clsParameters(0).Position = 0 Then + strTemp = strTemp & strAdjustedOperation + Else 'else put parameter's script on right side + strTemp = strAdjustedOperation & strTemp + End If + End If + Else + 'TODO message + End If + + 'for each remaining parameter (starting from 2nd parameter) + 'Note: an operation may have >2 parameters (e.g. x+y+z ...) + For Each clsParam In clsParameters.GetRange(1, clsParameters.Count - 1) + 'append the operator to the script + strTemp = strTemp & strAdjustedOperation + + 'if parameter needs brackets, then append the parameter inside brackets + 'TODO SJL 03/04/20 repeats code above. Refactor? + If bAllBrackets AndAlso (clsParam.bIsFunction OrElse clsParam.bIsOperator) Then + strTemp = strTemp & "(" & clsParam.ToScript(strScript) & ")" + Else 'else just append the parameter without brackets + strTemp = strTemp & clsParam.ToScript(strScript) + End If + Next + + 'if the string needs to be passed directly to R + ' TODO SJL 15/04/20 This functionality is duplicated in RFunction. Move this functionality to a shared function in RCodeStructure? + If bToScriptAsRString Then + 'if string is intended to be assigned to a script then raise error (because modified script will no longer suitable for this) + 'TODO SJL 03/04/20 if we only allow these 3 flags to be accessed through 'set/get' functions then we can guarantee that this error situation doesn't occur + 'TODO Legacy comment:'should also check assignment of parameters' + If bToBeAssigned OrElse bIsAssigned Then + MsgBox("Developer error: Using bToScriptAsRString = True when RFunction is assigned will not produce the correct script. Remove assignment to use this options correctly.") + End If + + 'replace double quotes with single quotes + ' Note : Can't have double quotes ("") in the string because strTemp will be wrapped + ' with "". In most cases single quotes (') will give the same functionality, + ' though it's preferable to avoid this when constructing the RFunction. + strTemp = strTemp.Replace(Chr(34), Chr(39)) + + 'wrap the entire string in double quotes + strTemp = Chr(34) & strTemp & Chr(34) + End If + End If + + 'if object needs to be assigned to, then create/update the assignment script (if needed) + ' and return the assignment script. Otherwise just return 'strTemp'. + Return MyBase.ToScript(strScript, strTemp) + End Function + + '''-------------------------------------------------------------------------------------------- + ''' + ''' If the object already has a parameter with the same name then changes the parameter's + ''' value to the value in . Else adds + ''' to the object as a new parameter. + ''' + ''' This function also ensures that there is no existing parameter with the same position as + ''' the newly added/updated parameter. + ''' + ''' Note about parameter names for operators: They are not named in the display when you do + ''' ToScript() on an ROperator compared to an RFunction, but they are named within this + ''' class since the naming is used to be able to identify them for the purpose of adding + ''' and removing. We usually use the naming convention "0", "1", "2"... for ROperator + ''' parameters so that there is no confusion about the order. + ''' + ''' Note about parameter position for operators: By default, when the script for this + ''' operator is created then the operator is placed after the parameter (e.g. 'x + '). + ''' However, if an operator has only one parameter, and that parameter's position is 0, + ''' then this parameter will be put on the left side of the operation symbol (e.g. '!x'). + ''' + ''' + ''' The new parameter to add. + '''-------------------------------------------------------------------------------------------- + Public Overrides Sub AddParameter(clsParam As RParameter) + clsParam.bIncludeArgumentName = False 'an operator parameter shouldn't be named in the script + MyBase.AddParameter(clsParam) + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' + ''' Returns the parameter object named . + ''' + ''' + ''' The name of the parameter to return. + ''' + ''' A new RParameter object. + '''-------------------------------------------------------------------------------------------- + Public Overrides Function GetParameter(strName As String) As RParameter + Dim iTempIndex As Integer = -1 + If Not clsParameters Is Nothing Then + iTempIndex = clsParameters.FindIndex(Function(x) x.strArgumentName = strName) + If iTempIndex <> -1 Then + Return clsParameters(iTempIndex) + End If + End If + Return Nothing + End Function + + ''' Removes all additional parameters. + Public Sub RemoveAllAdditionalParameters() + 'TODO SJL 03/04/20 this function is only used by 1 dialog. This hints that there may be an alternative way of doing the same thing. + ' It's also suspicious that the other RCodeStructure classes don't have such a function. Why is it only needed for an operator? + ' Can this function be removed? + SortParameters() 'This is used to bring the parameter with position 0 to the front if it exists, then clear all the others using range. + If clsParameters(0).Position = 0 Then + If clsParameters.Count > 1 Then + clsParameters.RemoveRange(1, clsParameters.Count - 1) + End If + Else + clsParameters.Clear() + End If + OnParametersChanged() + End Sub + + ''' Clears this object to its blank/initial state. + Public Overrides Sub Clear() + SetOperation("") + bForceIncludeOperation = False + MyBase.Clear() + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' Makes a deep copy of this object. + ''' + ''' A copy of this object. + '''-------------------------------------------------------------------------------------------- + Public Overrides Function Clone() As RCodeStructure + Dim clsTempROperator As New ROperator + Dim clsRParam As RParameter + + 'RCode properties + 'todo. why not use the MyBase.Clone() for some of these inherited from the parent properties? + clsTempROperator._rObjectToAssignTo = Me._rObjectToAssignTo + clsTempROperator._rObjectNameToAssignTo = Me._rObjectNameToAssignTo + clsTempROperator._rObjectTypeToAssignTo = Me._rObjectTypeToAssignTo + clsTempROperator._rObjectFormatToAssignTo = Me._rObjectFormatToAssignTo + clsTempROperator._rDataFrameNameToAddObjectTo = Me._rDataFrameNameToAddObjectTo + + clsTempROperator.strAssignTo = strAssignTo + clsTempROperator.strAssignToDataFrame = strAssignToDataFrame + clsTempROperator.strAssignToColumn = strAssignToColumn + clsTempROperator.bToBeAssigned = bToBeAssigned + clsTempROperator.bIsAssigned = bIsAssigned + clsTempROperator.bAssignToIsPrefix = bAssignToIsPrefix + clsTempROperator.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames + clsTempROperator.bInsertColumnBefore = bInsertColumnBefore + clsTempROperator.iNumberOfAddedParameters = iNumberOfAddedParameters + clsTempROperator.iPosition = iPosition + clsTempROperator.iCallType = iCallType + clsTempROperator.bExcludeAssignedFunctionOutput = bExcludeAssignedFunctionOutput + clsTempROperator.bClearFromGlobal = bClearFromGlobal + clsTempROperator.bToScriptAsRString = bToScriptAsRString + clsTempROperator.Tag = Tag + For Each clsRParam In clsParameters + clsTempROperator.AddParameter(clsRParam.Clone()) + Next + + 'ROperator specific properties + clsTempROperator.bForceIncludeOperation = bForceIncludeOperation + clsTempROperator.strOperation = strOperation + clsTempROperator.bBrackets = bBrackets + clsTempROperator.bAllBrackets = bAllBrackets + clsTempROperator.bSpaceAroundOperation = bSpaceAroundOperation + + Return clsTempROperator + End Function End Class \ No newline at end of file diff --git a/instat/clsRSyntax.vb b/instat/clsRSyntax.vb index 439d889405d..384362501a2 100644 --- a/instat/clsRSyntax.vb +++ b/instat/clsRSyntax.vb @@ -94,8 +94,6 @@ Public Class RSyntax ''' Public iCallType As Integer = 0 'TODO SJL 07/04/20 Use enumeration? - ''' TODO SJL 07/04/20 Not used. Remove? - Public bHTMLOutput As Boolean = False ''' The script associated with the base R code. Public strScript As String 'TODO SJL This is only used in the RSyntax.GetScript function. Also cleared once in ucrButtons. Refactor? diff --git a/instat/dlgOneVariableSummarise.Designer.vb b/instat/dlgOneVariableSummarise.Designer.vb index 64e6efcf4bd..9733ef8ed43 100644 --- a/instat/dlgOneVariableSummarise.Designer.vb +++ b/instat/dlgOneVariableSummarise.Designer.vb @@ -11,311 +11,311 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . - -Partial Class dlgOneVariableSummarise - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - - Private Sub InitializeComponent() - Me.lblSelectedVariable = New System.Windows.Forms.Label() - Me.lblMaxSum = New System.Windows.Forms.Label() - Me.cmdSummaries = New System.Windows.Forms.Button() - Me.rdoCustomised = New System.Windows.Forms.RadioButton() - Me.rdoDefault = New System.Windows.Forms.RadioButton() - Me.ucrPnlSummaries = New instat.UcrPanel() - Me.ucrChkDisplaySummariesAsRows = New instat.ucrCheck() - Me.ucrChkDisplayVariablesAsRows = New instat.ucrCheck() - Me.ucrNudMaxSum = New instat.ucrNud() - Me.ucrChkOmitMissing = New instat.ucrCheck() - Me.ucrSelectorOneVarSummarise = New instat.ucrSelectorByDataFrameAddRemove() - Me.ucrReceiverOneVarSummarise = New instat.ucrReceiverMultiple() - Me.ucrBase = New instat.ucrButtons() - Me.ucrInputMarginName = New instat.ucrInputTextBox() - Me.lblMarginName = New System.Windows.Forms.Label() - Me.ucrChkDisplayMargins = New instat.ucrCheck() - Me.rdoSkim = New System.Windows.Forms.RadioButton() - Me.cmdMissingOptions = New System.Windows.Forms.Button() - Me.SuspendLayout() - ' - 'lblSelectedVariable - ' - Me.lblSelectedVariable.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSelectedVariable.Location = New System.Drawing.Point(258, 64) - Me.lblSelectedVariable.Name = "lblSelectedVariable" - Me.lblSelectedVariable.Size = New System.Drawing.Size(142, 14) - Me.lblSelectedVariable.TabIndex = 1 - Me.lblSelectedVariable.Tag = "Selected_Variable" - Me.lblSelectedVariable.Text = "Variable(s) to Summarise:" - ' - 'lblMaxSum - ' - Me.lblMaxSum.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMaxSum.Location = New System.Drawing.Point(13, 253) - Me.lblMaxSum.Name = "lblMaxSum" - Me.lblMaxSum.Size = New System.Drawing.Size(189, 24) - Me.lblMaxSum.TabIndex = 7 - Me.lblMaxSum.Text = "Maximum Factor Levels Shown:" - ' - 'cmdSummaries - ' - Me.cmdSummaries.AutoSize = True - Me.cmdSummaries.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdSummaries.Location = New System.Drawing.Point(261, 215) - Me.cmdSummaries.Name = "cmdSummaries" - Me.cmdSummaries.Size = New System.Drawing.Size(120, 23) - Me.cmdSummaries.TabIndex = 6 - Me.cmdSummaries.Tag = "Summaries" - Me.cmdSummaries.Text = "Choose Summaries..." - Me.cmdSummaries.UseVisualStyleBackColor = True - ' - 'rdoCustomised - ' - Me.rdoCustomised.Appearance = System.Windows.Forms.Appearance.Button - Me.rdoCustomised.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoCustomised.FlatAppearance.BorderSize = 2 - Me.rdoCustomised.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoCustomised.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.rdoCustomised.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoCustomised.Location = New System.Drawing.Point(247, 13) - Me.rdoCustomised.Name = "rdoCustomised" - Me.rdoCustomised.Size = New System.Drawing.Size(90, 27) - Me.rdoCustomised.TabIndex = 22 - Me.rdoCustomised.TabStop = True - Me.rdoCustomised.Text = "Customised" - Me.rdoCustomised.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.rdoCustomised.UseVisualStyleBackColor = True - ' - 'rdoDefault - ' - Me.rdoDefault.Appearance = System.Windows.Forms.Appearance.Button - Me.rdoDefault.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoDefault.FlatAppearance.BorderSize = 2 - Me.rdoDefault.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoDefault.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.rdoDefault.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoDefault.Location = New System.Drawing.Point(82, 13) - Me.rdoDefault.Name = "rdoDefault" - Me.rdoDefault.Size = New System.Drawing.Size(83, 27) - Me.rdoDefault.TabIndex = 21 - Me.rdoDefault.TabStop = True - Me.rdoDefault.Text = "Defaults" - Me.rdoDefault.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.rdoDefault.UseVisualStyleBackColor = True - ' - 'ucrPnlSummaries - ' - Me.ucrPnlSummaries.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrPnlSummaries.Location = New System.Drawing.Point(73, 11) - Me.ucrPnlSummaries.Name = "ucrPnlSummaries" - Me.ucrPnlSummaries.Size = New System.Drawing.Size(275, 29) - Me.ucrPnlSummaries.TabIndex = 20 - ' - 'ucrChkDisplaySummariesAsRows - ' - Me.ucrChkDisplaySummariesAsRows.AutoSize = True - Me.ucrChkDisplaySummariesAsRows.Checked = False - Me.ucrChkDisplaySummariesAsRows.Location = New System.Drawing.Point(10, 267) - Me.ucrChkDisplaySummariesAsRows.Name = "ucrChkDisplaySummariesAsRows" - Me.ucrChkDisplaySummariesAsRows.Size = New System.Drawing.Size(241, 23) - Me.ucrChkDisplaySummariesAsRows.TabIndex = 19 - ' - 'ucrChkDisplayVariablesAsRows - ' - Me.ucrChkDisplayVariablesAsRows.AutoSize = True - Me.ucrChkDisplayVariablesAsRows.Checked = False - Me.ucrChkDisplayVariablesAsRows.Location = New System.Drawing.Point(10, 290) - Me.ucrChkDisplayVariablesAsRows.Name = "ucrChkDisplayVariablesAsRows" - Me.ucrChkDisplayVariablesAsRows.Size = New System.Drawing.Size(227, 23) - Me.ucrChkDisplayVariablesAsRows.TabIndex = 18 - ' - 'ucrNudMaxSum - ' - Me.ucrNudMaxSum.AutoSize = True - Me.ucrNudMaxSum.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudMaxSum.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudMaxSum.Location = New System.Drawing.Point(261, 248) - Me.ucrNudMaxSum.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudMaxSum.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudMaxSum.Name = "ucrNudMaxSum" - Me.ucrNudMaxSum.Size = New System.Drawing.Size(50, 20) - Me.ucrNudMaxSum.TabIndex = 8 - Me.ucrNudMaxSum.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrChkOmitMissing - ' - Me.ucrChkOmitMissing.AutoSize = True - Me.ucrChkOmitMissing.Checked = False - Me.ucrChkOmitMissing.Location = New System.Drawing.Point(10, 314) - Me.ucrChkOmitMissing.Name = "ucrChkOmitMissing" - Me.ucrChkOmitMissing.Size = New System.Drawing.Size(190, 23) - Me.ucrChkOmitMissing.TabIndex = 9 - ' - 'ucrSelectorOneVarSummarise - ' - Me.ucrSelectorOneVarSummarise.AutoSize = True - Me.ucrSelectorOneVarSummarise.bDropUnusedFilterLevels = False - Me.ucrSelectorOneVarSummarise.bShowHiddenColumns = False - Me.ucrSelectorOneVarSummarise.bUseCurrentFilter = True - Me.ucrSelectorOneVarSummarise.Location = New System.Drawing.Point(10, 55) - Me.ucrSelectorOneVarSummarise.Margin = New System.Windows.Forms.Padding(0) - Me.ucrSelectorOneVarSummarise.Name = "ucrSelectorOneVarSummarise" - Me.ucrSelectorOneVarSummarise.Size = New System.Drawing.Size(213, 183) - Me.ucrSelectorOneVarSummarise.TabIndex = 0 - ' - 'ucrReceiverOneVarSummarise - ' - Me.ucrReceiverOneVarSummarise.AutoSize = True - Me.ucrReceiverOneVarSummarise.frmParent = Me - Me.ucrReceiverOneVarSummarise.Location = New System.Drawing.Point(261, 82) - Me.ucrReceiverOneVarSummarise.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverOneVarSummarise.Name = "ucrReceiverOneVarSummarise" - Me.ucrReceiverOneVarSummarise.Selector = Nothing - Me.ucrReceiverOneVarSummarise.Size = New System.Drawing.Size(120, 100) - Me.ucrReceiverOneVarSummarise.strNcFilePath = "" - Me.ucrReceiverOneVarSummarise.TabIndex = 2 - Me.ucrReceiverOneVarSummarise.ucrSelector = Nothing - ' - 'ucrBase - ' - Me.ucrBase.AutoSize = True - Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrBase.Location = New System.Drawing.Point(8, 336) - Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(408, 52) - Me.ucrBase.TabIndex = 11 - ' - 'ucrInputMarginName - ' - Me.ucrInputMarginName.AddQuotesIfUnrecognised = True - Me.ucrInputMarginName.AutoSize = True - Me.ucrInputMarginName.IsMultiline = False - Me.ucrInputMarginName.IsReadOnly = False - Me.ucrInputMarginName.Location = New System.Drawing.Point(206, 243) - Me.ucrInputMarginName.Name = "ucrInputMarginName" - Me.ucrInputMarginName.Size = New System.Drawing.Size(74, 21) - Me.ucrInputMarginName.TabIndex = 25 - ' - 'lblMarginName - ' - Me.lblMarginName.AutoSize = True - Me.lblMarginName.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMarginName.Location = New System.Drawing.Point(159, 246) - Me.lblMarginName.Name = "lblMarginName" - Me.lblMarginName.Size = New System.Drawing.Size(41, 13) - Me.lblMarginName.TabIndex = 24 - Me.lblMarginName.Text = "Name :" - ' - 'ucrChkDisplayMargins - ' - Me.ucrChkDisplayMargins.AutoSize = True - Me.ucrChkDisplayMargins.Checked = False - Me.ucrChkDisplayMargins.Location = New System.Drawing.Point(10, 246) - Me.ucrChkDisplayMargins.Name = "ucrChkDisplayMargins" - Me.ucrChkDisplayMargins.Size = New System.Drawing.Size(150, 23) - Me.ucrChkDisplayMargins.TabIndex = 23 - ' - 'rdoSkim - ' - Me.rdoSkim.Appearance = System.Windows.Forms.Appearance.Button - Me.rdoSkim.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoSkim.FlatAppearance.BorderSize = 2 - Me.rdoSkim.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoSkim.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.rdoSkim.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoSkim.Location = New System.Drawing.Point(162, 13) - Me.rdoSkim.Name = "rdoSkim" - Me.rdoSkim.Size = New System.Drawing.Size(87, 27) - Me.rdoSkim.TabIndex = 26 - Me.rdoSkim.TabStop = True - Me.rdoSkim.Text = "Skim" - Me.rdoSkim.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.rdoSkim.UseVisualStyleBackColor = True - ' - 'cmdMissingOptions - ' - Me.cmdMissingOptions.Enabled = False - Me.cmdMissingOptions.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdMissingOptions.Location = New System.Drawing.Point(206, 311) - Me.cmdMissingOptions.Name = "cmdMissingOptions" - Me.cmdMissingOptions.Size = New System.Drawing.Size(62, 26) - Me.cmdMissingOptions.TabIndex = 27 - Me.cmdMissingOptions.Tag = "MissingOptions" - Me.cmdMissingOptions.Text = "Options" - Me.cmdMissingOptions.UseVisualStyleBackColor = True - ' - 'dlgOneVariableSummarise - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi - Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(421, 395) - Me.Controls.Add(Me.cmdMissingOptions) - Me.Controls.Add(Me.rdoSkim) - Me.Controls.Add(Me.ucrInputMarginName) - Me.Controls.Add(Me.lblMarginName) - Me.Controls.Add(Me.ucrChkDisplayMargins) - Me.Controls.Add(Me.rdoCustomised) - Me.Controls.Add(Me.rdoDefault) - Me.Controls.Add(Me.ucrPnlSummaries) - Me.Controls.Add(Me.ucrChkDisplaySummariesAsRows) - Me.Controls.Add(Me.ucrChkDisplayVariablesAsRows) - Me.Controls.Add(Me.ucrNudMaxSum) - Me.Controls.Add(Me.ucrChkOmitMissing) - Me.Controls.Add(Me.ucrSelectorOneVarSummarise) - Me.Controls.Add(Me.ucrReceiverOneVarSummarise) - Me.Controls.Add(Me.ucrBase) - Me.Controls.Add(Me.lblSelectedVariable) - Me.Controls.Add(Me.cmdSummaries) - Me.Controls.Add(Me.lblMaxSum) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "dlgOneVariableSummarise" - Me.ShowIcon = False - Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen - Me.Tag = "One_Variable_summarise" - Me.Text = "One Variable Summarise" - Me.ResumeLayout(False) - Me.PerformLayout() - - End Sub - Friend WithEvents lblSelectedVariable As Label - Friend WithEvents ucrBase As ucrButtons - Friend WithEvents ucrReceiverOneVarSummarise As ucrReceiverMultiple - Friend WithEvents ucrSelectorOneVarSummarise As ucrSelectorByDataFrameAddRemove - Friend WithEvents ucrChkOmitMissing As ucrCheck - Friend WithEvents lblMaxSum As Label - Friend WithEvents ucrNudMaxSum As ucrNud - Friend WithEvents cmdSummaries As Button - Friend WithEvents ucrChkDisplaySummariesAsRows As ucrCheck - Friend WithEvents ucrChkDisplayVariablesAsRows As ucrCheck - Friend WithEvents ucrPnlSummaries As UcrPanel - Friend WithEvents rdoCustomised As RadioButton - Friend WithEvents rdoDefault As RadioButton - Friend WithEvents ucrInputMarginName As ucrInputTextBox - Friend WithEvents lblMarginName As Label - Friend WithEvents ucrChkDisplayMargins As ucrCheck - Friend WithEvents rdoSkim As RadioButton - Friend WithEvents cmdMissingOptions As Button + +Partial Class dlgOneVariableSummarise + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + + Private Sub InitializeComponent() + Me.lblSelectedVariable = New System.Windows.Forms.Label() + Me.lblMaxSum = New System.Windows.Forms.Label() + Me.cmdSummaries = New System.Windows.Forms.Button() + Me.rdoCustomised = New System.Windows.Forms.RadioButton() + Me.rdoDefault = New System.Windows.Forms.RadioButton() + Me.ucrPnlSummaries = New instat.UcrPanel() + Me.ucrChkDisplaySummariesAsRows = New instat.ucrCheck() + Me.ucrChkDisplayVariablesAsRows = New instat.ucrCheck() + Me.ucrNudMaxSum = New instat.ucrNud() + Me.ucrChkOmitMissing = New instat.ucrCheck() + Me.ucrSelectorOneVarSummarise = New instat.ucrSelectorByDataFrameAddRemove() + Me.ucrReceiverOneVarSummarise = New instat.ucrReceiverMultiple() + Me.ucrBase = New instat.ucrButtons() + Me.ucrInputMarginName = New instat.ucrInputTextBox() + Me.lblMarginName = New System.Windows.Forms.Label() + Me.ucrChkDisplayMargins = New instat.ucrCheck() + Me.rdoSkim = New System.Windows.Forms.RadioButton() + Me.cmdMissingOptions = New System.Windows.Forms.Button() + Me.SuspendLayout() + ' + 'lblSelectedVariable + ' + Me.lblSelectedVariable.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblSelectedVariable.Location = New System.Drawing.Point(258, 64) + Me.lblSelectedVariable.Name = "lblSelectedVariable" + Me.lblSelectedVariable.Size = New System.Drawing.Size(142, 14) + Me.lblSelectedVariable.TabIndex = 1 + Me.lblSelectedVariable.Tag = "Selected_Variable" + Me.lblSelectedVariable.Text = "Variable(s) to Summarise:" + ' + 'lblMaxSum + ' + Me.lblMaxSum.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblMaxSum.Location = New System.Drawing.Point(13, 253) + Me.lblMaxSum.Name = "lblMaxSum" + Me.lblMaxSum.Size = New System.Drawing.Size(189, 24) + Me.lblMaxSum.TabIndex = 7 + Me.lblMaxSum.Text = "Maximum Factor Levels Shown:" + ' + 'cmdSummaries + ' + Me.cmdSummaries.AutoSize = True + Me.cmdSummaries.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdSummaries.Location = New System.Drawing.Point(261, 215) + Me.cmdSummaries.Name = "cmdSummaries" + Me.cmdSummaries.Size = New System.Drawing.Size(120, 23) + Me.cmdSummaries.TabIndex = 6 + Me.cmdSummaries.Tag = "Summaries" + Me.cmdSummaries.Text = "Choose Summaries..." + Me.cmdSummaries.UseVisualStyleBackColor = True + ' + 'rdoCustomised + ' + Me.rdoCustomised.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoCustomised.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoCustomised.FlatAppearance.BorderSize = 2 + Me.rdoCustomised.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoCustomised.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoCustomised.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoCustomised.Location = New System.Drawing.Point(247, 13) + Me.rdoCustomised.Name = "rdoCustomised" + Me.rdoCustomised.Size = New System.Drawing.Size(90, 27) + Me.rdoCustomised.TabIndex = 22 + Me.rdoCustomised.TabStop = True + Me.rdoCustomised.Text = "Customised" + Me.rdoCustomised.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoCustomised.UseVisualStyleBackColor = True + ' + 'rdoDefault + ' + Me.rdoDefault.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoDefault.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoDefault.FlatAppearance.BorderSize = 2 + Me.rdoDefault.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoDefault.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoDefault.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoDefault.Location = New System.Drawing.Point(82, 13) + Me.rdoDefault.Name = "rdoDefault" + Me.rdoDefault.Size = New System.Drawing.Size(83, 27) + Me.rdoDefault.TabIndex = 21 + Me.rdoDefault.TabStop = True + Me.rdoDefault.Text = "Defaults" + Me.rdoDefault.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoDefault.UseVisualStyleBackColor = True + ' + 'ucrPnlSummaries + ' + Me.ucrPnlSummaries.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlSummaries.Location = New System.Drawing.Point(73, 11) + Me.ucrPnlSummaries.Name = "ucrPnlSummaries" + Me.ucrPnlSummaries.Size = New System.Drawing.Size(275, 29) + Me.ucrPnlSummaries.TabIndex = 20 + ' + 'ucrChkDisplaySummariesAsRows + ' + Me.ucrChkDisplaySummariesAsRows.AutoSize = True + Me.ucrChkDisplaySummariesAsRows.Checked = False + Me.ucrChkDisplaySummariesAsRows.Location = New System.Drawing.Point(10, 267) + Me.ucrChkDisplaySummariesAsRows.Name = "ucrChkDisplaySummariesAsRows" + Me.ucrChkDisplaySummariesAsRows.Size = New System.Drawing.Size(241, 23) + Me.ucrChkDisplaySummariesAsRows.TabIndex = 19 + ' + 'ucrChkDisplayVariablesAsRows + ' + Me.ucrChkDisplayVariablesAsRows.AutoSize = True + Me.ucrChkDisplayVariablesAsRows.Checked = False + Me.ucrChkDisplayVariablesAsRows.Location = New System.Drawing.Point(10, 290) + Me.ucrChkDisplayVariablesAsRows.Name = "ucrChkDisplayVariablesAsRows" + Me.ucrChkDisplayVariablesAsRows.Size = New System.Drawing.Size(227, 23) + Me.ucrChkDisplayVariablesAsRows.TabIndex = 18 + ' + 'ucrNudMaxSum + ' + Me.ucrNudMaxSum.AutoSize = True + Me.ucrNudMaxSum.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudMaxSum.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudMaxSum.Location = New System.Drawing.Point(261, 248) + Me.ucrNudMaxSum.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudMaxSum.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudMaxSum.Name = "ucrNudMaxSum" + Me.ucrNudMaxSum.Size = New System.Drawing.Size(50, 20) + Me.ucrNudMaxSum.TabIndex = 8 + Me.ucrNudMaxSum.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkOmitMissing + ' + Me.ucrChkOmitMissing.AutoSize = True + Me.ucrChkOmitMissing.Checked = False + Me.ucrChkOmitMissing.Location = New System.Drawing.Point(10, 314) + Me.ucrChkOmitMissing.Name = "ucrChkOmitMissing" + Me.ucrChkOmitMissing.Size = New System.Drawing.Size(190, 23) + Me.ucrChkOmitMissing.TabIndex = 9 + ' + 'ucrSelectorOneVarSummarise + ' + Me.ucrSelectorOneVarSummarise.AutoSize = True + Me.ucrSelectorOneVarSummarise.bDropUnusedFilterLevels = False + Me.ucrSelectorOneVarSummarise.bShowHiddenColumns = False + Me.ucrSelectorOneVarSummarise.bUseCurrentFilter = True + Me.ucrSelectorOneVarSummarise.Location = New System.Drawing.Point(10, 55) + Me.ucrSelectorOneVarSummarise.Margin = New System.Windows.Forms.Padding(0) + Me.ucrSelectorOneVarSummarise.Name = "ucrSelectorOneVarSummarise" + Me.ucrSelectorOneVarSummarise.Size = New System.Drawing.Size(213, 183) + Me.ucrSelectorOneVarSummarise.TabIndex = 0 + ' + 'ucrReceiverOneVarSummarise + ' + Me.ucrReceiverOneVarSummarise.AutoSize = True + Me.ucrReceiverOneVarSummarise.frmParent = Me + Me.ucrReceiverOneVarSummarise.Location = New System.Drawing.Point(261, 82) + Me.ucrReceiverOneVarSummarise.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverOneVarSummarise.Name = "ucrReceiverOneVarSummarise" + Me.ucrReceiverOneVarSummarise.Selector = Nothing + Me.ucrReceiverOneVarSummarise.Size = New System.Drawing.Size(120, 100) + Me.ucrReceiverOneVarSummarise.strNcFilePath = "" + Me.ucrReceiverOneVarSummarise.TabIndex = 2 + Me.ucrReceiverOneVarSummarise.ucrSelector = Nothing + ' + 'ucrBase + ' + Me.ucrBase.AutoSize = True + Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrBase.Location = New System.Drawing.Point(8, 386) + Me.ucrBase.Name = "ucrBase" + Me.ucrBase.Size = New System.Drawing.Size(408, 52) + Me.ucrBase.TabIndex = 11 + ' + 'ucrInputMarginName + ' + Me.ucrInputMarginName.AddQuotesIfUnrecognised = True + Me.ucrInputMarginName.AutoSize = True + Me.ucrInputMarginName.IsMultiline = False + Me.ucrInputMarginName.IsReadOnly = False + Me.ucrInputMarginName.Location = New System.Drawing.Point(206, 243) + Me.ucrInputMarginName.Name = "ucrInputMarginName" + Me.ucrInputMarginName.Size = New System.Drawing.Size(74, 21) + Me.ucrInputMarginName.TabIndex = 25 + ' + 'lblMarginName + ' + Me.lblMarginName.AutoSize = True + Me.lblMarginName.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblMarginName.Location = New System.Drawing.Point(159, 246) + Me.lblMarginName.Name = "lblMarginName" + Me.lblMarginName.Size = New System.Drawing.Size(41, 13) + Me.lblMarginName.TabIndex = 24 + Me.lblMarginName.Text = "Name :" + ' + 'ucrChkDisplayMargins + ' + Me.ucrChkDisplayMargins.AutoSize = True + Me.ucrChkDisplayMargins.Checked = False + Me.ucrChkDisplayMargins.Location = New System.Drawing.Point(10, 246) + Me.ucrChkDisplayMargins.Name = "ucrChkDisplayMargins" + Me.ucrChkDisplayMargins.Size = New System.Drawing.Size(150, 23) + Me.ucrChkDisplayMargins.TabIndex = 23 + ' + 'rdoSkim + ' + Me.rdoSkim.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoSkim.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoSkim.FlatAppearance.BorderSize = 2 + Me.rdoSkim.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoSkim.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoSkim.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoSkim.Location = New System.Drawing.Point(162, 13) + Me.rdoSkim.Name = "rdoSkim" + Me.rdoSkim.Size = New System.Drawing.Size(87, 27) + Me.rdoSkim.TabIndex = 26 + Me.rdoSkim.TabStop = True + Me.rdoSkim.Text = "Skim" + Me.rdoSkim.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoSkim.UseVisualStyleBackColor = True + ' + 'cmdMissingOptions + ' + Me.cmdMissingOptions.Enabled = False + Me.cmdMissingOptions.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdMissingOptions.Location = New System.Drawing.Point(206, 311) + Me.cmdMissingOptions.Name = "cmdMissingOptions" + Me.cmdMissingOptions.Size = New System.Drawing.Size(62, 26) + Me.cmdMissingOptions.TabIndex = 27 + Me.cmdMissingOptions.Tag = "MissingOptions" + Me.cmdMissingOptions.Text = "Options" + Me.cmdMissingOptions.UseVisualStyleBackColor = True + ' + 'dlgOneVariableSummarise + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi + Me.AutoSize = True + Me.ClientSize = New System.Drawing.Size(421, 442) + Me.Controls.Add(Me.cmdMissingOptions) + Me.Controls.Add(Me.rdoSkim) + Me.Controls.Add(Me.ucrInputMarginName) + Me.Controls.Add(Me.lblMarginName) + Me.Controls.Add(Me.ucrChkDisplayMargins) + Me.Controls.Add(Me.rdoCustomised) + Me.Controls.Add(Me.rdoDefault) + Me.Controls.Add(Me.ucrPnlSummaries) + Me.Controls.Add(Me.ucrChkDisplaySummariesAsRows) + Me.Controls.Add(Me.ucrChkDisplayVariablesAsRows) + Me.Controls.Add(Me.ucrNudMaxSum) + Me.Controls.Add(Me.ucrChkOmitMissing) + Me.Controls.Add(Me.ucrSelectorOneVarSummarise) + Me.Controls.Add(Me.ucrReceiverOneVarSummarise) + Me.Controls.Add(Me.ucrBase) + Me.Controls.Add(Me.lblSelectedVariable) + Me.Controls.Add(Me.cmdSummaries) + Me.Controls.Add(Me.lblMaxSum) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "dlgOneVariableSummarise" + Me.ShowIcon = False + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen + Me.Tag = "One_Variable_summarise" + Me.Text = "One Variable Summarise" + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + Friend WithEvents lblSelectedVariable As Label + Friend WithEvents ucrBase As ucrButtons + Friend WithEvents ucrReceiverOneVarSummarise As ucrReceiverMultiple + Friend WithEvents ucrSelectorOneVarSummarise As ucrSelectorByDataFrameAddRemove + Friend WithEvents ucrChkOmitMissing As ucrCheck + Friend WithEvents lblMaxSum As Label + Friend WithEvents ucrNudMaxSum As ucrNud + Friend WithEvents cmdSummaries As Button + Friend WithEvents ucrChkDisplaySummariesAsRows As ucrCheck + Friend WithEvents ucrChkDisplayVariablesAsRows As ucrCheck + Friend WithEvents ucrPnlSummaries As UcrPanel + Friend WithEvents rdoCustomised As RadioButton + Friend WithEvents rdoDefault As RadioButton + Friend WithEvents ucrInputMarginName As ucrInputTextBox + Friend WithEvents lblMarginName As Label + Friend WithEvents ucrChkDisplayMargins As ucrCheck + Friend WithEvents rdoSkim As RadioButton + Friend WithEvents cmdMissingOptions As Button End Class \ No newline at end of file diff --git a/instat/dlgOneVariableSummarise.vb b/instat/dlgOneVariableSummarise.vb index c714fb0fd51..4015e98bbba 100644 --- a/instat/dlgOneVariableSummarise.vb +++ b/instat/dlgOneVariableSummarise.vb @@ -11,301 +11,323 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . -Imports instat -Imports instat.Translations - -Public Class dlgOneVariableSummarise - Private bFirstLoad As Boolean = True - Private bReset As Boolean = True - Private bRCodeSet As Boolean = True - Private clsSummaryFunction, clsSummariesList, clsMmtableFunction, - clsConcFunction, clsSummaryTableFunction, clsHeaderLeftTopVariableFunction, - clsHeaderLeftTopSummaryFunction, clsHeaderTopLeftVariableFunction, - clsHeaderTopLeftSummaryFunction, clsDummyFunction, - clsSkimrFunction As New RFunction - Private clsMmtableOperator As ROperator - Private bResetSubdialog As Boolean = False - Public strDefaultDataFrame As String = "" - Public strDefaultColumns() As String = Nothing - Private Const iMaxSum = 12 - - Private Sub dlgOneVariableSummarise_Load(sender As Object, e As EventArgs) Handles MyBase.Load - If bFirstLoad Then - InitialiseDialog() - bFirstLoad = False - End If - If bReset Then - SetDefaults() - End If - SetRCodeForControls(bReset) - SetDefaultColumn() - bReset = False - TestOKEnabled() - autoTranslate(Me) - End Sub - - Private Sub InitialiseDialog() - ucrBase.iHelpTopicID = 410 - ucrBase.clsRsyntax.iCallType = 2 - - 'The selector is only used for one of the functions. Therefore it's parameter name is always the same. So this can be done in Initialise. - ucrSelectorOneVarSummarise.SetParameter(New RParameter("data_name", 0)) - ucrSelectorOneVarSummarise.SetParameterIsString() - - ucrReceiverOneVarSummarise.SetParameter(New RParameter("object", 0)) - ucrReceiverOneVarSummarise.SetParameterIsRFunction() - ucrReceiverOneVarSummarise.Selector = ucrSelectorOneVarSummarise - ucrReceiverOneVarSummarise.SetMeAsReceiver() - - ucrNudMaxSum.SetParameter(New RParameter("maxsum", 2)) - ucrNudMaxSum.SetMinMax(iMaxSum, Integer.MaxValue) - ucrNudMaxSum.SetLinkedDisplayControl(lblMaxSum) - - ucrPnlSummaries.AddRadioButton(rdoDefault) - ucrPnlSummaries.AddRadioButton(rdoCustomised) - ucrPnlSummaries.AddRadioButton(rdoSkim) - ucrPnlSummaries.AddParameterValuesCondition(rdoCustomised, "checked_radio", "customised") - ucrPnlSummaries.AddParameterValuesCondition(rdoDefault, "checked_radio", "defaults") - ucrPnlSummaries.AddParameterValuesCondition(rdoSkim, "checked_radio", "skim") - ucrPnlSummaries.AddToLinkedControls(ucrNudMaxSum, {rdoDefault}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, - bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=iMaxSum) - ucrPnlSummaries.AddToLinkedControls({ucrChkOmitMissing, ucrChkDisplaySummariesAsRows, ucrChkDisplayVariablesAsRows, ucrChkDisplayMargins}, - {rdoCustomised}, bNewLinkedHideIfParameterMissing:=True) - - ucrChkOmitMissing.SetParameter(New RParameter("na.rm", 3)) - ucrChkOmitMissing.SetText("Omit Missing Values") - ucrChkOmitMissing.SetRDefault("FALSE") - ucrChkOmitMissing.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkOmitMissing.bUpdateRCodeFromControl = True - ucrChkOmitMissing.SetLinkedDisplayControl(cmdMissingOptions) - - ucrChkDisplayMargins.SetParameter(New RParameter("include_margins", 3)) - ucrChkDisplayMargins.SetText("Display Outer Margins") - ucrChkDisplayMargins.SetRDefault("FALSE") - ucrChkDisplayMargins.AddToLinkedControls({ucrInputMarginName}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True, - bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="All") - - ucrInputMarginName.SetParameter(New RParameter("margin_name", iNewPosition:=4)) - ucrInputMarginName.SetLinkedDisplayControl(lblMarginName) - - ucrChkDisplaySummariesAsRows.SetText("Display Summaries As Rows") - ucrChkDisplaySummariesAsRows.AddParameterValuesCondition(True, "summary_by_row", "TRUE") - ucrChkDisplaySummariesAsRows.AddParameterValuesCondition(False, "summary_by_row", "FALSE") - ucrChkDisplaySummariesAsRows.SetLinkedDisplayControl(cmdSummaries) - - ucrChkDisplayVariablesAsRows.SetText("Display Variables As Rows") - ucrChkDisplayVariablesAsRows.AddParameterValuesCondition(True, "variable_by_row", "TRUE") - ucrChkDisplayVariablesAsRows.AddParameterPresentCondition(False, "variable_by_row", "FALSE") - End Sub - - Private Sub SetDefaults() - clsSummariesList = New RFunction - clsSummaryFunction = New RFunction - clsConcFunction = New RFunction - clsSummaryTableFunction = New RFunction - clsMmtableOperator = New ROperator - clsMmtableFunction = New RFunction - clsHeaderLeftTopVariableFunction = New RFunction - clsHeaderLeftTopSummaryFunction = New RFunction - clsHeaderTopLeftVariableFunction = New RFunction - clsHeaderTopLeftSummaryFunction = New RFunction - clsDummyFunction = New RFunction - clsSkimrFunction = New RFunction - - ucrSelectorOneVarSummarise.Reset() - - clsSkimrFunction.SetPackageName("skimr") - clsSkimrFunction.SetRCommand("skim_without_charts") - clsSkimrFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorOneVarSummarise.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) - - 'Dummy function used to set conditions for the summary and variable checkbox - clsDummyFunction.AddParameter("variable_by_row", "TRUE", iPosition:=0) - clsDummyFunction.AddParameter("summary_by_row", "FALSE", iPosition:=1) - clsDummyFunction.AddParameter("checked_radio", "defaults", iPosition:=2) - - clsConcFunction.SetRCommand("c") - - clsMmtableOperator.SetOperation("+") - clsMmtableOperator.AddParameter("mmtable_function", clsRFunctionParameter:=clsMmtableFunction, iPosition:=0) - clsMmtableOperator.AddParameter("header_left_top_variable", clsRFunctionParameter:=clsHeaderLeftTopVariableFunction, iPosition:=1) - clsMmtableOperator.AddParameter("header_top_left_summary", clsRFunctionParameter:=clsHeaderTopLeftSummaryFunction, iPosition:=2) - - clsHeaderLeftTopVariableFunction.SetPackageName("mmtable2") - clsHeaderLeftTopVariableFunction.SetRCommand("header_left_top") - clsHeaderLeftTopVariableFunction.AddParameter("variable", Chr(39) & "variable" & Chr(39), iPosition:=0) - - clsHeaderLeftTopSummaryFunction.SetPackageName("mmtable2") - clsHeaderLeftTopSummaryFunction.SetRCommand("header_left_top") - clsHeaderLeftTopSummaryFunction.AddParameter("variable", Chr(39) & "summary" & Chr(39), iPosition:=0) - - clsHeaderTopLeftVariableFunction.SetPackageName("mmtable2") - clsHeaderTopLeftVariableFunction.SetRCommand("header_top_left") - clsHeaderTopLeftVariableFunction.AddParameter("variable", Chr(39) & "variable" & Chr(39), iPosition:=0) - - clsHeaderTopLeftSummaryFunction.SetPackageName("mmtable2") - clsHeaderTopLeftSummaryFunction.SetRCommand("header_top_left") - clsHeaderTopLeftSummaryFunction.AddParameter("variable", Chr(39) & "summary" & Chr(39), iPosition:=0) - - clsMmtableFunction.SetPackageName("mmtable2") - clsMmtableFunction.SetRCommand("mmtable") - clsMmtableFunction.AddParameter("data", clsRFunctionParameter:=clsSummaryTableFunction, iPosition:=0) - clsMmtableFunction.AddParameter("cells", "value", iPosition:=1) - - clsSummariesList.SetRCommand("c") - clsSummariesList.AddParameter("summary_count_non_missing", Chr(34) & "summary_count_non_missing" & Chr(34), bIncludeArgumentName:=False) - clsSummariesList.AddParameter("summary_count", Chr(34) & "summary_count" & Chr(34), bIncludeArgumentName:=False) - clsSummariesList.AddParameter("summary_sum", Chr(34) & "summary_sum" & Chr(34), bIncludeArgumentName:=False) - - clsSummaryFunction.SetRCommand("summary") - clsSummaryFunction.AddParameter("maxsum", iMaxSum) - clsSummaryFunction.AddParameter("na.rm", "FALSE", iPosition:=3) - - clsSummaryTableFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$summary_table") - clsSummaryTableFunction.AddParameter("treat_columns_as_factor", "TRUE", iPosition:=0) - clsSummaryTableFunction.AddParameter("margins", Chr(34) & "summary" & Chr(34), iPosition:=1) - clsSummaryTableFunction.AddParameter("summaries", clsRFunctionParameter:=clsSummariesList, iPosition:=2) - clsSummaryTableFunction.SetAssignTo("summary_table") - - ucrBase.clsRsyntax.SetBaseRFunction(clsSummaryFunction) - bResetSubdialog = True - End Sub - - Private Sub SetRCodeForControls(bReset As Boolean) - bRCodeSet = False - ucrChkOmitMissing.AddAdditionalCodeParameterPair(clsSummaryTableFunction, New RParameter("na.rm", iNewPosition:=2), iAdditionalPairNo:=1) - - ucrNudMaxSum.SetRCode(clsSummaryFunction, bReset) - ucrReceiverOneVarSummarise.SetRCode(clsSummaryFunction, bReset) - ucrChkOmitMissing.SetRCode(clsSummaryFunction, bReset) - ucrChkDisplayMargins.SetRCode(clsSummaryTableFunction, bReset) - ucrPnlSummaries.SetRCode(clsDummyFunction, bReset) - ucrSelectorOneVarSummarise.SetRCode(clsSummaryTableFunction, bReset) - ucrChkDisplayVariablesAsRows.SetRCode(clsDummyFunction, bReset) - ucrChkDisplaySummariesAsRows.SetRCode(clsDummyFunction, bReset) - bRCodeSet = True - End Sub - - Public Sub TestOKEnabled() - 'We cannot test the values on the sub dialog because the sub dialog may not be in sync with the main dialog code. This only happens once the sub dialog has been opened. - If ucrReceiverOneVarSummarise.IsEmpty() OrElse (rdoCustomised.Checked AndAlso clsSummariesList.clsParameters.Count = 0) OrElse ucrNudMaxSum.GetText = "" Then - ucrBase.OKEnabled(False) - Else - ucrBase.OKEnabled(True) - End If - End Sub - - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeForControls(True) - TestOKEnabled() - End Sub - - Private Sub cmdSummaries_Click(sender As Object, e As EventArgs) Handles cmdSummaries.Click - sdgSummaries.SetRFunction(clsSummariesList, clsSummaryTableFunction, clsConcFunction, ucrSelectorOneVarSummarise, bResetSubdialog) - bResetSubdialog = False - sdgSummaries.bEnable2VariableTab = False - sdgSummaries.ShowDialog() - sdgSummaries.bEnable2VariableTab = True - TestOKEnabled() - End Sub - - Private Sub cmdMissingOptions_Click(sender As Object, e As EventArgs) Handles cmdMissingOptions.Click - sdgMissingOptions.SetRFunction(clsNewSummaryFunction:=clsSummaryTableFunction, clsNewConcFunction:=clsConcFunction, bReset:=bResetSubdialog) - bResetSubdialog = False - sdgMissingOptions.ShowDialog() - End Sub - - Private Sub ucrReceiverDescribeOneVar_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverOneVarSummarise.ControlValueChanged - If Not ucrReceiverOneVarSummarise.IsEmpty Then - clsSummaryTableFunction.AddParameter("columns_to_summarise", ucrReceiverOneVarSummarise.GetVariableNames(), iPosition:=4) - clsSkimrFunction.AddParameter("col_names", ucrReceiverOneVarSummarise.GetVariableNames(), - bIncludeArgumentName:=False, iPosition:=1) - Else - clsSummaryTableFunction.RemoveParameterByName("columns_to_summarise") - clsSkimrFunction.RemoveParameterByName("col_names") - End If - End Sub - - Private Sub SetDefaultColumn() - If strDefaultDataFrame <> "" Then - ucrSelectorOneVarSummarise.SetDataframe(strDefaultDataFrame) - End If - If strDefaultColumns IsNot Nothing AndAlso strDefaultColumns.Count > 0 Then - For Each strVar As String In strDefaultColumns - ucrReceiverOneVarSummarise.Add(strVar, strDefaultDataFrame) - Next - End If - strDefaultDataFrame = "" - strDefaultColumns = Nothing - End Sub - - Private Sub ucrSelectorOneVarSummarise_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorOneVarSummarise.ControlValueChanged - clsSkimrFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorOneVarSummarise.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) - End Sub - - Private Sub ucrChkOmitMissing_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkOmitMissing.ControlValueChanged - If Not ucrChkOmitMissing.Checked Then - clsSummaryTableFunction.RemoveParameterByName("na_type") - Else - clsSummaryTableFunction.AddParameter("na_type", clsRFunctionParameter:=clsConcFunction, iPosition:=9) - End If - - cmdMissingOptions.Enabled = ucrChkOmitMissing.Checked - End Sub - - Private Sub ucrPnlSummaries_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlSummaries.ControlValueChanged - If rdoCustomised.Checked Then - clsDummyFunction.AddParameter("checked_radio", "customised", iPosition:=2) - ucrBase.clsRsyntax.SetBaseROperator(clsMmtableOperator) - ElseIf rdoDefault.Checked Then - clsDummyFunction.AddParameter("checked_radio", "defaults", iPosition:=2) - ucrBase.clsRsyntax.SetBaseRFunction(clsSummaryFunction) - ElseIf rdoSkim.Checked Then - clsDummyFunction.AddParameter("checked_radio", "skim", iPosition:=2) - ucrBase.clsRsyntax.SetBaseRFunction(clsSkimrFunction) - End If - End Sub - - Private Sub ucrChkDisplayVariablesAsRows_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplayVariablesAsRows.ControlValueChanged, ucrChkDisplaySummariesAsRows.ControlValueChanged - If bRCodeSet Then - clsMmtableOperator.RemoveParameterByName("header_left_top_variable") - clsMmtableOperator.RemoveParameterByName("header_top_left_summary") - clsMmtableOperator.RemoveParameterByName("header_left_top_summaries") - clsMmtableOperator.RemoveParameterByName("header_top_left_variable") - clsMmtableOperator.RemoveParameterByName("header_left_top_summary") - clsMmtableOperator.RemoveParameterByName("header_top__left_summary") - If ucrChkDisplaySummariesAsRows.Checked AndAlso ucrChkDisplayVariablesAsRows.Checked Then - clsMmtableOperator.AddParameter("header_left_top_variable", clsRFunctionParameter:=clsHeaderLeftTopVariableFunction, iPosition:=1) - clsMmtableOperator.AddParameter("header_left_top_summary", clsRFunctionParameter:=clsHeaderLeftTopSummaryFunction, iPosition:=2) - ElseIf ucrChkDisplayVariablesAsRows.Checked Then - clsMmtableOperator.AddParameter("header_left_top_variable", clsRFunctionParameter:=clsHeaderLeftTopVariableFunction, iPosition:=1) - clsMmtableOperator.AddParameter("header_top_left_summary", clsRFunctionParameter:=clsHeaderTopLeftSummaryFunction, iPosition:=2) - ElseIf ucrChkDisplaySummariesAsRows.Checked Then - clsMmtableOperator.AddParameter("header_left_top_summaries", clsRFunctionParameter:=clsHeaderLeftTopSummaryFunction, iPosition:=1) - clsMmtableOperator.AddParameter("header_top_left_variable", clsRFunctionParameter:=clsHeaderTopLeftVariableFunction, iPosition:=2) - Else - clsMmtableOperator.AddParameter("header_top_left_variable", clsRFunctionParameter:=clsHeaderTopLeftVariableFunction, iPosition:=1) - clsMmtableOperator.AddParameter("header_top__left_summary", clsRFunctionParameter:=clsHeaderTopLeftSummaryFunction, iPosition:=2) - End If - - If ucrChkDisplayVariablesAsRows.Checked Then - clsDummyFunction.AddParameter("variable_by_row", "TRUE", iPosition:=0) - Else - clsDummyFunction.AddParameter("variable_by_row", "FALSE", iPosition:=0) - End If - - If ucrChkDisplaySummariesAsRows.Checked Then - clsDummyFunction.AddParameter("summary_by_row", "TRUE", iPosition:=1) - Else - clsDummyFunction.AddParameter("summary_by_row", "FALSE", iPosition:=1) - End If - End If - End Sub - - Private Sub Controls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverOneVarSummarise.ControlContentsChanged, ucrNudMaxSum.ControlContentsChanged - TestOKEnabled() - End Sub +Imports instat +Imports instat.Translations + +Public Class dlgOneVariableSummarise + Private bFirstLoad As Boolean = True + Private bReset As Boolean = True + Private bRCodeSet As Boolean = True + Private clsSummaryFunction, clsSummariesList, clsMmtableFunction, + clsConcFunction, clsSummaryTableFunction, clsHeaderLeftTopVariableFunction, + clsHeaderLeftTopSummaryFunction, clsHeaderTopLeftVariableFunction, + clsHeaderTopLeftSummaryFunction, clsDummyFunction, + clsSkimrFunction As New RFunction + Private clsMmtableOperator As New ROperator + Private bResetSubdialog As Boolean = False + Public strDefaultDataFrame As String = "" + Public strDefaultColumns() As String = Nothing + Private Const iMaxSum = 12 + + Private Sub dlgOneVariableSummarise_Load(sender As Object, e As EventArgs) Handles MyBase.Load + If bFirstLoad Then + InitialiseDialog() + bFirstLoad = False + End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + SetDefaultColumn() + bReset = False + TestOKEnabled() + autoTranslate(Me) + End Sub + + Private Sub InitialiseDialog() + ucrBase.iHelpTopicID = 410 + ucrBase.clsRsyntax.iCallType = 2 + ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False + + 'The selector is only used for one of the functions. Therefore it's parameter name is always the same. So this can be done in Initialise. + ucrSelectorOneVarSummarise.SetParameter(New RParameter("data_name", 0)) + ucrSelectorOneVarSummarise.SetParameterIsString() + + ucrReceiverOneVarSummarise.SetParameter(New RParameter("object", 0)) + ucrReceiverOneVarSummarise.SetParameterIsRFunction() + ucrReceiverOneVarSummarise.Selector = ucrSelectorOneVarSummarise + ucrReceiverOneVarSummarise.SetMeAsReceiver() + + ucrNudMaxSum.SetParameter(New RParameter("maxsum", 2)) + ucrNudMaxSum.SetMinMax(iMaxSum, Integer.MaxValue) + ucrNudMaxSum.SetLinkedDisplayControl(lblMaxSum) + + ucrPnlSummaries.AddRadioButton(rdoDefault) + ucrPnlSummaries.AddRadioButton(rdoCustomised) + ucrPnlSummaries.AddRadioButton(rdoSkim) + ucrPnlSummaries.AddParameterValuesCondition(rdoCustomised, "checked_radio", "customised") + ucrPnlSummaries.AddParameterValuesCondition(rdoDefault, "checked_radio", "defaults") + ucrPnlSummaries.AddParameterValuesCondition(rdoSkim, "checked_radio", "skim") + ucrPnlSummaries.AddToLinkedControls(ucrNudMaxSum, {rdoDefault}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, + bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=iMaxSum) + ucrPnlSummaries.AddToLinkedControls({ucrChkOmitMissing, ucrChkDisplaySummariesAsRows, ucrChkDisplayVariablesAsRows, ucrChkDisplayMargins}, + {rdoCustomised}, bNewLinkedHideIfParameterMissing:=True) + + ucrChkOmitMissing.SetParameter(New RParameter("na.rm", 3)) + ucrChkOmitMissing.SetText("Omit Missing Values") + ucrChkOmitMissing.SetRDefault("FALSE") + ucrChkOmitMissing.SetValuesCheckedAndUnchecked("TRUE", "FALSE") + ucrChkOmitMissing.bUpdateRCodeFromControl = True + ucrChkOmitMissing.SetLinkedDisplayControl(cmdMissingOptions) + + ucrChkDisplayMargins.SetParameter(New RParameter("include_margins", 3)) + ucrChkDisplayMargins.SetText("Display Outer Margins") + ucrChkDisplayMargins.SetRDefault("FALSE") + ucrChkDisplayMargins.AddToLinkedControls({ucrInputMarginName}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True, + bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="All") + + ucrInputMarginName.SetParameter(New RParameter("margin_name", iNewPosition:=4)) + ucrInputMarginName.SetLinkedDisplayControl(lblMarginName) + + ucrChkDisplaySummariesAsRows.SetText("Display Summaries As Rows") + ucrChkDisplaySummariesAsRows.AddParameterValuesCondition(True, "summary_by_row", "TRUE") + ucrChkDisplaySummariesAsRows.AddParameterValuesCondition(False, "summary_by_row", "FALSE") + ucrChkDisplaySummariesAsRows.SetLinkedDisplayControl(cmdSummaries) + + ucrChkDisplayVariablesAsRows.SetText("Display Variables As Rows") + ucrChkDisplayVariablesAsRows.AddParameterValuesCondition(True, "variable_by_row", "TRUE") + ucrChkDisplayVariablesAsRows.AddParameterPresentCondition(False, "variable_by_row", "FALSE") + End Sub + + Private Sub SetDefaults() + clsSummariesList = New RFunction + clsSummaryFunction = New RFunction + clsConcFunction = New RFunction + clsSummaryTableFunction = New RFunction + clsMmtableOperator = New ROperator + clsMmtableFunction = New RFunction + clsHeaderLeftTopVariableFunction = New RFunction + clsHeaderLeftTopSummaryFunction = New RFunction + clsHeaderTopLeftVariableFunction = New RFunction + clsHeaderTopLeftSummaryFunction = New RFunction + clsDummyFunction = New RFunction + clsSkimrFunction = New RFunction + + ucrSelectorOneVarSummarise.Reset() + + clsSkimrFunction.SetPackageName("skimr") + clsSkimrFunction.SetRCommand("skim_without_charts") + clsSkimrFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorOneVarSummarise.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) + clsSkimrFunction.SetAssignToRObject(strRObjectToAssignTo:="last_summary", + strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Summary, + strRObjectFormatToAssignTo:=RObjectFormat.Text, + strRDataFrameNameToAddObjectTo:=ucrSelectorOneVarSummarise.strCurrentDataFrame, + strObjectName:="last_summary") + + 'Dummy function used to set conditions for the summary and variable checkbox + clsDummyFunction.AddParameter("variable_by_row", "TRUE", iPosition:=0) + clsDummyFunction.AddParameter("summary_by_row", "FALSE", iPosition:=1) + clsDummyFunction.AddParameter("checked_radio", "defaults", iPosition:=2) + + clsConcFunction.SetRCommand("c") + + clsMmtableOperator.SetOperation("+") + clsMmtableOperator.AddParameter("mmtable_function", clsRFunctionParameter:=clsMmtableFunction, iPosition:=0) + clsMmtableOperator.AddParameter("header_left_top_variable", clsRFunctionParameter:=clsHeaderLeftTopVariableFunction, iPosition:=1) + clsMmtableOperator.AddParameter("header_top_left_summary", clsRFunctionParameter:=clsHeaderTopLeftSummaryFunction, iPosition:=2) + clsMmtableOperator.SetAssignToRObject(strRObjectToAssignTo:="last_summary", + strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, + strRObjectFormatToAssignTo:=RObjectFormat.Html, + strRDataFrameNameToAddObjectTo:=ucrSelectorOneVarSummarise.strCurrentDataFrame, + strObjectName:="last_summary") + + clsHeaderLeftTopVariableFunction.SetPackageName("mmtable2") + clsHeaderLeftTopVariableFunction.SetRCommand("header_left_top") + clsHeaderLeftTopVariableFunction.AddParameter("variable", Chr(39) & "variable" & Chr(39), iPosition:=0) + + clsHeaderLeftTopSummaryFunction.SetPackageName("mmtable2") + clsHeaderLeftTopSummaryFunction.SetRCommand("header_left_top") + clsHeaderLeftTopSummaryFunction.AddParameter("variable", Chr(39) & "summary" & Chr(39), iPosition:=0) + + clsHeaderTopLeftVariableFunction.SetPackageName("mmtable2") + clsHeaderTopLeftVariableFunction.SetRCommand("header_top_left") + clsHeaderTopLeftVariableFunction.AddParameter("variable", Chr(39) & "variable" & Chr(39), iPosition:=0) + + clsHeaderTopLeftSummaryFunction.SetPackageName("mmtable2") + clsHeaderTopLeftSummaryFunction.SetRCommand("header_top_left") + clsHeaderTopLeftSummaryFunction.AddParameter("variable", Chr(39) & "summary" & Chr(39), iPosition:=0) + + clsMmtableFunction.SetPackageName("mmtable2") + clsMmtableFunction.SetRCommand("mmtable") + clsMmtableFunction.AddParameter("data", clsRFunctionParameter:=clsSummaryTableFunction, iPosition:=0) + clsMmtableFunction.AddParameter("cells", "value", iPosition:=1) + + clsSummariesList.SetRCommand("c") + clsSummariesList.AddParameter("summary_count_non_missing", Chr(34) & "summary_count_non_missing" & Chr(34), bIncludeArgumentName:=False) + clsSummariesList.AddParameter("summary_count", Chr(34) & "summary_count" & Chr(34), bIncludeArgumentName:=False) + clsSummariesList.AddParameter("summary_sum", Chr(34) & "summary_sum" & Chr(34), bIncludeArgumentName:=False) + + clsSummaryFunction.SetRCommand("summary") + clsSummaryFunction.AddParameter("maxsum", iMaxSum) + clsSummaryFunction.AddParameter("na.rm", "FALSE", iPosition:=3) + clsSummaryFunction.SetAssignToRObject(strRObjectToAssignTo:="last_summary", + strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, + strRObjectFormatToAssignTo:=RObjectFormat.Text, + strRDataFrameNameToAddObjectTo:=ucrSelectorOneVarSummarise.strCurrentDataFrame, + strObjectName:="last_summary") + + clsSummaryTableFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$summary_table") + clsSummaryTableFunction.AddParameter("treat_columns_as_factor", "TRUE", iPosition:=0) + clsSummaryTableFunction.AddParameter("margins", Chr(34) & "summary" & Chr(34), iPosition:=1) + clsSummaryTableFunction.AddParameter("summaries", clsRFunctionParameter:=clsSummariesList, iPosition:=2) + clsSummaryTableFunction.SetAssignTo("summary_table") + + ucrBase.clsRsyntax.SetBaseRFunction(clsSummaryFunction) + bResetSubdialog = True + End Sub + + Private Sub SetRCodeForControls(bReset As Boolean) + bRCodeSet = False + ucrChkOmitMissing.AddAdditionalCodeParameterPair(clsSummaryTableFunction, New RParameter("na.rm", iNewPosition:=2), iAdditionalPairNo:=1) + + ucrNudMaxSum.SetRCode(clsSummaryFunction, bReset) + ucrReceiverOneVarSummarise.SetRCode(clsSummaryFunction, bReset) + ucrChkOmitMissing.SetRCode(clsSummaryFunction, bReset) + + ucrChkDisplayMargins.SetRCode(clsSummaryTableFunction, bReset) + ucrPnlSummaries.SetRCode(clsDummyFunction, bReset) + ucrSelectorOneVarSummarise.SetRCode(clsSummaryTableFunction, bReset) + ucrChkDisplayVariablesAsRows.SetRCode(clsDummyFunction, bReset) + ucrChkDisplaySummariesAsRows.SetRCode(clsDummyFunction, bReset) + + bRCodeSet = True + End Sub + + Public Sub TestOKEnabled() + 'We cannot test the values on the sub dialog because the sub dialog may not be in sync with the main dialog code. This only happens once the sub dialog has been opened. + If ucrReceiverOneVarSummarise.IsEmpty() OrElse (rdoCustomised.Checked AndAlso clsSummariesList.clsParameters.Count = 0) OrElse ucrNudMaxSum.GetText = "" Then + ucrBase.OKEnabled(False) + Else + ucrBase.OKEnabled(True) + End If + End Sub + + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset + SetDefaults() + SetRCodeForControls(True) + TestOKEnabled() + End Sub + + Private Sub cmdSummaries_Click(sender As Object, e As EventArgs) Handles cmdSummaries.Click + sdgSummaries.SetRFunction(clsSummariesList, clsSummaryTableFunction, clsConcFunction, ucrSelectorOneVarSummarise, bResetSubdialog) + bResetSubdialog = False + sdgSummaries.bEnable2VariableTab = False + sdgSummaries.ShowDialog() + sdgSummaries.bEnable2VariableTab = True + TestOKEnabled() + End Sub + + Private Sub cmdMissingOptions_Click(sender As Object, e As EventArgs) Handles cmdMissingOptions.Click + sdgMissingOptions.SetRFunction(clsNewSummaryFunction:=clsSummaryTableFunction, clsNewConcFunction:=clsConcFunction, bReset:=bResetSubdialog) + bResetSubdialog = False + sdgMissingOptions.ShowDialog() + End Sub + + Private Sub ucrReceiverDescribeOneVar_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverOneVarSummarise.ControlValueChanged + If Not ucrReceiverOneVarSummarise.IsEmpty Then + clsSummaryTableFunction.AddParameter("columns_to_summarise", ucrReceiverOneVarSummarise.GetVariableNames(), iPosition:=4) + clsSkimrFunction.AddParameter("col_names", ucrReceiverOneVarSummarise.GetVariableNames(), + bIncludeArgumentName:=False, iPosition:=1) + Else + clsSummaryTableFunction.RemoveParameterByName("columns_to_summarise") + clsSkimrFunction.RemoveParameterByName("col_names") + End If + End Sub + + Private Sub SetDefaultColumn() + If strDefaultDataFrame <> "" Then + ucrSelectorOneVarSummarise.SetDataframe(strDefaultDataFrame) + End If + If strDefaultColumns IsNot Nothing AndAlso strDefaultColumns.Count > 0 Then + For Each strVar As String In strDefaultColumns + ucrReceiverOneVarSummarise.Add(strVar, strDefaultDataFrame) + Next + End If + strDefaultDataFrame = "" + strDefaultColumns = Nothing + End Sub + + Private Sub ucrSelectorOneVarSummarise_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorOneVarSummarise.ControlValueChanged + clsSkimrFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorOneVarSummarise.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) + + clsSummaryFunction._rDataFrameNameToAddObjectTo = ucrSelectorOneVarSummarise.strCurrentDataFrame + clsMmtableOperator._rDataFrameNameToAddObjectTo = ucrSelectorOneVarSummarise.strCurrentDataFrame + clsSkimrFunction._rDataFrameNameToAddObjectTo = ucrSelectorOneVarSummarise.strCurrentDataFrame + End Sub + + Private Sub ucrChkOmitMissing_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkOmitMissing.ControlValueChanged + If Not ucrChkOmitMissing.Checked Then + clsSummaryTableFunction.RemoveParameterByName("na_type") + Else + clsSummaryTableFunction.AddParameter("na_type", clsRFunctionParameter:=clsConcFunction, iPosition:=9) + End If + + cmdMissingOptions.Enabled = ucrChkOmitMissing.Checked + End Sub + + Private Sub ucrPnlSummaries_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlSummaries.ControlValueChanged + If rdoCustomised.Checked Then + clsDummyFunction.AddParameter("checked_radio", "customised", iPosition:=2) + ucrBase.clsRsyntax.SetBaseROperator(clsMmtableOperator) + ElseIf rdoDefault.Checked Then + clsDummyFunction.AddParameter("checked_radio", "defaults", iPosition:=2) + ucrBase.clsRsyntax.SetBaseRFunction(clsSummaryFunction) + ElseIf rdoSkim.Checked Then + clsDummyFunction.AddParameter("checked_radio", "skim", iPosition:=2) + ucrBase.clsRsyntax.SetBaseRFunction(clsSkimrFunction) + End If + End Sub + + Private Sub ucrChkDisplayVariablesAsRows_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplayVariablesAsRows.ControlValueChanged, ucrChkDisplaySummariesAsRows.ControlValueChanged + If bRCodeSet Then + clsMmtableOperator.RemoveParameterByName("header_left_top_variable") + clsMmtableOperator.RemoveParameterByName("header_top_left_summary") + clsMmtableOperator.RemoveParameterByName("header_left_top_summaries") + clsMmtableOperator.RemoveParameterByName("header_top_left_variable") + clsMmtableOperator.RemoveParameterByName("header_left_top_summary") + clsMmtableOperator.RemoveParameterByName("header_top__left_summary") + If ucrChkDisplaySummariesAsRows.Checked AndAlso ucrChkDisplayVariablesAsRows.Checked Then + clsMmtableOperator.AddParameter("header_left_top_variable", clsRFunctionParameter:=clsHeaderLeftTopVariableFunction, iPosition:=1) + clsMmtableOperator.AddParameter("header_left_top_summary", clsRFunctionParameter:=clsHeaderLeftTopSummaryFunction, iPosition:=2) + ElseIf ucrChkDisplayVariablesAsRows.Checked Then + clsMmtableOperator.AddParameter("header_left_top_variable", clsRFunctionParameter:=clsHeaderLeftTopVariableFunction, iPosition:=1) + clsMmtableOperator.AddParameter("header_top_left_summary", clsRFunctionParameter:=clsHeaderTopLeftSummaryFunction, iPosition:=2) + ElseIf ucrChkDisplaySummariesAsRows.Checked Then + clsMmtableOperator.AddParameter("header_left_top_summaries", clsRFunctionParameter:=clsHeaderLeftTopSummaryFunction, iPosition:=1) + clsMmtableOperator.AddParameter("header_top_left_variable", clsRFunctionParameter:=clsHeaderTopLeftVariableFunction, iPosition:=2) + Else + clsMmtableOperator.AddParameter("header_top_left_variable", clsRFunctionParameter:=clsHeaderTopLeftVariableFunction, iPosition:=1) + clsMmtableOperator.AddParameter("header_top__left_summary", clsRFunctionParameter:=clsHeaderTopLeftSummaryFunction, iPosition:=2) + End If + + If ucrChkDisplayVariablesAsRows.Checked Then + clsDummyFunction.AddParameter("variable_by_row", "TRUE", iPosition:=0) + Else + clsDummyFunction.AddParameter("variable_by_row", "FALSE", iPosition:=0) + End If + + If ucrChkDisplaySummariesAsRows.Checked Then + clsDummyFunction.AddParameter("summary_by_row", "TRUE", iPosition:=1) + Else + clsDummyFunction.AddParameter("summary_by_row", "FALSE", iPosition:=1) + End If + End If + End Sub + + Private Sub Controls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverOneVarSummarise.ControlContentsChanged, ucrNudMaxSum.ControlContentsChanged + TestOKEnabled() + End Sub End Class \ No newline at end of file diff --git a/instat/dlgScatterPlot.vb b/instat/dlgScatterPlot.vb index cc66a7fc86c..9997f3f7bf2 100644 --- a/instat/dlgScatterPlot.vb +++ b/instat/dlgScatterPlot.vb @@ -11,293 +11,299 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . -Imports instat.Translations - -Public Class dlgScatterPlot - Private clsRggplotFunction As New RFunction - Private clsRScatterGeomFunction As New RFunction - Private clsRaesFunction As New RFunction - Private clsLocalRaesFunction As New RFunction - Private clsBaseOperator As New ROperator - Private bFirstLoad As Boolean = True - Private bReset As Boolean = True - Private bResetSubdialog As Boolean = True - Private bResetlayerSubdialog As Boolean = True - Private clsLabsFunction As New RFunction - Private clsXlabsFunction As New RFunction - Private clsYlabsFunction As New RFunction - Private clsXScalecontinuousFunction As New RFunction - Private clsYScalecontinuousFunction As New RFunction - Private clsFacetsFunction As New RFunction - Private clsThemeFunction As New RFunction - Private dctThemeFunctions As New Dictionary(Of String, RFunction) - Private clsGeomSmoothFunc As New RFunction - Private clsCoordPolarFunction As New RFunction - Private clsCoordPolarStartOperator As New ROperator - Private clsXScaleDateFunction As New RFunction - Private clsYScaleDateFunction As New RFunction - Private clsScaleFillViridisFunction As New RFunction - Private clsScaleColourViridisFunction As New RFunction - Private clsAnnotateFunction As New RFunction - Private clsGeomRugFunction As New RFunction - 'Parameter names for geoms - Private strFirstParameterName As String = "geomfunc" - Private strGeomSmoothParameterName As String = "geom_smooth" - Private strGeomParameterNames() As String = {strFirstParameterName, strGeomSmoothParameterName} - - Private Sub dlgScatterPlot_Load(sender As Object, e As EventArgs) Handles MyBase.Load - If bFirstLoad Then - InitialiseDialog() - bFirstLoad = False - End If - If bReset Then - SetDefaults() - End If - SetRCodeForControls(bReset) - bReset = False - TestOkEnabled() - autoTranslate(Me) - End Sub - - Private Sub InitialiseDialog() - Dim clsGeomRugParameter As New RParameter - Dim dctSidesOptions As New Dictionary(Of String, String) - - ucrBase.iHelpTopicID = 433 - ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False - ucrBase.clsRsyntax.iCallType = 3 - - ucrSelectorForScatter.SetParameter(New RParameter("data", 0)) - ucrSelectorForScatter.SetParameterIsrfunction() - - ucrVariablesAsFactorForScatter.SetParameter(New RParameter("y", 1)) - ucrVariablesAsFactorForScatter.SetParameterIsString() - ucrVariablesAsFactorForScatter.bWithQuotes = False - ucrVariablesAsFactorForScatter.Selector = ucrSelectorForScatter - ucrVariablesAsFactorForScatter.SetFactorReceiver(ucrFactorOptionalReceiver) - ucrVariablesAsFactorForScatter.strSelectorHeading = "Variables" - ucrVariablesAsFactorForScatter.SetValuesToIgnore({Chr(34) & Chr(34)}) - ucrVariablesAsFactorForScatter.bAddParameterIfEmpty = True - - ucrReceiverX.SetParameter(New RParameter("x", 0)) - ucrReceiverX.SetParameterIsString() - ucrReceiverX.bWithQuotes = False - ucrReceiverX.Selector = ucrSelectorForScatter - ucrReceiverX.strSelectorHeading = "Variables" - ucrReceiverX.SetValuesToIgnore({Chr(34) & Chr(34)}) - ucrReceiverX.bAddParameterIfEmpty = True - - ucrReceiverLabel.SetParameter(New RParameter("label")) - ucrReceiverLabel.SetParameterIsString() - ucrReceiverLabel.bWithQuotes = False - ucrReceiverLabel.Selector = ucrSelectorForScatter - ucrReceiverLabel.strSelectorHeading = "Variables" - - ucrFactorOptionalReceiver.SetParameter(New RParameter("colour", 2)) - ucrFactorOptionalReceiver.SetParameterIsString() - ucrFactorOptionalReceiver.bWithQuotes = False - ucrFactorOptionalReceiver.Selector = ucrSelectorForScatter - ucrFactorOptionalReceiver.strSelectorHeading = "Variables" - - ucrChkLineofBestFit.SetText("Add Line of Best Fit") - ucrChkLineofBestFit.AddParameterPresentCondition(True, "geom_smooth") - ucrChkLineofBestFit.AddParameterPresentCondition(False, "geom_smooth", False) - ucrChkLineofBestFit.AddToLinkedControls(ucrChkWithSE, {True}, bNewLinkedHideIfParameterMissing:=True) - - ucrChkWithSE.SetText("With Standard Error") - ucrChkWithSE.SetParameter(New RParameter("se"), bNewAddRemoveParameter:=False, bNewChangeParameterValue:=True) - ucrChkWithSE.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkWithSE.SetRDefault("TRUE") - - ucrChkAddRugPlot.SetText("Add Rug Plot") - ucrChkAddRugPlot.AddParameterPresentCondition(True, "geom_rug") - ucrChkAddRugPlot.AddParameterPresentCondition(False, "geom_rug", False) - ucrChkAddRugPlot.AddToLinkedControls({ucrNudSize, ucrInputSides}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - - ucrSaveScatterPlot.SetPrefix("scatter_plot") - ucrSaveScatterPlot.SetSaveTypeAsGraph() - ucrSaveScatterPlot.SetDataFrameSelector(ucrSelectorForScatter.ucrAvailableDataFrames) - ucrSaveScatterPlot.SetCheckBoxText("Save Graph") - ucrSaveScatterPlot.SetIsComboBox() - ucrSaveScatterPlot.SetAssignToIfUncheckedValue("last_graph") - - ucrNudSize.SetParameter(New RParameter("size", 0)) - ucrNudSize.Increment = 0.1 - ucrNudSize.DecimalPlaces = 1 - - ucrInputSides.SetParameter(New RParameter("sides", 1)) - dctSidesOptions.Add("Bottom and left", Chr(34) & "bl" & Chr(34)) - dctSidesOptions.Add("Top, right and bottom", Chr(34) & "trb" & Chr(34)) - dctSidesOptions.Add("Top, right and left", Chr(34) & "trl" & Chr(34)) - dctSidesOptions.Add("Top, bottom and left", Chr(34) & "tbl" & Chr(34)) - dctSidesOptions.Add("Right, bottom and left", Chr(34) & "rbl" & Chr(34)) - dctSidesOptions.Add("Top and right", Chr(34) & "tr" & Chr(34)) - dctSidesOptions.Add("Top and bottom", Chr(34) & "tb" & Chr(34)) - dctSidesOptions.Add("Top and left", Chr(34) & "tl" & Chr(34)) - dctSidesOptions.Add("Right and bottom", Chr(34) & "rb" & Chr(34)) - dctSidesOptions.Add("Right and left", Chr(34) & "rl" & Chr(34)) - dctSidesOptions.Add("Top", Chr(34) & "t" & Chr(34)) - dctSidesOptions.Add("Right", Chr(34) & "r" & Chr(34)) - dctSidesOptions.Add("Bottom", Chr(34) & "b" & Chr(34)) - dctSidesOptions.Add("Left", Chr(34) & "l" & Chr(34)) - ucrInputSides.SetItems(dctSidesOptions) - ucrInputSides.SetRDefault(Chr(34) & "bl" & Chr(34)) - ucrInputSides.SetDropDownStyleAsNonEditable() - - ucrNudSize.SetLinkedDisplayControl(lblSize) - ucrInputSides.SetLinkedDisplayControl(lblSides) - End Sub - - Private Sub SetDefaults() - clsBaseOperator = New ROperator - clsRggplotFunction = New RFunction - clsRScatterGeomFunction = New RFunction - clsRaesFunction = New RFunction - clsGeomSmoothFunc = New RFunction - clsGeomRugFunction = New RFunction - - ucrSelectorForScatter.Reset() - ucrSelectorForScatter.SetGgplotFunction(clsBaseOperator) - ucrSaveScatterPlot.Reset() - ucrVariablesAsFactorForScatter.SetMeAsReceiver() - sdgPlots.Reset() - bResetSubdialog = True - bResetlayerSubdialog = True - - clsBaseOperator.SetOperation("+") - clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) - clsBaseOperator.AddParameter(strFirstParameterName, clsRFunctionParameter:=clsRScatterGeomFunction, iPosition:=2) - - clsRggplotFunction.SetPackageName("ggplot2") - clsRggplotFunction.SetRCommand("ggplot") - clsRggplotFunction.AddParameter("mapping", clsRFunctionParameter:=clsRaesFunction, iPosition:=1) - - clsRaesFunction.SetPackageName("ggplot2") - clsRaesFunction.SetRCommand("aes") - clsRaesFunction.AddParameter("x", Chr(34) & Chr(34)) - clsRaesFunction.AddParameter("y", Chr(34) & Chr(34)) - - clsRScatterGeomFunction.SetPackageName("ggplot2") - clsRScatterGeomFunction.SetRCommand("geom_point") - - clsGeomRugFunction.SetPackageName("ggplot2") - clsGeomRugFunction.SetRCommand("geom_rug") - clsGeomRugFunction.AddParameter("size", 0.5, iPosition:=0) - - clsBaseOperator.AddParameter(GgplotDefaults.clsDefaultThemeParameter.Clone()) - clsXlabsFunction = GgplotDefaults.clsXlabTitleFunction.Clone() - clsYlabsFunction = GgplotDefaults.clsYlabTitleFunction.Clone() - clsLabsFunction = GgplotDefaults.clsDefaultLabs.Clone() - clsXScalecontinuousFunction = GgplotDefaults.clsXScalecontinuousFunction.Clone() - clsYScalecontinuousFunction = GgplotDefaults.clsYScalecontinuousFunction.Clone() - clsFacetsFunction = GgplotDefaults.clsFacetFunction.Clone() - dctThemeFunctions = New Dictionary(Of String, RFunction)(GgplotDefaults.dctThemeFunctions) - clsCoordPolarStartOperator = GgplotDefaults.clsCoordPolarStartOperator.Clone() - clsCoordPolarFunction = GgplotDefaults.clsCoordPolarFunction.Clone() - clsThemeFunction = GgplotDefaults.clsDefaultThemeFunction - clsLocalRaesFunction = GgplotDefaults.clsAesFunction.Clone() - clsXScaleDateFunction = GgplotDefaults.clsXScaleDateFunction.Clone() - clsYScaleDateFunction = GgplotDefaults.clsYScaleDateFunction.Clone() - clsScaleFillViridisFunction = GgplotDefaults.clsScaleFillViridisFunction - clsScaleColourViridisFunction = GgplotDefaults.clsScaleColorViridisFunction - clsAnnotateFunction = GgplotDefaults.clsAnnotateFunction - - clsGeomSmoothFunc.SetPackageName("ggplot2") - clsGeomSmoothFunc.SetRCommand("geom_smooth") - clsGeomSmoothFunc.AddParameter("method", Chr(34) & "lm" & Chr(34), iPosition:=0) - clsGeomSmoothFunc.AddParameter("se", "FALSE", iPosition:=1) - - clsBaseOperator.SetAssignTo("last_graph", strTempDataframe:=ucrSelectorForScatter.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempGraph:="last_graph") - ucrBase.clsRsyntax.SetBaseROperator(clsBaseOperator) - End Sub - - Public Sub SetRCodeForControls(bReset As Boolean) - ucrSelectorForScatter.SetRCode(clsRggplotFunction, bReset) - ucrReceiverX.SetRCode(clsRaesFunction, bReset) - ucrReceiverLabel.SetRCode(clsRaesFunction, bReset) - ucrVariablesAsFactorForScatter.SetRCode(clsRaesFunction, bReset) - ucrFactorOptionalReceiver.SetRCode(clsRaesFunction, bReset) - ucrChkLineofBestFit.SetRCode(clsBaseOperator, bReset) - ucrSaveScatterPlot.SetRCode(clsBaseOperator, bReset) - ucrChkWithSE.SetRCode(clsGeomSmoothFunc, bReset) - ucrChkAddRugPlot.SetRCode(clsBaseOperator, bReset) - ucrNudSize.SetRCode(clsGeomRugFunction, bReset) - ucrInputSides.SetRCode(clsGeomRugFunction, bReset) - End Sub - - Private Sub TestOkEnabled() - ' Either y or x can be empty but not both - If (Not ucrSaveScatterPlot.IsComplete) OrElse (ucrVariablesAsFactorForScatter.IsEmpty AndAlso ucrReceiverX.IsEmpty()) Then - ucrBase.OKEnabled(False) - Else - ucrBase.OKEnabled(True) - End If - End Sub - - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeForControls(True) - TestOkEnabled() - End Sub - - Private Sub cmdOptions_Click(sender As Object, e As EventArgs) Handles cmdOptions.Click - sdgPlots.SetRCode(clsNewOperator:=ucrBase.clsRsyntax.clsBaseOperator, clsNewGlobalAesFunction:=clsRaesFunction, clsNewYScalecontinuousFunction:=clsYScalecontinuousFunction, clsNewXScalecontinuousFunction:=clsXScalecontinuousFunction, - clsNewLabsFunction:=clsLabsFunction, clsNewXLabsTitleFunction:=clsXlabsFunction, clsNewYLabTitleFunction:=clsYlabsFunction, clsNewFacetFunction:=clsFacetsFunction, clsNewCoordPolarFunction:=clsCoordPolarFunction, - clsNewCoordPolarStartOperator:=clsCoordPolarStartOperator, clsNewThemeFunction:=clsThemeFunction, clsNewScaleFillViridisFunction:=clsScaleFillViridisFunction, clsNewScaleColourViridisFunction:=clsScaleColourViridisFunction, - clsNewXScaleDateFunction:=clsXScaleDateFunction, clsNewYScaleDateFunction:=clsYScaleDateFunction, dctNewThemeFunctions:=dctThemeFunctions, ucrNewBaseSelector:=ucrSelectorForScatter, strMainDialogGeomParameterNames:=strGeomParameterNames, - clsNewAnnotateFunction:=clsAnnotateFunction, bReset:=bResetSubdialog) - sdgPlots.ShowDialog() - bResetSubdialog = False - End Sub - - Private Sub cmdScatterPlotOptions_Click(sender As Object, e As EventArgs) Handles cmdPointOptions.Click - 'SetupLayer sends the components storing the plot info (clsRaesFunction, clsRggplotFunction, ...) of dlgScatteredPlot through to sdgLayerOptions where these will be edited. - sdgLayerOptions.SetupLayer(clsNewGgPlot:=clsRggplotFunction, clsNewGeomFunc:=clsRScatterGeomFunction, clsNewGlobalAesFunc:=clsRaesFunction, clsNewLocalAes:=clsLocalRaesFunction, bFixGeom:=True, ucrNewBaseSelector:=ucrSelectorForScatter, bApplyAesGlobally:=True, bReset:=bResetlayerSubdialog) - 'Coming from the sdgLayerOptions, clsRaesFunction and others has been modified. One then needs to display these modifications on the dlgScatteredPlot. - sdgLayerOptions.ShowDialog() - ucrReceiverLabel.SetRCode(clsRaesFunction, bReset) - bResetlayerSubdialog = False - 'The aesthetics parameters on the main dialog are repopulated as required. - For Each clsParam In clsRaesFunction.clsParameters - If clsParam.strArgumentName = "x" Then - If clsParam.strArgumentValue = Chr(34) & Chr(34) Then - ucrReceiverX.Clear() - Else - ucrReceiverX.Add(clsParam.strArgumentValue) - End If - 'In the y case, the vlue stored in the clsReasFunction in the multiplevariables case is "value", however that one shouldn't be written in the multiple variables receiver (otherwise it would stack all variables and the stack ("value") itself!). - 'Warning: what if someone used the name value for one of it's variables independently from the multiple variables method ? Here if the receiver is actually in single mode, the variable "value" will still be given back, which throws the problem back to the creation of "value" in the multiple receiver case. - ElseIf clsParam.strArgumentName = "y" AndAlso (clsParam.strArgumentValue <> "value" OrElse ucrVariablesAsFactorForScatter.bSingleVariable) Then - 'Still might be in the case of bSingleVariable with mapping y="". - If clsParam.strArgumentValue = (Chr(34) & Chr(34)) Then - ucrVariablesAsFactorForScatter.Clear() - Else ucrVariablesAsFactorForScatter.Add(clsParam.strArgumentValue) - End If - ElseIf clsParam.strArgumentName = "colour" Then - ucrFactorOptionalReceiver.Add(clsParam.strArgumentValue) - End If - Next - End Sub - - Private Sub ucrSaveScatterPlot_ContentsChanged() Handles ucrSaveScatterPlot.ControlContentsChanged, ucrReceiverX.ControlContentsChanged, ucrVariablesAsFactorForScatter.ControlContentsChanged, ucrSaveScatterPlot.ControlContentsChanged - TestOkEnabled() - End Sub - - Private Sub ucrChkLineofBestFit_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkLineofBestFit.ControlValueChanged - If ucrChkLineofBestFit.Checked Then - clsBaseOperator.AddParameter("geom_smooth", clsRFunctionParameter:=clsGeomSmoothFunc, iPosition:=4) - Else - clsBaseOperator.RemoveParameterByName("geom_smooth") - End If - End Sub - - Private Sub ucrChkAddRugPlot_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkAddRugPlot.ControlValueChanged - If ucrChkAddRugPlot.Checked Then - clsBaseOperator.AddParameter("geom_rug", clsRFunctionParameter:=clsGeomRugFunction, iPosition:=3) - Else - clsBaseOperator.RemoveParameterByName("geom_rug") - End If - End Sub -End Class +Imports instat.Translations + +Public Class dlgScatterPlot + Private clsRggplotFunction As New RFunction + Private clsRScatterGeomFunction As New RFunction + Private clsRaesFunction As New RFunction + Private clsLocalRaesFunction As New RFunction + Private clsBaseOperator As New ROperator + Private bFirstLoad As Boolean = True + Private bReset As Boolean = True + Private bResetSubdialog As Boolean = True + Private bResetlayerSubdialog As Boolean = True + Private clsLabsFunction As New RFunction + Private clsXlabsFunction As New RFunction + Private clsYlabsFunction As New RFunction + Private clsXScalecontinuousFunction As New RFunction + Private clsYScalecontinuousFunction As New RFunction + Private clsFacetsFunction As New RFunction + Private clsThemeFunction As New RFunction + Private dctThemeFunctions As New Dictionary(Of String, RFunction) + Private clsGeomSmoothFunc As New RFunction + Private clsCoordPolarFunction As New RFunction + Private clsCoordPolarStartOperator As New ROperator + Private clsXScaleDateFunction As New RFunction + Private clsYScaleDateFunction As New RFunction + Private clsScaleFillViridisFunction As New RFunction + Private clsScaleColourViridisFunction As New RFunction + Private clsAnnotateFunction As New RFunction + Private clsGeomRugFunction As New RFunction + 'Parameter names for geoms + Private strFirstParameterName As String = "geomfunc" + Private strGeomSmoothParameterName As String = "geom_smooth" + Private strGeomParameterNames() As String = {strFirstParameterName, strGeomSmoothParameterName} + + Private Sub dlgScatterPlot_Load(sender As Object, e As EventArgs) Handles MyBase.Load + If bFirstLoad Then + InitialiseDialog() + bFirstLoad = False + End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False + TestOkEnabled() + autoTranslate(Me) + End Sub + + Private Sub InitialiseDialog() + Dim clsGeomRugParameter As New RParameter + Dim dctSidesOptions As New Dictionary(Of String, String) + + ucrBase.iHelpTopicID = 433 + ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False + ucrBase.clsRsyntax.iCallType = 3 + + ucrSelectorForScatter.SetParameter(New RParameter("data", 0)) + ucrSelectorForScatter.SetParameterIsrfunction() + + ucrVariablesAsFactorForScatter.SetParameter(New RParameter("y", 1)) + ucrVariablesAsFactorForScatter.SetParameterIsString() + ucrVariablesAsFactorForScatter.bWithQuotes = False + ucrVariablesAsFactorForScatter.Selector = ucrSelectorForScatter + ucrVariablesAsFactorForScatter.SetFactorReceiver(ucrFactorOptionalReceiver) + ucrVariablesAsFactorForScatter.strSelectorHeading = "Variables" + ucrVariablesAsFactorForScatter.SetValuesToIgnore({Chr(34) & Chr(34)}) + ucrVariablesAsFactorForScatter.bAddParameterIfEmpty = True + + ucrReceiverX.SetParameter(New RParameter("x", 0)) + ucrReceiverX.SetParameterIsString() + ucrReceiverX.bWithQuotes = False + ucrReceiverX.Selector = ucrSelectorForScatter + ucrReceiverX.strSelectorHeading = "Variables" + ucrReceiverX.SetValuesToIgnore({Chr(34) & Chr(34)}) + ucrReceiverX.bAddParameterIfEmpty = True + + ucrReceiverLabel.SetParameter(New RParameter("label")) + ucrReceiverLabel.SetParameterIsString() + ucrReceiverLabel.bWithQuotes = False + ucrReceiverLabel.Selector = ucrSelectorForScatter + ucrReceiverLabel.strSelectorHeading = "Variables" + + ucrFactorOptionalReceiver.SetParameter(New RParameter("colour", 2)) + ucrFactorOptionalReceiver.SetParameterIsString() + ucrFactorOptionalReceiver.bWithQuotes = False + ucrFactorOptionalReceiver.Selector = ucrSelectorForScatter + ucrFactorOptionalReceiver.strSelectorHeading = "Variables" + + ucrChkLineofBestFit.SetText("Add Line of Best Fit") + ucrChkLineofBestFit.AddParameterPresentCondition(True, "geom_smooth") + ucrChkLineofBestFit.AddParameterPresentCondition(False, "geom_smooth", False) + ucrChkLineofBestFit.AddToLinkedControls(ucrChkWithSE, {True}, bNewLinkedHideIfParameterMissing:=True) + + ucrChkWithSE.SetText("With Standard Error") + ucrChkWithSE.SetParameter(New RParameter("se"), bNewAddRemoveParameter:=False, bNewChangeParameterValue:=True) + ucrChkWithSE.SetValuesCheckedAndUnchecked("TRUE", "FALSE") + ucrChkWithSE.SetRDefault("TRUE") + + ucrChkAddRugPlot.SetText("Add Rug Plot") + ucrChkAddRugPlot.AddParameterPresentCondition(True, "geom_rug") + ucrChkAddRugPlot.AddParameterPresentCondition(False, "geom_rug", False) + ucrChkAddRugPlot.AddToLinkedControls({ucrNudSize, ucrInputSides}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + + ucrSaveScatterPlot.SetPrefix("scatter_plot") + ucrSaveScatterPlot.SetSaveType(strRObjectType:=RObjectTypeLabel.Graph, + strRObjectFormat:=RObjectFormat.Image) + ucrSaveScatterPlot.SetDataFrameSelector(ucrSelectorForScatter.ucrAvailableDataFrames) + ucrSaveScatterPlot.SetCheckBoxText("Save Graph") + ucrSaveScatterPlot.SetIsComboBox() + ucrSaveScatterPlot.SetAssignToIfUncheckedValue("last_graph") + + ucrNudSize.SetParameter(New RParameter("size", 0)) + ucrNudSize.Increment = 0.1 + ucrNudSize.DecimalPlaces = 1 + + ucrInputSides.SetParameter(New RParameter("sides", 1)) + dctSidesOptions.Add("Bottom and left", Chr(34) & "bl" & Chr(34)) + dctSidesOptions.Add("Top, right and bottom", Chr(34) & "trb" & Chr(34)) + dctSidesOptions.Add("Top, right and left", Chr(34) & "trl" & Chr(34)) + dctSidesOptions.Add("Top, bottom and left", Chr(34) & "tbl" & Chr(34)) + dctSidesOptions.Add("Right, bottom and left", Chr(34) & "rbl" & Chr(34)) + dctSidesOptions.Add("Top and right", Chr(34) & "tr" & Chr(34)) + dctSidesOptions.Add("Top and bottom", Chr(34) & "tb" & Chr(34)) + dctSidesOptions.Add("Top and left", Chr(34) & "tl" & Chr(34)) + dctSidesOptions.Add("Right and bottom", Chr(34) & "rb" & Chr(34)) + dctSidesOptions.Add("Right and left", Chr(34) & "rl" & Chr(34)) + dctSidesOptions.Add("Top", Chr(34) & "t" & Chr(34)) + dctSidesOptions.Add("Right", Chr(34) & "r" & Chr(34)) + dctSidesOptions.Add("Bottom", Chr(34) & "b" & Chr(34)) + dctSidesOptions.Add("Left", Chr(34) & "l" & Chr(34)) + ucrInputSides.SetItems(dctSidesOptions) + ucrInputSides.SetRDefault(Chr(34) & "bl" & Chr(34)) + ucrInputSides.SetDropDownStyleAsNonEditable() + + ucrNudSize.SetLinkedDisplayControl(lblSize) + ucrInputSides.SetLinkedDisplayControl(lblSides) + End Sub + + Private Sub SetDefaults() + clsBaseOperator = New ROperator + clsRggplotFunction = New RFunction + clsRScatterGeomFunction = New RFunction + clsRaesFunction = New RFunction + clsGeomSmoothFunc = New RFunction + clsGeomRugFunction = New RFunction + + ucrSelectorForScatter.Reset() + ucrSelectorForScatter.SetGgplotFunction(clsBaseOperator) + ucrSaveScatterPlot.Reset() + ucrVariablesAsFactorForScatter.SetMeAsReceiver() + sdgPlots.Reset() + bResetSubdialog = True + bResetlayerSubdialog = True + + clsBaseOperator.SetOperation("+") + clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) + clsBaseOperator.AddParameter(strFirstParameterName, clsRFunctionParameter:=clsRScatterGeomFunction, iPosition:=2) + + clsRggplotFunction.SetPackageName("ggplot2") + clsRggplotFunction.SetRCommand("ggplot") + clsRggplotFunction.AddParameter("mapping", clsRFunctionParameter:=clsRaesFunction, iPosition:=1) + + clsRaesFunction.SetPackageName("ggplot2") + clsRaesFunction.SetRCommand("aes") + clsRaesFunction.AddParameter("x", Chr(34) & Chr(34)) + clsRaesFunction.AddParameter("y", Chr(34) & Chr(34)) + + clsRScatterGeomFunction.SetPackageName("ggplot2") + clsRScatterGeomFunction.SetRCommand("geom_point") + + clsGeomRugFunction.SetPackageName("ggplot2") + clsGeomRugFunction.SetRCommand("geom_rug") + clsGeomRugFunction.AddParameter("size", 0.5, iPosition:=0) + + clsBaseOperator.AddParameter(GgplotDefaults.clsDefaultThemeParameter.Clone()) + clsXlabsFunction = GgplotDefaults.clsXlabTitleFunction.Clone() + clsYlabsFunction = GgplotDefaults.clsYlabTitleFunction.Clone() + clsLabsFunction = GgplotDefaults.clsDefaultLabs.Clone() + clsXScalecontinuousFunction = GgplotDefaults.clsXScalecontinuousFunction.Clone() + clsYScalecontinuousFunction = GgplotDefaults.clsYScalecontinuousFunction.Clone() + clsFacetsFunction = GgplotDefaults.clsFacetFunction.Clone() + dctThemeFunctions = New Dictionary(Of String, RFunction)(GgplotDefaults.dctThemeFunctions) + clsCoordPolarStartOperator = GgplotDefaults.clsCoordPolarStartOperator.Clone() + clsCoordPolarFunction = GgplotDefaults.clsCoordPolarFunction.Clone() + clsThemeFunction = GgplotDefaults.clsDefaultThemeFunction + clsLocalRaesFunction = GgplotDefaults.clsAesFunction.Clone() + clsXScaleDateFunction = GgplotDefaults.clsXScaleDateFunction.Clone() + clsYScaleDateFunction = GgplotDefaults.clsYScaleDateFunction.Clone() + clsScaleFillViridisFunction = GgplotDefaults.clsScaleFillViridisFunction + clsScaleColourViridisFunction = GgplotDefaults.clsScaleColorViridisFunction + clsAnnotateFunction = GgplotDefaults.clsAnnotateFunction + + clsGeomSmoothFunc.SetPackageName("ggplot2") + clsGeomSmoothFunc.SetRCommand("geom_smooth") + clsGeomSmoothFunc.AddParameter("method", Chr(34) & "lm" & Chr(34), iPosition:=0) + clsGeomSmoothFunc.AddParameter("se", "FALSE", iPosition:=1) + + clsBaseOperator.SetAssignToRObject(strRObjectToAssignTo:="last_graph", + strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Graph, + strRObjectFormatToAssignTo:=RObjectFormat.Image, + strRDataFrameNameToAddObjectTo:=ucrSelectorForScatter.strCurrentDataFrame, + strObjectName:="last_graph") + + ucrBase.clsRsyntax.SetBaseROperator(clsBaseOperator) + End Sub + + Public Sub SetRCodeForControls(bReset As Boolean) + ucrSelectorForScatter.SetRCode(clsRggplotFunction, bReset) + ucrReceiverX.SetRCode(clsRaesFunction, bReset) + ucrReceiverLabel.SetRCode(clsRaesFunction, bReset) + ucrVariablesAsFactorForScatter.SetRCode(clsRaesFunction, bReset) + ucrFactorOptionalReceiver.SetRCode(clsRaesFunction, bReset) + ucrChkLineofBestFit.SetRCode(clsBaseOperator, bReset) + ucrSaveScatterPlot.SetRCode(clsBaseOperator, bReset) + ucrChkWithSE.SetRCode(clsGeomSmoothFunc, bReset) + ucrChkAddRugPlot.SetRCode(clsBaseOperator, bReset) + ucrNudSize.SetRCode(clsGeomRugFunction, bReset) + ucrInputSides.SetRCode(clsGeomRugFunction, bReset) + End Sub + + Private Sub TestOkEnabled() + ' Either y or x can be empty but not both + If (Not ucrSaveScatterPlot.IsComplete) OrElse (ucrVariablesAsFactorForScatter.IsEmpty AndAlso ucrReceiverX.IsEmpty()) Then + ucrBase.OKEnabled(False) + Else + ucrBase.OKEnabled(True) + End If + End Sub + + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset + SetDefaults() + SetRCodeForControls(True) + TestOkEnabled() + End Sub + + Private Sub cmdOptions_Click(sender As Object, e As EventArgs) Handles cmdOptions.Click + sdgPlots.SetRCode(clsNewOperator:=ucrBase.clsRsyntax.clsBaseOperator, clsNewGlobalAesFunction:=clsRaesFunction, clsNewYScalecontinuousFunction:=clsYScalecontinuousFunction, clsNewXScalecontinuousFunction:=clsXScalecontinuousFunction, + clsNewLabsFunction:=clsLabsFunction, clsNewXLabsTitleFunction:=clsXlabsFunction, clsNewYLabTitleFunction:=clsYlabsFunction, clsNewFacetFunction:=clsFacetsFunction, clsNewCoordPolarFunction:=clsCoordPolarFunction, + clsNewCoordPolarStartOperator:=clsCoordPolarStartOperator, clsNewThemeFunction:=clsThemeFunction, clsNewScaleFillViridisFunction:=clsScaleFillViridisFunction, clsNewScaleColourViridisFunction:=clsScaleColourViridisFunction, + clsNewXScaleDateFunction:=clsXScaleDateFunction, clsNewYScaleDateFunction:=clsYScaleDateFunction, dctNewThemeFunctions:=dctThemeFunctions, ucrNewBaseSelector:=ucrSelectorForScatter, strMainDialogGeomParameterNames:=strGeomParameterNames, + clsNewAnnotateFunction:=clsAnnotateFunction, bReset:=bResetSubdialog) + sdgPlots.ShowDialog() + bResetSubdialog = False + End Sub + + Private Sub cmdScatterPlotOptions_Click(sender As Object, e As EventArgs) Handles cmdPointOptions.Click + 'SetupLayer sends the components storing the plot info (clsRaesFunction, clsRggplotFunction, ...) of dlgScatteredPlot through to sdgLayerOptions where these will be edited. + sdgLayerOptions.SetupLayer(clsNewGgPlot:=clsRggplotFunction, clsNewGeomFunc:=clsRScatterGeomFunction, clsNewGlobalAesFunc:=clsRaesFunction, clsNewLocalAes:=clsLocalRaesFunction, bFixGeom:=True, ucrNewBaseSelector:=ucrSelectorForScatter, bApplyAesGlobally:=True, bReset:=bResetlayerSubdialog) + 'Coming from the sdgLayerOptions, clsRaesFunction and others has been modified. One then needs to display these modifications on the dlgScatteredPlot. + sdgLayerOptions.ShowDialog() + ucrReceiverLabel.SetRCode(clsRaesFunction, bReset) + bResetlayerSubdialog = False + 'The aesthetics parameters on the main dialog are repopulated as required. + For Each clsParam In clsRaesFunction.clsParameters + If clsParam.strArgumentName = "x" Then + If clsParam.strArgumentValue = Chr(34) & Chr(34) Then + ucrReceiverX.Clear() + Else + ucrReceiverX.Add(clsParam.strArgumentValue) + End If + 'In the y case, the vlue stored in the clsReasFunction in the multiplevariables case is "value", however that one shouldn't be written in the multiple variables receiver (otherwise it would stack all variables and the stack ("value") itself!). + 'Warning: what if someone used the name value for one of it's variables independently from the multiple variables method ? Here if the receiver is actually in single mode, the variable "value" will still be given back, which throws the problem back to the creation of "value" in the multiple receiver case. + ElseIf clsParam.strArgumentName = "y" AndAlso (clsParam.strArgumentValue <> "value" OrElse ucrVariablesAsFactorForScatter.bSingleVariable) Then + 'Still might be in the case of bSingleVariable with mapping y="". + If clsParam.strArgumentValue = (Chr(34) & Chr(34)) Then + ucrVariablesAsFactorForScatter.Clear() + Else ucrVariablesAsFactorForScatter.Add(clsParam.strArgumentValue) + End If + ElseIf clsParam.strArgumentName = "colour" Then + ucrFactorOptionalReceiver.Add(clsParam.strArgumentValue) + End If + Next + End Sub + + Private Sub ucrSaveScatterPlot_ContentsChanged() Handles ucrSaveScatterPlot.ControlContentsChanged, ucrReceiverX.ControlContentsChanged, ucrVariablesAsFactorForScatter.ControlContentsChanged, ucrSaveScatterPlot.ControlContentsChanged + TestOkEnabled() + End Sub + + Private Sub ucrChkLineofBestFit_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkLineofBestFit.ControlValueChanged + If ucrChkLineofBestFit.Checked Then + clsBaseOperator.AddParameter("geom_smooth", clsRFunctionParameter:=clsGeomSmoothFunc, iPosition:=4) + Else + clsBaseOperator.RemoveParameterByName("geom_smooth") + End If + End Sub + + Private Sub ucrChkAddRugPlot_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkAddRugPlot.ControlValueChanged + If ucrChkAddRugPlot.Checked Then + clsBaseOperator.AddParameter("geom_rug", clsRFunctionParameter:=clsGeomRugFunction, iPosition:=3) + Else + clsBaseOperator.RemoveParameterByName("geom_rug") + End If + End Sub +End Class \ No newline at end of file diff --git a/instat/dlgSummaryTables.vb b/instat/dlgSummaryTables.vb index 30a5e36beed..431f4ab92bd 100644 --- a/instat/dlgSummaryTables.vb +++ b/instat/dlgSummaryTables.vb @@ -11,624 +11,625 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . -Imports instat.Translations -Public Class dlgSummaryTables - Private bFirstload As Boolean = True - Private bReset As Boolean = True - Private clsSummariesList As New RFunction - Private bResetSubdialog As Boolean = False - Private clsSummaryDefaultFunction, clsFrequencyDefaultFunction, clsConcFunction, - clsMutableFunction As New RFunction - Private clsSummariesHeaderLeftTopFunction, clsSummariesHeaderTopLeftFunction, - clsVariableHeaderLeftTopFunction, clsVariableHeaderTopLeftFunction, clsStubHeadFunction, - clsummaryVariableHeaderLeftTopFunction, clsSummaryVariableHeaderTopLeftFunction As New RFunction - - Private clsTableTitleFunction, clsTabFootnoteTitleFunction, clsTableSourcenoteFunction, - clsCellTextFunction, clsCellBorderFunction, clsCellFillFunction, clsHeaderFormatFunction, - clsTabOptionsFunction, clsBorderWeightPxFunction, clsFootnoteTitleLocationFunction, clsFootnoteSubtitleLocationFunction, - clsTabFootnoteSubtitleFunction, clsStyleListFunction, clsFootnoteCellFunction, clsFootnoteCellBodyFunction, - clsSecondFootnoteCellFunction, clsSecondFootnoteCellBodyFunction, clsTabStyleFunction, clsDummyFunction, - clsTabStyleCellTextFunction, clsTabStylePxFunction, clsTabStyleCellTitleFunction As New RFunction - - Private clsMmtableOperator, clsSummaryOperator, clsFrequencyOperator, clsColumnOperator, - clsPipeOperator, clsJoiningPipeOperator, clsTabFootnoteOperator As New ROperator - - Private Sub dlgNewSummaryTables_Load(sender As Object, e As EventArgs) Handles MyBase.Load - If bFirstload Then - InitialiseDialog() - bFirstload = False - End If - If bReset Then - SetDefaults() - End If - SetRCodeForControls(bReset) - bReset = False - autoTranslate(Me) - TestOKEnabled() - End Sub - - Private Sub InitialiseDialog() - ucrBase.clsRsyntax.iCallType = 2 - ucrBase.iHelpTopicID = 426 - ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False - - 'summary_name = NA - 8 - ucrSelectorSummaryTables.SetParameter(New RParameter("data_name", 0)) - ucrSelectorSummaryTables.SetParameterIsString() - - ucrReceiverSummaryCols.SetParameter(New RParameter("columns_to_summarise", 1)) - ucrReceiverSummaryCols.Selector = ucrSelectorSummaryTables - ucrReceiverSummaryCols.SetDataType("numeric") - ucrReceiverSummaryCols.SetParameterIsString() - ucrReceiverSummaryCols.SetLinkedDisplayControl(lblVariables) - - ucrReceiverFactors.SetParameter(New RParameter("factors", 2)) - ucrReceiverFactors.SetParameterIsString() - ucrReceiverFactors.Selector = ucrSelectorSummaryTables - ucrReceiverFactors.SetDataType("factor") - - ucrReceiverWeights.SetParameter(New RParameter("weights", 3)) - ucrReceiverWeights.SetParameterIsString() - ucrReceiverWeights.Selector = ucrSelectorSummaryTables - ucrReceiverWeights.SetDataType("numeric") - - ucrReceiverMultiplePercentages.SetParameter(New RParameter("perc_total_factors", 1)) - ucrReceiverMultiplePercentages.SetParameterIsString() - ucrReceiverMultiplePercentages.Selector = ucrSelectorSummaryTables - ucrReceiverMultiplePercentages.SetDataType("factor") ' TODO data this accepts must be in the other receiver too - ucrReceiverMultiplePercentages.SetLinkedDisplayControl(lblFactorsAsPercentage) - - ucrChkStoreResults.SetText("Store Output") - ucrChkStoreResults.SetParameter(New RParameter("store_table", 4)) - ucrChkStoreResults.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkStoreResults.SetRDefault("FALSE") - - ucrChkOmitMissing.SetParameter(New RParameter("na.rm", 5)) - ucrChkOmitMissing.SetText("Omit Missing Values") - ucrChkOmitMissing.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkOmitMissing.SetRDefault("FALSE") - - ucrChkDisplayMargins.SetParameter(New RParameter("include_margins", 6)) - ucrChkDisplayMargins.SetText("Display Outer Margins") - ucrChkDisplayMargins.SetRDefault("FALSE") - ucrChkDisplayMargins.AddToLinkedControls({ucrInputMarginName}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True, - bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="All") - ucrChkDisplayMargins.AddToLinkedControls({ucrPnlMargin}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True, - bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoOuter) - - ucrChkFrequencyDisplayMargins.SetParameter(New RParameter("include_margins", 3)) - ucrChkFrequencyDisplayMargins.SetText("Display Margins") - ucrChkFrequencyDisplayMargins.SetRDefault("FALSE") - ucrChkFrequencyDisplayMargins.AddToLinkedControls(ucrInputFrequencyMarginName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, - bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="All", bNewLinkedUpdateFunction:=True) - - ucrInputFrequencyMarginName.SetParameter(New RParameter("margin_name", iNewPosition:=5)) - ucrInputFrequencyMarginName.SetLinkedDisplayControl(lblFrequencyMarginName) - - ucrChkDisplaySummariesAsRow.SetText("Display Summaries As Rows") - ucrChkDisplaySummariesAsRow.AddParameterPresentCondition(True, "summariesLeftTop") - ucrChkDisplaySummariesAsRow.AddParameterPresentCondition(False, "summariesLeftTop", False) - - ucrChkDisplaySummaryVariablesAsRow.SetText("Display Summary_Variables As Rows") - ucrChkDisplaySummaryVariablesAsRow.AddParameterPresentCondition(True, "summariesVariableLeftTop") - ucrChkDisplaySummaryVariablesAsRow.AddParameterPresentCondition(False, "summariesVariableLeftTop", False) - - ucrChkDisplayVariablesAsRows.SetText("Display Variables As Rows") - ucrChkDisplayVariablesAsRows.AddParameterPresentCondition(True, "variablesLeftTop") - ucrChkDisplayVariablesAsRows.AddParameterPresentCondition(False, "variablesLeftTop", False) - - ucrNudColumnFactors.SetLinkedDisplayControl(lblColumnFactors) - ucrNudColumnFactors.SetMinMax(iNewMin:=0) - ucrNudColumnFactors.Increment = 1 - - ucrPnlMargin.SetParameter(New RParameter("margins", iNewPosition:=7)) - ucrPnlMargin.AddRadioButton(rdoOuter, Chr(34) & "outer" & Chr(34)) - ucrPnlMargin.AddRadioButton(rdoSummary, Chr(34) & "summary" & Chr(34)) - ucrPnlMargin.AddRadioButton(rdoBoth, "c(""outer"",""summary"")") - ucrPnlMargin.SetLinkedDisplayControl(grpMargin) - - ucrInputMarginName.SetParameter(New RParameter("margin_name", iNewPosition:=5)) - ucrInputMarginName.SetLinkedDisplayControl(lblMarginName) - - ucrChkSummaries.SetParameter(New RParameter("treat_columns_as_factor", 8)) - ucrChkSummaries.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkSummaries.SetText("Treat Summaries as a Further Factor") - ucrChkSummaries.AddToLinkedControls({ucrChkDisplaySummariesAsRow, ucrChkDisplayVariablesAsRows}, {True}, - bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkSummaries.AddToLinkedControls(ucrChkDisplaySummaryVariablesAsRow, {False}, bNewLinkedAddRemoveParameter:=True, - bNewLinkedHideIfParameterMissing:=True) - - ucrNudSigFigs.SetParameter(New RParameter("signif_fig", 9)) - ucrNudSigFigs.SetMinMax(0, 22) - ucrNudSigFigs.SetRDefault(2) - - ucrChkWeight.SetText("Weights") - ucrChkWeight.SetParameter(ucrReceiverWeights.GetParameter(), bNewChangeParameterValue:=False, bNewAddRemoveParameter:=True) - ucrChkWeight.AddToLinkedControls(ucrReceiverWeights, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - 'Not yet implemented - ucrChkWeight.Visible = False - - ucrPnlSummaryFrequencyTables.AddRadioButton(rdoSummaryTable) - ucrPnlSummaryFrequencyTables.AddRadioButton(rdoFrequencyTable) - ucrPnlSummaryFrequencyTables.AddParameterValuesCondition(rdoSummaryTable, "rdo_checked", "rdoSummary") - ucrPnlSummaryFrequencyTables.AddParameterValuesCondition(rdoFrequencyTable, "rdo_checked", "rdoFrequency") - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrReceiverSummaryCols}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrReorderSummary}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkDisplayAsPercentage}, {rdoFrequencyTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkSummaries}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkDisplayMargins}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkFrequencyDisplayMargins}, {rdoFrequencyTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkOmitMissing}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - - ucrChkDisplayAsPercentage.SetParameter(New RParameter("percentage_type", 2)) - ucrChkDisplayAsPercentage.SetText("As Percentages") - ucrChkDisplayAsPercentage.SetValuesCheckedAndUnchecked(Chr(34) & "factors" & Chr(34), Chr(34) & "none" & Chr(34)) - ucrChkDisplayAsPercentage.SetRDefault(Chr(34) & "none" & Chr(34)) - - ucrChkDisplayAsPercentage.AddToLinkedControls(ucrReceiverMultiplePercentages, {True}, bNewLinkedHideIfParameterMissing:=True, - bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) - ucrChkDisplayAsPercentage.AddToLinkedControls(ucrChkPercentageProportion, {True}, bNewLinkedAddRemoveParameter:=True, - bNewLinkedHideIfParameterMissing:=True, bNewLinkedUpdateFunction:=True) - ucrChkDisplayAsPercentage.SetLinkedDisplayControl(grpPercentages) - - ucrChkPercentageProportion.SetParameter(New RParameter("perc_decimal", 3)) - ucrChkPercentageProportion.SetText("Display as Decimal") - ucrChkPercentageProportion.SetRDefault("FALSE") - - ucrSaveTable.SetPrefix("summary_table") - ucrSaveTable.SetSaveTypeAsTable() - ucrSaveTable.SetDataFrameSelector(ucrSelectorSummaryTables.ucrAvailableDataFrames) - ucrSaveTable.SetIsComboBox() - ucrSaveTable.SetCheckBoxText("Save Table") - ucrSaveTable.SetAssignToIfUncheckedValue("last_table") - - ucrReorderSummary.bDataIsSummaries = True - End Sub - - Private Sub SetDefaults() - clsSummaryDefaultFunction = New RFunction - clsFrequencyDefaultFunction = New RFunction - clsSummariesList = New RFunction - clsConcFunction = New RFunction - clsMutableFunction = New RFunction - clsSummariesHeaderLeftTopFunction = New RFunction - clsSummariesHeaderTopLeftFunction = New RFunction - clsVariableHeaderLeftTopFunction = New RFunction - clsVariableHeaderTopLeftFunction = New RFunction - clsummaryVariableHeaderLeftTopFunction = New RFunction - clsSummaryVariableHeaderTopLeftFunction = New RFunction - clsTableTitleFunction = New RFunction - clsTabFootnoteTitleFunction = New RFunction - clsTableSourcenoteFunction = New RFunction - clsCellTextFunction = New RFunction - clsCellBorderFunction = New RFunction - clsCellFillFunction = New RFunction - clsHeaderFormatFunction = New RFunction - clsTabOptionsFunction = New RFunction - clsBorderWeightPxFunction = New RFunction - clsFootnoteTitleLocationFunction = New RFunction - clsFootnoteSubtitleLocationFunction = New RFunction - clsStyleListFunction = New RFunction - clsSummaryOperator = New ROperator - clsColumnOperator = New ROperator - clsPipeOperator = New ROperator - clsTabFootnoteSubtitleFunction = New RFunction - clsFootnoteCellBodyFunction = New RFunction - clsSecondFootnoteCellBodyFunction = New RFunction - clsFootnoteCellFunction = New RFunction - clsSecondFootnoteCellFunction = New RFunction - clsStubHeadFunction = New RFunction - clsTabStyleFunction = New RFunction - clsTabStyleCellTextFunction = New RFunction - clsTabStylePxFunction = New RFunction - clsTabStyleCellTitleFunction = New RFunction - clsJoiningPipeOperator = New ROperator - clsTabFootnoteOperator = New ROperator - clsFrequencyOperator = New ROperator - clsMmtableOperator = New ROperator - clsDummyFunction = New RFunction - - ucrReceiverFactors.SetMeAsReceiver() - ucrSelectorSummaryTables.Reset() - ucrSaveTable.Reset() - ucrNudColumnFactors.SetText(1) - - ucrBase.clsRsyntax.lstBeforeCodes.Clear() - - clsDummyFunction.AddParameter("rdo_checked", "rdoFrequency", iPosition:=10) - - clsSummaryOperator.SetOperation("+") - - clsFrequencyOperator.SetOperation("+") - - clsColumnOperator.SetOperation("+") - - clsMmtableOperator.SetOperation("+") - - clsConcFunction.SetRCommand("c") - - clsPipeOperator.SetOperation("%>%") - clsPipeOperator.bBrackets = False - - clsTabFootnoteOperator.SetOperation("%>%") - clsTabFootnoteOperator.bBrackets = False - - clsJoiningPipeOperator.SetOperation("%>%") - clsJoiningPipeOperator.AddParameter("mutable", clsROperatorParameter:=clsSummaryOperator, iPosition:=0) - - clsStubHeadFunction.SetPackageName("gt") - clsStubHeadFunction.SetRCommand("tab_stubhead") - - clsTabStyleFunction.SetRCommand("tab_style") - clsTabStyleFunction.SetPackageName("gt") - clsTabStyleFunction.AddParameter("style", clsRFunctionParameter:=clsTabStyleCellTextFunction, iPosition:=0) - clsTabStyleFunction.AddParameter("location", clsRFunctionParameter:=clsTabStyleCellTitleFunction, iPosition:=1) - - clsTabStyleCellTitleFunction.SetPackageName("gt") - clsTabStyleCellTitleFunction.SetRCommand("cells_title") - clsTabStyleCellTitleFunction.AddParameter("groups", Chr(34) & "title" & Chr(34), iPosition:=0) - - clsTabStyleCellTextFunction.SetPackageName("gt") - clsTabStyleCellTextFunction.SetRCommand("cell_text") - clsTabStyleCellTextFunction.AddParameter("size", clsRFunctionParameter:=clsTabStylePxFunction, iPosition:=0) - - clsTabStylePxFunction.SetPackageName("gt") - clsTabStylePxFunction.SetRCommand("px") - clsTabStylePxFunction.AddParameter("size", "18", bIncludeArgumentName:=False, iPosition:=0) - - clsSummariesHeaderLeftTopFunction.SetPackageName("mmtable2") - clsSummariesHeaderLeftTopFunction.SetRCommand("header_left_top") - clsSummariesHeaderLeftTopFunction.AddParameter("variable", "summary", iPosition:=0) - - clsSummariesHeaderTopLeftFunction.SetPackageName("mmtable2") - clsSummariesHeaderTopLeftFunction.SetRCommand("header_top_left") - clsSummariesHeaderTopLeftFunction.AddParameter("variable", "summary", iPosition:=0) - - clsVariableHeaderLeftTopFunction.SetPackageName("mmtable2") - clsVariableHeaderLeftTopFunction.SetRCommand("header_left_top") - clsVariableHeaderLeftTopFunction.AddParameter("variable", "variable", iPosition:=0) - - clsVariableHeaderTopLeftFunction.SetPackageName("mmtable2") - clsVariableHeaderTopLeftFunction.SetRCommand("header_top_left") - clsVariableHeaderTopLeftFunction.AddParameter("variable", "variable", iPosition:=0) - - clsummaryVariableHeaderLeftTopFunction.SetPackageName("mmtable2") - clsummaryVariableHeaderLeftTopFunction.SetRCommand("header_left_top") - clsummaryVariableHeaderLeftTopFunction.AddParameter("variable", Chr(39) & "summary-variable" & Chr(39), iPosition:=0) - - clsSummaryVariableHeaderTopLeftFunction.SetPackageName("mmtable2") - clsSummaryVariableHeaderTopLeftFunction.SetRCommand("header_top_left") - clsSummaryVariableHeaderTopLeftFunction.AddParameter("variable", Chr(39) & "summary-variable" & Chr(39), iPosition:=0) - - clsMutableFunction.SetPackageName("mmtable2") - clsMutableFunction.SetRCommand("mmtable") - clsMutableFunction.AddParameter("data", clsRFunctionParameter:=clsSummaryDefaultFunction, iPosition:=0) - clsMutableFunction.AddParameter("cells", "value", iPosition:=1) - - clsSummaryOperator.AddParameter("mutableFunc", clsRFunctionParameter:=clsMutableFunction, iPosition:=0) - clsSummaryOperator.AddParameter("summariesVariableTopLeft", clsRFunctionParameter:=clsSummaryVariableHeaderTopLeftFunction, iPosition:=1) - - clsFrequencyOperator.SetOperation("+") - clsFrequencyOperator.AddParameter("mmtable2", clsRFunctionParameter:=clsMutableFunction, iPosition:=0) - - clsSummariesList.SetRCommand("c") - clsSummariesList.AddParameter("summary_mean", Chr(34) & "summary_mean" & Chr(34), bIncludeArgumentName:=False) ' TODO decide which default(s) to use? - - clsSummaryDefaultFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$summary_table") - clsSummaryDefaultFunction.AddParameter("treat_columns_as_factor", "FALSE", iPosition:=8) - clsSummaryDefaultFunction.AddParameter("summaries", clsRFunctionParameter:=clsSummariesList, iPosition:=12) - clsSummaryDefaultFunction.SetAssignTo("summary_table") - - clsFrequencyDefaultFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$summary_table") - clsFrequencyDefaultFunction.AddParameter("store_results", "FALSE", iPosition:=2) - clsFrequencyDefaultFunction.AddParameter("treat_columns_as_factor", "FALSE", iPosition:=10) - clsFrequencyDefaultFunction.AddParameter("summaries", "count_label", iPosition:=11) - clsFrequencyDefaultFunction.SetAssignTo("frequency_table") - - clsTableTitleFunction.SetPackageName("gt") - clsTableTitleFunction.SetRCommand("tab_header") - - clsTabFootnoteTitleFunction.SetPackageName("gt") - clsTabFootnoteTitleFunction.SetRCommand("tab_footnote") - - clsTabFootnoteSubtitleFunction.SetPackageName("gt") - clsTabFootnoteSubtitleFunction.SetRCommand("tab_footnote") - - clsFootnoteCellFunction.SetPackageName("gt") - clsFootnoteCellFunction.SetRCommand("tab_footnote") - - clsSecondFootnoteCellFunction.SetPackageName("gt") - clsSecondFootnoteCellFunction.SetRCommand("tab_footnote") - - clsFootnoteTitleLocationFunction.SetPackageName("gt") - clsFootnoteTitleLocationFunction.SetRCommand("cells_title") - - clsFootnoteSubtitleLocationFunction.SetPackageName("gt") - clsFootnoteSubtitleLocationFunction.SetRCommand("cells_title") - - clsTableSourcenoteFunction.SetPackageName("gt") - clsTableSourcenoteFunction.SetRCommand("tab_source_note") - - clsFootnoteCellBodyFunction.SetPackageName("gt") - clsFootnoteCellBodyFunction.SetRCommand("cells_body") - - clsSecondFootnoteCellBodyFunction.SetPackageName("gt") - clsSecondFootnoteCellBodyFunction.SetRCommand("cells_body") - - clsCellTextFunction.SetPackageName("gt") - clsCellTextFunction.SetRCommand("cell_text") - - clsCellBorderFunction.SetPackageName("gt") - clsCellBorderFunction.SetRCommand("cell_borders") - clsCellBorderFunction.AddParameter("weight", clsRFunctionParameter:=clsBorderWeightPxFunction, iPosition:=3) - - clsCellFillFunction.SetPackageName("gt") - clsCellFillFunction.SetRCommand("cell_fill") - - clsHeaderFormatFunction.SetPackageName("mmtable2") - clsHeaderFormatFunction.SetRCommand("header_format") - clsHeaderFormatFunction.AddParameter("header", Chr(34) & "all_cols" & Chr(34), iPosition:=0) - clsHeaderFormatFunction.AddParameter("style", clsRFunctionParameter:=clsStyleListFunction, iPosition:=1) - - clsTabOptionsFunction.SetPackageName("gt") - clsTabOptionsFunction.SetRCommand("tab_options") - - clsBorderWeightPxFunction.SetPackageName("gt") - clsBorderWeightPxFunction.SetRCommand("px") - clsBorderWeightPxFunction.AddParameter("weight", "1", iPosition:=0, bIncludeArgumentName:=False) - - clsStyleListFunction.SetRCommand("list") - - ucrBase.clsRsyntax.AddToBeforeCodes(clsFrequencyDefaultFunction, iPosition:=0) - ucrBase.clsRsyntax.SetBaseROperator(clsJoiningPipeOperator) - clsJoiningPipeOperator.SetAssignTo("last_table", strTempDataframe:=ucrSelectorSummaryTables.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempTable:="last_table") - bResetSubdialog = True - End Sub - - Public Sub SetRCodeForControls(bReset As Boolean) - ucrSelectorSummaryTables.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrSelectorSummaryTables.GetParameter, iAdditionalPairNo:=1) - ucrChkStoreResults.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrChkStoreResults.GetParameter, iAdditionalPairNo:=1) - ucrNudSigFigs.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrNudSigFigs.GetParameter, iAdditionalPairNo:=1) - ucrNudColumnFactors.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrNudColumnFactors.GetParameter, iAdditionalPairNo:=1) - ucrReceiverFactors.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrReceiverFactors.GetParameter, iAdditionalPairNo:=1) - - ucrSelectorSummaryTables.SetRCode(clsSummaryDefaultFunction, bReset) - ucrReceiverSummaryCols.SetRCode(clsSummaryDefaultFunction, bReset) - ucrReceiverFactors.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkOmitMissing.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkDisplayMargins.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkFrequencyDisplayMargins.SetRCode(clsFrequencyDefaultFunction, bReset) - ucrNudSigFigs.SetRCode(clsSummaryDefaultFunction, bReset) - ucrReceiverWeights.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkSummaries.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkWeight.SetRCode(clsSummaryDefaultFunction, bReset) - ucrPnlSummaryFrequencyTables.SetRCode(clsDummyFunction, bReset) - ucrChkDisplaySummariesAsRow.SetRCode(clsSummaryOperator, bReset) - ucrChkDisplaySummaryVariablesAsRow.SetRCode(clsSummaryOperator, bReset) - ucrChkDisplayVariablesAsRows.SetRCode(clsSummaryOperator, bReset) - ucrChkStoreResults.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkDisplayAsPercentage.SetRCode(clsFrequencyDefaultFunction, bReset) - ucrSaveTable.SetRCode(clsJoiningPipeOperator, bReset) - FillListView() - End Sub - - Private Sub TestOKEnabled() - If rdoSummaryTable.Checked Then - If ucrSaveTable.IsComplete AndAlso ucrNudColumnFactors.GetText() <> "" AndAlso - ucrNudSigFigs.GetText <> "" AndAlso (Not ucrChkWeight.Checked OrElse (ucrChkWeight.Checked AndAlso Not ucrReceiverWeights.IsEmpty)) AndAlso - Not ucrReceiverSummaryCols.IsEmpty AndAlso Not clsSummariesList.clsParameters.Count = 0 Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If - Else - If Not ucrReceiverFactors.IsEmpty AndAlso ucrSaveTable.IsComplete Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If - End If - - End Sub - - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeForControls(True) - TestOKEnabled() - End Sub - - Private Sub cmdSummaries_Click(sender As Object, e As EventArgs) Handles cmdSummaries.Click - sdgSummaries.SetRFunction(clsSummariesList, clsSummaryDefaultFunction, clsConcFunction, ucrSelectorSummaryTables, bResetSubdialog) - bResetSubdialog = False - sdgSummaries.bEnable2VariableTab = False - sdgSummaries.ShowDialog() - sdgSummaries.bEnable2VariableTab = True - FillListView() - TestOKEnabled() - End Sub - - Private Sub cmdFormatTable_Click(sender As Object, e As EventArgs) Handles cmdFormatTable.Click - If rdoSummaryTable.Checked Then - sdgFormatSummaryTables.SetRCode(clsNewTableTitleFunction:=clsTableTitleFunction, clsNewTabFootnoteTitleFunction:=clsTabFootnoteTitleFunction, clsNewTableSourcenoteFunction:=clsTableSourcenoteFunction, clsNewDummyFunction:=clsDummyFunction, - clsNewCellTextFunction:=clsCellTextFunction, clsNewCellBorderFunction:=clsCellBorderFunction, clsNewCellFillFunction:=clsCellFillFunction, clsNewHeaderFormatFunction:=clsHeaderFormatFunction, - clsNewTabOptionsFunction:=clsTabOptionsFunction, clsNewFootnoteCellFunction:=clsFootnoteCellFunction, clsNewStubHeadFunction:=clsStubHeadFunction, clsNewSecondFootnoteCellBodyFunction:=clsSecondFootnoteCellBodyFunction, - clsNewPipeOperator:=clsPipeOperator, clsNewBorderWeightPxFunction:=clsBorderWeightPxFunction, clsNewFootnoteTitleLocationFunction:=clsFootnoteTitleLocationFunction, clsNewFootnoteCellBodyFunction:=clsFootnoteCellBodyFunction, - clsNewFootnoteSubtitleLocationFunction:=clsFootnoteSubtitleLocationFunction, clsNewTabFootnoteSubtitleFunction:=clsTabFootnoteSubtitleFunction, clsNewJoiningOperator:=clsJoiningPipeOperator, - clsNewStyleListFunction:=clsStyleListFunction, clsNewMutableOPerator:=clsSummaryOperator, clsNewSecondFootnoteCellFunction:=clsSecondFootnoteCellFunction, clsNewTabFootnoteOperator:=clsTabFootnoteOperator, - clsNewTabStyleCellTextFunction:=clsTabStyleCellTextFunction, clsNewTabStyleFunction:=clsTabStyleFunction, clsNewTabStylePxFunction:=clsTabStylePxFunction, bReset:=bReset) - Else - sdgFormatSummaryTables.SetRCode(clsNewTableTitleFunction:=clsTableTitleFunction, clsNewTabFootnoteTitleFunction:=clsTabFootnoteTitleFunction, clsNewTableSourcenoteFunction:=clsTableSourcenoteFunction, clsNewDummyFunction:=clsDummyFunction, - clsNewCellTextFunction:=clsCellTextFunction, clsNewCellBorderFunction:=clsCellBorderFunction, clsNewCellFillFunction:=clsCellFillFunction, clsNewHeaderFormatFunction:=clsHeaderFormatFunction, - clsNewTabOptionsFunction:=clsTabOptionsFunction, clsNewFootnoteCellFunction:=clsFootnoteCellFunction, clsNewStubHeadFunction:=clsStubHeadFunction, clsNewSecondFootnoteCellBodyFunction:=clsSecondFootnoteCellBodyFunction, - clsNewPipeOperator:=clsPipeOperator, clsNewBorderWeightPxFunction:=clsBorderWeightPxFunction, clsNewFootnoteTitleLocationFunction:=clsFootnoteTitleLocationFunction, clsNewFootnoteCellBodyFunction:=clsFootnoteCellBodyFunction, - clsNewFootnoteSubtitleLocationFunction:=clsFootnoteSubtitleLocationFunction, clsNewTabFootnoteSubtitleFunction:=clsTabFootnoteSubtitleFunction, clsNewJoiningOperator:=clsJoiningPipeOperator, - clsNewStyleListFunction:=clsStyleListFunction, clsNewMutableOPerator:=clsFrequencyOperator, clsNewSecondFootnoteCellFunction:=clsSecondFootnoteCellFunction, clsNewTabFootnoteOperator:=clsTabFootnoteOperator, - clsNewTabStyleCellTextFunction:=clsTabStyleCellTextFunction, clsNewTabStyleFunction:=clsTabStyleFunction, clsNewTabStylePxFunction:=clsTabStylePxFunction, bReset:=bReset) - End If - - sdgFormatSummaryTables.ShowDialog() - End Sub - - Private Sub ucrChkWeights_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkWeight.ControlValueChanged - If ucrChkWeight.Checked Then - ucrReceiverWeights.SetMeAsReceiver() - Else - If ucrReceiverFactors.IsEmpty Then - ucrReceiverFactors.SetMeAsReceiver() - ElseIf ucrReceiverSummaryCols.IsEmpty Then - ucrReceiverSummaryCols.SetMeAsReceiver() - Else - ucrReceiverFactors.SetMeAsReceiver() - End If - End If - End Sub - - Private Sub ucrCoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverFactors.ControlContentsChanged, ucrSaveTable.ControlContentsChanged, - ucrChkWeight.ControlContentsChanged, ucrReceiverWeights.ControlContentsChanged, ucrNudSigFigs.ControlContentsChanged, ucrReceiverSummaryCols.ControlContentsChanged, - ucrNudColumnFactors.ControlContentsChanged, ucrPnlSummaryFrequencyTables.ControlContentsChanged - TestOKEnabled() - End Sub - - Private Sub Display_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplaySummariesAsRow.ControlValueChanged, ucrChkDisplayVariablesAsRows.ControlValueChanged, ucrChkDisplaySummaryVariablesAsRow.ControlValueChanged, ucrChkSummaries.ControlValueChanged - clsSummaryOperator.RemoveParameterByName("summariesTopLeft") - clsSummaryOperator.RemoveParameterByName("summariesLeftTop") - clsSummaryOperator.RemoveParameterByName("variablesTopLeft") - clsSummaryOperator.RemoveParameterByName("variablesLeftTop") - clsSummaryOperator.RemoveParameterByName("summariesVariableTopLeft") - clsSummaryOperator.RemoveParameterByName("summariesVariableLeftTop") - - If ucrChkSummaries.Checked Then - If ucrChkDisplaySummariesAsRow.Checked Then - clsSummaryOperator.AddParameter("summariesLeftTop", clsRFunctionParameter:=clsSummariesHeaderLeftTopFunction, iPosition:=1) - Else - clsSummaryOperator.AddParameter("summariesTopLeft", clsRFunctionParameter:=clsSummariesHeaderTopLeftFunction, iPosition:=1) - End If - - If ucrChkDisplayVariablesAsRows.Checked Then - clsSummaryOperator.AddParameter("variablesLeftTop", clsRFunctionParameter:=clsVariableHeaderLeftTopFunction, iPosition:=1) - Else - clsSummaryOperator.AddParameter("variablesTopLeft", clsRFunctionParameter:=clsVariableHeaderTopLeftFunction, iPosition:=1) - End If - Else - If ucrChkDisplaySummaryVariablesAsRow.Checked Then - clsSummaryOperator.AddParameter("summariesVariableLeftTop", clsRFunctionParameter:=clsummaryVariableHeaderLeftTopFunction, iPosition:=1) - Else - clsSummaryOperator.AddParameter("summariesVariableTopLeft", clsRFunctionParameter:=clsSummaryVariableHeaderTopLeftFunction, iPosition:=1) - End If - End If - End Sub - - Private Sub ucrReceiverFactors_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverFactors.ControlValueChanged, ucrNudColumnFactors.ControlValueChanged - If ucrReceiverFactors.IsEmpty OrElse String.IsNullOrEmpty(ucrNudColumnFactors.GetText()) Then - Exit Sub - End If - - If rdoSummaryTable.Checked Then - Dim iColumn As Integer = 0 - Dim iNumberOfColumns As Integer - - clsColumnOperator.ClearParameters() - clsSummaryOperator.RemoveParameterByName("columnOp") - - If Not ucrReceiverFactors.IsEmpty AndAlso ucrNudColumnFactors.GetText() <> "" Then - iNumberOfColumns = ucrNudColumnFactors.GetText() - For Each strColumn As String In ucrReceiverFactors.GetVariableNamesAsList - Dim clsHeaderFunction As New RFunction - clsHeaderFunction.SetPackageName("mmtable2") - clsHeaderFunction.SetRCommand(If(iColumn < iNumberOfColumns, "header_top_left", "header_left_top")) - clsHeaderFunction.AddParameter("variable", strColumn, iPosition:=0) - clsColumnOperator.AddParameter(strColumn, clsRFunctionParameter:=clsHeaderFunction, iPosition:=iColumn) - iColumn += 1 - Next - clsSummaryOperator.AddParameter("columnOp", clsROperatorParameter:=clsColumnOperator, iPosition:=3) - End If - Else - Dim iColumn As Integer = 1 - Dim iNumberOfColumns As Integer - clsMmtableOperator.ClearParameters() - - iNumberOfColumns = ucrNudColumnFactors.GetText() - For Each strcolumn As String In ucrReceiverFactors.GetVariableNamesAsList - If iColumn <= iNumberOfColumns Then - Dim clsHeaderLeftFunction As New RFunction - clsHeaderLeftFunction.SetPackageName("mmtable2") - clsHeaderLeftFunction.SetRCommand("header_top_left") - clsHeaderLeftFunction.AddParameter("variable", strcolumn, iPosition:=0) - clsMmtableOperator.AddParameter(strcolumn, clsRFunctionParameter:=clsHeaderLeftFunction, iPosition:=iColumn) - Else - Dim clsHeaderTopFunction As New RFunction - clsHeaderTopFunction.SetPackageName("mmtable2") - clsHeaderTopFunction.SetRCommand("header_left_top") - clsHeaderTopFunction.AddParameter("variable", strcolumn, iPosition:=0) - clsMmtableOperator.AddParameter(strcolumn, clsRFunctionParameter:=clsHeaderTopFunction, iPosition:=iColumn) - End If - iColumn += 1 - Next - clsFrequencyOperator.AddParameter("columnOp", clsROperatorParameter:=clsMmtableOperator, iPosition:=1) - End If - - End Sub - - Private Sub FillListView() - If clsSummariesList.clsParameters.Count > 0 Then - ucrReorderSummary.lstAvailableData.Clear() - ucrReorderSummary.lstAvailableData.Columns.Add("Summaries") - ucrReorderSummary.lstAvailableData.Columns(0).Width = -2 - For i = 0 To clsSummariesList.clsParameters.Count - 1 - clsSummariesList.clsParameters(i).Position = i - ucrReorderSummary.lstAvailableData.Items.Add(clsSummariesList.clsParameters(i).strArgumentName) - Next - Else - ucrReorderSummary.lstAvailableData.Items.Clear() - End If - End Sub - - Private Sub ucrReorderSummary_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReorderSummary.ControlValueChanged - Dim lstOrderedSummaries As New List(Of RParameter) - Dim iPosition As Integer = 0 - For i = 0 To ucrReorderSummary.lstAvailableData.Items.Count - 1 - lstOrderedSummaries.Add(clsSummariesList.GetParameter(ucrReorderSummary.lstAvailableData.Items(i).Text)) - Next - - clsSummariesList.ClearParameters() - 'Changing the parameter positions - For Each clsParameter In lstOrderedSummaries - clsParameter.Position = iPosition - clsSummariesList.AddParameter(clsParameter) - iPosition += 1 - Next - End Sub - - Private Sub ucrPnlSummaryFrequencyTables_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlSummaryFrequencyTables.ControlValueChanged - If rdoSummaryTable.Checked Then - clsDummyFunction.AddParameter("rdo_checked", "rdoSummary", iPosition:=10) - clsMutableFunction.AddParameter("data", clsRFunctionParameter:=clsSummaryDefaultFunction, iPosition:=0) - clsJoiningPipeOperator.AddParameter("mutable", clsROperatorParameter:=clsSummaryOperator, iPosition:=0) - ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsFrequencyDefaultFunction) - ucrBase.clsRsyntax.AddToBeforeCodes(clsSummaryDefaultFunction, iPosition:=0) - ucrSaveTable.SetPrefix("summary_table") - cmdFormatTable.Location = New Point(286, 464) - cmdSummaries.Visible = True - Else - clsDummyFunction.AddParameter("rdo_checked", "rdoFrequency", iPosition:=10) - clsMutableFunction.AddParameter("data", clsRFunctionParameter:=clsFrequencyDefaultFunction, iPosition:=0) - clsJoiningPipeOperator.AddParameter("mutable", clsROperatorParameter:=clsFrequencyOperator, iPosition:=0) - ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsSummaryDefaultFunction) - ucrBase.clsRsyntax.AddToBeforeCodes(clsFrequencyDefaultFunction, iPosition:=0) - ucrSaveTable.SetPrefix("frequency_table") - cmdSummaries.Visible = False - cmdFormatTable.Location = New Point(286, 379) - End If - End Sub - - Private Sub ucrChkDisplayAsPercentage_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplayAsPercentage.ControlValueChanged - If ucrChkDisplayAsPercentage.Checked Then - ucrReceiverMultiplePercentages.SetMeAsReceiver() - Else - ucrReceiverFactors.SetMeAsReceiver() - End If - End Sub +Imports instat.Translations +Public Class dlgSummaryTables + Private bFirstload As Boolean = True + Private bReset As Boolean = True + Private clsSummariesList As New RFunction + Private bResetSubdialog As Boolean = False + Private clsSummaryDefaultFunction, clsFrequencyDefaultFunction, clsConcFunction, + clsMutableFunction As New RFunction + Private clsSummariesHeaderLeftTopFunction, clsSummariesHeaderTopLeftFunction, + clsVariableHeaderLeftTopFunction, clsVariableHeaderTopLeftFunction, clsStubHeadFunction, + clsummaryVariableHeaderLeftTopFunction, clsSummaryVariableHeaderTopLeftFunction As New RFunction + + Private clsTableTitleFunction, clsTabFootnoteTitleFunction, clsTableSourcenoteFunction, + clsCellTextFunction, clsCellBorderFunction, clsCellFillFunction, clsHeaderFormatFunction, + clsTabOptionsFunction, clsBorderWeightPxFunction, clsFootnoteTitleLocationFunction, clsFootnoteSubtitleLocationFunction, + clsTabFootnoteSubtitleFunction, clsStyleListFunction, clsFootnoteCellFunction, clsFootnoteCellBodyFunction, + clsSecondFootnoteCellFunction, clsSecondFootnoteCellBodyFunction, clsTabStyleFunction, clsDummyFunction, + clsTabStyleCellTextFunction, clsTabStylePxFunction, clsTabStyleCellTitleFunction As New RFunction + + Private clsMmtableOperator, clsSummaryOperator, clsFrequencyOperator, clsColumnOperator, + clsPipeOperator, clsJoiningPipeOperator, clsTabFootnoteOperator As New ROperator + + Private Sub dlgNewSummaryTables_Load(sender As Object, e As EventArgs) Handles MyBase.Load + If bFirstload Then + InitialiseDialog() + bFirstload = False + End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False + autoTranslate(Me) + TestOKEnabled() + End Sub + + Private Sub InitialiseDialog() + ucrBase.iHelpTopicID = 426 + ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False + + 'summary_name = NA - 8 + ucrSelectorSummaryTables.SetParameter(New RParameter("data_name", 0)) + ucrSelectorSummaryTables.SetParameterIsString() + + ucrReceiverSummaryCols.SetParameter(New RParameter("columns_to_summarise", 1)) + ucrReceiverSummaryCols.Selector = ucrSelectorSummaryTables + ucrReceiverSummaryCols.SetDataType("numeric") + ucrReceiverSummaryCols.SetParameterIsString() + ucrReceiverSummaryCols.SetLinkedDisplayControl(lblVariables) + + ucrReceiverFactors.SetParameter(New RParameter("factors", 2)) + ucrReceiverFactors.SetParameterIsString() + ucrReceiverFactors.Selector = ucrSelectorSummaryTables + ucrReceiverFactors.SetDataType("factor") + + ucrReceiverWeights.SetParameter(New RParameter("weights", 3)) + ucrReceiverWeights.SetParameterIsString() + ucrReceiverWeights.Selector = ucrSelectorSummaryTables + ucrReceiverWeights.SetDataType("numeric") + + ucrReceiverMultiplePercentages.SetParameter(New RParameter("perc_total_factors", 1)) + ucrReceiverMultiplePercentages.SetParameterIsString() + ucrReceiverMultiplePercentages.Selector = ucrSelectorSummaryTables + ucrReceiverMultiplePercentages.SetDataType("factor") ' TODO data this accepts must be in the other receiver too + ucrReceiverMultiplePercentages.SetLinkedDisplayControl(lblFactorsAsPercentage) + + ucrChkStoreResults.SetText("Store Output") + ucrChkStoreResults.SetParameter(New RParameter("store_table", 4)) + ucrChkStoreResults.SetValuesCheckedAndUnchecked("TRUE", "FALSE") + ucrChkStoreResults.SetRDefault("FALSE") + + ucrChkOmitMissing.SetParameter(New RParameter("na.rm", 5)) + ucrChkOmitMissing.SetText("Omit Missing Values") + ucrChkOmitMissing.SetValuesCheckedAndUnchecked("TRUE", "FALSE") + ucrChkOmitMissing.SetRDefault("FALSE") + + ucrChkDisplayMargins.SetParameter(New RParameter("include_margins", 6)) + ucrChkDisplayMargins.SetText("Display Outer Margins") + ucrChkDisplayMargins.SetRDefault("FALSE") + ucrChkDisplayMargins.AddToLinkedControls({ucrInputMarginName}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True, + bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="All") + ucrChkDisplayMargins.AddToLinkedControls({ucrPnlMargin}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True, + bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoOuter) + + ucrChkFrequencyDisplayMargins.SetParameter(New RParameter("include_margins", 3)) + ucrChkFrequencyDisplayMargins.SetText("Display Margins") + ucrChkFrequencyDisplayMargins.SetRDefault("FALSE") + ucrChkFrequencyDisplayMargins.AddToLinkedControls(ucrInputFrequencyMarginName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, + bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="All", bNewLinkedUpdateFunction:=True) + + ucrInputFrequencyMarginName.SetParameter(New RParameter("margin_name", iNewPosition:=5)) + ucrInputFrequencyMarginName.SetLinkedDisplayControl(lblFrequencyMarginName) + + ucrChkDisplaySummariesAsRow.SetText("Display Summaries As Rows") + ucrChkDisplaySummariesAsRow.AddParameterPresentCondition(True, "summariesLeftTop") + ucrChkDisplaySummariesAsRow.AddParameterPresentCondition(False, "summariesLeftTop", False) + + ucrChkDisplaySummaryVariablesAsRow.SetText("Display Summary_Variables As Rows") + ucrChkDisplaySummaryVariablesAsRow.AddParameterPresentCondition(True, "summariesVariableLeftTop") + ucrChkDisplaySummaryVariablesAsRow.AddParameterPresentCondition(False, "summariesVariableLeftTop", False) + + ucrChkDisplayVariablesAsRows.SetText("Display Variables As Rows") + ucrChkDisplayVariablesAsRows.AddParameterPresentCondition(True, "variablesLeftTop") + ucrChkDisplayVariablesAsRows.AddParameterPresentCondition(False, "variablesLeftTop", False) + + ucrNudColumnFactors.SetLinkedDisplayControl(lblColumnFactors) + ucrNudColumnFactors.SetMinMax(iNewMin:=0) + ucrNudColumnFactors.Increment = 1 + + ucrPnlMargin.SetParameter(New RParameter("margins", iNewPosition:=7)) + ucrPnlMargin.AddRadioButton(rdoOuter, Chr(34) & "outer" & Chr(34)) + ucrPnlMargin.AddRadioButton(rdoSummary, Chr(34) & "summary" & Chr(34)) + ucrPnlMargin.AddRadioButton(rdoBoth, "c(""outer"",""summary"")") + ucrPnlMargin.SetLinkedDisplayControl(grpMargin) + + ucrInputMarginName.SetParameter(New RParameter("margin_name", iNewPosition:=5)) + ucrInputMarginName.SetLinkedDisplayControl(lblMarginName) + + ucrChkSummaries.SetParameter(New RParameter("treat_columns_as_factor", 8)) + ucrChkSummaries.SetValuesCheckedAndUnchecked("TRUE", "FALSE") + ucrChkSummaries.SetText("Treat Summaries as a Further Factor") + ucrChkSummaries.AddToLinkedControls({ucrChkDisplaySummariesAsRow, ucrChkDisplayVariablesAsRows}, {True}, + bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkSummaries.AddToLinkedControls(ucrChkDisplaySummaryVariablesAsRow, {False}, bNewLinkedAddRemoveParameter:=True, + bNewLinkedHideIfParameterMissing:=True) + + ucrNudSigFigs.SetParameter(New RParameter("signif_fig", 9)) + ucrNudSigFigs.SetMinMax(0, 22) + ucrNudSigFigs.SetRDefault(2) + + ucrChkWeight.SetText("Weights") + ucrChkWeight.SetParameter(ucrReceiverWeights.GetParameter(), bNewChangeParameterValue:=False, bNewAddRemoveParameter:=True) + ucrChkWeight.AddToLinkedControls(ucrReceiverWeights, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + 'Not yet implemented + ucrChkWeight.Visible = False + + ucrPnlSummaryFrequencyTables.AddRadioButton(rdoSummaryTable) + ucrPnlSummaryFrequencyTables.AddRadioButton(rdoFrequencyTable) + ucrPnlSummaryFrequencyTables.AddParameterValuesCondition(rdoSummaryTable, "rdo_checked", "rdoSummary") + ucrPnlSummaryFrequencyTables.AddParameterValuesCondition(rdoFrequencyTable, "rdo_checked", "rdoFrequency") + ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrReceiverSummaryCols}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrReorderSummary}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkDisplayAsPercentage}, {rdoFrequencyTable}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkSummaries}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkDisplayMargins}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkFrequencyDisplayMargins}, {rdoFrequencyTable}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkOmitMissing}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) + + ucrChkDisplayAsPercentage.SetParameter(New RParameter("percentage_type", 2)) + ucrChkDisplayAsPercentage.SetText("As Percentages") + ucrChkDisplayAsPercentage.SetValuesCheckedAndUnchecked(Chr(34) & "factors" & Chr(34), Chr(34) & "none" & Chr(34)) + ucrChkDisplayAsPercentage.SetRDefault(Chr(34) & "none" & Chr(34)) + + ucrChkDisplayAsPercentage.AddToLinkedControls(ucrReceiverMultiplePercentages, {True}, bNewLinkedHideIfParameterMissing:=True, + bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + ucrChkDisplayAsPercentage.AddToLinkedControls(ucrChkPercentageProportion, {True}, bNewLinkedAddRemoveParameter:=True, + bNewLinkedHideIfParameterMissing:=True, bNewLinkedUpdateFunction:=True) + ucrChkDisplayAsPercentage.SetLinkedDisplayControl(grpPercentages) + + ucrChkPercentageProportion.SetParameter(New RParameter("perc_decimal", 3)) + ucrChkPercentageProportion.SetText("Display as Decimal") + ucrChkPercentageProportion.SetRDefault("FALSE") + + ucrSaveTable.SetPrefix("summary_table") + ucrSaveTable.SetSaveType(RObjectTypeLabel.Table, strRObjectFormat:=RObjectFormat.Html) + ucrSaveTable.SetDataFrameSelector(ucrSelectorSummaryTables.ucrAvailableDataFrames) + ucrSaveTable.SetIsComboBox() + ucrSaveTable.SetCheckBoxText("Save Table") + ucrSaveTable.SetAssignToIfUncheckedValue("last_table") + + ucrReorderSummary.bDataIsSummaries = True + End Sub + + Private Sub SetDefaults() + clsSummaryDefaultFunction = New RFunction + clsFrequencyDefaultFunction = New RFunction + clsSummariesList = New RFunction + clsConcFunction = New RFunction + clsMutableFunction = New RFunction + clsSummariesHeaderLeftTopFunction = New RFunction + clsSummariesHeaderTopLeftFunction = New RFunction + clsVariableHeaderLeftTopFunction = New RFunction + clsVariableHeaderTopLeftFunction = New RFunction + clsummaryVariableHeaderLeftTopFunction = New RFunction + clsSummaryVariableHeaderTopLeftFunction = New RFunction + clsTableTitleFunction = New RFunction + clsTabFootnoteTitleFunction = New RFunction + clsTableSourcenoteFunction = New RFunction + clsCellTextFunction = New RFunction + clsCellBorderFunction = New RFunction + clsCellFillFunction = New RFunction + clsHeaderFormatFunction = New RFunction + clsTabOptionsFunction = New RFunction + clsBorderWeightPxFunction = New RFunction + clsFootnoteTitleLocationFunction = New RFunction + clsFootnoteSubtitleLocationFunction = New RFunction + clsStyleListFunction = New RFunction + clsSummaryOperator = New ROperator + clsColumnOperator = New ROperator + clsPipeOperator = New ROperator + clsTabFootnoteSubtitleFunction = New RFunction + clsFootnoteCellBodyFunction = New RFunction + clsSecondFootnoteCellBodyFunction = New RFunction + clsFootnoteCellFunction = New RFunction + clsSecondFootnoteCellFunction = New RFunction + clsStubHeadFunction = New RFunction + clsTabStyleFunction = New RFunction + clsTabStyleCellTextFunction = New RFunction + clsTabStylePxFunction = New RFunction + clsTabStyleCellTitleFunction = New RFunction + clsJoiningPipeOperator = New ROperator + clsTabFootnoteOperator = New ROperator + clsFrequencyOperator = New ROperator + clsMmtableOperator = New ROperator + clsDummyFunction = New RFunction + + ucrReceiverFactors.SetMeAsReceiver() + ucrSelectorSummaryTables.Reset() + ucrSaveTable.Reset() + ucrNudColumnFactors.SetText(1) + bResetSubdialog = True + + clsDummyFunction.AddParameter("rdo_checked", "rdoFrequency", iPosition:=10) + + clsSummaryOperator.SetOperation("+") + + clsFrequencyOperator.SetOperation("+") + + clsColumnOperator.SetOperation("+") + + clsMmtableOperator.SetOperation("+") + + clsConcFunction.SetRCommand("c") + + clsPipeOperator.SetOperation("%>%") + clsPipeOperator.bBrackets = False + + clsTabFootnoteOperator.SetOperation("%>%") + clsTabFootnoteOperator.bBrackets = False + + clsJoiningPipeOperator.SetOperation("%>%") + clsJoiningPipeOperator.AddParameter("mutable", clsROperatorParameter:=clsSummaryOperator, iPosition:=0) + + clsStubHeadFunction.SetPackageName("gt") + clsStubHeadFunction.SetRCommand("tab_stubhead") + + clsTabStyleFunction.SetRCommand("tab_style") + clsTabStyleFunction.SetPackageName("gt") + clsTabStyleFunction.AddParameter("style", clsRFunctionParameter:=clsTabStyleCellTextFunction, iPosition:=0) + clsTabStyleFunction.AddParameter("location", clsRFunctionParameter:=clsTabStyleCellTitleFunction, iPosition:=1) + + clsTabStyleCellTitleFunction.SetPackageName("gt") + clsTabStyleCellTitleFunction.SetRCommand("cells_title") + clsTabStyleCellTitleFunction.AddParameter("groups", Chr(34) & "title" & Chr(34), iPosition:=0) + + clsTabStyleCellTextFunction.SetPackageName("gt") + clsTabStyleCellTextFunction.SetRCommand("cell_text") + clsTabStyleCellTextFunction.AddParameter("size", clsRFunctionParameter:=clsTabStylePxFunction, iPosition:=0) + + clsTabStylePxFunction.SetPackageName("gt") + clsTabStylePxFunction.SetRCommand("px") + clsTabStylePxFunction.AddParameter("size", "18", bIncludeArgumentName:=False, iPosition:=0) + + clsSummariesHeaderLeftTopFunction.SetPackageName("mmtable2") + clsSummariesHeaderLeftTopFunction.SetRCommand("header_left_top") + clsSummariesHeaderLeftTopFunction.AddParameter("variable", "summary", iPosition:=0) + + clsSummariesHeaderTopLeftFunction.SetPackageName("mmtable2") + clsSummariesHeaderTopLeftFunction.SetRCommand("header_top_left") + clsSummariesHeaderTopLeftFunction.AddParameter("variable", "summary", iPosition:=0) + + clsVariableHeaderLeftTopFunction.SetPackageName("mmtable2") + clsVariableHeaderLeftTopFunction.SetRCommand("header_left_top") + clsVariableHeaderLeftTopFunction.AddParameter("variable", "variable", iPosition:=0) + + clsVariableHeaderTopLeftFunction.SetPackageName("mmtable2") + clsVariableHeaderTopLeftFunction.SetRCommand("header_top_left") + clsVariableHeaderTopLeftFunction.AddParameter("variable", "variable", iPosition:=0) + + clsummaryVariableHeaderLeftTopFunction.SetPackageName("mmtable2") + clsummaryVariableHeaderLeftTopFunction.SetRCommand("header_left_top") + clsummaryVariableHeaderLeftTopFunction.AddParameter("variable", Chr(39) & "summary-variable" & Chr(39), iPosition:=0) + + clsSummaryVariableHeaderTopLeftFunction.SetPackageName("mmtable2") + clsSummaryVariableHeaderTopLeftFunction.SetRCommand("header_top_left") + clsSummaryVariableHeaderTopLeftFunction.AddParameter("variable", Chr(39) & "summary-variable" & Chr(39), iPosition:=0) + + clsMutableFunction.SetPackageName("mmtable2") + clsMutableFunction.SetRCommand("mmtable") + clsMutableFunction.AddParameter("data", clsRFunctionParameter:=clsFrequencyDefaultFunction, iPosition:=0) + clsMutableFunction.AddParameter("cells", "value", iPosition:=1) + + clsSummaryOperator.AddParameter("mutableFunc", clsRFunctionParameter:=clsMutableFunction, iPosition:=0) + clsSummaryOperator.AddParameter("summariesVariableTopLeft", clsRFunctionParameter:=clsSummaryVariableHeaderTopLeftFunction, iPosition:=1) + + clsFrequencyOperator.SetOperation("+") + clsFrequencyOperator.AddParameter("mmtable2", clsRFunctionParameter:=clsMutableFunction, iPosition:=0) + + clsSummariesList.SetRCommand("c") + clsSummariesList.AddParameter("summary_mean", Chr(34) & "summary_mean" & Chr(34), bIncludeArgumentName:=False) ' TODO decide which default(s) to use? + + 'todo. When refactoring this dialog + 'investigate whether clsSummaryDefaultFunction and clsFrequencyDefaultFunction could be merged. It's only their parameters that change. + clsSummaryDefaultFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$summary_table") + clsSummaryDefaultFunction.AddParameter("treat_columns_as_factor", "FALSE", iPosition:=8) + clsSummaryDefaultFunction.AddParameter("summaries", clsRFunctionParameter:=clsSummariesList, iPosition:=12) + clsSummaryDefaultFunction.SetAssignTo("summary_table") + + clsFrequencyDefaultFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$summary_table") + clsFrequencyDefaultFunction.AddParameter("store_results", "FALSE", iPosition:=2) + clsFrequencyDefaultFunction.AddParameter("treat_columns_as_factor", "FALSE", iPosition:=10) + clsFrequencyDefaultFunction.AddParameter("summaries", "count_label", iPosition:=11) + clsFrequencyDefaultFunction.SetAssignTo("frequency_table") + + clsTableTitleFunction.SetPackageName("gt") + clsTableTitleFunction.SetRCommand("tab_header") + + clsTabFootnoteTitleFunction.SetPackageName("gt") + clsTabFootnoteTitleFunction.SetRCommand("tab_footnote") + + clsTabFootnoteSubtitleFunction.SetPackageName("gt") + clsTabFootnoteSubtitleFunction.SetRCommand("tab_footnote") + + clsFootnoteCellFunction.SetPackageName("gt") + clsFootnoteCellFunction.SetRCommand("tab_footnote") + + clsSecondFootnoteCellFunction.SetPackageName("gt") + clsSecondFootnoteCellFunction.SetRCommand("tab_footnote") + + clsFootnoteTitleLocationFunction.SetPackageName("gt") + clsFootnoteTitleLocationFunction.SetRCommand("cells_title") + + clsFootnoteSubtitleLocationFunction.SetPackageName("gt") + clsFootnoteSubtitleLocationFunction.SetRCommand("cells_title") + + clsTableSourcenoteFunction.SetPackageName("gt") + clsTableSourcenoteFunction.SetRCommand("tab_source_note") + + clsFootnoteCellBodyFunction.SetPackageName("gt") + clsFootnoteCellBodyFunction.SetRCommand("cells_body") + + clsSecondFootnoteCellBodyFunction.SetPackageName("gt") + clsSecondFootnoteCellBodyFunction.SetRCommand("cells_body") + + clsCellTextFunction.SetPackageName("gt") + clsCellTextFunction.SetRCommand("cell_text") + + clsCellBorderFunction.SetPackageName("gt") + clsCellBorderFunction.SetRCommand("cell_borders") + clsCellBorderFunction.AddParameter("weight", clsRFunctionParameter:=clsBorderWeightPxFunction, iPosition:=3) + + clsCellFillFunction.SetPackageName("gt") + clsCellFillFunction.SetRCommand("cell_fill") + + clsHeaderFormatFunction.SetPackageName("mmtable2") + clsHeaderFormatFunction.SetRCommand("header_format") + clsHeaderFormatFunction.AddParameter("header", Chr(34) & "all_cols" & Chr(34), iPosition:=0) + clsHeaderFormatFunction.AddParameter("style", clsRFunctionParameter:=clsStyleListFunction, iPosition:=1) + + clsTabOptionsFunction.SetPackageName("gt") + clsTabOptionsFunction.SetRCommand("tab_options") + + clsBorderWeightPxFunction.SetPackageName("gt") + clsBorderWeightPxFunction.SetRCommand("px") + clsBorderWeightPxFunction.AddParameter("weight", "1", iPosition:=0, bIncludeArgumentName:=False) + + clsStyleListFunction.SetRCommand("list") + + clsJoiningPipeOperator.SetAssignTo("last_table") + + clsJoiningPipeOperator.SetAssignToRObject(strRObjectToAssignTo:="last_table", + strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, + strRObjectFormatToAssignTo:=RObjectFormat.Html, + strRDataFrameNameToAddObjectTo:=ucrSelectorSummaryTables.strCurrentDataFrame, + strObjectName:="last_table") + + ucrBase.clsRsyntax.SetBaseROperator(clsJoiningPipeOperator) + End Sub + + Public Sub SetRCodeForControls(bReset As Boolean) + ucrSelectorSummaryTables.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrSelectorSummaryTables.GetParameter, iAdditionalPairNo:=1) + ucrChkStoreResults.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrChkStoreResults.GetParameter, iAdditionalPairNo:=1) + ucrNudSigFigs.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrNudSigFigs.GetParameter, iAdditionalPairNo:=1) + ucrNudColumnFactors.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrNudColumnFactors.GetParameter, iAdditionalPairNo:=1) + ucrReceiverFactors.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrReceiverFactors.GetParameter, iAdditionalPairNo:=1) + + ucrSelectorSummaryTables.SetRCode(clsSummaryDefaultFunction, bReset) + ucrReceiverSummaryCols.SetRCode(clsSummaryDefaultFunction, bReset) + ucrReceiverFactors.SetRCode(clsSummaryDefaultFunction, bReset) + ucrChkOmitMissing.SetRCode(clsSummaryDefaultFunction, bReset) + ucrChkDisplayMargins.SetRCode(clsSummaryDefaultFunction, bReset) + ucrChkFrequencyDisplayMargins.SetRCode(clsFrequencyDefaultFunction, bReset) + ucrNudSigFigs.SetRCode(clsSummaryDefaultFunction, bReset) + ucrReceiverWeights.SetRCode(clsSummaryDefaultFunction, bReset) + ucrChkSummaries.SetRCode(clsSummaryDefaultFunction, bReset) + ucrChkWeight.SetRCode(clsSummaryDefaultFunction, bReset) + ucrPnlSummaryFrequencyTables.SetRCode(clsDummyFunction, bReset) + ucrChkDisplaySummariesAsRow.SetRCode(clsSummaryOperator, bReset) + ucrChkDisplaySummaryVariablesAsRow.SetRCode(clsSummaryOperator, bReset) + ucrChkDisplayVariablesAsRows.SetRCode(clsSummaryOperator, bReset) + ucrChkStoreResults.SetRCode(clsSummaryDefaultFunction, bReset) + ucrChkDisplayAsPercentage.SetRCode(clsFrequencyDefaultFunction, bReset) + ucrSaveTable.SetRCode(clsJoiningPipeOperator, bReset) + FillListView() + End Sub + + Private Sub TestOKEnabled() + If rdoSummaryTable.Checked Then + If ucrSaveTable.IsComplete AndAlso ucrNudColumnFactors.GetText() <> "" AndAlso + ucrNudSigFigs.GetText <> "" AndAlso (Not ucrChkWeight.Checked OrElse (ucrChkWeight.Checked AndAlso Not ucrReceiverWeights.IsEmpty)) AndAlso + Not ucrReceiverSummaryCols.IsEmpty AndAlso Not clsSummariesList.clsParameters.Count = 0 Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If + Else + If Not ucrReceiverFactors.IsEmpty AndAlso ucrSaveTable.IsComplete Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If + End If + + End Sub + + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset + SetDefaults() + SetRCodeForControls(True) + TestOKEnabled() + End Sub + + Private Sub cmdSummaries_Click(sender As Object, e As EventArgs) Handles cmdSummaries.Click + sdgSummaries.SetRFunction(clsSummariesList, clsSummaryDefaultFunction, clsConcFunction, ucrSelectorSummaryTables, bResetSubdialog) + bResetSubdialog = False + sdgSummaries.bEnable2VariableTab = False + sdgSummaries.ShowDialog() + sdgSummaries.bEnable2VariableTab = True + FillListView() + TestOKEnabled() + End Sub + + Private Sub cmdFormatTable_Click(sender As Object, e As EventArgs) Handles cmdFormatTable.Click + If rdoSummaryTable.Checked Then + sdgFormatSummaryTables.SetRCode(clsNewTableTitleFunction:=clsTableTitleFunction, clsNewTabFootnoteTitleFunction:=clsTabFootnoteTitleFunction, clsNewTableSourcenoteFunction:=clsTableSourcenoteFunction, clsNewDummyFunction:=clsDummyFunction, + clsNewCellTextFunction:=clsCellTextFunction, clsNewCellBorderFunction:=clsCellBorderFunction, clsNewCellFillFunction:=clsCellFillFunction, clsNewHeaderFormatFunction:=clsHeaderFormatFunction, + clsNewTabOptionsFunction:=clsTabOptionsFunction, clsNewFootnoteCellFunction:=clsFootnoteCellFunction, clsNewStubHeadFunction:=clsStubHeadFunction, clsNewSecondFootnoteCellBodyFunction:=clsSecondFootnoteCellBodyFunction, + clsNewPipeOperator:=clsPipeOperator, clsNewBorderWeightPxFunction:=clsBorderWeightPxFunction, clsNewFootnoteTitleLocationFunction:=clsFootnoteTitleLocationFunction, clsNewFootnoteCellBodyFunction:=clsFootnoteCellBodyFunction, + clsNewFootnoteSubtitleLocationFunction:=clsFootnoteSubtitleLocationFunction, clsNewTabFootnoteSubtitleFunction:=clsTabFootnoteSubtitleFunction, clsNewJoiningOperator:=clsJoiningPipeOperator, + clsNewStyleListFunction:=clsStyleListFunction, clsNewMutableOPerator:=clsSummaryOperator, clsNewSecondFootnoteCellFunction:=clsSecondFootnoteCellFunction, clsNewTabFootnoteOperator:=clsTabFootnoteOperator, + clsNewTabStyleCellTextFunction:=clsTabStyleCellTextFunction, clsNewTabStyleFunction:=clsTabStyleFunction, clsNewTabStylePxFunction:=clsTabStylePxFunction, bReset:=bReset) + Else + sdgFormatSummaryTables.SetRCode(clsNewTableTitleFunction:=clsTableTitleFunction, clsNewTabFootnoteTitleFunction:=clsTabFootnoteTitleFunction, clsNewTableSourcenoteFunction:=clsTableSourcenoteFunction, clsNewDummyFunction:=clsDummyFunction, + clsNewCellTextFunction:=clsCellTextFunction, clsNewCellBorderFunction:=clsCellBorderFunction, clsNewCellFillFunction:=clsCellFillFunction, clsNewHeaderFormatFunction:=clsHeaderFormatFunction, + clsNewTabOptionsFunction:=clsTabOptionsFunction, clsNewFootnoteCellFunction:=clsFootnoteCellFunction, clsNewStubHeadFunction:=clsStubHeadFunction, clsNewSecondFootnoteCellBodyFunction:=clsSecondFootnoteCellBodyFunction, + clsNewPipeOperator:=clsPipeOperator, clsNewBorderWeightPxFunction:=clsBorderWeightPxFunction, clsNewFootnoteTitleLocationFunction:=clsFootnoteTitleLocationFunction, clsNewFootnoteCellBodyFunction:=clsFootnoteCellBodyFunction, + clsNewFootnoteSubtitleLocationFunction:=clsFootnoteSubtitleLocationFunction, clsNewTabFootnoteSubtitleFunction:=clsTabFootnoteSubtitleFunction, clsNewJoiningOperator:=clsJoiningPipeOperator, + clsNewStyleListFunction:=clsStyleListFunction, clsNewMutableOPerator:=clsFrequencyOperator, clsNewSecondFootnoteCellFunction:=clsSecondFootnoteCellFunction, clsNewTabFootnoteOperator:=clsTabFootnoteOperator, + clsNewTabStyleCellTextFunction:=clsTabStyleCellTextFunction, clsNewTabStyleFunction:=clsTabStyleFunction, clsNewTabStylePxFunction:=clsTabStylePxFunction, bReset:=bReset) + End If + + sdgFormatSummaryTables.ShowDialog() + End Sub + + Private Sub ucrChkWeights_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkWeight.ControlValueChanged + If ucrChkWeight.Checked Then + ucrReceiverWeights.SetMeAsReceiver() + Else + If ucrReceiverFactors.IsEmpty Then + ucrReceiverFactors.SetMeAsReceiver() + ElseIf ucrReceiverSummaryCols.IsEmpty Then + ucrReceiverSummaryCols.SetMeAsReceiver() + Else + ucrReceiverFactors.SetMeAsReceiver() + End If + End If + End Sub + + Private Sub ucrCoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverFactors.ControlContentsChanged, ucrSaveTable.ControlContentsChanged, + ucrChkWeight.ControlContentsChanged, ucrReceiverWeights.ControlContentsChanged, ucrNudSigFigs.ControlContentsChanged, ucrReceiverSummaryCols.ControlContentsChanged, + ucrNudColumnFactors.ControlContentsChanged, ucrPnlSummaryFrequencyTables.ControlContentsChanged + TestOKEnabled() + End Sub + + Private Sub Display_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplaySummariesAsRow.ControlValueChanged, ucrChkDisplayVariablesAsRows.ControlValueChanged, ucrChkDisplaySummaryVariablesAsRow.ControlValueChanged, ucrChkSummaries.ControlValueChanged + clsSummaryOperator.RemoveParameterByName("summariesTopLeft") + clsSummaryOperator.RemoveParameterByName("summariesLeftTop") + clsSummaryOperator.RemoveParameterByName("variablesTopLeft") + clsSummaryOperator.RemoveParameterByName("variablesLeftTop") + clsSummaryOperator.RemoveParameterByName("summariesVariableTopLeft") + clsSummaryOperator.RemoveParameterByName("summariesVariableLeftTop") + + If ucrChkSummaries.Checked Then + If ucrChkDisplaySummariesAsRow.Checked Then + clsSummaryOperator.AddParameter("summariesLeftTop", clsRFunctionParameter:=clsSummariesHeaderLeftTopFunction, iPosition:=1) + Else + clsSummaryOperator.AddParameter("summariesTopLeft", clsRFunctionParameter:=clsSummariesHeaderTopLeftFunction, iPosition:=1) + End If + + If ucrChkDisplayVariablesAsRows.Checked Then + clsSummaryOperator.AddParameter("variablesLeftTop", clsRFunctionParameter:=clsVariableHeaderLeftTopFunction, iPosition:=1) + Else + clsSummaryOperator.AddParameter("variablesTopLeft", clsRFunctionParameter:=clsVariableHeaderTopLeftFunction, iPosition:=1) + End If + Else + If ucrChkDisplaySummaryVariablesAsRow.Checked Then + clsSummaryOperator.AddParameter("summariesVariableLeftTop", clsRFunctionParameter:=clsummaryVariableHeaderLeftTopFunction, iPosition:=1) + Else + clsSummaryOperator.AddParameter("summariesVariableTopLeft", clsRFunctionParameter:=clsSummaryVariableHeaderTopLeftFunction, iPosition:=1) + End If + End If + End Sub + + Private Sub ucrReceiverFactors_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverFactors.ControlValueChanged, ucrNudColumnFactors.ControlValueChanged + If ucrReceiverFactors.IsEmpty OrElse String.IsNullOrEmpty(ucrNudColumnFactors.GetText()) Then + Exit Sub + End If + + If rdoSummaryTable.Checked Then + Dim iColumn As Integer = 0 + Dim iNumberOfColumns As Integer + + clsColumnOperator.ClearParameters() + clsSummaryOperator.RemoveParameterByName("columnOp") + + If Not ucrReceiverFactors.IsEmpty AndAlso ucrNudColumnFactors.GetText() <> "" Then + iNumberOfColumns = ucrNudColumnFactors.GetText() + For Each strColumn As String In ucrReceiverFactors.GetVariableNamesAsList + Dim clsHeaderFunction As New RFunction + clsHeaderFunction.SetPackageName("mmtable2") + clsHeaderFunction.SetRCommand(If(iColumn < iNumberOfColumns, "header_top_left", "header_left_top")) + clsHeaderFunction.AddParameter("variable", strColumn, iPosition:=0) + clsColumnOperator.AddParameter(strColumn, clsRFunctionParameter:=clsHeaderFunction, iPosition:=iColumn) + iColumn += 1 + Next + clsSummaryOperator.AddParameter("columnOp", clsROperatorParameter:=clsColumnOperator, iPosition:=3) + End If + Else + Dim iColumn As Integer = 1 + Dim iNumberOfColumns As Integer + clsMmtableOperator.ClearParameters() + + iNumberOfColumns = ucrNudColumnFactors.GetText() + For Each strcolumn As String In ucrReceiverFactors.GetVariableNamesAsList + If iColumn <= iNumberOfColumns Then + Dim clsHeaderLeftFunction As New RFunction + clsHeaderLeftFunction.SetPackageName("mmtable2") + clsHeaderLeftFunction.SetRCommand("header_top_left") + clsHeaderLeftFunction.AddParameter("variable", strcolumn, iPosition:=0) + clsMmtableOperator.AddParameter(strcolumn, clsRFunctionParameter:=clsHeaderLeftFunction, iPosition:=iColumn) + Else + Dim clsHeaderTopFunction As New RFunction + clsHeaderTopFunction.SetPackageName("mmtable2") + clsHeaderTopFunction.SetRCommand("header_left_top") + clsHeaderTopFunction.AddParameter("variable", strcolumn, iPosition:=0) + clsMmtableOperator.AddParameter(strcolumn, clsRFunctionParameter:=clsHeaderTopFunction, iPosition:=iColumn) + End If + iColumn += 1 + Next + clsFrequencyOperator.AddParameter("columnOp", clsROperatorParameter:=clsMmtableOperator, iPosition:=1) + End If + + End Sub + + Private Sub FillListView() + If clsSummariesList.clsParameters.Count > 0 Then + ucrReorderSummary.lstAvailableData.Clear() + ucrReorderSummary.lstAvailableData.Columns.Add("Summaries") + ucrReorderSummary.lstAvailableData.Columns(0).Width = -2 + For i = 0 To clsSummariesList.clsParameters.Count - 1 + clsSummariesList.clsParameters(i).Position = i + ucrReorderSummary.lstAvailableData.Items.Add(clsSummariesList.clsParameters(i).strArgumentName) + Next + Else + ucrReorderSummary.lstAvailableData.Items.Clear() + End If + End Sub + + Private Sub ucrReorderSummary_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReorderSummary.ControlValueChanged + Dim lstOrderedSummaries As New List(Of RParameter) + Dim iPosition As Integer = 0 + For i = 0 To ucrReorderSummary.lstAvailableData.Items.Count - 1 + lstOrderedSummaries.Add(clsSummariesList.GetParameter(ucrReorderSummary.lstAvailableData.Items(i).Text)) + Next + + clsSummariesList.ClearParameters() + 'Changing the parameter positions + For Each clsParameter In lstOrderedSummaries + clsParameter.Position = iPosition + clsSummariesList.AddParameter(clsParameter) + iPosition += 1 + Next + End Sub + + Private Sub ucrPnlSummaryFrequencyTables_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlSummaryFrequencyTables.ControlValueChanged + If rdoSummaryTable.Checked Then + clsDummyFunction.AddParameter("rdo_checked", "rdoSummary", iPosition:=10) + clsMutableFunction.AddParameter("data", clsRFunctionParameter:=clsSummaryDefaultFunction, iPosition:=0) + clsJoiningPipeOperator.AddParameter("mutable", clsROperatorParameter:=clsSummaryOperator, iPosition:=0) + ucrSaveTable.SetPrefix("summary_table") + cmdFormatTable.Location = New Point(286, 464) + cmdSummaries.Visible = True + Else + clsDummyFunction.AddParameter("rdo_checked", "rdoFrequency", iPosition:=10) + clsMutableFunction.AddParameter("data", clsRFunctionParameter:=clsFrequencyDefaultFunction, iPosition:=0) + clsJoiningPipeOperator.AddParameter("mutable", clsROperatorParameter:=clsFrequencyOperator, iPosition:=0) + ucrSaveTable.SetPrefix("frequency_table") + cmdSummaries.Visible = False + cmdFormatTable.Location = New Point(286, 379) + End If + End Sub + + Private Sub ucrChkDisplayAsPercentage_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplayAsPercentage.ControlValueChanged + If ucrChkDisplayAsPercentage.Checked Then + ucrReceiverMultiplePercentages.SetMeAsReceiver() + Else + ucrReceiverFactors.SetMeAsReceiver() + End If + End Sub End Class \ No newline at end of file diff --git a/instat/dlgThreeVariablePivotTable.Designer.vb b/instat/dlgThreeVariablePivotTable.Designer.vb index e1b8146d427..ef14c42d5f8 100644 --- a/instat/dlgThreeVariablePivotTable.Designer.vb +++ b/instat/dlgThreeVariablePivotTable.Designer.vb @@ -18,7 +18,7 @@ Partial Class dlgThreeVariablePivotTable Private components As System.ComponentModel.IContainer 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. + 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Private Sub InitializeComponent() @@ -147,7 +147,7 @@ Partial Class dlgThreeVariablePivotTable 'ucrSavePivot ' Me.ucrSavePivot.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrSavePivot.Location = New System.Drawing.Point(9, 366) + Me.ucrSavePivot.Location = New System.Drawing.Point(9, 389) Me.ucrSavePivot.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) Me.ucrSavePivot.Name = "ucrSavePivot" Me.ucrSavePivot.Size = New System.Drawing.Size(382, 23) @@ -201,7 +201,7 @@ Partial Class dlgThreeVariablePivotTable ' Me.ucrBase.AutoSize = True Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrBase.Location = New System.Drawing.Point(9, 397) + Me.ucrBase.Location = New System.Drawing.Point(9, 420) Me.ucrBase.Name = "ucrBase" Me.ucrBase.Size = New System.Drawing.Size(408, 52) Me.ucrBase.TabIndex = 51 @@ -247,7 +247,7 @@ Partial Class dlgThreeVariablePivotTable Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(417, 456) + Me.ClientSize = New System.Drawing.Size(417, 481) Me.Controls.Add(Me.lblFactorLevels) Me.Controls.Add(Me.ucrReceiverFactorLevels) Me.Controls.Add(Me.ucrChkNumericVariable) diff --git a/instat/dlgThreeVariablePivotTable.vb b/instat/dlgThreeVariablePivotTable.vb index a2bbdfdfee0..826b5cc9417 100644 --- a/instat/dlgThreeVariablePivotTable.vb +++ b/instat/dlgThreeVariablePivotTable.vb @@ -11,7 +11,7 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . Imports instat.Translations Public Class dlgThreeVariablePivotTable @@ -19,11 +19,12 @@ Public Class dlgThreeVariablePivotTable Private bRcodeSet As Boolean = False Private bReset As Boolean = True Private clsConcatenateFunction, clsFlattenFunction, - clsGetObjectFunction, clsLevelsFunction, clsPasteFunction, + clsLevelsFunction, clsPasteFunction, clsRelevelPasteFunction, clsRPivotTableFunction, clsSelectFunction As New RFunction Private clsPipeOperator, clsLevelsDollarOperator As New ROperator + Private Sub dlgThreeVariablePivotTable_Load(sender As Object, e As EventArgs) Handles MyBase.Load If bFirstLoad Then InitialiseDialog() @@ -41,7 +42,7 @@ Public Class dlgThreeVariablePivotTable Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 603 - ucrBase.clsRsyntax.iCallType = 2 + ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False ucrSelectorPivot.SetParameter(New RParameter("data", iNewPosition:=0)) ucrSelectorPivot.SetParameterIsrfunction() @@ -109,7 +110,7 @@ Public Class dlgThreeVariablePivotTable ucrInputSummary.SetLinkedDisplayControl(lblSummary) ucrSavePivot.SetPrefix("pivot_table") - ucrSavePivot.SetSaveTypeAsTable() + ucrSavePivot.SetSaveType(RObjectTypeLabel.Table, strRObjectFormat:=RObjectFormat.Html) ucrSavePivot.SetDataFrameSelector(ucrSelectorPivot.ucrAvailableDataFrames) ucrSavePivot.SetIsComboBox() ucrSavePivot.SetCheckBoxText("Save Table") @@ -120,7 +121,6 @@ Public Class dlgThreeVariablePivotTable clsConcatenateFunction = New RFunction clsFlattenFunction = New RFunction clsLevelsFunction = New RFunction - clsGetObjectFunction = New RFunction clsPasteFunction = New RFunction clsRelevelPasteFunction = New RFunction clsRPivotTableFunction = New RFunction @@ -132,54 +132,55 @@ Public Class dlgThreeVariablePivotTable ucrReceiverInitialRowFactors.SetMeAsReceiver() ucrSelectorPivot.Reset() ucrSavePivot.Reset() - ucrBase.clsRsyntax.ClearCodes() - - clsConcatenateFunction.SetRCommand("c") - - clsFlattenFunction.SetPackageName("stringr") - clsFlattenFunction.SetRCommand("str_flatten") - clsFlattenFunction.AddParameter("string", "survey_levels", iPosition:=0) - clsFlattenFunction.SetAssignTo("survey_levels") - clsGetObjectFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_objects") - clsGetObjectFunction.AddParameter("data_name", Chr(34) & ucrSelectorPivot.ucrAvailableDataFrames.cboAvailableDataFrames.Text & Chr(34), iPosition:=0) clsLevelsDollarOperator.SetOperation("$") clsLevelsFunction.SetRCommand("levels") clsLevelsFunction.AddParameter("x", clsROperatorParameter:=clsLevelsDollarOperator, iPosition:=0) - clsLevelsFunction.SetAssignTo("survey_levels") clsPasteFunction.SetRCommand("paste0") clsPasteFunction.AddParameter("first_parameter", Chr(34) & "\" & Chr(34) & Chr(34), iPosition:=0, bIncludeArgumentName:=False) - clsPasteFunction.AddParameter("second_parameter", "survey_levels", iPosition:=1, - bIncludeArgumentName:=False) + clsPasteFunction.AddParameter("second_parameter", clsRFunctionParameter:=clsLevelsFunction, + iPosition:=1, bIncludeArgumentName:=False) clsPasteFunction.AddParameter("third_parameter", Chr(34) & "\" & Chr(34) & "," & Chr(34), iPosition:=2, bIncludeArgumentName:=False) - clsPasteFunction.SetAssignTo("survey_levels") - clsPipeOperator.SetOperation("%>%") - clsPipeOperator.AddParameter("columns", clsRFunctionParameter:=clsSelectFunction, iPosition:=1) - clsPipeOperator.SetAssignTo("data_selected") + clsFlattenFunction.SetPackageName("stringr") + clsFlattenFunction.SetRCommand("str_flatten") + clsFlattenFunction.AddParameter("string", clsRFunctionParameter:=clsPasteFunction, iPosition:=0) + clsFlattenFunction.SetAssignTo("survey_levels") + clsRelevelPasteFunction.SetRCommand("paste0") clsRelevelPasteFunction.AddParameter("first_paramete", Chr(34) & "function(attr) { var sortAs = $.pivotUtilities.sortAs; return sortAs([" & Chr(34) & ", survey_levels," & Chr(34) & "]); }" & Chr(34), bIncludeArgumentName:=False, iPosition:=0) clsRelevelPasteFunction.SetAssignTo("relevel_variables") - clsRPivotTableFunction.SetPackageName("rpivotTable") - clsRPivotTableFunction.SetRCommand("rpivotTable") - clsRPivotTableFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorPivot.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) + + clsConcatenateFunction.SetRCommand("c") clsSelectFunction.SetPackageName("dplyr") clsSelectFunction.SetRCommand("select") clsSelectFunction.AddParameter("concatenate", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=0, bIncludeArgumentName:=False) - clsConcatenateFunction.SetRCommand("c") + clsPipeOperator.SetOperation("%>%") + clsPipeOperator.AddParameter("columns", clsRFunctionParameter:=clsSelectFunction, iPosition:=1) + clsPipeOperator.SetAssignTo("data_selected") + + clsRPivotTableFunction.SetPackageName("rpivotTable") + clsRPivotTableFunction.SetRCommand("rpivotTable") + clsRPivotTableFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorPivot.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) + clsRPivotTableFunction.SetAssignTo("last_table") + + clsRPivotTableFunction.SetAssignToRObject(strRObjectToAssignTo:="last_table", + strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, + strRObjectFormatToAssignTo:=RObjectFormat.Html, + strRDataFrameNameToAddObjectTo:=ucrSelectorPivot.strCurrentDataFrame, + strObjectName:="last_table") - ucrBase.clsRsyntax.AddToBeforeCodes(clsRPivotTableFunction, iPosition:=4) - ucrBase.clsRsyntax.SetBaseRFunction(clsGetObjectFunction) + ucrBase.clsRsyntax.SetBaseRFunction(clsRPivotTableFunction) End Sub Private Sub SetRCodeForControls(bReset As Boolean) @@ -214,9 +215,7 @@ Public Class dlgThreeVariablePivotTable Private Sub ucrChkSelectedVariable_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkSelectedVariable.ControlValueChanged If ucrChkSelectedVariable.Checked Then ucrReceiverSelectedVariable.SetMeAsReceiver() - ucrBase.clsRsyntax.AddToBeforeCodes(clsPipeOperator, iPosition:=0) Else - ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsPipeOperator) If ucrChkNumericVariable.Checked Then ucrReceiverAdditionalRowFactor.SetMeAsReceiver() Else @@ -227,13 +226,13 @@ Public Class dlgThreeVariablePivotTable End Sub Private Sub ucrSelectorPivot_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorPivot.ControlValueChanged - clsGetObjectFunction.AddParameter("data_name", Chr(34) & ucrSelectorPivot.ucrAvailableDataFrames.cboAvailableDataFrames.Text & Chr(34), iPosition:=0) ChangeDataParameterValue() + clsRPivotTableFunction._rDataFrameNameToAddObjectTo = ucrSelectorPivot.strCurrentDataFrame End Sub Private Sub ChangeDataParameterValue() If ucrChkSelectedVariable.Checked Then - clsRPivotTableFunction.AddParameter("data", "data_selected", iPosition:=0) + clsRPivotTableFunction.AddParameter("data", clsROperatorParameter:=clsPipeOperator, iPosition:=0) Else clsRPivotTableFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorPivot.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) End If @@ -280,17 +279,11 @@ Public Class dlgThreeVariablePivotTable If ucrChangedControls Is ucrReceiverFactorLevels Then If ucrReceiverFactorLevels.IsEmpty Then - ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsLevelsFunction) - ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsPasteFunction) ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsFlattenFunction) - ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsRelevelPasteFunction) clsRPivotTableFunction.RemoveParameterByName("sorters") Else - ucrBase.clsRsyntax.AddToBeforeCodes(clsLevelsFunction, 0) - ucrBase.clsRsyntax.AddToBeforeCodes(clsPasteFunction, 1) - ucrBase.clsRsyntax.AddToBeforeCodes(clsFlattenFunction, 2) - ucrBase.clsRsyntax.AddToBeforeCodes(clsRelevelPasteFunction, 3) - clsRPivotTableFunction.AddParameter("sorters", "relevel_variables", iPosition:=3) + ucrBase.clsRsyntax.AddToBeforeCodes(clsFlattenFunction, 0) + clsRPivotTableFunction.AddParameter(strParameterName:="sorters", clsRFunctionParameter:=clsRelevelPasteFunction, iPosition:=3) End If End If End Sub @@ -311,14 +304,6 @@ Public Class dlgThreeVariablePivotTable TestOkEnabled() End Sub - Private Sub ucrSavePivot_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSavePivot.ControlValueChanged - If ucrSavePivot.ucrChkSave.Checked Then - clsGetObjectFunction.AddParameter("object_name", Chr(34) & ucrSavePivot.ucrInputComboSave.GetText & Chr(34), iPosition:=1) - Else - clsGetObjectFunction.AddParameter("object_name", Chr(34) & "last_table" & Chr(34), iPosition:=1) - End If - End Sub - Private Sub ucrChkNumericVariable_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkNumericVariable.ControlValueChanged If ucrChkNumericVariable.Checked Then ucrReceiverAdditionalRowFactor.SetMeAsReceiver() diff --git a/instat/dlgViewLabelsAndLevels.vb b/instat/dlgViewLabelsAndLevels.vb index cf922888fec..cca6681757f 100644 --- a/instat/dlgViewLabelsAndLevels.vb +++ b/instat/dlgViewLabelsAndLevels.vb @@ -11,213 +11,228 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . -Imports RDotNet -Imports instat.Translations -Public Class dlgViewFactorLabels - Private bFirstLoad As Boolean = True - Private bReset As Boolean = True - Private strCurrDataFrame As String - Private clsViewFunction, clsSelectFunction, clsDeleteLabelsFunction As New RFunction - Private clsDummyDataFunction As New RFunction - - Private Sub dlgLabelAndLevels_Load(sender As Object, e As EventArgs) Handles MyBase.Load - If bFirstLoad Then - InitialiseDialog() - bFirstLoad = False - End If - If bReset Then - SetDefaults() - End If - SetRCodeForControls(bReset) - bReset = False - SetReceiverVariableVisible() - TestOkEnabled() - autoTranslate(Me) - End Sub - - Private Sub InitialiseDialog() - Dim lstOfControls As New List(Of Control) - - ucrBase.iHelpTopicID = 517 - ucrBase.clsRsyntax.iCallType = 2 - ucrReceiverVariables.SetParameter(New RParameter("col_names", 1)) - ucrReceiverVariables.SetParameterIsString() - ucrReceiverVariables.SetParameterIncludeArgumentName(False) - ucrReceiverVariables.Selector = ucrSelectorViewLabelsAndLevels - ucrReceiverVariables.SetMeAsReceiver() - - ucrSelectorViewLabelsAndLevels.SetParameter(New RParameter("data_name", 0)) - ucrSelectorViewLabelsAndLevels.SetParameterIsrfunction() - - ucrChkShowLabels.SetParameter(New RParameter("show.labels", 1)) - ucrChkShowLabels.SetText("Show Variable Labels") - ucrChkShowLabels.SetRDefault("TRUE") - - ucrChkShowType.SetParameter(New RParameter("show.type", 2)) - ucrChkShowType.SetText("Show Column Types") - ucrChkShowType.SetRDefault("FALSE") - - ucrChkShowValues.SetParameter(New RParameter("show.values", 3)) - ucrChkShowValues.SetText("Show Numeric Values") - ucrChkShowValues.SetRDefault("TRUE") - - ucrChkShowMissingValues.SetParameter(New RParameter("show.na", 4)) - ucrChkShowMissingValues.SetText("Show Missing Values") - ucrChkShowMissingValues.SetRDefault("FALSE") - - ucrChkShowId.SetParameter(New RParameter("show.id", 5)) - ucrChkShowId.SetText("Show ID") - ucrChkShowId.SetRDefault("TRUE") - - ucrChkShowPercentage.SetParameter(New RParameter("show.prc", 6)) - ucrChkShowPercentage.SetText("Show Percentages") - ucrChkShowPercentage.SetRDefault("FALSE") - - ucrChkShowFrequencies.SetParameter(New RParameter("show.frq", 7)) - ucrChkShowFrequencies.SetText("Show Frequencies") - ucrChkShowFrequencies.SetRDefault("FALSE") - - ucrChkAlternateColour.SetParameter(New RParameter("altr.row.col", 8)) - ucrChkAlternateColour.SetText("Highlight Alternate Rows") - ucrChkAlternateColour.SetRDefault("TRUE") - - ucrChkSortByName.SetParameter(New RParameter("sort.by.name", 9)) - ucrChkSortByName.SetText("Sort by Name") - ucrChkSortByName.SetRDefault("FALSE") - - ucrChkMaxLabels.SetText("Max Labels") - ucrChkMaxLabels.SetParameter(New RParameter("check", 1)) - ucrChkMaxLabels.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkMaxLabels.AddToLinkedControls({ucrNudMaxLength}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="15") - - ucrNudMaxLength.SetParameter(New RParameter("max.len", 10)) - ucrNudMaxLength.Increment = 1 - ucrNudMaxLength.Minimum = 1 - - ucrPnlSelectData.SetParameter(New RParameter("checked", 0)) - ucrPnlSelectData.AddRadioButton(rdoWholeDataFrame, "data") - ucrPnlSelectData.AddRadioButton(rdoSelectedColumn, "column") - - ucrPnlOptions.AddRadioButton(rdoViewLabels) - ucrPnlOptions.AddRadioButton(rdoDeleteValueLabels) - ucrPnlOptions.AddFunctionNamesCondition(rdoViewLabels, "view_df") - ucrPnlOptions.AddFunctionNamesCondition(rdoDeleteValueLabels, frmMain.clsRLink.strInstatDataObject & "$append_to_variables_metadata") - ucrPnlOptions.AddToLinkedControls(ucrChkShowValues, {rdoViewLabels}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlOptions.AddToLinkedControls(ucrReceiverVariables, {rdoViewLabels, rdoDeleteValueLabels}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlOptions.AddToLinkedControls(ucrPnlSelectData, {rdoDeleteValueLabels}, bNewLinkedHideIfParameterMissing:=True) - lstOfControls.AddRange({grpDisplayOptions, grpLabels, grpSummaryStatistics, lblFactorColumns}) - ucrChkShowValues.SetLinkedDisplayControl(lstOfControls) - End Sub - - Private Sub SetDefaults() - clsViewFunction = New RFunction - clsSelectFunction = New RFunction - clsDeleteLabelsFunction = New RFunction - clsDummyDataFunction = New RFunction - - 'Reset - ucrSelectorViewLabelsAndLevels.Reset() - 'Defining the function - clsViewFunction.SetPackageName("sjPlot") - clsViewFunction.SetRCommand("view_df") - - clsDummyDataFunction.AddParameter("checked", "data", iPosition:=0) - clsDummyDataFunction.AddParameter("check", "FALSE", iPosition:=1) - - clsSelectFunction.SetAssignTo("selected_variables") - - clsDeleteLabelsFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$append_to_variables_metadata") - clsDeleteLabelsFunction.AddParameter("property", Chr(34) & "labels" & Chr(34), iPosition:=2) - clsDeleteLabelsFunction.AddParameter("new_val", Chr(34) & Chr(34), iPosition:=3) - - clsViewFunction.AddParameter("x", "selected_variables", iPosition:=0) - clsViewFunction.AddParameter("show.frq", "TRUE") - clsViewFunction.AddParameter("show.id", "FALSE") - ucrBase.clsRsyntax.SetBaseRFunction(clsViewFunction) - End Sub - - Private Sub SetRCodeForControls(bReset As Boolean) - ucrPnlOptions.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) - ucrReceiverVariables.AddAdditionalCodeParameterPair(clsDeleteLabelsFunction, New RParameter("col_names", 1), iAdditionalPairNo:=1) - - ucrChkAlternateColour.SetRCode(clsViewFunction, bReset) - ucrChkShowFrequencies.SetRCode(clsViewFunction, bReset) - ucrChkShowId.SetRCode(clsViewFunction, bReset) - ucrChkShowLabels.SetRCode(clsViewFunction, bReset) - ucrChkShowMissingValues.SetRCode(clsViewFunction, bReset) - ucrChkSortByName.SetRCode(clsViewFunction, bReset) - ucrChkShowPercentage.SetRCode(clsViewFunction, bReset) - ucrChkShowType.SetRCode(clsViewFunction, bReset) - ucrChkShowValues.SetRCode(clsViewFunction, bReset) - ucrChkMaxLabels.SetRCode(clsDummyDataFunction, bReset) - ucrNudMaxLength.SetRCode(clsViewFunction, bReset) - ucrReceiverVariables.SetRCode(clsSelectFunction, bReset) - ucrPnlSelectData.SetRCode(clsDummyDataFunction, bReset) - End Sub - - Private Sub TestOkEnabled() - If rdoViewLabels.Checked Then - If Not ucrReceiverVariables.IsEmpty AndAlso (ucrChkShowLabels.Checked OrElse ucrChkShowType.Checked OrElse - ucrChkShowValues.Checked OrElse ucrChkShowFrequencies.Checked OrElse ucrChkShowPercentage.Checked) Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If - Else - If rdoWholeDataFrame.Checked Then - ucrBase.OKEnabled(True) - ElseIf rdoSelectedColumn.Checked AndAlso Not ucrReceiverVariables.IsEmpty Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If - End If - End Sub - - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeForControls(True) - TestOkEnabled() - End Sub - - Private Sub SetReceiverVariableVisible() - If rdoDeleteValueLabels.Checked Then - ucrReceiverVariables.Visible = rdoSelectedColumn.Checked - End If - End Sub - - Private Sub ucrPnlSelectData_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlSelectData.ControlValueChanged, ucrPnlOptions.ControlValueChanged, ucrReceiverVariables.ControlValueChanged - SetReceiverVariableVisible() - If rdoViewLabels.Checked Then - ucrReceiverVariables.SetParameterIsRFunction() - ucrReceiverVariables.Location = New System.Drawing.Point(295, 84) - ucrSelectorViewLabelsAndLevels.HideShowAddOrDataOptionsOrListView(True, True, True) - ucrReceiverVariables.bWithQuotes = False - ucrBase.clsRsyntax.AddToBeforeCodes(clsSelectFunction) - ucrBase.clsRsyntax.SetBaseRFunction(clsViewFunction) - Else - ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsSelectFunction) - ucrReceiverVariables.Location = New System.Drawing.Point(302, 109) - ucrReceiverVariables.bWithQuotes = True - strCurrDataFrame = ucrSelectorViewLabelsAndLevels.ucrAvailableDataFrames.strCurrDataFrame - clsDeleteLabelsFunction.AddParameter("data_name", Chr(34) & strCurrDataFrame & Chr(34), iPosition:=0) - ucrBase.clsRsyntax.SetBaseRFunction(clsDeleteLabelsFunction) - If rdoWholeDataFrame.Checked Then - ucrSelectorViewLabelsAndLevels.HideShowAddOrDataOptionsOrListView(False, False, False) - clsDeleteLabelsFunction.RemoveParameterByName("col_names") - ElseIf rdoSelectedColumn.Checked Then - ucrSelectorViewLabelsAndLevels.HideShowAddOrDataOptionsOrListView(True, True, True) - clsDeleteLabelsFunction.AddParameter("col_names", ucrReceiverVariables.GetVariableNames(bWithQuotes:=True), iPosition:=1) - End If - End If - End Sub - - Private Sub ucrReceiverFactorColumns_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverVariables.ControlContentsChanged, - ucrChkShowFrequencies.ControlContentsChanged, ucrChkShowLabels.ControlContentsChanged, ucrChkShowPercentage.ControlContentsChanged, - ucrChkShowType.ControlContentsChanged, ucrChkShowValues.ControlContentsChanged, ucrPnlSelectData.ControlContentsChanged, ucrPnlOptions.ControlContentsChanged - TestOkEnabled() - End Sub +Imports RDotNet +Imports instat.Translations + +'todo. rename this to dlgViewLabelsAndLevels +Public Class dlgViewFactorLabels + Private bFirstLoad As Boolean = True + Private bReset As Boolean = True + Private strCurrDataFrame As String + Private clsSjTableFunction, clsSelectFunction, clsDeleteLabelsFunction As New RFunction + Private clsDummyDataFunction As New RFunction + + Private Sub dlgLabelAndLevels_Load(sender As Object, e As EventArgs) Handles MyBase.Load + If bFirstLoad Then + InitialiseDialog() + bFirstLoad = False + End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False + SetReceiverVariableVisible() + TestOkEnabled() + autoTranslate(Me) + End Sub + + Private Sub InitialiseDialog() + Dim lstOfControls As New List(Of Control) + + ucrBase.iHelpTopicID = 517 + ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False + + ucrReceiverVariables.SetParameter(New RParameter("col_names", 1)) + ucrReceiverVariables.SetParameterIsString() + ucrReceiverVariables.SetParameterIncludeArgumentName(False) + ucrReceiverVariables.Selector = ucrSelectorViewLabelsAndLevels + ucrReceiverVariables.SetMeAsReceiver() + + ucrSelectorViewLabelsAndLevels.SetParameter(New RParameter("data_name", 0)) + ucrSelectorViewLabelsAndLevels.SetParameterIsrfunction() + + ucrChkShowLabels.SetParameter(New RParameter("show.labels", 1)) + ucrChkShowLabels.SetText("Show Variable Labels") + ucrChkShowLabels.SetRDefault("TRUE") + + ucrChkShowType.SetParameter(New RParameter("show.type", 2)) + ucrChkShowType.SetText("Show Column Types") + ucrChkShowType.SetRDefault("FALSE") + + ucrChkShowValues.SetParameter(New RParameter("show.values", 3)) + ucrChkShowValues.SetText("Show Numeric Values") + ucrChkShowValues.SetRDefault("TRUE") + + ucrChkShowMissingValues.SetParameter(New RParameter("show.na", 4)) + ucrChkShowMissingValues.SetText("Show Missing Values") + ucrChkShowMissingValues.SetRDefault("FALSE") + + ucrChkShowId.SetParameter(New RParameter("show.id", 5)) + ucrChkShowId.SetText("Show ID") + ucrChkShowId.SetRDefault("TRUE") + + ucrChkShowPercentage.SetParameter(New RParameter("show.prc", 6)) + ucrChkShowPercentage.SetText("Show Percentages") + ucrChkShowPercentage.SetRDefault("FALSE") + + ucrChkShowFrequencies.SetParameter(New RParameter("show.frq", 7)) + ucrChkShowFrequencies.SetText("Show Frequencies") + ucrChkShowFrequencies.SetRDefault("FALSE") + + ucrChkAlternateColour.SetParameter(New RParameter("altr.row.col", 8)) + ucrChkAlternateColour.SetText("Highlight Alternate Rows") + ucrChkAlternateColour.SetRDefault("TRUE") + + ucrChkSortByName.SetParameter(New RParameter("sort.by.name", 9)) + ucrChkSortByName.SetText("Sort by Name") + ucrChkSortByName.SetRDefault("FALSE") + + ucrChkMaxLabels.SetText("Max Labels") + ucrChkMaxLabels.SetParameter(New RParameter("check", 1)) + ucrChkMaxLabels.SetValuesCheckedAndUnchecked("TRUE", "FALSE") + ucrChkMaxLabels.AddToLinkedControls({ucrNudMaxLength}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="15") + + ucrNudMaxLength.SetParameter(New RParameter("max.len", 10)) + ucrNudMaxLength.Increment = 1 + ucrNudMaxLength.Minimum = 1 + + ucrPnlSelectData.SetParameter(New RParameter("checked", 0)) + ucrPnlSelectData.AddRadioButton(rdoWholeDataFrame, "data") + ucrPnlSelectData.AddRadioButton(rdoSelectedColumn, "column") + + ucrPnlOptions.AddRadioButton(rdoViewLabels) + ucrPnlOptions.AddRadioButton(rdoDeleteValueLabels) + ucrPnlOptions.AddFunctionNamesCondition(rdoViewLabels, "view_df") + ucrPnlOptions.AddFunctionNamesCondition(rdoDeleteValueLabels, frmMain.clsRLink.strInstatDataObject & "$append_to_variables_metadata") + ucrPnlOptions.AddToLinkedControls(ucrChkShowValues, {rdoViewLabels}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlOptions.AddToLinkedControls(ucrReceiverVariables, {rdoViewLabels, rdoDeleteValueLabels}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlOptions.AddToLinkedControls(ucrPnlSelectData, {rdoDeleteValueLabels}, bNewLinkedHideIfParameterMissing:=True) + lstOfControls.AddRange({grpDisplayOptions, grpLabels, grpSummaryStatistics, lblFactorColumns}) + ucrChkShowValues.SetLinkedDisplayControl(lstOfControls) + End Sub + + Private Sub SetDefaults() + clsSjTableFunction = New RFunction + clsSelectFunction = New RFunction + clsDeleteLabelsFunction = New RFunction + clsDummyDataFunction = New RFunction + + 'Reset + ucrSelectorViewLabelsAndLevels.Reset() + 'Defining the function + clsSjTableFunction.SetPackageName("sjPlot") + clsSjTableFunction.SetRCommand("view_df") + + clsDummyDataFunction.AddParameter("checked", "data", iPosition:=0) + clsDummyDataFunction.AddParameter("check", "FALSE", iPosition:=1) + + clsSelectFunction.SetAssignTo("selected_variables") + + clsDeleteLabelsFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$append_to_variables_metadata") + clsDeleteLabelsFunction.AddParameter("property", Chr(34) & "labels" & Chr(34), iPosition:=2) + clsDeleteLabelsFunction.AddParameter("new_val", Chr(34) & Chr(34), iPosition:=3) + + clsSjTableFunction.AddParameter("x", clsRFunctionParameter:=clsSelectFunction, iPosition:=0) + clsSjTableFunction.AddParameter("show.frq", "TRUE") + clsSjTableFunction.AddParameter("show.id", "FALSE") + clsSjTableFunction.SetAssignTo("variables_sjTable") + + clsSjTableFunction.SetAssignToRObject(strRObjectToAssignTo:="last_table", + strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, + strRObjectFormatToAssignTo:=RObjectFormat.Html, + strRDataFrameNameToAddObjectTo:=ucrSelectorViewLabelsAndLevels.strCurrentDataFrame, + strObjectName:="last_table") + + ucrBase.clsRsyntax.SetBaseRFunction(clsSjTableFunction) + End Sub + + Private Sub SetRCodeForControls(bReset As Boolean) + ucrPnlOptions.SetRCode(clsSjTableFunction, bReset) + ucrReceiverVariables.AddAdditionalCodeParameterPair(clsDeleteLabelsFunction, New RParameter("col_names", 1), iAdditionalPairNo:=1) + + ucrChkAlternateColour.SetRCode(clsSjTableFunction, bReset) + ucrChkShowFrequencies.SetRCode(clsSjTableFunction, bReset) + ucrChkShowId.SetRCode(clsSjTableFunction, bReset) + ucrChkShowLabels.SetRCode(clsSjTableFunction, bReset) + ucrChkShowMissingValues.SetRCode(clsSjTableFunction, bReset) + ucrChkSortByName.SetRCode(clsSjTableFunction, bReset) + ucrChkShowPercentage.SetRCode(clsSjTableFunction, bReset) + ucrChkShowType.SetRCode(clsSjTableFunction, bReset) + ucrChkShowValues.SetRCode(clsSjTableFunction, bReset) + ucrChkMaxLabels.SetRCode(clsDummyDataFunction, bReset) + ucrNudMaxLength.SetRCode(clsSjTableFunction, bReset) + ucrReceiverVariables.SetRCode(clsSelectFunction, bReset) + ucrPnlSelectData.SetRCode(clsDummyDataFunction, bReset) + End Sub + + Private Sub TestOkEnabled() + If rdoViewLabels.Checked Then + If Not ucrReceiverVariables.IsEmpty AndAlso (ucrChkShowLabels.Checked OrElse ucrChkShowType.Checked OrElse + ucrChkShowValues.Checked OrElse ucrChkShowFrequencies.Checked OrElse ucrChkShowPercentage.Checked) Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If + Else + If rdoWholeDataFrame.Checked Then + ucrBase.OKEnabled(True) + ElseIf rdoSelectedColumn.Checked AndAlso Not ucrReceiverVariables.IsEmpty Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If + End If + End Sub + + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset + SetDefaults() + SetRCodeForControls(True) + TestOkEnabled() + End Sub + + Private Sub SetReceiverVariableVisible() + If rdoDeleteValueLabels.Checked Then + ucrReceiverVariables.Visible = rdoSelectedColumn.Checked + End If + End Sub + + Private Sub ucrPnlSelectData_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlSelectData.ControlValueChanged, ucrPnlOptions.ControlValueChanged, ucrReceiverVariables.ControlValueChanged + SetReceiverVariableVisible() + If rdoViewLabels.Checked Then + ucrReceiverVariables.SetParameterIsRFunction() + ucrReceiverVariables.Location = New System.Drawing.Point(295, 84) + ucrSelectorViewLabelsAndLevels.HideShowAddOrDataOptionsOrListView(True, True, True) + ucrReceiverVariables.bWithQuotes = False + ucrBase.clsRsyntax.SetBaseRFunction(clsSjTableFunction) + Else + ucrReceiverVariables.Location = New System.Drawing.Point(302, 109) + ucrReceiverVariables.bWithQuotes = True + strCurrDataFrame = ucrSelectorViewLabelsAndLevels.ucrAvailableDataFrames.strCurrDataFrame + clsDeleteLabelsFunction.AddParameter("data_name", Chr(34) & strCurrDataFrame & Chr(34), iPosition:=0) + ucrBase.clsRsyntax.SetBaseRFunction(clsDeleteLabelsFunction) + If rdoWholeDataFrame.Checked Then + ucrSelectorViewLabelsAndLevels.HideShowAddOrDataOptionsOrListView(False, False, False) + clsDeleteLabelsFunction.RemoveParameterByName("col_names") + ElseIf rdoSelectedColumn.Checked Then + ucrSelectorViewLabelsAndLevels.HideShowAddOrDataOptionsOrListView(True, True, True) + clsDeleteLabelsFunction.AddParameter("col_names", ucrReceiverVariables.GetVariableNames(bWithQuotes:=True), iPosition:=1) + End If + End If + End Sub + + Private Sub ucrReceiverFactorColumns_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverVariables.ControlContentsChanged, + ucrChkShowFrequencies.ControlContentsChanged, ucrChkShowLabels.ControlContentsChanged, ucrChkShowPercentage.ControlContentsChanged, + ucrChkShowType.ControlContentsChanged, ucrChkShowValues.ControlContentsChanged, ucrPnlSelectData.ControlContentsChanged, ucrPnlOptions.ControlContentsChanged + TestOkEnabled() + End Sub + + Private Sub ucrSelectorViewLabelsAndLevels_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorViewLabelsAndLevels.ControlValueChanged + clsSjTableFunction._rDataFrameNameToAddObjectTo = ucrSelectorViewLabelsAndLevels.strCurrentDataFrame + End Sub + + End Class \ No newline at end of file diff --git a/instat/frmGraphDisplay.Designer.vb b/instat/frmGraphDisplay.Designer.vb deleted file mode 100644 index 0b8e581d5af..00000000000 --- a/instat/frmGraphDisplay.Designer.vb +++ /dev/null @@ -1,71 +0,0 @@ -' R- Instat -' Copyright (C) 2015-2017 -' -' This program is free software: you can redistribute it and/or modify -' it under the terms of the GNU General Public License as published by -' the Free Software Foundation, either version 3 of the License, or -' (at your option) any later version. -' -' This program is distributed in the hope that it will be useful, -' but WITHOUT ANY WARRANTY; without even the implied warranty of -' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -' GNU General Public License for more details. -' -' You should have received a copy of the GNU General Public License -' along with this program. If not, see . - - -Partial Class frmGraphDisplay - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - - Private Sub InitializeComponent() - Me.pctGraph = New System.Windows.Forms.PictureBox() - CType(Me.pctGraph, System.ComponentModel.ISupportInitialize).BeginInit() - Me.SuspendLayout() - ' - 'pctGraph - ' - Me.pctGraph.Dock = System.Windows.Forms.DockStyle.Fill - Me.pctGraph.Location = New System.Drawing.Point(0, 0) - Me.pctGraph.Name = "pctGraph" - Me.pctGraph.Size = New System.Drawing.Size(484, 461) - Me.pctGraph.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage - Me.pctGraph.TabIndex = 0 - Me.pctGraph.TabStop = False - ' - 'frmGraphDisplay - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi - Me.ClientSize = New System.Drawing.Size(484, 461) - Me.Controls.Add(Me.pctGraph) - Me.Name = "frmGraphDisplay" - Me.ShowIcon = False - Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent - Me.Text = "Graph Display" - CType(Me.pctGraph, System.ComponentModel.ISupportInitialize).EndInit() - Me.ResumeLayout(False) - - End Sub - - Friend WithEvents pctGraph As PictureBox -End Class diff --git a/instat/frmGraphDisplay.sw-KE.resx b/instat/frmGraphDisplay.sw-KE.resx deleted file mode 100644 index a3df4f013d3..00000000000 --- a/instat/frmGraphDisplay.sw-KE.resx +++ /dev/null @@ -1,15 +0,0 @@ - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/instat/frmGraphDisplay.vb b/instat/frmGraphDisplay.vb deleted file mode 100644 index a1eb37cc05e..00000000000 --- a/instat/frmGraphDisplay.vb +++ /dev/null @@ -1,31 +0,0 @@ -' R- Instat -' Copyright (C) 2015-2017 -' -' This program is free software: you can redistribute it and/or modify -' it under the terms of the GNU General Public License as published by -' the Free Software Foundation, either version 3 of the License, or -' (at your option) any later version. -' -' This program is distributed in the hope that it will be useful, -' but WITHOUT ANY WARRANTY; without even the implied warranty of -' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -' GNU General Public License for more details. -' -' You should have received a copy of the GNU General Public License -' along with this program. If not, see . - -Public Class frmGraphDisplay - Private Sub frmGraphDisplay_Load(sender As Object, e As EventArgs) Handles MyBase.Load - - End Sub - - Public Sub SetImageFromFile(strFilePath As String) - Dim fsTemp As System.IO.FileStream - Dim imgTemp As Image - - fsTemp = New System.IO.FileStream(strFilePath, IO.FileMode.Open, IO.FileAccess.Read) - imgTemp = System.Drawing.Image.FromStream(fsTemp) - pctGraph.Image = imgTemp - fsTemp.Close() - End Sub -End Class \ No newline at end of file diff --git a/instat/frmMaximiseOutput.Designer.vb b/instat/frmMaximiseOutput.Designer.vb new file mode 100644 index 00000000000..bf7f0517b07 --- /dev/null +++ b/instat/frmMaximiseOutput.Designer.vb @@ -0,0 +1,89 @@ + +Partial Class frmMaximiseOutput + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + + Private Sub InitializeComponent() + Me.MenuStrip1 = New System.Windows.Forms.MenuStrip() + Me.FileToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.mnuSave = New System.Windows.Forms.ToolStripMenuItem() + Me.panelControl = New System.Windows.Forms.Panel() + Me.MenuStrip1.SuspendLayout() + Me.SuspendLayout() + ' + 'MenuStrip1 + ' + Me.MenuStrip1.ImageScalingSize = New System.Drawing.Size(24, 24) + Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.FileToolStripMenuItem}) + Me.MenuStrip1.Location = New System.Drawing.Point(0, 0) + Me.MenuStrip1.Name = "MenuStrip1" + Me.MenuStrip1.Padding = New System.Windows.Forms.Padding(4, 1, 0, 1) + Me.MenuStrip1.Size = New System.Drawing.Size(533, 24) + Me.MenuStrip1.TabIndex = 0 + Me.MenuStrip1.Text = "MenuStrip1" + ' + 'FileToolStripMenuItem + ' + Me.FileToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuSave}) + Me.FileToolStripMenuItem.Name = "FileToolStripMenuItem" + Me.FileToolStripMenuItem.Size = New System.Drawing.Size(37, 22) + Me.FileToolStripMenuItem.Text = "File" + ' + 'mnuSave + ' + Me.mnuSave.Name = "mnuSave" + Me.mnuSave.Size = New System.Drawing.Size(98, 22) + Me.mnuSave.Text = "Save" + ' + 'panelControl + ' + Me.panelControl.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.panelControl.Location = New System.Drawing.Point(12, 27) + Me.panelControl.Name = "panelControl" + Me.panelControl.Size = New System.Drawing.Size(509, 253) + Me.panelControl.TabIndex = 1 + ' + 'frmMaximiseOutput + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(533, 292) + Me.Controls.Add(Me.panelControl) + Me.Controls.Add(Me.MenuStrip1) + Me.MainMenuStrip = Me.MenuStrip1 + Me.Margin = New System.Windows.Forms.Padding(2) + Me.Name = "frmMaximiseOutput" + Me.Text = "Output" + Me.WindowState = System.Windows.Forms.FormWindowState.Maximized + Me.MenuStrip1.ResumeLayout(False) + Me.MenuStrip1.PerformLayout() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents MenuStrip1 As MenuStrip + Friend WithEvents FileToolStripMenuItem As ToolStripMenuItem + Friend WithEvents mnuSave As ToolStripMenuItem + Friend WithEvents panelControl As Panel +End Class \ No newline at end of file diff --git a/instat/frmGraphDisplay.resx b/instat/frmMaximiseOutput.resx similarity index 91% rename from instat/frmGraphDisplay.resx rename to instat/frmMaximiseOutput.resx index 1af7de150c9..19c5f6c2b65 100644 --- a/instat/frmGraphDisplay.resx +++ b/instat/frmMaximiseOutput.resx @@ -1,17 +1,17 @@  - @@ -117,4 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + \ No newline at end of file diff --git a/instat/frmMaximiseOutput.vb b/instat/frmMaximiseOutput.vb new file mode 100644 index 00000000000..733d192a585 --- /dev/null +++ b/instat/frmMaximiseOutput.vb @@ -0,0 +1,81 @@ +Imports System.IO +Imports System.Runtime.InteropServices +Imports System.Windows.Controls +Imports CefSharp.DevTools + +Public Class frmMaximiseOutput + Private _strDisplayedFileName As String = "" + Private _strFileFilter As String = "" + 'todo. to be used by the output page to remember paths selected by user when saving outputs + Public _strFileDestinationDirectory As String = "" + + Public Overloads Sub Show(strFileName As String) + Me._strDisplayedFileName = strFileName + Dim strFileExtension As String = Path.GetExtension(_strDisplayedFileName).ToLower + Me.panelControl.Controls.Clear() + + Select Case strFileExtension + Case ".txt" + _strFileFilter = "txt (*.txt)|*.txt" + Dim ucrTextViewer As New ucrTextViewer + ucrTextViewer.LoadTextFile(strFileName) + ucrTextViewer.FormatText(OutputFont.ROutputFont, OutputFont.ROutputColour) + Me.panelControl.Controls.Add(ucrTextViewer) + 'Me.Margin + ucrTextViewer.Dock = DockStyle.Fill + Case ".png" + _strFileFilter = "png (*.png)|*.png" + Dim pictureBox As New PictureBox + pictureBox.Load(_strDisplayedFileName) + pictureBox.SizeMode = PictureBoxSizeMode.Zoom + Me.panelControl.Controls.Add(pictureBox) + pictureBox.Dock = DockStyle.Fill + Case ".html" + If RuntimeInformation.IsOSPlatform(OSPlatform.Windows) AndAlso CefRuntimeWrapper.IsCefInitilised Then + _strFileFilter = "html (*.html)|*.html" + Dim ucrWebView As New ucrWebViewer + ucrWebView.LoadHtmlFile(_strDisplayedFileName) + Me.panelControl.Controls.Add(ucrWebView) + ucrWebView.Dock = DockStyle.Fill + Else + 'display the html output in default browser + Cursor = Cursors.WaitCursor + Process.Start(_strDisplayedFileName) + Cursor = Cursors.Default + 'important. just return don't show the form + Return + End If + Case Else + 'todo. developer error + Return + End Select + MyBase.Show() + End Sub + + Private Sub mnuSave_Click(sender As Object, e As EventArgs) Handles mnuSave.Click + Using dlgSaveFile As New SaveFileDialog + dlgSaveFile.Title = "Save Output" + dlgSaveFile.Filter = _strFileFilter + dlgSaveFile.InitialDirectory = If(String.IsNullOrEmpty(_strFileDestinationDirectory), + frmMain.clsInstatOptions.strWorkingDirectory, _strFileDestinationDirectory) + If DialogResult.OK = dlgSaveFile.ShowDialog() Then + + _strFileDestinationDirectory = Path.GetDirectoryName(dlgSaveFile.FileName) + + If Path.GetExtension(_strDisplayedFileName).ToLower = ".html" Then + 'copy the html file with it's associated directory; css, javascript files etc + For Each foundDirectory As String In My.Computer.FileSystem.GetDirectories( + Path.GetDirectoryName(_strDisplayedFileName), + FileIO.SearchOption.SearchTopLevelOnly, + "*" & Path.GetFileNameWithoutExtension(_strDisplayedFileName) & "*") + My.Computer.FileSystem.CopyDirectory(foundDirectory, _strFileDestinationDirectory, True) + Next + Else + My.Computer.FileSystem.CopyFile(_strDisplayedFileName, dlgSaveFile.FileName, True) + End If + End If + End Using + + End Sub + +End Class \ No newline at end of file diff --git a/instat/instat.vbproj b/instat/instat.vbproj index 7468e3ac51c..0ecc2fc552e 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -111,6 +111,9 @@ true + + app.manifest + False @@ -207,6 +210,14 @@ Form + + + + frmMaximiseOutput.vb + + + Form + @@ -1250,12 +1261,6 @@ Form - - frmGraphDisplay.vb - - - Form - frmPackageIssues.vb @@ -2867,6 +2872,13 @@ UserControl + + Component + + + + Component + ucrOutputPage.vb @@ -3012,6 +3024,10 @@ dlgThreeVariablePivotTable.vb + + frmMaximiseOutput.vb + Designer + frmOutputWindow.vb @@ -4024,12 +4040,6 @@ dlgColumnStructures.vb - - frmGraphDisplay.vb - - - frmGraphDisplay.vb - frmPackageIssues.vb @@ -5141,6 +5151,7 @@ PreserveNewest + From 8234dda78ff902afa63ef1d8cd94308cc4902f04 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Thu, 8 Sep 2022 00:36:38 +0300 Subject: [PATCH 018/122] added R scripts changes and save controls changes --- instat/instat.vbproj | 12 - instat/static/InstatObject/R/data_object_R6.R | 90 +- .../static/InstatObject/R/instat_object_R6.R | 313 +++-- .../InstatObject/R/labels_and_defaults.R | 7 +- .../InstatObject/R/stand_alone_functions.R | 138 ++ instat/ucrInput.vb | 1111 ++++++++--------- instat/ucrInputComboBox.vb | 686 +++++----- instat/ucrSave.vb | 147 ++- instat/ucrSaveModel.Designer.vb | 84 -- instat/ucrSaveModel.resx | 120 -- instat/ucrSaveModel.sw-KE.resx | 51 - instat/ucrSaveModel.vb | 36 - 12 files changed, 1307 insertions(+), 1488 deletions(-) delete mode 100644 instat/ucrSaveModel.Designer.vb delete mode 100644 instat/ucrSaveModel.resx delete mode 100644 instat/ucrSaveModel.sw-KE.resx delete mode 100644 instat/ucrSaveModel.vb diff --git a/instat/instat.vbproj b/instat/instat.vbproj index c1d456a1358..7ebc5dfecf3 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -2766,12 +2766,6 @@ UserControl - - ucrSaveModel.vb - - - UserControl - ucrScript.vb @@ -5101,12 +5095,6 @@ ucrSave.vb - - ucrSaveModel.vb - - - ucrSaveModel.vb - ucrScript.vb diff --git a/instat/static/InstatObject/R/data_object_R6.R b/instat/static/InstatObject/R/data_object_R6.R index e6fd3d3d018..42e406de60f 100644 --- a/instat/static/InstatObject/R/data_object_R6.R +++ b/instat/static/InstatObject/R/data_object_R6.R @@ -2047,19 +2047,30 @@ DataSheet$set("public", "get_variables_metadata_fields", function(as_list = FALS } ) -DataSheet$set("public", "add_object", function(object, object_name) { - if(missing(object_name)) object_name = next_default_item("object", names(private$objects)) - if(object_name %in% names(private$objects)) message("An object called ", object_name, " already exists. It will be replaced.") - private$objects[[object_name]] <- object - self$append_to_changes(list(Added_object, object_name)) - if(any(c("ggplot", "gg", "gtable", "grob", "ggmultiplot", "ggsurv", "ggsurvplot", "openair", "recordedplot") %in% class(object))) { - private$.last_graph <- object_name - } +DataSheet$set("public", "add_object", function(object_name, object_type_label, object_format, object) { + + if(missing(object_name)){ + object_name = next_default_item("object", names(private$objects)) + } + + if(object_name %in% names(private$objects)){ + message("An object called ", object_name, " already exists. It will be replaced.") + } + + #add the object with its metadata to the list of objects and add an "Added_object" change + private$objects[[object_name]] <- list(object_type_label = object_type_label, object_format = object_format, object = object) + self$append_to_changes(list(Added_object, object_name)) + + #if the object is a graph then set it's name as the last graph name added. + if(identical(object_type_label, "graph")){ + private$.last_graph <- object_name + } + } ) -DataSheet$set("public", "get_objects", function(object_name, type = "", force_as_list = FALSE, silent = FALSE) { - curr_objects = private$objects[self$get_object_names(type = type)] +DataSheet$set("public", "get_objects", function(object_name, object_type_label, force_as_list = FALSE, silent = FALSE) { + curr_objects = private$objects[self$get_object_names(object_type_label = object_type_label)] if(length(curr_objects) == 0) return(curr_objects) if(missing(object_name)) return(curr_objects) if(!is.character(object_name)) stop("object_name must be a character") @@ -2075,26 +2086,41 @@ DataSheet$set("public", "get_objects", function(object_name, type = "", force_as } ) -DataSheet$set("public", "get_object_names", function(type = "", as_list = FALSE, excluded_items = c()) { - if(type == "") out = names(private$objects) - else { - if(type == model_label) out = names(private$objects)[!sapply(private$objects, function(x) any(c("ggplot", "gg", "gtable", "grob", "ggmultiplot", "ggsurv", "ggsurvplot", "htmlTable", "Surv") %in% class(x)))] - else if(type == graph_label) out = names(private$objects)[sapply(private$objects, function(x) any(c("ggplot", "gg", "gtable", "grob", "ggmultiplot", "ggsurv", "ggsurvplot", "openair", "recordedplot") %in% class(x)))] - else if(type == surv_label) out = names(private$objects)[sapply(private$objects, function(x) any(c("Surv") %in% class(x)))] - else if(type == table_label) out = names(private$objects)[sapply(private$objects, function(x) any(c("htmlTable", "data.frame", "list") %in% class(x)))] - else stop("type: ", type, " not recognised") - } - if(length(excluded_items) > 0) { - ex_ind = which(out %in% excluded_items) - if(length(ex_ind) != length(excluded_items)) warning("Some of the excluded_items were not found in the list of objects") - if(length(ex_ind) > 0) out = out[-ex_ind] - } - if(as_list) { - lst = list() - lst[[self$get_metadata(data_name_label)]] <- out - return(lst) - } - else return(out) +DataSheet$set("public", "get_object_names", function(object_type_label, as_list = FALSE, excluded_items = c()) { + if(missing(object_type_label)){ + out = names(private$objects) + }else{ + out = names(private$objects)[sapply(private$objects, function(x) any( identical(x$object_type_label, object_type_label) ))] + } + + if(length(out) == 0){ + return(out) + } + + + if(length(excluded_items) > 0) { + excluded_indices = which(out %in% excluded_items) + + #notify user + if(length(excluded_indices) != length(excluded_items)){ + warning("Some of the excluded_items were not found in the list of objects") + } + + #remove the excluded items from the list + if(length(excluded_indices) > 0){ + out = out[-excluded_indices] + } + + } + + if(as_list) { + lst = list() + lst[[self$get_metadata(data_name_label)]] <- out + return(lst) + }else{ + return(out) + } + } ) @@ -2105,7 +2131,7 @@ DataSheet$set("public", "get_last_graph_name", function() { DataSheet$set("public", "get_last_graph", function() { if(!is.null(private$.last_graph)) { - self$get_objects(object_name = private$.last_graph, type = graph_label) + self$get_objects(object_name = private$.last_graph, object_type = graph_label, type = graph_label) } } ) @@ -4371,4 +4397,4 @@ DataSheet$set("public", "has_labels", function(col_names) { if(missing(col_names)) stop("Column name must be specified.") return(!is.null(attr(col_names, "labels"))) } -) +) \ No newline at end of file diff --git a/instat/static/InstatObject/R/instat_object_R6.R b/instat/static/InstatObject/R/instat_object_R6.R index 6ee334f42ac..156c64000ba 100644 --- a/instat/static/InstatObject/R/instat_object_R6.R +++ b/instat/static/InstatObject/R/instat_object_R6.R @@ -533,18 +533,49 @@ DataBook$set("public", "get_columns_from_data", function(data_name, col_names, f } ) -DataBook$set("public", "add_object", function(data_name, object, object_name, internal = TRUE) { - if (internal) { - if(missing(data_name)) { - if(missing(object_name)) object_name = next_default_item("object", names(private$.objects)) - if(object_name %in% names(private$.objects)) message(paste("An object called", object_name, "already exists. It will be replaced.")) - private$.objects[[object_name]] <- object +DataBook$set("public", "add_object", function(data_name, object_name, object_type_label, object_format, object, internal = TRUE) { + + if (internal) { + if(missing(data_name)) { + if(missing(object_name)){ + object_name = next_default_item("object", names(private$.objects)) + } + + #notify user + if(object_name %in% names(private$.objects)){ + message(paste("An object called", object_name, "already exists. It will be replaced.")) + } + + #add the object + private$.objects[[object_name]] <- list(object_type_label = object_type_label, object_format = object_format, object = object) + } else{ + self$get_data_objects(data_name)$add_object(object_name = object_name, object_type_label = object_type_label, object_format = object_format, object = object) + } + } else { + + #todo. should every other big object have their own data book or we use one data book for storing all the objects? + #or we store all objects in a separate data structure that is not a data book? + #if we store it in a data structure then we will NOT need the "internal" parameter + + #for graphs, create a separate .graph_data_book data book if it's not yet created + if(identical(object_type_label, "graph")){ + if (!exists(".graph_data_book")){ + self$create_graph_data_book() + } + .graph_data_book$add_object(data_name = data_name, object_name = object_name, object_type_label = object_type_label, object_format = object_format, object = object, internal = TRUE) + }else{ + self$add_object(data_name = data_name, object_name = object_name, object_type_label = object_type_label, object_format = object_format, object = object, internal = TRUE) + } + } - else self$get_data_objects(data_name)$add_object(object = object, object_name = object_name) - } else { - if (!exists(".graph_data_book")) self$create_graph_data_book() - .graph_data_book$add_object(data_name = data_name, object = object, object_name = object_name, internal = TRUE) - } + + #after adding the graph. set it as last graph contents + if(identical(object_type_label,"graph")){ + last_graph_name <- self$get_data_objects(data_name)$get_last_graph_name() + if(!is.null(last_graph_name)) private$.last_graph <- c(data_name, last_graph_name) + } + + } ) @@ -561,89 +592,121 @@ DataBook$set("public", "create_graph_data_book", function() { } ) -DataBook$set("public", "get_objects", function(data_name, object_name, include_overall = TRUE, as_list = FALSE, type = "", include_empty = FALSE, force_as_list = FALSE, print_graph = TRUE, internal = TRUE, ...) { - if (!internal & exists(".graph_data_book")) { - out <- .graph_data_book$get_objects(data_name = data_name, object_name = object_name, include_overall = include_overall, as_list = as_list, type = type, include_empty = include_empty, force_as_list = force_as_list, print_graph = print_graph, silent = silent, internal = TRUE, ... = ...) - if (!is.null(out)) return(out) - } - else { - #TODO implement force_as_list in all cases - if(missing(data_name)) { - if(!missing(object_name)) { - curr_objects = private$.objects[self$get_object_names(data_name = overall_label, type = type)] - if(!(object_name %in% names(curr_objects))) stop(object_name, "not found.") - else out = curr_objects[[object_name]] - } - else { - out = sapply(self$get_data_objects(as_list = TRUE), function(x) x$get_objects(type = type)) - if(include_overall) out[[overall_label]] <- private$.objects[self$get_object_names(data_name = overall_label, type = type)] - if(!include_empty) out = out[sapply(out, function(x) length(x) > 0)] - } - if(!missing(object_name) && length(object_name) == 1) { - if(print_graph && (ggplot2::is.ggplot(out) || any(c("gg", "ggmultiplot", "openair", "recordedplot") %in% class(out)))) return(print(out)) - else return(out) +DataBook$set("public", "get_objects", function(data_name, object_name, object_type_label, include_overall = TRUE, as_list = FALSE, include_empty = FALSE, force_as_list = FALSE, internal = TRUE, ...) { + + if (!internal & exists(".graph_data_book")) { + out <- .graph_data_book$get_objects(data_name = data_name, object_name = object_name, object_type_label = object_type_label, include_overall = include_overall, as_list = as_list, include_empty = include_empty, force_as_list = force_as_list, print_graph = print_graph, silent = silent, internal = TRUE, ... = ...) + if (!is.null(out)){ + return(out) } - else return(out) - } - else { - if(data_name == overall_label) { - curr_objects = private$.objects[self$get_object_names(data_name = data_name, type = type)] + }else { + #TODO implement force_as_list in all cases + if(missing(data_name)) { if(!missing(object_name)) { - if(!(object_name %in% names(curr_objects))) stop(object_name, "not found.") - else out = curr_objects[[object_name]] + curr_objects <- private$.objects[self$get_object_names(data_name = overall_label, object_type_label = object_type_label)] + if(!(object_name %in% names(curr_objects))) { + stop(object_name, "not found.") + }else{ + out <- curr_objects[[object_name]] + } + }else{ + out <- sapply(self$get_data_objects(as_list = TRUE), function(x) x$get_objects(object_type_label = object_type_label)) + if(include_overall){ + out[[overall_label]] <- private$.objects[self$get_object_names(data_name = overall_label, object_type_label = object_type_label)] + } + if(!include_empty){ + out <- out[sapply(out, function(x) length(x) > 0)] + } + } + + return(out) + + }else { + if(data_name == overall_label) { + curr_objects <- private$.objects[self$get_object_names(data_name = data_name, object_type_label = object_type_label)] + if(!missing(object_name)) { + if(!(object_name %in% names(curr_objects))){ + stop(object_name, "not found.") + }else{ + out <- curr_objects[[object_name]] + } + }else{ + out <- curr_objects + } + }else{ + out <- self$get_data_objects(data_name)$get_objects(object_name = object_name, object_type_label = object_type_label, force_as_list = force_as_list) + } + + if(as_list) { + lst = list() + lst[[data_name]][[object_name]] <- out + return(lst) + }else { + return(out) } - else out = curr_objects - } - else out = self$get_data_objects(data_name)$get_objects(object_name = object_name, type = type, force_as_list = force_as_list) - if(as_list) { - lst = list() - lst[[data_name]][[object_name]] <- out - return(lst) - } - else { - if(print_graph && (ggplot2::is.ggplot(out) || any(c("gg", "ggmultiplot", "openair", "recordedplot") %in% class(out)))) return(print(out)) - else return(out) } } - } + } ) -DataBook$set("public", "get_object_names", function(data_name, include_overall = TRUE, include, exclude, type = "", include_empty = FALSE, as_list = FALSE, excluded_items = c(), internal = TRUE) { - if (!internal && exists(".graph_data_book")) return(.graph_data_book$get_object_names(data_name = data_name, include_overall = include_overall, include = include, exclude = exclude, type = type, include_empty = include_empty, as_list = as_list, excluded_items = excluded_items, internal = TRUE)) - if(type == "") overall_object_names = names(private$.objects) - else { - if(type == model_label) overall_object_names = names(private$.objects)[!sapply(private$.objects, function(x) any(c("ggplot", "gg", "gtable", "grob", "ggmultiplot", "ggsurv", "ggsurvplot", "htmlTable", "Surv") %in% class(x)))] - else if(type == graph_label) overall_object_names = names(private$.objects)[sapply(private$.objects, function(x) any(c("ggplot", "gg", "gtable", "grob", "ggmultiplot", "ggsurv", "ggsurvplot", "openair", "recordedplot") %in% class(x)))] - else if(type == surv_label) overall_object_names = names(private$.objects)[sapply(private$.objects, function(x) any(c("Surv") %in% class(x)))] - else if(type == table_label) overall_object_names = names(private$.objects)[sapply(private$.objects, function(x) any(c("htmlTable") %in% class(x)))] - else stop("type: ", type, " not recognised") - } - if(missing(data_name)) { - if(missing(type)) out = sapply(self$get_data_objects(), function(x) x$get_object_names()) - else out = sapply(self$get_data_objects(), function(x) x$get_object_names(type = type)) - #temp disabled as causes a bug - #if(include_overall) out[[overall_label]] <- overall_object_names - if(!include_empty) out = out[sapply(out, function(x) length(x) > 0)] - if(as_list) out = as.list(out) - return(out) - } - else { - if(data_name == overall_label) { - if(length(excluded_items) > 0) { - ex_ind = which(overall_object_names %in% excluded_items) - if(length(ex_ind) != length(excluded_items)) warning("Some of the excluded_items were not found in the list of objects") - if(length(ex_ind) > 0) overall_object_names = overall_object_names[-ex_ind] - } - if(as_list) { - lst = list() - lst[[overall_label]] <- overall_object_names - return(lst) - } - else return(overall_object_names) +DataBook$set("public", "get_object_names", function(data_name, object_type_label, include_overall = TRUE, include, exclude, include_empty = FALSE, as_list = FALSE, excluded_items = c(), internal = TRUE) { + + if(!missing(object_type_label)){ + + if(!internal && exists(".graph_data_book")){ + return(.graph_data_book$get_object_names(data_name = data_name, object_type_label = object_type_label,include_overall = include_overall, include = include, exclude = exclude, include_empty = include_empty, as_list = as_list, excluded_items = excluded_items, internal = TRUE)) + } + + if(missing(data_name)) { + if(missing(object_type_label)){ + out <- sapply(self$get_data_objects(), function(x) x$get_object_names()) + }else{ + out <- sapply(self$get_data_objects(), function(x) x$get_object_names(object_type_label = object_type_label)) + } + #temp disabled as causes a bug + #if(include_overall) out[[overall_label]] <- overall_object_names + if(!include_empty){ + out <- out[sapply(out, function(x) length(x) > 0)] + } + + if(as_list){ + out <- as.list(out) + } + return(out) + }else { + if(data_name == overall_label) { + + if(object_type_label == ""){ + overall_object_names <- names(private$.objects) + }else { + #todo. check if type is recognised? + overall_object_names <- names(private$.objects)[sapply(private$.objects, function(x) any( identical(x$object_type_label, object_type_label) ))] + } + + if(length(excluded_items) > 0) { + excluded_indices <- which(overall_object_names %in% excluded_items) + if(length(excluded_indices) != length(excluded_items)){ + warning("Some of the excluded_items were not found in the list of objects") + } + if(length(excluded_indices) > 0){ + overall_object_names <- overall_object_names[-excluded_indices] + } + } + if(as_list) { + lst = list() + lst[[overall_label]] <- overall_object_names + return(lst) + }else{ + return(overall_object_names) + } + }else{ + return(self$get_data_objects(data_name)$get_object_names(object_type_label, as_list = as_list, excluded_items = excluded_items)) + } } - else return(self$get_data_objects(data_name)$get_object_names(type, as_list = as_list, excluded_items = excluded_items)) + } + } ) @@ -697,89 +760,21 @@ DataBook$set("public", "get_from_object", function(data_name, object_name, value } ) -DataBook$set("public", "add_model", function(data_name, model, model_name) { - self$add_object(data_name = data_name, object = model, object_name = model_name) -} -) - -DataBook$set("public", "get_models", function(data_name, model_name, include_overall = TRUE, force_as_list = FALSE) { - self$get_objects(data_name = data_name, object_name = model_name, include_overall = include_overall, type = model_label, force_as_list = force_as_list) -} -) - -DataBook$set("public", "get_model_names", function(data_name, include_overall = TRUE, include, exclude, include_empty = FALSE, as_list = FALSE, excluded_items = c()) { - self$get_object_names(data_name = data_name, include_overall = include_overall, include, exclude, type = model_label, include_empty = include_empty, as_list = as_list, excluded_items = excluded_items) -} -) - -DataBook$set("public", "get_from_model", function(data_name, model_name, value1, value2, value3) { - self$get_from_object(data_name = data_name, object_name = model_name, value1 = value1, value2 = value2, value3 = value3) -} -) - -DataBook$set("public", "add_graph", function(data_name, graph, graph_name, internal = FALSE) { - if (internal) { - self$add_object(data_name = data_name, object = graph, object_name = graph_name) - last_graph_name <- self$get_data_objects(data_name)$get_last_graph_name() - if(!is.null(last_graph_name)) private$.last_graph <- c(data_name, last_graph_name) - } else { - if (!exists(".graph_data_book")) self$create_graph_data_book() - .graph_data_book$add_graph(data_name = data_name, graph = graph, graph_name = graph_name, internal = TRUE) - } -} -) - -DataBook$set("public", "get_graphs", function(data_name, graph_name, include_overall = TRUE, force_as_list = FALSE, print_graph = TRUE, internal = FALSE) { - self$get_objects(data_name = data_name, object_name = graph_name, include_overall = include_overall, type = graph_label, force_as_list = force_as_list, print_graph = print_graph, internal = internal) -} -) - -DataBook$set("public", "get_graph_names", function(data_name, include_overall = TRUE, include, exclude, include_empty = FALSE, as_list = FALSE, excluded_items = c(), internal = FALSE) { - if (!internal & exists(".graph_data_book")) .graph_data_book$get_graph_names(data_name = data_name, include_overall = include_overall, include = include, exclude = exclude, include_empty = include_empty, as_list = as_list, excluded_items = excluded_items, internal = TRUE) - else self$get_object_names(data_name = data_name, include_overall = include_overall, include, exclude, type = graph_label, include_empty = include_empty, as_list = as_list, excluded_items = excluded_items, internal = internal) -} -) - +#todo. deprecate this later. get_object and view_object should be sufficient DataBook$set("public", "get_last_graph", function(print_graph = TRUE, internal = FALSE) { if (!internal && exists(".graph_data_book")) .graph_data_book$get_last_graph(print_graph = print_graph, internal = TRUE) else { if(!is.null(private$.last_graph) && length(private$.last_graph) == 2) { - self$get_objects(data_name = private$.last_graph[1], object_name = private$.last_graph[2], type = graph_label, print_graph = print_graph) + graph_object <- self$get_objects(data_name = private$.last_graph[1], object_name = private$.last_graph[2], object_type_label = graph_label) + if(print_graph){ + print(graph_object$object) + } + return(graph_object$object) } } } ) -DataBook$set("public", "add_surv", function(data_name, surv, surv_name) { - self$add_object(data_name = data_name, object =surv, object_name =surv_name) -} -) - -DataBook$set("public", "get_surv", function(data_name, surv_name, include_overall = TRUE, force_as_list = FALSE) { - self$get_objects(data_name = data_name, object_name = surv_name, include_overall = include_overall, type = surv_label, force_as_list = force_as_list) -} -) - -DataBook$set("public", "get_surv_names", function(data_name, include_overall = TRUE, include, exclude, include_empty = FALSE, as_list = FALSE, excluded_items = c()) { - self$get_object_names(data_name = data_name, include_overall = include_overall, include, exclude, type = surv_label, include_empty = include_empty, as_list = as_list, excluded_items = excluded_items) -} -) - -DataBook$set("public", "add_table", function(data_name, table, table_name) { - self$add_object(data_name = data_name, object = table, object_name = table_name) -} -) - -DataBook$set("public", "get_tables", function(data_name, table_name, include_overall = TRUE, force_as_list = FALSE) { - self$get_objects(data_name = data_name, object_name = table_name, include_overall = include_overall, type = table_label, force_as_list = force_as_list) -} -) - -DataBook$set("public", "get_table_names", function(data_name, include_overall = TRUE, include, exclude, include_empty = FALSE, as_list = FALSE, excluded_items = c()) { - self$get_object_names(data_name = data_name, include_overall = include_overall, include, exclude, type = table_label, include_empty = include_empty, as_list = as_list, excluded_items = excluded_items) -} -) - # Filters ----------------------------------------------------------------- @@ -2742,4 +2737,4 @@ DataBook$set("public", "replace_values_with_NA", function(data_name, row_index, DataBook$set("public","has_labels", function(data_name, col_names) { self$get_data_objects(data_name)$has_labels(col_names) } -) +) \ No newline at end of file diff --git a/instat/static/InstatObject/R/labels_and_defaults.R b/instat/static/InstatObject/R/labels_and_defaults.R index e0b7e357d63..6ed365153a8 100644 --- a/instat/static/InstatObject/R/labels_and_defaults.R +++ b/instat/static/InstatObject/R/labels_and_defaults.R @@ -58,10 +58,11 @@ structure_type_3_label="Measurement" #object labels overall_label="[Overall]" -model_label="model" graph_label="graph" table_label="table" -surv_label="surv" +model_label="model" +structure_label = "structure" +summary_label = "summary" #link labels keyed_link_label="keyed_link" @@ -69,4 +70,4 @@ keyed_link_label="keyed_link" max_labels_display=4 # Column Selection Operations -column_selection_operations <- c("base::match", "tidyselect::starts_with", "tidyselect::ends_with", "tidyselect::contains", "tidyselect::matches", "tidyselect::num_range", "tidyselect::last_col", "tidyselect::where") +column_selection_operations <- c("base::match", "tidyselect::starts_with", "tidyselect::ends_with", "tidyselect::contains", "tidyselect::matches", "tidyselect::num_range", "tidyselect::last_col", "tidyselect::where") \ No newline at end of file diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index a21ee0e8e54..17758773a0d 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -2548,6 +2548,7 @@ is.containValueLabel <- function(x){ return(labels_label %in% names(attributes(x))) } + read_corpora <- function(data){ data_all <- NULL description <- NULL @@ -2596,3 +2597,140 @@ read_corpora <- function(data){ } return (data.frame(data_all)) } + +#object is the object to be displayed +#object_format is the display format +view_object <- function(object, object_format) { + file_name <- "" + if (identical(object_format, "image")) { + file_name <- view_graph_object(object) + } else if (identical(object_format, "text")) { + file_name <- view_text_object(object) + } else if (identical(object_format, "html")) { + file_name <- view_html_object(object) + }else{ + print(object) + } + return(file_name) +} + +#displays the graph object in the set R "viewer". +#if the viewer is not available then +#it saves the object as a file in the temporary folder +#and returns the file path. +view_graph_object <- function(graph_object){ + #if there is a viewer, like in the case of RStudio then just print the object + #this check is primarily meant to make this function work in a similar manner when run outside R-Instat + r_viewer <- base::getOption("viewer") + if (!is.null(r_viewer)) { + #TODO. When print command is called in R-Studio, a temp file is automatically created + #Investigate how that can be done in R-Instat + #as of 07/09/2022 just return the object. Important for RStudio to display the object + return(graph_object) + } + + #get object class names + object_class_names <- class(graph_object) + #get a unique temporary file name from the tempdir path + file_name <- tempfile(pattern = "viewgraph", fileext = ".png") + + #save the object as a html file depending on the object type + grDevices::png(file = file_name, width = 4000, height = 4000, res = 500) + print(graph_object) + dev.off() #todo. use graphics.off() which one is better? + + #todo. should we use respective package "convenience" functions to save the objects as image files depending on the class names? + #investigate if thatwill that help with resolution and scaling? + + # if ("ggplot" %in% object_class_names) { + # + # } else if ("ggmultiplot" %in% object_class_names) { + # + # } else if ("openair" %in% object_class_names) { + # + # } else if ("ggsurvplot" %in% object_class_names) { + # + # } else if ("recordedplot" %in% object_class_names) { + # + # } + + message("R viewer not detected. File saved in location ", file_name) + return(file_name) + +} + +#displays the object in the set R "viewer". +#if the viewer is not available then +#it saves the object as a file in the temporary folder +#and returns the file path. +view_text_object <- function(text_object){ + #if there is a viewer, like in the case of RStudio then just print the object + #this check is primarily meant to make this function work in a similar manner when run outside R-Instat + r_viewer <- base::getOption("viewer") + if (!is.null(r_viewer)) { + #TODO. When print command is called in R-Studio, a temp file is + #automatically created. Investigate how that can be done in R-Instat + #as of 07/09/2022 just return output. Important for RStudio to display the object + return(utils::capture.output(text_object)) + } + + #get object class names + object_class_names <- class(text_object) + #get a unique temporary file name from the tempdir path + file_name <- tempfile(pattern = "viewtext", fileext = ".txt") + + #todo. should we use respective package "convenience" functions to save the objects as text files depending on the class names + + #save the object as a text file + utils::capture.output(text_object, file = file_name) + + message("R viewer not detected. File saved in location ", file_name) + return(file_name) + +} + +#displays the html object in the set R "viewer". +#if the viewer is not available then +#it saves the object as a file in the temporary folder +#and returns the file path. +view_html_object <- function(html_object){ + #if there is a viewer, like in the case of RStudio then just print the object + #this check is primarily meant to make this function work in a similar manner when run outside R-Instat + r_viewer <- base::getOption("viewer") + if (!is.null(r_viewer)) { + #When print command is called in R-Studio, a temp file is + #automatically created. TODO. Investigate how that can be done in R-Instat. + #as of 07/09/2022 just return the object. Important for RStudio to display the object + return(html_object) + } + + + file_name <- "" + #get a vector of available class names + object_class_names <- class(html_object) + #get a unique temporary file name from the tempdir path + file_name <- tempfile(pattern = "viewhtml", fileext = ".html") + + #save the object as a html file depending on the object type + if ("htmlwidget" %in% object_class_names) { + #Note. When selfcontained is set to True + #a "Saving a widget with selfcontained = TRUE requires pandoc" error is thrown in R-Instat + #when saving an rpivotTable + #TODO. Investigate how to solve it then. + htmlwidgets::saveWidget(html_object, file = file_name, selfcontained = FALSE) + } else if ("sjTable" %in% object_class_names) { + #"sjTable" objects are not compatible with "htmlwidgets" package. So they have to be saved differently + #"sjplot" package produces "sjTable" objects + html_object$file = file_name + #TODO. Is there any other function that can save an sjTable to a html file? + print(html_object) + } else if ("gt_tbl" %in% object_class_names) { + #"gt table" objects are not compatible with "htmlwidgets" package. So they have to be saved differently. + #"mmtable2" package produces "gt_tbl" objects + gt::gtsave(html_object,filename = file_name) + } + + message("R viewer not detected. File saved in location ", file_name) + return(file_name) + +} \ No newline at end of file diff --git a/instat/ucrInput.vb b/instat/ucrInput.vb index 36337b2c97d..3aa78039245 100644 --- a/instat/ucrInput.vb +++ b/instat/ucrInput.vb @@ -11,576 +11,547 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . -Imports instat -Imports RDotNet - -Public Class ucrInput - Public bUserTyped As Boolean = False - Public Event NameChanged() - Protected strValidationType As String = "None" - Protected ReadOnly strReservedWords() As String = ({"if", "else", "repeat", "while", "function", "for", "in", "next", "break", "TRUE", "FALSE", "NULL", "Inf", "NaN", "NA", "NA_integer_", "NA_real_", "NA_complex_", "NA_character_"}) - Public clsRList As New RFunction - Protected dcmMinimum As Decimal = Decimal.MinValue - Protected dcmMaximum As Decimal = Decimal.MaxValue - Protected bMinimumIncluded, bMaximumIncluded As Boolean - Protected strDefaultType As String = "" - Protected strDefaultPrefix As String = "" - Protected WithEvents ucrDataFrameSelector As ucrDataFrame - Protected bIsReadOnly As Boolean = False - Public bAutoChangeOnLeave As Boolean = False - Protected bAllowInf As Boolean = False - Private bLastSilent As Boolean = False - Private bPrivateAddQuotesIfUnrecognised As Boolean = True - Protected dctDisplayParameterValues As New Dictionary(Of String, String) - Protected bFirstLoad As Boolean = True - - 'used to determine if valid expressions are allowed for numeric validations e.g 20/2, 30-1 - Protected bNumericExpressionAllowed As Boolean = True - - Public Sub New() - - ' This call is required by the designer. - InitializeComponent() - - ' Add any initialization after the InitializeComponent() call. - bUpdateRCodeFromControl = False - End Sub - - Public Overridable Sub SetName(strName As String, Optional bSilent As Boolean = False) - bLastSilent = bSilent - End Sub - - Public Overridable Function GetText() As String - Return "" - End Function - - Public Overridable Function GetValue() As Object - Return Nothing - End Function - - Public Overridable Sub Reset() - bUserTyped = False - End Sub - - Public Sub OnNameChanged() - Me.Text = Me.GetText() - RaiseEvent NameChanged() - OnControlValueChanged() - End Sub - - Public Overrides Sub UpdateParameter(clsTempParam As RParameter) - If bChangeParameterValue AndAlso clsTempParam IsNot Nothing Then - If dctDisplayParameterValues.ContainsKey(GetText()) Then - clsTempParam.SetArgumentValue(dctDisplayParameterValues(GetText())) - Else - If AddQuotesIfUnrecognised Then - clsTempParam.SetArgumentValue(Chr(34) & GetText() & Chr(34)) - Else - clsTempParam.SetArgumentValue(GetText()) - End If - End If - End If - End Sub - - Public Function UserTyped() As Boolean - Return bUserTyped - End Function - - Public Sub SetDefaultTypeAsColumn() - strDefaultType = "Column" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsModel() - strDefaultType = "Model" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsSurv() - strDefaultType = "Surv" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsTable() - strDefaultType = "Table" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsDataFrame() - strDefaultType = "Data Frame" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsGraph() - strDefaultType = "Graph" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsKey() - strDefaultType = "Key" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsLink() - strDefaultType = "Link" - SetDefaultName() - End Sub - - Public Sub SetValidationTypeAsRVariable() - strValidationType = "RVariable" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsFilter() - strDefaultType = "Filter" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsColumnSelection() - strDefaultType = "Column Selection" - - SetDefaultName() - End Sub - - Public Overridable Sub SetDataFrameSelector(ucrNewSelector As ucrDataFrame) - ucrDataFrameSelector = ucrNewSelector - If Not bUserTyped Then - SetDefaultName() - End If - End Sub - - Public Sub SetPrefix(strNewPrefix As String) - strDefaultPrefix = strNewPrefix - SetDefaultName() - End Sub - - Public Sub SetDefaultName() - If strDefaultPrefix <> "" Then - If strDefaultType = "Column" Then - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" AndAlso frmMain.clsRLink.DataFrameExists(ucrDataFrameSelector.cboAvailableDataFrames.Text) Then - SetName(frmMain.clsRLink.GetDefaultColumnNames(strDefaultPrefix, ucrDataFrameSelector.cboAvailableDataFrames.Text)) - Else - SetName("") - End If - ElseIf strDefaultType = "Model" Then - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetModelNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - 'temp disabled as causing bug and not currently needed - 'SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetModelNames())) - End If - ElseIf strDefaultType = "Table" Then - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetTableNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - 'temp disabled as causing bug and not currently needed - 'SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetTableNames())) - End If - ElseIf strDefaultType = "Data Frame" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetDataFrameNames())) - ElseIf strDefaultType = "Graph" Then - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetGraphNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - 'temp disabled as causing bug and not currently needed - 'SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetGraphNames())) - End If - ElseIf strDefaultType = "Filter" Then - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - SetName("") - End If - ElseIf strDefaultType = "Column Selection" Then - - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetColumnSelectionNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - SetName("") - End If - ElseIf strDefaultType = "Surv" Then - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetSurvNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - SetName("") - End If - ElseIf strDefaultType = "Key" Then - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetKeyNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - SetName("") - End If - ElseIf strDefaultType = "Link" Then - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetLinkNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - SetName("") - End If - End If - End If - End Sub - - Public Sub SetValidationTypeAsNumeric(Optional dcmMin As Decimal = Decimal.MinValue, Optional bIncludeMin As Boolean = True, Optional dcmMax As Decimal = Decimal.MaxValue, Optional bIncludeMax As Boolean = True, Optional bNumericExpressionAllowed As Boolean = True) - strValidationType = "Numeric" - Me.bNumericExpressionAllowed = bNumericExpressionAllowed - If dcmMin <> Decimal.MinValue Then - dcmMinimum = dcmMin - bMinimumIncluded = bIncludeMin - End If - If dcmMax <> Decimal.MaxValue Then - dcmMaximum = dcmMax - bMaximumIncluded = bIncludeMax - End If - End Sub - - Public Function GetNumericRange() As String - Dim strRange As String = "" - If strValidationType = "Numeric" Then - If dcmMinimum <> Decimal.MinValue Then - If bMinimumIncluded Then - strRange = ">= " & dcmMinimum.ToString() - Else - strRange = "> " & dcmMinimum.ToString() - End If - If dcmMaximum <> Decimal.MaxValue Then - strRange = strRange & " and " - End If - End If - If dcmMaximum <> Decimal.MaxValue Then - If bMaximumIncluded Then - strRange = strRange & "<= " & dcmMaximum.ToString() - Else - strRange = strRange & "< " & dcmMaximum.ToString() - End If - End If - ElseIf strValidationType = "NumericList" Then - If dcmMinimum <> Double.MinValue Then - If bMinimumIncluded Then - strRange = ">= " & dcmMinimum.ToString() - Else - strRange = "> " & dcmMinimum.ToString() - End If - If dcmMaximum <> Double.MaxValue Then - strRange = strRange & " and " - End If - End If - If dcmMaximum <> Double.MaxValue Then - If bMaximumIncluded Then - strRange = strRange & "<= " & dcmMaximum.ToString() - Else - strRange = strRange & "< " & dcmMaximum.ToString() - End If - End If - End If - Return strRange - End Function - - Public Sub SetValidationTypeAsList() - strValidationType = "List" - End Sub - - Public Sub SetValidationTypeAsNumericList(Optional bNewAllowInf As Boolean = False, Optional bIncludeMin As Boolean = True, Optional dcmMin As Double = Double.MinValue, Optional dcmMax As Double = Double.MaxValue, Optional bIncludeMax As Boolean = True) - ' Dim Dmax As Double = Maximum - ' Dim Dmin As Double = Minimum - strValidationType = "NumericList" - If dcmMin <> Double.MinValue Then - dcmMinimum = dcmMin - End If - If dcmMax <> Double.MaxValue Then - dcmMaximum = dcmMax - End If - bAllowInf = bNewAllowInf - End Sub - - Public Function IsValid(strText As String) As Boolean - Return (GetValidationCode(strText) = 0) - End Function - - Public Function GetValidationCode(strText As String) As Integer - Dim iType As Integer - Select Case strValidationType - Case "None" - iType = 0 - Case "RVariable" - iType = ValidateRVariable(strText) - Case "Numeric" - iType = ValidateNumeric(strText) - Case "List" - iType = ValidateList(strText, False) - Case "NumericList" - iType = ValidateList(strText, True, bAllowInf) - End Select - Return iType - End Function - - Public Function ValidateText(strText As String) As Boolean - Dim iValidationCode As Integer - - iValidationCode = GetValidationCode(strText) - - Select Case iValidationCode - Case 0 - - Case 1 - Select Case strValidationType - Case "RVariable" - MsgBox(Chr(34) & strText & Chr(34) & " is a reserved word in R and cannot be used.", vbOKOnly) - Case "Numeric" - MsgBox("Entry must be numeric.", vbOKOnly) - Case "List" - MsgBox("Textbox requires a list separated by commas.", vbOKOnly, "Validation Error") - Case "NumericList" - MsgBox("Textbox requires a list of numbers separated by commas.", vbOKOnly, "Validation Error") - End Select - Case 2 - Select Case strValidationType - Case "RVariable" - MsgBox("This name cannot start with " & strText(0), vbOKOnly) - Case "Numeric" - MsgBox("This number must be: " & GetNumericRange(), vbOKOnly) - Case "NumericList" - MsgBox("Each item in the list must be numeric.", vbOKOnly, "Validation Error") - End Select - Case 3 - Select Case strValidationType - Case "RVariable" - MsgBox("This name cannot start with a dot followed by a number/nothing", vbOKOnly) - Case "NumericList" - MsgBox("Each item in the list must be " & GetNumericRange(), vbOKOnly, "Validation Error") - End Select - Case 4 - Select Case strValidationType - Case "RVariable" - MsgBox("This name cannot contain a space", vbOKOnly) - End Select - Case 5 - Select Case strValidationType - Case "RVariable" - MsgBox("This name contains an invalid character", vbOKOnly) - - End Select - End Select - Return (iValidationCode = 0) - - End Function - - 'Returns integer as code for validation - ' 0 : string is valid - ' 1 : string is not numeric - ' 2 : string is outside range - Public Function ValidateNumeric(strText As String) As Integer - Dim dcmText As Decimal - Dim iType As Integer = 0 - - If strText <> "" AndAlso (strValuesToIgnore Is Nothing OrElse (strValuesToIgnore IsNot Nothing AndAlso Not strValuesToIgnore.Contains(strText))) Then - If Not IsNumeric(strText) Then - iType = 1 'reset as invalid entry - 'if numeric expressions are allowed check the expression results to a valid numeric - If bNumericExpressionAllowed Then - Dim vecOutput As CharacterVector - 'is.numeric(x) returns true if the x expression is a valid one. - 'So we use it here to check validity of the entry - vecOutput = frmMain.clsRLink.RunInternalScriptGetOutput("is.numeric(" & strText & ")", bSilent:=True) - If vecOutput IsNot Nothing AndAlso vecOutput.Length > 0 AndAlso Mid(vecOutput(0), 5).ToUpper = "TRUE" Then - iType = 0 'set as valid entry - End If - End If - Else - dcmText = Convert.ToDecimal(strText) - If (dcmText < dcmMinimum) OrElse (dcmText > dcmMaximum) OrElse (Not bMinimumIncluded And dcmText <= dcmMinimum) OrElse (Not bMaximumIncluded And dcmText >= dcmMaximum) Then - iType = 2 - End If - End If - End If - Return iType - End Function - - 'Returns integer as code for validation - ' 0 : string is valid - ' 1 : string is a reserved word - ' 2 : string starts with invalid character - ' 3 : string starts with "." followed by a number/nothing - ' 4 : string contains a space - ' 5 : string contains other invalid character - Public Function ValidateRVariable(strText As String) As Integer - Dim chrFirst As Char - Dim chrCurr As Char - Dim bAcceptableString As Boolean - - If strText = "" Then - Return 0 - End If - - If strReservedWords.Contains(strText) Then - Return 1 - End If - chrFirst = strText(0) - If Not Char.IsLetter(chrFirst) Then - If chrFirst <> "." Then - Return 2 - Else - If strText.Length > 1 Then - If Char.IsNumber(strText(1)) Then - Return 3 - End If - Else - Return 3 - End If - End If - End If - - For Each chrCurr In strText - bAcceptableString = Char.IsLetterOrDigit(chrCurr) Or chrCurr = "." Or chrCurr = "_" - If Not bAcceptableString Then - If chrCurr = " " Then - Return 4 - Else - Return 5 - End If - End If - Next - Return 0 - End Function - - 'Returns integer as code for validation - ' 0 : string is valid - ' 1 : an item is empty - ' 2 : an item is not numeric - ' 3 : an item is between max and min values - Public Function ValidateList(strText As String, Optional bIsNumericInput As Boolean = False, Optional bAllowInf As Boolean = False) As Integer - Dim strItems As String() - Dim strTemp As String - Dim i As Integer = 0 - If strText = "" Then Return 0 - clsRList.ClearParameters() - clsRList.SetRCommand("c") - 'TODO deal with spaces differently e.g. "8 8" should give error/warning instead of "88" - strTemp = strText.Replace(" ", "") - If strTemp <> "" Then - strItems = strTemp.Split(",") - For Each strVal In strItems - If strVal = "" Then Return 1 - Dim clsTempParam As New RParameter - If bIsNumericInput Then - If Not IsNumeric(strVal) AndAlso (Not (bAllowInf AndAlso ({"Inf", "-Inf"}.Contains(strVal)))) Then - Return 2 - ElseIf IsNumeric(strVal) AndAlso (strVal > dcmMaximum OrElse strVal < dcmMinimum) Then - Return 3 - End If - clsTempParam.SetArgumentValue(strVal) - Else - clsTempParam.SetArgumentValue(Chr(34) & strVal & Chr(34)) - End If - clsTempParam.Position = i - clsRList.AddParameter(clsTempParam) - i = i + 1 - Next - End If - Return 0 - End Function - - Private Sub ucrDataFrameSelector_ControlValueChanged(sender As Object) Handles ucrDataFrameSelector.ControlValueChanged - If Not bUserTyped Then - SetDefaultName() - End If - End Sub - - Public Overridable Function IsEmpty() As Boolean - Return True - End Function - - Private Sub ucrInput_Load(sender As Object, e As EventArgs) Handles Me.Load - If Not bUserTyped Then - SetDefaultName() - End If - End Sub - - Private Sub ucrInput_TextChanged(sender As Object, e As EventArgs) Handles Me.TextChanged - SetName(Me.Text, bLastSilent) - End Sub - - Public Overridable Property IsReadOnly() As Boolean - Get - Return bIsReadOnly - End Get - Set(bReadOnly As Boolean) - bIsReadOnly = bReadOnly - End Set - End Property - - Public Overrides Sub SetToValue(objTemp As Object) - If objTemp IsNot Nothing Then - SetName(objTemp.ToString()) - Else - 'If no value reset to a default value - SetName("") - End If - End Sub - - Public Overrides Function GetValueToSet() As Object - Dim clsMainParameter As RParameter - - clsMainParameter = GetParameter() - If clsMainParameter IsNot Nothing Then - If clsMainParameter.bIsString Then - If dctDisplayParameterValues.ContainsKey(clsMainParameter.strArgumentValue) Then - Return clsMainParameter.strArgumentValue - Else - If AddQuotesIfUnrecognised Then - Return clsMainParameter.strArgumentValue.Trim(Chr(34)) - Else - Return clsMainParameter.strArgumentValue - End If - End If - ElseIf clsMainParameter.bIsFunction OrElse clsMainParameter.bIsOperator Then - Return clsMainParameter.clsArgumentCodeStructure - Else - Return "" - End If - Else - Return "" - End If - End Function - - ' key = parameter value - ' value = item text - Public Sub SetParameterValueItemsPairs(dctNewDisplayParameterValues As Dictionary(Of String, String)) - dctDisplayParameterValues = dctNewDisplayParameterValues - End Sub - - Public Sub AddToParameterValueItemsPairs(kvpNewPair As KeyValuePair(Of String, String)) - AddToParameterValueItemsPairs(kvpNewPair.Key, kvpNewPair.Value) - End Sub - - Public Sub AddToParameterValueItemsPairs(strDisplayValue As String, strParameterValue As String) - dctDisplayParameterValues.Add(strDisplayValue, strParameterValue) - End Sub - - Public Property AddQuotesIfUnrecognised As Boolean - Get - Return bPrivateAddQuotesIfUnrecognised - End Get - Set(bValue As Boolean) - bPrivateAddQuotesIfUnrecognised = bValue - If GetText() IsNot Nothing Then - SetName(GetText().Trim(Chr(34))) - End If - End Set - End Property - - Public Overrides Function ControlValueContainedIn(lstTemp() As Object) As Boolean - For Each objTemp As Object In lstTemp - If objTemp.ToString() = GetText() Then - Return True - End If - Next - Return False - End Function - - Protected Overrides Sub ResetControlValue() - SetName("") - End Sub +Imports instat +Imports RDotNet + +Public Class ucrInput + Public bUserTyped As Boolean = False + Public Event NameChanged() + Protected strValidationType As String = "None" + Protected ReadOnly strReservedWords() As String = ({"if", "else", "repeat", "while", "function", "for", "in", "next", "break", "TRUE", "FALSE", "NULL", "Inf", "NaN", "NA", "NA_integer_", "NA_real_", "NA_complex_", "NA_character_"}) + Public clsRList As New RFunction + Protected dcmMinimum As Decimal = Decimal.MinValue + Protected dcmMaximum As Decimal = Decimal.MaxValue + Protected bMinimumIncluded, bMaximumIncluded As Boolean + Protected _strDefaultRObjectTypeLabel As String = "" + Protected strDefaultPrefix As String = "" + Protected WithEvents ucrDataFrameSelector As ucrDataFrame + Protected bIsReadOnly As Boolean = False + Public bAutoChangeOnLeave As Boolean = False + Protected bAllowInf As Boolean = False + Private bLastSilent As Boolean = False + Private bPrivateAddQuotesIfUnrecognised As Boolean = True + Protected dctDisplayParameterValues As New Dictionary(Of String, String) + Protected bFirstLoad As Boolean = True + + 'used to determine if valid expressions are allowed for numeric validations e.g 20/2, 30-1 + Protected bNumericExpressionAllowed As Boolean = True + + Public Sub New() + + ' This call is required by the designer. + InitializeComponent() + + ' Add any initialization after the InitializeComponent() call. + bUpdateRCodeFromControl = False + End Sub + + Public Overridable Sub SetName(strName As String, Optional bSilent As Boolean = False) + bLastSilent = bSilent + End Sub + + Public Overridable Function GetText() As String + Return "" + End Function + + Public Overridable Function GetValue() As Object + Return Nothing + End Function + + Public Overridable Sub Reset() + bUserTyped = False + End Sub + + Public Sub OnNameChanged() + Me.Text = Me.GetText() + RaiseEvent NameChanged() + OnControlValueChanged() + End Sub + + Public Overrides Sub UpdateParameter(clsTempParam As RParameter) + If bChangeParameterValue AndAlso clsTempParam IsNot Nothing Then + If dctDisplayParameterValues.ContainsKey(GetText()) Then + clsTempParam.SetArgumentValue(dctDisplayParameterValues(GetText())) + Else + If AddQuotesIfUnrecognised Then + clsTempParam.SetArgumentValue(Chr(34) & GetText() & Chr(34)) + Else + clsTempParam.SetArgumentValue(GetText()) + End If + End If + End If + End Sub + + Public Function UserTyped() As Boolean + Return bUserTyped + End Function + + Public Sub SetDefaultRObjectTypeLabel(strRObjectTypeLabel As String) + Me._strDefaultRObjectTypeLabel = strRObjectTypeLabel + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsColumn() + _strDefaultRObjectTypeLabel = "Column" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsDataFrame() + _strDefaultRObjectTypeLabel = "Data Frame" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsKey() + _strDefaultRObjectTypeLabel = "Key" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsLink() + _strDefaultRObjectTypeLabel = "Link" + SetDefaultName() + End Sub + + Public Sub SetValidationTypeAsRVariable() + strValidationType = "RVariable" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsFilter() + _strDefaultRObjectTypeLabel = "Filter" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsColumnSelection() + _strDefaultRObjectTypeLabel = "Column Selection" + + SetDefaultName() + End Sub + + Public Overridable Sub SetDataFrameSelector(ucrNewSelector As ucrDataFrame) + ucrDataFrameSelector = ucrNewSelector + If Not bUserTyped Then + SetDefaultName() + End If + End Sub + + Public Sub SetPrefix(strNewPrefix As String) + strDefaultPrefix = strNewPrefix + SetDefaultName() + End Sub + + Public Sub SetDefaultName() + If strDefaultPrefix <> "" Then + Select Case _strDefaultRObjectTypeLabel + Case "Column" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" AndAlso frmMain.clsRLink.DataFrameExists(ucrDataFrameSelector.cboAvailableDataFrames.Text) Then + SetName(frmMain.clsRLink.GetDefaultColumnNames(strDefaultPrefix, ucrDataFrameSelector.cboAvailableDataFrames.Text)) + Else + SetName("") + End If + Case "Data Frame" + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetDataFrameNames())) + Case RObjectTypeLabel.Graph, + RObjectTypeLabel.Table, + RObjectTypeLabel.Model, + RObjectTypeLabel.Structure_label, + RObjectTypeLabel.Summary + 'for objects that are shown in the output viewer. do the following + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.strCurrDataFrame <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, + frmMain.clsRLink.GetObjectNames( + strDataFrameName:=ucrDataFrameSelector.strCurrDataFrame, + strRObjectTypeLabel:=_strDefaultRObjectTypeLabel))) + End If + Case "Filter" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) + Else + SetName("") + End If + + Case "Column Selection" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetColumnSelectionNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) + Else + SetName("") + End If + Case "Key" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetKeyNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) + Else + SetName("") + End If + Case "Link" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetLinkNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) + Else + SetName("") + End If + End Select + End If + End Sub + + Public Sub SetValidationTypeAsNumeric(Optional dcmMin As Decimal = Decimal.MinValue, Optional bIncludeMin As Boolean = True, Optional dcmMax As Decimal = Decimal.MaxValue, Optional bIncludeMax As Boolean = True, Optional bNumericExpressionAllowed As Boolean = True) + strValidationType = "Numeric" + Me.bNumericExpressionAllowed = bNumericExpressionAllowed + If dcmMin <> Decimal.MinValue Then + dcmMinimum = dcmMin + bMinimumIncluded = bIncludeMin + End If + If dcmMax <> Decimal.MaxValue Then + dcmMaximum = dcmMax + bMaximumIncluded = bIncludeMax + End If + End Sub + + Public Function GetNumericRange() As String + Dim strRange As String = "" + If strValidationType = "Numeric" Then + If dcmMinimum <> Decimal.MinValue Then + If bMinimumIncluded Then + strRange = ">= " & dcmMinimum.ToString() + Else + strRange = "> " & dcmMinimum.ToString() + End If + If dcmMaximum <> Decimal.MaxValue Then + strRange = strRange & " and " + End If + End If + If dcmMaximum <> Decimal.MaxValue Then + If bMaximumIncluded Then + strRange = strRange & "<= " & dcmMaximum.ToString() + Else + strRange = strRange & "< " & dcmMaximum.ToString() + End If + End If + ElseIf strValidationType = "NumericList" Then + If dcmMinimum <> Double.MinValue Then + If bMinimumIncluded Then + strRange = ">= " & dcmMinimum.ToString() + Else + strRange = "> " & dcmMinimum.ToString() + End If + If dcmMaximum <> Double.MaxValue Then + strRange = strRange & " and " + End If + End If + If dcmMaximum <> Double.MaxValue Then + If bMaximumIncluded Then + strRange = strRange & "<= " & dcmMaximum.ToString() + Else + strRange = strRange & "< " & dcmMaximum.ToString() + End If + End If + End If + Return strRange + End Function + + Public Sub SetValidationTypeAsList() + strValidationType = "List" + End Sub + + Public Sub SetValidationTypeAsNumericList(Optional bNewAllowInf As Boolean = False, Optional bIncludeMin As Boolean = True, Optional dcmMin As Double = Double.MinValue, Optional dcmMax As Double = Double.MaxValue, Optional bIncludeMax As Boolean = True) + ' Dim Dmax As Double = Maximum + ' Dim Dmin As Double = Minimum + strValidationType = "NumericList" + If dcmMin <> Double.MinValue Then + dcmMinimum = dcmMin + End If + If dcmMax <> Double.MaxValue Then + dcmMaximum = dcmMax + End If + bAllowInf = bNewAllowInf + End Sub + + Public Function IsValid(strText As String) As Boolean + Return (GetValidationCode(strText) = 0) + End Function + + Public Function GetValidationCode(strText As String) As Integer + Dim iType As Integer + Select Case strValidationType + Case "None" + iType = 0 + Case "RVariable" + iType = ValidateRVariable(strText) + Case "Numeric" + iType = ValidateNumeric(strText) + Case "List" + iType = ValidateList(strText, False) + Case "NumericList" + iType = ValidateList(strText, True, bAllowInf) + End Select + Return iType + End Function + + Public Function ValidateText(strText As String) As Boolean + Dim iValidationCode As Integer + + iValidationCode = GetValidationCode(strText) + + Select Case iValidationCode + Case 0 + + Case 1 + Select Case strValidationType + Case "RVariable" + MsgBox(Chr(34) & strText & Chr(34) & " is a reserved word in R and cannot be used.", vbOKOnly) + Case "Numeric" + MsgBox("Entry must be numeric.", vbOKOnly) + Case "List" + MsgBox("Textbox requires a list separated by commas.", vbOKOnly, "Validation Error") + Case "NumericList" + MsgBox("Textbox requires a list of numbers separated by commas.", vbOKOnly, "Validation Error") + End Select + Case 2 + Select Case strValidationType + Case "RVariable" + MsgBox("This name cannot start with " & strText(0), vbOKOnly) + Case "Numeric" + MsgBox("This number must be: " & GetNumericRange(), vbOKOnly) + Case "NumericList" + MsgBox("Each item in the list must be numeric.", vbOKOnly, "Validation Error") + End Select + Case 3 + Select Case strValidationType + Case "RVariable" + MsgBox("This name cannot start with a dot followed by a number/nothing", vbOKOnly) + Case "NumericList" + MsgBox("Each item in the list must be " & GetNumericRange(), vbOKOnly, "Validation Error") + End Select + Case 4 + Select Case strValidationType + Case "RVariable" + MsgBox("This name cannot contain a space", vbOKOnly) + End Select + Case 5 + Select Case strValidationType + Case "RVariable" + MsgBox("This name contains an invalid character", vbOKOnly) + + End Select + End Select + Return (iValidationCode = 0) + + End Function + + 'Returns integer as code for validation + ' 0 : string is valid + ' 1 : string is not numeric + ' 2 : string is outside range + Public Function ValidateNumeric(strText As String) As Integer + Dim dcmText As Decimal + Dim iType As Integer = 0 + + If strText <> "" AndAlso (strValuesToIgnore Is Nothing OrElse (strValuesToIgnore IsNot Nothing AndAlso Not strValuesToIgnore.Contains(strText))) Then + If Not IsNumeric(strText) Then + iType = 1 'reset as invalid entry + 'if numeric expressions are allowed check the expression results to a valid numeric + If bNumericExpressionAllowed Then + Dim vecOutput As CharacterVector + 'is.numeric(x) returns true if the x expression is a valid one. + 'So we use it here to check validity of the entry + vecOutput = frmMain.clsRLink.RunInternalScriptGetOutput("is.numeric(" & strText & ")", bSilent:=True) + If vecOutput IsNot Nothing AndAlso vecOutput.Length > 0 AndAlso Mid(vecOutput(0), 5).ToUpper = "TRUE" Then + iType = 0 'set as valid entry + End If + End If + Else + dcmText = Convert.ToDecimal(strText) + If (dcmText < dcmMinimum) OrElse (dcmText > dcmMaximum) OrElse (Not bMinimumIncluded And dcmText <= dcmMinimum) OrElse (Not bMaximumIncluded And dcmText >= dcmMaximum) Then + iType = 2 + End If + End If + End If + Return iType + End Function + + 'Returns integer as code for validation + ' 0 : string is valid + ' 1 : string is a reserved word + ' 2 : string starts with invalid character + ' 3 : string starts with "." followed by a number/nothing + ' 4 : string contains a space + ' 5 : string contains other invalid character + Public Function ValidateRVariable(strText As String) As Integer + Dim chrFirst As Char + Dim chrCurr As Char + Dim bAcceptableString As Boolean + + If strText = "" Then + Return 0 + End If + + If strReservedWords.Contains(strText) Then + Return 1 + End If + chrFirst = strText(0) + If Not Char.IsLetter(chrFirst) Then + If chrFirst <> "." Then + Return 2 + Else + If strText.Length > 1 Then + If Char.IsNumber(strText(1)) Then + Return 3 + End If + Else + Return 3 + End If + End If + End If + + For Each chrCurr In strText + bAcceptableString = Char.IsLetterOrDigit(chrCurr) Or chrCurr = "." Or chrCurr = "_" + If Not bAcceptableString Then + If chrCurr = " " Then + Return 4 + Else + Return 5 + End If + End If + Next + Return 0 + End Function + + 'Returns integer as code for validation + ' 0 : string is valid + ' 1 : an item is empty + ' 2 : an item is not numeric + ' 3 : an item is between max and min values + Public Function ValidateList(strText As String, Optional bIsNumericInput As Boolean = False, Optional bAllowInf As Boolean = False) As Integer + Dim strItems As String() + Dim strTemp As String + Dim i As Integer = 0 + If strText = "" Then Return 0 + clsRList.ClearParameters() + clsRList.SetRCommand("c") + 'TODO deal with spaces differently e.g. "8 8" should give error/warning instead of "88" + strTemp = strText.Replace(" ", "") + If strTemp <> "" Then + strItems = strTemp.Split(",") + For Each strVal In strItems + If strVal = "" Then Return 1 + Dim clsTempParam As New RParameter + If bIsNumericInput Then + If Not IsNumeric(strVal) AndAlso (Not (bAllowInf AndAlso ({"Inf", "-Inf"}.Contains(strVal)))) Then + Return 2 + ElseIf IsNumeric(strVal) AndAlso (strVal > dcmMaximum OrElse strVal < dcmMinimum) Then + Return 3 + End If + clsTempParam.SetArgumentValue(strVal) + Else + clsTempParam.SetArgumentValue(Chr(34) & strVal & Chr(34)) + End If + clsTempParam.Position = i + clsRList.AddParameter(clsTempParam) + i = i + 1 + Next + End If + Return 0 + End Function + + Private Sub ucrDataFrameSelector_ControlValueChanged(sender As Object) Handles ucrDataFrameSelector.ControlValueChanged + If Not bUserTyped Then + SetDefaultName() + End If + End Sub + + Public Overridable Function IsEmpty() As Boolean + Return True + End Function + + Private Sub ucrInput_Load(sender As Object, e As EventArgs) Handles Me.Load + If Not bUserTyped Then + SetDefaultName() + End If + End Sub + + Private Sub ucrInput_TextChanged(sender As Object, e As EventArgs) Handles Me.TextChanged + SetName(Me.Text, bLastSilent) + End Sub + + Public Overridable Property IsReadOnly() As Boolean + Get + Return bIsReadOnly + End Get + Set(bReadOnly As Boolean) + bIsReadOnly = bReadOnly + End Set + End Property + + Public Overrides Sub SetToValue(objTemp As Object) + If objTemp IsNot Nothing Then + SetName(objTemp.ToString()) + Else + 'If no value reset to a default value + SetName("") + End If + End Sub + + Public Overrides Function GetValueToSet() As Object + Dim clsMainParameter As RParameter + + clsMainParameter = GetParameter() + If clsMainParameter IsNot Nothing Then + If clsMainParameter.bIsString Then + If dctDisplayParameterValues.ContainsKey(clsMainParameter.strArgumentValue) Then + Return clsMainParameter.strArgumentValue + Else + If AddQuotesIfUnrecognised Then + Return clsMainParameter.strArgumentValue.Trim(Chr(34)) + Else + Return clsMainParameter.strArgumentValue + End If + End If + ElseIf clsMainParameter.bIsFunction OrElse clsMainParameter.bIsOperator Then + Return clsMainParameter.clsArgumentCodeStructure + Else + Return "" + End If + Else + Return "" + End If + End Function + + ' key = parameter value + ' value = item text + Public Sub SetParameterValueItemsPairs(dctNewDisplayParameterValues As Dictionary(Of String, String)) + dctDisplayParameterValues = dctNewDisplayParameterValues + End Sub + + Public Sub AddToParameterValueItemsPairs(kvpNewPair As KeyValuePair(Of String, String)) + AddToParameterValueItemsPairs(kvpNewPair.Key, kvpNewPair.Value) + End Sub + + Public Sub AddToParameterValueItemsPairs(strDisplayValue As String, strParameterValue As String) + dctDisplayParameterValues.Add(strDisplayValue, strParameterValue) + End Sub + + Public Property AddQuotesIfUnrecognised As Boolean + Get + Return bPrivateAddQuotesIfUnrecognised + End Get + Set(bValue As Boolean) + bPrivateAddQuotesIfUnrecognised = bValue + If GetText() IsNot Nothing Then + SetName(GetText().Trim(Chr(34))) + End If + End Set + End Property + + Public Overrides Function ControlValueContainedIn(lstTemp() As Object) As Boolean + For Each objTemp As Object In lstTemp + If objTemp.ToString() = GetText() Then + Return True + End If + Next + Return False + End Function + + Protected Overrides Sub ResetControlValue() + SetName("") + End Sub End Class \ No newline at end of file diff --git a/instat/ucrInputComboBox.vb b/instat/ucrInputComboBox.vb index e565d0c2e50..1ce1d001ceb 100644 --- a/instat/ucrInputComboBox.vb +++ b/instat/ucrInputComboBox.vb @@ -11,359 +11,337 @@ ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' -' You should have received a copy of the GNU General Public License +' You should have received a copy of the GNU General Public License ' along with this program. If not, see . -Imports System.ComponentModel - -Public Class ucrInputComboBox - Dim strItemsType As String = "" - - Public Sub New() - - ' This call is required by the designer. - InitializeComponent() - - ' Add any initialization after the InitializeComponent() call. - bAllowNonConditionValues = False - End Sub - - 'temporary event which is only raised when index is changed - 'NameChanged raised any time value is set (even if it's the same) - Public Event SelectionIndexChanged() - - Private Sub cboInput_Validating(sender As Object, e As CancelEventArgs) Handles cboInput.Validating - Dim strCurrent As String - - strCurrent = cboInput.Text - If bAutoChangeOnLeave Then - If Not IsValid(strCurrent) Then - 'TODO This message should contain the same message from ValidateText() - 'Select Case MsgBox(Chr(34) & strCurrent & Chr(34) & " is an invalid name." & Environment.NewLine & "Would you like it to be automatically corrected?", vbYesNo, "Invalid Name") - ' Case MsgBoxResult.Yes - ' SetName(frmMain.clsRLink.MakeValidText(strCurrent)) - ' Case Else - ' e.Cancel = True - 'End Select - SetName(frmMain.clsRLink.MakeValidText(strCurrent)) - End If - Else - e.Cancel = Not ValidateText(strCurrent) - End If - If Not e.Cancel Then OnNameChanged() - End Sub - - Public Sub SetItemsTypeAsColumns() - strItemsType = "Columns" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsDataFrames() - strItemsType = "Data Frames" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsModels() - strItemsType = "Models" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsSurv() - strItemsType = "Surv" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsTables() - strItemsType = "Tables" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsGraphs() - strItemsType = "Graphs" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsFilters() - strItemsType = "Filters" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsColumnSelection() - strItemsType = "Column Selection" - - FillItemTypes() - End Sub - - - Public Sub SetItemsTypeAsKeys() - strItemsType = "Keys" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsLinks() - strItemsType = "Links" - FillItemTypes() - End Sub - - Private Sub FillItemTypes() - Select Case strItemsType - Case "Columns" - If ucrDataFrameSelector IsNot Nothing Then - frmMain.clsRLink.FillColumnNames(ucrDataFrameSelector.cboAvailableDataFrames.Text, cboColumns:=cboInput) - End If - Case "Keys" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetKeyNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray) - End If - Case "Data Frames" - 'TODO not yet implemented - Case "Models" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetModelNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray) - End If - Case "Tables" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetTableNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray) - End If - Case "Graphs" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetGraphNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) - End If - Case "Surv" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetSurvNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) - End If - Case "Filters" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) - End If - Case "Column Selection" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetColumnSelectionNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) - End If - End Select - End Sub - - Public Sub ucrDataFrameSelector_ControlValueChanged() Handles ucrDataFrameSelector.ControlValueChanged - FillItemTypes() - End Sub - - Public Overrides Sub SetDataFrameSelector(ucrNewSelector As ucrDataFrame) - MyBase.SetDataFrameSelector(ucrNewSelector) - FillItemTypes() - End Sub - - Public Overrides Sub SetName(strName As String, Optional bSilent As Boolean = False) - MyBase.SetName(strName, bSilent) - If bSilent Then - cboInput.Text = strName - If cboInput.FindStringExact(strName) <> -1 Then - cboInput.SelectedIndex = cboInput.FindStringExact(strName) - End If - OnNameChanged() - Else - If ValidateText(strName) Then - cboInput.Text = strName - OnNameChanged() - End If - End If - End Sub - - Public Overrides Function GetText() As String - Return cboInput.Text - End Function - - Public Overrides Function GetValue() As Object - If cboInput.SelectedValue IsNot Nothing Then - Return cboInput.SelectedValue - Else - Return GetText() - End If - End Function - - Public Property GetSetSelectedIndex As Integer - Get - Return cboInput.SelectedIndex - End Get - Set(value As Integer) - cboInput.SelectedIndex = value - End Set - End Property - - Public ReadOnly Property GetItemsCount As Integer - Get - Return cboInput.Items.Count - End Get - End Property - - Public Sub SetItems(Optional strItems As String() = Nothing, Optional bClearExisting As Boolean = True, Optional bAddConditions As Boolean = False, Optional bAddQuotes As Boolean = True) - Dim dctValues As New Dictionary(Of String, String) - If bAddConditions Then - For Each strTemp As String In strItems - If bAddQuotes Then - dctValues.Add(strTemp, Chr(34) & strTemp & Chr(34)) - Else - dctValues.Add(strTemp, strTemp) - End If - Next - SetItems(dctValues, bClearExisting) - Else - If bClearExisting Then - cboInput.Items.Clear() - End If - If strItems IsNot Nothing Then - cboInput.Items.AddRange(strItems) - End If - AdjustComboBoxWidth(cboInput) - End If - End Sub - - Public Sub SetItems(dctItemParameterValuePairs As Dictionary(Of String, String), Optional bClearExisting As Boolean = True, Optional bSetConditions As Boolean = True) - Dim kvpTemp As KeyValuePair(Of String, String) - - If bClearExisting Then - cboInput.Items.Clear() - dctDisplayParameterValues.Clear() - End If - If bSetConditions Then - If GetParameter() Is Nothing Then - MsgBox("Developer error: Parameter must be set before items can be set. Modify setup for " & Name & " so that the parameter is set first.") - End If - End If - For Each kvpTemp In dctItemParameterValuePairs - cboInput.Items.Add(kvpTemp.Key) - dctDisplayParameterValues.Add(kvpTemp.Key, kvpTemp.Value) - If bSetConditions AndAlso GetParameter() IsNot Nothing Then - AddParameterValuesCondition(kvpTemp.Key, GetParameter().strArgumentName, kvpTemp.Value) - End If - Next - AdjustComboBoxWidth(cboInput) - End Sub - - Public Sub AddItems(strItems As String()) - SetItems(strItems, bClearExisting:=False) - End Sub - - Private Sub cboInput_KeyPress(sender As Object, e As KeyPressEventArgs) Handles cboInput.KeyPress - bUserTyped = True - End Sub - - 'Public Sub SetEditable(bEditable As Boolean) - - ' If bEditable Then - ' cboInput.DropDownStyle = ComboBoxStyle.DropDownList - ' Else - ' cboInput.DropDownStyle = ComboBoxStyle.DropDown - ' End If - 'End Sub - Public Overrides Function IsEmpty() As Boolean - If cboInput.Text = "" Then - Return True - Else - Return False - End If - End Function - - Private Sub ucrInputComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load - FillItemTypes() - If bFirstLoad Then - bFirstLoad = False - End If - End Sub - - Private Sub cboInput_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboInput.SelectedIndexChanged - OnNameChanged() - RaiseEvent SelectionIndexChanged() - End Sub - - Private Sub ucrInputComboBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress - 'If bIsReadOnly Then - ' e.Handled = True - 'End If - End Sub - - Private Sub cboInput_TextChanged(sender As Object, e As EventArgs) Handles cboInput.TextChanged - 'shouldn't we be raising OnControlValueChanged instead? see issue #7367 - OnControlContentsChanged() - End Sub - Private Sub cboInput_Click(sender As Object, e As EventArgs) Handles cboInput.Click - OnControlClicked() - End Sub - - Private Sub mnuRightClickCopy_Click(sender As Object, e As EventArgs) Handles mnuRightClickCopy.Click - If cboInput.SelectedText <> "" Then - Clipboard.SetText(cboInput.SelectedText) - ElseIf cboInput.DropDownStyle = ComboBoxStyle.DropDownList AndAlso cboInput.Text <> "" Then - Clipboard.SetText(cboInput.Text) - End If - End Sub - - 'This seems overly complicated, but appears only way to auto size - 'Adapted from: http://dotnetanaya.blogspot.co.uk/2012/12/vbnet-adjusting-combobox-dropdownlist.html - 'Need to make sure this is called from all places needed - 'There is no build in event to check items added - 'TODO this is repeat in clsRLink for ucrDataFrame, will not be needed once controls changed - 'Should have a place for shared methods - Public Sub AdjustComboBoxWidth(cboCurrent As ComboBox) - Dim iWidth As Integer = cboCurrent.DropDownWidth - Dim graTemp As Graphics = cboCurrent.CreateGraphics() - Dim font As Font = cboCurrent.Font - Dim iScrollBarWidth As Integer - Dim iNewWidth As Integer - - If cboCurrent.Items.Count > cboCurrent.MaxDropDownItems Then - iScrollBarWidth = SystemInformation.VerticalScrollBarWidth - Else - iScrollBarWidth = 0 - End If - - For Each strItem As String In cboCurrent.Items - iNewWidth = CInt(graTemp.MeasureString(strItem, font).Width) + iScrollBarWidth - iWidth = Math.Max(iWidth, iNewWidth) - Next - cboCurrent.DropDownWidth = iWidth - End Sub - - Public Overrides Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) - MyBase.UpdateControl(bReset:=bReset, bCloneIfNeeded:=bCloneIfNeeded) - End Sub - - Public Sub SetDropDownStyleAsNonEditable() - cboInput.DropDownStyle = ComboBoxStyle.DropDownList - cboInput.AutoCompleteMode = AutoCompleteMode.None - cboInput.AutoCompleteSource = AutoCompleteSource.None - End Sub - - Public Sub SetDropDownStyleAsEditable(bAdditionsAllowed As Boolean) - cboInput.DropDownStyle = ComboBoxStyle.DropDown - cboInput.AutoCompleteMode = AutoCompleteMode.Append - cboInput.AutoCompleteSource = AutoCompleteSource.ListItems - 'TODO implement validation settings for this - If bAdditionsAllowed Then - - Else - - End If - End Sub - - Public Sub SetDataSource(objDataSource As Object, Optional strDisplayMember As String = "", Optional strValueMember As String = "") - cboInput.DataSource = objDataSource - If strDisplayMember <> "" Then - cboInput.DisplayMember = strDisplayMember - End If - If strValueMember <> "" Then - cboInput.ValueMember = strValueMember - End If - End Sub - - Friend Sub AddToReceiverAtCursorPosition(v As String) - Throw New NotImplementedException() - End Sub -End Class +Imports System.ComponentModel + +Public Class ucrInputComboBox + Dim _strRObjectItemsTypeLabel As String = "" + + Public Sub New() + + ' This call is required by the designer. + InitializeComponent() + + ' Add any initialization after the InitializeComponent() call. + bAllowNonConditionValues = False + End Sub + + 'temporary event which is only raised when index is changed + 'NameChanged raised any time value is set (even if it's the same) + Public Event SelectionIndexChanged() + + Private Sub cboInput_Validating(sender As Object, e As CancelEventArgs) Handles cboInput.Validating + Dim strCurrent As String + + strCurrent = cboInput.Text + If bAutoChangeOnLeave Then + If Not IsValid(strCurrent) Then + 'TODO This message should contain the same message from ValidateText() + 'Select Case MsgBox(Chr(34) & strCurrent & Chr(34) & " is an invalid name." & Environment.NewLine & "Would you like it to be automatically corrected?", vbYesNo, "Invalid Name") + ' Case MsgBoxResult.Yes + ' SetName(frmMain.clsRLink.MakeValidText(strCurrent)) + ' Case Else + ' e.Cancel = True + 'End Select + SetName(frmMain.clsRLink.MakeValidText(strCurrent)) + End If + Else + e.Cancel = Not ValidateText(strCurrent) + End If + If Not e.Cancel Then OnNameChanged() + End Sub + + Public Sub SetRObjectItemsTypeLabel(strRObjectLabel As String) + Me._strRObjectItemsTypeLabel = strRObjectLabel + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsColumns() + _strRObjectItemsTypeLabel = "Columns" + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsDataFrames() + _strRObjectItemsTypeLabel = "Data Frames" + FillItemTypes() + End Sub + + + Public Sub SetItemsTypeAsFilters() + _strRObjectItemsTypeLabel = "Filters" + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsColumnSelection() + _strRObjectItemsTypeLabel = "Column Selection" + + FillItemTypes() + End Sub + + + Public Sub SetItemsTypeAsKeys() + _strRObjectItemsTypeLabel = "Keys" + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsLinks() + _strRObjectItemsTypeLabel = "Links" + FillItemTypes() + End Sub + + Private Sub FillItemTypes() + Select Case _strRObjectItemsTypeLabel + Case "Columns" + If ucrDataFrameSelector IsNot Nothing Then + frmMain.clsRLink.FillColumnNames(ucrDataFrameSelector.cboAvailableDataFrames.Text, cboColumns:=cboInput) + End If + Case "Keys" + If ucrDataFrameSelector IsNot Nothing Then + cboInput.Items.Clear() + cboInput.Items.AddRange(frmMain.clsRLink.GetKeyNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray) + End If + Case "Data Frames" + 'TODO not yet implemented + Case RObjectTypeLabel.Graph, + RObjectTypeLabel.Table, + RObjectTypeLabel.Model, + RObjectTypeLabel.Structure_label, + RObjectTypeLabel.Summary + 'for objects that are shown in the output viewer. do the following + If Me.ucrDataFrameSelector IsNot Nothing Then + cboInput.Items.Clear() + cboInput.Items.AddRange(frmMain.clsRLink.GetObjectNames( + strDataFrameName:=Me.ucrDataFrameSelector.strCurrDataFrame, + strRObjectTypeLabel:=Me._strRObjectItemsTypeLabel).ToArray) + End If + Case "Filters" + If ucrDataFrameSelector IsNot Nothing Then + cboInput.Items.Clear() + cboInput.Items.AddRange(frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) + End If + Case "Column Selection" + If ucrDataFrameSelector IsNot Nothing Then + cboInput.Items.Clear() + cboInput.Items.AddRange(frmMain.clsRLink.GetColumnSelectionNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) + End If + End Select + End Sub + + Public Sub ucrDataFrameSelector_ControlValueChanged() Handles ucrDataFrameSelector.ControlValueChanged + FillItemTypes() + End Sub + + Public Overrides Sub SetDataFrameSelector(ucrNewSelector As ucrDataFrame) + MyBase.SetDataFrameSelector(ucrNewSelector) + FillItemTypes() + End Sub + + Public Overrides Sub SetName(strName As String, Optional bSilent As Boolean = False) + MyBase.SetName(strName, bSilent) + If bSilent Then + cboInput.Text = strName + If cboInput.FindStringExact(strName) <> -1 Then + cboInput.SelectedIndex = cboInput.FindStringExact(strName) + End If + OnNameChanged() + Else + If ValidateText(strName) Then + cboInput.Text = strName + OnNameChanged() + End If + End If + End Sub + + Public Overrides Function GetText() As String + Return cboInput.Text + End Function + + Public Overrides Function GetValue() As Object + If cboInput.SelectedValue IsNot Nothing Then + Return cboInput.SelectedValue + Else + Return GetText() + End If + End Function + + Public Property GetSetSelectedIndex As Integer + Get + Return cboInput.SelectedIndex + End Get + Set(value As Integer) + cboInput.SelectedIndex = value + End Set + End Property + + Public ReadOnly Property GetItemsCount As Integer + Get + Return cboInput.Items.Count + End Get + End Property + + Public Sub SetItems(Optional strItems As String() = Nothing, Optional bClearExisting As Boolean = True, Optional bAddConditions As Boolean = False, Optional bAddQuotes As Boolean = True) + Dim dctValues As New Dictionary(Of String, String) + If bAddConditions Then + For Each strTemp As String In strItems + If bAddQuotes Then + dctValues.Add(strTemp, Chr(34) & strTemp & Chr(34)) + Else + dctValues.Add(strTemp, strTemp) + End If + Next + SetItems(dctValues, bClearExisting) + Else + If bClearExisting Then + cboInput.Items.Clear() + End If + If strItems IsNot Nothing Then + cboInput.Items.AddRange(strItems) + End If + AdjustComboBoxWidth(cboInput) + End If + End Sub + + Public Sub SetItems(dctItemParameterValuePairs As Dictionary(Of String, String), Optional bClearExisting As Boolean = True, Optional bSetConditions As Boolean = True) + Dim kvpTemp As KeyValuePair(Of String, String) + + If bClearExisting Then + cboInput.Items.Clear() + dctDisplayParameterValues.Clear() + End If + If bSetConditions Then + If GetParameter() Is Nothing Then + MsgBox("Developer error: Parameter must be set before items can be set. Modify setup for " & Name & " so that the parameter is set first.") + End If + End If + For Each kvpTemp In dctItemParameterValuePairs + cboInput.Items.Add(kvpTemp.Key) + dctDisplayParameterValues.Add(kvpTemp.Key, kvpTemp.Value) + If bSetConditions AndAlso GetParameter() IsNot Nothing Then + AddParameterValuesCondition(kvpTemp.Key, GetParameter().strArgumentName, kvpTemp.Value) + End If + Next + AdjustComboBoxWidth(cboInput) + End Sub + + Public Sub AddItems(strItems As String()) + SetItems(strItems, bClearExisting:=False) + End Sub + + Private Sub cboInput_KeyPress(sender As Object, e As KeyPressEventArgs) Handles cboInput.KeyPress + bUserTyped = True + End Sub + + 'Public Sub SetEditable(bEditable As Boolean) + + ' If bEditable Then + ' cboInput.DropDownStyle = ComboBoxStyle.DropDownList + ' Else + ' cboInput.DropDownStyle = ComboBoxStyle.DropDown + ' End If + 'End Sub + Public Overrides Function IsEmpty() As Boolean + If cboInput.Text = "" Then + Return True + Else + Return False + End If + End Function + + Private Sub ucrInputComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load + FillItemTypes() + If bFirstLoad Then + bFirstLoad = False + End If + End Sub + + Private Sub cboInput_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboInput.SelectedIndexChanged + OnNameChanged() + RaiseEvent SelectionIndexChanged() + End Sub + + Private Sub ucrInputComboBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress + 'If bIsReadOnly Then + ' e.Handled = True + 'End If + End Sub + + Private Sub cboInput_TextChanged(sender As Object, e As EventArgs) Handles cboInput.TextChanged + 'shouldn't we be raising OnControlValueChanged instead? see issue #7367 + OnControlContentsChanged() + End Sub + Private Sub cboInput_Click(sender As Object, e As EventArgs) Handles cboInput.Click + OnControlClicked() + End Sub + + Private Sub mnuRightClickCopy_Click(sender As Object, e As EventArgs) Handles mnuRightClickCopy.Click + If cboInput.SelectedText <> "" Then + Clipboard.SetText(cboInput.SelectedText) + ElseIf cboInput.DropDownStyle = ComboBoxStyle.DropDownList AndAlso cboInput.Text <> "" Then + Clipboard.SetText(cboInput.Text) + End If + End Sub + + 'This seems overly complicated, but appears only way to auto size + 'Adapted from: http://dotnetanaya.blogspot.co.uk/2012/12/vbnet-adjusting-combobox-dropdownlist.html + 'Need to make sure this is called from all places needed + 'There is no build in event to check items added + 'TODO this is repeat in clsRLink for ucrDataFrame, will not be needed once controls changed + 'Should have a place for shared methods + Public Sub AdjustComboBoxWidth(cboCurrent As ComboBox) + Dim iWidth As Integer = cboCurrent.DropDownWidth + Dim graTemp As Graphics = cboCurrent.CreateGraphics() + Dim font As Font = cboCurrent.Font + Dim iScrollBarWidth As Integer + Dim iNewWidth As Integer + + If cboCurrent.Items.Count > cboCurrent.MaxDropDownItems Then + iScrollBarWidth = SystemInformation.VerticalScrollBarWidth + Else + iScrollBarWidth = 0 + End If + + For Each strItem As String In cboCurrent.Items + iNewWidth = CInt(graTemp.MeasureString(strItem, font).Width) + iScrollBarWidth + iWidth = Math.Max(iWidth, iNewWidth) + Next + cboCurrent.DropDownWidth = iWidth + End Sub + + Public Overrides Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) + MyBase.UpdateControl(bReset:=bReset, bCloneIfNeeded:=bCloneIfNeeded) + End Sub + + Public Sub SetDropDownStyleAsNonEditable() + cboInput.DropDownStyle = ComboBoxStyle.DropDownList + cboInput.AutoCompleteMode = AutoCompleteMode.None + cboInput.AutoCompleteSource = AutoCompleteSource.None + End Sub + + Public Sub SetDropDownStyleAsEditable(bAdditionsAllowed As Boolean) + cboInput.DropDownStyle = ComboBoxStyle.DropDown + cboInput.AutoCompleteMode = AutoCompleteMode.Append + cboInput.AutoCompleteSource = AutoCompleteSource.ListItems + 'TODO implement validation settings for this + If bAdditionsAllowed Then + + Else + + End If + End Sub + + Public Sub SetDataSource(objDataSource As Object, Optional strDisplayMember As String = "", Optional strValueMember As String = "") + cboInput.DataSource = objDataSource + If strDisplayMember <> "" Then + cboInput.DisplayMember = strDisplayMember + End If + If strValueMember <> "" Then + cboInput.ValueMember = strValueMember + End If + End Sub + + Friend Sub AddToReceiverAtCursorPosition(v As String) + Throw New NotImplementedException() + End Sub +End Class \ No newline at end of file diff --git a/instat/ucrSave.vb b/instat/ucrSave.vb index 2e584e1d0ab..bf87ec939fb 100644 --- a/instat/ucrSave.vb +++ b/instat/ucrSave.vb @@ -57,13 +57,15 @@ Public Class ucrSave ''' Type of object saved by this control ''' (valid values are: 'column', 'dataframe', 'graph', model', 'surv', 'table') ''' - Private strSaveType As String = "column" + Private _strRObjectLabel As String = "column" + Private _strRObjectFormat As String + ''' Prefix used for the default name displayed in the text/combo box Private strPrefix As String ''' True if this control has a combo box rather than a text box. ''' Note: This control can have either a combo box or a text box but cannot have ''' both. - ''' A text box is normally used when pre-defined names aren’t of any interest to + ''' A text box is normally used when pre-defined names aren't of any interest to ''' the user. ''' A combo box is normally used when the user needs to see previously defined ''' names (e.g. existing column names). The user may then deliberately save to an @@ -146,9 +148,9 @@ Public Class ucrSave ''' Initialises the control. ''' ''' Sets flags to show that check box and the text/combo box can be set from the - ''' control’s R code. - ''' Also sets flags to show that the control’s R code should be updated whenever the - ''' control’s value changes. + ''' control's R code. + ''' Also sets flags to show that the control's R code should be updated whenever the + ''' control's value changes. ''' '''-------------------------------------------------------------------------------------------- Private Sub InitialiseControl() @@ -168,7 +170,7 @@ Public Class ucrSave Private Sub SetDefaults() ucrInputTextSave.Reset() ucrInputComboSave.Reset() - SetSaveType(strSaveType) + SetSaveType(Me._strRObjectLabel, Me._strRObjectFormat) LabelOrCheckboxSettings() UpdateRCode() End Sub @@ -369,7 +371,7 @@ Public Class ucrSave End If End Sub '''-------------------------------------------------------------------------------------------- - ''' Sets save type to . Valid values are: + ''' Sets save type to . Valid values are: ''' "column", "dataframe", "graph", "model", "surv" or "table". ''' Sets the combobox and textbox to be the same type. ''' If type is "column" then makes the 'position' button visible, else makes it not @@ -379,42 +381,33 @@ Public Class ucrSave ''' be placed at the start end, or before/after an adjacent object.) ''' ''' - ''' The type of object saved by this control. Valid values are: + ''' The type of object saved by this control. Valid values are: ''' "column", "dataframe", "graph", "model", "surv" or "table". ''' An invalid value throws a developer error. '''-------------------------------------------------------------------------------------------- - Private Sub SetSaveType(strType As String) - strSaveType = strType - Select Case strSaveType - Case "column" + Public Sub SetSaveType(strRObjectType As String, Optional strRObjectFormat As String = "") + Me._strRObjectLabel = strRObjectType + Me._strRObjectFormat = strRObjectFormat + Select Case Me._strRObjectLabel + Case RObjectTypeLabel.Column ucrInputComboSave.SetDefaultTypeAsColumn() ucrInputComboSave.SetItemsTypeAsColumns() ucrInputTextSave.SetDefaultTypeAsColumn() btnColumnPosition.Visible = True - Case "dataframe" + Case RObjectTypeLabel.Dataframe ucrInputComboSave.SetDefaultTypeAsDataFrame() ucrInputComboSave.SetItemsTypeAsDataFrames() ucrInputTextSave.SetDefaultTypeAsDataFrame() btnColumnPosition.Visible = False - Case "graph" - ucrInputComboSave.SetDefaultTypeAsGraph() - ucrInputComboSave.SetItemsTypeAsGraphs() - ucrInputTextSave.SetDefaultTypeAsGraph() - btnColumnPosition.Visible = False - Case "model" - ucrInputComboSave.SetDefaultTypeAsModel() - ucrInputComboSave.SetItemsTypeAsModels() - ucrInputTextSave.SetDefaultTypeAsModel() - btnColumnPosition.Visible = False - Case "surv" - ucrInputComboSave.SetDefaultTypeAsSurv() - ucrInputComboSave.SetItemsTypeAsSurv() - ucrInputTextSave.SetDefaultTypeAsSurv() - btnColumnPosition.Visible = False - Case "table" - ucrInputComboSave.SetDefaultTypeAsTable() - ucrInputComboSave.SetItemsTypeAsTables() - ucrInputTextSave.SetDefaultTypeAsTable() + Case RObjectTypeLabel.Graph, + RObjectTypeLabel.Table, + RObjectTypeLabel.Model, + RObjectTypeLabel.Structure_label, + RObjectTypeLabel.Summary + 'for objects that are shown in the output viewer. do the following + ucrInputComboSave.SetDefaultRObjectTypeLabel(_strRObjectLabel) + ucrInputComboSave.SetRObjectItemsTypeLabel(_strRObjectLabel) + ucrInputTextSave.SetDefaultRObjectTypeLabel(_strRObjectLabel) btnColumnPosition.Visible = False Case "key" ucrInputComboSave.SetDefaultTypeAsKey() @@ -427,7 +420,7 @@ Public Class ucrSave ucrInputTextSave.SetDefaultTypeAsLink() btnColumnPosition.Visible = False Case Else - MsgBox("Developer error: unrecognised save type: " & strType) + MsgBox("Developer error: unrecognised save type: " & strRObjectType) End Select End Sub ''' Sets save type as column. @@ -438,21 +431,36 @@ Public Class ucrSave Public Sub SetSaveTypeAsDataFrame() SetSaveType("dataframe") End Sub - ''' Sets save type as graph. + ''' + ''' Sets save type as graph. + ''' todo. deprecate + ''' Public Sub SetSaveTypeAsGraph() - SetSaveType("graph") + 'assumption is by default a model is in image format + SetSaveType(strRObjectType:=RObjectTypeLabel.Graph, strRObjectFormat:=RObjectFormat.Image) End Sub - ''' Sets save type as model. + ''' + ''' Sets save type as model. + ''' todo. deprecate + ''' Public Sub SetSaveTypeAsModel() - SetSaveType("model") + 'assumption is by default a model is in text format + SetSaveType(strRObjectType:=RObjectTypeLabel.Model, strRObjectFormat:=RObjectFormat.Text) End Sub - ''' Sets save type as surv. + ''' + ''' Sets save type as surv. + ''' todo. deprecate + ''' Public Sub SetSaveTypeAsSurv() - SetSaveType("surv") + 'assumption is by default a survival is in text format + SetSaveType(strRObjectType:=RObjectTypeLabel.Structure_label, strRObjectFormat:=RObjectFormat.Text) End Sub - ''' Sets save type as table. + ''' + ''' Sets save type as table. + ''' todo. deprecate Public Sub SetSaveTypeAsTable() - SetSaveType("table") + 'assumption is by default a table is in text format + SetSaveType(strRObjectType:=RObjectTypeLabel.Table, strRObjectFormat:=RObjectFormat.Text) End Sub ''' Sets save type as key. Public Sub SetSaveTypeAsKey() @@ -510,7 +518,7 @@ Public Class ucrSave btnColumnPosition.Visible = False 'always hide position button if save type is not a column - If strSaveType = "column" Then + If _strRObjectLabel = "column" Then btnColumnPosition.Visible = ucrChkSave.Checked End If @@ -563,7 +571,7 @@ Public Class ucrSave ''' position variables. '''-------------------------------------------------------------------------------------------- Public Overrides Sub UpdateRCode(Optional bReset As Boolean = False) - If strSaveType = "key" OrElse strSaveType = "link" Then + If _strRObjectLabel = "key" OrElse _strRObjectLabel = "link" Then MyBase.UpdateRCode(bReset) Else UpdateAssignTo() @@ -576,12 +584,12 @@ Public Class ucrSave ''' '''-------------------------------------------------------------------------------------------- Protected Overrides Sub UpdateAllParameters() - If strSaveType = "key" OrElse strSaveType = "link" Then + If _strRObjectLabel = "key" OrElse _strRObjectLabel = "link" Then MyBase.UpdateAllParameters() Else UpdateAssignTo() End If - ' TODO SJL 16/06/20 Name ‘UpdateAllParameters’ is misleading, parent function does what the name says, this function doesn’t. Ask Danny's advice? + ' TODO SJL 16/06/20 Name 'UpdateAllParameters' is misleading, parent function does what the name says, this function doesn't. Ask Danny's advice? End Sub Public Overrides Sub UpdateParameter(clsTempParam As RParameter) @@ -626,19 +634,11 @@ Public Class ucrSave If bRemove Then clsTempCode.RemoveAssignTo() Else - If ucrDataFrameSelector IsNot Nothing Then - strDataName = ucrDataFrameSelector.cboAvailableDataFrames.Text - Else - strDataName = strGlobalDataName - End If - If bShowCheckBox AndAlso Not ucrChkSave.Checked Then - strSaveName = strAssignToIfUnchecked - Else - strSaveName = GetText() - End If + strDataName = If(ucrDataFrameSelector IsNot Nothing, ucrDataFrameSelector.cboAvailableDataFrames.Text, strGlobalDataName) + strSaveName = If(bShowCheckBox AndAlso Not ucrChkSave.Checked, strAssignToIfUnchecked, GetText()) If strSaveName <> "" Then - Select Case strSaveType - Case "column" + Select Case _strRObjectLabel + Case RObjectTypeLabel.Column 'todo 25/03/2021. because of this new functionailty added. Should we rename this function from UpdateAssignTo() to something else If bSetPositionParamsDirectly Then clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, strTempColumn:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix, bAssignToColumnWithoutNames:=bAssignToColumnWithoutNames, bInsertColumnBefore:=bInsertColumnBefore, strAdjacentColumn:=strAdjacentColumn) @@ -650,14 +650,27 @@ Public Class ucrSave clsTempCode.AddParameter(strParameterName:="adjacent_column", strParameterValue:=strAdjacentColumn) End If End If - Case "dataframe" + Case RObjectTypeLabel.Dataframe clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix, bDataFrameList:=bDataFrameList, strDataFrameNames:=strDataFrameNames) - Case "graph" - clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, strTempGraph:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix) + Case RObjectTypeLabel.Graph, + RObjectTypeLabel.Summary, + RObjectTypeLabel.Table + If Me._strRObjectLabel = RObjectTypeLabel.Table AndAlso String.IsNullOrEmpty(Me._strRObjectFormat) Then + 'todo. temporary check until all table dialogs are modified to set _strRObjectFormat + clsTempCode.SetAssignTo(strTemp:=strSaveName, + strTempDataframe:=strDataName, + strTempTable:=strSaveName, + bAssignToIsPrefix:=bAssignToIsPrefix) + Else + clsTempCode.SetAssignToRObject(strRObjectToAssignTo:=strSaveName, + strRObjectTypeLabelToAssignTo:=Me._strRObjectLabel, + strRObjectFormatToAssignTo:=Me._strRObjectFormat, + strRDataFrameNameToAddObjectTo:=strDataName, + strObjectName:=strSaveName, + bAssignToIsPrefix:=bAssignToIsPrefix) + End If Case "model" clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, strTempModel:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix) - Case "table" - clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, strTempTable:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix) Case "surv" clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, strTempSurv:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix) End Select @@ -696,7 +709,7 @@ Public Class ucrSave ''' overridden function. '''-------------------------------------------------------------------------------------------- Public Overrides Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) - If Not strSaveType = "key" AndAlso Not strSaveType = "link" Then + If Not _strRObjectLabel = "key" AndAlso Not _strRObjectLabel = "link" Then Dim clsMainRCode As RCodeStructure = GetRCode() Dim strControlValue As String = "" @@ -811,10 +824,10 @@ Public Class ucrSave ' - Should this function return boolean? The parent function in ucrCore has no return type! Is this good coding practice? ' - The parent function returns true if the control has a paremter that is not yet included in the R command. Why is this control different? ' - Is the condition for bToBeAssigned correct? - If strSaveType = "key" OrElse strSaveType = "link" Then + If _strRObjectLabel = "key" OrElse _strRObjectLabel = "link" Then Return MyBase.CanUpdate() Else - Return ((Not GetRCode().bIsAssigned AndAlso Not GetRCode().bToBeAssigned) AndAlso strSaveType <> "") + Return ((Not GetRCode().bIsAssigned AndAlso Not GetRCode().bToBeAssigned) AndAlso _strRObjectLabel <> "") End If End Function '''-------------------------------------------------------------------------------------------- @@ -835,7 +848,7 @@ Public Class ucrSave 'TODO SJL 15/05/20 ' - The name is quite confusing. Rename? ' - If we made 'UpdateAssignTo' public then we could remove this function - If strSaveType = "key" OrElse strSaveType = "link" Then + If _strRObjectLabel = "key" OrElse _strRObjectLabel = "link" Then MyBase.AddOrRemoveParameter(True) Else UpdateAssignTo(Not bAdd) @@ -993,4 +1006,4 @@ Public Class ucrSave Me.strReadNameFromParameterName = strReadNameFromParameterName UpdateAssignTo() End Sub -End Class +End Class \ No newline at end of file diff --git a/instat/ucrSaveModel.Designer.vb b/instat/ucrSaveModel.Designer.vb deleted file mode 100644 index 67b44372f31..00000000000 --- a/instat/ucrSaveModel.Designer.vb +++ /dev/null @@ -1,84 +0,0 @@ -' R- Instat -' Copyright (C) 2015-2017 -' -' This program is free software: you can redistribute it and/or modify -' it under the terms of the GNU General Public License as published by -' the Free Software Foundation, either version 3 of the License, or -' (at your option) any later version. -' -' This program is distributed in the hope that it will be useful, -' but WITHOUT ANY WARRANTY; without even the implied warranty of -' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -' GNU General Public License for more details. -' -' You should have received a copy of the GNU General Public License -' along with this program. If not, see . - - -Partial Class ucrSaveModel - Inherits System.Windows.Forms.UserControl - - 'UserControl overrides dispose to clean up the component list. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - _ - Private Sub InitializeComponent() - Me.chkSaveModel = New System.Windows.Forms.CheckBox() - Me.ucrInputModelName = New instat.ucrInputComboBox() - Me.SuspendLayout() - ' - 'chkSaveModel - ' - Me.chkSaveModel.AutoSize = True - Me.chkSaveModel.Location = New System.Drawing.Point(0, 3) - Me.chkSaveModel.Name = "chkSaveModel" - Me.chkSaveModel.Size = New System.Drawing.Size(83, 17) - Me.chkSaveModel.TabIndex = 1 - Me.chkSaveModel.Tag = "Save_Model" - Me.chkSaveModel.Text = "Save Model" - Me.chkSaveModel.UseVisualStyleBackColor = True - ' - 'ucrInputModelName - ' - Me.ucrInputModelName.AddQuotesIfUnrecognised = True - Me.ucrInputModelName.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputModelName.GetSetSelectedIndex = -1 - Me.ucrInputModelName.IsReadOnly = False - Me.ucrInputModelName.Location = New System.Drawing.Point(86, 0) - Me.ucrInputModelName.Margin = New System.Windows.Forms.Padding(0) - Me.ucrInputModelName.Name = "ucrInputModelName" - Me.ucrInputModelName.Size = New System.Drawing.Size(180, 20) - Me.ucrInputModelName.TabIndex = 0 - ' - 'ucrSaveModel - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi - Me.AutoSize = True - Me.Controls.Add(Me.chkSaveModel) - Me.Controls.Add(Me.ucrInputModelName) - Me.Name = "ucrSaveModel" - Me.Size = New System.Drawing.Size(266, 23) - Me.ResumeLayout(False) - Me.PerformLayout() - - End Sub - - Friend WithEvents chkSaveModel As CheckBox - Friend WithEvents ucrInputModelName As ucrInputComboBox -End Class diff --git a/instat/ucrSaveModel.resx b/instat/ucrSaveModel.resx deleted file mode 100644 index 1af7de150c9..00000000000 --- a/instat/ucrSaveModel.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/instat/ucrSaveModel.sw-KE.resx b/instat/ucrSaveModel.sw-KE.resx deleted file mode 100644 index e671d7eb01b..00000000000 --- a/instat/ucrSaveModel.sw-KE.resx +++ /dev/null @@ -1,51 +0,0 @@ - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 0, 3 - - - 83, 17 - - - 1 - - - &Hifadhi Modeli - - - 86, 0 - - - 0, 0, 0, 0 - - - 180, 20 - - - 0 - - - 6, 13 - - - 265, 20 - - - True - - \ No newline at end of file diff --git a/instat/ucrSaveModel.vb b/instat/ucrSaveModel.vb deleted file mode 100644 index 621a8eb63a3..00000000000 --- a/instat/ucrSaveModel.vb +++ /dev/null @@ -1,36 +0,0 @@ -' R- Instat -' Copyright (C) 2015-2017 -' -' This program is free software: you can redistribute it and/or modify -' it under the terms of the GNU General Public License as published by -' the Free Software Foundation, either version 3 of the License, or -' (at your option) any later version. -' -' This program is distributed in the hope that it will be useful, -' but WITHOUT ANY WARRANTY; without even the implied warranty of -' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -' GNU General Public License for more details. -' -' You should have received a copy of the GNU General Public License -' along with this program. If not, see . - -Public Class ucrSaveModel - Public Sub New() - ' This call is required by the designer. - InitializeComponent() - - ' Add any initialization after the InitializeComponent() call. - ucrInputModelName.SetDefaultTypeAsModel() - ucrInputModelName.SetItemsTypeAsModels() - End Sub - - Public Event CheckedChanged(bChecked As Boolean) - Private Sub chkSaveModel_CheckedChanged(sender As Object, e As EventArgs) Handles chkSaveModel.CheckedChanged - If chkSaveModel.Checked Then - ucrInputModelName.Visible = True - Else - ucrInputModelName.Visible = False - End If - RaiseEvent CheckedChanged(chkSaveModel.Checked) - End Sub -End Class From ee86d74da3ac0ff75c260de4fe5d3ad54bfb90a8 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Thu, 8 Sep 2022 01:38:16 +0300 Subject: [PATCH 019/122] web viewer and frmMain changes changes --- instat/UserControls/Webview/Windows/ucrWebViewer.vb | 1 - instat/frmMain.vb | 8 -------- 2 files changed, 9 deletions(-) diff --git a/instat/UserControls/Webview/Windows/ucrWebViewer.vb b/instat/UserControls/Webview/Windows/ucrWebViewer.vb index 5f8f6d9584a..77daa588add 100644 --- a/instat/UserControls/Webview/Windows/ucrWebViewer.vb +++ b/instat/UserControls/Webview/Windows/ucrWebViewer.vb @@ -17,7 +17,6 @@ Imports CefSharp.WinForms Imports CefSharp Imports CefSharp.DevTools.DOM -Imports System.Windows 'todo. inherit panel? Public Class ucrWebViewer diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 1e847150cd0..641141dec70 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -382,14 +382,6 @@ Public Class frmMain End Try End Sub - Public Sub AddGraphForm(strFilePath As String) - Dim frmNewGraph As New frmGraphDisplay - - frmNewGraph.SetImageFromFile(strFilePath) - frmNewGraph.Show() - frmNewGraph.BringToFront() - End Sub - Public Sub AddToScriptWindow(strText As String, Optional bMakeVisible As Boolean = True) ucrScriptWindow.AppendText(strText) If bMakeVisible Then From d6bf79b911ae41e69b9e9090f347ec7951cbc839 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Thu, 8 Sep 2022 01:56:16 +0300 Subject: [PATCH 020/122] Added frmMain changes --- instat/frmMain.Designer.vb | 85 +++++++++++++++++++------------------- instat/frmMain.vb | 27 ++++++++---- 2 files changed, 62 insertions(+), 50 deletions(-) diff --git a/instat/frmMain.Designer.vb b/instat/frmMain.Designer.vb index ebc7047e856..3ee3ef15716 100644 --- a/instat/frmMain.Designer.vb +++ b/instat/frmMain.Designer.vb @@ -392,8 +392,9 @@ Partial Class frmMain Me.separator1 = New System.Windows.Forms.ToolStripSeparator() Me.mnuTbLast10Dialogs = New System.Windows.Forms.ToolStripSplitButton() Me.mnuLastGraph = New System.Windows.Forms.ToolStripSplitButton() - Me.mnuViewer = New System.Windows.Forms.ToolStripMenuItem() + Me.mnuNormalViewer = New System.Windows.Forms.ToolStripMenuItem() Me.mnuploty = New System.Windows.Forms.ToolStripMenuItem() + Me.mnuRViewer = New System.Windows.Forms.ToolStripMenuItem() Me.separator2 = New System.Windows.Forms.ToolStripSeparator() Me.mnuTbDataView = New System.Windows.Forms.ToolStripButton() Me.mnuTbOutput = New System.Windows.Forms.ToolStripButton() @@ -672,7 +673,6 @@ Partial Class frmMain Me.splDataOutput = New System.Windows.Forms.SplitContainer() Me.ucrDataViewer = New instat.ucrDataView() Me.ucrOutput = New instat.ucrOutputWindow() - Me.mnuRViewer = New System.Windows.Forms.ToolStripMenuItem() Me.mnuPlotly = New System.Windows.Forms.ToolStripMenuItem() Me.mnuColumnMetadata = New System.Windows.Forms.ToolStripMenuItem() Me.mnuDataFrameMetadata = New System.Windows.Forms.ToolStripMenuItem() @@ -707,7 +707,7 @@ Partial Class frmMain ' Me.mnuDescribe.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuDescribeOneVariable, Me.mnuDescribeTwoThreeVariables, Me.mnuDescribeSpecificTablesGraphs, Me.mnuDescribeGeneral, Me.ToolStripSeparator9, Me.mnuDescribeMultivariate, Me.ToolStripSeparator13, Me.mnuDescribeUseGraph, Me.mnuDescribeCombineGraph, Me.mnuDescribeThemes, Me.mnuDescribeViewGraph}) Me.mnuDescribe.Name = "mnuDescribe" - Me.mnuDescribe.Size = New System.Drawing.Size(64, 20) + Me.mnuDescribe.Size = New System.Drawing.Size(64, 22) Me.mnuDescribe.Tag = "Describe" Me.mnuDescribe.Text = "Describe" ' @@ -1034,7 +1034,7 @@ Partial Class frmMain ' Me.mnuModel.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuModelProbabilityDistributions, Me.ToolStripSeparator3, Me.mnuModelFitModel, Me.mnuModelCompareModels, Me.mnuModelUseModel, Me.mnuModelOtherOneVariable, Me.mnuModelOtherTwoVariables, Me.mnuModelOtherThreeVariables, Me.mnuModelOtherGeneral}) Me.mnuModel.Name = "mnuModel" - Me.mnuModel.Size = New System.Drawing.Size(53, 20) + Me.mnuModel.Size = New System.Drawing.Size(53, 22) Me.mnuModel.Tag = "Model" Me.mnuModel.Text = "Model" ' @@ -1443,7 +1443,7 @@ Partial Class frmMain ' Me.mnuView.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuViewDataView, Me.mnuViewOutputWindow, Me.mnuViewLog, Me.mnuViewScriptWindow, Me.mnuViewColumnMetadata, Me.mnuViewDataFrameMetadata, Me.ToolStripSeparator22, Me.mnuViewStructuredMenu, Me.mnuViewClimaticMenu, Me.mnuViewProcurementMenu, Me.mnuViewOptionsByContextMenu, Me.ToolStripSeparator39, Me.mnuViewResetToDefaultLayout, Me.mnuViewSwapDataAndMetadata}) Me.mnuView.Name = "mnuView" - Me.mnuView.Size = New System.Drawing.Size(44, 20) + Me.mnuView.Size = New System.Drawing.Size(44, 22) Me.mnuView.Tag = "View" Me.mnuView.Text = "View" ' @@ -1552,7 +1552,7 @@ Partial Class frmMain ' Me.mnuHelp.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuHelpHelpIntroduction, Me.mnuHelpHistFAQ, Me.mnuHelpGetingStarted, Me.ToolStripSeparator28, Me.mnuHelpWindows, Me.mnuHelpDataViewSpreadsheet, Me.mnuHelpMenus, Me.mnuHelpAboutR, Me.mnuHelpRPackagesCommands, Me.mnuHelpDataset, Me.ToolStripSeparator29, Me.mnuHelpGuide, Me.mnuHelpAboutRInstat, Me.mnuHelpLicence, Me.mnuHelpAcknowledgments}) Me.mnuHelp.Name = "mnuHelp" - Me.mnuHelp.Size = New System.Drawing.Size(44, 20) + Me.mnuHelp.Size = New System.Drawing.Size(44, 22) Me.mnuHelp.Tag = "Help" Me.mnuHelp.Text = "Help" ' @@ -1676,7 +1676,7 @@ Partial Class frmMain ' Me.mnuClimatic.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticFile, Me.ToolStripSeparator18, Me.mnuClimaticTidyandExamine, Me.mnuClimaticDates, Me.mnuClimaticDefineClimaticData, Me.mnuClimaticCheckData, Me.mnuClimaticPrepare, Me.ToolStripSeparator30, Me.mnuClimaticDescribe, Me.mnuClimaticNCMP, Me.mnuClimaticPICSA, Me.mnuCMSAF, Me.mnuClimaticCompare, Me.mnuClimaticMapping, Me.ToolStripSeparator16, Me.mnuClimaticModel, Me.mnuClimaticExamine, Me.mnuClimaticProcess, Me.ToolStripSeparator23, Me.mnuClimaticSCF, Me.mnuClimaticEvaporation, Me.mnuClimaticCrop, Me.mnuClimaticHeatSum, Me.mnuClimaticClimateMethods}) Me.mnuClimatic.Name = "mnuClimatic" - Me.mnuClimatic.Size = New System.Drawing.Size(63, 20) + Me.mnuClimatic.Size = New System.Drawing.Size(63, 22) Me.mnuClimatic.Tag = "Climatic" Me.mnuClimatic.Text = "Climatic" ' @@ -2876,7 +2876,7 @@ Partial Class frmMain ' Me.mnuEdit.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuEditFind, Me.mnuEditFindNext, Me.mnuEditReplace, Me.mnuEditCut, Me.mnuEditCopy, Me.mnuEditCopySpecial, Me.mnuEditPaste, Me.mnuPasteSpecial, Me.mnuEditPasteNewDataFrame, Me.mnuEditSelectAll, Me.ToolStripSeparator71, Me.mnuEditScript}) Me.mnuEdit.Name = "mnuEdit" - Me.mnuEdit.Size = New System.Drawing.Size(39, 20) + Me.mnuEdit.Size = New System.Drawing.Size(39, 22) Me.mnuEdit.Tag = "Edit" Me.mnuEdit.Text = "Edit" ' @@ -2998,6 +2998,7 @@ Partial Class frmMain Me.Tool_strip.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuTbOpen, Me.mnuTbOpenFromLibrary, Me.mnuTbSave, Me.toolStripSeparator, Me.mnuTbCopy, Me.mnuTbPaste, Me.separator1, Me.mnuTbLast10Dialogs, Me.mnuLastGraph, Me.separator2, Me.mnuTbDataView, Me.mnuTbOutput, Me.mnuMetadata, Me.mnuTbLog, Me.mnuTbResetLayout, Me.separator3, Me.mnuTbHelp, Me.mnuTbLan}) Me.Tool_strip.Location = New System.Drawing.Point(0, 24) Me.Tool_strip.Name = "Tool_strip" + Me.Tool_strip.Padding = New System.Windows.Forms.Padding(0, 0, 2, 0) Me.Tool_strip.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional Me.Tool_strip.RightToLeft = System.Windows.Forms.RightToLeft.No Me.Tool_strip.Size = New System.Drawing.Size(834, 37) @@ -3104,7 +3105,7 @@ Partial Class frmMain 'mnuLastGraph ' Me.mnuLastGraph.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image - Me.mnuLastGraph.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuViewer, Me.mnuploty}) + Me.mnuLastGraph.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuNormalViewer, Me.mnuploty, Me.mnuRViewer}) Me.mnuLastGraph.Image = CType(resources.GetObject("mnuLastGraph.Image"), System.Drawing.Image) Me.mnuLastGraph.ImageTransparentColor = System.Drawing.Color.Magenta Me.mnuLastGraph.Name = "mnuLastGraph" @@ -3112,18 +3113,24 @@ Partial Class frmMain Me.mnuLastGraph.Text = "ToolStripSplitButton3" Me.mnuLastGraph.ToolTipText = "View Last Graph" ' - 'mnuViewer + 'mnuNormalViewer ' - Me.mnuViewer.Name = "mnuViewer" - Me.mnuViewer.Size = New System.Drawing.Size(128, 22) - Me.mnuViewer.Text = "R Viewer..." + Me.mnuNormalViewer.Name = "mnuNormalViewer" + Me.mnuNormalViewer.Size = New System.Drawing.Size(180, 22) + Me.mnuNormalViewer.Text = "Viewer..." ' 'mnuploty ' Me.mnuploty.Name = "mnuploty" - Me.mnuploty.Size = New System.Drawing.Size(128, 22) + Me.mnuploty.Size = New System.Drawing.Size(180, 22) Me.mnuploty.Text = "Plotly..." ' + 'mnuRViewer + ' + Me.mnuRViewer.Name = "mnuRViewer" + Me.mnuRViewer.Size = New System.Drawing.Size(180, 22) + Me.mnuRViewer.Text = "R Viewer..." + ' 'separator2 ' Me.separator2.Name = "separator2" @@ -3246,6 +3253,7 @@ Partial Class frmMain Me.mnuBar.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow Me.mnuBar.Location = New System.Drawing.Point(0, 0) Me.mnuBar.Name = "mnuBar" + Me.mnuBar.Padding = New System.Windows.Forms.Padding(4, 1, 0, 1) Me.mnuBar.RenderMode = System.Windows.Forms.ToolStripRenderMode.System Me.mnuBar.ShowItemToolTips = True Me.mnuBar.Size = New System.Drawing.Size(834, 24) @@ -3256,7 +3264,7 @@ Partial Class frmMain ' Me.mnuFile.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuFileNewDataFrame, Me.mnuFileImportFromFile, Me.mnuFileImportFromLibrary, Me.ToolStripSeparator35, Me.mnuFileImportFromODK, Me.mnuFileImportFromCSPRO, Me.mnuFileImportFromDatabases, Me.mnuFileImportFromPostgres, Me.mnuFileImportFromRapidPro, Me.mnuFileImportandTidyNetCDFFile, Me.mnuFileConvert, Me.tlSeparatorFile, Me.mnuFileSave, Me.mnuFileSaveAs, Me.mnuFileExport, Me.mnuFilePrint, Me.mnuFilePrintPreview, Me.tlSeparatorFile3, Me.mnuFileCloseData, Me.ToolStripSeparator8, Me.mnuFIleExit}) Me.mnuFile.Name = "mnuFile" - Me.mnuFile.Size = New System.Drawing.Size(37, 20) + Me.mnuFile.Size = New System.Drawing.Size(37, 22) Me.mnuFile.Tag = "File" Me.mnuFile.Text = "File" ' @@ -3391,7 +3399,7 @@ Partial Class frmMain ' Me.mnuPrepare.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuPrepareDataFrame, Me.mnuPrepareCheckData, Me.ToolStripSeparator6, Me.mnuPrepareCalculator, Me.mnuPrepareColumnCalculate, Me.mnuPrepareColumnFactor, Me.mnuPrepareColumnText, Me.mnuPrepareColumnDate, Me.mnuPrepareColumnDefine, Me.ToolStripSeparator4, Me.mnuPrepareDataReshape, Me.ToolStripSeparator7, Me.mnuPrepareKeysAndLinks, Me.mnuPrepareDataBook, Me.mnuPrepareRObjects}) Me.mnuPrepare.Name = "mnuPrepare" - Me.mnuPrepare.Size = New System.Drawing.Size(59, 20) + Me.mnuPrepare.Size = New System.Drawing.Size(59, 22) Me.mnuPrepare.Tag = "Prepare" Me.mnuPrepare.Text = "Prepare" ' @@ -4219,7 +4227,7 @@ Partial Class frmMain ' Me.mnuStructured.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuStructuredCircular, Me.mnuStructuredLow_Flow, Me.mnuStructuredSurvival, Me.mnuStructuredTimeSeries, Me.ToolStripSeparator63, Me.mnuStructuredClimatic, Me.mnuStructuredProcurement, Me.mnuStructuredOptionByContext}) Me.mnuStructured.Name = "mnuStructured" - Me.mnuStructured.Size = New System.Drawing.Size(74, 20) + Me.mnuStructured.Size = New System.Drawing.Size(74, 22) Me.mnuStructured.Text = "Structured" ' 'mnuStructuredCircular @@ -4413,7 +4421,7 @@ Partial Class frmMain ' Me.mnuProcurement.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuProcurementOpenFromLibrary, Me.mnuProcurementDefineData, Me.mnuProcurementPrepare, Me.mnuProcurementDescribe, Me.mnuProcurementMapping, Me.mnuProcurementModel, Me.ToolStripSeparator45, Me.mnuProcurementDefineRedFlags, Me.mnuProcurementUseCRI}) Me.mnuProcurement.Name = "mnuProcurement" - Me.mnuProcurement.Size = New System.Drawing.Size(88, 20) + Me.mnuProcurement.Size = New System.Drawing.Size(88, 22) Me.mnuProcurement.Text = "Procurement" ' 'mnuProcurementOpenFromLibrary @@ -4661,7 +4669,7 @@ Partial Class frmMain ' Me.mnuOptionsByContext.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuOptionsByContextCheckData, Me.mnuOptionsByContextDefine, Me.mnuOptionsByContextPrepare, Me.mnuOptionsByContextDescribe, Me.mnuOptionsByContextModel, Me.mnuOptionsByContextCropModel}) Me.mnuOptionsByContext.Name = "mnuOptionsByContext" - Me.mnuOptionsByContext.Size = New System.Drawing.Size(84, 20) + Me.mnuOptionsByContext.Size = New System.Drawing.Size(84, 22) Me.mnuOptionsByContext.Text = "Experiments" ' 'mnuOptionsByContextCheckData @@ -4818,7 +4826,7 @@ Partial Class frmMain ' Me.mnuTools.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuToolsRunRCode, Me.mnuToolsRestartR, Me.mnuToolsCheckForUpdates, Me.mnuToolsClearOutputWindow, Me.ToolStripSeparator5, Me.mnuToolsSaveCurrentOptions, Me.mnuToolsLoadOptions, Me.mnuToolsInstallRPackage, Me.mnuToolsOptions}) Me.mnuTools.Name = "mnuTools" - Me.mnuTools.Size = New System.Drawing.Size(46, 20) + Me.mnuTools.Size = New System.Drawing.Size(46, 22) Me.mnuTools.Text = "Tools" ' 'mnuToolsRunRCode @@ -4910,7 +4918,7 @@ Partial Class frmMain Me.splOverall.Panel2.BackColor = System.Drawing.SystemColors.Control Me.splOverall.Panel2.Controls.Add(Me.splDataOutput) Me.splOverall.Size = New System.Drawing.Size(834, 399) - Me.splOverall.SplitterDistance = 168 + Me.splOverall.SplitterDistance = 167 Me.splOverall.SplitterWidth = 5 Me.splOverall.TabIndex = 10 ' @@ -4930,8 +4938,8 @@ Partial Class frmMain ' Me.splExtraWindows.Panel2.BackColor = System.Drawing.SystemColors.Control Me.splExtraWindows.Panel2.Controls.Add(Me.splLogScript) - Me.splExtraWindows.Size = New System.Drawing.Size(834, 168) - Me.splExtraWindows.SplitterDistance = 255 + Me.splExtraWindows.Size = New System.Drawing.Size(834, 167) + Me.splExtraWindows.SplitterDistance = 254 Me.splExtraWindows.SplitterWidth = 5 Me.splExtraWindows.TabIndex = 0 ' @@ -4950,8 +4958,8 @@ Partial Class frmMain ' Me.splMetadata.Panel2.BackColor = System.Drawing.SystemColors.Control Me.splMetadata.Panel2.Controls.Add(Me.ucrDataFrameMeta) - Me.splMetadata.Size = New System.Drawing.Size(255, 168) - Me.splMetadata.SplitterDistance = 72 + Me.splMetadata.Size = New System.Drawing.Size(254, 167) + Me.splMetadata.SplitterDistance = 71 Me.splMetadata.SplitterWidth = 5 Me.splMetadata.TabIndex = 0 ' @@ -4964,7 +4972,7 @@ Partial Class frmMain Me.ucrColumnMeta.Location = New System.Drawing.Point(0, 0) Me.ucrColumnMeta.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) Me.ucrColumnMeta.Name = "ucrColumnMeta" - Me.ucrColumnMeta.Size = New System.Drawing.Size(72, 168) + Me.ucrColumnMeta.Size = New System.Drawing.Size(71, 167) Me.ucrColumnMeta.TabIndex = 0 ' 'ucrDataFrameMeta @@ -4975,7 +4983,7 @@ Partial Class frmMain Me.ucrDataFrameMeta.Location = New System.Drawing.Point(0, 0) Me.ucrDataFrameMeta.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) Me.ucrDataFrameMeta.Name = "ucrDataFrameMeta" - Me.ucrDataFrameMeta.Size = New System.Drawing.Size(178, 168) + Me.ucrDataFrameMeta.Size = New System.Drawing.Size(178, 167) Me.ucrDataFrameMeta.TabIndex = 0 ' 'splLogScript @@ -4994,7 +5002,7 @@ Partial Class frmMain ' Me.splLogScript.Panel2.BackColor = System.Drawing.SystemColors.Control Me.splLogScript.Panel2.Controls.Add(Me.ucrScriptWindow) - Me.splLogScript.Size = New System.Drawing.Size(574, 168) + Me.splLogScript.Size = New System.Drawing.Size(575, 167) Me.splLogScript.SplitterDistance = 174 Me.splLogScript.SplitterWidth = 5 Me.splLogScript.TabIndex = 0 @@ -5007,7 +5015,7 @@ Partial Class frmMain Me.ucrLogWindow.Location = New System.Drawing.Point(0, 0) Me.ucrLogWindow.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) Me.ucrLogWindow.Name = "ucrLogWindow" - Me.ucrLogWindow.Size = New System.Drawing.Size(174, 168) + Me.ucrLogWindow.Size = New System.Drawing.Size(174, 167) Me.ucrLogWindow.TabIndex = 0 ' 'ucrScriptWindow @@ -5018,7 +5026,7 @@ Partial Class frmMain Me.ucrScriptWindow.Location = New System.Drawing.Point(0, 0) Me.ucrScriptWindow.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) Me.ucrScriptWindow.Name = "ucrScriptWindow" - Me.ucrScriptWindow.Size = New System.Drawing.Size(395, 168) + Me.ucrScriptWindow.Size = New System.Drawing.Size(396, 167) Me.ucrScriptWindow.TabIndex = 0 Me.ucrScriptWindow.Tag = "Script_Window" ' @@ -5038,7 +5046,7 @@ Partial Class frmMain ' Me.splDataOutput.Panel2.BackColor = System.Drawing.SystemColors.Control Me.splDataOutput.Panel2.Controls.Add(Me.ucrOutput) - Me.splDataOutput.Size = New System.Drawing.Size(834, 226) + Me.splDataOutput.Size = New System.Drawing.Size(834, 227) Me.splDataOutput.SplitterDistance = 384 Me.splDataOutput.SplitterWidth = 5 Me.splDataOutput.TabIndex = 0 @@ -5052,7 +5060,7 @@ Partial Class frmMain Me.ucrDataViewer.Location = New System.Drawing.Point(0, 0) Me.ucrDataViewer.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) Me.ucrDataViewer.Name = "ucrDataViewer" - Me.ucrDataViewer.Size = New System.Drawing.Size(384, 226) + Me.ucrDataViewer.Size = New System.Drawing.Size(384, 227) Me.ucrDataViewer.TabIndex = 0 Me.ucrDataViewer.Tag = "Data_View" ' @@ -5064,16 +5072,9 @@ Partial Class frmMain Me.ucrOutput.Location = New System.Drawing.Point(0, 0) Me.ucrOutput.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) Me.ucrOutput.Name = "ucrOutput" - Me.ucrOutput.Size = New System.Drawing.Size(445, 226) + Me.ucrOutput.Size = New System.Drawing.Size(445, 227) Me.ucrOutput.TabIndex = 0 ' - 'mnuRViewer - ' - Me.mnuRViewer.Name = "mnuRViewer" - Me.mnuRViewer.Size = New System.Drawing.Size(180, 22) - Me.mnuRViewer.Text = "R Viewer..." - Me.mnuRViewer.ToolTipText = "View Last Graph" - ' 'mnuPlotly ' Me.mnuPlotly.Name = "mnuPlotly" @@ -5665,7 +5666,6 @@ Partial Class frmMain Friend WithEvents mnuMetadata As ToolStripSplitButton Friend WithEvents mnuColumnMetadat As ToolStripMenuItem Friend WithEvents mnuDataFrameMetadat As ToolStripMenuItem - Friend WithEvents mnuRViewer As ToolStripMenuItem Friend WithEvents mnuPlotly As ToolStripMenuItem Friend WithEvents mnuColumnMetadata As ToolStripMenuItem Friend WithEvents mnuDataFrameMetadata As ToolStripMenuItem @@ -5772,7 +5772,7 @@ Partial Class frmMain Friend WithEvents mnuSubTbPaste As ToolStripMenuItem Friend WithEvents mnuSubTbPasteSpecial As ToolStripMenuItem Friend WithEvents mnuLastGraph As ToolStripSplitButton - Friend WithEvents mnuViewer As ToolStripMenuItem + Friend WithEvents mnuRViewer As ToolStripMenuItem Friend WithEvents mnuploty As ToolStripMenuItem Friend WithEvents ToolStripSeparator27 As ToolStripSeparator Friend WithEvents ToolStripSeparator71 As ToolStripSeparator @@ -5805,4 +5805,5 @@ Partial Class frmMain Friend WithEvents mnuOptionsByContextCropModel As ToolStripMenuItem Friend WithEvents mnuFileImportFromRapidPro As ToolStripMenuItem Friend WithEvents mnuFileImportFromPostgres As ToolStripMenuItem + Friend WithEvents mnuNormalViewer As ToolStripMenuItem End Class diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 641141dec70..33215605af2 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -21,6 +21,7 @@ Imports System.Threading Imports instat.Translations Imports System.ComponentModel Imports System.Runtime.Serialization.Formatters.Binary +Imports System.Runtime.InteropServices Public Class frmMain Public clsRLink As RLink @@ -82,6 +83,9 @@ Public Class frmMain ' Add any initialization after the InitializeComponent() call. clsOutputLogger = New clsOutputLogger clsRLink = New RLink(clsOutputLogger) + If RuntimeInformation.IsOSPlatform(OSPlatform.Windows) Then + CefRuntimeWrapper.InitialiseCefRuntime() + End If End Sub Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -886,8 +890,12 @@ Public Class frmMain DeleteAutoSaveData() DeleteAutoSaveLog() DeleteAutoSaveDebugLog() + clsRLink.CloseREngine() + End If + + If RuntimeInformation.IsOSPlatform(OSPlatform.Windows) Then + CefRuntimeWrapper.ShutDownCef() End If - clsRLink.CloseREngine() Catch ex As Exception MsgBox("Error attempting to save setting files to App Data folder." & Environment.NewLine & "System error message: " & ex.Message, MsgBoxStyle.Critical, "Error saving settings") End Try @@ -2059,12 +2067,6 @@ Public Class frmMain UpdateLayout() End Sub - Private Sub MnuLastGraph_ButtonClick(sender As Object, e As EventArgs) Handles mnuLastGraph.ButtonClick - Me.Enabled = False - clsRLink.ViewLastGraph() - Me.Enabled = True - End Sub - Private Sub MnuMetadata_ButtonClick(sender As Object, e As EventArgs) Handles mnuMetadata.ButtonClick mnuViewColumnMetadata.Checked = Not mnuViewColumnMetadata.Checked mnuColumnMetadat.Checked = mnuViewColumnMetadata.Checked @@ -2101,7 +2103,7 @@ Public Class frmMain UpdateLayout() End Sub - Private Sub MnuViewer_Click(sender As Object, e As EventArgs) Handles mnuViewer.Click + Private Sub MnuLastGraph_ButtonClick(sender As Object, e As EventArgs) Handles mnuLastGraph.ButtonClick, mnuNormalViewer.Click Me.Enabled = False clsRLink.ViewLastGraph() Me.Enabled = True @@ -2113,6 +2115,15 @@ Public Class frmMain Me.Enabled = True End Sub + Private Sub MnuRViewer_Click(sender As Object, e As EventArgs) Handles mnuRViewer.Click + Me.Enabled = False + clsRLink.ViewLastGraph(bInRViewer:=True) + Me.Enabled = True + End Sub + + + + Private Sub mnuModelFitModelOneVariable_Click(sender As Object, e As EventArgs) Handles mnuModelFitModelOneVariable.Click dlgOneVarFitModel.ShowDialog() End Sub From 3d484eeeaf45342f4e1c5e6f8c8c5fb0912a29b6 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Thu, 8 Sep 2022 02:06:08 +0300 Subject: [PATCH 021/122] Added the nuget packages --- .gitignore | 8 ++++---- instat/instat.vbproj | 17 +++++++++++++++++ instat/packages.config | 4 ++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index fbceb13cfd7..efde8b85b19 100644 --- a/.gitignore +++ b/.gitignore @@ -243,7 +243,7 @@ installer/Output/ # PR #7782 adds a feature to display html in the output window. # This requires the cef packages. These packages are more than 0.4 GB. # We want to prevent these packages from being stored in the R-Instat GitHub repository. -/packages/cef.redist.x64.104.4.18/ -/packages/cef.redist.x86.104.4.18/ -/packages/CefSharp.Common.104.4.180/ -/packages/CefSharp.WinForms.104.4.180/ +/packages/cef.redist.x64.104.4.24/ +/packages/cef.redist.x86.104.4.24/ +/packages/CefSharp.Common.104.4.240/ +/packages/CefSharp.WinForms.104.4.240/ diff --git a/instat/instat.vbproj b/instat/instat.vbproj index 7ebc5dfecf3..57b55039180 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -1,5 +1,8 @@  + + + Debug @@ -119,6 +122,15 @@ False References\Antlr3.Runtime.dll + + ..\packages\CefSharp.Common.104.4.240\lib\net452\CefSharp.dll + + + ..\packages\CefSharp.Common.104.4.240\lib\net452\CefSharp.Core.dll + + + ..\packages\CefSharp.WinForms.104.4.240\lib\net452\CefSharp.WinForms.dll + ..\packages\DotNetZip.1.15.0\lib\net40\DotNetZip.dll @@ -5577,7 +5589,12 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + diff --git a/instat/frmMaximiseOutput.vb b/instat/UserControls/frmMaximiseOutput.vb similarity index 88% rename from instat/frmMaximiseOutput.vb rename to instat/UserControls/frmMaximiseOutput.vb index 733d192a585..0c9b552ba8c 100644 --- a/instat/frmMaximiseOutput.vb +++ b/instat/UserControls/frmMaximiseOutput.vb @@ -21,7 +21,6 @@ Public Class frmMaximiseOutput ucrTextViewer.LoadTextFile(strFileName) ucrTextViewer.FormatText(OutputFont.ROutputFont, OutputFont.ROutputColour) Me.panelControl.Controls.Add(ucrTextViewer) - 'Me.Margin ucrTextViewer.Dock = DockStyle.Fill Case ".png" _strFileFilter = "png (*.png)|*.png" @@ -62,18 +61,20 @@ Public Class frmMaximiseOutput _strFileDestinationDirectory = Path.GetDirectoryName(dlgSaveFile.FileName) + 'for htmls copy the html file with it's associated directory; css, javascript files etc If Path.GetExtension(_strDisplayedFileName).ToLower = ".html" Then - 'copy the html file with it's associated directory; css, javascript files etc For Each foundDirectory As String In My.Computer.FileSystem.GetDirectories( - Path.GetDirectoryName(_strDisplayedFileName), - FileIO.SearchOption.SearchTopLevelOnly, - "*" & Path.GetFileNameWithoutExtension(_strDisplayedFileName) & "*") + Path.GetDirectoryName(_strDisplayedFileName), + FileIO.SearchOption.SearchTopLevelOnly, + "*" & Path.GetFileNameWithoutExtension(_strDisplayedFileName) & "*") My.Computer.FileSystem.CopyDirectory(foundDirectory, _strFileDestinationDirectory, True) Next Else My.Computer.FileSystem.CopyFile(_strDisplayedFileName, dlgSaveFile.FileName, True) End If End If + + End Using End Sub diff --git a/instat/clsInstatOptions.vb b/instat/clsInstatOptions.vb index 934b3737ef6..563a5bce9e4 100644 --- a/instat/clsInstatOptions.vb +++ b/instat/clsInstatOptions.vb @@ -51,6 +51,7 @@ Imports RDotNet Public strClimsoftHost As String Public strClimsoftPort As String Public strClimsoftUsername As String + Public iMaxOutputsHeight As Nullable(Of Integer) Public Sub New(Optional bSetOptions As Boolean = True) 'TODO Is this sensible to do in constructor? @@ -89,6 +90,7 @@ Imports RDotNet strClimsoftHost = clsInstatOptionsDefaults.DEFAULTstrClimsoftHost strClimsoftPort = clsInstatOptionsDefaults.DEFAULTstrClimsoftPort strClimsoftUsername = clsInstatOptionsDefaults.DEFAULTstrClimsoftUsername + iMaxOutputsHeight = clsInstatOptionsDefaults.DEFAULTiMaxOutputsHeight If bSetOptions Then SetOptions() End If @@ -278,6 +280,13 @@ Imports RDotNet Else SetClimsoftUsername(clsInstatOptionsDefaults.DEFAULTstrClimsoftUsername) End If + + + If iMaxOutputsHeight IsNot Nothing Then + SetMaximumOutputsHeight(iMaxOutputsHeight) + Else + SetMaximumOutputsHeight(clsInstatOptionsDefaults.DEFAULTiMaxOutputsHeight) + End If End Sub Public Sub SetMaxRows(iRows As Integer) @@ -515,4 +524,9 @@ Imports RDotNet Public Sub SetClimsoftUsername(strNewClimsoftUsername As String) strClimsoftUsername = strNewClimsoftUsername End Sub + + Public Sub SetMaximumOutputsHeight(iNewMaxOutputsHeight As Integer) + iMaxOutputsHeight = iNewMaxOutputsHeight + End Sub + End Class \ No newline at end of file diff --git a/instat/clsInstatOptionsDefaults.vb b/instat/clsInstatOptionsDefaults.vb index 2550cec04f3..cf6f04d66a1 100644 --- a/instat/clsInstatOptionsDefaults.vb +++ b/instat/clsInstatOptionsDefaults.vb @@ -53,4 +53,5 @@ Public Class clsInstatOptionsDefaults Public Shared ReadOnly DEFAULTstrClimsoftHost As String = "127.0.0.1" Public Shared ReadOnly DEFAULTstrClimsoftPort As String = "3308" Public Shared ReadOnly DEFAULTstrClimsoftUsername As String = "root" + Public Shared ReadOnly DEFAULTiMaxOutputsHeight As Integer = 300 End Class diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 5372bf15766..d19e25ebe51 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -854,27 +854,6 @@ Public Class RLink Catch e As Exception MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") End Try - ElseIf strLastScript.Contains("view_html_object") Then 'if output should be returned as a html then - Try - Dim strNewAssignedToScript As String = ConstructAssignTo(strTempAssignTo, strScript) - Evaluate(strNewAssignedToScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) - expTemp = GetSymbol(strTempAssignTo) - If expTemp IsNot Nothing Then - 'get the html file path name - strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) - If strTemp <> "" Then - If bAddOutputInLog Then - clsOutputLogger.AddHtmlOutput(strTemp) - Else - Dim frmMaximiseOutput As New frmMaximiseOutput - frmMaximiseOutput.Show(strFileName:=strTemp) - End If - End If - End If - Catch e As Exception - MsgBox(e.Message & Environment.NewLine & "The error occurred in attempting to run the following R command(s):" & Environment.NewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") - End Try - ElseIf iCallType = 0 Then 'if script output should be ignored. to do. deprecated Evaluate(strScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) ElseIf iCallType = 3 Then diff --git a/instat/dlgOptions.Designer.vb b/instat/dlgOptions.Designer.vb index 21a41918cb7..c27efa0b4ed 100644 --- a/instat/dlgOptions.Designer.vb +++ b/instat/dlgOptions.Designer.vb @@ -38,12 +38,12 @@ Partial Class dlgOptions 'Do not modify it using the code editor. Private Sub InitializeComponent() - Dim TreeNode1 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Languages") - Dim TreeNode2 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Comments") - Dim TreeNode3 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Import") - Dim TreeNode4 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Output Window") - Dim TreeNode5 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Commands") - Dim TreeNode6 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Data View") + Dim TreeNode7 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Languages") + Dim TreeNode8 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Comments") + Dim TreeNode9 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Import") + Dim TreeNode10 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Output Window") + Dim TreeNode11 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Commands") + Dim TreeNode12 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Data View") Me.cmdApply = New System.Windows.Forms.Button() Me.cmdHelp = New System.Windows.Forms.Button() Me.cmdCancel = New System.Windows.Forms.Button() @@ -64,6 +64,7 @@ Partial Class dlgOptions Me.ucrNudPreviewRows = New instat.ucrNud() Me.pnImportData = New System.Windows.Forms.Panel() Me.tbpOutputWindow = New System.Windows.Forms.TabPage() + Me.ucrChkMaximumOutputsHeight = New instat.ucrCheck() Me.ucrChkShowRCommandsinOutputWindow = New instat.ucrCheck() Me.ucrChkIncludeCommentsbyDefault = New instat.ucrCheck() Me.grpROptions = New System.Windows.Forms.GroupBox() @@ -123,6 +124,7 @@ Partial Class dlgOptions Me.ucrInputHost = New instat.ucrInputTextBox() Me.ucrInputDatabaseName = New instat.ucrInputTextBox() Me.cmdLanguage = New System.Windows.Forms.Button() + Me.ucrNudMaximumOutputsHeight = New instat.ucrNud() CType(Me.spltControls, System.ComponentModel.ISupportInitialize).BeginInit() Me.spltControls.Panel1.SuspendLayout() Me.spltControls.Panel2.SuspendLayout() @@ -217,29 +219,29 @@ Partial Class dlgOptions Me.trOptions.Dock = System.Windows.Forms.DockStyle.Fill Me.trOptions.Location = New System.Drawing.Point(0, 0) Me.trOptions.Name = "trOptions" - TreeNode1.Name = "ndLanguages" - TreeNode1.Tag = "1" - TreeNode1.Text = "Languages" - TreeNode1.ToolTipText = "Choose different languages" - TreeNode2.Name = "ndComments" - TreeNode2.Tag = "2" - TreeNode2.Text = "Comments" - TreeNode2.ToolTipText = "Comments for the dialogs" - TreeNode3.Name = "ndImport" - TreeNode3.Tag = "3" - TreeNode3.Text = "Import" - TreeNode3.ToolTipText = "Import Data Settings" - TreeNode4.Name = "ndOutputWindow" - TreeNode4.Tag = "4" - TreeNode4.Text = "Output Window" - TreeNode4.ToolTipText = "Output Window Formatting Options" - TreeNode5.Name = "ndCommands" - TreeNode5.Tag = "8" - TreeNode5.Text = "Commands" - TreeNode5.ToolTipText = "Commands Options" - TreeNode6.Name = "ndDataView" - TreeNode6.Text = "Data View" - Me.trOptions.Nodes.AddRange(New System.Windows.Forms.TreeNode() {TreeNode1, TreeNode2, TreeNode3, TreeNode4, TreeNode5, TreeNode6}) + TreeNode7.Name = "ndLanguages" + TreeNode7.Tag = "1" + TreeNode7.Text = "Languages" + TreeNode7.ToolTipText = "Choose different languages" + TreeNode8.Name = "ndComments" + TreeNode8.Tag = "2" + TreeNode8.Text = "Comments" + TreeNode8.ToolTipText = "Comments for the dialogs" + TreeNode9.Name = "ndImport" + TreeNode9.Tag = "3" + TreeNode9.Text = "Import" + TreeNode9.ToolTipText = "Import Data Settings" + TreeNode10.Name = "ndOutputWindow" + TreeNode10.Tag = "4" + TreeNode10.Text = "Output Window" + TreeNode10.ToolTipText = "Output Window Formatting Options" + TreeNode11.Name = "ndCommands" + TreeNode11.Tag = "8" + TreeNode11.Text = "Commands" + TreeNode11.ToolTipText = "Commands Options" + TreeNode12.Name = "ndDataView" + TreeNode12.Text = "Data View" + Me.trOptions.Nodes.AddRange(New System.Windows.Forms.TreeNode() {TreeNode7, TreeNode8, TreeNode9, TreeNode10, TreeNode11, TreeNode12}) Me.trOptions.Size = New System.Drawing.Size(184, 317) Me.trOptions.TabIndex = 0 ' @@ -384,6 +386,8 @@ Partial Class dlgOptions ' 'tbpOutputWindow ' + Me.tbpOutputWindow.Controls.Add(Me.ucrNudMaximumOutputsHeight) + Me.tbpOutputWindow.Controls.Add(Me.ucrChkMaximumOutputsHeight) Me.tbpOutputWindow.Controls.Add(Me.ucrChkShowRCommandsinOutputWindow) Me.tbpOutputWindow.Controls.Add(Me.ucrChkIncludeCommentsbyDefault) Me.tbpOutputWindow.Controls.Add(Me.grpROptions) @@ -396,22 +400,31 @@ Partial Class dlgOptions Me.tbpOutputWindow.Text = "Output Window" Me.tbpOutputWindow.UseVisualStyleBackColor = True ' + 'ucrChkMaximumOutputsHeight + ' + Me.ucrChkMaximumOutputsHeight.AutoSize = True + Me.ucrChkMaximumOutputsHeight.Checked = False + Me.ucrChkMaximumOutputsHeight.Location = New System.Drawing.Point(310, 135) + Me.ucrChkMaximumOutputsHeight.Name = "ucrChkMaximumOutputsHeight" + Me.ucrChkMaximumOutputsHeight.Size = New System.Drawing.Size(162, 23) + Me.ucrChkMaximumOutputsHeight.TabIndex = 28 + ' 'ucrChkShowRCommandsinOutputWindow ' Me.ucrChkShowRCommandsinOutputWindow.AutoSize = True Me.ucrChkShowRCommandsinOutputWindow.Checked = False - Me.ucrChkShowRCommandsinOutputWindow.Location = New System.Drawing.Point(10, 168) + Me.ucrChkShowRCommandsinOutputWindow.Location = New System.Drawing.Point(10, 158) Me.ucrChkShowRCommandsinOutputWindow.Name = "ucrChkShowRCommandsinOutputWindow" - Me.ucrChkShowRCommandsinOutputWindow.Size = New System.Drawing.Size(388, 23) + Me.ucrChkShowRCommandsinOutputWindow.Size = New System.Drawing.Size(271, 23) Me.ucrChkShowRCommandsinOutputWindow.TabIndex = 27 ' 'ucrChkIncludeCommentsbyDefault ' Me.ucrChkIncludeCommentsbyDefault.AutoSize = True Me.ucrChkIncludeCommentsbyDefault.Checked = False - Me.ucrChkIncludeCommentsbyDefault.Location = New System.Drawing.Point(10, 145) + Me.ucrChkIncludeCommentsbyDefault.Location = New System.Drawing.Point(10, 135) Me.ucrChkIncludeCommentsbyDefault.Name = "ucrChkIncludeCommentsbyDefault" - Me.ucrChkIncludeCommentsbyDefault.Size = New System.Drawing.Size(391, 23) + Me.ucrChkIncludeCommentsbyDefault.Size = New System.Drawing.Size(271, 23) Me.ucrChkIncludeCommentsbyDefault.TabIndex = 26 ' 'grpROptions @@ -1023,6 +1036,19 @@ Partial Class dlgOptions Me.cmdLanguage.Text = "Lang" Me.cmdLanguage.UseVisualStyleBackColor = True ' + 'ucrNudMaximumOutputsHeight + ' + Me.ucrNudMaximumOutputsHeight.AutoSize = True + Me.ucrNudMaximumOutputsHeight.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudMaximumOutputsHeight.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudMaximumOutputsHeight.Location = New System.Drawing.Point(478, 135) + Me.ucrNudMaximumOutputsHeight.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudMaximumOutputsHeight.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudMaximumOutputsHeight.Name = "ucrNudMaximumOutputsHeight" + Me.ucrNudMaximumOutputsHeight.Size = New System.Drawing.Size(50, 20) + Me.ucrNudMaximumOutputsHeight.TabIndex = 29 + Me.ucrNudMaximumOutputsHeight.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'dlgOptions ' Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) @@ -1158,4 +1184,6 @@ Partial Class dlgOptions Friend WithEvents lblLanguage As Label Friend WithEvents ucrInputLanguage As ucrInputComboBox Friend WithEvents cmdLanguage As Button + Friend WithEvents ucrChkMaximumOutputsHeight As ucrCheck + Friend WithEvents ucrNudMaximumOutputsHeight As ucrNud End Class diff --git a/instat/dlgOptions.vb b/instat/dlgOptions.vb index 12ea68659f2..af10bb4db10 100644 --- a/instat/dlgOptions.vb +++ b/instat/dlgOptions.vb @@ -72,7 +72,7 @@ Public Class dlgOptions ucrChkViewClimaticMenu.SetText("Show Climatic Menu") ucrChkViewProcurementMenu.SetText("Show Procurement Menu") ucrChkViewOptionsByContextMenu.SetText("Show Options By Context Menu") - ucrChkShowRCommandsinOutputWindow.SetText(" Show R Commands in Output Window") + ucrChkShowRCommandsinOutputWindow.SetText("Show R Commands in Output Window") ucrChkShowSignifStars.SetText("Show stars on summary tables for coefficients") ucrChkShowDataonGrid.SetText("Display dialog's selected data frame in grid") ucrChkIncludeDefaultParams.SetText("Include Default Parameter Values in R Commands") @@ -87,6 +87,10 @@ Public Class dlgOptions ucrInputLanguage.SetItems({"English", "French", "Kiswahili", "Portuguese", "Russian"}) ucrInputLanguage.SetDropDownStyleAsNonEditable() + ucrChkShowWaitDialog.SetText("Set maximum height for outputs") + ucrChkMaximumOutputsHeight.AddToLinkedControls(ucrNudMaximumOutputsHeight, {True}) + ucrNudMaximumOutputsHeight.Maximum = 1000 + SetVisibleLanButton() End Sub @@ -118,6 +122,11 @@ Public Class dlgOptions ucrInputHost.SetName(frmMain.clsInstatOptions.strClimsoftHost) ucrInputPort.SetName(frmMain.clsInstatOptions.strClimsoftPort) ucrInputUserName.SetName(frmMain.clsInstatOptions.strClimsoftUsername) + ucrChkMaximumOutputsHeight.Checked = frmMain.clsInstatOptions.iMaxOutputsHeight > 0 + ucrNudMaximumOutputsHeight.Value = If(frmMain.clsInstatOptions.iMaxOutputsHeight > 0, + frmMain.clsInstatOptions.iMaxOutputsHeight, + clsInstatOptionsDefaults.DEFAULTiMaxOutputsHeight) + Select Case frmMain.clsInstatOptions.strLanguageCultureCode Case "en-GB" ucrInputLanguage.SetText("English") @@ -172,6 +181,8 @@ Public Class dlgOptions frmMain.clsInstatOptions.SetClimsoftHost(ucrInputHost.GetText()) frmMain.clsInstatOptions.SetClimsoftPort(ucrInputPort.GetText()) frmMain.clsInstatOptions.SetClimsoftUsername(ucrInputUserName.GetText()) + frmMain.clsInstatOptions.SetMaximumOutputsHeight(If(ucrChkMaximumOutputsHeight.Checked, + ucrNudMaximumOutputsHeight.Value, -1)) End Sub Private Sub SetView() @@ -397,6 +408,10 @@ Public Class dlgOptions ApplyEnabled(True) End Sub + Private Sub AllControls_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudWaitSeconds.ControlValueChanged, ucrNudPreviewRows.ControlValueChanged, ucrNudMaxRows.ControlValueChanged, ucrNudMaxCols.ControlValueChanged, ucrNudDigits.ControlValueChanged, ucrNudAutoSaveMinutes.ControlValueChanged, ucrInputUserName.ControlValueChanged, ucrInputPort.ControlValueChanged, ucrInputHost.ControlValueChanged, ucrInputDatabaseName.ControlValueChanged, ucrInputComment.ControlContentsChanged, ucrChkViewStructuredMenu.ControlValueChanged, ucrChkViewProcurementMenu.ControlValueChanged, ucrChkViewOptionsByContextMenu.ControlValueChanged, ucrChkViewClimaticMenu.ControlValueChanged, ucrChkShowWaitDialog.ControlValueChanged, ucrChkShowSignifStars.ControlValueChanged, ucrChkShowRCommandsinOutputWindow.ControlValueChanged, ucrChkShowDataonGrid.ControlValueChanged, ucrChkIncludeDefaultParams.ControlValueChanged, ucrChkIncludeCommentsbyDefault.ControlValueChanged, ucrChkAutoSave.ControlValueChanged + + End Sub + Private Sub SetVisibleLanButton() If frmMain.clsInstatOptions IsNot Nothing Then If frmMain.clsInstatOptions.strLanguageCultureCode <> "en-GB" Then diff --git a/instat/dlgScatterPlot.vb b/instat/dlgScatterPlot.vb index 9997f3f7bf2..59867ec0349 100644 --- a/instat/dlgScatterPlot.vb +++ b/instat/dlgScatterPlot.vb @@ -13,297 +13,297 @@ ' ' You should have received a copy of the GNU General Public License ' along with this program. If not, see . -Imports instat.Translations - -Public Class dlgScatterPlot - Private clsRggplotFunction As New RFunction - Private clsRScatterGeomFunction As New RFunction - Private clsRaesFunction As New RFunction - Private clsLocalRaesFunction As New RFunction - Private clsBaseOperator As New ROperator - Private bFirstLoad As Boolean = True - Private bReset As Boolean = True - Private bResetSubdialog As Boolean = True - Private bResetlayerSubdialog As Boolean = True - Private clsLabsFunction As New RFunction - Private clsXlabsFunction As New RFunction - Private clsYlabsFunction As New RFunction - Private clsXScalecontinuousFunction As New RFunction - Private clsYScalecontinuousFunction As New RFunction - Private clsFacetsFunction As New RFunction - Private clsThemeFunction As New RFunction - Private dctThemeFunctions As New Dictionary(Of String, RFunction) - Private clsGeomSmoothFunc As New RFunction - Private clsCoordPolarFunction As New RFunction - Private clsCoordPolarStartOperator As New ROperator - Private clsXScaleDateFunction As New RFunction - Private clsYScaleDateFunction As New RFunction - Private clsScaleFillViridisFunction As New RFunction - Private clsScaleColourViridisFunction As New RFunction - Private clsAnnotateFunction As New RFunction - Private clsGeomRugFunction As New RFunction - 'Parameter names for geoms - Private strFirstParameterName As String = "geomfunc" - Private strGeomSmoothParameterName As String = "geom_smooth" - Private strGeomParameterNames() As String = {strFirstParameterName, strGeomSmoothParameterName} - - Private Sub dlgScatterPlot_Load(sender As Object, e As EventArgs) Handles MyBase.Load - If bFirstLoad Then - InitialiseDialog() - bFirstLoad = False - End If - If bReset Then - SetDefaults() - End If - SetRCodeForControls(bReset) - bReset = False - TestOkEnabled() - autoTranslate(Me) - End Sub - - Private Sub InitialiseDialog() - Dim clsGeomRugParameter As New RParameter - Dim dctSidesOptions As New Dictionary(Of String, String) - - ucrBase.iHelpTopicID = 433 - ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False - ucrBase.clsRsyntax.iCallType = 3 - - ucrSelectorForScatter.SetParameter(New RParameter("data", 0)) - ucrSelectorForScatter.SetParameterIsrfunction() - - ucrVariablesAsFactorForScatter.SetParameter(New RParameter("y", 1)) - ucrVariablesAsFactorForScatter.SetParameterIsString() - ucrVariablesAsFactorForScatter.bWithQuotes = False - ucrVariablesAsFactorForScatter.Selector = ucrSelectorForScatter - ucrVariablesAsFactorForScatter.SetFactorReceiver(ucrFactorOptionalReceiver) - ucrVariablesAsFactorForScatter.strSelectorHeading = "Variables" - ucrVariablesAsFactorForScatter.SetValuesToIgnore({Chr(34) & Chr(34)}) - ucrVariablesAsFactorForScatter.bAddParameterIfEmpty = True - - ucrReceiverX.SetParameter(New RParameter("x", 0)) - ucrReceiverX.SetParameterIsString() - ucrReceiverX.bWithQuotes = False - ucrReceiverX.Selector = ucrSelectorForScatter - ucrReceiverX.strSelectorHeading = "Variables" - ucrReceiverX.SetValuesToIgnore({Chr(34) & Chr(34)}) - ucrReceiverX.bAddParameterIfEmpty = True - - ucrReceiverLabel.SetParameter(New RParameter("label")) - ucrReceiverLabel.SetParameterIsString() - ucrReceiverLabel.bWithQuotes = False - ucrReceiverLabel.Selector = ucrSelectorForScatter - ucrReceiverLabel.strSelectorHeading = "Variables" - - ucrFactorOptionalReceiver.SetParameter(New RParameter("colour", 2)) - ucrFactorOptionalReceiver.SetParameterIsString() - ucrFactorOptionalReceiver.bWithQuotes = False - ucrFactorOptionalReceiver.Selector = ucrSelectorForScatter - ucrFactorOptionalReceiver.strSelectorHeading = "Variables" - - ucrChkLineofBestFit.SetText("Add Line of Best Fit") - ucrChkLineofBestFit.AddParameterPresentCondition(True, "geom_smooth") - ucrChkLineofBestFit.AddParameterPresentCondition(False, "geom_smooth", False) - ucrChkLineofBestFit.AddToLinkedControls(ucrChkWithSE, {True}, bNewLinkedHideIfParameterMissing:=True) - - ucrChkWithSE.SetText("With Standard Error") - ucrChkWithSE.SetParameter(New RParameter("se"), bNewAddRemoveParameter:=False, bNewChangeParameterValue:=True) - ucrChkWithSE.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkWithSE.SetRDefault("TRUE") - - ucrChkAddRugPlot.SetText("Add Rug Plot") - ucrChkAddRugPlot.AddParameterPresentCondition(True, "geom_rug") - ucrChkAddRugPlot.AddParameterPresentCondition(False, "geom_rug", False) - ucrChkAddRugPlot.AddToLinkedControls({ucrNudSize, ucrInputSides}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - - ucrSaveScatterPlot.SetPrefix("scatter_plot") - ucrSaveScatterPlot.SetSaveType(strRObjectType:=RObjectTypeLabel.Graph, - strRObjectFormat:=RObjectFormat.Image) - ucrSaveScatterPlot.SetDataFrameSelector(ucrSelectorForScatter.ucrAvailableDataFrames) - ucrSaveScatterPlot.SetCheckBoxText("Save Graph") - ucrSaveScatterPlot.SetIsComboBox() - ucrSaveScatterPlot.SetAssignToIfUncheckedValue("last_graph") - - ucrNudSize.SetParameter(New RParameter("size", 0)) - ucrNudSize.Increment = 0.1 - ucrNudSize.DecimalPlaces = 1 - - ucrInputSides.SetParameter(New RParameter("sides", 1)) - dctSidesOptions.Add("Bottom and left", Chr(34) & "bl" & Chr(34)) - dctSidesOptions.Add("Top, right and bottom", Chr(34) & "trb" & Chr(34)) - dctSidesOptions.Add("Top, right and left", Chr(34) & "trl" & Chr(34)) - dctSidesOptions.Add("Top, bottom and left", Chr(34) & "tbl" & Chr(34)) - dctSidesOptions.Add("Right, bottom and left", Chr(34) & "rbl" & Chr(34)) - dctSidesOptions.Add("Top and right", Chr(34) & "tr" & Chr(34)) - dctSidesOptions.Add("Top and bottom", Chr(34) & "tb" & Chr(34)) - dctSidesOptions.Add("Top and left", Chr(34) & "tl" & Chr(34)) - dctSidesOptions.Add("Right and bottom", Chr(34) & "rb" & Chr(34)) - dctSidesOptions.Add("Right and left", Chr(34) & "rl" & Chr(34)) - dctSidesOptions.Add("Top", Chr(34) & "t" & Chr(34)) - dctSidesOptions.Add("Right", Chr(34) & "r" & Chr(34)) - dctSidesOptions.Add("Bottom", Chr(34) & "b" & Chr(34)) - dctSidesOptions.Add("Left", Chr(34) & "l" & Chr(34)) - ucrInputSides.SetItems(dctSidesOptions) - ucrInputSides.SetRDefault(Chr(34) & "bl" & Chr(34)) - ucrInputSides.SetDropDownStyleAsNonEditable() - - ucrNudSize.SetLinkedDisplayControl(lblSize) - ucrInputSides.SetLinkedDisplayControl(lblSides) - End Sub - - Private Sub SetDefaults() - clsBaseOperator = New ROperator - clsRggplotFunction = New RFunction - clsRScatterGeomFunction = New RFunction - clsRaesFunction = New RFunction - clsGeomSmoothFunc = New RFunction - clsGeomRugFunction = New RFunction - - ucrSelectorForScatter.Reset() - ucrSelectorForScatter.SetGgplotFunction(clsBaseOperator) - ucrSaveScatterPlot.Reset() - ucrVariablesAsFactorForScatter.SetMeAsReceiver() - sdgPlots.Reset() - bResetSubdialog = True - bResetlayerSubdialog = True - - clsBaseOperator.SetOperation("+") - clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) - clsBaseOperator.AddParameter(strFirstParameterName, clsRFunctionParameter:=clsRScatterGeomFunction, iPosition:=2) - - clsRggplotFunction.SetPackageName("ggplot2") - clsRggplotFunction.SetRCommand("ggplot") - clsRggplotFunction.AddParameter("mapping", clsRFunctionParameter:=clsRaesFunction, iPosition:=1) - - clsRaesFunction.SetPackageName("ggplot2") - clsRaesFunction.SetRCommand("aes") - clsRaesFunction.AddParameter("x", Chr(34) & Chr(34)) - clsRaesFunction.AddParameter("y", Chr(34) & Chr(34)) - - clsRScatterGeomFunction.SetPackageName("ggplot2") - clsRScatterGeomFunction.SetRCommand("geom_point") - - clsGeomRugFunction.SetPackageName("ggplot2") - clsGeomRugFunction.SetRCommand("geom_rug") - clsGeomRugFunction.AddParameter("size", 0.5, iPosition:=0) - - clsBaseOperator.AddParameter(GgplotDefaults.clsDefaultThemeParameter.Clone()) - clsXlabsFunction = GgplotDefaults.clsXlabTitleFunction.Clone() - clsYlabsFunction = GgplotDefaults.clsYlabTitleFunction.Clone() - clsLabsFunction = GgplotDefaults.clsDefaultLabs.Clone() - clsXScalecontinuousFunction = GgplotDefaults.clsXScalecontinuousFunction.Clone() - clsYScalecontinuousFunction = GgplotDefaults.clsYScalecontinuousFunction.Clone() - clsFacetsFunction = GgplotDefaults.clsFacetFunction.Clone() - dctThemeFunctions = New Dictionary(Of String, RFunction)(GgplotDefaults.dctThemeFunctions) - clsCoordPolarStartOperator = GgplotDefaults.clsCoordPolarStartOperator.Clone() - clsCoordPolarFunction = GgplotDefaults.clsCoordPolarFunction.Clone() - clsThemeFunction = GgplotDefaults.clsDefaultThemeFunction - clsLocalRaesFunction = GgplotDefaults.clsAesFunction.Clone() - clsXScaleDateFunction = GgplotDefaults.clsXScaleDateFunction.Clone() - clsYScaleDateFunction = GgplotDefaults.clsYScaleDateFunction.Clone() - clsScaleFillViridisFunction = GgplotDefaults.clsScaleFillViridisFunction - clsScaleColourViridisFunction = GgplotDefaults.clsScaleColorViridisFunction - clsAnnotateFunction = GgplotDefaults.clsAnnotateFunction - - clsGeomSmoothFunc.SetPackageName("ggplot2") - clsGeomSmoothFunc.SetRCommand("geom_smooth") - clsGeomSmoothFunc.AddParameter("method", Chr(34) & "lm" & Chr(34), iPosition:=0) - clsGeomSmoothFunc.AddParameter("se", "FALSE", iPosition:=1) - - clsBaseOperator.SetAssignToRObject(strRObjectToAssignTo:="last_graph", - strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Graph, - strRObjectFormatToAssignTo:=RObjectFormat.Image, - strRDataFrameNameToAddObjectTo:=ucrSelectorForScatter.strCurrentDataFrame, - strObjectName:="last_graph") - - ucrBase.clsRsyntax.SetBaseROperator(clsBaseOperator) - End Sub - - Public Sub SetRCodeForControls(bReset As Boolean) - ucrSelectorForScatter.SetRCode(clsRggplotFunction, bReset) - ucrReceiverX.SetRCode(clsRaesFunction, bReset) - ucrReceiverLabel.SetRCode(clsRaesFunction, bReset) - ucrVariablesAsFactorForScatter.SetRCode(clsRaesFunction, bReset) - ucrFactorOptionalReceiver.SetRCode(clsRaesFunction, bReset) - ucrChkLineofBestFit.SetRCode(clsBaseOperator, bReset) - ucrSaveScatterPlot.SetRCode(clsBaseOperator, bReset) - ucrChkWithSE.SetRCode(clsGeomSmoothFunc, bReset) - ucrChkAddRugPlot.SetRCode(clsBaseOperator, bReset) - ucrNudSize.SetRCode(clsGeomRugFunction, bReset) - ucrInputSides.SetRCode(clsGeomRugFunction, bReset) - End Sub - - Private Sub TestOkEnabled() - ' Either y or x can be empty but not both - If (Not ucrSaveScatterPlot.IsComplete) OrElse (ucrVariablesAsFactorForScatter.IsEmpty AndAlso ucrReceiverX.IsEmpty()) Then - ucrBase.OKEnabled(False) - Else - ucrBase.OKEnabled(True) - End If - End Sub - - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeForControls(True) - TestOkEnabled() - End Sub - - Private Sub cmdOptions_Click(sender As Object, e As EventArgs) Handles cmdOptions.Click - sdgPlots.SetRCode(clsNewOperator:=ucrBase.clsRsyntax.clsBaseOperator, clsNewGlobalAesFunction:=clsRaesFunction, clsNewYScalecontinuousFunction:=clsYScalecontinuousFunction, clsNewXScalecontinuousFunction:=clsXScalecontinuousFunction, - clsNewLabsFunction:=clsLabsFunction, clsNewXLabsTitleFunction:=clsXlabsFunction, clsNewYLabTitleFunction:=clsYlabsFunction, clsNewFacetFunction:=clsFacetsFunction, clsNewCoordPolarFunction:=clsCoordPolarFunction, - clsNewCoordPolarStartOperator:=clsCoordPolarStartOperator, clsNewThemeFunction:=clsThemeFunction, clsNewScaleFillViridisFunction:=clsScaleFillViridisFunction, clsNewScaleColourViridisFunction:=clsScaleColourViridisFunction, - clsNewXScaleDateFunction:=clsXScaleDateFunction, clsNewYScaleDateFunction:=clsYScaleDateFunction, dctNewThemeFunctions:=dctThemeFunctions, ucrNewBaseSelector:=ucrSelectorForScatter, strMainDialogGeomParameterNames:=strGeomParameterNames, - clsNewAnnotateFunction:=clsAnnotateFunction, bReset:=bResetSubdialog) - sdgPlots.ShowDialog() - bResetSubdialog = False - End Sub - - Private Sub cmdScatterPlotOptions_Click(sender As Object, e As EventArgs) Handles cmdPointOptions.Click - 'SetupLayer sends the components storing the plot info (clsRaesFunction, clsRggplotFunction, ...) of dlgScatteredPlot through to sdgLayerOptions where these will be edited. - sdgLayerOptions.SetupLayer(clsNewGgPlot:=clsRggplotFunction, clsNewGeomFunc:=clsRScatterGeomFunction, clsNewGlobalAesFunc:=clsRaesFunction, clsNewLocalAes:=clsLocalRaesFunction, bFixGeom:=True, ucrNewBaseSelector:=ucrSelectorForScatter, bApplyAesGlobally:=True, bReset:=bResetlayerSubdialog) - 'Coming from the sdgLayerOptions, clsRaesFunction and others has been modified. One then needs to display these modifications on the dlgScatteredPlot. - sdgLayerOptions.ShowDialog() - ucrReceiverLabel.SetRCode(clsRaesFunction, bReset) - bResetlayerSubdialog = False - 'The aesthetics parameters on the main dialog are repopulated as required. - For Each clsParam In clsRaesFunction.clsParameters - If clsParam.strArgumentName = "x" Then - If clsParam.strArgumentValue = Chr(34) & Chr(34) Then - ucrReceiverX.Clear() - Else - ucrReceiverX.Add(clsParam.strArgumentValue) - End If - 'In the y case, the vlue stored in the clsReasFunction in the multiplevariables case is "value", however that one shouldn't be written in the multiple variables receiver (otherwise it would stack all variables and the stack ("value") itself!). - 'Warning: what if someone used the name value for one of it's variables independently from the multiple variables method ? Here if the receiver is actually in single mode, the variable "value" will still be given back, which throws the problem back to the creation of "value" in the multiple receiver case. - ElseIf clsParam.strArgumentName = "y" AndAlso (clsParam.strArgumentValue <> "value" OrElse ucrVariablesAsFactorForScatter.bSingleVariable) Then - 'Still might be in the case of bSingleVariable with mapping y="". - If clsParam.strArgumentValue = (Chr(34) & Chr(34)) Then - ucrVariablesAsFactorForScatter.Clear() - Else ucrVariablesAsFactorForScatter.Add(clsParam.strArgumentValue) - End If - ElseIf clsParam.strArgumentName = "colour" Then - ucrFactorOptionalReceiver.Add(clsParam.strArgumentValue) - End If - Next - End Sub - - Private Sub ucrSaveScatterPlot_ContentsChanged() Handles ucrSaveScatterPlot.ControlContentsChanged, ucrReceiverX.ControlContentsChanged, ucrVariablesAsFactorForScatter.ControlContentsChanged, ucrSaveScatterPlot.ControlContentsChanged - TestOkEnabled() - End Sub - - Private Sub ucrChkLineofBestFit_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkLineofBestFit.ControlValueChanged - If ucrChkLineofBestFit.Checked Then - clsBaseOperator.AddParameter("geom_smooth", clsRFunctionParameter:=clsGeomSmoothFunc, iPosition:=4) - Else - clsBaseOperator.RemoveParameterByName("geom_smooth") - End If - End Sub - - Private Sub ucrChkAddRugPlot_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkAddRugPlot.ControlValueChanged - If ucrChkAddRugPlot.Checked Then - clsBaseOperator.AddParameter("geom_rug", clsRFunctionParameter:=clsGeomRugFunction, iPosition:=3) - Else - clsBaseOperator.RemoveParameterByName("geom_rug") - End If - End Sub +Imports instat.Translations + +Public Class dlgScatterPlot + Private clsRggplotFunction As New RFunction + Private clsRScatterGeomFunction As New RFunction + Private clsRaesFunction As New RFunction + Private clsLocalRaesFunction As New RFunction + Private clsBaseOperator As New ROperator + Private bFirstLoad As Boolean = True + Private bReset As Boolean = True + Private bResetSubdialog As Boolean = True + Private bResetlayerSubdialog As Boolean = True + Private clsLabsFunction As New RFunction + Private clsXlabsFunction As New RFunction + Private clsYlabsFunction As New RFunction + Private clsXScalecontinuousFunction As New RFunction + Private clsYScalecontinuousFunction As New RFunction + Private clsFacetsFunction As New RFunction + Private clsThemeFunction As New RFunction + Private dctThemeFunctions As New Dictionary(Of String, RFunction) + Private clsGeomSmoothFunc As New RFunction + Private clsCoordPolarFunction As New RFunction + Private clsCoordPolarStartOperator As New ROperator + Private clsXScaleDateFunction As New RFunction + Private clsYScaleDateFunction As New RFunction + Private clsScaleFillViridisFunction As New RFunction + Private clsScaleColourViridisFunction As New RFunction + Private clsAnnotateFunction As New RFunction + Private clsGeomRugFunction As New RFunction + 'Parameter names for geoms + Private strFirstParameterName As String = "geomfunc" + Private strGeomSmoothParameterName As String = "geom_smooth" + Private strGeomParameterNames() As String = {strFirstParameterName, strGeomSmoothParameterName} + + Private Sub dlgScatterPlot_Load(sender As Object, e As EventArgs) Handles MyBase.Load + If bFirstLoad Then + InitialiseDialog() + bFirstLoad = False + End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False + TestOkEnabled() + autoTranslate(Me) + End Sub + + Private Sub InitialiseDialog() + Dim clsGeomRugParameter As New RParameter + Dim dctSidesOptions As New Dictionary(Of String, String) + + ucrBase.iHelpTopicID = 433 + ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False + ucrBase.clsRsyntax.iCallType = 3 + + ucrSelectorForScatter.SetParameter(New RParameter("data", 0)) + ucrSelectorForScatter.SetParameterIsrfunction() + + ucrVariablesAsFactorForScatter.SetParameter(New RParameter("y", 1)) + ucrVariablesAsFactorForScatter.SetParameterIsString() + ucrVariablesAsFactorForScatter.bWithQuotes = False + ucrVariablesAsFactorForScatter.Selector = ucrSelectorForScatter + ucrVariablesAsFactorForScatter.SetFactorReceiver(ucrFactorOptionalReceiver) + ucrVariablesAsFactorForScatter.strSelectorHeading = "Variables" + ucrVariablesAsFactorForScatter.SetValuesToIgnore({Chr(34) & Chr(34)}) + ucrVariablesAsFactorForScatter.bAddParameterIfEmpty = True + + ucrReceiverX.SetParameter(New RParameter("x", 0)) + ucrReceiverX.SetParameterIsString() + ucrReceiverX.bWithQuotes = False + ucrReceiverX.Selector = ucrSelectorForScatter + ucrReceiverX.strSelectorHeading = "Variables" + ucrReceiverX.SetValuesToIgnore({Chr(34) & Chr(34)}) + ucrReceiverX.bAddParameterIfEmpty = True + + ucrReceiverLabel.SetParameter(New RParameter("label")) + ucrReceiverLabel.SetParameterIsString() + ucrReceiverLabel.bWithQuotes = False + ucrReceiverLabel.Selector = ucrSelectorForScatter + ucrReceiverLabel.strSelectorHeading = "Variables" + + ucrFactorOptionalReceiver.SetParameter(New RParameter("colour", 2)) + ucrFactorOptionalReceiver.SetParameterIsString() + ucrFactorOptionalReceiver.bWithQuotes = False + ucrFactorOptionalReceiver.Selector = ucrSelectorForScatter + ucrFactorOptionalReceiver.strSelectorHeading = "Variables" + + ucrChkLineofBestFit.SetText("Add Line of Best Fit") + ucrChkLineofBestFit.AddParameterPresentCondition(True, "geom_smooth") + ucrChkLineofBestFit.AddParameterPresentCondition(False, "geom_smooth", False) + ucrChkLineofBestFit.AddToLinkedControls(ucrChkWithSE, {True}, bNewLinkedHideIfParameterMissing:=True) + + ucrChkWithSE.SetText("With Standard Error") + ucrChkWithSE.SetParameter(New RParameter("se"), bNewAddRemoveParameter:=False, bNewChangeParameterValue:=True) + ucrChkWithSE.SetValuesCheckedAndUnchecked("TRUE", "FALSE") + ucrChkWithSE.SetRDefault("TRUE") + + ucrChkAddRugPlot.SetText("Add Rug Plot") + ucrChkAddRugPlot.AddParameterPresentCondition(True, "geom_rug") + ucrChkAddRugPlot.AddParameterPresentCondition(False, "geom_rug", False) + ucrChkAddRugPlot.AddToLinkedControls({ucrNudSize, ucrInputSides}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + + ucrSaveScatterPlot.SetPrefix("scatter_plot") + ucrSaveScatterPlot.SetSaveType(strRObjectType:=RObjectTypeLabel.Graph, + strRObjectFormat:=RObjectFormat.Image) + ucrSaveScatterPlot.SetDataFrameSelector(ucrSelectorForScatter.ucrAvailableDataFrames) + ucrSaveScatterPlot.SetCheckBoxText("Save Graph") + ucrSaveScatterPlot.SetIsComboBox() + ucrSaveScatterPlot.SetAssignToIfUncheckedValue("last_graph") + + ucrNudSize.SetParameter(New RParameter("size", 0)) + ucrNudSize.Increment = 0.1 + ucrNudSize.DecimalPlaces = 1 + + ucrInputSides.SetParameter(New RParameter("sides", 1)) + dctSidesOptions.Add("Bottom and left", Chr(34) & "bl" & Chr(34)) + dctSidesOptions.Add("Top, right and bottom", Chr(34) & "trb" & Chr(34)) + dctSidesOptions.Add("Top, right and left", Chr(34) & "trl" & Chr(34)) + dctSidesOptions.Add("Top, bottom and left", Chr(34) & "tbl" & Chr(34)) + dctSidesOptions.Add("Right, bottom and left", Chr(34) & "rbl" & Chr(34)) + dctSidesOptions.Add("Top and right", Chr(34) & "tr" & Chr(34)) + dctSidesOptions.Add("Top and bottom", Chr(34) & "tb" & Chr(34)) + dctSidesOptions.Add("Top and left", Chr(34) & "tl" & Chr(34)) + dctSidesOptions.Add("Right and bottom", Chr(34) & "rb" & Chr(34)) + dctSidesOptions.Add("Right and left", Chr(34) & "rl" & Chr(34)) + dctSidesOptions.Add("Top", Chr(34) & "t" & Chr(34)) + dctSidesOptions.Add("Right", Chr(34) & "r" & Chr(34)) + dctSidesOptions.Add("Bottom", Chr(34) & "b" & Chr(34)) + dctSidesOptions.Add("Left", Chr(34) & "l" & Chr(34)) + ucrInputSides.SetItems(dctSidesOptions) + ucrInputSides.SetRDefault(Chr(34) & "bl" & Chr(34)) + ucrInputSides.SetDropDownStyleAsNonEditable() + + ucrNudSize.SetLinkedDisplayControl(lblSize) + ucrInputSides.SetLinkedDisplayControl(lblSides) + End Sub + + Private Sub SetDefaults() + clsBaseOperator = New ROperator + clsRggplotFunction = New RFunction + clsRScatterGeomFunction = New RFunction + clsRaesFunction = New RFunction + clsGeomSmoothFunc = New RFunction + clsGeomRugFunction = New RFunction + + ucrSelectorForScatter.Reset() + ucrSelectorForScatter.SetGgplotFunction(clsBaseOperator) + ucrSaveScatterPlot.Reset() + ucrVariablesAsFactorForScatter.SetMeAsReceiver() + sdgPlots.Reset() + bResetSubdialog = True + bResetlayerSubdialog = True + + clsBaseOperator.SetOperation("+") + clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) + clsBaseOperator.AddParameter(strFirstParameterName, clsRFunctionParameter:=clsRScatterGeomFunction, iPosition:=2) + + clsRggplotFunction.SetPackageName("ggplot2") + clsRggplotFunction.SetRCommand("ggplot") + clsRggplotFunction.AddParameter("mapping", clsRFunctionParameter:=clsRaesFunction, iPosition:=1) + + clsRaesFunction.SetPackageName("ggplot2") + clsRaesFunction.SetRCommand("aes") + clsRaesFunction.AddParameter("x", Chr(34) & Chr(34)) + clsRaesFunction.AddParameter("y", Chr(34) & Chr(34)) + + clsRScatterGeomFunction.SetPackageName("ggplot2") + clsRScatterGeomFunction.SetRCommand("geom_point") + + clsGeomRugFunction.SetPackageName("ggplot2") + clsGeomRugFunction.SetRCommand("geom_rug") + clsGeomRugFunction.AddParameter("size", 0.5, iPosition:=0) + + clsBaseOperator.AddParameter(GgplotDefaults.clsDefaultThemeParameter.Clone()) + clsXlabsFunction = GgplotDefaults.clsXlabTitleFunction.Clone() + clsYlabsFunction = GgplotDefaults.clsYlabTitleFunction.Clone() + clsLabsFunction = GgplotDefaults.clsDefaultLabs.Clone() + clsXScalecontinuousFunction = GgplotDefaults.clsXScalecontinuousFunction.Clone() + clsYScalecontinuousFunction = GgplotDefaults.clsYScalecontinuousFunction.Clone() + clsFacetsFunction = GgplotDefaults.clsFacetFunction.Clone() + dctThemeFunctions = New Dictionary(Of String, RFunction)(GgplotDefaults.dctThemeFunctions) + clsCoordPolarStartOperator = GgplotDefaults.clsCoordPolarStartOperator.Clone() + clsCoordPolarFunction = GgplotDefaults.clsCoordPolarFunction.Clone() + clsThemeFunction = GgplotDefaults.clsDefaultThemeFunction + clsLocalRaesFunction = GgplotDefaults.clsAesFunction.Clone() + clsXScaleDateFunction = GgplotDefaults.clsXScaleDateFunction.Clone() + clsYScaleDateFunction = GgplotDefaults.clsYScaleDateFunction.Clone() + clsScaleFillViridisFunction = GgplotDefaults.clsScaleFillViridisFunction + clsScaleColourViridisFunction = GgplotDefaults.clsScaleColorViridisFunction + clsAnnotateFunction = GgplotDefaults.clsAnnotateFunction + + clsGeomSmoothFunc.SetPackageName("ggplot2") + clsGeomSmoothFunc.SetRCommand("geom_smooth") + clsGeomSmoothFunc.AddParameter("method", Chr(34) & "lm" & Chr(34), iPosition:=0) + clsGeomSmoothFunc.AddParameter("se", "FALSE", iPosition:=1) + + clsBaseOperator.SetAssignToRObject(strRObjectToAssignTo:="last_graph", + strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Graph, + strRObjectFormatToAssignTo:=RObjectFormat.Image, + strRDataFrameNameToAddObjectTo:=ucrSelectorForScatter.strCurrentDataFrame, + strObjectName:="last_graph") + + ucrBase.clsRsyntax.SetBaseROperator(clsBaseOperator) + End Sub + + Public Sub SetRCodeForControls(bReset As Boolean) + ucrSelectorForScatter.SetRCode(clsRggplotFunction, bReset) + ucrReceiverX.SetRCode(clsRaesFunction, bReset) + ucrReceiverLabel.SetRCode(clsRaesFunction, bReset) + ucrVariablesAsFactorForScatter.SetRCode(clsRaesFunction, bReset) + ucrFactorOptionalReceiver.SetRCode(clsRaesFunction, bReset) + ucrChkLineofBestFit.SetRCode(clsBaseOperator, bReset) + ucrSaveScatterPlot.SetRCode(clsBaseOperator, bReset) + ucrChkWithSE.SetRCode(clsGeomSmoothFunc, bReset) + ucrChkAddRugPlot.SetRCode(clsBaseOperator, bReset) + ucrNudSize.SetRCode(clsGeomRugFunction, bReset) + ucrInputSides.SetRCode(clsGeomRugFunction, bReset) + End Sub + + Private Sub TestOkEnabled() + ' Either y or x can be empty but not both + If (Not ucrSaveScatterPlot.IsComplete) OrElse (ucrVariablesAsFactorForScatter.IsEmpty AndAlso ucrReceiverX.IsEmpty()) Then + ucrBase.OKEnabled(False) + Else + ucrBase.OKEnabled(True) + End If + End Sub + + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset + SetDefaults() + SetRCodeForControls(True) + TestOkEnabled() + End Sub + + Private Sub cmdOptions_Click(sender As Object, e As EventArgs) Handles cmdOptions.Click + sdgPlots.SetRCode(clsNewOperator:=ucrBase.clsRsyntax.clsBaseOperator, clsNewGlobalAesFunction:=clsRaesFunction, clsNewYScalecontinuousFunction:=clsYScalecontinuousFunction, clsNewXScalecontinuousFunction:=clsXScalecontinuousFunction, + clsNewLabsFunction:=clsLabsFunction, clsNewXLabsTitleFunction:=clsXlabsFunction, clsNewYLabTitleFunction:=clsYlabsFunction, clsNewFacetFunction:=clsFacetsFunction, clsNewCoordPolarFunction:=clsCoordPolarFunction, + clsNewCoordPolarStartOperator:=clsCoordPolarStartOperator, clsNewThemeFunction:=clsThemeFunction, clsNewScaleFillViridisFunction:=clsScaleFillViridisFunction, clsNewScaleColourViridisFunction:=clsScaleColourViridisFunction, + clsNewXScaleDateFunction:=clsXScaleDateFunction, clsNewYScaleDateFunction:=clsYScaleDateFunction, dctNewThemeFunctions:=dctThemeFunctions, ucrNewBaseSelector:=ucrSelectorForScatter, strMainDialogGeomParameterNames:=strGeomParameterNames, + clsNewAnnotateFunction:=clsAnnotateFunction, bReset:=bResetSubdialog) + sdgPlots.ShowDialog() + bResetSubdialog = False + End Sub + + Private Sub cmdScatterPlotOptions_Click(sender As Object, e As EventArgs) Handles cmdPointOptions.Click + 'SetupLayer sends the components storing the plot info (clsRaesFunction, clsRggplotFunction, ...) of dlgScatteredPlot through to sdgLayerOptions where these will be edited. + sdgLayerOptions.SetupLayer(clsNewGgPlot:=clsRggplotFunction, clsNewGeomFunc:=clsRScatterGeomFunction, clsNewGlobalAesFunc:=clsRaesFunction, clsNewLocalAes:=clsLocalRaesFunction, bFixGeom:=True, ucrNewBaseSelector:=ucrSelectorForScatter, bApplyAesGlobally:=True, bReset:=bResetlayerSubdialog) + 'Coming from the sdgLayerOptions, clsRaesFunction and others has been modified. One then needs to display these modifications on the dlgScatteredPlot. + sdgLayerOptions.ShowDialog() + ucrReceiverLabel.SetRCode(clsRaesFunction, bReset) + bResetlayerSubdialog = False + 'The aesthetics parameters on the main dialog are repopulated as required. + For Each clsParam In clsRaesFunction.clsParameters + If clsParam.strArgumentName = "x" Then + If clsParam.strArgumentValue = Chr(34) & Chr(34) Then + ucrReceiverX.Clear() + Else + ucrReceiverX.Add(clsParam.strArgumentValue) + End If + 'In the y case, the vlue stored in the clsReasFunction in the multiplevariables case is "value", however that one shouldn't be written in the multiple variables receiver (otherwise it would stack all variables and the stack ("value") itself!). + 'Warning: what if someone used the name value for one of it's variables independently from the multiple variables method ? Here if the receiver is actually in single mode, the variable "value" will still be given back, which throws the problem back to the creation of "value" in the multiple receiver case. + ElseIf clsParam.strArgumentName = "y" AndAlso (clsParam.strArgumentValue <> "value" OrElse ucrVariablesAsFactorForScatter.bSingleVariable) Then + 'Still might be in the case of bSingleVariable with mapping y="". + If clsParam.strArgumentValue = (Chr(34) & Chr(34)) Then + ucrVariablesAsFactorForScatter.Clear() + Else ucrVariablesAsFactorForScatter.Add(clsParam.strArgumentValue) + End If + ElseIf clsParam.strArgumentName = "colour" Then + ucrFactorOptionalReceiver.Add(clsParam.strArgumentValue) + End If + Next + End Sub + + Private Sub ucrSaveScatterPlot_ContentsChanged() Handles ucrSaveScatterPlot.ControlContentsChanged, ucrReceiverX.ControlContentsChanged, ucrVariablesAsFactorForScatter.ControlContentsChanged, ucrSaveScatterPlot.ControlContentsChanged + TestOkEnabled() + End Sub + + Private Sub ucrChkLineofBestFit_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkLineofBestFit.ControlValueChanged + If ucrChkLineofBestFit.Checked Then + clsBaseOperator.AddParameter("geom_smooth", clsRFunctionParameter:=clsGeomSmoothFunc, iPosition:=4) + Else + clsBaseOperator.RemoveParameterByName("geom_smooth") + End If + End Sub + + Private Sub ucrChkAddRugPlot_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkAddRugPlot.ControlValueChanged + If ucrChkAddRugPlot.Checked Then + clsBaseOperator.AddParameter("geom_rug", clsRFunctionParameter:=clsGeomRugFunction, iPosition:=3) + Else + clsBaseOperator.RemoveParameterByName("geom_rug") + End If + End Sub End Class \ No newline at end of file diff --git a/instat/instat.vbproj b/instat/instat.vbproj index 57b55039180..ed89085f4dc 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -236,10 +236,10 @@ - + frmMaximiseOutput.vb - + Form @@ -3054,7 +3054,7 @@ dlgThreeVariablePivotTable.vb - + frmMaximiseOutput.vb Designer diff --git a/instat/ucrInputComboBox.vb b/instat/ucrInputComboBox.vb index 1ce1d001ceb..14e880c2a27 100644 --- a/instat/ucrInputComboBox.vb +++ b/instat/ucrInputComboBox.vb @@ -14,334 +14,329 @@ ' You should have received a copy of the GNU General Public License ' along with this program. If not, see . -Imports System.ComponentModel - -Public Class ucrInputComboBox - Dim _strRObjectItemsTypeLabel As String = "" - - Public Sub New() - - ' This call is required by the designer. - InitializeComponent() - - ' Add any initialization after the InitializeComponent() call. - bAllowNonConditionValues = False - End Sub - - 'temporary event which is only raised when index is changed - 'NameChanged raised any time value is set (even if it's the same) - Public Event SelectionIndexChanged() - - Private Sub cboInput_Validating(sender As Object, e As CancelEventArgs) Handles cboInput.Validating - Dim strCurrent As String - - strCurrent = cboInput.Text - If bAutoChangeOnLeave Then - If Not IsValid(strCurrent) Then - 'TODO This message should contain the same message from ValidateText() - 'Select Case MsgBox(Chr(34) & strCurrent & Chr(34) & " is an invalid name." & Environment.NewLine & "Would you like it to be automatically corrected?", vbYesNo, "Invalid Name") - ' Case MsgBoxResult.Yes - ' SetName(frmMain.clsRLink.MakeValidText(strCurrent)) - ' Case Else - ' e.Cancel = True - 'End Select - SetName(frmMain.clsRLink.MakeValidText(strCurrent)) - End If - Else - e.Cancel = Not ValidateText(strCurrent) - End If - If Not e.Cancel Then OnNameChanged() - End Sub - - Public Sub SetRObjectItemsTypeLabel(strRObjectLabel As String) - Me._strRObjectItemsTypeLabel = strRObjectLabel - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsColumns() - _strRObjectItemsTypeLabel = "Columns" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsDataFrames() - _strRObjectItemsTypeLabel = "Data Frames" - FillItemTypes() - End Sub - - - Public Sub SetItemsTypeAsFilters() - _strRObjectItemsTypeLabel = "Filters" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsColumnSelection() - _strRObjectItemsTypeLabel = "Column Selection" - - FillItemTypes() - End Sub - - - Public Sub SetItemsTypeAsKeys() - _strRObjectItemsTypeLabel = "Keys" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsLinks() - _strRObjectItemsTypeLabel = "Links" - FillItemTypes() - End Sub - - Private Sub FillItemTypes() - Select Case _strRObjectItemsTypeLabel - Case "Columns" - If ucrDataFrameSelector IsNot Nothing Then - frmMain.clsRLink.FillColumnNames(ucrDataFrameSelector.cboAvailableDataFrames.Text, cboColumns:=cboInput) - End If - Case "Keys" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetKeyNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray) - End If - Case "Data Frames" - 'TODO not yet implemented - Case RObjectTypeLabel.Graph, - RObjectTypeLabel.Table, - RObjectTypeLabel.Model, - RObjectTypeLabel.Structure_label, - RObjectTypeLabel.Summary - 'for objects that are shown in the output viewer. do the following - If Me.ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetObjectNames( - strDataFrameName:=Me.ucrDataFrameSelector.strCurrDataFrame, - strRObjectTypeLabel:=Me._strRObjectItemsTypeLabel).ToArray) - End If - Case "Filters" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) - End If - Case "Column Selection" - If ucrDataFrameSelector IsNot Nothing Then - cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetColumnSelectionNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) - End If - End Select - End Sub - - Public Sub ucrDataFrameSelector_ControlValueChanged() Handles ucrDataFrameSelector.ControlValueChanged - FillItemTypes() - End Sub - - Public Overrides Sub SetDataFrameSelector(ucrNewSelector As ucrDataFrame) - MyBase.SetDataFrameSelector(ucrNewSelector) - FillItemTypes() - End Sub - - Public Overrides Sub SetName(strName As String, Optional bSilent As Boolean = False) - MyBase.SetName(strName, bSilent) - If bSilent Then - cboInput.Text = strName - If cboInput.FindStringExact(strName) <> -1 Then - cboInput.SelectedIndex = cboInput.FindStringExact(strName) - End If - OnNameChanged() - Else - If ValidateText(strName) Then - cboInput.Text = strName - OnNameChanged() - End If - End If - End Sub - - Public Overrides Function GetText() As String - Return cboInput.Text - End Function - - Public Overrides Function GetValue() As Object - If cboInput.SelectedValue IsNot Nothing Then - Return cboInput.SelectedValue - Else - Return GetText() - End If - End Function - - Public Property GetSetSelectedIndex As Integer - Get - Return cboInput.SelectedIndex - End Get - Set(value As Integer) - cboInput.SelectedIndex = value - End Set - End Property - - Public ReadOnly Property GetItemsCount As Integer - Get - Return cboInput.Items.Count - End Get - End Property - - Public Sub SetItems(Optional strItems As String() = Nothing, Optional bClearExisting As Boolean = True, Optional bAddConditions As Boolean = False, Optional bAddQuotes As Boolean = True) - Dim dctValues As New Dictionary(Of String, String) - If bAddConditions Then - For Each strTemp As String In strItems - If bAddQuotes Then - dctValues.Add(strTemp, Chr(34) & strTemp & Chr(34)) - Else - dctValues.Add(strTemp, strTemp) - End If - Next - SetItems(dctValues, bClearExisting) - Else - If bClearExisting Then - cboInput.Items.Clear() - End If - If strItems IsNot Nothing Then - cboInput.Items.AddRange(strItems) - End If - AdjustComboBoxWidth(cboInput) - End If - End Sub - - Public Sub SetItems(dctItemParameterValuePairs As Dictionary(Of String, String), Optional bClearExisting As Boolean = True, Optional bSetConditions As Boolean = True) - Dim kvpTemp As KeyValuePair(Of String, String) - - If bClearExisting Then - cboInput.Items.Clear() - dctDisplayParameterValues.Clear() - End If - If bSetConditions Then - If GetParameter() Is Nothing Then - MsgBox("Developer error: Parameter must be set before items can be set. Modify setup for " & Name & " so that the parameter is set first.") - End If - End If - For Each kvpTemp In dctItemParameterValuePairs - cboInput.Items.Add(kvpTemp.Key) - dctDisplayParameterValues.Add(kvpTemp.Key, kvpTemp.Value) - If bSetConditions AndAlso GetParameter() IsNot Nothing Then - AddParameterValuesCondition(kvpTemp.Key, GetParameter().strArgumentName, kvpTemp.Value) - End If - Next - AdjustComboBoxWidth(cboInput) - End Sub - - Public Sub AddItems(strItems As String()) - SetItems(strItems, bClearExisting:=False) - End Sub - - Private Sub cboInput_KeyPress(sender As Object, e As KeyPressEventArgs) Handles cboInput.KeyPress - bUserTyped = True - End Sub - - 'Public Sub SetEditable(bEditable As Boolean) - - ' If bEditable Then - ' cboInput.DropDownStyle = ComboBoxStyle.DropDownList - ' Else - ' cboInput.DropDownStyle = ComboBoxStyle.DropDown - ' End If - 'End Sub - Public Overrides Function IsEmpty() As Boolean - If cboInput.Text = "" Then - Return True - Else - Return False - End If - End Function - - Private Sub ucrInputComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load - FillItemTypes() - If bFirstLoad Then - bFirstLoad = False - End If - End Sub - - Private Sub cboInput_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboInput.SelectedIndexChanged - OnNameChanged() - RaiseEvent SelectionIndexChanged() - End Sub - - Private Sub ucrInputComboBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress - 'If bIsReadOnly Then - ' e.Handled = True - 'End If - End Sub - - Private Sub cboInput_TextChanged(sender As Object, e As EventArgs) Handles cboInput.TextChanged - 'shouldn't we be raising OnControlValueChanged instead? see issue #7367 - OnControlContentsChanged() - End Sub - Private Sub cboInput_Click(sender As Object, e As EventArgs) Handles cboInput.Click - OnControlClicked() - End Sub - - Private Sub mnuRightClickCopy_Click(sender As Object, e As EventArgs) Handles mnuRightClickCopy.Click - If cboInput.SelectedText <> "" Then - Clipboard.SetText(cboInput.SelectedText) - ElseIf cboInput.DropDownStyle = ComboBoxStyle.DropDownList AndAlso cboInput.Text <> "" Then - Clipboard.SetText(cboInput.Text) - End If - End Sub - - 'This seems overly complicated, but appears only way to auto size - 'Adapted from: http://dotnetanaya.blogspot.co.uk/2012/12/vbnet-adjusting-combobox-dropdownlist.html - 'Need to make sure this is called from all places needed - 'There is no build in event to check items added - 'TODO this is repeat in clsRLink for ucrDataFrame, will not be needed once controls changed - 'Should have a place for shared methods - Public Sub AdjustComboBoxWidth(cboCurrent As ComboBox) - Dim iWidth As Integer = cboCurrent.DropDownWidth - Dim graTemp As Graphics = cboCurrent.CreateGraphics() - Dim font As Font = cboCurrent.Font - Dim iScrollBarWidth As Integer - Dim iNewWidth As Integer - - If cboCurrent.Items.Count > cboCurrent.MaxDropDownItems Then - iScrollBarWidth = SystemInformation.VerticalScrollBarWidth - Else - iScrollBarWidth = 0 - End If - - For Each strItem As String In cboCurrent.Items - iNewWidth = CInt(graTemp.MeasureString(strItem, font).Width) + iScrollBarWidth - iWidth = Math.Max(iWidth, iNewWidth) - Next - cboCurrent.DropDownWidth = iWidth - End Sub - - Public Overrides Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) - MyBase.UpdateControl(bReset:=bReset, bCloneIfNeeded:=bCloneIfNeeded) - End Sub - - Public Sub SetDropDownStyleAsNonEditable() - cboInput.DropDownStyle = ComboBoxStyle.DropDownList - cboInput.AutoCompleteMode = AutoCompleteMode.None - cboInput.AutoCompleteSource = AutoCompleteSource.None - End Sub - - Public Sub SetDropDownStyleAsEditable(bAdditionsAllowed As Boolean) - cboInput.DropDownStyle = ComboBoxStyle.DropDown - cboInput.AutoCompleteMode = AutoCompleteMode.Append - cboInput.AutoCompleteSource = AutoCompleteSource.ListItems - 'TODO implement validation settings for this - If bAdditionsAllowed Then - - Else - - End If - End Sub - - Public Sub SetDataSource(objDataSource As Object, Optional strDisplayMember As String = "", Optional strValueMember As String = "") - cboInput.DataSource = objDataSource - If strDisplayMember <> "" Then - cboInput.DisplayMember = strDisplayMember - End If - If strValueMember <> "" Then - cboInput.ValueMember = strValueMember - End If - End Sub - - Friend Sub AddToReceiverAtCursorPosition(v As String) - Throw New NotImplementedException() - End Sub +Imports System.ComponentModel + +Public Class ucrInputComboBox + Private _strRObjectItemsTypeLabel As String = "" + + Public Sub New() + + ' This call is required by the designer. + InitializeComponent() + + ' Add any initialization after the InitializeComponent() call. + bAllowNonConditionValues = False + End Sub + + 'temporary event which is only raised when index is changed + 'NameChanged raised any time value is set (even if it's the same) + Public Event SelectionIndexChanged() + + Private Sub cboInput_Validating(sender As Object, e As CancelEventArgs) Handles cboInput.Validating + Dim strCurrent As String + + strCurrent = cboInput.Text + If bAutoChangeOnLeave Then + If Not IsValid(strCurrent) Then + 'TODO This message should contain the same message from ValidateText() + 'Select Case MsgBox(Chr(34) & strCurrent & Chr(34) & " is an invalid name." & Environment.NewLine & "Would you like it to be automatically corrected?", vbYesNo, "Invalid Name") + ' Case MsgBoxResult.Yes + ' SetName(frmMain.clsRLink.MakeValidText(strCurrent)) + ' Case Else + ' e.Cancel = True + 'End Select + SetName(frmMain.clsRLink.MakeValidText(strCurrent)) + End If + Else + e.Cancel = Not ValidateText(strCurrent) + End If + If Not e.Cancel Then OnNameChanged() + End Sub + + Public Sub SetRObjectItemsTypeLabel(strRObjectItemsTypeLabel As String) + _strRObjectItemsTypeLabel = strRObjectItemsTypeLabel + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsColumns() + _strRObjectItemsTypeLabel = "Columns" + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsDataFrames() + _strRObjectItemsTypeLabel = "Data Frames" + FillItemTypes() + End Sub + + + Public Sub SetItemsTypeAsFilters() + _strRObjectItemsTypeLabel = "Filters" + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsColumnSelection() + _strRObjectItemsTypeLabel = "Column Selection" + + FillItemTypes() + End Sub + + + Public Sub SetItemsTypeAsKeys() + _strRObjectItemsTypeLabel = "Keys" + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsLinks() + _strRObjectItemsTypeLabel = "Links" + FillItemTypes() + End Sub + + Private Sub FillItemTypes() + If ucrDataFrameSelector Is Nothing Then + Exit Sub + End If + + Select Case _strRObjectItemsTypeLabel + Case "Columns" + frmMain.clsRLink.FillColumnNames(ucrDataFrameSelector.cboAvailableDataFrames.Text, cboColumns:=cboInput) + Case "Keys" + cboInput.Items.Clear() + cboInput.Items.AddRange(frmMain.clsRLink.GetKeyNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray) + Case "Data Frames" + 'TODO not yet implemented + Case RObjectTypeLabel.Graph, + RObjectTypeLabel.Table, + RObjectTypeLabel.Model, + RObjectTypeLabel.Structure_label, + RObjectTypeLabel.Summary + 'for objects that are shown in the output viewer. do the following + cboInput.Items.Clear() + cboInput.Items.AddRange(frmMain.clsRLink.GetObjectNames( + strDataFrameName:=Me.ucrDataFrameSelector.strCurrDataFrame, + strRObjectTypeLabel:=Me._strRObjectItemsTypeLabel).ToArray) + + Case "Filters" + cboInput.Items.Clear() + cboInput.Items.AddRange(frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) + Case "Column Selection" + cboInput.Items.Clear() + cboInput.Items.AddRange(frmMain.clsRLink.GetColumnSelectionNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) + End Select + End Sub + + Public Sub ucrDataFrameSelector_ControlValueChanged() Handles ucrDataFrameSelector.ControlValueChanged + FillItemTypes() + End Sub + + Public Overrides Sub SetDataFrameSelector(ucrNewSelector As ucrDataFrame) + MyBase.SetDataFrameSelector(ucrNewSelector) + FillItemTypes() + End Sub + + Public Overrides Sub SetName(strName As String, Optional bSilent As Boolean = False) + MyBase.SetName(strName, bSilent) + If bSilent Then + cboInput.Text = strName + If cboInput.FindStringExact(strName) <> -1 Then + cboInput.SelectedIndex = cboInput.FindStringExact(strName) + End If + OnNameChanged() + Else + If ValidateText(strName) Then + cboInput.Text = strName + OnNameChanged() + End If + End If + End Sub + + Public Overrides Function GetText() As String + Return cboInput.Text + End Function + + Public Overrides Function GetValue() As Object + If cboInput.SelectedValue IsNot Nothing Then + Return cboInput.SelectedValue + Else + Return GetText() + End If + End Function + + Public Property GetSetSelectedIndex As Integer + Get + Return cboInput.SelectedIndex + End Get + Set(value As Integer) + cboInput.SelectedIndex = value + End Set + End Property + + Public ReadOnly Property GetItemsCount As Integer + Get + Return cboInput.Items.Count + End Get + End Property + + Public Sub SetItems(Optional strItems As String() = Nothing, Optional bClearExisting As Boolean = True, Optional bAddConditions As Boolean = False, Optional bAddQuotes As Boolean = True) + Dim dctValues As New Dictionary(Of String, String) + If bAddConditions Then + For Each strTemp As String In strItems + If bAddQuotes Then + dctValues.Add(strTemp, Chr(34) & strTemp & Chr(34)) + Else + dctValues.Add(strTemp, strTemp) + End If + Next + SetItems(dctValues, bClearExisting) + Else + If bClearExisting Then + cboInput.Items.Clear() + End If + If strItems IsNot Nothing Then + cboInput.Items.AddRange(strItems) + End If + AdjustComboBoxWidth(cboInput) + End If + End Sub + + Public Sub SetItems(dctItemParameterValuePairs As Dictionary(Of String, String), Optional bClearExisting As Boolean = True, Optional bSetConditions As Boolean = True) + Dim kvpTemp As KeyValuePair(Of String, String) + + If bClearExisting Then + cboInput.Items.Clear() + dctDisplayParameterValues.Clear() + End If + If bSetConditions Then + If GetParameter() Is Nothing Then + MsgBox("Developer error: Parameter must be set before items can be set. Modify setup for " & Name & " so that the parameter is set first.") + End If + End If + For Each kvpTemp In dctItemParameterValuePairs + cboInput.Items.Add(kvpTemp.Key) + dctDisplayParameterValues.Add(kvpTemp.Key, kvpTemp.Value) + If bSetConditions AndAlso GetParameter() IsNot Nothing Then + AddParameterValuesCondition(kvpTemp.Key, GetParameter().strArgumentName, kvpTemp.Value) + End If + Next + AdjustComboBoxWidth(cboInput) + End Sub + + Public Sub AddItems(strItems As String()) + SetItems(strItems, bClearExisting:=False) + End Sub + + Private Sub cboInput_KeyPress(sender As Object, e As KeyPressEventArgs) Handles cboInput.KeyPress + bUserTyped = True + End Sub + + 'Public Sub SetEditable(bEditable As Boolean) + + ' If bEditable Then + ' cboInput.DropDownStyle = ComboBoxStyle.DropDownList + ' Else + ' cboInput.DropDownStyle = ComboBoxStyle.DropDown + ' End If + 'End Sub + Public Overrides Function IsEmpty() As Boolean + If cboInput.Text = "" Then + Return True + Else + Return False + End If + End Function + + Private Sub ucrInputComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load + FillItemTypes() + If bFirstLoad Then + bFirstLoad = False + End If + End Sub + + Private Sub cboInput_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboInput.SelectedIndexChanged + OnNameChanged() + RaiseEvent SelectionIndexChanged() + End Sub + + Private Sub ucrInputComboBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress + 'If bIsReadOnly Then + ' e.Handled = True + 'End If + End Sub + + Private Sub cboInput_TextChanged(sender As Object, e As EventArgs) Handles cboInput.TextChanged + 'shouldn't we be raising OnControlValueChanged instead? see issue #7367 + OnControlContentsChanged() + End Sub + Private Sub cboInput_Click(sender As Object, e As EventArgs) Handles cboInput.Click + OnControlClicked() + End Sub + + Private Sub mnuRightClickCopy_Click(sender As Object, e As EventArgs) Handles mnuRightClickCopy.Click + If cboInput.SelectedText <> "" Then + Clipboard.SetText(cboInput.SelectedText) + ElseIf cboInput.DropDownStyle = ComboBoxStyle.DropDownList AndAlso cboInput.Text <> "" Then + Clipboard.SetText(cboInput.Text) + End If + End Sub + + 'This seems overly complicated, but appears only way to auto size + 'Adapted from: http://dotnetanaya.blogspot.co.uk/2012/12/vbnet-adjusting-combobox-dropdownlist.html + 'Need to make sure this is called from all places needed + 'There is no build in event to check items added + 'TODO this is repeat in clsRLink for ucrDataFrame, will not be needed once controls changed + 'Should have a place for shared methods + Public Sub AdjustComboBoxWidth(cboCurrent As ComboBox) + Dim iWidth As Integer = cboCurrent.DropDownWidth + Dim graTemp As Graphics = cboCurrent.CreateGraphics() + Dim font As Font = cboCurrent.Font + Dim iScrollBarWidth As Integer + Dim iNewWidth As Integer + + If cboCurrent.Items.Count > cboCurrent.MaxDropDownItems Then + iScrollBarWidth = SystemInformation.VerticalScrollBarWidth + Else + iScrollBarWidth = 0 + End If + + For Each strItem As String In cboCurrent.Items + iNewWidth = CInt(graTemp.MeasureString(strItem, font).Width) + iScrollBarWidth + iWidth = Math.Max(iWidth, iNewWidth) + Next + cboCurrent.DropDownWidth = iWidth + End Sub + + Public Overrides Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) + MyBase.UpdateControl(bReset:=bReset, bCloneIfNeeded:=bCloneIfNeeded) + End Sub + + Public Sub SetDropDownStyleAsNonEditable() + cboInput.DropDownStyle = ComboBoxStyle.DropDownList + cboInput.AutoCompleteMode = AutoCompleteMode.None + cboInput.AutoCompleteSource = AutoCompleteSource.None + End Sub + + Public Sub SetDropDownStyleAsEditable(bAdditionsAllowed As Boolean) + cboInput.DropDownStyle = ComboBoxStyle.DropDown + cboInput.AutoCompleteMode = AutoCompleteMode.Append + cboInput.AutoCompleteSource = AutoCompleteSource.ListItems + 'TODO implement validation settings for this + If bAdditionsAllowed Then + + Else + + End If + End Sub + + Public Sub SetDataSource(objDataSource As Object, Optional strDisplayMember As String = "", Optional strValueMember As String = "") + cboInput.DataSource = objDataSource + If strDisplayMember <> "" Then + cboInput.DisplayMember = strDisplayMember + End If + If strValueMember <> "" Then + cboInput.ValueMember = strValueMember + End If + End Sub + + Friend Sub AddToReceiverAtCursorPosition(v As String) + Throw New NotImplementedException() + End Sub End Class \ No newline at end of file diff --git a/instat/ucrSave.vb b/instat/ucrSave.vb index bf87ec939fb..e1fa34a9ad9 100644 --- a/instat/ucrSave.vb +++ b/instat/ucrSave.vb @@ -654,8 +654,9 @@ Public Class ucrSave clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix, bDataFrameList:=bDataFrameList, strDataFrameNames:=strDataFrameNames) Case RObjectTypeLabel.Graph, RObjectTypeLabel.Summary, - RObjectTypeLabel.Table - If Me._strRObjectLabel = RObjectTypeLabel.Table AndAlso String.IsNullOrEmpty(Me._strRObjectFormat) Then + RObjectTypeLabel.Table, + RObjectTypeLabel.Model + If _strRObjectLabel = RObjectTypeLabel.Table AndAlso String.IsNullOrEmpty(_strRObjectFormat) Then 'todo. temporary check until all table dialogs are modified to set _strRObjectFormat clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, @@ -663,14 +664,12 @@ Public Class ucrSave bAssignToIsPrefix:=bAssignToIsPrefix) Else clsTempCode.SetAssignToRObject(strRObjectToAssignTo:=strSaveName, - strRObjectTypeLabelToAssignTo:=Me._strRObjectLabel, - strRObjectFormatToAssignTo:=Me._strRObjectFormat, + strRObjectTypeLabelToAssignTo:=_strRObjectLabel, + strRObjectFormatToAssignTo:=_strRObjectFormat, strRDataFrameNameToAddObjectTo:=strDataName, strObjectName:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix) End If - Case "model" - clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, strTempModel:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix) Case "surv" clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, strTempSurv:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix) End Select From dd4ecd4fb8d7ba648fbbb937d67af6f0f76a58d5 Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Thu, 22 Sep 2022 16:15:35 +0300 Subject: [PATCH 026/122] adding the functions --- instat/ucrFactor.Designer.vb | 6 +-- instat/ucrFactor.vb | 71 ++++++++++++------------------------ instat/ucrFilter.Designer.vb | 26 ------------- instat/ucrFilter.vb | 26 ++----------- 4 files changed, 31 insertions(+), 98 deletions(-) diff --git a/instat/ucrFactor.Designer.vb b/instat/ucrFactor.Designer.vb index 2315be73550..1f9eb0755f5 100644 --- a/instat/ucrFactor.Designer.vb +++ b/instat/ucrFactor.Designer.vb @@ -69,11 +69,11 @@ Partial Class ucrFactor ' Me.lblSelected.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lblSelected.AutoSize = True - Me.lblSelected.Location = New System.Drawing.Point(180, 8) + Me.lblSelected.Location = New System.Drawing.Point(172, 8) Me.lblSelected.Name = "lblSelected" - Me.lblSelected.Size = New System.Drawing.Size(49, 13) + Me.lblSelected.Size = New System.Drawing.Size(52, 13) Me.lblSelected.TabIndex = 33 - Me.lblSelected.Text = "Selected" + Me.lblSelected.Text = "Selected:" ' 'btnSelectAll ' diff --git a/instat/ucrFactor.vb b/instat/ucrFactor.vb index b01a2988e0b..a0840124534 100644 --- a/instat/ucrFactor.vb +++ b/instat/ucrFactor.vb @@ -151,11 +151,9 @@ Public Class ucrFactor End Set End Property - Private Sub ucrFactor_Load(sender As Object, e As EventArgs) Handles Me.Load 'the grid will always have 1 sheet. So no need to display the sheet tab control grdFactorData.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, False) - SetToggleButtonSettings() End Sub Private Sub _ucrLinkedReceiver_ControlValueChanged(ucrChangedControl As ucrCore) Handles _ucrLinkedReceiver.ControlValueChanged @@ -166,7 +164,6 @@ Public Class ucrFactor 'todo Once the receiver is refactored this comment can be removed. FillGridWithNewDataSheet() - SetToggleButtonSettings() End Sub Private Sub _grdSheet_BeforeCut(sender As Object, e As BeforeRangeOperationEventArgs) Handles _grdSheet.BeforeCut @@ -360,7 +357,6 @@ Public Class ucrFactor RaiseEvent GridContentReFilledFromR() OnControlValueChanged() End If - SetToggleButtonSettings() End Sub ''' @@ -383,7 +379,6 @@ Public Class ucrFactor 'todo removal of this Visibility setting can removed once ucrFilter has been fully refactored 'see issue #7408 comments grdFactorData.Visible = False - SetToggleButtonSettings() End Sub ''' @@ -617,11 +612,13 @@ Public Class ucrFactor End Function Private Function GetColumnIndex(grdSheet As unvell.ReoGrid.Worksheet, strColName As String) As Integer - For i As Integer = 0 To grdSheet.Columns - 1 - If grdSheet.ColumnHeaders(i).Text = strColName Then - Return i - End If - Next + If _grdSheet IsNot Nothing Then + For i As Integer = 0 To grdSheet.Columns - 1 + If grdSheet.ColumnHeaders(i).Text = strColName Then + Return i + End If + Next + End If Return -1 End Function @@ -730,19 +727,16 @@ Public Class ucrFactor Return False End Function - Public Function CountRowSelected() As Integer - 'only multiple select state supports this - If _grdSheet Is Nothing OrElse _enumControlState = ControlStates.NormalGrid Then - Return False - End If - + Private Function CountRowSelected() As Integer Dim iSelectorColumnIndex As Integer = GetColumnIndex(_grdSheet, DefaultColumnNames.SelectorColumn) Dim iCount As Integer = 0 - For i = 0 To _grdSheet.Rows - 1 - If DirectCast(_grdSheet(i, iSelectorColumnIndex), Boolean) Then - iCount += 1 - End If - Next + If _grdSheet IsNot Nothing Then + For i = 0 To _grdSheet.Rows - 1 + If DirectCast(_grdSheet(i, iSelectorColumnIndex), Boolean) Then + iCount += 1 + End If + Next + End If Return iCount End Function @@ -921,35 +915,11 @@ Public Class ucrFactor End Sub Private Sub btnSelectAll_Click(sender As Object, e As EventArgs) Handles btnSelectAll.Click - 'lblSelected.Text = "Selected" & Me.CountRowSelected - Me.SelectAllGridRows(Not Me.IsAllGridRowsSelected()) - SetToggleButtonSettings() - 'If Me.IsAllGridRowsSelected Then - ' btnSelectAll.Text = Translations.GetTranslation("Deselect All") - ' btnSelectAll.FlatStyle = FlatStyle.Flat - 'Else - ' btnSelectAll.Text = Translations.GetTranslation("Select All") - ' btnSelectAll.FlatStyle = FlatStyle.Popup - 'End If - If Not _grdSheet Is Nothing Then - btnSelectAll.Visible = True - SetToggleButtonSettings() - End If + SelectAllGridRows(Not IsAllGridRowsSelected()) End Sub - Private Sub lblSelected_Click(sender As Object, e As EventArgs) Handles lblSelected.Click - 'lblSelected.Text = "Selected" & Me.CountRowSelected() - 'SelectAllGridRows(Not IsAllGridRowsSelected()) - SetToggleButtonSettings() - 'lblSelected.Text = "Selected" & Me.CountRowSelected - - - End Sub Private Sub SetToggleButtonSettings() - lblSelected.Text = "Selected" & Me.CountRowSelected - lblSelected.Visible = Me.CountRowSelected > 0 - - If Me.IsAllGridRowsSelected Then + If IsAllGridRowsSelected() Then btnSelectAll.Text = Translations.GetTranslation("Deselect All") btnSelectAll.FlatStyle = FlatStyle.Flat Else @@ -957,4 +927,11 @@ Public Class ucrFactor btnSelectAll.FlatStyle = FlatStyle.Popup End If End Sub + + Public Sub SetColumnsSelected() + lblSelected.Text = "Selected:" & CountRowSelected() + lblSelected.Visible = CountRowSelected() > 0 + lblSelected.ForeColor = Color.Red + SetToggleButtonSettings() + End Sub End Class \ No newline at end of file diff --git a/instat/ucrFilter.Designer.vb b/instat/ucrFilter.Designer.vb index 23e7f890269..ed3075a896b 100644 --- a/instat/ucrFilter.Designer.vb +++ b/instat/ucrFilter.Designer.vb @@ -39,9 +39,7 @@ Partial Class ucrFilter _ Private Sub InitializeComponent() Me.components = New System.ComponentModel.Container() - Me.lblSelectLevels = New System.Windows.Forms.Label() Me.cmdAddCondition = New System.Windows.Forms.Button() - Me.cmdToggleSelectAll = New System.Windows.Forms.Button() Me.lstFilters = New System.Windows.Forms.ListView() Me.lblFilterPreview = New System.Windows.Forms.Label() Me.lblFilterBy = New System.Windows.Forms.Label() @@ -84,16 +82,6 @@ Partial Class ucrFilter Me.grpNumeric.SuspendLayout() Me.SuspendLayout() ' - 'lblSelectLevels - ' - Me.lblSelectLevels.AutoSize = True - Me.lblSelectLevels.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSelectLevels.Location = New System.Drawing.Point(413, 48) - Me.lblSelectLevels.Name = "lblSelectLevels" - Me.lblSelectLevels.Size = New System.Drawing.Size(74, 13) - Me.lblSelectLevels.TabIndex = 3 - Me.lblSelectLevels.Text = "Select Levels:" - ' 'cmdAddCondition ' Me.cmdAddCondition.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) @@ -106,16 +94,6 @@ Partial Class ucrFilter Me.cmdAddCondition.Text = "Add Condition" Me.cmdAddCondition.UseVisualStyleBackColor = True ' - 'cmdToggleSelectAll - ' - Me.cmdToggleSelectAll.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdToggleSelectAll.Location = New System.Drawing.Point(598, 363) - Me.cmdToggleSelectAll.Name = "cmdToggleSelectAll" - Me.cmdToggleSelectAll.Size = New System.Drawing.Size(169, 23) - Me.cmdToggleSelectAll.TabIndex = 7 - Me.cmdToggleSelectAll.Text = "Select All Levels" - Me.cmdToggleSelectAll.UseVisualStyleBackColor = True - ' 'lstFilters ' Me.lstFilters.HideSelection = False @@ -582,9 +560,7 @@ Partial Class ucrFilter Me.Controls.Add(Me.ucrFilterPreview) Me.Controls.Add(Me.lblFilterPreview) Me.Controls.Add(Me.lstFilters) - Me.Controls.Add(Me.cmdToggleSelectAll) Me.Controls.Add(Me.cmdAddCondition) - Me.Controls.Add(Me.lblSelectLevels) Me.Controls.Add(Me.ucrFilterByReceiver) Me.Controls.Add(Me.ucrSelectorForFitler) Me.Controls.Add(Me.ucrChkNotForAllConditions) @@ -602,10 +578,8 @@ Partial Class ucrFilter Friend WithEvents ucrSelectorForFitler As ucrSelectorByDataFrameAddRemove Friend WithEvents ucrFilterByReceiver As ucrReceiverSingle Friend WithEvents ucrFactorLevels As ucrFactor - Friend WithEvents lblSelectLevels As Label Friend WithEvents cmdAddCondition As Button Friend WithEvents ucrFilterOperation As ucrInputComboBox - Friend WithEvents cmdToggleSelectAll As Button Friend WithEvents lstFilters As ListView Friend WithEvents lblFilterPreview As Label Friend WithEvents ucrFilterPreview As ucrInputTextBox diff --git a/instat/ucrFilter.vb b/instat/ucrFilter.vb index 9057d7b254e..f41d0866c7f 100644 --- a/instat/ucrFilter.vb +++ b/instat/ucrFilter.vb @@ -100,23 +100,17 @@ Public Class ucrFilter Private Sub VariableTypeProperties() ucrReceiverExpression.Visible = False - lblSelectLevels.Visible = False ucrFactorLevels.Visible = False - cmdToggleSelectAll.Visible = False ucrFilterOperation.Visible = False ucrLogicalCombobox.Visible = False ucrDatePicker.Visible = False grpNumeric.Visible = False If Not ucrFilterByReceiver.IsEmpty() Then If ucrFilterByReceiver.strCurrDataType.ToLower.Contains("factor") Then - lblSelectLevels.Visible = True ucrFactorLevels.Visible = True - cmdToggleSelectAll.Visible = True - 'lblSelectLevels.Text = "Select Levels:" & ucrFactorLevels.CountRowSelected 'ucrFactorLevels.SetSelectionAllLevels(False) 'by default don't select any factors - SetToggleButtonSettings() - Else - ucrFilterOperation.Visible = True + Else + ucrFilterOperation.Visible = True If ucrFilterOperation.GetText() <> "is.na" AndAlso ucrFilterOperation.GetText() <> "! is.na" AndAlso ucrFilterOperation.GetText() <> "is.empty" AndAlso ucrFilterOperation.GetText() <> "! is.empty" Then Select Case ucrFilterByReceiver.strCurrDataType.ToLower Case "logical" @@ -156,16 +150,6 @@ Public Class ucrFilter End If End Sub - Private Sub SetToggleButtonSettings() - If ucrFactorLevels.IsAllGridRowsSelected Then - cmdToggleSelectAll.Text = Translations.GetTranslation("Deselect All Levels") - cmdToggleSelectAll.FlatStyle = FlatStyle.Flat - Else - cmdToggleSelectAll.Text = Translations.GetTranslation("Select All Levels") - cmdToggleSelectAll.FlatStyle = FlatStyle.Popup - End If - End Sub - Private Sub ucrValueForFilter_ContentsChanged() CheckAddEnabled() End Sub @@ -244,14 +228,13 @@ Public Class ucrFilter RaiseEvent FilterChanged() End Sub - Private Sub cmdToggleSelectAll_Click(sender As Object, e As EventArgs) Handles cmdToggleSelectAll.Click + Private Sub cmdToggleSelectAll_Click(sender As Object, e As EventArgs) ucrFactorLevels.SelectAllGridRows(Not ucrFactorLevels.IsAllGridRowsSelected()) End Sub Private Sub ucrFactorLevels_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrFactorLevels.ControlValueChanged - lblSelectLevels.Text = "Select Levels:" & ucrFactorLevels.CountRowSelected - SetToggleButtonSettings() CheckAddEnabled() + ucrFactorLevels.SetColumnsSelected() End Sub Private Sub ucrSelectorForFitler_DataFrameChanged() Handles ucrSelectorForFitler.DataFrameChanged @@ -437,5 +420,4 @@ Public Class ucrFilter ucrFilterPreview.SetName(strFilter) End Sub - End Class From 41694c1c032ff720ca6a706633b7fd1e6d02066c Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Fri, 23 Sep 2022 12:57:26 +0300 Subject: [PATCH 027/122] Reduce the the spaces. --- instat/sdgExtremesMethod.Designer.vb | 407 ++++++++++++++------------- instat/sdgExtremesMethod.vb | 2 +- 2 files changed, 209 insertions(+), 200 deletions(-) diff --git a/instat/sdgExtremesMethod.Designer.vb b/instat/sdgExtremesMethod.Designer.vb index 669d809a460..041dc950f53 100644 --- a/instat/sdgExtremesMethod.Designer.vb +++ b/instat/sdgExtremesMethod.Designer.vb @@ -24,7 +24,11 @@ Partial Class sdgExtremesMethod Private Sub InitializeComponent() Me.tbConfidenceInterval = New System.Windows.Forms.TabPage() Me.lblReturnLevel = New System.Windows.Forms.Label() + Me.ucrChkType = New instat.ucrCheck() + Me.ucrNudReturnLevel = New instat.ucrNud() + Me.ucrInputType = New instat.ucrInputComboBox() Me.tbDisplayOptions = New System.Windows.Forms.TabPage() + Me.ucrSavePlots = New instat.ucrSave() Me.grpPlots = New System.Windows.Forms.GroupBox() Me.rdoNoPlot = New System.Windows.Forms.RadioButton() Me.rdoTrace = New System.Windows.Forms.RadioButton() @@ -36,30 +40,26 @@ Partial Class sdgExtremesMethod Me.rdoQQPlot = New System.Windows.Forms.RadioButton() Me.rdoQQ2 = New System.Windows.Forms.RadioButton() Me.rdoPrimary = New System.Windows.Forms.RadioButton() + Me.ucrPnlDisplayOptionsExtreme = New instat.UcrPanel() Me.tbRegOptions = New System.Windows.Forms.TabControl() Me.tbFitMethod = New System.Windows.Forms.TabPage() + Me.ucrInputPrior = New instat.ucrInputTextBox() Me.lblPrior = New System.Windows.Forms.Label() Me.rdoMle = New System.Windows.Forms.RadioButton() Me.rdoBayesian = New System.Windows.Forms.RadioButton() Me.rdoGMLE = New System.Windows.Forms.RadioButton() Me.rdoLmoments = New System.Windows.Forms.RadioButton() + Me.ucrNudNumberOfIterations = New instat.ucrNud() Me.lblNumberOfIterations = New System.Windows.Forms.Label() Me.grpFitMethod = New System.Windows.Forms.GroupBox() + Me.ucrPnlFitMethodExtremes = New instat.UcrPanel() Me.grpInitial = New System.Windows.Forms.GroupBox() - Me.lblLocation = New System.Windows.Forms.Label() - Me.lblScale = New System.Windows.Forms.Label() - Me.lblShape = New System.Windows.Forms.Label() Me.ucrNudScale = New instat.ucrNud() Me.ucrNudLocation = New instat.ucrNud() + Me.lblLocation = New System.Windows.Forms.Label() Me.ucrNudShape = New instat.ucrNud() - Me.ucrInputPrior = New instat.ucrInputTextBox() - Me.ucrNudNumberOfIterations = New instat.ucrNud() - Me.ucrPnlFitMethodExtremes = New instat.UcrPanel() - Me.ucrSavePlots = New instat.ucrSave() - Me.ucrPnlDisplayOptionsExtreme = New instat.UcrPanel() - Me.ucrChkType = New instat.ucrCheck() - Me.ucrNudReturnLevel = New instat.ucrNud() - Me.ucrInputType = New instat.ucrInputComboBox() + Me.lblScale = New System.Windows.Forms.Label() + Me.lblShape = New System.Windows.Forms.Label() Me.ucrBase = New instat.ucrButtonsSubdialogue() Me.tbConfidenceInterval.SuspendLayout() Me.tbDisplayOptions.SuspendLayout() @@ -76,10 +76,11 @@ Partial Class sdgExtremesMethod Me.tbConfidenceInterval.Controls.Add(Me.ucrChkType) Me.tbConfidenceInterval.Controls.Add(Me.ucrNudReturnLevel) Me.tbConfidenceInterval.Controls.Add(Me.ucrInputType) - Me.tbConfidenceInterval.Location = New System.Drawing.Point(4, 22) + Me.tbConfidenceInterval.Location = New System.Drawing.Point(4, 29) + Me.tbConfidenceInterval.Margin = New System.Windows.Forms.Padding(4) Me.tbConfidenceInterval.Name = "tbConfidenceInterval" - Me.tbConfidenceInterval.Padding = New System.Windows.Forms.Padding(3) - Me.tbConfidenceInterval.Size = New System.Drawing.Size(363, 285) + Me.tbConfidenceInterval.Padding = New System.Windows.Forms.Padding(4) + Me.tbConfidenceInterval.Size = New System.Drawing.Size(548, 433) Me.tbConfidenceInterval.TabIndex = 2 Me.tbConfidenceInterval.Tag = "Save" Me.tbConfidenceInterval.Text = "Confidence Interval" @@ -88,26 +89,71 @@ Partial Class sdgExtremesMethod 'lblReturnLevel ' Me.lblReturnLevel.AutoSize = True - Me.lblReturnLevel.Location = New System.Drawing.Point(237, 11) - Me.lblReturnLevel.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) + Me.lblReturnLevel.Location = New System.Drawing.Point(356, 16) Me.lblReturnLevel.Name = "lblReturnLevel" - Me.lblReturnLevel.Size = New System.Drawing.Size(71, 13) + Me.lblReturnLevel.Size = New System.Drawing.Size(103, 20) Me.lblReturnLevel.TabIndex = 3 Me.lblReturnLevel.Text = "Return Level:" ' + 'ucrChkType + ' + Me.ucrChkType.AutoSize = True + Me.ucrChkType.Checked = False + Me.ucrChkType.Location = New System.Drawing.Point(12, 14) + Me.ucrChkType.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrChkType.Name = "ucrChkType" + Me.ucrChkType.Size = New System.Drawing.Size(150, 51) + Me.ucrChkType.TabIndex = 0 + ' + 'ucrNudReturnLevel + ' + Me.ucrNudReturnLevel.AutoSize = True + Me.ucrNudReturnLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudReturnLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudReturnLevel.Location = New System.Drawing.Point(466, 14) + Me.ucrNudReturnLevel.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudReturnLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudReturnLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudReturnLevel.Name = "ucrNudReturnLevel" + Me.ucrNudReturnLevel.Size = New System.Drawing.Size(75, 30) + Me.ucrNudReturnLevel.TabIndex = 2 + Me.ucrNudReturnLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrInputType + ' + Me.ucrInputType.AddQuotesIfUnrecognised = True + Me.ucrInputType.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputType.GetSetSelectedIndex = -1 + Me.ucrInputType.IsReadOnly = False + Me.ucrInputType.Location = New System.Drawing.Point(164, 18) + Me.ucrInputType.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) + Me.ucrInputType.Name = "ucrInputType" + Me.ucrInputType.Size = New System.Drawing.Size(176, 32) + Me.ucrInputType.TabIndex = 1 + ' 'tbDisplayOptions ' Me.tbDisplayOptions.Controls.Add(Me.ucrSavePlots) Me.tbDisplayOptions.Controls.Add(Me.grpPlots) - Me.tbDisplayOptions.Location = New System.Drawing.Point(4, 22) + Me.tbDisplayOptions.Location = New System.Drawing.Point(4, 29) + Me.tbDisplayOptions.Margin = New System.Windows.Forms.Padding(4) Me.tbDisplayOptions.Name = "tbDisplayOptions" - Me.tbDisplayOptions.Padding = New System.Windows.Forms.Padding(3) - Me.tbDisplayOptions.Size = New System.Drawing.Size(363, 285) + Me.tbDisplayOptions.Padding = New System.Windows.Forms.Padding(4) + Me.tbDisplayOptions.Size = New System.Drawing.Size(548, 433) Me.tbDisplayOptions.TabIndex = 1 Me.tbDisplayOptions.Tag = "Graphics" Me.tbDisplayOptions.Text = "Display Options" Me.tbDisplayOptions.UseVisualStyleBackColor = True ' + 'ucrSavePlots + ' + Me.ucrSavePlots.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrSavePlots.Location = New System.Drawing.Point(28, 238) + Me.ucrSavePlots.Margin = New System.Windows.Forms.Padding(6, 8, 6, 8) + Me.ucrSavePlots.Name = "ucrSavePlots" + Me.ucrSavePlots.Size = New System.Drawing.Size(392, 36) + Me.ucrSavePlots.TabIndex = 3 + ' 'grpPlots ' Me.grpPlots.Controls.Add(Me.rdoNoPlot) @@ -121,9 +167,11 @@ Partial Class sdgExtremesMethod Me.grpPlots.Controls.Add(Me.rdoQQ2) Me.grpPlots.Controls.Add(Me.rdoPrimary) Me.grpPlots.Controls.Add(Me.ucrPnlDisplayOptionsExtreme) - Me.grpPlots.Location = New System.Drawing.Point(19, 9) + Me.grpPlots.Location = New System.Drawing.Point(28, 14) + Me.grpPlots.Margin = New System.Windows.Forms.Padding(4) Me.grpPlots.Name = "grpPlots" - Me.grpPlots.Size = New System.Drawing.Size(261, 141) + Me.grpPlots.Padding = New System.Windows.Forms.Padding(4) + Me.grpPlots.Size = New System.Drawing.Size(392, 212) Me.grpPlots.TabIndex = 2 Me.grpPlots.TabStop = False Me.grpPlots.Text = "Plots" @@ -132,9 +180,10 @@ Partial Class sdgExtremesMethod ' Me.rdoNoPlot.AutoSize = True Me.rdoNoPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoNoPlot.Location = New System.Drawing.Point(13, 22) + Me.rdoNoPlot.Location = New System.Drawing.Point(20, 33) + Me.rdoNoPlot.Margin = New System.Windows.Forms.Padding(4) Me.rdoNoPlot.Name = "rdoNoPlot" - Me.rdoNoPlot.Size = New System.Drawing.Size(60, 17) + Me.rdoNoPlot.Size = New System.Drawing.Size(85, 24) Me.rdoNoPlot.TabIndex = 1 Me.rdoNoPlot.Text = "No Plot" Me.rdoNoPlot.UseVisualStyleBackColor = True @@ -143,9 +192,10 @@ Partial Class sdgExtremesMethod ' Me.rdoTrace.AutoSize = True Me.rdoTrace.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoTrace.Location = New System.Drawing.Point(13, 115) + Me.rdoTrace.Location = New System.Drawing.Point(20, 172) + Me.rdoTrace.Margin = New System.Windows.Forms.Padding(4) Me.rdoTrace.Name = "rdoTrace" - Me.rdoTrace.Size = New System.Drawing.Size(74, 17) + Me.rdoTrace.Size = New System.Drawing.Size(105, 24) Me.rdoTrace.TabIndex = 5 Me.rdoTrace.Text = "Trace Plot" Me.rdoTrace.UseVisualStyleBackColor = True @@ -154,9 +204,10 @@ Partial Class sdgExtremesMethod ' Me.rdoRlplot.AutoSize = True Me.rdoRlplot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoRlplot.Location = New System.Drawing.Point(13, 92) + Me.rdoRlplot.Location = New System.Drawing.Point(20, 138) + Me.rdoRlplot.Margin = New System.Windows.Forms.Padding(4) Me.rdoRlplot.Name = "rdoRlplot" - Me.rdoRlplot.Size = New System.Drawing.Size(56, 17) + Me.rdoRlplot.Size = New System.Drawing.Size(80, 24) Me.rdoRlplot.TabIndex = 4 Me.rdoRlplot.Text = "Rl Plot" Me.rdoRlplot.UseVisualStyleBackColor = True @@ -165,9 +216,10 @@ Partial Class sdgExtremesMethod ' Me.rdoHist.AutoSize = True Me.rdoHist.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoHist.Location = New System.Drawing.Point(149, 69) + Me.rdoHist.Location = New System.Drawing.Point(224, 104) + Me.rdoHist.Margin = New System.Windows.Forms.Padding(4) Me.rdoHist.Name = "rdoHist" - Me.rdoHist.Size = New System.Drawing.Size(64, 17) + Me.rdoHist.Size = New System.Drawing.Size(93, 24) Me.rdoHist.TabIndex = 8 Me.rdoHist.Text = "Hist Plot" Me.rdoHist.UseVisualStyleBackColor = True @@ -176,9 +228,10 @@ Partial Class sdgExtremesMethod ' Me.rdoDensity.AutoSize = True Me.rdoDensity.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoDensity.Location = New System.Drawing.Point(149, 93) + Me.rdoDensity.Location = New System.Drawing.Point(224, 140) + Me.rdoDensity.Margin = New System.Windows.Forms.Padding(4) Me.rdoDensity.Name = "rdoDensity" - Me.rdoDensity.Size = New System.Drawing.Size(81, 17) + Me.rdoDensity.Size = New System.Drawing.Size(118, 24) Me.rdoDensity.TabIndex = 9 Me.rdoDensity.Text = "Density Plot" Me.rdoDensity.UseVisualStyleBackColor = True @@ -187,9 +240,10 @@ Partial Class sdgExtremesMethod ' Me.rdoZPlot.AutoSize = True Me.rdoZPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoZPlot.Location = New System.Drawing.Point(149, 46) + Me.rdoZPlot.Location = New System.Drawing.Point(224, 69) + Me.rdoZPlot.Margin = New System.Windows.Forms.Padding(4) Me.rdoZPlot.Name = "rdoZPlot" - Me.rdoZPlot.Size = New System.Drawing.Size(70, 17) + Me.rdoZPlot.Size = New System.Drawing.Size(101, 24) Me.rdoZPlot.TabIndex = 7 Me.rdoZPlot.Text = "Zplot Plot" Me.rdoZPlot.UseVisualStyleBackColor = True @@ -198,9 +252,10 @@ Partial Class sdgExtremesMethod ' Me.rdoProbprob.AutoSize = True Me.rdoProbprob.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoProbprob.Location = New System.Drawing.Point(13, 69) + Me.rdoProbprob.Location = New System.Drawing.Point(20, 104) + Me.rdoProbprob.Margin = New System.Windows.Forms.Padding(4) Me.rdoProbprob.Name = "rdoProbprob" - Me.rdoProbprob.Size = New System.Drawing.Size(92, 17) + Me.rdoProbprob.Size = New System.Drawing.Size(135, 24) Me.rdoProbprob.TabIndex = 3 Me.rdoProbprob.Text = "Prob-prob Plot" Me.rdoProbprob.UseVisualStyleBackColor = True @@ -209,9 +264,10 @@ Partial Class sdgExtremesMethod ' Me.rdoQQPlot.AutoSize = True Me.rdoQQPlot.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoQQPlot.Location = New System.Drawing.Point(149, 23) + Me.rdoQQPlot.Location = New System.Drawing.Point(224, 34) + Me.rdoQQPlot.Margin = New System.Windows.Forms.Padding(4) Me.rdoQQPlot.Name = "rdoQQPlot" - Me.rdoQQPlot.Size = New System.Drawing.Size(62, 17) + Me.rdoQQPlot.Size = New System.Drawing.Size(89, 24) Me.rdoQQPlot.TabIndex = 6 Me.rdoQQPlot.Text = "QQ Plot" Me.rdoQQPlot.UseVisualStyleBackColor = True @@ -220,9 +276,10 @@ Partial Class sdgExtremesMethod ' Me.rdoQQ2.AutoSize = True Me.rdoQQ2.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoQQ2.Location = New System.Drawing.Point(149, 115) + Me.rdoQQ2.Location = New System.Drawing.Point(224, 172) + Me.rdoQQ2.Margin = New System.Windows.Forms.Padding(4) Me.rdoQQ2.Name = "rdoQQ2" - Me.rdoQQ2.Size = New System.Drawing.Size(68, 17) + Me.rdoQQ2.Size = New System.Drawing.Size(98, 24) Me.rdoQQ2.TabIndex = 10 Me.rdoQQ2.Text = "QQ2 Plot" Me.rdoQQ2.UseVisualStyleBackColor = True @@ -231,22 +288,33 @@ Partial Class sdgExtremesMethod ' Me.rdoPrimary.AutoSize = True Me.rdoPrimary.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoPrimary.Location = New System.Drawing.Point(13, 46) + Me.rdoPrimary.Location = New System.Drawing.Point(20, 69) + Me.rdoPrimary.Margin = New System.Windows.Forms.Padding(4) Me.rdoPrimary.Name = "rdoPrimary" - Me.rdoPrimary.Size = New System.Drawing.Size(59, 17) + Me.rdoPrimary.Size = New System.Drawing.Size(86, 24) Me.rdoPrimary.TabIndex = 2 Me.rdoPrimary.Text = "Primary" Me.rdoPrimary.UseVisualStyleBackColor = True ' + 'ucrPnlDisplayOptionsExtreme + ' + Me.ucrPnlDisplayOptionsExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlDisplayOptionsExtreme.Location = New System.Drawing.Point(12, 22) + Me.ucrPnlDisplayOptionsExtreme.Margin = New System.Windows.Forms.Padding(9) + Me.ucrPnlDisplayOptionsExtreme.Name = "ucrPnlDisplayOptionsExtreme" + Me.ucrPnlDisplayOptionsExtreme.Size = New System.Drawing.Size(358, 176) + Me.ucrPnlDisplayOptionsExtreme.TabIndex = 0 + ' 'tbRegOptions ' Me.tbRegOptions.Controls.Add(Me.tbFitMethod) Me.tbRegOptions.Controls.Add(Me.tbDisplayOptions) Me.tbRegOptions.Controls.Add(Me.tbConfidenceInterval) - Me.tbRegOptions.Location = New System.Drawing.Point(3, 4) + Me.tbRegOptions.Location = New System.Drawing.Point(4, 6) + Me.tbRegOptions.Margin = New System.Windows.Forms.Padding(4) Me.tbRegOptions.Name = "tbRegOptions" Me.tbRegOptions.SelectedIndex = 0 - Me.tbRegOptions.Size = New System.Drawing.Size(371, 311) + Me.tbRegOptions.Size = New System.Drawing.Size(556, 466) Me.tbRegOptions.TabIndex = 6 ' 'tbFitMethod @@ -261,32 +329,43 @@ Partial Class sdgExtremesMethod Me.tbFitMethod.Controls.Add(Me.lblNumberOfIterations) Me.tbFitMethod.Controls.Add(Me.grpFitMethod) Me.tbFitMethod.Controls.Add(Me.grpInitial) - Me.tbFitMethod.Location = New System.Drawing.Point(4, 22) + Me.tbFitMethod.Location = New System.Drawing.Point(4, 29) + Me.tbFitMethod.Margin = New System.Windows.Forms.Padding(4) Me.tbFitMethod.Name = "tbFitMethod" - Me.tbFitMethod.Padding = New System.Windows.Forms.Padding(3) - Me.tbFitMethod.Size = New System.Drawing.Size(363, 285) + Me.tbFitMethod.Padding = New System.Windows.Forms.Padding(4) + Me.tbFitMethod.Size = New System.Drawing.Size(548, 433) Me.tbFitMethod.TabIndex = 0 Me.tbFitMethod.Tag = "Display" Me.tbFitMethod.Text = "Fit Method" Me.tbFitMethod.UseVisualStyleBackColor = True ' + 'ucrInputPrior + ' + Me.ucrInputPrior.AddQuotesIfUnrecognised = True + Me.ucrInputPrior.AutoSize = True + Me.ucrInputPrior.IsMultiline = False + Me.ucrInputPrior.IsReadOnly = False + Me.ucrInputPrior.Location = New System.Drawing.Point(184, 194) + Me.ucrInputPrior.Margin = New System.Windows.Forms.Padding(9, 9, 9, 9) + Me.ucrInputPrior.Name = "ucrInputPrior" + Me.ucrInputPrior.Size = New System.Drawing.Size(206, 32) + Me.ucrInputPrior.TabIndex = 78 + ' 'lblPrior ' Me.lblPrior.AutoSize = True - Me.lblPrior.Location = New System.Drawing.Point(12, 129) - Me.lblPrior.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) + Me.lblPrior.Location = New System.Drawing.Point(18, 194) Me.lblPrior.Name = "lblPrior" - Me.lblPrior.Size = New System.Drawing.Size(87, 13) + Me.lblPrior.Size = New System.Drawing.Size(131, 20) Me.lblPrior.TabIndex = 76 Me.lblPrior.Text = "Prior Parameters:" ' 'rdoMle ' Me.rdoMle.AutoSize = True - Me.rdoMle.Location = New System.Drawing.Point(15, 22) - Me.rdoMle.Margin = New System.Windows.Forms.Padding(2) + Me.rdoMle.Location = New System.Drawing.Point(22, 33) Me.rdoMle.Name = "rdoMle" - Me.rdoMle.Size = New System.Drawing.Size(148, 17) + Me.rdoMle.Size = New System.Drawing.Size(219, 24) Me.rdoMle.TabIndex = 72 Me.rdoMle.TabStop = True Me.rdoMle.Text = "Maximum Likelihood(MLE)" @@ -296,9 +375,10 @@ Partial Class sdgExtremesMethod ' Me.rdoBayesian.AutoSize = True Me.rdoBayesian.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoBayesian.Location = New System.Drawing.Point(15, 66) + Me.rdoBayesian.Location = New System.Drawing.Point(22, 99) + Me.rdoBayesian.Margin = New System.Windows.Forms.Padding(4) Me.rdoBayesian.Name = "rdoBayesian" - Me.rdoBayesian.Size = New System.Drawing.Size(68, 17) + Me.rdoBayesian.Size = New System.Drawing.Size(99, 24) Me.rdoBayesian.TabIndex = 71 Me.rdoBayesian.Text = "Bayesian" Me.rdoBayesian.UseVisualStyleBackColor = True @@ -307,9 +387,10 @@ Partial Class sdgExtremesMethod ' Me.rdoGMLE.AutoSize = True Me.rdoGMLE.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoGMLE.Location = New System.Drawing.Point(15, 43) + Me.rdoGMLE.Location = New System.Drawing.Point(22, 64) + Me.rdoGMLE.Margin = New System.Windows.Forms.Padding(4) Me.rdoGMLE.Name = "rdoGMLE" - Me.rdoGMLE.Size = New System.Drawing.Size(242, 17) + Me.rdoGMLE.Size = New System.Drawing.Size(365, 24) Me.rdoGMLE.TabIndex = 70 Me.rdoGMLE.Text = "General Maximum Likelihood Estimator(GMLE)" Me.rdoGMLE.UseVisualStyleBackColor = True @@ -318,35 +399,56 @@ Partial Class sdgExtremesMethod ' Me.rdoLmoments.AutoSize = True Me.rdoLmoments.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoLmoments.Location = New System.Drawing.Point(15, 88) + Me.rdoLmoments.Location = New System.Drawing.Point(22, 132) + Me.rdoLmoments.Margin = New System.Windows.Forms.Padding(4) Me.rdoLmoments.Name = "rdoLmoments" - Me.rdoLmoments.Size = New System.Drawing.Size(77, 17) + Me.rdoLmoments.Size = New System.Drawing.Size(114, 24) Me.rdoLmoments.TabIndex = 69 Me.rdoLmoments.Text = "L-Moments" Me.rdoLmoments.UseVisualStyleBackColor = True ' + 'ucrNudNumberOfIterations + ' + Me.ucrNudNumberOfIterations.AutoSize = True + Me.ucrNudNumberOfIterations.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudNumberOfIterations.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudNumberOfIterations.Location = New System.Drawing.Point(184, 385) + Me.ucrNudNumberOfIterations.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrNudNumberOfIterations.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudNumberOfIterations.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudNumberOfIterations.Name = "ucrNudNumberOfIterations" + Me.ucrNudNumberOfIterations.Size = New System.Drawing.Size(75, 30) + Me.ucrNudNumberOfIterations.TabIndex = 64 + Me.ucrNudNumberOfIterations.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'lblNumberOfIterations ' Me.lblNumberOfIterations.AutoSize = True - Me.lblNumberOfIterations.Location = New System.Drawing.Point(12, 265) - Me.lblNumberOfIterations.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) + Me.lblNumberOfIterations.Location = New System.Drawing.Point(18, 391) Me.lblNumberOfIterations.Name = "lblNumberOfIterations" - Me.lblNumberOfIterations.Size = New System.Drawing.Size(105, 13) + Me.lblNumberOfIterations.Size = New System.Drawing.Size(158, 20) Me.lblNumberOfIterations.TabIndex = 63 Me.lblNumberOfIterations.Text = "Number of Iterations:" ' 'grpFitMethod ' Me.grpFitMethod.Controls.Add(Me.ucrPnlFitMethodExtremes) - Me.grpFitMethod.Location = New System.Drawing.Point(5, 5) - Me.grpFitMethod.Margin = New System.Windows.Forms.Padding(2) + Me.grpFitMethod.Location = New System.Drawing.Point(8, 8) Me.grpFitMethod.Name = "grpFitMethod" - Me.grpFitMethod.Padding = New System.Windows.Forms.Padding(2) - Me.grpFitMethod.Size = New System.Drawing.Size(269, 113) + Me.grpFitMethod.Size = New System.Drawing.Size(404, 170) Me.grpFitMethod.TabIndex = 73 Me.grpFitMethod.TabStop = False Me.grpFitMethod.Text = "Fit Method" ' + 'ucrPnlFitMethodExtremes + ' + Me.ucrPnlFitMethodExtremes.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlFitMethodExtremes.Location = New System.Drawing.Point(9, 22) + Me.ucrPnlFitMethodExtremes.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) + Me.ucrPnlFitMethodExtremes.Name = "ucrPnlFitMethodExtremes" + Me.ucrPnlFitMethodExtremes.Size = New System.Drawing.Size(370, 138) + Me.ucrPnlFitMethodExtremes.TabIndex = 74 + ' 'grpInitial ' Me.grpInitial.Controls.Add(Me.ucrNudScale) @@ -355,56 +457,24 @@ Partial Class sdgExtremesMethod Me.grpInitial.Controls.Add(Me.ucrNudShape) Me.grpInitial.Controls.Add(Me.lblScale) Me.grpInitial.Controls.Add(Me.lblShape) - Me.grpInitial.Location = New System.Drawing.Point(15, 154) - Me.grpInitial.Margin = New System.Windows.Forms.Padding(2) + Me.grpInitial.Location = New System.Drawing.Point(22, 231) Me.grpInitial.Name = "grpInitial" - Me.grpInitial.Padding = New System.Windows.Forms.Padding(2) - Me.grpInitial.Size = New System.Drawing.Size(133, 92) + Me.grpInitial.Size = New System.Drawing.Size(200, 138) Me.grpInitial.TabIndex = 86 Me.grpInitial.TabStop = False Me.grpInitial.Text = "Initial Values:" ' - 'lblLocation - ' - Me.lblLocation.AutoSize = True - Me.lblLocation.Location = New System.Drawing.Point(8, 23) - Me.lblLocation.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) - Me.lblLocation.Name = "lblLocation" - Me.lblLocation.Size = New System.Drawing.Size(51, 13) - Me.lblLocation.TabIndex = 85 - Me.lblLocation.Text = "Location:" - ' - 'lblScale - ' - Me.lblScale.AutoSize = True - Me.lblScale.Location = New System.Drawing.Point(22, 47) - Me.lblScale.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) - Me.lblScale.Name = "lblScale" - Me.lblScale.Size = New System.Drawing.Size(37, 13) - Me.lblScale.TabIndex = 84 - Me.lblScale.Text = "Scale:" - ' - 'lblShape - ' - Me.lblShape.AutoSize = True - Me.lblShape.Location = New System.Drawing.Point(18, 72) - Me.lblShape.Margin = New System.Windows.Forms.Padding(2, 0, 2, 0) - Me.lblShape.Name = "lblShape" - Me.lblShape.Size = New System.Drawing.Size(41, 13) - Me.lblShape.TabIndex = 83 - Me.lblShape.Text = "Shape:" - ' 'ucrNudScale ' Me.ucrNudScale.AutoSize = True Me.ucrNudScale.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudScale.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudScale.Location = New System.Drawing.Point(65, 40) - Me.ucrNudScale.Margin = New System.Windows.Forms.Padding(4) + Me.ucrNudScale.Location = New System.Drawing.Point(98, 60) + Me.ucrNudScale.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) Me.ucrNudScale.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudScale.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudScale.Name = "ucrNudScale" - Me.ucrNudScale.Size = New System.Drawing.Size(50, 20) + Me.ucrNudScale.Size = New System.Drawing.Size(75, 30) Me.ucrNudScale.TabIndex = 82 Me.ucrNudScale.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' @@ -413,136 +483,75 @@ Partial Class sdgExtremesMethod Me.ucrNudLocation.AutoSize = True Me.ucrNudLocation.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudLocation.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudLocation.Location = New System.Drawing.Point(65, 15) - Me.ucrNudLocation.Margin = New System.Windows.Forms.Padding(4) + Me.ucrNudLocation.Location = New System.Drawing.Point(98, 22) + Me.ucrNudLocation.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) Me.ucrNudLocation.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudLocation.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudLocation.Name = "ucrNudLocation" - Me.ucrNudLocation.Size = New System.Drawing.Size(50, 20) + Me.ucrNudLocation.Size = New System.Drawing.Size(75, 30) Me.ucrNudLocation.TabIndex = 81 Me.ucrNudLocation.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' + 'lblLocation + ' + Me.lblLocation.AutoSize = True + Me.lblLocation.Location = New System.Drawing.Point(12, 34) + Me.lblLocation.Name = "lblLocation" + Me.lblLocation.Size = New System.Drawing.Size(74, 20) + Me.lblLocation.TabIndex = 85 + Me.lblLocation.Text = "Location:" + ' 'ucrNudShape ' Me.ucrNudShape.AutoSize = True Me.ucrNudShape.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudShape.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudShape.Location = New System.Drawing.Point(65, 65) - Me.ucrNudShape.Margin = New System.Windows.Forms.Padding(4) + Me.ucrNudShape.Location = New System.Drawing.Point(98, 98) + Me.ucrNudShape.Margin = New System.Windows.Forms.Padding(6, 6, 6, 6) Me.ucrNudShape.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudShape.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudShape.Name = "ucrNudShape" - Me.ucrNudShape.Size = New System.Drawing.Size(50, 20) + Me.ucrNudShape.Size = New System.Drawing.Size(75, 30) Me.ucrNudShape.TabIndex = 80 Me.ucrNudShape.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'ucrInputPrior - ' - Me.ucrInputPrior.AddQuotesIfUnrecognised = True - Me.ucrInputPrior.AutoSize = True - Me.ucrInputPrior.IsMultiline = False - Me.ucrInputPrior.IsReadOnly = False - Me.ucrInputPrior.Location = New System.Drawing.Point(123, 129) - Me.ucrInputPrior.Margin = New System.Windows.Forms.Padding(6) - Me.ucrInputPrior.Name = "ucrInputPrior" - Me.ucrInputPrior.Size = New System.Drawing.Size(137, 21) - Me.ucrInputPrior.TabIndex = 78 - ' - 'ucrNudNumberOfIterations - ' - Me.ucrNudNumberOfIterations.AutoSize = True - Me.ucrNudNumberOfIterations.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudNumberOfIterations.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudNumberOfIterations.Location = New System.Drawing.Point(123, 261) - Me.ucrNudNumberOfIterations.Margin = New System.Windows.Forms.Padding(4) - Me.ucrNudNumberOfIterations.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudNumberOfIterations.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudNumberOfIterations.Name = "ucrNudNumberOfIterations" - Me.ucrNudNumberOfIterations.Size = New System.Drawing.Size(50, 20) - Me.ucrNudNumberOfIterations.TabIndex = 64 - Me.ucrNudNumberOfIterations.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrPnlFitMethodExtremes - ' - Me.ucrPnlFitMethodExtremes.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrPnlFitMethodExtremes.Location = New System.Drawing.Point(6, 15) - Me.ucrPnlFitMethodExtremes.Margin = New System.Windows.Forms.Padding(4) - Me.ucrPnlFitMethodExtremes.Name = "ucrPnlFitMethodExtremes" - Me.ucrPnlFitMethodExtremes.Size = New System.Drawing.Size(247, 92) - Me.ucrPnlFitMethodExtremes.TabIndex = 74 - ' - 'ucrSavePlots - ' - Me.ucrSavePlots.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrSavePlots.Location = New System.Drawing.Point(19, 159) - Me.ucrSavePlots.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5) - Me.ucrSavePlots.Name = "ucrSavePlots" - Me.ucrSavePlots.Size = New System.Drawing.Size(261, 24) - Me.ucrSavePlots.TabIndex = 3 - ' - 'ucrPnlDisplayOptionsExtreme - ' - Me.ucrPnlDisplayOptionsExtreme.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrPnlDisplayOptionsExtreme.Location = New System.Drawing.Point(8, 15) - Me.ucrPnlDisplayOptionsExtreme.Margin = New System.Windows.Forms.Padding(6) - Me.ucrPnlDisplayOptionsExtreme.Name = "ucrPnlDisplayOptionsExtreme" - Me.ucrPnlDisplayOptionsExtreme.Size = New System.Drawing.Size(239, 117) - Me.ucrPnlDisplayOptionsExtreme.TabIndex = 0 - ' - 'ucrChkType - ' - Me.ucrChkType.AutoSize = True - Me.ucrChkType.Checked = False - Me.ucrChkType.Location = New System.Drawing.Point(8, 9) - Me.ucrChkType.Margin = New System.Windows.Forms.Padding(4) - Me.ucrChkType.Name = "ucrChkType" - Me.ucrChkType.Size = New System.Drawing.Size(100, 23) - Me.ucrChkType.TabIndex = 0 - ' - 'ucrNudReturnLevel + 'lblScale ' - Me.ucrNudReturnLevel.AutoSize = True - Me.ucrNudReturnLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudReturnLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudReturnLevel.Location = New System.Drawing.Point(311, 9) - Me.ucrNudReturnLevel.Margin = New System.Windows.Forms.Padding(4) - Me.ucrNudReturnLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudReturnLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudReturnLevel.Name = "ucrNudReturnLevel" - Me.ucrNudReturnLevel.Size = New System.Drawing.Size(50, 20) - Me.ucrNudReturnLevel.TabIndex = 2 - Me.ucrNudReturnLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + Me.lblScale.AutoSize = True + Me.lblScale.Location = New System.Drawing.Point(33, 70) + Me.lblScale.Name = "lblScale" + Me.lblScale.Size = New System.Drawing.Size(53, 20) + Me.lblScale.TabIndex = 84 + Me.lblScale.Text = "Scale:" ' - 'ucrInputType + 'lblShape ' - Me.ucrInputType.AddQuotesIfUnrecognised = True - Me.ucrInputType.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputType.GetSetSelectedIndex = -1 - Me.ucrInputType.IsReadOnly = False - Me.ucrInputType.Location = New System.Drawing.Point(109, 12) - Me.ucrInputType.Margin = New System.Windows.Forms.Padding(6) - Me.ucrInputType.Name = "ucrInputType" - Me.ucrInputType.Size = New System.Drawing.Size(117, 21) - Me.ucrInputType.TabIndex = 1 + Me.lblShape.AutoSize = True + Me.lblShape.Location = New System.Drawing.Point(27, 108) + Me.lblShape.Name = "lblShape" + Me.lblShape.Size = New System.Drawing.Size(60, 20) + Me.lblShape.TabIndex = 83 + Me.lblShape.Text = "Shape:" ' 'ucrBase ' Me.ucrBase.AutoSize = True - Me.ucrBase.Location = New System.Drawing.Point(6, 345) - Me.ucrBase.Margin = New System.Windows.Forms.Padding(4) + Me.ucrBase.Location = New System.Drawing.Point(9, 481) + Me.ucrBase.Margin = New System.Windows.Forms.Padding(6) Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(224, 30) + Me.ucrBase.Size = New System.Drawing.Size(336, 45) Me.ucrBase.TabIndex = 5 ' 'sdgExtremesMethod ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) + Me.AutoScaleDimensions = New System.Drawing.SizeF(144.0!, 144.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(383, 400) + Me.ClientSize = New System.Drawing.Size(574, 530) Me.Controls.Add(Me.tbRegOptions) Me.Controls.Add(Me.ucrBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow + Me.Margin = New System.Windows.Forms.Padding(4) Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "sdgExtremesMethod" diff --git a/instat/sdgExtremesMethod.vb b/instat/sdgExtremesMethod.vb index dfa5faa7981..7ebe4b77ad9 100644 --- a/instat/sdgExtremesMethod.vb +++ b/instat/sdgExtremesMethod.vb @@ -36,7 +36,7 @@ Public Class sdgExtremesMethod ucrNudShape, ucrNudLocation}, {rdoBayesian}, bNewLinkedHideIfParameterMissing:=True) ucrPnlFitMethodExtremes.AddToLinkedControls(ucrNudNumberOfIterations, {rdoBayesian}, bNewLinkedHideIfParameterMissing:=True, - bNewLinkedAddRemoveParameter:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=999, + bNewLinkedAddRemoveParameter:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=9999, bNewLinkedUpdateFunction:=True) From 1dc8418703381abf7790c00cd0cb26b5949930aa Mon Sep 17 00:00:00 2001 From: patowhiz Date: Fri, 23 Sep 2022 14:01:00 +0300 Subject: [PATCH 028/122] additional code --- instat/clsRCodeStructure.vb | 28 +- instat/clsRLink.vb | 4 +- instat/static/InstatObject/R/data_object_R6.R | 16 + .../static/InstatObject/R/instat_object_R6.R | 38 +- instat/ucrInput.vb | 1080 ++++++++--------- 5 files changed, 601 insertions(+), 565 deletions(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index d91e2fa5f6f..9535b7c293b 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -468,35 +468,31 @@ Public Class RCodeStructure strScript = strScript & ConstructAssignTo(strAssignTo, strTemp) & Environment.NewLine End If - If Not String.IsNullOrEmpty(Me._rObjectTypeToAssignTo) AndAlso Not String.IsNullOrEmpty(Me._rObjectFormatToAssignTo) Then + If Not String.IsNullOrEmpty(Me._rObjectTypeToAssignTo) AndAlso Not String.IsNullOrEmpty(Me._rObjectNameToAssignTo) AndAlso Not String.IsNullOrEmpty(Me._rObjectFormatToAssignTo) Then Dim clsAddObject As New RFunction - Dim clsViewObject As New RFunction + Dim clsGetObject As New RFunction - 'set the R command and parameters for the add object R function + 'set the R command and parameters for the add object R function. This is used for adding the object in the data book + 'set the R command and parameters for the get object R function. This is used for viewing the object. clsAddObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_object") + clsGetObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_object") + If Not String.IsNullOrEmpty(Me._rDataFrameNameToAddObjectTo) Then clsAddObject.AddParameter("data_name", Chr(34) & Me._rDataFrameNameToAddObjectTo & Chr(34)) + clsGetObject.AddParameter("data_name", Chr(34) & Me._rDataFrameNameToAddObjectTo & Chr(34)) End If - If Not String.IsNullOrEmpty(Me._rObjectNameToAssignTo) Then - clsAddObject.AddParameter("object_name", Chr(34) & Me._rObjectNameToAssignTo & Chr(34)) - End If + + clsAddObject.AddParameter("object_name", Chr(34) & Me._rObjectNameToAssignTo & Chr(34)) clsAddObject.AddParameter("object_type_label", Chr(34) & Me._rObjectTypeToAssignTo & Chr(34)) clsAddObject.AddParameter("object_format", Chr(34) & Me._rObjectFormatToAssignTo & Chr(34)) clsAddObject.AddParameter("object", Me._rObjectToAssignTo) - 'todo. once the R level code has been refactored this parameter will not be necessary. - 'it's important for it to alway be false. - 'This can be changed once saving of objects as part of R-Instat session is correctly implemented - clsAddObject.AddParameter("internal", "FALSE") - - 'set the R command and parameters for the view object R function - clsViewObject.SetRCommand("view_object") - clsViewObject.AddParameter("object", Me._rObjectToAssignTo) - clsViewObject.AddParameter("object_format", Chr(34) & Me._rObjectFormatToAssignTo & Chr(34)) + clsGetObject.AddParameter("object_name", Chr(34) & Me._rObjectNameToAssignTo & Chr(34)) 'construct the scripts strScript = strScript & clsAddObject.ToScript() & Environment.NewLine - strAssignTo = clsViewObject.ToScript() + strAssignTo = clsGetObject.ToScript() + ElseIf Not strAssignToDataFrame = "" AndAlso (Not strAssignToColumn = "" OrElse bAssignToColumnWithoutNames) Then 'if we need to assign to a column in a data frame clsAddColumns.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index d19e25ebe51..5ee74a3d368 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -834,7 +834,7 @@ Public Class RLink 'get the last R script command Dim strLastScript As String = GetRunnableCommandLines(strScript).Last - If strLastScript.Contains("view_object") Then 'if output should be returned as a file + If strLastScript.Contains("get_object") Then 'if output should be returned as a file Try Dim strNewAssignedToScript As String = ConstructAssignTo(strTempAssignTo, strScript) Evaluate(strNewAssignedToScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) @@ -1966,7 +1966,7 @@ Public Class RLink clsGetObjectNamesRFunction.AddParameter("data_name", Chr(34) & strDataFrameName & Chr(34)) End If If Not String.IsNullOrEmpty(strRObjectTypeLabel) Then - clsGetObjectNamesRFunction.AddParameter("object_type_label", Chr(34) & strDataFrameName & Chr(34)) + clsGetObjectNamesRFunction.AddParameter("object_type_label", Chr(34) & strRObjectTypeLabel & Chr(34)) End If expNames = RunInternalScriptGetValue(clsGetObjectNamesRFunction.ToScript(), bSilent:=True) If expNames IsNot Nothing AndAlso Not expNames.Type = Internals.SymbolicExpressionType.Null Then diff --git a/instat/static/InstatObject/R/data_object_R6.R b/instat/static/InstatObject/R/data_object_R6.R index 42e406de60f..0973ad1bbc0 100644 --- a/instat/static/InstatObject/R/data_object_R6.R +++ b/instat/static/InstatObject/R/data_object_R6.R @@ -2047,6 +2047,8 @@ DataSheet$set("public", "get_variables_metadata_fields", function(as_list = FALS } ) +#objects names are expected to be unique. Objects are in a nested list. +#see comments in issue #7808 for further details DataSheet$set("public", "add_object", function(object_name, object_type_label, object_format, object) { if(missing(object_name)){ @@ -2086,10 +2088,24 @@ DataSheet$set("public", "get_objects", function(object_name, object_type_label, } ) +#object name must be supplied +#returns NULL if object is not found +DataSheet$set("public", "get_object", function(object_name) { + #make sure supplied object name is a character, prevents return of unexpected object + if(!missing(object_name) && is.character(object_name) ){ + return(private$objects[[object_name]]) + }else{ + return(NULL) + } + +} +) + DataSheet$set("public", "get_object_names", function(object_type_label, as_list = FALSE, excluded_items = c()) { if(missing(object_type_label)){ out = names(private$objects) }else{ + #todo. has a bug. the object_type_label cannot be accessed directly out = names(private$objects)[sapply(private$objects, function(x) any( identical(x$object_type_label, object_type_label) ))] } diff --git a/instat/static/InstatObject/R/instat_object_R6.R b/instat/static/InstatObject/R/instat_object_R6.R index 156c64000ba..15c1727b0e3 100644 --- a/instat/static/InstatObject/R/instat_object_R6.R +++ b/instat/static/InstatObject/R/instat_object_R6.R @@ -533,6 +533,7 @@ DataBook$set("public", "get_columns_from_data", function(data_name, col_names, f } ) +#see comments in issue #7808. Usage of parameter internal needs further discussions, it may have to be deprecated DataBook$set("public", "add_object", function(data_name, object_name, object_type_label, object_format, object, internal = TRUE) { if (internal) { @@ -556,6 +557,7 @@ DataBook$set("public", "add_object", function(data_name, object_name, object_typ #todo. should every other big object have their own data book or we use one data book for storing all the objects? #or we store all objects in a separate data structure that is not a data book? #if we store it in a data structure then we will NOT need the "internal" parameter + #see comments in issue #7808 #for graphs, create a separate .graph_data_book data book if it's not yet created if(identical(object_type_label, "graph")){ @@ -563,19 +565,15 @@ DataBook$set("public", "add_object", function(data_name, object_name, object_typ self$create_graph_data_book() } .graph_data_book$add_object(data_name = data_name, object_name = object_name, object_type_label = object_type_label, object_format = object_format, object = object, internal = TRUE) + #after adding the graph. set it as last graph contents + last_graph_name <- self$get_data_objects(data_name)$get_last_graph_name() + if(!is.null(last_graph_name)) private$.last_graph <- c(data_name, last_graph_name) }else{ self$add_object(data_name = data_name, object_name = object_name, object_type_label = object_type_label, object_format = object_format, object = object, internal = TRUE) } } - #after adding the graph. set it as last graph contents - if(identical(object_type_label,"graph")){ - last_graph_name <- self$get_data_objects(data_name)$get_last_graph_name() - if(!is.null(last_graph_name)) private$.last_graph <- c(data_name, last_graph_name) - } - - } ) @@ -592,6 +590,7 @@ DataBook$set("public", "create_graph_data_book", function() { } ) +#see comments in issue #7808. Usage of parameter internal needs further discussions DataBook$set("public", "get_objects", function(data_name, object_name, object_type_label, include_overall = TRUE, as_list = FALSE, include_empty = FALSE, force_as_list = FALSE, internal = TRUE, ...) { if (!internal & exists(".graph_data_book")) { @@ -650,6 +649,31 @@ DataBook$set("public", "get_objects", function(data_name, object_name, object_ty } ) +#returns NULL if object is not found +#as explained in issue #7808 comments. New implementation is need to remove the internal parameter from the other "object" functions +#if parameter internal is set to false, parameter object_type_label will have to be passed +#todo. parameter object_type_label and nternal can be removed as a parameter if all objects are saved in the same data book or structure +DataBook$set("public", "get_object", function(data_name, object_name, object_type_label = "", internal = TRUE) { + if (!internal && identical(object_type_label,"graph") && exists(".graph_data_book")) { + r_instant_object <- .graph_data_book$get_object(data_name = data_name, object_name = object_name, internal = TRUE) + }else { + if(missing(data_name) || data_name == overall_label) { + r_instant_object <- private$.objects[[object_name]] + }else { + r_instant_object <- self$get_data_objects(data_name)$get_object(object_name = object_name) + } + } + + if (is.null(r_instant_object)){ + return(NULL) + }else{ + return(view_object(object = r_instant_object$object, object_format = r_instant_object$object_format)) + } + +} +) + +#see comments in issue #7808. Changing internal = true by default needs further discussions DataBook$set("public", "get_object_names", function(data_name, object_type_label, include_overall = TRUE, include, exclude, include_empty = FALSE, as_list = FALSE, excluded_items = c(), internal = TRUE) { if(!missing(object_type_label)){ diff --git a/instat/ucrInput.vb b/instat/ucrInput.vb index 3aa78039245..306bd715112 100644 --- a/instat/ucrInput.vb +++ b/instat/ucrInput.vb @@ -14,544 +14,544 @@ ' You should have received a copy of the GNU General Public License ' along with this program. If not, see . -Imports instat -Imports RDotNet - -Public Class ucrInput - Public bUserTyped As Boolean = False - Public Event NameChanged() - Protected strValidationType As String = "None" - Protected ReadOnly strReservedWords() As String = ({"if", "else", "repeat", "while", "function", "for", "in", "next", "break", "TRUE", "FALSE", "NULL", "Inf", "NaN", "NA", "NA_integer_", "NA_real_", "NA_complex_", "NA_character_"}) - Public clsRList As New RFunction - Protected dcmMinimum As Decimal = Decimal.MinValue - Protected dcmMaximum As Decimal = Decimal.MaxValue - Protected bMinimumIncluded, bMaximumIncluded As Boolean - Protected _strDefaultRObjectTypeLabel As String = "" - Protected strDefaultPrefix As String = "" - Protected WithEvents ucrDataFrameSelector As ucrDataFrame - Protected bIsReadOnly As Boolean = False - Public bAutoChangeOnLeave As Boolean = False - Protected bAllowInf As Boolean = False - Private bLastSilent As Boolean = False - Private bPrivateAddQuotesIfUnrecognised As Boolean = True - Protected dctDisplayParameterValues As New Dictionary(Of String, String) - Protected bFirstLoad As Boolean = True - - 'used to determine if valid expressions are allowed for numeric validations e.g 20/2, 30-1 - Protected bNumericExpressionAllowed As Boolean = True - - Public Sub New() - - ' This call is required by the designer. - InitializeComponent() - - ' Add any initialization after the InitializeComponent() call. - bUpdateRCodeFromControl = False - End Sub - - Public Overridable Sub SetName(strName As String, Optional bSilent As Boolean = False) - bLastSilent = bSilent - End Sub - - Public Overridable Function GetText() As String - Return "" - End Function - - Public Overridable Function GetValue() As Object - Return Nothing - End Function - - Public Overridable Sub Reset() - bUserTyped = False - End Sub - - Public Sub OnNameChanged() - Me.Text = Me.GetText() - RaiseEvent NameChanged() - OnControlValueChanged() - End Sub - - Public Overrides Sub UpdateParameter(clsTempParam As RParameter) - If bChangeParameterValue AndAlso clsTempParam IsNot Nothing Then - If dctDisplayParameterValues.ContainsKey(GetText()) Then - clsTempParam.SetArgumentValue(dctDisplayParameterValues(GetText())) - Else - If AddQuotesIfUnrecognised Then - clsTempParam.SetArgumentValue(Chr(34) & GetText() & Chr(34)) - Else - clsTempParam.SetArgumentValue(GetText()) - End If - End If - End If - End Sub - - Public Function UserTyped() As Boolean - Return bUserTyped - End Function - - Public Sub SetDefaultRObjectTypeLabel(strRObjectTypeLabel As String) - Me._strDefaultRObjectTypeLabel = strRObjectTypeLabel - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsColumn() - _strDefaultRObjectTypeLabel = "Column" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsDataFrame() - _strDefaultRObjectTypeLabel = "Data Frame" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsKey() - _strDefaultRObjectTypeLabel = "Key" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsLink() - _strDefaultRObjectTypeLabel = "Link" - SetDefaultName() - End Sub - - Public Sub SetValidationTypeAsRVariable() - strValidationType = "RVariable" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsFilter() - _strDefaultRObjectTypeLabel = "Filter" - SetDefaultName() - End Sub - - Public Sub SetDefaultTypeAsColumnSelection() - _strDefaultRObjectTypeLabel = "Column Selection" - - SetDefaultName() - End Sub - - Public Overridable Sub SetDataFrameSelector(ucrNewSelector As ucrDataFrame) - ucrDataFrameSelector = ucrNewSelector - If Not bUserTyped Then - SetDefaultName() - End If - End Sub - - Public Sub SetPrefix(strNewPrefix As String) - strDefaultPrefix = strNewPrefix - SetDefaultName() - End Sub - - Public Sub SetDefaultName() - If strDefaultPrefix <> "" Then - Select Case _strDefaultRObjectTypeLabel - Case "Column" - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" AndAlso frmMain.clsRLink.DataFrameExists(ucrDataFrameSelector.cboAvailableDataFrames.Text) Then - SetName(frmMain.clsRLink.GetDefaultColumnNames(strDefaultPrefix, ucrDataFrameSelector.cboAvailableDataFrames.Text)) - Else - SetName("") - End If - Case "Data Frame" - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetDataFrameNames())) - Case RObjectTypeLabel.Graph, - RObjectTypeLabel.Table, - RObjectTypeLabel.Model, - RObjectTypeLabel.Structure_label, - RObjectTypeLabel.Summary - 'for objects that are shown in the output viewer. do the following - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.strCurrDataFrame <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, - frmMain.clsRLink.GetObjectNames( - strDataFrameName:=ucrDataFrameSelector.strCurrDataFrame, - strRObjectTypeLabel:=_strDefaultRObjectTypeLabel))) - End If - Case "Filter" - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - SetName("") - End If - - Case "Column Selection" - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetColumnSelectionNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - SetName("") - End If - Case "Key" - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetKeyNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - SetName("") - End If - Case "Link" - If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then - SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetLinkNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) - Else - SetName("") - End If - End Select - End If - End Sub - - Public Sub SetValidationTypeAsNumeric(Optional dcmMin As Decimal = Decimal.MinValue, Optional bIncludeMin As Boolean = True, Optional dcmMax As Decimal = Decimal.MaxValue, Optional bIncludeMax As Boolean = True, Optional bNumericExpressionAllowed As Boolean = True) - strValidationType = "Numeric" - Me.bNumericExpressionAllowed = bNumericExpressionAllowed - If dcmMin <> Decimal.MinValue Then - dcmMinimum = dcmMin - bMinimumIncluded = bIncludeMin - End If - If dcmMax <> Decimal.MaxValue Then - dcmMaximum = dcmMax - bMaximumIncluded = bIncludeMax - End If - End Sub - - Public Function GetNumericRange() As String - Dim strRange As String = "" - If strValidationType = "Numeric" Then - If dcmMinimum <> Decimal.MinValue Then - If bMinimumIncluded Then - strRange = ">= " & dcmMinimum.ToString() - Else - strRange = "> " & dcmMinimum.ToString() - End If - If dcmMaximum <> Decimal.MaxValue Then - strRange = strRange & " and " - End If - End If - If dcmMaximum <> Decimal.MaxValue Then - If bMaximumIncluded Then - strRange = strRange & "<= " & dcmMaximum.ToString() - Else - strRange = strRange & "< " & dcmMaximum.ToString() - End If - End If - ElseIf strValidationType = "NumericList" Then - If dcmMinimum <> Double.MinValue Then - If bMinimumIncluded Then - strRange = ">= " & dcmMinimum.ToString() - Else - strRange = "> " & dcmMinimum.ToString() - End If - If dcmMaximum <> Double.MaxValue Then - strRange = strRange & " and " - End If - End If - If dcmMaximum <> Double.MaxValue Then - If bMaximumIncluded Then - strRange = strRange & "<= " & dcmMaximum.ToString() - Else - strRange = strRange & "< " & dcmMaximum.ToString() - End If - End If - End If - Return strRange - End Function - - Public Sub SetValidationTypeAsList() - strValidationType = "List" - End Sub - - Public Sub SetValidationTypeAsNumericList(Optional bNewAllowInf As Boolean = False, Optional bIncludeMin As Boolean = True, Optional dcmMin As Double = Double.MinValue, Optional dcmMax As Double = Double.MaxValue, Optional bIncludeMax As Boolean = True) - ' Dim Dmax As Double = Maximum - ' Dim Dmin As Double = Minimum - strValidationType = "NumericList" - If dcmMin <> Double.MinValue Then - dcmMinimum = dcmMin - End If - If dcmMax <> Double.MaxValue Then - dcmMaximum = dcmMax - End If - bAllowInf = bNewAllowInf - End Sub - - Public Function IsValid(strText As String) As Boolean - Return (GetValidationCode(strText) = 0) - End Function - - Public Function GetValidationCode(strText As String) As Integer - Dim iType As Integer - Select Case strValidationType - Case "None" - iType = 0 - Case "RVariable" - iType = ValidateRVariable(strText) - Case "Numeric" - iType = ValidateNumeric(strText) - Case "List" - iType = ValidateList(strText, False) - Case "NumericList" - iType = ValidateList(strText, True, bAllowInf) - End Select - Return iType - End Function - - Public Function ValidateText(strText As String) As Boolean - Dim iValidationCode As Integer - - iValidationCode = GetValidationCode(strText) - - Select Case iValidationCode - Case 0 - - Case 1 - Select Case strValidationType - Case "RVariable" - MsgBox(Chr(34) & strText & Chr(34) & " is a reserved word in R and cannot be used.", vbOKOnly) - Case "Numeric" - MsgBox("Entry must be numeric.", vbOKOnly) - Case "List" - MsgBox("Textbox requires a list separated by commas.", vbOKOnly, "Validation Error") - Case "NumericList" - MsgBox("Textbox requires a list of numbers separated by commas.", vbOKOnly, "Validation Error") - End Select - Case 2 - Select Case strValidationType - Case "RVariable" - MsgBox("This name cannot start with " & strText(0), vbOKOnly) - Case "Numeric" - MsgBox("This number must be: " & GetNumericRange(), vbOKOnly) - Case "NumericList" - MsgBox("Each item in the list must be numeric.", vbOKOnly, "Validation Error") - End Select - Case 3 - Select Case strValidationType - Case "RVariable" - MsgBox("This name cannot start with a dot followed by a number/nothing", vbOKOnly) - Case "NumericList" - MsgBox("Each item in the list must be " & GetNumericRange(), vbOKOnly, "Validation Error") - End Select - Case 4 - Select Case strValidationType - Case "RVariable" - MsgBox("This name cannot contain a space", vbOKOnly) - End Select - Case 5 - Select Case strValidationType - Case "RVariable" - MsgBox("This name contains an invalid character", vbOKOnly) - - End Select - End Select - Return (iValidationCode = 0) - - End Function - - 'Returns integer as code for validation - ' 0 : string is valid - ' 1 : string is not numeric - ' 2 : string is outside range - Public Function ValidateNumeric(strText As String) As Integer - Dim dcmText As Decimal - Dim iType As Integer = 0 - - If strText <> "" AndAlso (strValuesToIgnore Is Nothing OrElse (strValuesToIgnore IsNot Nothing AndAlso Not strValuesToIgnore.Contains(strText))) Then - If Not IsNumeric(strText) Then - iType = 1 'reset as invalid entry - 'if numeric expressions are allowed check the expression results to a valid numeric - If bNumericExpressionAllowed Then - Dim vecOutput As CharacterVector - 'is.numeric(x) returns true if the x expression is a valid one. - 'So we use it here to check validity of the entry - vecOutput = frmMain.clsRLink.RunInternalScriptGetOutput("is.numeric(" & strText & ")", bSilent:=True) - If vecOutput IsNot Nothing AndAlso vecOutput.Length > 0 AndAlso Mid(vecOutput(0), 5).ToUpper = "TRUE" Then - iType = 0 'set as valid entry - End If - End If - Else - dcmText = Convert.ToDecimal(strText) - If (dcmText < dcmMinimum) OrElse (dcmText > dcmMaximum) OrElse (Not bMinimumIncluded And dcmText <= dcmMinimum) OrElse (Not bMaximumIncluded And dcmText >= dcmMaximum) Then - iType = 2 - End If - End If - End If - Return iType - End Function - - 'Returns integer as code for validation - ' 0 : string is valid - ' 1 : string is a reserved word - ' 2 : string starts with invalid character - ' 3 : string starts with "." followed by a number/nothing - ' 4 : string contains a space - ' 5 : string contains other invalid character - Public Function ValidateRVariable(strText As String) As Integer - Dim chrFirst As Char - Dim chrCurr As Char - Dim bAcceptableString As Boolean - - If strText = "" Then - Return 0 - End If - - If strReservedWords.Contains(strText) Then - Return 1 - End If - chrFirst = strText(0) - If Not Char.IsLetter(chrFirst) Then - If chrFirst <> "." Then - Return 2 - Else - If strText.Length > 1 Then - If Char.IsNumber(strText(1)) Then - Return 3 - End If - Else - Return 3 - End If - End If - End If - - For Each chrCurr In strText - bAcceptableString = Char.IsLetterOrDigit(chrCurr) Or chrCurr = "." Or chrCurr = "_" - If Not bAcceptableString Then - If chrCurr = " " Then - Return 4 - Else - Return 5 - End If - End If - Next - Return 0 - End Function - - 'Returns integer as code for validation - ' 0 : string is valid - ' 1 : an item is empty - ' 2 : an item is not numeric - ' 3 : an item is between max and min values - Public Function ValidateList(strText As String, Optional bIsNumericInput As Boolean = False, Optional bAllowInf As Boolean = False) As Integer - Dim strItems As String() - Dim strTemp As String - Dim i As Integer = 0 - If strText = "" Then Return 0 - clsRList.ClearParameters() - clsRList.SetRCommand("c") - 'TODO deal with spaces differently e.g. "8 8" should give error/warning instead of "88" - strTemp = strText.Replace(" ", "") - If strTemp <> "" Then - strItems = strTemp.Split(",") - For Each strVal In strItems - If strVal = "" Then Return 1 - Dim clsTempParam As New RParameter - If bIsNumericInput Then - If Not IsNumeric(strVal) AndAlso (Not (bAllowInf AndAlso ({"Inf", "-Inf"}.Contains(strVal)))) Then - Return 2 - ElseIf IsNumeric(strVal) AndAlso (strVal > dcmMaximum OrElse strVal < dcmMinimum) Then - Return 3 - End If - clsTempParam.SetArgumentValue(strVal) - Else - clsTempParam.SetArgumentValue(Chr(34) & strVal & Chr(34)) - End If - clsTempParam.Position = i - clsRList.AddParameter(clsTempParam) - i = i + 1 - Next - End If - Return 0 - End Function - - Private Sub ucrDataFrameSelector_ControlValueChanged(sender As Object) Handles ucrDataFrameSelector.ControlValueChanged - If Not bUserTyped Then - SetDefaultName() - End If - End Sub - - Public Overridable Function IsEmpty() As Boolean - Return True - End Function - - Private Sub ucrInput_Load(sender As Object, e As EventArgs) Handles Me.Load - If Not bUserTyped Then - SetDefaultName() - End If - End Sub - - Private Sub ucrInput_TextChanged(sender As Object, e As EventArgs) Handles Me.TextChanged - SetName(Me.Text, bLastSilent) - End Sub - - Public Overridable Property IsReadOnly() As Boolean - Get - Return bIsReadOnly - End Get - Set(bReadOnly As Boolean) - bIsReadOnly = bReadOnly - End Set - End Property - - Public Overrides Sub SetToValue(objTemp As Object) - If objTemp IsNot Nothing Then - SetName(objTemp.ToString()) - Else - 'If no value reset to a default value - SetName("") - End If - End Sub - - Public Overrides Function GetValueToSet() As Object - Dim clsMainParameter As RParameter - - clsMainParameter = GetParameter() - If clsMainParameter IsNot Nothing Then - If clsMainParameter.bIsString Then - If dctDisplayParameterValues.ContainsKey(clsMainParameter.strArgumentValue) Then - Return clsMainParameter.strArgumentValue - Else - If AddQuotesIfUnrecognised Then - Return clsMainParameter.strArgumentValue.Trim(Chr(34)) - Else - Return clsMainParameter.strArgumentValue - End If - End If - ElseIf clsMainParameter.bIsFunction OrElse clsMainParameter.bIsOperator Then - Return clsMainParameter.clsArgumentCodeStructure - Else - Return "" - End If - Else - Return "" - End If - End Function - - ' key = parameter value - ' value = item text - Public Sub SetParameterValueItemsPairs(dctNewDisplayParameterValues As Dictionary(Of String, String)) - dctDisplayParameterValues = dctNewDisplayParameterValues - End Sub - - Public Sub AddToParameterValueItemsPairs(kvpNewPair As KeyValuePair(Of String, String)) - AddToParameterValueItemsPairs(kvpNewPair.Key, kvpNewPair.Value) - End Sub - - Public Sub AddToParameterValueItemsPairs(strDisplayValue As String, strParameterValue As String) - dctDisplayParameterValues.Add(strDisplayValue, strParameterValue) - End Sub - - Public Property AddQuotesIfUnrecognised As Boolean - Get - Return bPrivateAddQuotesIfUnrecognised - End Get - Set(bValue As Boolean) - bPrivateAddQuotesIfUnrecognised = bValue - If GetText() IsNot Nothing Then - SetName(GetText().Trim(Chr(34))) - End If - End Set - End Property - - Public Overrides Function ControlValueContainedIn(lstTemp() As Object) As Boolean - For Each objTemp As Object In lstTemp - If objTemp.ToString() = GetText() Then - Return True - End If - Next - Return False - End Function - - Protected Overrides Sub ResetControlValue() - SetName("") - End Sub +Imports instat +Imports RDotNet + +Public Class ucrInput + Public bUserTyped As Boolean = False + Public Event NameChanged() + Protected strValidationType As String = "None" + Protected ReadOnly strReservedWords() As String = ({"if", "else", "repeat", "while", "function", "for", "in", "next", "break", "TRUE", "FALSE", "NULL", "Inf", "NaN", "NA", "NA_integer_", "NA_real_", "NA_complex_", "NA_character_"}) + Public clsRList As New RFunction + Protected dcmMinimum As Decimal = Decimal.MinValue + Protected dcmMaximum As Decimal = Decimal.MaxValue + Protected bMinimumIncluded, bMaximumIncluded As Boolean + Protected _strDefaultRObjectTypeLabel As String = "" + Protected strDefaultPrefix As String = "" + Protected WithEvents ucrDataFrameSelector As ucrDataFrame + Protected bIsReadOnly As Boolean = False + Public bAutoChangeOnLeave As Boolean = False + Protected bAllowInf As Boolean = False + Private bLastSilent As Boolean = False + Private bPrivateAddQuotesIfUnrecognised As Boolean = True + Protected dctDisplayParameterValues As New Dictionary(Of String, String) + Protected bFirstLoad As Boolean = True + + 'used to determine if valid expressions are allowed for numeric validations e.g 20/2, 30-1 + Protected bNumericExpressionAllowed As Boolean = True + + Public Sub New() + + ' This call is required by the designer. + InitializeComponent() + + ' Add any initialization after the InitializeComponent() call. + bUpdateRCodeFromControl = False + End Sub + + Public Overridable Sub SetName(strName As String, Optional bSilent As Boolean = False) + bLastSilent = bSilent + End Sub + + Public Overridable Function GetText() As String + Return "" + End Function + + Public Overridable Function GetValue() As Object + Return Nothing + End Function + + Public Overridable Sub Reset() + bUserTyped = False + End Sub + + Public Sub OnNameChanged() + Me.Text = Me.GetText() + RaiseEvent NameChanged() + OnControlValueChanged() + End Sub + + Public Overrides Sub UpdateParameter(clsTempParam As RParameter) + If bChangeParameterValue AndAlso clsTempParam IsNot Nothing Then + If dctDisplayParameterValues.ContainsKey(GetText()) Then + clsTempParam.SetArgumentValue(dctDisplayParameterValues(GetText())) + Else + If AddQuotesIfUnrecognised Then + clsTempParam.SetArgumentValue(Chr(34) & GetText() & Chr(34)) + Else + clsTempParam.SetArgumentValue(GetText()) + End If + End If + End If + End Sub + + Public Function UserTyped() As Boolean + Return bUserTyped + End Function + + Public Sub SetDefaultRObjectTypeLabel(strRObjectTypeLabel As String) + Me._strDefaultRObjectTypeLabel = strRObjectTypeLabel + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsColumn() + _strDefaultRObjectTypeLabel = "Column" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsDataFrame() + _strDefaultRObjectTypeLabel = "Data Frame" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsKey() + _strDefaultRObjectTypeLabel = "Key" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsLink() + _strDefaultRObjectTypeLabel = "Link" + SetDefaultName() + End Sub + + Public Sub SetValidationTypeAsRVariable() + strValidationType = "RVariable" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsFilter() + _strDefaultRObjectTypeLabel = "Filter" + SetDefaultName() + End Sub + + Public Sub SetDefaultTypeAsColumnSelection() + _strDefaultRObjectTypeLabel = "Column Selection" + + SetDefaultName() + End Sub + + Public Overridable Sub SetDataFrameSelector(ucrNewSelector As ucrDataFrame) + ucrDataFrameSelector = ucrNewSelector + If Not bUserTyped Then + SetDefaultName() + End If + End Sub + + Public Sub SetPrefix(strNewPrefix As String) + strDefaultPrefix = strNewPrefix + SetDefaultName() + End Sub + + Public Sub SetDefaultName() + If strDefaultPrefix <> "" Then + Select Case _strDefaultRObjectTypeLabel + Case "Column" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" AndAlso frmMain.clsRLink.DataFrameExists(ucrDataFrameSelector.cboAvailableDataFrames.Text) Then + SetName(frmMain.clsRLink.GetDefaultColumnNames(strDefaultPrefix, ucrDataFrameSelector.cboAvailableDataFrames.Text)) + Else + SetName("") + End If + Case "Data Frame" + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetDataFrameNames())) + Case RObjectTypeLabel.Graph, + RObjectTypeLabel.Table, + RObjectTypeLabel.Model, + RObjectTypeLabel.Structure_label, + RObjectTypeLabel.Summary + 'for objects that are shown in the output viewer. do the following + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.strCurrDataFrame <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, + frmMain.clsRLink.GetObjectNames( + strDataFrameName:=ucrDataFrameSelector.strCurrDataFrame, + strRObjectTypeLabel:=_strDefaultRObjectTypeLabel))) + End If + Case "Filter" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) + Else + SetName("") + End If + + Case "Column Selection" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetColumnSelectionNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) + Else + SetName("") + End If + Case "Key" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetKeyNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) + Else + SetName("") + End If + Case "Link" + If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.cboAvailableDataFrames.Text <> "" Then + SetName(frmMain.clsRLink.GetNextDefault(strDefaultPrefix, frmMain.clsRLink.GetLinkNames(ucrDataFrameSelector.cboAvailableDataFrames.Text))) + Else + SetName("") + End If + End Select + End If + End Sub + + Public Sub SetValidationTypeAsNumeric(Optional dcmMin As Decimal = Decimal.MinValue, Optional bIncludeMin As Boolean = True, Optional dcmMax As Decimal = Decimal.MaxValue, Optional bIncludeMax As Boolean = True, Optional bNumericExpressionAllowed As Boolean = True) + strValidationType = "Numeric" + Me.bNumericExpressionAllowed = bNumericExpressionAllowed + If dcmMin <> Decimal.MinValue Then + dcmMinimum = dcmMin + bMinimumIncluded = bIncludeMin + End If + If dcmMax <> Decimal.MaxValue Then + dcmMaximum = dcmMax + bMaximumIncluded = bIncludeMax + End If + End Sub + + Public Function GetNumericRange() As String + Dim strRange As String = "" + If strValidationType = "Numeric" Then + If dcmMinimum <> Decimal.MinValue Then + If bMinimumIncluded Then + strRange = ">= " & dcmMinimum.ToString() + Else + strRange = "> " & dcmMinimum.ToString() + End If + If dcmMaximum <> Decimal.MaxValue Then + strRange = strRange & " and " + End If + End If + If dcmMaximum <> Decimal.MaxValue Then + If bMaximumIncluded Then + strRange = strRange & "<= " & dcmMaximum.ToString() + Else + strRange = strRange & "< " & dcmMaximum.ToString() + End If + End If + ElseIf strValidationType = "NumericList" Then + If dcmMinimum <> Double.MinValue Then + If bMinimumIncluded Then + strRange = ">= " & dcmMinimum.ToString() + Else + strRange = "> " & dcmMinimum.ToString() + End If + If dcmMaximum <> Double.MaxValue Then + strRange = strRange & " and " + End If + End If + If dcmMaximum <> Double.MaxValue Then + If bMaximumIncluded Then + strRange = strRange & "<= " & dcmMaximum.ToString() + Else + strRange = strRange & "< " & dcmMaximum.ToString() + End If + End If + End If + Return strRange + End Function + + Public Sub SetValidationTypeAsList() + strValidationType = "List" + End Sub + + Public Sub SetValidationTypeAsNumericList(Optional bNewAllowInf As Boolean = False, Optional bIncludeMin As Boolean = True, Optional dcmMin As Double = Double.MinValue, Optional dcmMax As Double = Double.MaxValue, Optional bIncludeMax As Boolean = True) + ' Dim Dmax As Double = Maximum + ' Dim Dmin As Double = Minimum + strValidationType = "NumericList" + If dcmMin <> Double.MinValue Then + dcmMinimum = dcmMin + End If + If dcmMax <> Double.MaxValue Then + dcmMaximum = dcmMax + End If + bAllowInf = bNewAllowInf + End Sub + + Public Function IsValid(strText As String) As Boolean + Return (GetValidationCode(strText) = 0) + End Function + + Public Function GetValidationCode(strText As String) As Integer + Dim iType As Integer + Select Case strValidationType + Case "None" + iType = 0 + Case "RVariable" + iType = ValidateRVariable(strText) + Case "Numeric" + iType = ValidateNumeric(strText) + Case "List" + iType = ValidateList(strText, False) + Case "NumericList" + iType = ValidateList(strText, True, bAllowInf) + End Select + Return iType + End Function + + Public Function ValidateText(strText As String) As Boolean + Dim iValidationCode As Integer + + iValidationCode = GetValidationCode(strText) + + Select Case iValidationCode + Case 0 + + Case 1 + Select Case strValidationType + Case "RVariable" + MsgBox(Chr(34) & strText & Chr(34) & " is a reserved word in R and cannot be used.", vbOKOnly) + Case "Numeric" + MsgBox("Entry must be numeric.", vbOKOnly) + Case "List" + MsgBox("Textbox requires a list separated by commas.", vbOKOnly, "Validation Error") + Case "NumericList" + MsgBox("Textbox requires a list of numbers separated by commas.", vbOKOnly, "Validation Error") + End Select + Case 2 + Select Case strValidationType + Case "RVariable" + MsgBox("This name cannot start with " & strText(0), vbOKOnly) + Case "Numeric" + MsgBox("This number must be: " & GetNumericRange(), vbOKOnly) + Case "NumericList" + MsgBox("Each item in the list must be numeric.", vbOKOnly, "Validation Error") + End Select + Case 3 + Select Case strValidationType + Case "RVariable" + MsgBox("This name cannot start with a dot followed by a number/nothing", vbOKOnly) + Case "NumericList" + MsgBox("Each item in the list must be " & GetNumericRange(), vbOKOnly, "Validation Error") + End Select + Case 4 + Select Case strValidationType + Case "RVariable" + MsgBox("This name cannot contain a space", vbOKOnly) + End Select + Case 5 + Select Case strValidationType + Case "RVariable" + MsgBox("This name contains an invalid character", vbOKOnly) + + End Select + End Select + Return (iValidationCode = 0) + + End Function + + 'Returns integer as code for validation + ' 0 : string is valid + ' 1 : string is not numeric + ' 2 : string is outside range + Public Function ValidateNumeric(strText As String) As Integer + Dim dcmText As Decimal + Dim iType As Integer = 0 + + If strText <> "" AndAlso (strValuesToIgnore Is Nothing OrElse (strValuesToIgnore IsNot Nothing AndAlso Not strValuesToIgnore.Contains(strText))) Then + If Not IsNumeric(strText) Then + iType = 1 'reset as invalid entry + 'if numeric expressions are allowed check the expression results to a valid numeric + If bNumericExpressionAllowed Then + Dim vecOutput As CharacterVector + 'is.numeric(x) returns true if the x expression is a valid one. + 'So we use it here to check validity of the entry + vecOutput = frmMain.clsRLink.RunInternalScriptGetOutput("is.numeric(" & strText & ")", bSilent:=True) + If vecOutput IsNot Nothing AndAlso vecOutput.Length > 0 AndAlso Mid(vecOutput(0), 5).ToUpper = "TRUE" Then + iType = 0 'set as valid entry + End If + End If + Else + dcmText = Convert.ToDecimal(strText) + If (dcmText < dcmMinimum) OrElse (dcmText > dcmMaximum) OrElse (Not bMinimumIncluded And dcmText <= dcmMinimum) OrElse (Not bMaximumIncluded And dcmText >= dcmMaximum) Then + iType = 2 + End If + End If + End If + Return iType + End Function + + 'Returns integer as code for validation + ' 0 : string is valid + ' 1 : string is a reserved word + ' 2 : string starts with invalid character + ' 3 : string starts with "." followed by a number/nothing + ' 4 : string contains a space + ' 5 : string contains other invalid character + Public Function ValidateRVariable(strText As String) As Integer + Dim chrFirst As Char + Dim chrCurr As Char + Dim bAcceptableString As Boolean + + If strText = "" Then + Return 0 + End If + + If strReservedWords.Contains(strText) Then + Return 1 + End If + chrFirst = strText(0) + If Not Char.IsLetter(chrFirst) Then + If chrFirst <> "." Then + Return 2 + Else + If strText.Length > 1 Then + If Char.IsNumber(strText(1)) Then + Return 3 + End If + Else + Return 3 + End If + End If + End If + + For Each chrCurr In strText + bAcceptableString = Char.IsLetterOrDigit(chrCurr) Or chrCurr = "." Or chrCurr = "_" + If Not bAcceptableString Then + If chrCurr = " " Then + Return 4 + Else + Return 5 + End If + End If + Next + Return 0 + End Function + + 'Returns integer as code for validation + ' 0 : string is valid + ' 1 : an item is empty + ' 2 : an item is not numeric + ' 3 : an item is between max and min values + Public Function ValidateList(strText As String, Optional bIsNumericInput As Boolean = False, Optional bAllowInf As Boolean = False) As Integer + Dim strItems As String() + Dim strTemp As String + Dim i As Integer = 0 + If strText = "" Then Return 0 + clsRList.ClearParameters() + clsRList.SetRCommand("c") + 'TODO deal with spaces differently e.g. "8 8" should give error/warning instead of "88" + strTemp = strText.Replace(" ", "") + If strTemp <> "" Then + strItems = strTemp.Split(",") + For Each strVal In strItems + If strVal = "" Then Return 1 + Dim clsTempParam As New RParameter + If bIsNumericInput Then + If Not IsNumeric(strVal) AndAlso (Not (bAllowInf AndAlso ({"Inf", "-Inf"}.Contains(strVal)))) Then + Return 2 + ElseIf IsNumeric(strVal) AndAlso (strVal > dcmMaximum OrElse strVal < dcmMinimum) Then + Return 3 + End If + clsTempParam.SetArgumentValue(strVal) + Else + clsTempParam.SetArgumentValue(Chr(34) & strVal & Chr(34)) + End If + clsTempParam.Position = i + clsRList.AddParameter(clsTempParam) + i = i + 1 + Next + End If + Return 0 + End Function + + Private Sub ucrDataFrameSelector_ControlValueChanged(sender As Object) Handles ucrDataFrameSelector.ControlValueChanged + If Not bUserTyped Then + SetDefaultName() + End If + End Sub + + Public Overridable Function IsEmpty() As Boolean + Return True + End Function + + Private Sub ucrInput_Load(sender As Object, e As EventArgs) Handles Me.Load + If Not bUserTyped Then + SetDefaultName() + End If + End Sub + + Private Sub ucrInput_TextChanged(sender As Object, e As EventArgs) Handles Me.TextChanged + SetName(Me.Text, bLastSilent) + End Sub + + Public Overridable Property IsReadOnly() As Boolean + Get + Return bIsReadOnly + End Get + Set(bReadOnly As Boolean) + bIsReadOnly = bReadOnly + End Set + End Property + + Public Overrides Sub SetToValue(objTemp As Object) + If objTemp IsNot Nothing Then + SetName(objTemp.ToString()) + Else + 'If no value reset to a default value + SetName("") + End If + End Sub + + Public Overrides Function GetValueToSet() As Object + Dim clsMainParameter As RParameter + + clsMainParameter = GetParameter() + If clsMainParameter IsNot Nothing Then + If clsMainParameter.bIsString Then + If dctDisplayParameterValues.ContainsKey(clsMainParameter.strArgumentValue) Then + Return clsMainParameter.strArgumentValue + Else + If AddQuotesIfUnrecognised Then + Return clsMainParameter.strArgumentValue.Trim(Chr(34)) + Else + Return clsMainParameter.strArgumentValue + End If + End If + ElseIf clsMainParameter.bIsFunction OrElse clsMainParameter.bIsOperator Then + Return clsMainParameter.clsArgumentCodeStructure + Else + Return "" + End If + Else + Return "" + End If + End Function + + ' key = parameter value + ' value = item text + Public Sub SetParameterValueItemsPairs(dctNewDisplayParameterValues As Dictionary(Of String, String)) + dctDisplayParameterValues = dctNewDisplayParameterValues + End Sub + + Public Sub AddToParameterValueItemsPairs(kvpNewPair As KeyValuePair(Of String, String)) + AddToParameterValueItemsPairs(kvpNewPair.Key, kvpNewPair.Value) + End Sub + + Public Sub AddToParameterValueItemsPairs(strDisplayValue As String, strParameterValue As String) + dctDisplayParameterValues.Add(strDisplayValue, strParameterValue) + End Sub + + Public Property AddQuotesIfUnrecognised As Boolean + Get + Return bPrivateAddQuotesIfUnrecognised + End Get + Set(bValue As Boolean) + bPrivateAddQuotesIfUnrecognised = bValue + If GetText() IsNot Nothing Then + SetName(GetText().Trim(Chr(34))) + End If + End Set + End Property + + Public Overrides Function ControlValueContainedIn(lstTemp() As Object) As Boolean + For Each objTemp As Object In lstTemp + If objTemp.ToString() = GetText() Then + Return True + End If + Next + Return False + End Function + + Protected Overrides Sub ResetControlValue() + SetName("") + End Sub End Class \ No newline at end of file From 755dea2addfaac9859dcfd39d0ff404d4e9d4667 Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Mon, 26 Sep 2022 17:22:31 +0300 Subject: [PATCH 029/122] Remove NA's from the Dataset. --- instat/dlgExtremes.vb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index d2e4662181f..99b35486fb6 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -21,7 +21,7 @@ Public Class dlgExtremes Private clsDetachFunction As New RFunction Private clsFevdFunction, clsPriorParamListFunction, clsPlotsFunction, clsConcatenateFunction, clsConfidenceIntervalFunction, -clsInitialListFunction As New RFunction +clsInitialListFunction, clsOmitMissingFunction As New RFunction 'clsLocationScaleResetOperator is not run but affects reset of the check box.Any better method of implementation? Private clsLocationScaleResetOperator As New ROperator Private clsLocationParamOperator As New ROperator @@ -101,6 +101,7 @@ clsInitialListFunction As New RFunction clsDetachFunction = New RFunction clsConfidenceIntervalFunction = New RFunction clsConcatenateFunction = New RFunction + clsOmitMissingFunction = New RFunction ucrBase.clsRsyntax.ClearCodes() ucrReceiverVariable.SetMeAsReceiver() @@ -145,10 +146,15 @@ clsInitialListFunction As New RFunction clsPlotsFunction.SetAssignTo("last_graph", strTempDataframe:=ucrSelectorExtremes.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempGraph:="last_graph") clsPlotsFunction.AddParameter("x", clsRFunctionParameter:=clsFevdFunction, iPosition:=0) + clsOmitMissingFunction.SetRCommand("na.omit") + clsOmitMissingFunction.SetPackageName("stats") + clsOmitMissingFunction.AddParameter("object", clsRFunctionParameter:=ucrSelectorExtremes.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) + + clsAttachFunction.SetRCommand("attach") clsDetachFunction.SetRCommand("detach") - clsAttachFunction.AddParameter("what", clsRFunctionParameter:=ucrSelectorExtremes.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) - clsDetachFunction.AddParameter("name", clsRFunctionParameter:=ucrSelectorExtremes.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) + clsAttachFunction.AddParameter("what", clsRFunctionParameter:=clsOmitMissingFunction, iPosition:=0) + clsDetachFunction.AddParameter("name", clsRFunctionParameter:=clsOmitMissingFunction, iPosition:=0) clsDetachFunction.AddParameter("unload", "TRUE", iPosition:=2) ucrBase.clsRsyntax.AddToBeforeCodes(clsAttachFunction) From 17312e35b45ab1bbbce60c33b980429933ce41b6 Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Tue, 27 Sep 2022 12:09:08 +0300 Subject: [PATCH 030/122] Add Non-Stationary Models --- instat/dlgExtremes.vb | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index 99b35486fb6..b9cc1ab2beb 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -125,12 +125,12 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction clsPlotsFunction.bExcludeAssignedFunctionOutput = False clsPriorParamListFunction.SetRCommand("list") - clsPriorParamListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=5) + 'clsPriorParamListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=5) clsInitialListFunction.SetRCommand("list") - clsInitialListFunction.AddParameter("location", "0", iPosition:=0) - clsInitialListFunction.AddParameter("scale", "0.1", iPosition:=1) - clsInitialListFunction.AddParameter("shape", "-0.5", iPosition:=2) + 'clsInitialListFunction.AddParameter("location", "0", iPosition:=0) + 'clsInitialListFunction.AddParameter("scale", "0.1", iPosition:=1) + 'clsInitialListFunction.AddParameter("shape", "-0.5", iPosition:=2) clsConfidenceIntervalFunction.SetPackageName("extRemes") clsConfidenceIntervalFunction.SetRCommand("ci.fevd") @@ -308,5 +308,19 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction grpFirstCalc.Visible = False grpSecondCalc.Visible = False End If + AddNonStationaryModels() + End Sub + Private Sub AddNonStationaryModels() + If ucrChkExplanatoryModelForLocationParameter.Checked Then + clsInitialListFunction.RemoveParameterByName("location") + clsInitialListFunction.RemoveParameterByName("scale") + clsInitialListFunction.RemoveParameterByName("shape") + clsPriorParamListFunction.RemoveParameterByName("v") + Else + clsPriorParamListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=5) + clsInitialListFunction.AddParameter("location", "0", iPosition:=0) + clsInitialListFunction.AddParameter("scale", "0.1", iPosition:=1) + clsInitialListFunction.AddParameter("shape", "-0.5", iPosition:=2) + End If End Sub End Class From b06a71f9581afcc32ed8ecd14b9322415209dacb Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Wed, 28 Sep 2022 09:48:49 +0300 Subject: [PATCH 031/122] code cleaning --- instat/ucrFactor.vb | 1 - instat/ucrFilter.vb | 1 - 2 files changed, 2 deletions(-) diff --git a/instat/ucrFactor.vb b/instat/ucrFactor.vb index a0840124534..87b0ba82bad 100644 --- a/instat/ucrFactor.vb +++ b/instat/ucrFactor.vb @@ -145,7 +145,6 @@ Public Class ucrFactor If Not value Then Me.Controls.Remove(pnlSelectOptions) ElseIf Not Me.Controls.Contains(pnlSelectOptions) Then - 'pnlSelectOptions.Anchor = (AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Bottom ) Me.Controls.Add(pnlSelectOptions) End If End Set diff --git a/instat/ucrFilter.vb b/instat/ucrFilter.vb index f41d0866c7f..83295bd8277 100644 --- a/instat/ucrFilter.vb +++ b/instat/ucrFilter.vb @@ -108,7 +108,6 @@ Public Class ucrFilter If Not ucrFilterByReceiver.IsEmpty() Then If ucrFilterByReceiver.strCurrDataType.ToLower.Contains("factor") Then ucrFactorLevels.Visible = True - 'ucrFactorLevels.SetSelectionAllLevels(False) 'by default don't select any factors Else ucrFilterOperation.Visible = True If ucrFilterOperation.GetText() <> "is.na" AndAlso ucrFilterOperation.GetText() <> "! is.na" AndAlso ucrFilterOperation.GetText() <> "is.empty" AndAlso ucrFilterOperation.GetText() <> "! is.empty" Then From 61dbebde3aa341876ec53eff458a6d9bd3a582d0 Mon Sep 17 00:00:00 2001 From: Fidel365 <107605960+Fidel365@users.noreply.github.com> Date: Sat, 1 Oct 2022 14:34:55 +0300 Subject: [PATCH 032/122] Aligning controls --- instat/dlgLinePlot.designer.vb | 218 ++++++++++++++++----------------- instat/dlgLinePlot.vb | 4 + 2 files changed, 113 insertions(+), 109 deletions(-) diff --git a/instat/dlgLinePlot.designer.vb b/instat/dlgLinePlot.designer.vb index d847876d2d6..ed9d0556e2c 100644 --- a/instat/dlgLinePlot.designer.vb +++ b/instat/dlgLinePlot.designer.vb @@ -51,6 +51,13 @@ Partial Class dlgLinePlot Me.lblMethod = New System.Windows.Forms.Label() Me.lblFamily = New System.Windows.Forms.Label() Me.grpSmoothOptions = New System.Windows.Forms.GroupBox() + Me.ucrInputFormula = New instat.ucrInputComboBox() + Me.ucrChkSpan = New instat.ucrCheck() + Me.ucrChkFormula = New instat.ucrCheck() + Me.ucrChkAddSE = New instat.ucrCheck() + Me.ucrNudSpan = New instat.ucrNud() + Me.ucrFamilyInput = New instat.ucrInputComboBox() + Me.ucrInputMethod = New instat.ucrInputComboBox() Me.rdoSlope = New System.Windows.Forms.RadioButton() Me.rdoDumbbell = New System.Windows.Forms.RadioButton() Me.lblXEnd = New System.Windows.Forms.Label() @@ -88,13 +95,6 @@ Partial Class dlgLinePlot Me.ucrChkDumbbellSize = New instat.ucrCheck() Me.ucrReceiverGroup = New instat.ucrReceiverSingle() Me.ucrReceiverSlopeY = New instat.ucrReceiverSingle() - Me.ucrInputFormula = New instat.ucrInputComboBox() - Me.ucrChkSpan = New instat.ucrCheck() - Me.ucrChkFormula = New instat.ucrCheck() - Me.ucrChkAddSE = New instat.ucrCheck() - Me.ucrNudSpan = New instat.ucrNud() - Me.ucrFamilyInput = New instat.ucrInputComboBox() - Me.ucrInputMethod = New instat.ucrInputComboBox() Me.ucrChkAddLine = New instat.ucrCheck() Me.ucrPnlOptions = New instat.UcrPanel() Me.ucrPnlStepOrPath = New instat.UcrPanel() @@ -188,7 +188,7 @@ Partial Class dlgLinePlot ' Me.rdoPath.AutoSize = True Me.rdoPath.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoPath.Location = New System.Drawing.Point(154, 417) + Me.rdoPath.Location = New System.Drawing.Point(165, 417) Me.rdoPath.Name = "rdoPath" Me.rdoPath.Size = New System.Drawing.Size(47, 17) Me.rdoPath.TabIndex = 29 @@ -200,7 +200,7 @@ Partial Class dlgLinePlot ' Me.rdoStep.AutoSize = True Me.rdoStep.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoStep.Location = New System.Drawing.Point(215, 417) + Me.rdoStep.Location = New System.Drawing.Point(220, 417) Me.rdoStep.Name = "rdoStep" Me.rdoStep.Size = New System.Drawing.Size(47, 17) Me.rdoStep.TabIndex = 30 @@ -284,6 +284,79 @@ Partial Class dlgLinePlot Me.grpSmoothOptions.TabStop = False Me.grpSmoothOptions.Text = "Smooth Options" ' + 'ucrInputFormula + ' + Me.ucrInputFormula.AddQuotesIfUnrecognised = True + Me.ucrInputFormula.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputFormula.GetSetSelectedIndex = -1 + Me.ucrInputFormula.IsReadOnly = False + Me.ucrInputFormula.Location = New System.Drawing.Point(73, 46) + Me.ucrInputFormula.Name = "ucrInputFormula" + Me.ucrInputFormula.Size = New System.Drawing.Size(110, 23) + Me.ucrInputFormula.TabIndex = 7 + ' + 'ucrChkSpan + ' + Me.ucrChkSpan.AutoSize = True + Me.ucrChkSpan.Checked = False + Me.ucrChkSpan.Location = New System.Drawing.Point(185, 20) + Me.ucrChkSpan.Name = "ucrChkSpan" + Me.ucrChkSpan.Size = New System.Drawing.Size(54, 23) + Me.ucrChkSpan.TabIndex = 3 + ' + 'ucrChkFormula + ' + Me.ucrChkFormula.AutoSize = True + Me.ucrChkFormula.Checked = False + Me.ucrChkFormula.Location = New System.Drawing.Point(5, 49) + Me.ucrChkFormula.Name = "ucrChkFormula" + Me.ucrChkFormula.Size = New System.Drawing.Size(66, 23) + Me.ucrChkFormula.TabIndex = 6 + ' + 'ucrChkAddSE + ' + Me.ucrChkAddSE.AutoSize = True + Me.ucrChkAddSE.Checked = False + Me.ucrChkAddSE.Location = New System.Drawing.Point(195, 49) + Me.ucrChkAddSE.Name = "ucrChkAddSE" + Me.ucrChkAddSE.Size = New System.Drawing.Size(75, 23) + Me.ucrChkAddSE.TabIndex = 8 + ' + 'ucrNudSpan + ' + Me.ucrNudSpan.AutoSize = True + Me.ucrNudSpan.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSpan.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudSpan.Location = New System.Drawing.Point(239, 20) + Me.ucrNudSpan.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudSpan.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSpan.Name = "ucrNudSpan" + Me.ucrNudSpan.Size = New System.Drawing.Size(50, 20) + Me.ucrNudSpan.TabIndex = 5 + Me.ucrNudSpan.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrFamilyInput + ' + Me.ucrFamilyInput.AddQuotesIfUnrecognised = True + Me.ucrFamilyInput.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrFamilyInput.GetSetSelectedIndex = -1 + Me.ucrFamilyInput.IsReadOnly = False + Me.ucrFamilyInput.Location = New System.Drawing.Point(210, 20) + Me.ucrFamilyInput.Name = "ucrFamilyInput" + Me.ucrFamilyInput.Size = New System.Drawing.Size(110, 24) + Me.ucrFamilyInput.TabIndex = 4 + ' + 'ucrInputMethod + ' + Me.ucrInputMethod.AddQuotesIfUnrecognised = True + Me.ucrInputMethod.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrInputMethod.GetSetSelectedIndex = -1 + Me.ucrInputMethod.IsReadOnly = False + Me.ucrInputMethod.Location = New System.Drawing.Point(52, 20) + Me.ucrInputMethod.Name = "ucrInputMethod" + Me.ucrInputMethod.Size = New System.Drawing.Size(90, 21) + Me.ucrInputMethod.TabIndex = 1 + ' 'rdoSlope ' Me.rdoSlope.Appearance = System.Windows.Forms.Appearance.Button @@ -370,7 +443,7 @@ Partial Class dlgLinePlot ' Me.lblXColour.AutoSize = True Me.lblXColour.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblXColour.Location = New System.Drawing.Point(93, 322) + Me.lblXColour.Location = New System.Drawing.Point(93, 326) Me.lblXColour.Name = "lblXColour" Me.lblXColour.Size = New System.Drawing.Size(17, 13) Me.lblXColour.TabIndex = 9 @@ -380,7 +453,7 @@ Partial Class dlgLinePlot ' Me.lblLineSize.AutoSize = True Me.lblLineSize.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblLineSize.Location = New System.Drawing.Point(308, 358) + Me.lblLineSize.Location = New System.Drawing.Point(308, 354) Me.lblLineSize.Name = "lblLineSize" Me.lblLineSize.Size = New System.Drawing.Size(30, 13) Me.lblLineSize.TabIndex = 50 @@ -400,7 +473,7 @@ Partial Class dlgLinePlot ' Me.lblXSize.AutoSize = True Me.lblXSize.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblXSize.Location = New System.Drawing.Point(94, 358) + Me.lblXSize.Location = New System.Drawing.Point(94, 355) Me.lblXSize.Name = "lblXSize" Me.lblXSize.Size = New System.Drawing.Size(17, 13) Me.lblXSize.TabIndex = 52 @@ -430,7 +503,7 @@ Partial Class dlgLinePlot ' Me.lblSlopeLabelSize.AutoSize = True Me.lblSlopeLabelSize.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSlopeLabelSize.Location = New System.Drawing.Point(198, 322) + Me.lblSlopeLabelSize.Location = New System.Drawing.Point(215, 322) Me.lblSlopeLabelSize.Name = "lblSlopeLabelSize" Me.lblSlopeLabelSize.Size = New System.Drawing.Size(30, 13) Me.lblSlopeLabelSize.TabIndex = 68 @@ -460,7 +533,7 @@ Partial Class dlgLinePlot ' Me.lblSlopeTextSize.AutoSize = True Me.lblSlopeTextSize.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSlopeTextSize.Location = New System.Drawing.Point(202, 355) + Me.lblSlopeTextSize.Location = New System.Drawing.Point(216, 355) Me.lblSlopeTextSize.Name = "lblSlopeTextSize" Me.lblSlopeTextSize.Size = New System.Drawing.Size(30, 13) Me.lblSlopeTextSize.TabIndex = 65 @@ -470,7 +543,7 @@ Partial Class dlgLinePlot ' Me.lblSlopeYTextSize.AutoSize = True Me.lblSlopeYTextSize.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSlopeYTextSize.Location = New System.Drawing.Point(286, 354) + Me.lblSlopeYTextSize.Location = New System.Drawing.Point(299, 354) Me.lblSlopeYTextSize.Name = "lblSlopeYTextSize" Me.lblSlopeYTextSize.Size = New System.Drawing.Size(61, 13) Me.lblSlopeYTextSize.TabIndex = 64 @@ -500,7 +573,7 @@ Partial Class dlgLinePlot ' Me.lblSlopeLineTicknes.AutoSize = True Me.lblSlopeLineTicknes.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSlopeLineTicknes.Location = New System.Drawing.Point(191, 381) + Me.lblSlopeLineTicknes.Location = New System.Drawing.Point(210, 381) Me.lblSlopeLineTicknes.Name = "lblSlopeLineTicknes" Me.lblSlopeLineTicknes.Size = New System.Drawing.Size(54, 13) Me.lblSlopeLineTicknes.TabIndex = 72 @@ -533,7 +606,7 @@ Partial Class dlgLinePlot Me.ucrNudSlopeLineThickness.AutoSize = True Me.ucrNudSlopeLineThickness.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudSlopeLineThickness.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudSlopeLineThickness.Location = New System.Drawing.Point(246, 381) + Me.ucrNudSlopeLineThickness.Location = New System.Drawing.Point(264, 378) Me.ucrNudSlopeLineThickness.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudSlopeLineThickness.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudSlopeLineThickness.Name = "ucrNudSlopeLineThickness" @@ -549,7 +622,7 @@ Partial Class dlgLinePlot Me.ucrInputSlopeLineColour.IsReadOnly = False Me.ucrInputSlopeLineColour.Location = New System.Drawing.Point(134, 377) Me.ucrInputSlopeLineColour.Name = "ucrInputSlopeLineColour" - Me.ucrInputSlopeLineColour.Size = New System.Drawing.Size(55, 21) + Me.ucrInputSlopeLineColour.Size = New System.Drawing.Size(69, 21) Me.ucrInputSlopeLineColour.TabIndex = 63 ' 'ucrInputSlopeTextColour @@ -560,7 +633,7 @@ Partial Class dlgLinePlot Me.ucrInputSlopeTextColour.IsReadOnly = False Me.ucrInputSlopeTextColour.Location = New System.Drawing.Point(134, 348) Me.ucrInputSlopeTextColour.Name = "ucrInputSlopeTextColour" - Me.ucrInputSlopeTextColour.Size = New System.Drawing.Size(55, 21) + Me.ucrInputSlopeTextColour.Size = New System.Drawing.Size(69, 21) Me.ucrInputSlopeTextColour.TabIndex = 62 ' 'ucrInputSlopeLabelColour @@ -571,7 +644,7 @@ Partial Class dlgLinePlot Me.ucrInputSlopeLabelColour.IsReadOnly = False Me.ucrInputSlopeLabelColour.Location = New System.Drawing.Point(134, 319) Me.ucrInputSlopeLabelColour.Name = "ucrInputSlopeLabelColour" - Me.ucrInputSlopeLabelColour.Size = New System.Drawing.Size(55, 21) + Me.ucrInputSlopeLabelColour.Size = New System.Drawing.Size(69, 21) Me.ucrInputSlopeLabelColour.TabIndex = 56 ' 'ucrNudSlopeTextSize @@ -608,7 +681,7 @@ Partial Class dlgLinePlot Me.ucrInputDumbbellLine.IsReadOnly = False Me.ucrInputDumbbellLine.Location = New System.Drawing.Point(341, 318) Me.ucrInputDumbbellLine.Name = "ucrInputDumbbellLine" - Me.ucrInputDumbbellLine.Size = New System.Drawing.Size(50, 21) + Me.ucrInputDumbbellLine.Size = New System.Drawing.Size(69, 21) Me.ucrInputDumbbellLine.TabIndex = 49 ' 'ucrInputDumbbellXEnd @@ -619,7 +692,7 @@ Partial Class dlgLinePlot Me.ucrInputDumbbellXEnd.IsReadOnly = False Me.ucrInputDumbbellXEnd.Location = New System.Drawing.Point(229, 318) Me.ucrInputDumbbellXEnd.Name = "ucrInputDumbbellXEnd" - Me.ucrInputDumbbellXEnd.Size = New System.Drawing.Size(59, 21) + Me.ucrInputDumbbellXEnd.Size = New System.Drawing.Size(68, 21) Me.ucrInputDumbbellXEnd.TabIndex = 48 ' 'ucrInputDumbbellX @@ -630,7 +703,7 @@ Partial Class dlgLinePlot Me.ucrInputDumbbellX.IsReadOnly = False Me.ucrInputDumbbellX.Location = New System.Drawing.Point(112, 320) Me.ucrInputDumbbellX.Name = "ucrInputDumbbellX" - Me.ucrInputDumbbellX.Size = New System.Drawing.Size(55, 21) + Me.ucrInputDumbbellX.Size = New System.Drawing.Size(71, 21) Me.ucrInputDumbbellX.TabIndex = 9 ' 'ucrNudDumbbellLine @@ -707,79 +780,6 @@ Partial Class dlgLinePlot Me.ucrReceiverSlopeY.TabIndex = 10 Me.ucrReceiverSlopeY.ucrSelector = Nothing ' - 'ucrInputFormula - ' - Me.ucrInputFormula.AddQuotesIfUnrecognised = True - Me.ucrInputFormula.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputFormula.GetSetSelectedIndex = -1 - Me.ucrInputFormula.IsReadOnly = False - Me.ucrInputFormula.Location = New System.Drawing.Point(73, 46) - Me.ucrInputFormula.Name = "ucrInputFormula" - Me.ucrInputFormula.Size = New System.Drawing.Size(110, 23) - Me.ucrInputFormula.TabIndex = 7 - ' - 'ucrChkSpan - ' - Me.ucrChkSpan.AutoSize = True - Me.ucrChkSpan.Checked = False - Me.ucrChkSpan.Location = New System.Drawing.Point(185, 20) - Me.ucrChkSpan.Name = "ucrChkSpan" - Me.ucrChkSpan.Size = New System.Drawing.Size(54, 23) - Me.ucrChkSpan.TabIndex = 3 - ' - 'ucrChkFormula - ' - Me.ucrChkFormula.AutoSize = True - Me.ucrChkFormula.Checked = False - Me.ucrChkFormula.Location = New System.Drawing.Point(5, 49) - Me.ucrChkFormula.Name = "ucrChkFormula" - Me.ucrChkFormula.Size = New System.Drawing.Size(66, 23) - Me.ucrChkFormula.TabIndex = 6 - ' - 'ucrChkAddSE - ' - Me.ucrChkAddSE.AutoSize = True - Me.ucrChkAddSE.Checked = False - Me.ucrChkAddSE.Location = New System.Drawing.Point(183, 49) - Me.ucrChkAddSE.Name = "ucrChkAddSE" - Me.ucrChkAddSE.Size = New System.Drawing.Size(75, 23) - Me.ucrChkAddSE.TabIndex = 8 - ' - 'ucrNudSpan - ' - Me.ucrNudSpan.AutoSize = True - Me.ucrNudSpan.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSpan.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudSpan.Location = New System.Drawing.Point(239, 20) - Me.ucrNudSpan.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudSpan.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSpan.Name = "ucrNudSpan" - Me.ucrNudSpan.Size = New System.Drawing.Size(50, 20) - Me.ucrNudSpan.TabIndex = 5 - Me.ucrNudSpan.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrFamilyInput - ' - Me.ucrFamilyInput.AddQuotesIfUnrecognised = True - Me.ucrFamilyInput.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrFamilyInput.GetSetSelectedIndex = -1 - Me.ucrFamilyInput.IsReadOnly = False - Me.ucrFamilyInput.Location = New System.Drawing.Point(210, 20) - Me.ucrFamilyInput.Name = "ucrFamilyInput" - Me.ucrFamilyInput.Size = New System.Drawing.Size(110, 24) - Me.ucrFamilyInput.TabIndex = 4 - ' - 'ucrInputMethod - ' - Me.ucrInputMethod.AddQuotesIfUnrecognised = True - Me.ucrInputMethod.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrInputMethod.GetSetSelectedIndex = -1 - Me.ucrInputMethod.IsReadOnly = False - Me.ucrInputMethod.Location = New System.Drawing.Point(52, 20) - Me.ucrInputMethod.Name = "ucrInputMethod" - Me.ucrInputMethod.Size = New System.Drawing.Size(90, 21) - Me.ucrInputMethod.TabIndex = 1 - ' 'ucrChkAddLine ' Me.ucrChkAddLine.AutoSize = True @@ -836,7 +836,7 @@ Partial Class dlgLinePlot ' Me.ucrChkWithSE.AutoSize = True Me.ucrChkWithSE.Checked = False - Me.ucrChkWithSE.Location = New System.Drawing.Point(258, 363) + Me.ucrChkWithSE.Location = New System.Drawing.Point(248, 362) Me.ucrChkWithSE.Name = "ucrChkWithSE" Me.ucrChkWithSE.Size = New System.Drawing.Size(72, 23) Me.ucrChkWithSE.TabIndex = 26 @@ -972,7 +972,7 @@ Partial Class dlgLinePlot Me.UcrNudSlopeYTextSize.AutoSize = True Me.UcrNudSlopeYTextSize.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.UcrNudSlopeYTextSize.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.UcrNudSlopeYTextSize.Location = New System.Drawing.Point(347, 350) + Me.UcrNudSlopeYTextSize.Location = New System.Drawing.Point(364, 350) Me.UcrNudSlopeYTextSize.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.UcrNudSlopeYTextSize.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.UcrNudSlopeYTextSize.Name = "UcrNudSlopeYTextSize" @@ -1022,20 +1022,13 @@ Partial Class dlgLinePlot Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.ClientSize = New System.Drawing.Size(423, 523) Me.Controls.Add(Me.ucrChkSlopeLegend) - Me.Controls.Add(Me.ucrNudSlopeLabelPadding) - Me.Controls.Add(Me.lblSlopeLineTicknes) - Me.Controls.Add(Me.ucrNudSlopeLineThickness) Me.Controls.Add(Me.lblSlopeLineColour) Me.Controls.Add(Me.lblSlopeLabelSize) Me.Controls.Add(Me.lblSlopeLabelPadding) - Me.Controls.Add(Me.lblSopeTextColour) Me.Controls.Add(Me.lblSlopeTextSize) - Me.Controls.Add(Me.lblSlopeLabelColour) Me.Controls.Add(Me.ucrInputSlopeLineColour) Me.Controls.Add(Me.ucrInputSlopeTextColour) - Me.Controls.Add(Me.ucrInputSlopeLabelColour) Me.Controls.Add(Me.ucrNudSlopeTextSize) - Me.Controls.Add(Me.ucrNudSlopeLabelSize) Me.Controls.Add(Me.lblXEndColour) Me.Controls.Add(Me.lblLineColour) Me.Controls.Add(Me.lblXSize) @@ -1044,8 +1037,6 @@ Partial Class dlgLinePlot Me.Controls.Add(Me.lblXColour) Me.Controls.Add(Me.ucrInputDumbbellLine) Me.Controls.Add(Me.ucrInputDumbbellXEnd) - Me.Controls.Add(Me.ucrInputDumbbellX) - Me.Controls.Add(Me.ucrNudDumbbellLine) Me.Controls.Add(Me.ucrNudDumbbellXEnd) Me.Controls.Add(Me.ucrNudDumbbellX) Me.Controls.Add(Me.ucrChkDumbbellSize) @@ -1056,7 +1047,6 @@ Partial Class dlgLinePlot Me.Controls.Add(Me.lblSlopeY) Me.Controls.Add(Me.rdoSlope) Me.Controls.Add(Me.rdoDumbbell) - Me.Controls.Add(Me.grpSmoothOptions) Me.Controls.Add(Me.ucrChkAddLine) Me.Controls.Add(Me.rdoSmoothing) Me.Controls.Add(Me.rdoLine) @@ -1066,7 +1056,6 @@ Partial Class dlgLinePlot Me.Controls.Add(Me.ucrPnlStepOrPath) Me.Controls.Add(Me.ucrChkPathOrStep) Me.Controls.Add(Me.lblGroupLine) - Me.Controls.Add(Me.ucrChkValley) Me.Controls.Add(Me.ucrChkPeak) Me.Controls.Add(Me.ucrChkWithSE) Me.Controls.Add(Me.ucrChkLineofBestFit) @@ -1092,6 +1081,17 @@ Partial Class dlgLinePlot Me.Controls.Add(Me.lblSlopeYTextSize) Me.Controls.Add(Me.ucrChkSlopeLabelOptions) Me.Controls.Add(Me.ucrChkSlopeTextOptions) + Me.Controls.Add(Me.ucrNudSlopeLabelSize) + Me.Controls.Add(Me.ucrNudSlopeLabelPadding) + Me.Controls.Add(Me.ucrNudDumbbellLine) + Me.Controls.Add(Me.ucrInputDumbbellX) + Me.Controls.Add(Me.lblSlopeLineTicknes) + Me.Controls.Add(Me.ucrNudSlopeLineThickness) + Me.Controls.Add(Me.grpSmoothOptions) + Me.Controls.Add(Me.ucrInputSlopeLabelColour) + Me.Controls.Add(Me.ucrChkValley) + Me.Controls.Add(Me.lblSopeTextColour) + Me.Controls.Add(Me.lblSlopeLabelColour) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.MinimizeBox = False diff --git a/instat/dlgLinePlot.vb b/instat/dlgLinePlot.vb index 716df37157a..935efe58f5c 100644 --- a/instat/dlgLinePlot.vb +++ b/instat/dlgLinePlot.vb @@ -730,4 +730,8 @@ Public Class dlgLinePlot clsOptionsFunction.RemoveParameterByName("formula") End If End Sub + + Private Sub ucrInputFormula_Load(sender As Object, e As EventArgs) Handles ucrInputFormula.Load + + End Sub End Class \ No newline at end of file From 8f4a71343ccb9d358bcd54bb89581d2e8093bb3c Mon Sep 17 00:00:00 2001 From: Fidel365 <107605960+Fidel365@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:01:31 +0300 Subject: [PATCH 033/122] Removing unwanted sub --- instat/dlgLinePlot.vb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/instat/dlgLinePlot.vb b/instat/dlgLinePlot.vb index 935efe58f5c..716df37157a 100644 --- a/instat/dlgLinePlot.vb +++ b/instat/dlgLinePlot.vb @@ -730,8 +730,4 @@ Public Class dlgLinePlot clsOptionsFunction.RemoveParameterByName("formula") End If End Sub - - Private Sub ucrInputFormula_Load(sender As Object, e As EventArgs) Handles ucrInputFormula.Load - - End Sub End Class \ No newline at end of file From a80f95f119bdf33ac7223ae8f35425bdde897a30 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Mon, 3 Oct 2022 14:36:05 +0300 Subject: [PATCH 034/122] made correction on getting and viewing objects --- instat/clsRLink.vb | 4 +-- .../static/InstatObject/R/instat_object_R6.R | 28 +++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 5ee74a3d368..39995170f9f 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -834,7 +834,7 @@ Public Class RLink 'get the last R script command Dim strLastScript As String = GetRunnableCommandLines(strScript).Last - If strLastScript.Contains("get_object") Then 'if output should be returned as a file + If strLastScript.Contains("get_object") OrElse strLastScript.Contains("view_object") Then 'if output should be returned as a file Try Dim strNewAssignedToScript As String = ConstructAssignTo(strTempAssignTo, strScript) Evaluate(strNewAssignedToScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) @@ -842,7 +842,7 @@ Public Class RLink If expTemp IsNot Nothing Then 'get the file path name strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) - If strTemp <> "" Then + If File.Exists(strTemp) Then If bAddOutputInLog Then clsOutputLogger.AddFileOutput(strTemp) Else diff --git a/instat/static/InstatObject/R/instat_object_R6.R b/instat/static/InstatObject/R/instat_object_R6.R index 15c1727b0e3..07e0aa2327d 100644 --- a/instat/static/InstatObject/R/instat_object_R6.R +++ b/instat/static/InstatObject/R/instat_object_R6.R @@ -550,10 +550,22 @@ DataBook$set("public", "add_object", function(data_name, object_name, object_typ #add the object private$.objects[[object_name]] <- list(object_type_label = object_type_label, object_format = object_format, object = object) } else{ + self$get_data_objects(data_name)$add_object(object_name = object_name, object_type_label = object_type_label, object_format = object_format, object = object) + + #if its a graph. set it as last graph contents + if(identical(object_type_label, "graph")){ + private$.last_graph <- c(data_name, object_name) + } + } - } else { + + + + } else { + #todo. this block will eventually be deprecated once discussions on + #where to save objects is finalised. #todo. should every other big object have their own data book or we use one data book for storing all the objects? #or we store all objects in a separate data structure that is not a data book? #if we store it in a data structure then we will NOT need the "internal" parameter @@ -565,9 +577,6 @@ DataBook$set("public", "add_object", function(data_name, object_name, object_typ self$create_graph_data_book() } .graph_data_book$add_object(data_name = data_name, object_name = object_name, object_type_label = object_type_label, object_format = object_format, object = object, internal = TRUE) - #after adding the graph. set it as last graph contents - last_graph_name <- self$get_data_objects(data_name)$get_last_graph_name() - if(!is.null(last_graph_name)) private$.last_graph <- c(data_name, last_graph_name) }else{ self$add_object(data_name = data_name, object_name = object_name, object_type_label = object_type_label, object_format = object_format, object = object, internal = TRUE) } @@ -653,7 +662,7 @@ DataBook$set("public", "get_objects", function(data_name, object_name, object_ty #as explained in issue #7808 comments. New implementation is need to remove the internal parameter from the other "object" functions #if parameter internal is set to false, parameter object_type_label will have to be passed #todo. parameter object_type_label and nternal can be removed as a parameter if all objects are saved in the same data book or structure -DataBook$set("public", "get_object", function(data_name, object_name, object_type_label = "", internal = TRUE) { +DataBook$set("public", "get_object", function(data_name, object_name, object_type_label = "", as_file = TRUE, internal = TRUE) { if (!internal && identical(object_type_label,"graph") && exists(".graph_data_book")) { r_instant_object <- .graph_data_book$get_object(data_name = data_name, object_name = object_name, internal = TRUE) }else { @@ -667,7 +676,11 @@ DataBook$set("public", "get_object", function(data_name, object_name, object_typ if (is.null(r_instant_object)){ return(NULL) }else{ - return(view_object(object = r_instant_object$object, object_format = r_instant_object$object_format)) + if(as_file){ + return(view_object(object = r_instant_object$object, object_format = r_instant_object$object_format)) + }else{ + return(r_instant_object) + } } } @@ -784,12 +797,11 @@ DataBook$set("public", "get_from_object", function(data_name, object_name, value } ) -#todo. deprecate this later. get_object and view_object should be sufficient DataBook$set("public", "get_last_graph", function(print_graph = TRUE, internal = FALSE) { if (!internal && exists(".graph_data_book")) .graph_data_book$get_last_graph(print_graph = print_graph, internal = TRUE) else { if(!is.null(private$.last_graph) && length(private$.last_graph) == 2) { - graph_object <- self$get_objects(data_name = private$.last_graph[1], object_name = private$.last_graph[2], object_type_label = graph_label) + graph_object <- self$get_object(data_name = private$.last_graph[1], object_name = private$.last_graph[2], as_file = FALSE) if(print_graph){ print(graph_object$object) } From 4ff66a0b1f4059681562e1353f2eb4c288ef05d7 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Mon, 3 Oct 2022 14:37:37 +0300 Subject: [PATCH 035/122] removed blanks --- instat/static/InstatObject/R/instat_object_R6.R | 3 --- 1 file changed, 3 deletions(-) diff --git a/instat/static/InstatObject/R/instat_object_R6.R b/instat/static/InstatObject/R/instat_object_R6.R index 07e0aa2327d..2073d099b21 100644 --- a/instat/static/InstatObject/R/instat_object_R6.R +++ b/instat/static/InstatObject/R/instat_object_R6.R @@ -560,9 +560,6 @@ DataBook$set("public", "add_object", function(data_name, object_name, object_typ } - - - } else { #todo. this block will eventually be deprecated once discussions on #where to save objects is finalised. From c0061a8fda25d04c8973c97c2a6a9fb9e5e2dd7e Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:56:16 +0300 Subject: [PATCH 036/122] Improving on explanatory model for location and scale. --- instat/dlgExtremes.vb | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index b9cc1ab2beb..c18ec2c7e4d 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -125,12 +125,12 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction clsPlotsFunction.bExcludeAssignedFunctionOutput = False clsPriorParamListFunction.SetRCommand("list") - 'clsPriorParamListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=5) + clsPriorParamListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=5) clsInitialListFunction.SetRCommand("list") - 'clsInitialListFunction.AddParameter("location", "0", iPosition:=0) - 'clsInitialListFunction.AddParameter("scale", "0.1", iPosition:=1) - 'clsInitialListFunction.AddParameter("shape", "-0.5", iPosition:=2) + clsInitialListFunction.AddParameter("location", "0", iPosition:=0) + clsInitialListFunction.AddParameter("scale", "0.1", iPosition:=1) + clsInitialListFunction.AddParameter("shape", "-0.5", iPosition:=2) clsConfidenceIntervalFunction.SetPackageName("extRemes") clsConfidenceIntervalFunction.SetRCommand("ci.fevd") @@ -261,6 +261,14 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction Private Sub control_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputExtremes.ControlValueChanged, ucrReceiverVariable.ControlValueChanged, ucrChkExplanatoryModelForLocationParameter.ControlValueChanged, ucrInputThresholdforLocation.ControlValueChanged ParameterControl() + If clsFevdFunction.ContainsParameter("method") Then + If ucrChkExplanatoryModelForLocationParameter.Checked _ + AndAlso clsFevdFunction.GetParameter("method").strArgumentValue = Chr(34) & "Bayesian" & Chr(34) Then + clsFevdFunction.RemoveParameterByName("priorParams") + clsFevdFunction.RemoveParameterByName("initial") + clsFevdFunction.RemoveParameterByName("iter") + End If + End If ucrTryModelling.ResetInputTryMessage() TestOkEnabled() End Sub @@ -308,19 +316,5 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction grpFirstCalc.Visible = False grpSecondCalc.Visible = False End If - AddNonStationaryModels() - End Sub - Private Sub AddNonStationaryModels() - If ucrChkExplanatoryModelForLocationParameter.Checked Then - clsInitialListFunction.RemoveParameterByName("location") - clsInitialListFunction.RemoveParameterByName("scale") - clsInitialListFunction.RemoveParameterByName("shape") - clsPriorParamListFunction.RemoveParameterByName("v") - Else - clsPriorParamListFunction.AddParameter("v", clsRFunctionParameter:=clsConcatenateFunction, iPosition:=5) - clsInitialListFunction.AddParameter("location", "0", iPosition:=0) - clsInitialListFunction.AddParameter("scale", "0.1", iPosition:=1) - clsInitialListFunction.AddParameter("shape", "-0.5", iPosition:=2) - End If End Sub End Class From 39e002d53d95fc5acc56469048bac9af82e011fc Mon Sep 17 00:00:00 2001 From: patowhiz Date: Mon, 3 Oct 2022 15:52:15 +0300 Subject: [PATCH 037/122] removed conflict errors for summary tables --- instat/dlgScatterPlot.vb | 16 - instat/dlgSummaryTables.vb | 629 +------------------------------------ 2 files changed, 8 insertions(+), 637 deletions(-) diff --git a/instat/dlgScatterPlot.vb b/instat/dlgScatterPlot.vb index a243039b707..ae0842aaf0d 100644 --- a/instat/dlgScatterPlot.vb +++ b/instat/dlgScatterPlot.vb @@ -337,20 +337,4 @@ Public Class dlgScatterPlot TestOkEnabled() End Sub - - Private Sub ucrChkLineofBestFit_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkLineofBestFit.ControlValueChanged - If ucrChkLineofBestFit.Checked Then - clsBaseOperator.AddParameter("geom_smooth", clsRFunctionParameter:=clsGeomSmoothFunc, iPosition:=4) - Else - clsBaseOperator.RemoveParameterByName("geom_smooth") - End If - End Sub - - Private Sub ucrChkAddRugPlot_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkAddRugPlot.ControlValueChanged - If ucrChkAddRugPlot.Checked Then - clsBaseOperator.AddParameter("geom_rug", clsRFunctionParameter:=clsGeomRugFunction, iPosition:=3) - Else - clsBaseOperator.RemoveParameterByName("geom_rug") - End If - End Sub End Class diff --git a/instat/dlgSummaryTables.vb b/instat/dlgSummaryTables.vb index 91e803a6513..6563873a734 100644 --- a/instat/dlgSummaryTables.vb +++ b/instat/dlgSummaryTables.vb @@ -15,625 +15,6 @@ ' along with this program. If not, see . -Imports instat.Translations -Public Class dlgSummaryTables - Private bFirstload As Boolean = True - Private bReset As Boolean = True - Private clsSummariesList As New RFunction - Private bResetSubdialog As Boolean = False - Private clsSummaryDefaultFunction, clsFrequencyDefaultFunction, clsConcFunction, - clsMutableFunction As New RFunction - Private clsSummariesHeaderLeftTopFunction, clsSummariesHeaderTopLeftFunction, - clsVariableHeaderLeftTopFunction, clsVariableHeaderTopLeftFunction, clsStubHeadFunction, - clsummaryVariableHeaderLeftTopFunction, clsSummaryVariableHeaderTopLeftFunction As New RFunction - - Private clsTableTitleFunction, clsTabFootnoteTitleFunction, clsTableSourcenoteFunction, - clsCellTextFunction, clsCellBorderFunction, clsCellFillFunction, clsHeaderFormatFunction, - clsTabOptionsFunction, clsBorderWeightPxFunction, clsFootnoteTitleLocationFunction, clsFootnoteSubtitleLocationFunction, - clsTabFootnoteSubtitleFunction, clsStyleListFunction, clsFootnoteCellFunction, clsFootnoteCellBodyFunction, - clsSecondFootnoteCellFunction, clsSecondFootnoteCellBodyFunction, clsTabStyleFunction, clsDummyFunction, - clsTabStyleCellTextFunction, clsTabStylePxFunction, clsTabStyleCellTitleFunction As New RFunction - - Private clsMmtableOperator, clsSummaryOperator, clsFrequencyOperator, clsColumnOperator, - clsPipeOperator, clsJoiningPipeOperator, clsTabFootnoteOperator As New ROperator - - Private Sub dlgNewSummaryTables_Load(sender As Object, e As EventArgs) Handles MyBase.Load - If bFirstload Then - InitialiseDialog() - bFirstload = False - End If - If bReset Then - SetDefaults() - End If - SetRCodeForControls(bReset) - bReset = False - autoTranslate(Me) - TestOKEnabled() - End Sub - - Private Sub InitialiseDialog() - ucrBase.iHelpTopicID = 426 - ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False - - 'summary_name = NA - 8 - ucrSelectorSummaryTables.SetParameter(New RParameter("data_name", 0)) - ucrSelectorSummaryTables.SetParameterIsString() - - ucrReceiverSummaryCols.SetParameter(New RParameter("columns_to_summarise", 1)) - ucrReceiverSummaryCols.Selector = ucrSelectorSummaryTables - ucrReceiverSummaryCols.SetDataType("numeric") - ucrReceiverSummaryCols.SetParameterIsString() - ucrReceiverSummaryCols.SetLinkedDisplayControl(lblVariables) - - ucrReceiverFactors.SetParameter(New RParameter("factors", 2)) - ucrReceiverFactors.SetParameterIsString() - ucrReceiverFactors.Selector = ucrSelectorSummaryTables - ucrReceiverFactors.SetDataType("factor") - - ucrReceiverWeights.SetParameter(New RParameter("weights", 3)) - ucrReceiverWeights.SetParameterIsString() - ucrReceiverWeights.Selector = ucrSelectorSummaryTables - ucrReceiverWeights.SetDataType("numeric") - - ucrReceiverMultiplePercentages.SetParameter(New RParameter("perc_total_factors", 1)) - ucrReceiverMultiplePercentages.SetParameterIsString() - ucrReceiverMultiplePercentages.Selector = ucrSelectorSummaryTables - ucrReceiverMultiplePercentages.SetDataType("factor") ' TODO data this accepts must be in the other receiver too - ucrReceiverMultiplePercentages.SetLinkedDisplayControl(lblFactorsAsPercentage) - - ucrChkStoreResults.SetText("Store Output") - ucrChkStoreResults.SetParameter(New RParameter("store_table", 4)) - ucrChkStoreResults.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkStoreResults.SetRDefault("FALSE") - - ucrChkOmitMissing.SetParameter(New RParameter("na.rm", 5)) - ucrChkOmitMissing.SetText("Omit Missing Values") - ucrChkOmitMissing.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkOmitMissing.SetRDefault("FALSE") - - ucrChkDisplayMargins.SetParameter(New RParameter("include_margins", 6)) - ucrChkDisplayMargins.SetText("Display Outer Margins") - ucrChkDisplayMargins.SetRDefault("FALSE") - ucrChkDisplayMargins.AddToLinkedControls({ucrInputMarginName}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True, - bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="All") - ucrChkDisplayMargins.AddToLinkedControls({ucrPnlMargin}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True, - bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoOuter) - - ucrChkFrequencyDisplayMargins.SetParameter(New RParameter("include_margins", 3)) - ucrChkFrequencyDisplayMargins.SetText("Display Margins") - ucrChkFrequencyDisplayMargins.SetRDefault("FALSE") - ucrChkFrequencyDisplayMargins.AddToLinkedControls(ucrInputFrequencyMarginName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, - bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="All", bNewLinkedUpdateFunction:=True) - - ucrInputFrequencyMarginName.SetParameter(New RParameter("margin_name", iNewPosition:=5)) - ucrInputFrequencyMarginName.SetLinkedDisplayControl(lblFrequencyMarginName) - - ucrChkDisplaySummariesAsRow.SetText("Display Summaries As Rows") - ucrChkDisplaySummariesAsRow.AddParameterPresentCondition(True, "summariesLeftTop") - ucrChkDisplaySummariesAsRow.AddParameterPresentCondition(False, "summariesLeftTop", False) - - ucrChkDisplaySummaryVariablesAsRow.SetText("Display Summary_Variables As Rows") - ucrChkDisplaySummaryVariablesAsRow.AddParameterPresentCondition(True, "summariesVariableLeftTop") - ucrChkDisplaySummaryVariablesAsRow.AddParameterPresentCondition(False, "summariesVariableLeftTop", False) - - ucrChkDisplayVariablesAsRows.SetText("Display Variables As Rows") - ucrChkDisplayVariablesAsRows.AddParameterPresentCondition(True, "variablesLeftTop") - ucrChkDisplayVariablesAsRows.AddParameterPresentCondition(False, "variablesLeftTop", False) - - ucrNudColumnFactors.SetLinkedDisplayControl(lblColumnFactors) - ucrNudColumnFactors.SetMinMax(iNewMin:=0) - ucrNudColumnFactors.Increment = 1 - - ucrPnlMargin.SetParameter(New RParameter("margins", iNewPosition:=7)) - ucrPnlMargin.AddRadioButton(rdoOuter, Chr(34) & "outer" & Chr(34)) - ucrPnlMargin.AddRadioButton(rdoSummary, Chr(34) & "summary" & Chr(34)) - ucrPnlMargin.AddRadioButton(rdoBoth, "c(""outer"",""summary"")") - ucrPnlMargin.SetLinkedDisplayControl(grpMargin) - - ucrInputMarginName.SetParameter(New RParameter("margin_name", iNewPosition:=5)) - ucrInputMarginName.SetLinkedDisplayControl(lblMarginName) - - ucrChkSummaries.SetParameter(New RParameter("treat_columns_as_factor", 8)) - ucrChkSummaries.SetValuesCheckedAndUnchecked("TRUE", "FALSE") - ucrChkSummaries.SetText("Treat Summaries as a Further Factor") - ucrChkSummaries.AddToLinkedControls({ucrChkDisplaySummariesAsRow, ucrChkDisplayVariablesAsRows}, {True}, - bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkSummaries.AddToLinkedControls(ucrChkDisplaySummaryVariablesAsRow, {False}, bNewLinkedAddRemoveParameter:=True, - bNewLinkedHideIfParameterMissing:=True) - - ucrNudSigFigs.SetParameter(New RParameter("signif_fig", 9)) - ucrNudSigFigs.SetMinMax(0, 22) - ucrNudSigFigs.SetRDefault(2) - - ucrChkWeight.SetText("Weights") - ucrChkWeight.SetParameter(ucrReceiverWeights.GetParameter(), bNewChangeParameterValue:=False, bNewAddRemoveParameter:=True) - ucrChkWeight.AddToLinkedControls(ucrReceiverWeights, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - 'Not yet implemented - ucrChkWeight.Visible = False - - ucrPnlSummaryFrequencyTables.AddRadioButton(rdoSummaryTable) - ucrPnlSummaryFrequencyTables.AddRadioButton(rdoFrequencyTable) - ucrPnlSummaryFrequencyTables.AddParameterValuesCondition(rdoSummaryTable, "rdo_checked", "rdoSummary") - ucrPnlSummaryFrequencyTables.AddParameterValuesCondition(rdoFrequencyTable, "rdo_checked", "rdoFrequency") - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrReceiverSummaryCols}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrReorderSummary}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkDisplayAsPercentage}, {rdoFrequencyTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkSummaries}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkDisplayMargins}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkFrequencyDisplayMargins}, {rdoFrequencyTable}, bNewLinkedHideIfParameterMissing:=True) - ucrPnlSummaryFrequencyTables.AddToLinkedControls({ucrChkOmitMissing}, {rdoSummaryTable}, bNewLinkedHideIfParameterMissing:=True) - - ucrChkDisplayAsPercentage.SetParameter(New RParameter("percentage_type", 2)) - ucrChkDisplayAsPercentage.SetText("As Percentages") - ucrChkDisplayAsPercentage.SetValuesCheckedAndUnchecked(Chr(34) & "factors" & Chr(34), Chr(34) & "none" & Chr(34)) - ucrChkDisplayAsPercentage.SetRDefault(Chr(34) & "none" & Chr(34)) - - ucrChkDisplayAsPercentage.AddToLinkedControls(ucrReceiverMultiplePercentages, {True}, bNewLinkedHideIfParameterMissing:=True, - bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) - ucrChkDisplayAsPercentage.AddToLinkedControls(ucrChkPercentageProportion, {True}, bNewLinkedAddRemoveParameter:=True, - bNewLinkedHideIfParameterMissing:=True, bNewLinkedUpdateFunction:=True) - ucrChkDisplayAsPercentage.SetLinkedDisplayControl(grpPercentages) - - ucrChkPercentageProportion.SetParameter(New RParameter("perc_decimal", 3)) - ucrChkPercentageProportion.SetText("Display as Decimal") - ucrChkPercentageProportion.SetRDefault("FALSE") - - ucrSaveTable.SetPrefix("summary_table") - ucrSaveTable.SetSaveType(RObjectTypeLabel.Table, strRObjectFormat:=RObjectFormat.Html) - ucrSaveTable.SetDataFrameSelector(ucrSelectorSummaryTables.ucrAvailableDataFrames) - ucrSaveTable.SetIsComboBox() - ucrSaveTable.SetCheckBoxText("Save Table") - ucrSaveTable.SetAssignToIfUncheckedValue("last_table") - - ucrReorderSummary.bDataIsSummaries = True - End Sub - - Private Sub SetDefaults() - clsSummaryDefaultFunction = New RFunction - clsFrequencyDefaultFunction = New RFunction - clsSummariesList = New RFunction - clsConcFunction = New RFunction - clsMutableFunction = New RFunction - clsSummariesHeaderLeftTopFunction = New RFunction - clsSummariesHeaderTopLeftFunction = New RFunction - clsVariableHeaderLeftTopFunction = New RFunction - clsVariableHeaderTopLeftFunction = New RFunction - clsummaryVariableHeaderLeftTopFunction = New RFunction - clsSummaryVariableHeaderTopLeftFunction = New RFunction - clsTableTitleFunction = New RFunction - clsTabFootnoteTitleFunction = New RFunction - clsTableSourcenoteFunction = New RFunction - clsCellTextFunction = New RFunction - clsCellBorderFunction = New RFunction - clsCellFillFunction = New RFunction - clsHeaderFormatFunction = New RFunction - clsTabOptionsFunction = New RFunction - clsBorderWeightPxFunction = New RFunction - clsFootnoteTitleLocationFunction = New RFunction - clsFootnoteSubtitleLocationFunction = New RFunction - clsStyleListFunction = New RFunction - clsSummaryOperator = New ROperator - clsColumnOperator = New ROperator - clsPipeOperator = New ROperator - clsTabFootnoteSubtitleFunction = New RFunction - clsFootnoteCellBodyFunction = New RFunction - clsSecondFootnoteCellBodyFunction = New RFunction - clsFootnoteCellFunction = New RFunction - clsSecondFootnoteCellFunction = New RFunction - clsStubHeadFunction = New RFunction - clsTabStyleFunction = New RFunction - clsTabStyleCellTextFunction = New RFunction - clsTabStylePxFunction = New RFunction - clsTabStyleCellTitleFunction = New RFunction - clsJoiningPipeOperator = New ROperator - clsTabFootnoteOperator = New ROperator - clsFrequencyOperator = New ROperator - clsMmtableOperator = New ROperator - clsDummyFunction = New RFunction - - ucrReceiverFactors.SetMeAsReceiver() - ucrSelectorSummaryTables.Reset() - ucrSaveTable.Reset() - ucrNudColumnFactors.SetText(1) - bResetSubdialog = True - - clsDummyFunction.AddParameter("rdo_checked", "rdoFrequency", iPosition:=10) - - clsSummaryOperator.SetOperation("+") - - clsFrequencyOperator.SetOperation("+") - - clsColumnOperator.SetOperation("+") - - clsMmtableOperator.SetOperation("+") - - clsConcFunction.SetRCommand("c") - - clsPipeOperator.SetOperation("%>%") - clsPipeOperator.bBrackets = False - - clsTabFootnoteOperator.SetOperation("%>%") - clsTabFootnoteOperator.bBrackets = False - - clsJoiningPipeOperator.SetOperation("%>%") - clsJoiningPipeOperator.AddParameter("mutable", clsROperatorParameter:=clsSummaryOperator, iPosition:=0) - - clsStubHeadFunction.SetPackageName("gt") - clsStubHeadFunction.SetRCommand("tab_stubhead") - - clsTabStyleFunction.SetRCommand("tab_style") - clsTabStyleFunction.SetPackageName("gt") - clsTabStyleFunction.AddParameter("style", clsRFunctionParameter:=clsTabStyleCellTextFunction, iPosition:=0) - clsTabStyleFunction.AddParameter("location", clsRFunctionParameter:=clsTabStyleCellTitleFunction, iPosition:=1) - - clsTabStyleCellTitleFunction.SetPackageName("gt") - clsTabStyleCellTitleFunction.SetRCommand("cells_title") - clsTabStyleCellTitleFunction.AddParameter("groups", Chr(34) & "title" & Chr(34), iPosition:=0) - - clsTabStyleCellTextFunction.SetPackageName("gt") - clsTabStyleCellTextFunction.SetRCommand("cell_text") - clsTabStyleCellTextFunction.AddParameter("size", clsRFunctionParameter:=clsTabStylePxFunction, iPosition:=0) - - clsTabStylePxFunction.SetPackageName("gt") - clsTabStylePxFunction.SetRCommand("px") - clsTabStylePxFunction.AddParameter("size", "18", bIncludeArgumentName:=False, iPosition:=0) - - clsSummariesHeaderLeftTopFunction.SetPackageName("mmtable2") - clsSummariesHeaderLeftTopFunction.SetRCommand("header_left_top") - clsSummariesHeaderLeftTopFunction.AddParameter("variable", "summary", iPosition:=0) - - clsSummariesHeaderTopLeftFunction.SetPackageName("mmtable2") - clsSummariesHeaderTopLeftFunction.SetRCommand("header_top_left") - clsSummariesHeaderTopLeftFunction.AddParameter("variable", "summary", iPosition:=0) - - clsVariableHeaderLeftTopFunction.SetPackageName("mmtable2") - clsVariableHeaderLeftTopFunction.SetRCommand("header_left_top") - clsVariableHeaderLeftTopFunction.AddParameter("variable", "variable", iPosition:=0) - - clsVariableHeaderTopLeftFunction.SetPackageName("mmtable2") - clsVariableHeaderTopLeftFunction.SetRCommand("header_top_left") - clsVariableHeaderTopLeftFunction.AddParameter("variable", "variable", iPosition:=0) - - clsummaryVariableHeaderLeftTopFunction.SetPackageName("mmtable2") - clsummaryVariableHeaderLeftTopFunction.SetRCommand("header_left_top") - clsummaryVariableHeaderLeftTopFunction.AddParameter("variable", Chr(39) & "summary-variable" & Chr(39), iPosition:=0) - - clsSummaryVariableHeaderTopLeftFunction.SetPackageName("mmtable2") - clsSummaryVariableHeaderTopLeftFunction.SetRCommand("header_top_left") - clsSummaryVariableHeaderTopLeftFunction.AddParameter("variable", Chr(39) & "summary-variable" & Chr(39), iPosition:=0) - - clsMutableFunction.SetPackageName("mmtable2") - clsMutableFunction.SetRCommand("mmtable") - clsMutableFunction.AddParameter("data", clsRFunctionParameter:=clsFrequencyDefaultFunction, iPosition:=0) - clsMutableFunction.AddParameter("cells", "value", iPosition:=1) - - clsSummaryOperator.AddParameter("mutableFunc", clsRFunctionParameter:=clsMutableFunction, iPosition:=0) - clsSummaryOperator.AddParameter("summariesVariableTopLeft", clsRFunctionParameter:=clsSummaryVariableHeaderTopLeftFunction, iPosition:=1) - - clsFrequencyOperator.SetOperation("+") - clsFrequencyOperator.AddParameter("mmtable2", clsRFunctionParameter:=clsMutableFunction, iPosition:=0) - - clsSummariesList.SetRCommand("c") - clsSummariesList.AddParameter("summary_mean", Chr(34) & "summary_mean" & Chr(34), bIncludeArgumentName:=False) ' TODO decide which default(s) to use? - - 'todo. When refactoring this dialog - 'investigate whether clsSummaryDefaultFunction and clsFrequencyDefaultFunction could be merged. It's only their parameters that change. - clsSummaryDefaultFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$summary_table") - clsSummaryDefaultFunction.AddParameter("treat_columns_as_factor", "FALSE", iPosition:=8) - clsSummaryDefaultFunction.AddParameter("summaries", clsRFunctionParameter:=clsSummariesList, iPosition:=12) - clsSummaryDefaultFunction.SetAssignTo("summary_table") - - clsFrequencyDefaultFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$summary_table") - clsFrequencyDefaultFunction.AddParameter("store_results", "FALSE", iPosition:=2) - clsFrequencyDefaultFunction.AddParameter("treat_columns_as_factor", "FALSE", iPosition:=10) - clsFrequencyDefaultFunction.AddParameter("summaries", "count_label", iPosition:=11) - clsFrequencyDefaultFunction.SetAssignTo("frequency_table") - - clsTableTitleFunction.SetPackageName("gt") - clsTableTitleFunction.SetRCommand("tab_header") - - clsTabFootnoteTitleFunction.SetPackageName("gt") - clsTabFootnoteTitleFunction.SetRCommand("tab_footnote") - - clsTabFootnoteSubtitleFunction.SetPackageName("gt") - clsTabFootnoteSubtitleFunction.SetRCommand("tab_footnote") - - clsFootnoteCellFunction.SetPackageName("gt") - clsFootnoteCellFunction.SetRCommand("tab_footnote") - - clsSecondFootnoteCellFunction.SetPackageName("gt") - clsSecondFootnoteCellFunction.SetRCommand("tab_footnote") - - clsFootnoteTitleLocationFunction.SetPackageName("gt") - clsFootnoteTitleLocationFunction.SetRCommand("cells_title") - - clsFootnoteSubtitleLocationFunction.SetPackageName("gt") - clsFootnoteSubtitleLocationFunction.SetRCommand("cells_title") - - clsTableSourcenoteFunction.SetPackageName("gt") - clsTableSourcenoteFunction.SetRCommand("tab_source_note") - - clsFootnoteCellBodyFunction.SetPackageName("gt") - clsFootnoteCellBodyFunction.SetRCommand("cells_body") - - clsSecondFootnoteCellBodyFunction.SetPackageName("gt") - clsSecondFootnoteCellBodyFunction.SetRCommand("cells_body") - - clsCellTextFunction.SetPackageName("gt") - clsCellTextFunction.SetRCommand("cell_text") - - clsCellBorderFunction.SetPackageName("gt") - clsCellBorderFunction.SetRCommand("cell_borders") - clsCellBorderFunction.AddParameter("weight", clsRFunctionParameter:=clsBorderWeightPxFunction, iPosition:=3) - - clsCellFillFunction.SetPackageName("gt") - clsCellFillFunction.SetRCommand("cell_fill") - - clsHeaderFormatFunction.SetPackageName("mmtable2") - clsHeaderFormatFunction.SetRCommand("header_format") - clsHeaderFormatFunction.AddParameter("header", Chr(34) & "all_cols" & Chr(34), iPosition:=0) - clsHeaderFormatFunction.AddParameter("style", clsRFunctionParameter:=clsStyleListFunction, iPosition:=1) - - clsTabOptionsFunction.SetPackageName("gt") - clsTabOptionsFunction.SetRCommand("tab_options") - - clsBorderWeightPxFunction.SetPackageName("gt") - clsBorderWeightPxFunction.SetRCommand("px") - clsBorderWeightPxFunction.AddParameter("weight", "1", iPosition:=0, bIncludeArgumentName:=False) - - clsStyleListFunction.SetRCommand("list") - - clsJoiningPipeOperator.SetAssignTo("last_table") - - clsJoiningPipeOperator.SetAssignToRObject(strRObjectToAssignTo:="last_table", - strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, - strRObjectFormatToAssignTo:=RObjectFormat.Html, - strRDataFrameNameToAddObjectTo:=ucrSelectorSummaryTables.strCurrentDataFrame, - strObjectName:="last_table") - - ucrBase.clsRsyntax.SetBaseROperator(clsJoiningPipeOperator) - End Sub - - Public Sub SetRCodeForControls(bReset As Boolean) - ucrSelectorSummaryTables.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrSelectorSummaryTables.GetParameter, iAdditionalPairNo:=1) - ucrChkStoreResults.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrChkStoreResults.GetParameter, iAdditionalPairNo:=1) - ucrNudSigFigs.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrNudSigFigs.GetParameter, iAdditionalPairNo:=1) - ucrNudColumnFactors.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrNudColumnFactors.GetParameter, iAdditionalPairNo:=1) - ucrReceiverFactors.AddAdditionalCodeParameterPair(clsFrequencyDefaultFunction, ucrReceiverFactors.GetParameter, iAdditionalPairNo:=1) - - ucrSelectorSummaryTables.SetRCode(clsSummaryDefaultFunction, bReset) - ucrReceiverSummaryCols.SetRCode(clsSummaryDefaultFunction, bReset) - ucrReceiverFactors.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkOmitMissing.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkDisplayMargins.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkFrequencyDisplayMargins.SetRCode(clsFrequencyDefaultFunction, bReset) - ucrNudSigFigs.SetRCode(clsSummaryDefaultFunction, bReset) - ucrReceiverWeights.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkSummaries.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkWeight.SetRCode(clsSummaryDefaultFunction, bReset) - ucrPnlSummaryFrequencyTables.SetRCode(clsDummyFunction, bReset) - ucrChkDisplaySummariesAsRow.SetRCode(clsSummaryOperator, bReset) - ucrChkDisplaySummaryVariablesAsRow.SetRCode(clsSummaryOperator, bReset) - ucrChkDisplayVariablesAsRows.SetRCode(clsSummaryOperator, bReset) - ucrChkStoreResults.SetRCode(clsSummaryDefaultFunction, bReset) - ucrChkDisplayAsPercentage.SetRCode(clsFrequencyDefaultFunction, bReset) - ucrSaveTable.SetRCode(clsJoiningPipeOperator, bReset) - FillListView() - End Sub - - Private Sub TestOKEnabled() - If rdoSummaryTable.Checked Then - If ucrSaveTable.IsComplete AndAlso ucrNudColumnFactors.GetText() <> "" AndAlso - ucrNudSigFigs.GetText <> "" AndAlso (Not ucrChkWeight.Checked OrElse (ucrChkWeight.Checked AndAlso Not ucrReceiverWeights.IsEmpty)) AndAlso - Not ucrReceiverSummaryCols.IsEmpty AndAlso Not clsSummariesList.clsParameters.Count = 0 Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If - Else - If Not ucrReceiverFactors.IsEmpty AndAlso ucrSaveTable.IsComplete Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If - End If - - End Sub - - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeForControls(True) - TestOKEnabled() - End Sub - - Private Sub cmdSummaries_Click(sender As Object, e As EventArgs) Handles cmdSummaries.Click - sdgSummaries.SetRFunction(clsSummariesList, clsSummaryDefaultFunction, clsConcFunction, ucrSelectorSummaryTables, bResetSubdialog) - bResetSubdialog = False - sdgSummaries.bEnable2VariableTab = False - sdgSummaries.ShowDialog() - sdgSummaries.bEnable2VariableTab = True - FillListView() - TestOKEnabled() - End Sub - - Private Sub cmdFormatTable_Click(sender As Object, e As EventArgs) Handles cmdFormatTable.Click - If rdoSummaryTable.Checked Then - sdgFormatSummaryTables.SetRCode(clsNewTableTitleFunction:=clsTableTitleFunction, clsNewTabFootnoteTitleFunction:=clsTabFootnoteTitleFunction, clsNewTableSourcenoteFunction:=clsTableSourcenoteFunction, clsNewDummyFunction:=clsDummyFunction, - clsNewCellTextFunction:=clsCellTextFunction, clsNewCellBorderFunction:=clsCellBorderFunction, clsNewCellFillFunction:=clsCellFillFunction, clsNewHeaderFormatFunction:=clsHeaderFormatFunction, - clsNewTabOptionsFunction:=clsTabOptionsFunction, clsNewFootnoteCellFunction:=clsFootnoteCellFunction, clsNewStubHeadFunction:=clsStubHeadFunction, clsNewSecondFootnoteCellBodyFunction:=clsSecondFootnoteCellBodyFunction, - clsNewPipeOperator:=clsPipeOperator, clsNewBorderWeightPxFunction:=clsBorderWeightPxFunction, clsNewFootnoteTitleLocationFunction:=clsFootnoteTitleLocationFunction, clsNewFootnoteCellBodyFunction:=clsFootnoteCellBodyFunction, - clsNewFootnoteSubtitleLocationFunction:=clsFootnoteSubtitleLocationFunction, clsNewTabFootnoteSubtitleFunction:=clsTabFootnoteSubtitleFunction, clsNewJoiningOperator:=clsJoiningPipeOperator, - clsNewStyleListFunction:=clsStyleListFunction, clsNewMutableOPerator:=clsSummaryOperator, clsNewSecondFootnoteCellFunction:=clsSecondFootnoteCellFunction, clsNewTabFootnoteOperator:=clsTabFootnoteOperator, - clsNewTabStyleCellTextFunction:=clsTabStyleCellTextFunction, clsNewTabStyleFunction:=clsTabStyleFunction, clsNewTabStylePxFunction:=clsTabStylePxFunction, bReset:=bReset) - Else - sdgFormatSummaryTables.SetRCode(clsNewTableTitleFunction:=clsTableTitleFunction, clsNewTabFootnoteTitleFunction:=clsTabFootnoteTitleFunction, clsNewTableSourcenoteFunction:=clsTableSourcenoteFunction, clsNewDummyFunction:=clsDummyFunction, - clsNewCellTextFunction:=clsCellTextFunction, clsNewCellBorderFunction:=clsCellBorderFunction, clsNewCellFillFunction:=clsCellFillFunction, clsNewHeaderFormatFunction:=clsHeaderFormatFunction, - clsNewTabOptionsFunction:=clsTabOptionsFunction, clsNewFootnoteCellFunction:=clsFootnoteCellFunction, clsNewStubHeadFunction:=clsStubHeadFunction, clsNewSecondFootnoteCellBodyFunction:=clsSecondFootnoteCellBodyFunction, - clsNewPipeOperator:=clsPipeOperator, clsNewBorderWeightPxFunction:=clsBorderWeightPxFunction, clsNewFootnoteTitleLocationFunction:=clsFootnoteTitleLocationFunction, clsNewFootnoteCellBodyFunction:=clsFootnoteCellBodyFunction, - clsNewFootnoteSubtitleLocationFunction:=clsFootnoteSubtitleLocationFunction, clsNewTabFootnoteSubtitleFunction:=clsTabFootnoteSubtitleFunction, clsNewJoiningOperator:=clsJoiningPipeOperator, - clsNewStyleListFunction:=clsStyleListFunction, clsNewMutableOPerator:=clsFrequencyOperator, clsNewSecondFootnoteCellFunction:=clsSecondFootnoteCellFunction, clsNewTabFootnoteOperator:=clsTabFootnoteOperator, - clsNewTabStyleCellTextFunction:=clsTabStyleCellTextFunction, clsNewTabStyleFunction:=clsTabStyleFunction, clsNewTabStylePxFunction:=clsTabStylePxFunction, bReset:=bReset) - End If - - sdgFormatSummaryTables.ShowDialog() - End Sub - - Private Sub ucrChkWeights_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkWeight.ControlValueChanged - If ucrChkWeight.Checked Then - ucrReceiverWeights.SetMeAsReceiver() - Else - If ucrReceiverFactors.IsEmpty Then - ucrReceiverFactors.SetMeAsReceiver() - ElseIf ucrReceiverSummaryCols.IsEmpty Then - ucrReceiverSummaryCols.SetMeAsReceiver() - Else - ucrReceiverFactors.SetMeAsReceiver() - End If - End If - End Sub - - Private Sub ucrCoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverFactors.ControlContentsChanged, ucrSaveTable.ControlContentsChanged, - ucrChkWeight.ControlContentsChanged, ucrReceiverWeights.ControlContentsChanged, ucrNudSigFigs.ControlContentsChanged, ucrReceiverSummaryCols.ControlContentsChanged, - ucrNudColumnFactors.ControlContentsChanged, ucrPnlSummaryFrequencyTables.ControlContentsChanged - TestOKEnabled() - End Sub - - Private Sub Display_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplaySummariesAsRow.ControlValueChanged, ucrChkDisplayVariablesAsRows.ControlValueChanged, ucrChkDisplaySummaryVariablesAsRow.ControlValueChanged, ucrChkSummaries.ControlValueChanged - clsSummaryOperator.RemoveParameterByName("summariesTopLeft") - clsSummaryOperator.RemoveParameterByName("summariesLeftTop") - clsSummaryOperator.RemoveParameterByName("variablesTopLeft") - clsSummaryOperator.RemoveParameterByName("variablesLeftTop") - clsSummaryOperator.RemoveParameterByName("summariesVariableTopLeft") - clsSummaryOperator.RemoveParameterByName("summariesVariableLeftTop") - - If ucrChkSummaries.Checked Then - If ucrChkDisplaySummariesAsRow.Checked Then - clsSummaryOperator.AddParameter("summariesLeftTop", clsRFunctionParameter:=clsSummariesHeaderLeftTopFunction, iPosition:=1) - Else - clsSummaryOperator.AddParameter("summariesTopLeft", clsRFunctionParameter:=clsSummariesHeaderTopLeftFunction, iPosition:=1) - End If - - If ucrChkDisplayVariablesAsRows.Checked Then - clsSummaryOperator.AddParameter("variablesLeftTop", clsRFunctionParameter:=clsVariableHeaderLeftTopFunction, iPosition:=1) - Else - clsSummaryOperator.AddParameter("variablesTopLeft", clsRFunctionParameter:=clsVariableHeaderTopLeftFunction, iPosition:=1) - End If - Else - If ucrChkDisplaySummaryVariablesAsRow.Checked Then - clsSummaryOperator.AddParameter("summariesVariableLeftTop", clsRFunctionParameter:=clsummaryVariableHeaderLeftTopFunction, iPosition:=1) - Else - clsSummaryOperator.AddParameter("summariesVariableTopLeft", clsRFunctionParameter:=clsSummaryVariableHeaderTopLeftFunction, iPosition:=1) - End If - End If - End Sub - - Private Sub ucrReceiverFactors_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverFactors.ControlValueChanged, ucrNudColumnFactors.ControlValueChanged - If ucrReceiverFactors.IsEmpty OrElse String.IsNullOrEmpty(ucrNudColumnFactors.GetText()) Then - Exit Sub - End If - - If rdoSummaryTable.Checked Then - Dim iColumn As Integer = 0 - Dim iNumberOfColumns As Integer - - clsColumnOperator.ClearParameters() - clsSummaryOperator.RemoveParameterByName("columnOp") - - If Not ucrReceiverFactors.IsEmpty AndAlso ucrNudColumnFactors.GetText() <> "" Then - iNumberOfColumns = ucrNudColumnFactors.GetText() - For Each strColumn As String In ucrReceiverFactors.GetVariableNamesAsList - Dim clsHeaderFunction As New RFunction - clsHeaderFunction.SetPackageName("mmtable2") - clsHeaderFunction.SetRCommand(If(iColumn < iNumberOfColumns, "header_top_left", "header_left_top")) - clsHeaderFunction.AddParameter("variable", strColumn, iPosition:=0) - clsColumnOperator.AddParameter(strColumn, clsRFunctionParameter:=clsHeaderFunction, iPosition:=iColumn) - iColumn += 1 - Next - clsSummaryOperator.AddParameter("columnOp", clsROperatorParameter:=clsColumnOperator, iPosition:=3) - End If - Else - Dim iColumn As Integer = 1 - Dim iNumberOfColumns As Integer - clsMmtableOperator.ClearParameters() - - iNumberOfColumns = ucrNudColumnFactors.GetText() - For Each strcolumn As String In ucrReceiverFactors.GetVariableNamesAsList - If iColumn <= iNumberOfColumns Then - Dim clsHeaderLeftFunction As New RFunction - clsHeaderLeftFunction.SetPackageName("mmtable2") - clsHeaderLeftFunction.SetRCommand("header_top_left") - clsHeaderLeftFunction.AddParameter("variable", strcolumn, iPosition:=0) - clsMmtableOperator.AddParameter(strcolumn, clsRFunctionParameter:=clsHeaderLeftFunction, iPosition:=iColumn) - Else - Dim clsHeaderTopFunction As New RFunction - clsHeaderTopFunction.SetPackageName("mmtable2") - clsHeaderTopFunction.SetRCommand("header_left_top") - clsHeaderTopFunction.AddParameter("variable", strcolumn, iPosition:=0) - clsMmtableOperator.AddParameter(strcolumn, clsRFunctionParameter:=clsHeaderTopFunction, iPosition:=iColumn) - End If - iColumn += 1 - Next - clsFrequencyOperator.AddParameter("columnOp", clsROperatorParameter:=clsMmtableOperator, iPosition:=1) - End If - - End Sub - - Private Sub FillListView() - If clsSummariesList.clsParameters.Count > 0 Then - ucrReorderSummary.lstAvailableData.Clear() - ucrReorderSummary.lstAvailableData.Columns.Add("Summaries") - ucrReorderSummary.lstAvailableData.Columns(0).Width = -2 - For i = 0 To clsSummariesList.clsParameters.Count - 1 - clsSummariesList.clsParameters(i).Position = i - ucrReorderSummary.lstAvailableData.Items.Add(clsSummariesList.clsParameters(i).strArgumentName) - Next - Else - ucrReorderSummary.lstAvailableData.Items.Clear() - End If - End Sub - - Private Sub ucrReorderSummary_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReorderSummary.ControlValueChanged - Dim lstOrderedSummaries As New List(Of RParameter) - Dim iPosition As Integer = 0 - For i = 0 To ucrReorderSummary.lstAvailableData.Items.Count - 1 - lstOrderedSummaries.Add(clsSummariesList.GetParameter(ucrReorderSummary.lstAvailableData.Items(i).Text)) - Next - - clsSummariesList.ClearParameters() - 'Changing the parameter positions - For Each clsParameter In lstOrderedSummaries - clsParameter.Position = iPosition - clsSummariesList.AddParameter(clsParameter) - iPosition += 1 - Next - End Sub - - Private Sub ucrPnlSummaryFrequencyTables_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlSummaryFrequencyTables.ControlValueChanged - If rdoSummaryTable.Checked Then - clsDummyFunction.AddParameter("rdo_checked", "rdoSummary", iPosition:=10) - clsMutableFunction.AddParameter("data", clsRFunctionParameter:=clsSummaryDefaultFunction, iPosition:=0) - clsJoiningPipeOperator.AddParameter("mutable", clsROperatorParameter:=clsSummaryOperator, iPosition:=0) - ucrSaveTable.SetPrefix("summary_table") - cmdFormatTable.Location = New Point(286, 464) - cmdSummaries.Visible = True - Else - clsDummyFunction.AddParameter("rdo_checked", "rdoFrequency", iPosition:=10) - clsMutableFunction.AddParameter("data", clsRFunctionParameter:=clsFrequencyDefaultFunction, iPosition:=0) - clsJoiningPipeOperator.AddParameter("mutable", clsROperatorParameter:=clsFrequencyOperator, iPosition:=0) - ucrSaveTable.SetPrefix("frequency_table") - cmdSummaries.Visible = False - cmdFormatTable.Location = New Point(286, 379) - End If - End Sub - - Private Sub ucrChkDisplayAsPercentage_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplayAsPercentage.ControlValueChanged - If ucrChkDisplayAsPercentage.Checked Then - ucrReceiverMultiplePercentages.SetMeAsReceiver() - Else - ucrReceiverFactors.SetMeAsReceiver() - End If - End Sub -======= Imports instat.Translations Public Class dlgSummaryTables Private bFirstload As Boolean = True @@ -799,7 +180,7 @@ Public Class dlgSummaryTables ucrChkPercentageProportion.SetRDefault("FALSE") ucrSaveTable.SetPrefix("summary_table") - ucrSaveTable.SetSaveTypeAsTable() + ucrSaveTable.SetSaveType(RObjectTypeLabel.Table, strRObjectFormat:=RObjectFormat.Html) ucrSaveTable.SetDataFrameSelector(ucrSelectorSummaryTables.ucrAvailableDataFrames) ucrSaveTable.SetIsComboBox() ucrSaveTable.SetCheckBoxText("Save Table") @@ -1004,7 +385,13 @@ Public Class dlgSummaryTables ucrBase.clsRsyntax.AddToBeforeCodes(clsFrequencyDefaultFunction, iPosition:=0) ucrBase.clsRsyntax.SetBaseROperator(clsJoiningPipeOperator) - clsJoiningPipeOperator.SetAssignTo("last_table", strTempDataframe:=ucrSelectorSummaryTables.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempTable:="last_table") + + clsJoiningPipeOperator.SetAssignToRObject(strRObjectToAssignTo:="last_table", + strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, + strRObjectFormatToAssignTo:=RObjectFormat.Html, + strRDataFrameNameToAddObjectTo:=ucrSelectorSummaryTables.strCurrentDataFrame, + strObjectName:="last_table") + bResetSubdialog = True End Sub From f78b56e65e7fd3557d6f40488d25e078b0fe85bb Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Wed, 5 Oct 2022 14:16:28 +0300 Subject: [PATCH 038/122] adding unhide function --- instat/dlgHideDataframes.Designer.vb | 91 +++++++++++++++++++++-- instat/dlgHideDataframes.vb | 107 ++++++++++++++++++++++----- 2 files changed, 174 insertions(+), 24 deletions(-) diff --git a/instat/dlgHideDataframes.Designer.vb b/instat/dlgHideDataframes.Designer.vb index 97902ec9232..0a54de18698 100644 --- a/instat/dlgHideDataframes.Designer.vb +++ b/instat/dlgHideDataframes.Designer.vb @@ -43,22 +43,27 @@ Partial Class dlgHideDataframes Me.lblDataFrames = New System.Windows.Forms.Label() Me.lblHiddenDataFrames = New System.Windows.Forms.Label() Me.ucrReceiverMultiple = New instat.ucrReceiverMultiple() + Me.rdoUnhideDataFrame = New System.Windows.Forms.RadioButton() + Me.rdoHideDataFrame = New System.Windows.Forms.RadioButton() + Me.ucrPnlHideUnhide = New instat.UcrPanel() + Me.ucrReceiverMultipleUnhide = New instat.ucrReceiverMultiple() + Me.lblUnhideDataFrame = New System.Windows.Forms.Label() Me.SuspendLayout() ' 'ucrBase ' Me.ucrBase.AutoSize = True Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrBase.Location = New System.Drawing.Point(10, 178) + Me.ucrBase.Location = New System.Drawing.Point(10, 214) Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(405, 52) + Me.ucrBase.Size = New System.Drawing.Size(408, 52) Me.ucrBase.TabIndex = 1 ' 'ucrSelectorForDataFrames ' Me.ucrSelectorForDataFrames.AutoSize = True Me.ucrSelectorForDataFrames.bShowHiddenColumns = False - Me.ucrSelectorForDataFrames.Location = New System.Drawing.Point(10, 28) + Me.ucrSelectorForDataFrames.Location = New System.Drawing.Point(10, 64) Me.ucrSelectorForDataFrames.Margin = New System.Windows.Forms.Padding(0) Me.ucrSelectorForDataFrames.Name = "ucrSelectorForDataFrames" Me.ucrSelectorForDataFrames.Size = New System.Drawing.Size(218, 147) @@ -67,7 +72,7 @@ Partial Class dlgHideDataframes 'lblDataFrames ' Me.lblDataFrames.AutoSize = True - Me.lblDataFrames.Location = New System.Drawing.Point(10, 13) + Me.lblDataFrames.Location = New System.Drawing.Point(10, 49) Me.lblDataFrames.Name = "lblDataFrames" Me.lblDataFrames.Size = New System.Drawing.Size(76, 13) Me.lblDataFrames.TabIndex = 3 @@ -76,7 +81,7 @@ Partial Class dlgHideDataframes 'lblHiddenDataFrames ' Me.lblHiddenDataFrames.AutoSize = True - Me.lblHiddenDataFrames.Location = New System.Drawing.Point(248, 31) + Me.lblHiddenDataFrames.Location = New System.Drawing.Point(248, 67) Me.lblHiddenDataFrames.Name = "lblHiddenDataFrames" Me.lblHiddenDataFrames.Size = New System.Drawing.Size(113, 13) Me.lblHiddenDataFrames.TabIndex = 4 @@ -86,7 +91,7 @@ Partial Class dlgHideDataframes ' Me.ucrReceiverMultiple.AutoSize = True Me.ucrReceiverMultiple.frmParent = Me - Me.ucrReceiverMultiple.Location = New System.Drawing.Point(248, 46) + Me.ucrReceiverMultiple.Location = New System.Drawing.Point(248, 82) Me.ucrReceiverMultiple.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverMultiple.Name = "ucrReceiverMultiple" Me.ucrReceiverMultiple.Selector = Nothing @@ -95,17 +100,84 @@ Partial Class dlgHideDataframes Me.ucrReceiverMultiple.TabIndex = 5 Me.ucrReceiverMultiple.ucrSelector = Nothing ' + 'rdoUnhideDataFrame + ' + Me.rdoUnhideDataFrame.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoUnhideDataFrame.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoUnhideDataFrame.FlatAppearance.BorderSize = 2 + Me.rdoUnhideDataFrame.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoUnhideDataFrame.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoUnhideDataFrame.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoUnhideDataFrame.Location = New System.Drawing.Point(208, 7) + Me.rdoUnhideDataFrame.Name = "rdoUnhideDataFrame" + Me.rdoUnhideDataFrame.Size = New System.Drawing.Size(100, 28) + Me.rdoUnhideDataFrame.TabIndex = 6 + Me.rdoUnhideDataFrame.Text = "Unhide" + Me.rdoUnhideDataFrame.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoUnhideDataFrame.UseVisualStyleBackColor = True + ' + 'rdoHideDataFrame + ' + Me.rdoHideDataFrame.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoHideDataFrame.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoHideDataFrame.FlatAppearance.BorderSize = 2 + Me.rdoHideDataFrame.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoHideDataFrame.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoHideDataFrame.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoHideDataFrame.Location = New System.Drawing.Point(112, 7) + Me.rdoHideDataFrame.Name = "rdoHideDataFrame" + Me.rdoHideDataFrame.Size = New System.Drawing.Size(100, 28) + Me.rdoHideDataFrame.TabIndex = 7 + Me.rdoHideDataFrame.Text = "Hide" + Me.rdoHideDataFrame.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoHideDataFrame.UseVisualStyleBackColor = True + ' + 'ucrPnlHideUnhide + ' + Me.ucrPnlHideUnhide.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlHideUnhide.Location = New System.Drawing.Point(92, 5) + Me.ucrPnlHideUnhide.Name = "ucrPnlHideUnhide" + Me.ucrPnlHideUnhide.Size = New System.Drawing.Size(241, 34) + Me.ucrPnlHideUnhide.TabIndex = 8 + ' + 'ucrReceiverMultipleUnhide + ' + Me.ucrReceiverMultipleUnhide.AutoSize = True + Me.ucrReceiverMultipleUnhide.frmParent = Me + Me.ucrReceiverMultipleUnhide.Location = New System.Drawing.Point(248, 82) + Me.ucrReceiverMultipleUnhide.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverMultipleUnhide.Name = "ucrReceiverMultipleUnhide" + Me.ucrReceiverMultipleUnhide.Selector = Nothing + Me.ucrReceiverMultipleUnhide.Size = New System.Drawing.Size(120, 112) + Me.ucrReceiverMultipleUnhide.strNcFilePath = "" + Me.ucrReceiverMultipleUnhide.TabIndex = 9 + Me.ucrReceiverMultipleUnhide.ucrSelector = Nothing + ' + 'lblUnhideDataFrame + ' + Me.lblUnhideDataFrame.AutoSize = True + Me.lblUnhideDataFrame.Location = New System.Drawing.Point(248, 67) + Me.lblUnhideDataFrame.Name = "lblUnhideDataFrame" + Me.lblUnhideDataFrame.Size = New System.Drawing.Size(125, 13) + Me.lblUnhideDataFrame.TabIndex = 10 + Me.lblUnhideDataFrame.Text = "Unhidden Data Frame(s):" + ' 'dlgHideDataframes ' Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(422, 233) + Me.ClientSize = New System.Drawing.Size(422, 279) + Me.Controls.Add(Me.rdoHideDataFrame) + Me.Controls.Add(Me.rdoUnhideDataFrame) Me.Controls.Add(Me.lblHiddenDataFrames) Me.Controls.Add(Me.ucrReceiverMultiple) Me.Controls.Add(Me.lblDataFrames) Me.Controls.Add(Me.ucrSelectorForDataFrames) Me.Controls.Add(Me.ucrBase) + Me.Controls.Add(Me.ucrPnlHideUnhide) + Me.Controls.Add(Me.ucrReceiverMultipleUnhide) + Me.Controls.Add(Me.lblUnhideDataFrame) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.MinimizeBox = False @@ -123,4 +195,9 @@ Partial Class dlgHideDataframes Friend WithEvents lblDataFrames As Label Friend WithEvents lblHiddenDataFrames As Label Friend WithEvents ucrReceiverMultiple As ucrReceiverMultiple + Friend WithEvents rdoHideDataFrame As RadioButton + Friend WithEvents rdoUnhideDataFrame As RadioButton + Friend WithEvents ucrPnlHideUnhide As UcrPanel + Friend WithEvents ucrReceiverMultipleUnhide As ucrReceiverMultiple + Friend WithEvents lblUnhideDataFrame As Label End Class diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 7e4f972b409..2d8a19cf5be 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -22,6 +22,12 @@ Public Class dlgHideDataframes Public bFirstLoad As Boolean = True Private bReset As Boolean = True Private clsHideDataFramesFunction As New RFunction + Private clsAppendToDataFrameFunction As New RFunction + Private clsMappingFunction As New RFunction + Private clsDataUnhideFunction As New ROperator + Private clsTildeOperator As New ROperator + + Private clsDummyFunction As New RFunction Private Sub dlgHideDataframes_Load(sender As Object, e As EventArgs) Handles MyBase.Load If bFirstLoad Then @@ -32,7 +38,7 @@ Public Class dlgHideDataframes SetDefaults() End If SetRCodeForControls(bReset) - SetHiddenColumns() + 'SetHiddenColumns() bReset = False autoTranslate(Me) End Sub @@ -43,13 +49,58 @@ Public Class dlgHideDataframes ucrReceiverMultiple.Selector = ucrSelectorForDataFrames ucrReceiverMultiple.strSelectorHeading = "Data Frames" ucrReceiverMultiple.SetItemType("dataframe") - ucrReceiverMultiple.SetMeAsReceiver() + 'ucrReceiverMultiple.SetMeAsReceiver() + + ucrReceiverMultipleUnhide.SetParameter(New RParameter("data_names", 0)) + ucrReceiverMultipleUnhide.SetParameterIsString() + ucrReceiverMultipleUnhide.Selector = ucrSelectorForDataFrames + ucrReceiverMultipleUnhide.strSelectorHeading = "Data Frames" + ucrReceiverMultipleUnhide.SetItemType("dataframe") + 'ucrReceiverMultipleUnhide.SetMeAsReceiver() + + ucrPnlHideUnhide.AddRadioButton(rdoHideDataFrame) + ucrPnlHideUnhide.AddRadioButton(rdoUnhideDataFrame) + ucrPnlHideUnhide.AddParameterValuesCondition(rdoHideDataFrame, "checked", "rdoHide") + ucrPnlHideUnhide.AddParameterValuesCondition(rdoUnhideDataFrame, "checked", "rdoUnhide") + + + ucrReceiverMultiple.SetLinkedDisplayControl(lblHiddenDataFrames) + ucrReceiverMultipleUnhide.SetLinkedDisplayControl(lblUnhideDataFrame) + + ucrPnlHideUnhide.AddToLinkedControls(ucrReceiverMultiple, {rdoHideDataFrame}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlHideUnhide.AddToLinkedControls(ucrReceiverMultipleUnhide, {rdoUnhideDataFrame}, bNewLinkedHideIfParameterMissing:=True) End Sub Private Sub SetDefaults() clsHideDataFramesFunction = New RFunction + clsAppendToDataFrameFunction = New RFunction + clsMappingFunction = New RFunction + clsDataUnhideFunction = New ROperator + clsTildeOperator = New ROperator + clsDummyFunction = New RFunction + + clsDummyFunction.AddParameter("checked", "rdoHide", iPosition:=0) + + clsMappingFunction.SetPackageName("purrr") + clsMappingFunction.SetRCommand("map") + clsMappingFunction.AddParameter(".x", clsROperatorParameter:=clsDataUnhideFunction, iPosition:=0) + clsMappingFunction.AddParameter(".f", clsROperatorParameter:=clsTildeOperator, iPosition:=1) + + clsTildeOperator.SetOperation("~") + clsTildeOperator.AddParameter("right", clsRFunctionParameter:=clsAppendToDataFrameFunction, iPosition:=1) + clsTildeOperator.bForceIncludeOperation = True + + clsDataUnhideFunction.SetOperation("", bBracketsTemp:=False) + clsDataUnhideFunction.SetAssignTo("data_to_unhide") + 'clsDataUnhideFunction.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) + clsHideDataFramesFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$set_hidden_data_frames") + clsAppendToDataFrameFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$append_to_dataframe_metadata") + clsAppendToDataFrameFunction.AddParameter("data_name", ".x", iPosition:=0) + clsAppendToDataFrameFunction.AddParameter("property", "is_hidden_label", iPosition:=1) + clsAppendToDataFrameFunction.AddParameter("new_val", "FALSE", iPosition:=2) + ucrBase.clsRsyntax.SetBaseRFunction(clsHideDataFramesFunction) End Sub @@ -69,27 +120,49 @@ Public Class dlgHideDataframes End Sub Public Sub SetRCodeForControls(bReset As Boolean) - SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) + 'SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) + + ucrPnlHideUnhide.SetRCode(clsDummyFunction, bReset) + ucrReceiverMultiple.SetRCode(clsHideDataFramesFunction, bReset) + 'ucrReceiverMultipleUnhide.SetRCode(clsMappingFunction, bReset) End Sub - Private Sub SetHiddenColumns() - Dim expTemp As SymbolicExpression - Dim chrHiddenColumns As CharacterVector - Dim clsGetHiddenDataFrames As New RFunction + 'Private Sub SetHiddenColumns() + ' Dim expTemp As SymbolicExpression + ' Dim chrHiddenColumns As CharacterVector + ' Dim clsGetHiddenDataFrames As New RFunction - clsGetHiddenDataFrames.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_hidden_data_frames") + ' clsGetHiddenDataFrames.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_hidden_data_frames") - ucrReceiverMultiple.Clear() - expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsGetHiddenDataFrames.ToScript(), bSilent:=True) - If expTemp IsNot Nothing AndAlso expTemp.Type <> Internals.SymbolicExpressionType.Null Then - chrHiddenColumns = expTemp.AsCharacter - For Each strDataFrame As String In chrHiddenColumns - ucrReceiverMultiple.Add(strDataFrame) - Next - End If - End Sub + ' ucrReceiverMultiple.Clear() + ' expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsGetHiddenDataFrames.ToScript(), bSilent:=True) + ' If expTemp IsNot Nothing AndAlso expTemp.Type <> Internals.SymbolicExpressionType.Null Then + ' chrHiddenColumns = expTemp.AsCharacter + ' For Each strDataFrame As String In chrHiddenColumns + ' ucrReceiverMultiple.Add(strDataFrame) + ' Next + ' End If + 'End Sub Private Sub ucrReceiverMultiple_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultiple.ControlContentsChanged TestOKEnabled() End Sub + + Private Sub ucrPnlHideUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlHideUnhide.ControlValueChanged + If rdoHideDataFrame.Checked Then + ucrBase.clsRsyntax.SetBaseRFunction(clsHideDataFramesFunction) + clsDummyFunction.AddParameter("checked", "rdoHide", iPosition:=0) + ucrReceiverMultiple.SetMeAsReceiver() + + Else + ucrBase.clsRsyntax.SetBaseRFunction(clsMappingFunction) + clsDummyFunction.AddParameter("checked", "rdoUnhide", iPosition:=0) + ucrReceiverMultipleUnhide.SetMeAsReceiver() + + End If + End Sub + + Private Sub ucrReceiverMultipleUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultipleUnhide.ControlValueChanged + clsDataUnhideFunction.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) + End Sub End Class \ No newline at end of file From 19575f703b68af92556935d0451f94769e888213 Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Thu, 6 Oct 2022 10:48:43 +0300 Subject: [PATCH 039/122] changes made --- instat/dlgHideDataframes.vb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 2d8a19cf5be..74f2e2a4d7e 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -148,13 +148,15 @@ Public Class dlgHideDataframes TestOKEnabled() End Sub - Private Sub ucrPnlHideUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlHideUnhide.ControlValueChanged + Private Sub ucrPnlHideUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlHideUnhide.ControlValueChanged, ucrReceiverMultipleUnhide.ControlValueChanged If rdoHideDataFrame.Checked Then ucrBase.clsRsyntax.SetBaseRFunction(clsHideDataFramesFunction) clsDummyFunction.AddParameter("checked", "rdoHide", iPosition:=0) ucrReceiverMultiple.SetMeAsReceiver() Else + clsDataUnhideFunction.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) + ucrBase.clsRsyntax.SetBaseRFunction(clsMappingFunction) clsDummyFunction.AddParameter("checked", "rdoUnhide", iPosition:=0) ucrReceiverMultipleUnhide.SetMeAsReceiver() @@ -162,7 +164,7 @@ Public Class dlgHideDataframes End If End Sub - Private Sub ucrReceiverMultipleUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultipleUnhide.ControlValueChanged - clsDataUnhideFunction.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) - End Sub + 'Private Sub ucrReceiverMultipleUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultipleUnhide.ControlValueChanged + ' clsDataUnhideFunction.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) + 'End Sub End Class \ No newline at end of file From f3597dff015040e24e5ff6d616379e4b155e0c37 Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Thu, 6 Oct 2022 15:17:03 +0300 Subject: [PATCH 040/122] changes to the code --- instat/sdgFiltersFromFactor.Designer.vb | 13 +------------ instat/sdgFiltersFromFactor.vb | 18 +----------------- instat/ucrFactor.vb | 25 ++++++++++++++----------- instat/ucrFilter.vb | 5 ----- 4 files changed, 16 insertions(+), 45 deletions(-) diff --git a/instat/sdgFiltersFromFactor.Designer.vb b/instat/sdgFiltersFromFactor.Designer.vb index 1d89448d3c5..b8bad5f0842 100644 --- a/instat/sdgFiltersFromFactor.Designer.vb +++ b/instat/sdgFiltersFromFactor.Designer.vb @@ -27,7 +27,6 @@ Partial Class sdgFiltersFromFactor Me.ucrReceiverFactor = New instat.ucrReceiverSingle() Me.lblFactors = New System.Windows.Forms.Label() Me.ucrFactorLevels = New instat.ucrFactor() - Me.cmdSelectAll = New System.Windows.Forms.Button() Me.SuspendLayout() ' 'ucrBase @@ -77,25 +76,16 @@ Partial Class sdgFiltersFromFactor Me.ucrFactorLevels.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle Me.ucrFactorLevels.Location = New System.Drawing.Point(267, 57) Me.ucrFactorLevels.Name = "ucrFactorLevels" + Me.ucrFactorLevels.SelectionControlsVisible = True Me.ucrFactorLevels.Size = New System.Drawing.Size(270, 208) Me.ucrFactorLevels.TabIndex = 1 ' - 'cmdSelectAll - ' - Me.cmdSelectAll.Location = New System.Drawing.Point(462, 268) - Me.cmdSelectAll.Name = "cmdSelectAll" - Me.cmdSelectAll.Size = New System.Drawing.Size(75, 23) - Me.cmdSelectAll.TabIndex = 0 - Me.cmdSelectAll.Text = "Select All" - Me.cmdSelectAll.UseVisualStyleBackColor = True - ' 'sdgFiltersFromFactor ' Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True Me.ClientSize = New System.Drawing.Size(545, 337) - Me.Controls.Add(Me.cmdSelectAll) Me.Controls.Add(Me.ucrFactorLevels) Me.Controls.Add(Me.lblFactors) Me.Controls.Add(Me.ucrReceiverFactor) @@ -117,5 +107,4 @@ Partial Class sdgFiltersFromFactor Friend WithEvents ucrReceiverFactor As ucrReceiverSingle Friend WithEvents lblFactors As Label Friend WithEvents ucrFactorLevels As ucrFactor - Friend WithEvents cmdSelectAll As Button End Class diff --git a/instat/sdgFiltersFromFactor.vb b/instat/sdgFiltersFromFactor.vb index d667caff668..91d4bc81285 100644 --- a/instat/sdgFiltersFromFactor.vb +++ b/instat/sdgFiltersFromFactor.vb @@ -55,7 +55,7 @@ Public Class sdgFiltersFromFactor dctParamAndColNames:=dctParamAndColNames, hiddenColNames:={ucrFactor.DefaultColumnNames.Level}, bIncludeNALevel:=False) - cmdSelectAll.Enabled = False + End Sub Public Sub SetRcodeAndDefaultDataFrame(ucrNewBaseSelector As ucrSelector, bReset As Boolean) @@ -76,22 +76,6 @@ Public Class sdgFiltersFromFactor End If End Sub - Private Sub cmdSelectAll_Click(sender As Object, e As EventArgs) Handles cmdSelectAll.Click - ucrFactorLevels.SelectAllGridRows(Not ucrFactorLevels.IsAllGridRowsSelected()) - End Sub - - Private Sub ucrReceiverFactor_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverFactor.ControlValueChanged - cmdSelectAll.Enabled = Not ucrReceiverFactor.IsEmpty - If ucrFactorLevels.IsAllGridRowsSelected() Then - cmdSelectAll.Text = "Deselect All Levels" - cmdSelectAll.FlatStyle = FlatStyle.Flat - Else - cmdSelectAll.Text = "Select All Levels" - cmdSelectAll.FlatStyle = FlatStyle.Popup - End If - autoTranslate(Me) - End Sub - Private Sub ucrSelectorFiltersFromFactors_DataFrameChanged() Handles ucrSelectorFiltersFromFactors.DataFrameChanged clsAddFilterFromFactors.AddParameter("data_name", Chr(34) & ucrSelectorFiltersFromFactors.ucrAvailableDataFrames.cboAvailableDataFrames.Text & Chr(34), iPosition:=0) End Sub diff --git a/instat/ucrFactor.vb b/instat/ucrFactor.vb index 87b0ba82bad..2aa41a0abbd 100644 --- a/instat/ucrFactor.vb +++ b/instat/ucrFactor.vb @@ -153,6 +153,7 @@ Public Class ucrFactor Private Sub ucrFactor_Load(sender As Object, e As EventArgs) Handles Me.Load 'the grid will always have 1 sheet. So no need to display the sheet tab control grdFactorData.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, False) + lblSelected.ForeColor = Color.Red End Sub Private Sub _ucrLinkedReceiver_ControlValueChanged(ucrChangedControl As ucrCore) Handles _ucrLinkedReceiver.ControlValueChanged @@ -727,15 +728,16 @@ Public Class ucrFactor End Function Private Function CountRowSelected() As Integer + If _grdSheet Is Nothing OrElse _enumControlState = ControlStates.NormalGrid Then + Return False + End If Dim iSelectorColumnIndex As Integer = GetColumnIndex(_grdSheet, DefaultColumnNames.SelectorColumn) Dim iCount As Integer = 0 - If _grdSheet IsNot Nothing Then - For i = 0 To _grdSheet.Rows - 1 - If DirectCast(_grdSheet(i, iSelectorColumnIndex), Boolean) Then - iCount += 1 - End If - Next - End If + For i = 0 To _grdSheet.Rows - 1 + If DirectCast(_grdSheet(i, iSelectorColumnIndex), Boolean) Then + iCount += 1 + End If + Next Return iCount End Function @@ -927,10 +929,11 @@ Public Class ucrFactor End If End Sub - Public Sub SetColumnsSelected() - lblSelected.Text = "Selected:" & CountRowSelected() - lblSelected.Visible = CountRowSelected() > 0 - lblSelected.ForeColor = Color.Red + Private Sub SetColumnsSelected(ucrChangedControl As ucrCore) Handles Me.ControlValueChanged + Dim iSelectCol As Integer = CountRowSelected() + + lblSelected.Text = "Selected:" & iSelectCol + lblSelected.Visible = iSelectCol > 0 SetToggleButtonSettings() End Sub End Class \ No newline at end of file diff --git a/instat/ucrFilter.vb b/instat/ucrFilter.vb index 83295bd8277..22041c537e1 100644 --- a/instat/ucrFilter.vb +++ b/instat/ucrFilter.vb @@ -227,13 +227,8 @@ Public Class ucrFilter RaiseEvent FilterChanged() End Sub - Private Sub cmdToggleSelectAll_Click(sender As Object, e As EventArgs) - ucrFactorLevels.SelectAllGridRows(Not ucrFactorLevels.IsAllGridRowsSelected()) - End Sub - Private Sub ucrFactorLevels_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrFactorLevels.ControlValueChanged CheckAddEnabled() - ucrFactorLevels.SetColumnsSelected() End Sub Private Sub ucrSelectorForFitler_DataFrameChanged() Handles ucrSelectorForFitler.DataFrameChanged From 5ab40fdbb16cf527a3a30ea82c125659a9d90a7e Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Sat, 8 Oct 2022 09:43:24 +0300 Subject: [PATCH 041/122] designer changes --- instat/dlgHideDataframes.Designer.vb | 16 +++--- instat/dlgHideDataframes.vb | 78 ++++++++++++++-------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/instat/dlgHideDataframes.Designer.vb b/instat/dlgHideDataframes.Designer.vb index 0a54de18698..7acd72a3ce1 100644 --- a/instat/dlgHideDataframes.Designer.vb +++ b/instat/dlgHideDataframes.Designer.vb @@ -54,7 +54,7 @@ Partial Class dlgHideDataframes ' Me.ucrBase.AutoSize = True Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrBase.Location = New System.Drawing.Point(10, 214) + Me.ucrBase.Location = New System.Drawing.Point(10, 190) Me.ucrBase.Name = "ucrBase" Me.ucrBase.Size = New System.Drawing.Size(408, 52) Me.ucrBase.TabIndex = 1 @@ -63,7 +63,7 @@ Partial Class dlgHideDataframes ' Me.ucrSelectorForDataFrames.AutoSize = True Me.ucrSelectorForDataFrames.bShowHiddenColumns = False - Me.ucrSelectorForDataFrames.Location = New System.Drawing.Point(10, 64) + Me.ucrSelectorForDataFrames.Location = New System.Drawing.Point(10, 44) Me.ucrSelectorForDataFrames.Margin = New System.Windows.Forms.Padding(0) Me.ucrSelectorForDataFrames.Name = "ucrSelectorForDataFrames" Me.ucrSelectorForDataFrames.Size = New System.Drawing.Size(218, 147) @@ -72,7 +72,7 @@ Partial Class dlgHideDataframes 'lblDataFrames ' Me.lblDataFrames.AutoSize = True - Me.lblDataFrames.Location = New System.Drawing.Point(10, 49) + Me.lblDataFrames.Location = New System.Drawing.Point(10, 29) Me.lblDataFrames.Name = "lblDataFrames" Me.lblDataFrames.Size = New System.Drawing.Size(76, 13) Me.lblDataFrames.TabIndex = 3 @@ -81,7 +81,7 @@ Partial Class dlgHideDataframes 'lblHiddenDataFrames ' Me.lblHiddenDataFrames.AutoSize = True - Me.lblHiddenDataFrames.Location = New System.Drawing.Point(248, 67) + Me.lblHiddenDataFrames.Location = New System.Drawing.Point(248, 47) Me.lblHiddenDataFrames.Name = "lblHiddenDataFrames" Me.lblHiddenDataFrames.Size = New System.Drawing.Size(113, 13) Me.lblHiddenDataFrames.TabIndex = 4 @@ -91,7 +91,7 @@ Partial Class dlgHideDataframes ' Me.ucrReceiverMultiple.AutoSize = True Me.ucrReceiverMultiple.frmParent = Me - Me.ucrReceiverMultiple.Location = New System.Drawing.Point(248, 82) + Me.ucrReceiverMultiple.Location = New System.Drawing.Point(248, 62) Me.ucrReceiverMultiple.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverMultiple.Name = "ucrReceiverMultiple" Me.ucrReceiverMultiple.Selector = Nothing @@ -144,7 +144,7 @@ Partial Class dlgHideDataframes ' Me.ucrReceiverMultipleUnhide.AutoSize = True Me.ucrReceiverMultipleUnhide.frmParent = Me - Me.ucrReceiverMultipleUnhide.Location = New System.Drawing.Point(248, 82) + Me.ucrReceiverMultipleUnhide.Location = New System.Drawing.Point(248, 62) Me.ucrReceiverMultipleUnhide.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverMultipleUnhide.Name = "ucrReceiverMultipleUnhide" Me.ucrReceiverMultipleUnhide.Selector = Nothing @@ -156,7 +156,7 @@ Partial Class dlgHideDataframes 'lblUnhideDataFrame ' Me.lblUnhideDataFrame.AutoSize = True - Me.lblUnhideDataFrame.Location = New System.Drawing.Point(248, 67) + Me.lblUnhideDataFrame.Location = New System.Drawing.Point(248, 47) Me.lblUnhideDataFrame.Name = "lblUnhideDataFrame" Me.lblUnhideDataFrame.Size = New System.Drawing.Size(125, 13) Me.lblUnhideDataFrame.TabIndex = 10 @@ -167,7 +167,7 @@ Partial Class dlgHideDataframes Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(422, 279) + Me.ClientSize = New System.Drawing.Size(416, 247) Me.Controls.Add(Me.rdoHideDataFrame) Me.Controls.Add(Me.rdoUnhideDataFrame) Me.Controls.Add(Me.lblHiddenDataFrames) diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 74f2e2a4d7e..9ece424a99b 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -24,7 +24,7 @@ Public Class dlgHideDataframes Private clsHideDataFramesFunction As New RFunction Private clsAppendToDataFrameFunction As New RFunction Private clsMappingFunction As New RFunction - Private clsDataUnhideFunction As New ROperator + Private clsDataUnhideOperator As New ROperator Private clsTildeOperator As New ROperator Private clsDummyFunction As New RFunction @@ -38,7 +38,6 @@ Public Class dlgHideDataframes SetDefaults() End If SetRCodeForControls(bReset) - 'SetHiddenColumns() bReset = False autoTranslate(Me) End Sub @@ -49,21 +48,18 @@ Public Class dlgHideDataframes ucrReceiverMultiple.Selector = ucrSelectorForDataFrames ucrReceiverMultiple.strSelectorHeading = "Data Frames" ucrReceiverMultiple.SetItemType("dataframe") - 'ucrReceiverMultiple.SetMeAsReceiver() ucrReceiverMultipleUnhide.SetParameter(New RParameter("data_names", 0)) ucrReceiverMultipleUnhide.SetParameterIsString() ucrReceiverMultipleUnhide.Selector = ucrSelectorForDataFrames ucrReceiverMultipleUnhide.strSelectorHeading = "Data Frames" ucrReceiverMultipleUnhide.SetItemType("dataframe") - 'ucrReceiverMultipleUnhide.SetMeAsReceiver() ucrPnlHideUnhide.AddRadioButton(rdoHideDataFrame) ucrPnlHideUnhide.AddRadioButton(rdoUnhideDataFrame) ucrPnlHideUnhide.AddParameterValuesCondition(rdoHideDataFrame, "checked", "rdoHide") ucrPnlHideUnhide.AddParameterValuesCondition(rdoUnhideDataFrame, "checked", "rdoUnhide") - ucrReceiverMultiple.SetLinkedDisplayControl(lblHiddenDataFrames) ucrReceiverMultipleUnhide.SetLinkedDisplayControl(lblUnhideDataFrame) @@ -76,7 +72,7 @@ Public Class dlgHideDataframes clsHideDataFramesFunction = New RFunction clsAppendToDataFrameFunction = New RFunction clsMappingFunction = New RFunction - clsDataUnhideFunction = New ROperator + clsDataUnhideOperator = New ROperator clsTildeOperator = New ROperator clsDummyFunction = New RFunction @@ -84,16 +80,15 @@ Public Class dlgHideDataframes clsMappingFunction.SetPackageName("purrr") clsMappingFunction.SetRCommand("map") - clsMappingFunction.AddParameter(".x", clsROperatorParameter:=clsDataUnhideFunction, iPosition:=0) + clsMappingFunction.AddParameter(".x", clsROperatorParameter:=clsDataUnhideOperator, iPosition:=0) clsMappingFunction.AddParameter(".f", clsROperatorParameter:=clsTildeOperator, iPosition:=1) clsTildeOperator.SetOperation("~") clsTildeOperator.AddParameter("right", clsRFunctionParameter:=clsAppendToDataFrameFunction, iPosition:=1) clsTildeOperator.bForceIncludeOperation = True - clsDataUnhideFunction.SetOperation("", bBracketsTemp:=False) - clsDataUnhideFunction.SetAssignTo("data_to_unhide") - 'clsDataUnhideFunction.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) + clsDataUnhideOperator.SetOperation("", bBracketsTemp:=False) + clsDataUnhideOperator.SetAssignTo("data_to_unhide") clsHideDataFramesFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$set_hidden_data_frames") clsAppendToDataFrameFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$append_to_dataframe_metadata") @@ -105,12 +100,21 @@ Public Class dlgHideDataframes End Sub Private Sub TestOKEnabled() - ' You cannot hide all data frames. When the receiver is blank all data frames are unhidden so this is allowed. - If ucrReceiverMultiple.lstSelectedVariables.Items.Count <> ucrSelectorForDataFrames.lstAvailableVariable.Items.Count Then - ucrBase.OKEnabled(True) + If rdoUnhideDataFrame.Checked Then + If Not ucrReceiverMultipleUnhide.IsEmpty Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If Else - ucrBase.OKEnabled(False) + ' You cannot hide all data frames. When the receiver is blank all data frames are unhidden so this is allowed. + If ucrReceiverMultiple.lstSelectedVariables.Items.Count <> ucrSelectorForDataFrames.lstAvailableVariable.Items.Count Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If End If + End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -120,31 +124,29 @@ Public Class dlgHideDataframes End Sub Public Sub SetRCodeForControls(bReset As Boolean) - 'SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) ucrPnlHideUnhide.SetRCode(clsDummyFunction, bReset) ucrReceiverMultiple.SetRCode(clsHideDataFramesFunction, bReset) - 'ucrReceiverMultipleUnhide.SetRCode(clsMappingFunction, bReset) End Sub - 'Private Sub SetHiddenColumns() - ' Dim expTemp As SymbolicExpression - ' Dim chrHiddenColumns As CharacterVector - ' Dim clsGetHiddenDataFrames As New RFunction + Private Sub SetHiddenColumns() + Dim expTemp As SymbolicExpression + Dim chrHiddenColumns As CharacterVector + Dim clsGetHiddenDataFrames As New RFunction - ' clsGetHiddenDataFrames.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_hidden_data_frames") + clsGetHiddenDataFrames.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_hidden_data_frames") - ' ucrReceiverMultiple.Clear() - ' expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsGetHiddenDataFrames.ToScript(), bSilent:=True) - ' If expTemp IsNot Nothing AndAlso expTemp.Type <> Internals.SymbolicExpressionType.Null Then - ' chrHiddenColumns = expTemp.AsCharacter - ' For Each strDataFrame As String In chrHiddenColumns - ' ucrReceiverMultiple.Add(strDataFrame) - ' Next - ' End If - 'End Sub + ucrSelectorForDataFrames.lstAvailableVariable.Items.Clear() + expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsGetHiddenDataFrames.ToScript(), bSilent:=True) + If expTemp IsNot Nothing AndAlso expTemp.Type <> Internals.SymbolicExpressionType.Null Then + chrHiddenColumns = expTemp.AsCharacter + For Each strDataFrame As String In chrHiddenColumns + ucrSelectorForDataFrames.lstAvailableVariable.Items.Add(strDataFrame) + Next + End If + End Sub - Private Sub ucrReceiverMultiple_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultiple.ControlContentsChanged + Private Sub ucrReceiverMultiple_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultiple.ControlContentsChanged, ucrReceiverMultipleUnhide.ControlContentsChanged TestOKEnabled() End Sub @@ -153,18 +155,16 @@ Public Class dlgHideDataframes ucrBase.clsRsyntax.SetBaseRFunction(clsHideDataFramesFunction) clsDummyFunction.AddParameter("checked", "rdoHide", iPosition:=0) ucrReceiverMultiple.SetMeAsReceiver() - Else - clsDataUnhideFunction.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) - + clsDataUnhideOperator.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) ucrBase.clsRsyntax.SetBaseRFunction(clsMappingFunction) clsDummyFunction.AddParameter("checked", "rdoUnhide", iPosition:=0) - ucrReceiverMultipleUnhide.SetMeAsReceiver() - End If + TestOKEnabled() End Sub - 'Private Sub ucrReceiverMultipleUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultipleUnhide.ControlValueChanged - ' clsDataUnhideFunction.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) - 'End Sub + Private Sub ucrReceiverMultipleUnhide_Enter(sender As Object, e As EventArgs) Handles ucrReceiverMultipleUnhide.Enter + SetHiddenColumns() + TestOKEnabled() + End Sub End Class \ No newline at end of file From 9073cc6b41a954a308ade13c3125822b8508244b Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Tue, 11 Oct 2022 09:48:39 +0300 Subject: [PATCH 042/122] Increasing the maximum threshold of parameter values. --- instat/sdgExtremesMethod.vb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instat/sdgExtremesMethod.vb b/instat/sdgExtremesMethod.vb index 7ebe4b77ad9..dc735088951 100644 --- a/instat/sdgExtremesMethod.vb +++ b/instat/sdgExtremesMethod.vb @@ -64,18 +64,18 @@ Public Class sdgExtremesMethod ucrInputPrior.SetLinkedDisplayControl(lblPrior) ucrNudLocation.SetParameter(New RParameter("location", 1)) - ucrNudLocation.SetMinMax(-5, 10) + ucrNudLocation.SetMinMax(-5, 1000) ucrNudLocation.DecimalPlaces = 1 ucrNudLocation.Increment = 0.1 ucrNudLocation.SetLinkedDisplayControl(grpInitial) ucrNudScale.SetParameter(New RParameter("scale", 2)) - ucrNudScale.SetMinMax(-5, 10) + ucrNudScale.SetMinMax(-5, 1000) ucrNudScale.DecimalPlaces = 1 ucrNudScale.Increment = 0.1 ucrNudShape.SetParameter(New RParameter("shape", 3)) - ucrNudShape.SetMinMax(-5, 10) + ucrNudShape.SetMinMax(-5, 1000) ucrNudShape.DecimalPlaces = 1 ucrNudShape.Increment = 1 From f7611539392e61d995539bb21d9e76237d9a9b9a Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Tue, 11 Oct 2022 11:06:03 +0300 Subject: [PATCH 043/122] Adding Zseq package keys and tooltips --- instat/dlgCalculator.vb | 2 +- instat/ucrCalculator.Designer.vb | 371 +++++++++++++++++++++++++------ instat/ucrCalculator.vb | 194 ++++++++++++++-- 3 files changed, 479 insertions(+), 88 deletions(-) diff --git a/instat/dlgCalculator.vb b/instat/dlgCalculator.vb index 4e67fcc6781..2eda94003d0 100644 --- a/instat/dlgCalculator.vb +++ b/instat/dlgCalculator.vb @@ -188,7 +188,7 @@ Public Class dlgCalculator Me.Width = iBasicWidth * 1.27 ucrBase.iHelpTopicID = 598 Case "Integer" - Me.Width = iBasicWidth * 1.38 + Me.Width = iBasicWidth * 1.5 Case Else Me.Width = iBasicWidth End Select diff --git a/instat/ucrCalculator.Designer.vb b/instat/ucrCalculator.Designer.vb index 01dbeaf04d1..d276870ee5d 100644 --- a/instat/ucrCalculator.Designer.vb +++ b/instat/ucrCalculator.Designer.vb @@ -95,13 +95,12 @@ Partial Class ucrCalculator Me.cmdGCD = New System.Windows.Forms.Button() Me.cmdGeneratePrimes = New System.Windows.Forms.Button() Me.cmdNthPrime = New System.Windows.Forms.Button() - Me.cmdIntegerRHelp = New instat.ucrSplitButton() Me.ContextMenuStripInteger = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.DescToolsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.RutilsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.PrimesToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() - Me.cmdAsHexmode = New System.Windows.Forms.Button() - Me.cmdAsOctmode = New System.Windows.Forms.Button() + Me.cmdHex = New System.Windows.Forms.Button() + Me.cmdOctal = New System.Windows.Forms.Button() Me.cmdBinary = New System.Windows.Forms.Button() Me.cmdBigQ = New System.Windows.Forms.Button() Me.cmdDigitSum = New System.Windows.Forms.Button() @@ -432,6 +431,26 @@ Partial Class ucrCalculator Me.cmdbegin = New System.Windows.Forms.Button() Me.cmdAny1 = New System.Windows.Forms.Button() Me.cmdStringRHelp = New System.Windows.Forms.Button() + Me.cmdOctmode = New System.Windows.Forms.Button() + Me.cmdHexmode = New System.Windows.Forms.Button() + Me.cmdRoman = New System.Windows.Forms.Button() + Me.cmdPalindrome = New System.Windows.Forms.Button() + Me.cmdFibonacci2 = New System.Windows.Forms.Button() + Me.cmdAbundant = New System.Windows.Forms.Button() + Me.cmdPerfect = New System.Windows.Forms.Button() + Me.cmdFrugal = New System.Windows.Forms.Button() + Me.cmdPowerful = New System.Windows.Forms.Button() + Me.cmdUgly = New System.Windows.Forms.Button() + Me.cmdHappy = New System.Windows.Forms.Button() + Me.cmdAchilles = New System.Windows.Forms.Button() + Me.cmdPadovan = New System.Windows.Forms.Button() + Me.cmdTriangle = New System.Windows.Forms.Button() + Me.cmdSquare = New System.Windows.Forms.Button() + Me.cmdFactorize2 = New System.Windows.Forms.Button() + Me.ZseqToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.GmpToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.UtilsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.cmdIntegerRHelp = New instat.ucrSplitButton() Me.ucrSaveResultInto = New instat.ucrSave() Me.ucrTryCalculator = New instat.ucrTry() Me.ucrInputCalOptions = New instat.ucrInputComboBox() @@ -970,6 +989,22 @@ Partial Class ucrCalculator ' 'grpInteger ' + Me.grpInteger.Controls.Add(Me.cmdFactorize2) + Me.grpInteger.Controls.Add(Me.cmdSquare) + Me.grpInteger.Controls.Add(Me.cmdTriangle) + Me.grpInteger.Controls.Add(Me.cmdPadovan) + Me.grpInteger.Controls.Add(Me.cmdAchilles) + Me.grpInteger.Controls.Add(Me.cmdHappy) + Me.grpInteger.Controls.Add(Me.cmdUgly) + Me.grpInteger.Controls.Add(Me.cmdPowerful) + Me.grpInteger.Controls.Add(Me.cmdFrugal) + Me.grpInteger.Controls.Add(Me.cmdPerfect) + Me.grpInteger.Controls.Add(Me.cmdAbundant) + Me.grpInteger.Controls.Add(Me.cmdFibonacci2) + Me.grpInteger.Controls.Add(Me.cmdPalindrome) + Me.grpInteger.Controls.Add(Me.cmdRoman) + Me.grpInteger.Controls.Add(Me.cmdHexmode) + Me.grpInteger.Controls.Add(Me.cmdOctmode) Me.grpInteger.Controls.Add(Me.cmdKTuple) Me.grpInteger.Controls.Add(Me.cmdTriplets) Me.grpInteger.Controls.Add(Me.cmdThird) @@ -983,8 +1018,8 @@ Partial Class ucrCalculator Me.grpInteger.Controls.Add(Me.cmdGeneratePrimes) Me.grpInteger.Controls.Add(Me.cmdNthPrime) Me.grpInteger.Controls.Add(Me.cmdIntegerRHelp) - Me.grpInteger.Controls.Add(Me.cmdAsHexmode) - Me.grpInteger.Controls.Add(Me.cmdAsOctmode) + Me.grpInteger.Controls.Add(Me.cmdHex) + Me.grpInteger.Controls.Add(Me.cmdOctal) Me.grpInteger.Controls.Add(Me.cmdBinary) Me.grpInteger.Controls.Add(Me.cmdBigQ) Me.grpInteger.Controls.Add(Me.cmdDigitSum) @@ -999,7 +1034,7 @@ Partial Class ucrCalculator Me.grpInteger.Controls.Add(Me.cmdBigZ) Me.grpInteger.Location = New System.Drawing.Point(434, 61) Me.grpInteger.Name = "grpInteger" - Me.grpInteger.Size = New System.Drawing.Size(237, 255) + Me.grpInteger.Size = New System.Drawing.Size(308, 317) Me.grpInteger.TabIndex = 183 Me.grpInteger.TabStop = False Me.grpInteger.Text = "Integer" @@ -1007,9 +1042,9 @@ Partial Class ucrCalculator 'cmdKTuple ' Me.cmdKTuple.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdKTuple.Location = New System.Drawing.Point(167, 191) + Me.cmdKTuple.Location = New System.Drawing.Point(149, 181) Me.cmdKTuple.Name = "cmdKTuple" - Me.cmdKTuple.Size = New System.Drawing.Size(57, 23) + Me.cmdKTuple.Size = New System.Drawing.Size(75, 23) Me.cmdKTuple.TabIndex = 28 Me.cmdKTuple.Text = "k-tuple" Me.cmdKTuple.UseVisualStyleBackColor = True @@ -1017,9 +1052,9 @@ Partial Class ucrCalculator 'cmdTriplets ' Me.cmdTriplets.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdTriplets.Location = New System.Drawing.Point(110, 191) + Me.cmdTriplets.Location = New System.Drawing.Point(75, 181) Me.cmdTriplets.Name = "cmdTriplets" - Me.cmdTriplets.Size = New System.Drawing.Size(58, 23) + Me.cmdTriplets.Size = New System.Drawing.Size(75, 23) Me.cmdTriplets.TabIndex = 27 Me.cmdTriplets.Text = "triplets" Me.cmdTriplets.UseVisualStyleBackColor = True @@ -1027,9 +1062,9 @@ Partial Class ucrCalculator 'cmdThird ' Me.cmdThird.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdThird.Location = New System.Drawing.Point(55, 191) + Me.cmdThird.Location = New System.Drawing.Point(1, 181) Me.cmdThird.Name = "cmdThird" - Me.cmdThird.Size = New System.Drawing.Size(56, 23) + Me.cmdThird.Size = New System.Drawing.Size(75, 23) Me.cmdThird.TabIndex = 26 Me.cmdThird.Text = "third" Me.cmdThird.UseVisualStyleBackColor = True @@ -1037,9 +1072,9 @@ Partial Class ucrCalculator 'cmdSexy ' Me.cmdSexy.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdSexy.Location = New System.Drawing.Point(2, 191) + Me.cmdSexy.Location = New System.Drawing.Point(223, 159) Me.cmdSexy.Name = "cmdSexy" - Me.cmdSexy.Size = New System.Drawing.Size(54, 23) + Me.cmdSexy.Size = New System.Drawing.Size(75, 23) Me.cmdSexy.TabIndex = 25 Me.cmdSexy.Text = "sexy" Me.cmdSexy.UseVisualStyleBackColor = True @@ -1047,9 +1082,9 @@ Partial Class ucrCalculator 'cmdCousin ' Me.cmdCousin.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdCousin.Location = New System.Drawing.Point(167, 169) + Me.cmdCousin.Location = New System.Drawing.Point(149, 159) Me.cmdCousin.Name = "cmdCousin" - Me.cmdCousin.Size = New System.Drawing.Size(58, 23) + Me.cmdCousin.Size = New System.Drawing.Size(75, 23) Me.cmdCousin.TabIndex = 24 Me.cmdCousin.Text = "cousin" Me.cmdCousin.UseVisualStyleBackColor = True @@ -1057,9 +1092,9 @@ Partial Class ucrCalculator 'cmdTwin ' Me.cmdTwin.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdTwin.Location = New System.Drawing.Point(110, 169) + Me.cmdTwin.Location = New System.Drawing.Point(75, 159) Me.cmdTwin.Name = "cmdTwin" - Me.cmdTwin.Size = New System.Drawing.Size(58, 23) + Me.cmdTwin.Size = New System.Drawing.Size(75, 23) Me.cmdTwin.TabIndex = 23 Me.cmdTwin.Text = "twin" Me.cmdTwin.UseVisualStyleBackColor = True @@ -1067,7 +1102,7 @@ Partial Class ucrCalculator 'cmdPhi ' Me.cmdPhi.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdPhi.Location = New System.Drawing.Point(149, 105) + Me.cmdPhi.Location = New System.Drawing.Point(75, 105) Me.cmdPhi.Name = "cmdPhi" Me.cmdPhi.Size = New System.Drawing.Size(75, 23) Me.cmdPhi.TabIndex = 22 @@ -1077,9 +1112,9 @@ Partial Class ucrCalculator 'cmdCoprime ' Me.cmdCoprime.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdCoprime.Location = New System.Drawing.Point(55, 169) + Me.cmdCoprime.Location = New System.Drawing.Point(1, 159) Me.cmdCoprime.Name = "cmdCoprime" - Me.cmdCoprime.Size = New System.Drawing.Size(56, 23) + Me.cmdCoprime.Size = New System.Drawing.Size(75, 23) Me.cmdCoprime.TabIndex = 21 Me.cmdCoprime.Text = "coprime" Me.cmdCoprime.UseVisualStyleBackColor = True @@ -1087,7 +1122,7 @@ Partial Class ucrCalculator 'cmdSCM ' Me.cmdSCM.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdSCM.Location = New System.Drawing.Point(75, 105) + Me.cmdSCM.Location = New System.Drawing.Point(1, 105) Me.cmdSCM.Name = "cmdSCM" Me.cmdSCM.Size = New System.Drawing.Size(75, 23) Me.cmdSCM.TabIndex = 20 @@ -1097,7 +1132,7 @@ Partial Class ucrCalculator 'cmdGCD ' Me.cmdGCD.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdGCD.Location = New System.Drawing.Point(1, 105) + Me.cmdGCD.Location = New System.Drawing.Point(223, 83) Me.cmdGCD.Name = "cmdGCD" Me.cmdGCD.Size = New System.Drawing.Size(75, 23) Me.cmdGCD.TabIndex = 19 @@ -1107,7 +1142,7 @@ Partial Class ucrCalculator 'cmdGeneratePrimes ' Me.cmdGeneratePrimes.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdGeneratePrimes.Location = New System.Drawing.Point(2, 147) + Me.cmdGeneratePrimes.Location = New System.Drawing.Point(1, 137) Me.cmdGeneratePrimes.Name = "cmdGeneratePrimes" Me.cmdGeneratePrimes.Size = New System.Drawing.Size(75, 23) Me.cmdGeneratePrimes.TabIndex = 18 @@ -1116,73 +1151,61 @@ Partial Class ucrCalculator ' 'cmdNthPrime ' - Me.cmdNthPrime.Location = New System.Drawing.Point(76, 147) + Me.cmdNthPrime.Location = New System.Drawing.Point(75, 137) Me.cmdNthPrime.Name = "cmdNthPrime" Me.cmdNthPrime.Size = New System.Drawing.Size(75, 23) Me.cmdNthPrime.TabIndex = 17 Me.cmdNthPrime.Text = "nth_prime" Me.cmdNthPrime.UseVisualStyleBackColor = True ' - 'cmdIntegerRHelp - ' - Me.cmdIntegerRHelp.AutoSize = True - Me.cmdIntegerRHelp.ContextMenuStrip = Me.ContextMenuStripInteger - Me.cmdIntegerRHelp.Location = New System.Drawing.Point(134, 222) - Me.cmdIntegerRHelp.Name = "cmdIntegerRHelp" - Me.cmdIntegerRHelp.Size = New System.Drawing.Size(91, 23) - Me.cmdIntegerRHelp.SplitMenuStrip = Me.ContextMenuStripInteger - Me.cmdIntegerRHelp.TabIndex = 16 - Me.cmdIntegerRHelp.Text = "R Help" - Me.cmdIntegerRHelp.UseVisualStyleBackColor = True - ' 'ContextMenuStripInteger ' - Me.ContextMenuStripInteger.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.DescToolsToolStripMenuItem, Me.RutilsToolStripMenuItem, Me.PrimesToolStripMenuItem}) + Me.ContextMenuStripInteger.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.GmpToolStripMenuItem, Me.DescToolsToolStripMenuItem, Me.RutilsToolStripMenuItem, Me.PrimesToolStripMenuItem, Me.ZseqToolStripMenuItem, Me.UtilsToolStripMenuItem}) Me.ContextMenuStripInteger.Name = "ContextMenuStripInteger" - Me.ContextMenuStripInteger.Size = New System.Drawing.Size(127, 70) + Me.ContextMenuStripInteger.Size = New System.Drawing.Size(181, 158) ' 'DescToolsToolStripMenuItem ' Me.DescToolsToolStripMenuItem.Name = "DescToolsToolStripMenuItem" - Me.DescToolsToolStripMenuItem.Size = New System.Drawing.Size(126, 22) + Me.DescToolsToolStripMenuItem.Size = New System.Drawing.Size(180, 22) Me.DescToolsToolStripMenuItem.Text = "DescTools" ' 'RutilsToolStripMenuItem ' Me.RutilsToolStripMenuItem.Name = "RutilsToolStripMenuItem" - Me.RutilsToolStripMenuItem.Size = New System.Drawing.Size(126, 22) + Me.RutilsToolStripMenuItem.Size = New System.Drawing.Size(180, 22) Me.RutilsToolStripMenuItem.Text = "R.utils" ' 'PrimesToolStripMenuItem ' Me.PrimesToolStripMenuItem.Name = "PrimesToolStripMenuItem" - Me.PrimesToolStripMenuItem.Size = New System.Drawing.Size(126, 22) + Me.PrimesToolStripMenuItem.Size = New System.Drawing.Size(180, 22) Me.PrimesToolStripMenuItem.Text = "Primes" ' - 'cmdAsHexmode + 'cmdHex ' - Me.cmdAsHexmode.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdAsHexmode.Location = New System.Drawing.Point(149, 83) - Me.cmdAsHexmode.Name = "cmdAsHexmode" - Me.cmdAsHexmode.Size = New System.Drawing.Size(75, 23) - Me.cmdAsHexmode.TabIndex = 15 - Me.cmdAsHexmode.Text = "hex" - Me.cmdAsHexmode.UseVisualStyleBackColor = True + Me.cmdHex.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdHex.Location = New System.Drawing.Point(1, 83) + Me.cmdHex.Name = "cmdHex" + Me.cmdHex.Size = New System.Drawing.Size(75, 23) + Me.cmdHex.TabIndex = 15 + Me.cmdHex.Text = "hex" + Me.cmdHex.UseVisualStyleBackColor = True ' - 'cmdAsOctmode + 'cmdOctal ' - Me.cmdAsOctmode.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdAsOctmode.Location = New System.Drawing.Point(75, 83) - Me.cmdAsOctmode.Name = "cmdAsOctmode" - Me.cmdAsOctmode.Size = New System.Drawing.Size(75, 23) - Me.cmdAsOctmode.TabIndex = 14 - Me.cmdAsOctmode.Text = "octal" - Me.cmdAsOctmode.UseVisualStyleBackColor = True + Me.cmdOctal.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdOctal.Location = New System.Drawing.Point(223, 61) + Me.cmdOctal.Name = "cmdOctal" + Me.cmdOctal.Size = New System.Drawing.Size(75, 23) + Me.cmdOctal.TabIndex = 14 + Me.cmdOctal.Text = "octal" + Me.cmdOctal.UseVisualStyleBackColor = True ' 'cmdBinary ' Me.cmdBinary.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdBinary.Location = New System.Drawing.Point(1, 83) + Me.cmdBinary.Location = New System.Drawing.Point(149, 61) Me.cmdBinary.Name = "cmdBinary" Me.cmdBinary.Size = New System.Drawing.Size(75, 23) Me.cmdBinary.TabIndex = 13 @@ -1201,7 +1224,7 @@ Partial Class ucrCalculator ' 'cmdDigitSum ' - Me.cmdDigitSum.Location = New System.Drawing.Point(149, 61) + Me.cmdDigitSum.Location = New System.Drawing.Point(75, 61) Me.cmdDigitSum.Name = "cmdDigitSum" Me.cmdDigitSum.Size = New System.Drawing.Size(75, 23) Me.cmdDigitSum.TabIndex = 10 @@ -1211,7 +1234,7 @@ Partial Class ucrCalculator 'cmdRankPercent ' Me.cmdRankPercent.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdRankPercent.Location = New System.Drawing.Point(75, 61) + Me.cmdRankPercent.Location = New System.Drawing.Point(1, 61) Me.cmdRankPercent.Name = "cmdRankPercent" Me.cmdRankPercent.Size = New System.Drawing.Size(75, 23) Me.cmdRankPercent.TabIndex = 9 @@ -1220,7 +1243,7 @@ Partial Class ucrCalculator ' 'cmdDivisors ' - Me.cmdDivisors.Location = New System.Drawing.Point(75, 39) + Me.cmdDivisors.Location = New System.Drawing.Point(1, 39) Me.cmdDivisors.Name = "cmdDivisors" Me.cmdDivisors.Size = New System.Drawing.Size(75, 23) Me.cmdDivisors.TabIndex = 8 @@ -1229,7 +1252,7 @@ Partial Class ucrCalculator ' 'cmdFibonacci ' - Me.cmdFibonacci.Location = New System.Drawing.Point(1, 61) + Me.cmdFibonacci.Location = New System.Drawing.Point(223, 39) Me.cmdFibonacci.Name = "cmdFibonacci" Me.cmdFibonacci.Size = New System.Drawing.Size(75, 23) Me.cmdFibonacci.TabIndex = 7 @@ -1238,7 +1261,7 @@ Partial Class ucrCalculator ' 'cmdFactorize ' - Me.cmdFactorize.Location = New System.Drawing.Point(149, 39) + Me.cmdFactorize.Location = New System.Drawing.Point(75, 39) Me.cmdFactorize.Name = "cmdFactorize" Me.cmdFactorize.Size = New System.Drawing.Size(75, 23) Me.cmdFactorize.TabIndex = 6 @@ -1247,7 +1270,7 @@ Partial Class ucrCalculator ' 'cmdNextPrime ' - Me.cmdNextPrime.Location = New System.Drawing.Point(150, 147) + Me.cmdNextPrime.Location = New System.Drawing.Point(149, 137) Me.cmdNextPrime.Name = "cmdNextPrime" Me.cmdNextPrime.Size = New System.Drawing.Size(75, 23) Me.cmdNextPrime.TabIndex = 5 @@ -1256,7 +1279,7 @@ Partial Class ucrCalculator ' 'cmdChoosez ' - Me.cmdChoosez.Location = New System.Drawing.Point(1, 39) + Me.cmdChoosez.Location = New System.Drawing.Point(223, 17) Me.cmdChoosez.Name = "cmdChoosez" Me.cmdChoosez.Size = New System.Drawing.Size(75, 23) Me.cmdChoosez.TabIndex = 4 @@ -1275,9 +1298,9 @@ Partial Class ucrCalculator 'cmdIsPrime ' Me.cmdIsPrime.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdIsPrime.Location = New System.Drawing.Point(2, 169) + Me.cmdIsPrime.Location = New System.Drawing.Point(223, 137) Me.cmdIsPrime.Name = "cmdIsPrime" - Me.cmdIsPrime.Size = New System.Drawing.Size(54, 23) + Me.cmdIsPrime.Size = New System.Drawing.Size(75, 23) Me.cmdIsPrime.TabIndex = 1 Me.cmdIsPrime.Text = "is_prime" Me.cmdIsPrime.UseVisualStyleBackColor = True @@ -5124,6 +5147,195 @@ Partial Class ucrCalculator Me.cmdStringRHelp.Text = "R Help" Me.cmdStringRHelp.UseVisualStyleBackColor = True ' + 'cmdOctmode + ' + Me.cmdOctmode.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdOctmode.Location = New System.Drawing.Point(75, 83) + Me.cmdOctmode.Name = "cmdOctmode" + Me.cmdOctmode.Size = New System.Drawing.Size(75, 23) + Me.cmdOctmode.TabIndex = 29 + Me.cmdOctmode.Text = "octmode" + Me.cmdOctmode.UseVisualStyleBackColor = True + ' + 'cmdHexmode + ' + Me.cmdHexmode.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdHexmode.Location = New System.Drawing.Point(149, 83) + Me.cmdHexmode.Name = "cmdHexmode" + Me.cmdHexmode.Size = New System.Drawing.Size(75, 23) + Me.cmdHexmode.TabIndex = 30 + Me.cmdHexmode.Text = "hexmode" + Me.cmdHexmode.UseVisualStyleBackColor = True + ' + 'cmdRoman + ' + Me.cmdRoman.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdRoman.Location = New System.Drawing.Point(149, 105) + Me.cmdRoman.Name = "cmdRoman" + Me.cmdRoman.Size = New System.Drawing.Size(75, 23) + Me.cmdRoman.TabIndex = 31 + Me.cmdRoman.Text = "roman" + Me.cmdRoman.UseVisualStyleBackColor = True + ' + 'cmdPalindrome + ' + Me.cmdPalindrome.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdPalindrome.Location = New System.Drawing.Point(1, 213) + Me.cmdPalindrome.Name = "cmdPalindrome" + Me.cmdPalindrome.Size = New System.Drawing.Size(75, 23) + Me.cmdPalindrome.TabIndex = 32 + Me.cmdPalindrome.Text = "palindrome" + Me.cmdPalindrome.UseVisualStyleBackColor = True + ' + 'cmdFibonacci2 + ' + Me.cmdFibonacci2.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFibonacci2.Location = New System.Drawing.Point(75, 213) + Me.cmdFibonacci2.Name = "cmdFibonacci2" + Me.cmdFibonacci2.Size = New System.Drawing.Size(75, 23) + Me.cmdFibonacci2.TabIndex = 33 + Me.cmdFibonacci2.Text = "fibonacci2" + Me.cmdFibonacci2.UseVisualStyleBackColor = True + ' + 'cmdAbundant + ' + Me.cmdAbundant.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdAbundant.Location = New System.Drawing.Point(149, 213) + Me.cmdAbundant.Name = "cmdAbundant" + Me.cmdAbundant.Size = New System.Drawing.Size(75, 23) + Me.cmdAbundant.TabIndex = 34 + Me.cmdAbundant.Text = "abundant" + Me.cmdAbundant.UseVisualStyleBackColor = True + ' + 'cmdPerfect + ' + Me.cmdPerfect.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdPerfect.Location = New System.Drawing.Point(223, 213) + Me.cmdPerfect.Name = "cmdPerfect" + Me.cmdPerfect.Size = New System.Drawing.Size(75, 23) + Me.cmdPerfect.TabIndex = 35 + Me.cmdPerfect.Text = "perfect" + Me.cmdPerfect.UseVisualStyleBackColor = True + ' + 'cmdFrugal + ' + Me.cmdFrugal.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFrugal.Location = New System.Drawing.Point(1, 235) + Me.cmdFrugal.Name = "cmdFrugal" + Me.cmdFrugal.Size = New System.Drawing.Size(75, 23) + Me.cmdFrugal.TabIndex = 36 + Me.cmdFrugal.Text = "frugal" + Me.cmdFrugal.UseVisualStyleBackColor = True + ' + 'cmdPowerful + ' + Me.cmdPowerful.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdPowerful.Location = New System.Drawing.Point(75, 235) + Me.cmdPowerful.Name = "cmdPowerful" + Me.cmdPowerful.Size = New System.Drawing.Size(75, 23) + Me.cmdPowerful.TabIndex = 37 + Me.cmdPowerful.Text = "powerful" + Me.cmdPowerful.UseVisualStyleBackColor = True + ' + 'cmdUgly + ' + Me.cmdUgly.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdUgly.Location = New System.Drawing.Point(149, 235) + Me.cmdUgly.Name = "cmdUgly" + Me.cmdUgly.Size = New System.Drawing.Size(75, 23) + Me.cmdUgly.TabIndex = 38 + Me.cmdUgly.Text = "ugly" + Me.cmdUgly.UseVisualStyleBackColor = True + ' + 'cmdHappy + ' + Me.cmdHappy.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdHappy.Location = New System.Drawing.Point(223, 235) + Me.cmdHappy.Name = "cmdHappy" + Me.cmdHappy.Size = New System.Drawing.Size(75, 23) + Me.cmdHappy.TabIndex = 39 + Me.cmdHappy.Text = "happy" + Me.cmdHappy.UseVisualStyleBackColor = True + ' + 'cmdAchilles + ' + Me.cmdAchilles.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdAchilles.Location = New System.Drawing.Point(1, 257) + Me.cmdAchilles.Name = "cmdAchilles" + Me.cmdAchilles.Size = New System.Drawing.Size(75, 23) + Me.cmdAchilles.TabIndex = 40 + Me.cmdAchilles.Text = "achilles" + Me.cmdAchilles.UseVisualStyleBackColor = True + ' + 'cmdPadovan + ' + Me.cmdPadovan.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdPadovan.Location = New System.Drawing.Point(75, 257) + Me.cmdPadovan.Name = "cmdPadovan" + Me.cmdPadovan.Size = New System.Drawing.Size(75, 23) + Me.cmdPadovan.TabIndex = 41 + Me.cmdPadovan.Text = "padovan" + Me.cmdPadovan.UseVisualStyleBackColor = True + ' + 'cmdTriangle + ' + Me.cmdTriangle.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdTriangle.Location = New System.Drawing.Point(149, 257) + Me.cmdTriangle.Name = "cmdTriangle" + Me.cmdTriangle.Size = New System.Drawing.Size(75, 23) + Me.cmdTriangle.TabIndex = 42 + Me.cmdTriangle.Text = "triangle" + Me.cmdTriangle.UseVisualStyleBackColor = True + ' + 'cmdSquare + ' + Me.cmdSquare.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdSquare.Location = New System.Drawing.Point(223, 257) + Me.cmdSquare.Name = "cmdSquare" + Me.cmdSquare.Size = New System.Drawing.Size(75, 23) + Me.cmdSquare.TabIndex = 43 + Me.cmdSquare.Text = "square" + Me.cmdSquare.UseVisualStyleBackColor = True + ' + 'cmdFactorize2 + ' + Me.cmdFactorize2.Location = New System.Drawing.Point(149, 39) + Me.cmdFactorize2.Name = "cmdFactorize2" + Me.cmdFactorize2.Size = New System.Drawing.Size(75, 23) + Me.cmdFactorize2.TabIndex = 44 + Me.cmdFactorize2.Text = "factorize2" + Me.cmdFactorize2.UseVisualStyleBackColor = True + ' + 'ZseqToolStripMenuItem + ' + Me.ZseqToolStripMenuItem.Name = "ZseqToolStripMenuItem" + Me.ZseqToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.ZseqToolStripMenuItem.Text = "Zseq" + ' + 'GmpToolStripMenuItem + ' + Me.GmpToolStripMenuItem.Name = "GmpToolStripMenuItem" + Me.GmpToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.GmpToolStripMenuItem.Text = "Gmp" + ' + 'UtilsToolStripMenuItem + ' + Me.UtilsToolStripMenuItem.Name = "UtilsToolStripMenuItem" + Me.UtilsToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.UtilsToolStripMenuItem.Text = "R Utils" + ' + 'cmdIntegerRHelp + ' + Me.cmdIntegerRHelp.AutoSize = True + Me.cmdIntegerRHelp.ContextMenuStrip = Me.ContextMenuStripInteger + Me.cmdIntegerRHelp.Location = New System.Drawing.Point(210, 289) + Me.cmdIntegerRHelp.Name = "cmdIntegerRHelp" + Me.cmdIntegerRHelp.Size = New System.Drawing.Size(91, 23) + Me.cmdIntegerRHelp.SplitMenuStrip = Me.ContextMenuStripInteger + Me.cmdIntegerRHelp.TabIndex = 16 + Me.cmdIntegerRHelp.Text = "R Help" + Me.cmdIntegerRHelp.UseVisualStyleBackColor = True + ' 'ucrSaveResultInto ' Me.ucrSaveResultInto.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink @@ -5613,8 +5825,8 @@ Partial Class ucrCalculator Friend WithEvents cmdRankPercent As Button Friend WithEvents cmdDivisors As Button Friend WithEvents cmdBigQ As Button - Friend WithEvents cmdAsHexmode As Button - Friend WithEvents cmdAsOctmode As Button + Friend WithEvents cmdHex As Button + Friend WithEvents cmdOctal As Button Friend WithEvents cmdBinary As Button Friend WithEvents cmdIntegerRHelp As ucrSplitButton Friend WithEvents ContextMenuStripInteger As ContextMenuStrip @@ -5634,4 +5846,23 @@ Partial Class ucrCalculator Friend WithEvents cmdCoprime As Button Friend WithEvents cmdSCM As Button Friend WithEvents cmdGCD As Button + Friend WithEvents cmdRoman As Button + Friend WithEvents cmdHexmode As Button + Friend WithEvents cmdOctmode As Button + Friend WithEvents cmdSquare As Button + Friend WithEvents cmdTriangle As Button + Friend WithEvents cmdPadovan As Button + Friend WithEvents cmdAchilles As Button + Friend WithEvents cmdHappy As Button + Friend WithEvents cmdUgly As Button + Friend WithEvents cmdPowerful As Button + Friend WithEvents cmdFrugal As Button + Friend WithEvents cmdPerfect As Button + Friend WithEvents cmdAbundant As Button + Friend WithEvents cmdFibonacci2 As Button + Friend WithEvents cmdPalindrome As Button + Friend WithEvents cmdFactorize2 As Button + Friend WithEvents GmpToolStripMenuItem As ToolStripMenuItem + Friend WithEvents ZseqToolStripMenuItem As ToolStripMenuItem + Friend WithEvents UtilsToolStripMenuItem As ToolStripMenuItem End Class diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index a3c4e0255fe..56122b51591 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -217,15 +217,18 @@ Public Class ucrCalculator ttCalculator.SetToolTip(cmdFactorial, "factorial n!, as big integer. For example, factorialZ(6)= 720") ttCalculator.SetToolTip(cmdChoosez, "computes binomial coefficient choose(n,k) as a big integer. For example, chooseZ(20,2)=190") ttCalculator.SetToolTip(cmdNextPrime, "gives the next prime number. For example, nextprime(14)= 17") - ttCalculator.SetToolTip(cmdFactorize, "computes the prime factorizations. For example, prime_factors(20)= (2,5,2,1), Factorize(8)= 2:3 for (2,2,2)") + ttCalculator.SetToolTip(cmdFactorize, "computes the prime factorizations. For example, prime_factors(20)= (2,5,2,1)") + ttCalculator.SetToolTip(cmdFactorize2, "Compute the prime factorization(s) of integer(s) n. For example, Factorize(21)=c(3, 7, 1, 1)") ttCalculator.SetToolTip(cmdIsPrime, "checks if the number is prime and returns 0 or 2, 0= False, 2= True. For example, is.prime(10) returns 0") ttCalculator.SetToolTip(cmdFibonacci, "generates Fibonacci numbers. For example, Fibonacci(8)=21") ttCalculator.SetToolTip(cmdDivisors, "returns the divisors of x. For example, Divisors(21)= c(1,3,7)") ttCalculator.SetToolTip(cmdRankPercent, "returns the percentile that the number correspods to. For example, PercentRank(c(1,2,5,11,15)) = 0.2,0.4,0.6,0.8,1.0") ttCalculator.SetToolTip(cmdDigitSum, "calculates digit sum of x. For example, DigitSum(12344)= 14") - ttCalculator.SetToolTip(cmdBinary, "converts an integer into a binary number. For example, as.integer(intToBin(c(2,5,7,8)))= 10,101,111,1000") - ttCalculator.SetToolTip(cmdAsOctmode, "converts an integer into a octal number. For example, as.octmode(intToOct(c(2,5,12,17)))= 02,05,14,21") - ttCalculator.SetToolTip(cmdAsHexmode, "converts an integer into a hexadecimal number. For example, as.hexmode(intToHex(c(2,7,10,15)))= 2,7,a,f") + ttCalculator.SetToolTip(cmdBinary, "converts an integer into a binary number. For example,intToBin(c(2,5,7,8))= 10,101,111,1000") + ttCalculator.SetToolTip(cmdOctal, "converts an integer into octal number. For example, intToOct(c(2,5,12,17))= 02,05,14,21") + ttCalculator.SetToolTip(cmdHex, "converts an integer into hexadecimal number. For example, intToHex(c(2,7,10,15)))= 2,7,a,f") + ttCalculator.SetToolTip(cmdOctmode, "converts an integer into a octal number. For example, as.octmode(intToOct(c(2,5,12,17)))= 02,05,14,21") + ttCalculator.SetToolTip(cmdHexmode, "converts an integer into a hexadecimal number. For example, as.hexmode(intToHex(c(2,7,10,15)))= 2,7,a,f") ttCalculator.SetToolTip(cmdNthPrime, "gives the n-th prime. For example nth_prime(1000)= 7919") ttCalculator.SetToolTip(cmdGeneratePrimes, "generates the first n prime numbers equal to the number of rows in the data") ttCalculator.SetToolTip(cmdGCD, "Greatest common divisor, for example gcd(18,42) = 6") @@ -238,6 +241,19 @@ Public Class ucrCalculator ttCalculator.SetToolTip(cmdThird, "Third cousin primes, for example third(0,100) gives (89,97)") ttCalculator.SetToolTip(cmdTriplets, "Sexy prime triplets, for example triplets(0,100) gives (47, 53, 59)") ttCalculator.SetToolTip(cmdKTuple, "k_tuple general formula for all these keys. For example k_tuple(0, 10, c(0,2)) gives twin primes") + ttCalculator.SetToolTip(cmdRoman, "converts a small(upto 3899) positive integer to Roman numbers. For example as.roman(14)=XIV") + ttCalculator.SetToolTip(cmdPalindrome, "Generate palindromes to the length of the dataframe. For example the 100th palindromic number is 909") + ttCalculator.SetToolTip(cmdFibonacci2, "Generates fibonacci numbers to the length of the data frame. For example the 10th fibonacci number is just 34, but the 50th is much larger, 7778742049") + ttCalculator.SetToolTip(cmdAbundant, "When divisors sum to more than the number. So 12 is less than 1+2+3+4+6 = 16. Opposite is Deficient") + ttCalculator.SetToolTip(cmdPerfect, "Divisors add to the number. So 6 = 1+2+3. Only 51 perfect numbers are currently known.") + ttCalculator.SetToolTip(cmdFrugal, "125 is frugal because 125 = 5(cubed) and 5 and 3 are fewer digits (2) than 125 (3).") + ttCalculator.SetToolTip(cmdPowerful, "36 = 2(squared)*3(squared) is powerful because for each divisor, here 2 and 3, its square is also a divisor.") + ttCalculator.SetToolTip(cmdUgly, "Also called Regular or Hamming or 5-smooth numbers. Numbers for which the factors are only 2, or 3 or 5.") + ttCalculator.SetToolTip(cmdHappy, "13 is happy because 1(squared) + 3(squared) = 10, then 1(squared)+ 0(squared) = 1.") + ttCalculator.SetToolTip(cmdAchilles, "Powerful numbers that are not perfect squares. 72 is the smallest Achilles number.") + ttCalculator.SetToolTip(cmdPadovan, "Sum of last but 1 and last but 2 values. So from ...7, 9, 12, next is 7+9 = 16.") + ttCalculator.SetToolTip(cmdTriangle, " Number of objects in a triangle, so 0, 1, 3, 6, 10...") + ttCalculator.SetToolTip(cmdSquare, "Squares of each integer, so 1, 4, 9, 16.") End Sub @@ -589,7 +605,7 @@ Public Class ucrCalculator grpSymbols.Visible = False grpHydroGOF.Visible = False grpInteger.Visible = True - Me.Size = New Size(iBasicWidth * 1.38, iBaseHeight) + Me.Size = New Size(iBasicWidth * 1.5, iBaseHeight) Case "Basic" grpSummary.Visible = False grpMaths.Visible = False @@ -3054,19 +3070,19 @@ Public Class ucrCalculator End If End Sub - Private Sub cmdAsOctmode_Click(sender As Object, e As EventArgs) Handles cmdAsOctmode.Click + Private Sub cmdAsOctmode_Click(sender As Object, e As EventArgs) Handles cmdOctal.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("as.octmode(R.utils::intToOct(x = ))", 2) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("R.utils::intToOct(x = )", 1) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("as.octmode(R.utils::intToOct())", 2) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("R.utils::intToOct()", 1) End If End Sub - Private Sub cmdAsHexmode_Click(sender As Object, e As EventArgs) Handles cmdAsHexmode.Click + Private Sub cmdAsHexmode_Click(sender As Object, e As EventArgs) Handles cmdHex.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("as.hexmode(R.utils::intToHex(x = ))", 2) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("R.utils::intToHex(x = )", 1) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("as.hexmode(R.utils::intToHex())", 2) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("R.utils::intToHex()", 1) End If End Sub @@ -3164,7 +3180,7 @@ Public Class ucrCalculator End If End Sub - Private Sub CalculatorFunctions(strRCommand As String) + Private Sub PrimeFunctions(strRCommand As String) Dim clsPrimesFunction As New RFunction clsPrimesFunction.SetPackageName("primes") @@ -3184,23 +3200,23 @@ Public Class ucrCalculator Private Sub cmdTwin_Click(sender As Object, e As EventArgs) Handles cmdTwin.Click - CalculatorFunctions("twin_primes") + PrimeFunctions("twin_primes") End Sub Private Sub cmdCousin_Click(sender As Object, e As EventArgs) Handles cmdCousin.Click - CalculatorFunctions("cousin_primes") + PrimeFunctions("cousin_primes") End Sub Private Sub cmdSexy_Click(sender As Object, e As EventArgs) Handles cmdSexy.Click - CalculatorFunctions("sexy_primes") + PrimeFunctions("sexy_primes") End Sub Private Sub cmdThird_Click(sender As Object, e As EventArgs) Handles cmdThird.Click - CalculatorFunctions("third_cousin_primes") + PrimeFunctions("third_cousin_primes") End Sub Private Sub cmdTriplets_Click(sender As Object, e As EventArgs) Handles cmdTriplets.Click - CalculatorFunctions("sexy_prime_triplets") + PrimeFunctions("sexy_prime_triplets") End Sub Private Sub cmdKTuple_Click(sender As Object, e As EventArgs) Handles cmdKTuple.Click @@ -3226,4 +3242,148 @@ Public Class ucrCalculator ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsRepFunction.ToScript, 0) End Sub + + Private Sub cmdRoman_Click(sender As Object, e As EventArgs) Handles cmdRoman.Click + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("utils::as.roman(x= )", 1) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("utils::as.roman()", 1) + End If + End Sub + + Private Sub ZseqFunctions(strRCommand As String) + Dim clsZseqFunction As New RFunction + + clsDataFunction.SetRCommand("nrow") + clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem) + + clsZseqFunction.SetPackageName("Zseq") + clsZseqFunction.SetRCommand(strRCommand) + clsZseqFunction.AddParameter("n", clsRFunctionParameter:=clsDataFunction, iPosition:=0) + clsZseqFunction.AddParameter("gmp", "FALSE", iPosition:=1) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsZseqFunction.ToScript, 0) + End Sub + Private Sub cmdPalindrome_Click(sender As Object, e As EventArgs) Handles cmdPalindrome.Click + ZseqFunctions("Palindromic") + End Sub + + Private Sub cmdFibonnaci_Click(sender As Object, e As EventArgs) Handles cmdFibonacci2.Click + ZseqFunctions("Fibonacci") + End Sub + + Private Sub cmdAbundant_Click(sender As Object, e As EventArgs) Handles cmdAbundant.Click + ZseqFunctions("Abundant") + End Sub + + Private Sub cmdFrugal_Click(sender As Object, e As EventArgs) Handles cmdFrugal.Click + ZseqFunctions("Frugal") + End Sub + + Private Sub cmdPowerful_Click(sender As Object, e As EventArgs) Handles cmdPowerful.Click + ZseqFunctions("Powerful") + End Sub + + Private Sub cmdHappy_Click(sender As Object, e As EventArgs) Handles cmdHappy.Click + ZseqFunctions("Happy") + End Sub + + Private Sub cmdAchilles_Click(sender As Object, e As EventArgs) Handles cmdAchilles.Click + ZseqFunctions("Achilles") + End Sub + + Private Sub cmdPadovan_Click(sender As Object, e As EventArgs) Handles cmdPadovan.Click + ZseqFunctions("Padovan") + End Sub + + Private Sub cmdTriangle_Click(sender As Object, e As EventArgs) Handles cmdTriangle.Click + ZseqFunctions("Triangular") + End Sub + + Private Sub cmdSquare_Click(sender As Object, e As EventArgs) Handles cmdSquare.Click + ZseqFunctions("Square") + End Sub + + Private Sub cmdPerfect_Click(sender As Object, e As EventArgs) Handles cmdPerfect.Click + Dim clsPerfectFunction As New RFunction + + clsPerfectFunction.SetPackageName("Zseq") + clsPerfectFunction.SetRCommand("Perfect") + clsPerfectFunction.AddParameter("n", "10", iPosition:=0) + + clsDataFunction.SetRCommand("nrow") + clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem) + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsPerfectFunction, iPosition:=0) + clsRepFunction.AddParameter("length", clsRFunctionParameter:=clsDataFunction, iPosition:=1) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsRepFunction.ToScript, 0) + End Sub + + Private Sub cmdUgly_Click(sender As Object, e As EventArgs) Handles cmdUgly.Click + Dim clsUglyFunction As New RFunction + + clsUglyFunction.SetPackageName("Zseq") + clsUglyFunction.SetRCommand("Regular") + clsUglyFunction.AddParameter("n", "100", iPosition:=0) + + clsDataFunction.SetRCommand("nrow") + clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem) + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsUglyFunction, iPosition:=0) + clsRepFunction.AddParameter("length", clsRFunctionParameter:=clsDataFunction, iPosition:=1) + clsRepFunction.AddParameter("gmp", "FALSE", iPosition:=2) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsRepFunction.ToScript, 0) + End Sub + + Private Sub cmdOctmode_Click(sender As Object, e As EventArgs) Handles cmdOctmode.Click + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("as.octmode(x= )", 1) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("as.octmode()", 1) + End If + End Sub + + Private Sub cmdHexmode_Click(sender As Object, e As EventArgs) Handles cmdHexmode.Click + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("as.hexmode(x= )", 1) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("as.hexmode()", 1) + End If + End Sub + + Private Sub cmdFactorize2_Click(sender As Object, e As EventArgs) Handles cmdFactorize2.Click + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("DescTools::Factorize(n= )", 1) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("DescTools::Factorize()", 1) + End If + End Sub + + Private Sub GmpToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles GmpToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Integer" Then + strPackageName = "gmp" + End If + OpenHelpPage() + End Sub + + Private Sub ZseqToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ZseqToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Integer" Then + strPackageName = "Zseq" + End If + OpenHelpPage() + End Sub + + Private Sub UtilsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles UtilsToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Integer" Then + strPackageName = "utils" + End If + OpenHelpPage() + End Sub End Class From e887b946fe48cdde999104d3ff9af6202d3784b2 Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Tue, 11 Oct 2022 13:09:16 +0300 Subject: [PATCH 044/122] changes made --- instat/dlgHideDataframes.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 9ece424a99b..07986f25ae1 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -52,8 +52,8 @@ Public Class dlgHideDataframes ucrReceiverMultipleUnhide.SetParameter(New RParameter("data_names", 0)) ucrReceiverMultipleUnhide.SetParameterIsString() ucrReceiverMultipleUnhide.Selector = ucrSelectorForDataFrames - ucrReceiverMultipleUnhide.strSelectorHeading = "Data Frames" - ucrReceiverMultipleUnhide.SetItemType("dataframe") + ' ucrReceiverMultipleUnhide.strSelectorHeading = "Data Frames" + 'ucrReceiverMultipleUnhide.SetItemType("dataframe") ucrPnlHideUnhide.AddRadioButton(rdoHideDataFrame) ucrPnlHideUnhide.AddRadioButton(rdoUnhideDataFrame) From 9925e6fe3209f641b8947f2a88f14aa994ea5fe0 Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Tue, 11 Oct 2022 13:54:33 +0300 Subject: [PATCH 045/122] code changes --- instat/dlgHideDataframes.vb | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 07986f25ae1..63f94c3ac64 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -52,8 +52,6 @@ Public Class dlgHideDataframes ucrReceiverMultipleUnhide.SetParameter(New RParameter("data_names", 0)) ucrReceiverMultipleUnhide.SetParameterIsString() ucrReceiverMultipleUnhide.Selector = ucrSelectorForDataFrames - ' ucrReceiverMultipleUnhide.strSelectorHeading = "Data Frames" - 'ucrReceiverMultipleUnhide.SetItemType("dataframe") ucrPnlHideUnhide.AddRadioButton(rdoHideDataFrame) ucrPnlHideUnhide.AddRadioButton(rdoUnhideDataFrame) @@ -146,19 +144,20 @@ Public Class dlgHideDataframes End If End Sub - Private Sub ucrReceiverMultiple_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultiple.ControlContentsChanged, ucrReceiverMultipleUnhide.ControlContentsChanged + Private Sub ucrReceiverMultiple_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultiple.ControlContentsChanged TestOKEnabled() End Sub - Private Sub ucrPnlHideUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlHideUnhide.ControlValueChanged, ucrReceiverMultipleUnhide.ControlValueChanged + Private Sub ucrPnlHideUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlHideUnhide.ControlValueChanged If rdoHideDataFrame.Checked Then ucrBase.clsRsyntax.SetBaseRFunction(clsHideDataFramesFunction) clsDummyFunction.AddParameter("checked", "rdoHide", iPosition:=0) ucrReceiverMultiple.SetMeAsReceiver() Else - clsDataUnhideOperator.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) ucrBase.clsRsyntax.SetBaseRFunction(clsMappingFunction) clsDummyFunction.AddParameter("checked", "rdoUnhide", iPosition:=0) + SetHiddenColumns() + ucrReceiverMultipleUnhide.SetMeAsReceiver() End If TestOKEnabled() End Sub @@ -167,4 +166,10 @@ Public Class dlgHideDataframes SetHiddenColumns() TestOKEnabled() End Sub + + Private Sub ucrReceiverMultipleUnhide_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverMultipleUnhide.ControlValueChanged + SetHiddenColumns() + TestOKEnabled() + clsDataUnhideOperator.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) + End Sub End Class \ No newline at end of file From b230a84a688e2a26d0623322073bb28cbd8ac8da Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Fri, 14 Oct 2022 10:34:48 +0300 Subject: [PATCH 046/122] Minor changes --- instat/ucrCalculator.vb | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index 56122b51591..4004e86840e 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -29,6 +29,7 @@ Public Class ucrCalculator Private strPackageName As String Private clsDataFunction As New RFunction Private clsRepFunction As New RFunction + Private clsZseqFunction As New RFunction Public Sub New() @@ -3252,7 +3253,6 @@ Public Class ucrCalculator End Sub Private Sub ZseqFunctions(strRCommand As String) - Dim clsZseqFunction As New RFunction clsDataFunction.SetRCommand("nrow") clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem) @@ -3269,7 +3269,16 @@ Public Class ucrCalculator End Sub Private Sub cmdFibonnaci_Click(sender As Object, e As EventArgs) Handles cmdFibonacci2.Click - ZseqFunctions("Fibonacci") + Dim clsFibonacciFunction As New RFunction + + clsDataFunction.SetRCommand("nrow") + clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem) + + clsFibonacciFunction.SetPackageName("Zseq") + clsFibonacciFunction.SetRCommand("Fibonacci") + clsFibonacciFunction.AddParameter("n", clsRFunctionParameter:=clsDataFunction, iPosition:=0) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFibonacciFunction.ToScript, 0) End Sub Private Sub cmdAbundant_Click(sender As Object, e As EventArgs) Handles cmdAbundant.Click @@ -3293,7 +3302,16 @@ Public Class ucrCalculator End Sub Private Sub cmdPadovan_Click(sender As Object, e As EventArgs) Handles cmdPadovan.Click - ZseqFunctions("Padovan") + Dim clsPadovanFunction As New RFunction + + clsDataFunction.SetRCommand("nrow") + clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem) + + clsPadovanFunction.SetPackageName("Zseq") + clsPadovanFunction.SetRCommand("Padovan") + clsPadovanFunction.AddParameter("n", clsRFunctionParameter:=clsDataFunction, iPosition:=0) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsPadovanFunction.ToScript, 0) End Sub Private Sub cmdTriangle_Click(sender As Object, e As EventArgs) Handles cmdTriangle.Click @@ -3334,7 +3352,6 @@ Public Class ucrCalculator clsRepFunction.SetRCommand("rep") clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsUglyFunction, iPosition:=0) clsRepFunction.AddParameter("length", clsRFunctionParameter:=clsDataFunction, iPosition:=1) - clsRepFunction.AddParameter("gmp", "FALSE", iPosition:=2) ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsRepFunction.ToScript, 0) End Sub From 81e703d5feeb125bbe6392cc33870d1058ae73a1 Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Fri, 14 Oct 2022 10:42:25 +0300 Subject: [PATCH 047/122] Improving the priors --- instat/dlgExtremes.vb | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index c18ec2c7e4d..035f737d3d4 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -29,6 +29,7 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction Private bReset As Boolean = True Private bResettingDialogue As Boolean = False Private bResetSubDialogue As Boolean = False + Private strFirstParam As String = "0.1,10,0.1" Private Sub dlgExtremes_Load(sender As Object, e As EventArgs) Handles MyBase.Load If bFirstLoad Then InitialiseDialog() @@ -111,7 +112,7 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction bResetSubDialogue = True clsConcatenateFunction.SetRCommand("c") - clsConcatenateFunction.AddParameter("first", "0.1,10,0.1", iPosition:=0, bIncludeArgumentName:=False) + clsConcatenateFunction.AddParameter("first", strFirstParam, iPosition:=0, bIncludeArgumentName:=False) clsLocationScaleResetOperator.SetOperation("") clsLocationScaleResetOperator.bBrackets = False @@ -261,14 +262,14 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction Private Sub control_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputExtremes.ControlValueChanged, ucrReceiverVariable.ControlValueChanged, ucrChkExplanatoryModelForLocationParameter.ControlValueChanged, ucrInputThresholdforLocation.ControlValueChanged ParameterControl() - If clsFevdFunction.ContainsParameter("method") Then - If ucrChkExplanatoryModelForLocationParameter.Checked _ - AndAlso clsFevdFunction.GetParameter("method").strArgumentValue = Chr(34) & "Bayesian" & Chr(34) Then - clsFevdFunction.RemoveParameterByName("priorParams") - clsFevdFunction.RemoveParameterByName("initial") - clsFevdFunction.RemoveParameterByName("iter") - End If - End If + 'If clsFevdFunction.ContainsParameter("method") Then + ' If ucrChkExplanatoryModelForLocationParameter.Checked _ + ' AndAlso clsFevdFunction.GetParameter("method").strArgumentValue = Chr(34) & "Bayesian" & Chr(34) Then + ' clsFevdFunction.RemoveParameterByName("priorParams") + ' clsFevdFunction.RemoveParameterByName("initial") + ' clsFevdFunction.RemoveParameterByName("iter") + ' End If + 'End If ucrTryModelling.ResetInputTryMessage() TestOkEnabled() End Sub @@ -317,4 +318,22 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction grpSecondCalc.Visible = False End If End Sub + + Private Sub ucrReceiverExpressionExplanatoryModelForLocParam_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverExpressionExplanatoryModelForLocParam.ControlValueChanged + Dim strExplanatory As String = ucrReceiverExpressionExplanatoryModelForLocParam.GetText() + If ucrChkExplanatoryModelForLocationParameter.Checked _ + AndAlso Not ucrReceiverExpressionExplanatoryModelForLocParam.IsEmpty() Then + Dim strTempParam As String = strFirstParam + If strExplanatory.Contains("+") Then + For i = 0 To strExplanatory.Split("+").Length - 1 + strTempParam &= ",0.1" + Next + ElseIf Not IsNumeric(strExplanatory) Then + strTempParam &= ",0.1" + End If + clsConcatenateFunction.AddParameter("first", strTempParam, iPosition:=0, bIncludeArgumentName:=False) + Else + clsConcatenateFunction.AddParameter("first", strFirstParam, iPosition:=0, bIncludeArgumentName:=False) + End If + End Sub End Class From a1220335e35812c4254a58a23d276291d5f8fe69 Mon Sep 17 00:00:00 2001 From: Tula1 <105504255+Tula1@users.noreply.github.com> Date: Fri, 14 Oct 2022 10:59:06 +0300 Subject: [PATCH 048/122] Improving the non-stationary priors. --- instat/dlgExtremes.vb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/instat/dlgExtremes.vb b/instat/dlgExtremes.vb index 035f737d3d4..4ab00f7da98 100644 --- a/instat/dlgExtremes.vb +++ b/instat/dlgExtremes.vb @@ -262,14 +262,6 @@ clsInitialListFunction, clsOmitMissingFunction As New RFunction Private Sub control_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputExtremes.ControlValueChanged, ucrReceiverVariable.ControlValueChanged, ucrChkExplanatoryModelForLocationParameter.ControlValueChanged, ucrInputThresholdforLocation.ControlValueChanged ParameterControl() - 'If clsFevdFunction.ContainsParameter("method") Then - ' If ucrChkExplanatoryModelForLocationParameter.Checked _ - ' AndAlso clsFevdFunction.GetParameter("method").strArgumentValue = Chr(34) & "Bayesian" & Chr(34) Then - ' clsFevdFunction.RemoveParameterByName("priorParams") - ' clsFevdFunction.RemoveParameterByName("initial") - ' clsFevdFunction.RemoveParameterByName("iter") - ' End If - 'End If ucrTryModelling.ResetInputTryMessage() TestOkEnabled() End Sub From 6afdd541ca6fb1985fd3dac334593e9ccd5340a8 Mon Sep 17 00:00:00 2001 From: Maria sawema Date: Fri, 14 Oct 2022 14:07:17 +0300 Subject: [PATCH 049/122] Updated the help ids --- instat/dlgThreeVariableFrequencies.vb | 2 +- instat/dlgThreeVariablePivotTable.vb | 2 +- instat/sdgMissingOptions.vb | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/instat/dlgThreeVariableFrequencies.vb b/instat/dlgThreeVariableFrequencies.vb index dff94c7331f..2ca69acf3ca 100644 --- a/instat/dlgThreeVariableFrequencies.vb +++ b/instat/dlgThreeVariableFrequencies.vb @@ -45,7 +45,7 @@ Public Class dlgThreeVariableFrequencies End Sub Private Sub InitialiseDialog() - ucrBase.iHelpTopicID = 523 + ucrBase.iHelpTopicID = 415 ucrChkWeights.Enabled = False ' temporary because of bug in R functions being used ucrSelectorThreeVariableFrequencies.SetParameter(New RParameter("data", 0)) diff --git a/instat/dlgThreeVariablePivotTable.vb b/instat/dlgThreeVariablePivotTable.vb index a2bbdfdfee0..230b7f3366e 100644 --- a/instat/dlgThreeVariablePivotTable.vb +++ b/instat/dlgThreeVariablePivotTable.vb @@ -40,7 +40,7 @@ Public Class dlgThreeVariablePivotTable End Sub Private Sub InitialiseDialog() - ucrBase.iHelpTopicID = 603 + ucrBase.iHelpTopicID = 417 ucrBase.clsRsyntax.iCallType = 2 ucrSelectorPivot.SetParameter(New RParameter("data", iNewPosition:=0)) diff --git a/instat/sdgMissingOptions.vb b/instat/sdgMissingOptions.vb index 70a9a337189..5fd5ad102bf 100644 --- a/instat/sdgMissingOptions.vb +++ b/instat/sdgMissingOptions.vb @@ -24,6 +24,8 @@ Public Class sdgMissingOptions End Sub Public Sub InitialiseControls() + ucrBase.iHelpTopicID = 292 + Dim lstCheckboxes As New List(Of ucrCheck) ucrChkMaxNumMissing.AddToLinkedControls({ucrNudNumber}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) ucrChkMaxPercMissing.AddToLinkedControls({ucrInputPercentage}, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) From f259adcb3040bedf909f341b8131e0ced040f869 Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Fri, 14 Oct 2022 14:16:25 +0300 Subject: [PATCH 050/122] minor change --- instat/ucrCalculator.vb | 1 + 1 file changed, 1 insertion(+) diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index 4004e86840e..932c0c432ed 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -3345,6 +3345,7 @@ Public Class ucrCalculator clsUglyFunction.SetPackageName("Zseq") clsUglyFunction.SetRCommand("Regular") clsUglyFunction.AddParameter("n", "100", iPosition:=0) + clsUglyFunction.AddParameter("gmp", "FALSE", iPosition:=1) clsDataFunction.SetRCommand("nrow") clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem) From 32a6fdedab078f261c0dc3fad00ccf761d0babcc Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Mon, 17 Oct 2022 11:15:46 +0300 Subject: [PATCH 051/122] Fixed error in the result produced with 3-way frequencies dialogue --- instat/dlgThreeVariableFrequencies.vb | 143 ++++++++++++++------------ 1 file changed, 76 insertions(+), 67 deletions(-) diff --git a/instat/dlgThreeVariableFrequencies.vb b/instat/dlgThreeVariableFrequencies.vb index dff94c7331f..b17297c590f 100644 --- a/instat/dlgThreeVariableFrequencies.vb +++ b/instat/dlgThreeVariableFrequencies.vb @@ -19,7 +19,8 @@ Public Class dlgThreeVariableFrequencies Private bFirstLoad As Boolean = True Private bReset As Boolean = True Private bResetSubdialog As Boolean = False - Private clsSjTab, clsSelect, clsSjPlot, clsGroupBy, clsGridArrange As New RFunction + Private clsSjTabFunction, clsSelectFunction, clsSjPlotFunction, + clsGroupByFunction, clsGridArrangeFunction, clsArrangeFunction As New RFunction Private clsTableBaseOperator, clsGraphBaseOperator As New ROperator Private clsCurrBaseCode As New RCodeStructure Private iMaxGraphGroupX As Integer @@ -153,11 +154,12 @@ Public Class dlgThreeVariableFrequencies End Sub Private Sub SetDefaults() - clsSelect = New RFunction - clsSjPlot = New RFunction - clsGroupBy = New RFunction - clsSjTab = New RFunction - clsGridArrange = New RFunction + clsSelectFunction = New RFunction + clsSjPlotFunction = New RFunction + clsGroupByFunction = New RFunction + clsSjTabFunction = New RFunction + clsArrangeFunction = New RFunction + clsGridArrangeFunction = New RFunction clsTableBaseOperator = New ROperator clsGraphBaseOperator = New ROperator @@ -166,38 +168,42 @@ Public Class dlgThreeVariableFrequencies ucrSaveGraph.Reset() clsTableBaseOperator.SetOperation("%>%") - clsTableBaseOperator.AddParameter("group_by", clsRFunctionParameter:=clsGroupBy, iPosition:=1) - clsTableBaseOperator.AddParameter("select", clsRFunctionParameter:=clsSelect, iPosition:=2) - clsTableBaseOperator.AddParameter("sjtab", clsRFunctionParameter:=clsSjTab, iPosition:=3) + clsTableBaseOperator.AddParameter("group_by", clsRFunctionParameter:=clsGroupByFunction, iPosition:=1) + clsTableBaseOperator.AddParameter("select", clsRFunctionParameter:=clsSelectFunction, iPosition:=2) + clsTableBaseOperator.AddParameter("arrange", clsRFunctionParameter:=clsArrangeFunction, iPosition:=3) + clsTableBaseOperator.AddParameter("sjtab", clsRFunctionParameter:=clsSjTabFunction, iPosition:=4) clsGraphBaseOperator.SetOperation("%>%") - clsGraphBaseOperator.AddParameter("group_by", clsRFunctionParameter:=clsGroupBy, iPosition:=1) - clsGraphBaseOperator.AddParameter("select", clsRFunctionParameter:=clsSelect, iPosition:=2) - clsGraphBaseOperator.AddParameter("sjplot", clsRFunctionParameter:=clsSjPlot, iPosition:=3) - - clsGroupBy.SetPackageName("dplyr") - clsGroupBy.SetRCommand("group_by") - clsSelect.SetPackageName("dplyr") - clsSelect.SetRCommand("select") - - clsSjTab.SetPackageName("sjPlot") - clsSjTab.SetRCommand("sjtab") - clsSjTab.AddParameter("show.summary", "FALSE") - clsSjTab.AddParameter("digits", 0) - clsSjTab.AddParameter("fun", Chr(34) & "xtab" & Chr(34)) - clsSjTab.AddParameter("string.total", Chr(34) & "Total" & Chr(34)) - - clsSjPlot.SetPackageName("sjPlot") - clsSjPlot.SetRCommand("sjplot") - clsSjPlot.AddParameter("fun", Chr(34) & "grpfrq" & Chr(34)) - clsSjPlot.AddParameter("show.prc", "TRUE") - clsSjPlot.AddParameter("show.n", "TRUE") - - clsGridArrange.SetPackageName("gridExtra") - clsGridArrange.SetRCommand("grid.arrange") - clsGridArrange.AddParameter("grobs", clsROperatorParameter:=clsGraphBaseOperator) - - clsGridArrange.SetAssignTo("last_graph", strTempDataframe:=ucrSelectorThreeVariableFrequencies.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempGraph:="last_graph") + clsGraphBaseOperator.AddParameter("group_by", clsRFunctionParameter:=clsGroupByFunction, iPosition:=1) + clsGraphBaseOperator.AddParameter("select", clsRFunctionParameter:=clsSelectFunction, iPosition:=2) + clsGraphBaseOperator.AddParameter("arrange", clsRFunctionParameter:=clsArrangeFunction, iPosition:=3) + clsGraphBaseOperator.AddParameter("sjplot", clsRFunctionParameter:=clsSjPlotFunction, iPosition:=3) + + clsGroupByFunction.SetPackageName("dplyr") + clsGroupByFunction.SetRCommand("group_by") + clsSelectFunction.SetPackageName("dplyr") + clsSelectFunction.SetRCommand("select") + clsArrangeFunction.SetPackageName("dplyr") + clsArrangeFunction.SetRCommand("arrange") + + clsSjTabFunction.SetPackageName("sjPlot") + clsSjTabFunction.SetRCommand("sjtab") + clsSjTabFunction.AddParameter("show.summary", "FALSE") + clsSjTabFunction.AddParameter("digits", 0) + clsSjTabFunction.AddParameter("fun", Chr(34) & "xtab" & Chr(34)) + clsSjTabFunction.AddParameter("string.total", Chr(34) & "Total" & Chr(34)) + + clsSjPlotFunction.SetPackageName("sjPlot") + clsSjPlotFunction.SetRCommand("sjplot") + clsSjPlotFunction.AddParameter("fun", Chr(34) & "grpfrq" & Chr(34)) + clsSjPlotFunction.AddParameter("show.prc", "TRUE") + clsSjPlotFunction.AddParameter("show.n", "TRUE") + + clsGridArrangeFunction.SetPackageName("gridExtra") + clsGridArrangeFunction.SetRCommand("grid.arrange") + clsGridArrangeFunction.AddParameter("grobs", clsROperatorParameter:=clsGraphBaseOperator) + + clsGridArrangeFunction.SetAssignTo("last_graph", strTempDataframe:=ucrSelectorThreeVariableFrequencies.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempGraph:="last_graph") ucrBase.clsRsyntax.SetBaseROperator(clsTableBaseOperator) clsCurrBaseCode = clsTableBaseOperator bResetSubdialog = True @@ -208,35 +214,38 @@ Public Class dlgThreeVariableFrequencies Dim clsTempParamY As RParameter clsTempParamX = New RParameter("x", 3) - ucrReceiverGroupsBy1st.AddAdditionalCodeParameterPair(clsSelect, clsTempParamX, iAdditionalPairNo:=1) + ucrReceiverGroupsBy1st.AddAdditionalCodeParameterPair(clsSelectFunction, clsTempParamX, iAdditionalPairNo:=1) clsTempParamX.bIncludeArgumentName = False clsTempParamY = New RParameter("y", 4) - ucrReceiverGroupBy2nd.AddAdditionalCodeParameterPair(clsSelect, clsTempParamY, iAdditionalPairNo:=1) + ucrReceiverGroupBy2nd.AddAdditionalCodeParameterPair(clsSelectFunction, clsTempParamY, iAdditionalPairNo:=1) clsTempParamY.bIncludeArgumentName = False + ucrReceiverGroupsBy1st.AddAdditionalCodeParameterPair(clsArrangeFunction, New RParameter("col", 0, bNewIncludeArgumentName:=False), iAdditionalPairNo:=2) + ucrReceiverGroupBy2nd.AddAdditionalCodeParameterPair(clsArrangeFunction, New RParameter("col", 0, bNewIncludeArgumentName:=False), iAdditionalPairNo:=2) + ucrSelectorThreeVariableFrequencies.AddAdditionalCodeParameterPair(clsGraphBaseOperator, ucrSelectorThreeVariableFrequencies.GetParameter, iAdditionalPairNo:=1) - ucrChkWeights.AddAdditionalCodeParameterPair(clsSjPlot, New RParameter("weight.by", 1), iAdditionalPairNo:=1) - ucrReceiverWeights.AddAdditionalCodeParameterPair(clsSjPlot, ucrChkWeights.GetParameter(), iAdditionalPairNo:=1) - - ucrReceiverRowFactor.SetRCode(clsSelect, bReset) - ucrReceiverColumnFactor.SetRCode(clsSelect, bReset) - ucrReceiverGroupsBy1st.SetRCode(clsGroupBy, bReset) - ucrReceiverGroupBy2nd.SetRCode(clsGroupBy, bReset) - ucrReceiverWeights.SetRCode(clsSjTab, bReset) - ucrChkWeights.SetRCode(clsSjTab, bReset) - ucrChkFlip.SetRCode(clsSjPlot, bReset) - ucrPnlFreqType.SetRCode(clsSjPlot, bReset) + ucrChkWeights.AddAdditionalCodeParameterPair(clsSjPlotFunction, New RParameter("weight.by", 1), iAdditionalPairNo:=1) + ucrReceiverWeights.AddAdditionalCodeParameterPair(clsSjPlotFunction, ucrChkWeights.GetParameter(), iAdditionalPairNo:=1) + + ucrReceiverRowFactor.SetRCode(clsSelectFunction, bReset) + ucrReceiverColumnFactor.SetRCode(clsSelectFunction, bReset) + ucrReceiverGroupsBy1st.SetRCode(clsGroupByFunction, bReset) + ucrReceiverGroupBy2nd.SetRCode(clsGroupByFunction, bReset) + ucrReceiverWeights.SetRCode(clsSjTabFunction, bReset) + ucrChkWeights.SetRCode(clsSjTabFunction, bReset) + ucrChkFlip.SetRCode(clsSjPlotFunction, bReset) + ucrPnlFreqType.SetRCode(clsSjPlotFunction, bReset) If bReset OrElse Not rdoBoth.Checked Then ucrPnlFrequencyDisplay.SetRCode(clsCurrBaseCode, bReset) End If ucrSelectorThreeVariableFrequencies.SetRCode(clsTableBaseOperator, bReset) - ucrChkCell.SetRCode(clsSjTab, bReset) - ucrChkColumn.SetRCode(clsSjTab, bReset) - ucrChkRow.SetRCode(clsSjTab, bReset) - ucrChkCount.SetRCode(clsSjTab, bReset) - ucrSaveGraph.SetRCode(clsGridArrange, bReset) + ucrChkCell.SetRCode(clsSjTabFunction, bReset) + ucrChkColumn.SetRCode(clsSjTabFunction, bReset) + ucrChkRow.SetRCode(clsSjTabFunction, bReset) + ucrChkCount.SetRCode(clsSjTabFunction, bReset) + ucrSaveGraph.SetRCode(clsGridArrangeFunction, bReset) End Sub Private Sub TestOkEnabled() @@ -267,7 +276,7 @@ Public Class dlgThreeVariableFrequencies clsCurrBaseCode = clsTableBaseOperator ucrBase.clsRsyntax.iCallType = 2 ElseIf rdoGraph.Checked Then - ucrBase.clsRsyntax.SetBaseRFunction(clsGridArrange) + ucrBase.clsRsyntax.SetBaseRFunction(clsGridArrangeFunction) clsCurrBaseCode = clsGraphBaseOperator ucrBase.clsRsyntax.iCallType = 3 End If @@ -281,21 +290,21 @@ Public Class dlgThreeVariableFrequencies Dim strAssignTo As String If rdoBoth.Checked Then - bIsAssigned = clsGridArrange.bIsAssigned - bToBeAssigned = clsGridArrange.bToBeAssigned - strAssignTo = clsGridArrange.strAssignTo + bIsAssigned = clsGridArrangeFunction.bIsAssigned + bToBeAssigned = clsGridArrangeFunction.bToBeAssigned + strAssignTo = clsGridArrangeFunction.strAssignTo - strGraph = clsGridArrange.ToScript(strTempScript) + strGraph = clsGridArrangeFunction.ToScript(strTempScript) frmMain.clsRLink.RunScript(strTempScript & strGraph, iCallType:=3) - clsGridArrange.bIsAssigned = bIsAssigned - clsGridArrange.bToBeAssigned = bToBeAssigned - clsGridArrange.strAssignTo = strAssignTo + clsGridArrangeFunction.bIsAssigned = bIsAssigned + clsGridArrangeFunction.bToBeAssigned = bToBeAssigned + clsGridArrangeFunction.strAssignTo = strAssignTo End If End Sub Private Sub cmdOptions_Click(sender As Object, e As EventArgs) Handles cmdOptions.Click - sdgTwoWayFrequencies.SetRCode(clsSjTab, clsSjPlot, clsGraphBaseOperator, bResetSubdialog, bNewUseTitle:=False) + sdgTwoWayFrequencies.SetRCode(clsSjTabFunction, clsSjPlotFunction, clsGraphBaseOperator, bResetSubdialog, bNewUseTitle:=False) bResetSubdialog = False sdgTwoWayFrequencies.ShowDialog() TestOkEnabled() @@ -332,13 +341,13 @@ Public Class dlgThreeVariableFrequencies Private Sub ucrPnlFreqType_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrPnlFreqType.ControlContentsChanged If rdoCell.Checked Then - clsSjPlot.AddParameter("margin", Chr(34) & "cell" & Chr(34)) + clsSjPlotFunction.AddParameter("margin", Chr(34) & "cell" & Chr(34)) ElseIf rdoColumn.Checked Then - clsSjPlot.AddParameter("margin", Chr(34) & "col" & Chr(34)) + clsSjPlotFunction.AddParameter("margin", Chr(34) & "col" & Chr(34)) ElseIf rdoRow.Checked Then - clsSjPlot.AddParameter("margin", Chr(34) & "row" & Chr(34)) + clsSjPlotFunction.AddParameter("margin", Chr(34) & "row" & Chr(34)) Else - clsSjPlot.RemoveParameterByName("margin") + clsSjPlotFunction.RemoveParameterByName("margin") End If End Sub From 5bb89ca8ea433a5f41ec0ed5adcdb1612173cf43 Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Mon, 17 Oct 2022 11:55:53 +0300 Subject: [PATCH 052/122] adjusting the position of the options button --- instat/dlgOneVariableSummarise.Designer.vb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/instat/dlgOneVariableSummarise.Designer.vb b/instat/dlgOneVariableSummarise.Designer.vb index 64e6efcf4bd..8aae5056017 100644 --- a/instat/dlgOneVariableSummarise.Designer.vb +++ b/instat/dlgOneVariableSummarise.Designer.vb @@ -168,7 +168,7 @@ Partial Class dlgOneVariableSummarise Me.ucrChkOmitMissing.Checked = False Me.ucrChkOmitMissing.Location = New System.Drawing.Point(10, 314) Me.ucrChkOmitMissing.Name = "ucrChkOmitMissing" - Me.ucrChkOmitMissing.Size = New System.Drawing.Size(190, 23) + Me.ucrChkOmitMissing.Size = New System.Drawing.Size(162, 23) Me.ucrChkOmitMissing.TabIndex = 9 ' 'ucrSelectorOneVarSummarise @@ -200,7 +200,7 @@ Partial Class dlgOneVariableSummarise ' Me.ucrBase.AutoSize = True Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrBase.Location = New System.Drawing.Point(8, 336) + Me.ucrBase.Location = New System.Drawing.Point(8, 346) Me.ucrBase.Name = "ucrBase" Me.ucrBase.Size = New System.Drawing.Size(408, 52) Me.ucrBase.TabIndex = 11 @@ -256,7 +256,7 @@ Partial Class dlgOneVariableSummarise ' Me.cmdMissingOptions.Enabled = False Me.cmdMissingOptions.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdMissingOptions.Location = New System.Drawing.Point(206, 311) + Me.cmdMissingOptions.Location = New System.Drawing.Point(165, 311) Me.cmdMissingOptions.Name = "cmdMissingOptions" Me.cmdMissingOptions.Size = New System.Drawing.Size(62, 26) Me.cmdMissingOptions.TabIndex = 27 @@ -269,7 +269,7 @@ Partial Class dlgOneVariableSummarise Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(421, 395) + Me.ClientSize = New System.Drawing.Size(421, 402) Me.Controls.Add(Me.cmdMissingOptions) Me.Controls.Add(Me.rdoSkim) Me.Controls.Add(Me.ucrInputMarginName) From c55cdc0b2281b17c959573493ba0e1d04f7d8990 Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Mon, 17 Oct 2022 12:36:49 +0300 Subject: [PATCH 053/122] Adding missing options button --- instat/dlgDescribeTwoVariable.Designer.vb | 199 ++++++++++++---------- instat/dlgDescribeTwoVariable.vb | 8 + 2 files changed, 114 insertions(+), 93 deletions(-) diff --git a/instat/dlgDescribeTwoVariable.Designer.vb b/instat/dlgDescribeTwoVariable.Designer.vb index fccec8ee931..58156ec5b08 100644 --- a/instat/dlgDescribeTwoVariable.Designer.vb +++ b/instat/dlgDescribeTwoVariable.Designer.vb @@ -42,6 +42,8 @@ Partial Class dlgDescribeTwoVariable Me.lblFirstVariable = New System.Windows.Forms.Label() Me.lbSecondVariable = New System.Windows.Forms.Label() Me.grpOptions = New System.Windows.Forms.GroupBox() + Me.cmdMissingOptions = New System.Windows.Forms.Button() + Me.ucrChkOmitMissing = New instat.ucrCheck() Me.lblSummary = New System.Windows.Forms.Label() Me.lblFirstType = New System.Windows.Forms.Label() Me.lblBy = New System.Windows.Forms.Label() @@ -55,22 +57,21 @@ Partial Class dlgDescribeTwoVariable Me.lblNumericVariable = New System.Windows.Forms.Label() Me.lblMarginName = New System.Windows.Forms.Label() Me.grpDisplay = New System.Windows.Forms.GroupBox() + Me.ucrReceiverPercentages = New instat.ucrReceiverSingle() Me.lblFactorsAsPercentage = New System.Windows.Forms.Label() + Me.ucrChkPercentageProportion = New instat.ucrCheck() + Me.ucrChkDisplayAsPercentage = New instat.ucrCheck() Me.grpFrequency = New System.Windows.Forms.GroupBox() - Me.lblColumnFactors = New System.Windows.Forms.Label() - Me.lblSigFigs = New System.Windows.Forms.Label() - Me.rdoThreeVariable = New System.Windows.Forms.RadioButton() - Me.ucrBase = New instat.ucrButtons() Me.ucrNudColumnFactors = New instat.ucrNud() + Me.lblColumnFactors = New System.Windows.Forms.Label() Me.ucrNudSigFigs = New instat.ucrNud() Me.ucrInputMarginName = New instat.ucrInputTextBox() + Me.lblSigFigs = New System.Windows.Forms.Label() Me.ucrChkDisplayMargins = New instat.ucrCheck() - Me.ucrReceiverPercentages = New instat.ucrReceiverSingle() - Me.ucrChkPercentageProportion = New instat.ucrCheck() - Me.ucrChkDisplayAsPercentage = New instat.ucrCheck() + Me.rdoThreeVariable = New System.Windows.Forms.RadioButton() + Me.ucrBase = New instat.ucrButtons() Me.ucrReceiverNumericVariable = New instat.ucrReceiverSingle() Me.ucrReceiverSecondFactor = New instat.ucrReceiverSingle() - Me.ucrChkOmitMissing = New instat.ucrCheck() Me.ucrReceiverSecondOpt = New instat.ucrReceiverSingle() Me.ucrPnlDescribe = New instat.UcrPanel() Me.ucrReceiverSecondVar = New instat.ucrReceiverSingle() @@ -85,7 +86,7 @@ Partial Class dlgDescribeTwoVariable 'cmdSummaries ' Me.cmdSummaries.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdSummaries.Location = New System.Drawing.Point(6, 45) + Me.cmdSummaries.Location = New System.Drawing.Point(6, 70) Me.cmdSummaries.Name = "cmdSummaries" Me.cmdSummaries.Size = New System.Drawing.Size(105, 23) Me.cmdSummaries.TabIndex = 1 @@ -116,15 +117,35 @@ Partial Class dlgDescribeTwoVariable ' 'grpOptions ' + Me.grpOptions.Controls.Add(Me.cmdMissingOptions) Me.grpOptions.Controls.Add(Me.ucrChkOmitMissing) Me.grpOptions.Controls.Add(Me.cmdSummaries) Me.grpOptions.Location = New System.Drawing.Point(256, 250) Me.grpOptions.Name = "grpOptions" - Me.grpOptions.Size = New System.Drawing.Size(155, 76) + Me.grpOptions.Size = New System.Drawing.Size(155, 103) Me.grpOptions.TabIndex = 12 Me.grpOptions.TabStop = False Me.grpOptions.Text = "Options" ' + 'cmdMissingOptions + ' + Me.cmdMissingOptions.Enabled = False + Me.cmdMissingOptions.Location = New System.Drawing.Point(7, 44) + Me.cmdMissingOptions.Name = "cmdMissingOptions" + Me.cmdMissingOptions.Size = New System.Drawing.Size(104, 23) + Me.cmdMissingOptions.TabIndex = 2 + Me.cmdMissingOptions.Text = "Options" + Me.cmdMissingOptions.UseVisualStyleBackColor = True + ' + 'ucrChkOmitMissing + ' + Me.ucrChkOmitMissing.AutoSize = True + Me.ucrChkOmitMissing.Checked = False + Me.ucrChkOmitMissing.Location = New System.Drawing.Point(9, 19) + Me.ucrChkOmitMissing.Name = "ucrChkOmitMissing" + Me.ucrChkOmitMissing.Size = New System.Drawing.Size(143, 23) + Me.ucrChkOmitMissing.TabIndex = 0 + ' 'lblSummary ' Me.lblSummary.AutoSize = True @@ -271,6 +292,19 @@ Partial Class dlgDescribeTwoVariable Me.grpDisplay.TabStop = False Me.grpDisplay.Text = "Percentages" ' + 'ucrReceiverPercentages + ' + Me.ucrReceiverPercentages.AutoSize = True + Me.ucrReceiverPercentages.frmParent = Me + Me.ucrReceiverPercentages.Location = New System.Drawing.Point(21, 63) + Me.ucrReceiverPercentages.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverPercentages.Name = "ucrReceiverPercentages" + Me.ucrReceiverPercentages.Selector = Nothing + Me.ucrReceiverPercentages.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverPercentages.strNcFilePath = "" + Me.ucrReceiverPercentages.TabIndex = 8 + Me.ucrReceiverPercentages.ucrSelector = Nothing + ' 'lblFactorsAsPercentage ' Me.lblFactorsAsPercentage.AutoSize = True @@ -282,6 +316,24 @@ Partial Class dlgDescribeTwoVariable Me.lblFactorsAsPercentage.Tag = "Factors as Percentage:" Me.lblFactorsAsPercentage.Text = "Factors as Percentage:" ' + 'ucrChkPercentageProportion + ' + Me.ucrChkPercentageProportion.AutoSize = True + Me.ucrChkPercentageProportion.Checked = False + Me.ucrChkPercentageProportion.Location = New System.Drawing.Point(14, 86) + Me.ucrChkPercentageProportion.Name = "ucrChkPercentageProportion" + Me.ucrChkPercentageProportion.Size = New System.Drawing.Size(154, 23) + Me.ucrChkPercentageProportion.TabIndex = 3 + ' + 'ucrChkDisplayAsPercentage + ' + Me.ucrChkDisplayAsPercentage.AutoSize = True + Me.ucrChkDisplayAsPercentage.Checked = False + Me.ucrChkDisplayAsPercentage.Location = New System.Drawing.Point(14, 19) + Me.ucrChkDisplayAsPercentage.Name = "ucrChkDisplayAsPercentage" + Me.ucrChkDisplayAsPercentage.Size = New System.Drawing.Size(135, 23) + Me.ucrChkDisplayAsPercentage.TabIndex = 0 + ' 'grpFrequency ' Me.grpFrequency.Controls.Add(Me.ucrNudColumnFactors) @@ -298,53 +350,6 @@ Partial Class dlgDescribeTwoVariable Me.grpFrequency.TabStop = False Me.grpFrequency.Text = "Display" ' - 'lblColumnFactors - ' - Me.lblColumnFactors.AutoSize = True - Me.lblColumnFactors.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblColumnFactors.Location = New System.Drawing.Point(8, 53) - Me.lblColumnFactors.Name = "lblColumnFactors" - Me.lblColumnFactors.Size = New System.Drawing.Size(83, 13) - Me.lblColumnFactors.TabIndex = 21 - Me.lblColumnFactors.Tag = "" - Me.lblColumnFactors.Text = "Column Factors:" - ' - 'lblSigFigs - ' - Me.lblSigFigs.AutoSize = True - Me.lblSigFigs.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSigFigs.Location = New System.Drawing.Point(8, 25) - Me.lblSigFigs.Name = "lblSigFigs" - Me.lblSigFigs.Size = New System.Drawing.Size(96, 13) - Me.lblSigFigs.TabIndex = 4 - Me.lblSigFigs.Tag = "Significant_Figures:" - Me.lblSigFigs.Text = "Significant Figures:" - ' - 'rdoThreeVariable - ' - Me.rdoThreeVariable.Appearance = System.Windows.Forms.Appearance.Button - Me.rdoThreeVariable.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoThreeVariable.FlatAppearance.BorderSize = 2 - Me.rdoThreeVariable.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoThreeVariable.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.rdoThreeVariable.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.rdoThreeVariable.Location = New System.Drawing.Point(242, 12) - Me.rdoThreeVariable.Name = "rdoThreeVariable" - Me.rdoThreeVariable.Size = New System.Drawing.Size(100, 28) - Me.rdoThreeVariable.TabIndex = 23 - Me.rdoThreeVariable.Text = "Three Variables" - Me.rdoThreeVariable.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.rdoThreeVariable.UseVisualStyleBackColor = True - ' - 'ucrBase - ' - Me.ucrBase.AutoSize = True - Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrBase.Location = New System.Drawing.Point(8, 435) - Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(405, 52) - Me.ucrBase.TabIndex = 13 - ' 'ucrNudColumnFactors ' Me.ucrNudColumnFactors.AutoSize = True @@ -358,6 +363,17 @@ Partial Class dlgDescribeTwoVariable Me.ucrNudColumnFactors.TabIndex = 22 Me.ucrNudColumnFactors.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' + 'lblColumnFactors + ' + Me.lblColumnFactors.AutoSize = True + Me.lblColumnFactors.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblColumnFactors.Location = New System.Drawing.Point(8, 53) + Me.lblColumnFactors.Name = "lblColumnFactors" + Me.lblColumnFactors.Size = New System.Drawing.Size(83, 13) + Me.lblColumnFactors.TabIndex = 21 + Me.lblColumnFactors.Tag = "" + Me.lblColumnFactors.Text = "Column Factors:" + ' 'ucrNudSigFigs ' Me.ucrNudSigFigs.AutoSize = True @@ -382,6 +398,17 @@ Partial Class dlgDescribeTwoVariable Me.ucrInputMarginName.Size = New System.Drawing.Size(74, 21) Me.ucrInputMarginName.TabIndex = 20 ' + 'lblSigFigs + ' + Me.lblSigFigs.AutoSize = True + Me.lblSigFigs.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblSigFigs.Location = New System.Drawing.Point(8, 25) + Me.lblSigFigs.Name = "lblSigFigs" + Me.lblSigFigs.Size = New System.Drawing.Size(96, 13) + Me.lblSigFigs.TabIndex = 4 + Me.lblSigFigs.Tag = "Significant_Figures:" + Me.lblSigFigs.Text = "Significant Figures:" + ' 'ucrChkDisplayMargins ' Me.ucrChkDisplayMargins.AutoSize = True @@ -391,36 +418,30 @@ Partial Class dlgDescribeTwoVariable Me.ucrChkDisplayMargins.Size = New System.Drawing.Size(149, 23) Me.ucrChkDisplayMargins.TabIndex = 17 ' - 'ucrReceiverPercentages - ' - Me.ucrReceiverPercentages.AutoSize = True - Me.ucrReceiverPercentages.frmParent = Nothing - Me.ucrReceiverPercentages.Location = New System.Drawing.Point(21, 63) - Me.ucrReceiverPercentages.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverPercentages.Name = "ucrReceiverPercentages" - Me.ucrReceiverPercentages.Selector = Nothing - Me.ucrReceiverPercentages.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverPercentages.strNcFilePath = "" - Me.ucrReceiverPercentages.TabIndex = 8 - Me.ucrReceiverPercentages.ucrSelector = Nothing - ' - 'ucrChkPercentageProportion + 'rdoThreeVariable ' - Me.ucrChkPercentageProportion.AutoSize = True - Me.ucrChkPercentageProportion.Checked = False - Me.ucrChkPercentageProportion.Location = New System.Drawing.Point(14, 86) - Me.ucrChkPercentageProportion.Name = "ucrChkPercentageProportion" - Me.ucrChkPercentageProportion.Size = New System.Drawing.Size(154, 23) - Me.ucrChkPercentageProportion.TabIndex = 3 + Me.rdoThreeVariable.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoThreeVariable.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoThreeVariable.FlatAppearance.BorderSize = 2 + Me.rdoThreeVariable.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoThreeVariable.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoThreeVariable.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.rdoThreeVariable.Location = New System.Drawing.Point(242, 12) + Me.rdoThreeVariable.Name = "rdoThreeVariable" + Me.rdoThreeVariable.Size = New System.Drawing.Size(100, 28) + Me.rdoThreeVariable.TabIndex = 23 + Me.rdoThreeVariable.Text = "Three Variables" + Me.rdoThreeVariable.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoThreeVariable.UseVisualStyleBackColor = True ' - 'ucrChkDisplayAsPercentage + 'ucrBase ' - Me.ucrChkDisplayAsPercentage.AutoSize = True - Me.ucrChkDisplayAsPercentage.Checked = False - Me.ucrChkDisplayAsPercentage.Location = New System.Drawing.Point(14, 19) - Me.ucrChkDisplayAsPercentage.Name = "ucrChkDisplayAsPercentage" - Me.ucrChkDisplayAsPercentage.Size = New System.Drawing.Size(135, 23) - Me.ucrChkDisplayAsPercentage.TabIndex = 0 + Me.ucrBase.AutoSize = True + Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrBase.Location = New System.Drawing.Point(8, 435) + Me.ucrBase.Name = "ucrBase" + Me.ucrBase.Size = New System.Drawing.Size(408, 52) + Me.ucrBase.TabIndex = 13 ' 'ucrReceiverNumericVariable ' @@ -448,15 +469,6 @@ Partial Class dlgDescribeTwoVariable Me.ucrReceiverSecondFactor.TabIndex = 9 Me.ucrReceiverSecondFactor.ucrSelector = Nothing ' - 'ucrChkOmitMissing - ' - Me.ucrChkOmitMissing.AutoSize = True - Me.ucrChkOmitMissing.Checked = False - Me.ucrChkOmitMissing.Location = New System.Drawing.Point(9, 19) - Me.ucrChkOmitMissing.Name = "ucrChkOmitMissing" - Me.ucrChkOmitMissing.Size = New System.Drawing.Size(143, 23) - Me.ucrChkOmitMissing.TabIndex = 0 - ' 'ucrReceiverSecondOpt ' Me.ucrReceiverSecondOpt.AutoSize = True @@ -600,4 +612,5 @@ Partial Class dlgDescribeTwoVariable Friend WithEvents lblSigFigs As Label Friend WithEvents ucrReceiverPercentages As ucrReceiverSingle Friend WithEvents rdoThreeVariable As RadioButton + Friend WithEvents cmdMissingOptions As Button End Class diff --git a/instat/dlgDescribeTwoVariable.vb b/instat/dlgDescribeTwoVariable.vb index 2e1557b8b7b..16b266f058b 100644 --- a/instat/dlgDescribeTwoVariable.vb +++ b/instat/dlgDescribeTwoVariable.vb @@ -27,6 +27,7 @@ Public Class dlgDescribeTwoVariable clsSummaryMapFunction, clsCombineMultipleColumnsFunction, clsCombineFactorsFunction, clsMmtableMapFunction, clsHeaderTopLeftSummaryVariableFunction, clsCombineFrequencyFactorParameterFunction, clsSelectFunction, clsRenameCombineFunction As New RFunction + Private clsGroupByPipeOperator, clsMmtablePlusOperator, clsMapFrequencyPipeOperator, clsMmtableTildeOperator, clsDataSelectTildeOperator, clsEmptyOperator, clsSecondEmptyOperator As New ROperator Private lstFrequencyParameters As New List(Of String)({"percentage_type", "margin_name", @@ -479,6 +480,7 @@ Public Class dlgDescribeTwoVariable Else clsRCorrelationFunction.RemoveParameterByName("use") End If + cmdMissingOptions.Enabled = ucrChkOmitMissing.Checked End Sub Private Sub ucrPnlDescribe_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlDescribe.ControlValueChanged @@ -601,4 +603,10 @@ Public Class dlgDescribeTwoVariable clsMapFrequencyPipeOperator.AddParameter("data", clsRFunctionParameter:=ucrSelectorDescribeTwoVar.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) clsFrequencyTablesFunction.AddParameter("data_name", Chr(34) & ucrSelectorDescribeTwoVar.ucrAvailableDataFrames.cboAvailableDataFrames.Text & Chr(34), iPosition:=0) End Sub + + Private Sub cmdMissingOptions_Click(sender As Object, e As EventArgs) Handles cmdMissingOptions.Click + sdgMissingOptions.SetRFunction(clsNewSummaryFunction:=clsRCustomSummaryFunction, clsNewConcFunction:=clsCombineFunction, bReset:=bResetSubdialog) + bResetSubdialog = False + sdgMissingOptions.ShowDialog() + End Sub End Class \ No newline at end of file From 72fa564c69fbae3d10d78d3c9f08cb06f9460f26 Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Wed, 19 Oct 2022 10:19:37 +0300 Subject: [PATCH 054/122] Implementing the Missing options subdialog. --- instat/dlgDescribeTwoVariable.Designer.vb | 8 +- instat/dlgDescribeTwoVariable.vb | 13 +- instat/dlgSummaryTables.Designer.vb | 223 ++++++++++++---------- instat/dlgSummaryTables.vb | 11 ++ 4 files changed, 144 insertions(+), 111 deletions(-) diff --git a/instat/dlgDescribeTwoVariable.Designer.vb b/instat/dlgDescribeTwoVariable.Designer.vb index 58156ec5b08..d2a3d494067 100644 --- a/instat/dlgDescribeTwoVariable.Designer.vb +++ b/instat/dlgDescribeTwoVariable.Designer.vb @@ -120,9 +120,9 @@ Partial Class dlgDescribeTwoVariable Me.grpOptions.Controls.Add(Me.cmdMissingOptions) Me.grpOptions.Controls.Add(Me.ucrChkOmitMissing) Me.grpOptions.Controls.Add(Me.cmdSummaries) - Me.grpOptions.Location = New System.Drawing.Point(256, 250) + Me.grpOptions.Location = New System.Drawing.Point(242, 222) Me.grpOptions.Name = "grpOptions" - Me.grpOptions.Size = New System.Drawing.Size(155, 103) + Me.grpOptions.Size = New System.Drawing.Size(169, 103) Me.grpOptions.TabIndex = 12 Me.grpOptions.TabStop = False Me.grpOptions.Text = "Options" @@ -537,9 +537,7 @@ Partial Class dlgDescribeTwoVariable Me.Controls.Add(Me.rdoThreeVariable) Me.Controls.Add(Me.ucrBase) Me.Controls.Add(Me.grpFrequency) - Me.Controls.Add(Me.grpDisplay) Me.Controls.Add(Me.lblNumericVariable) - Me.Controls.Add(Me.ucrReceiverNumericVariable) Me.Controls.Add(Me.lblSecondFactor) Me.Controls.Add(Me.ucrReceiverSecondFactor) Me.Controls.Add(Me.grpOptions) @@ -554,6 +552,8 @@ Partial Class dlgDescribeTwoVariable Me.Controls.Add(Me.ucrReceiverFirstVars) Me.Controls.Add(Me.ucrSelectorDescribeTwoVar) Me.Controls.Add(Me.grpSummaries) + Me.Controls.Add(Me.grpDisplay) + Me.Controls.Add(Me.ucrReceiverNumericVariable) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.MinimizeBox = False diff --git a/instat/dlgDescribeTwoVariable.vb b/instat/dlgDescribeTwoVariable.vb index 16b266f058b..39f3dffa7eb 100644 --- a/instat/dlgDescribeTwoVariable.vb +++ b/instat/dlgDescribeTwoVariable.vb @@ -27,7 +27,7 @@ Public Class dlgDescribeTwoVariable clsSummaryMapFunction, clsCombineMultipleColumnsFunction, clsCombineFactorsFunction, clsMmtableMapFunction, clsHeaderTopLeftSummaryVariableFunction, clsCombineFrequencyFactorParameterFunction, clsSelectFunction, clsRenameCombineFunction As New RFunction - + Private clsTempCustomizeFunction As New RFunction Private clsGroupByPipeOperator, clsMmtablePlusOperator, clsMapFrequencyPipeOperator, clsMmtableTildeOperator, clsDataSelectTildeOperator, clsEmptyOperator, clsSecondEmptyOperator As New ROperator Private lstFrequencyParameters As New List(Of String)({"percentage_type", "margin_name", @@ -471,6 +471,7 @@ Public Class dlgDescribeTwoVariable EnableDisableFrequencyControls() AddRemoveFrequencyParameters() ChangeLocations() + MissingOptions() TestOKEnabled() End Sub @@ -480,7 +481,15 @@ Public Class dlgDescribeTwoVariable Else clsRCorrelationFunction.RemoveParameterByName("use") End If - cmdMissingOptions.Enabled = ucrChkOmitMissing.Checked + MissingOptions() + End Sub + + Private Sub MissingOptions() + If ucrChkOmitMissing.Checked AndAlso strFirstVariablesType = "numeric" AndAlso strSecondVariableType = "categorical" Then + cmdMissingOptions.Enabled = True + Else + cmdMissingOptions.Enabled = False + End If End Sub Private Sub ucrPnlDescribe_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlDescribe.ControlValueChanged diff --git a/instat/dlgSummaryTables.Designer.vb b/instat/dlgSummaryTables.Designer.vb index a8932d10a2a..fc4c0529ad1 100644 --- a/instat/dlgSummaryTables.Designer.vb +++ b/instat/dlgSummaryTables.Designer.vb @@ -42,29 +42,24 @@ Partial Class dlgSummaryTables Me.cmdSummaries = New System.Windows.Forms.Button() Me.lblSigFigs = New System.Windows.Forms.Label() Me.grpDisplay = New System.Windows.Forms.GroupBox() - Me.ucrNudColumnFactors = New instat.ucrNud() Me.lblColumnFactors = New System.Windows.Forms.Label() - Me.ucrChkDisplaySummaryVariablesAsRow = New instat.ucrCheck() - Me.ucrChkDisplayVariablesAsRows = New instat.ucrCheck() - Me.ucrChkDisplaySummariesAsRow = New instat.ucrCheck() - Me.ucrNudSigFigs = New instat.ucrNud() Me.grpMargin = New System.Windows.Forms.GroupBox() Me.rdoBoth = New System.Windows.Forms.RadioButton() Me.rdoSummary = New System.Windows.Forms.RadioButton() Me.rdoOuter = New System.Windows.Forms.RadioButton() - Me.ucrPnlMargin = New instat.UcrPanel() Me.lblMarginName = New System.Windows.Forms.Label() Me.lblVariables = New System.Windows.Forms.Label() Me.cmdFormatTable = New System.Windows.Forms.Button() Me.rdoFrequencyTable = New System.Windows.Forms.RadioButton() Me.rdoSummaryTable = New System.Windows.Forms.RadioButton() Me.grpPercentages = New System.Windows.Forms.GroupBox() - Me.ucrReceiverPercentages = New instat.ucrReceiverSingle() Me.lblFactorsAsPercentage = New System.Windows.Forms.Label() - Me.ucrChkPercentageProportion = New instat.ucrCheck() - Me.ucrChkDisplayAsPercentage = New instat.ucrCheck() Me.lblFrequencyMarginName = New System.Windows.Forms.Label() + Me.cmdMissingOptions = New System.Windows.Forms.Button() Me.ucrChkFrequencyDisplayMargins = New instat.ucrCheck() + Me.ucrReceiverPercentages = New instat.ucrReceiverSingle() + Me.ucrChkPercentageProportion = New instat.ucrCheck() + Me.ucrChkDisplayAsPercentage = New instat.ucrCheck() Me.ucrPnlSummaryFrequencyTables = New instat.UcrPanel() Me.ucrReorderSummary = New instat.ucrReorder() Me.ucrInputMarginName = New instat.ucrInputTextBox() @@ -72,6 +67,11 @@ Partial Class dlgSummaryTables Me.ucrChkOmitMissing = New instat.ucrCheck() Me.ucrChkStoreResults = New instat.ucrCheck() Me.ucrChkDisplayMargins = New instat.ucrCheck() + Me.ucrNudColumnFactors = New instat.ucrNud() + Me.ucrChkDisplaySummaryVariablesAsRow = New instat.ucrCheck() + Me.ucrChkDisplayVariablesAsRows = New instat.ucrCheck() + Me.ucrChkDisplaySummariesAsRow = New instat.ucrCheck() + Me.ucrNudSigFigs = New instat.ucrNud() Me.ucrChkSummaries = New instat.ucrCheck() Me.ucrBase = New instat.ucrButtons() Me.ucrReceiverSummaryCols = New instat.ucrReceiverMultiple() @@ -79,6 +79,7 @@ Partial Class dlgSummaryTables Me.ucrReceiverWeights = New instat.ucrReceiverSingle() Me.ucrChkWeight = New instat.ucrCheck() Me.ucrSelectorSummaryTables = New instat.ucrSelectorByDataFrameAddRemove() + Me.ucrPnlMargin = New instat.UcrPanel() Me.ucrInputFrequencyMarginName = New instat.ucrInputTextBox() Me.grpDisplay.SuspendLayout() Me.grpMargin.SuspendLayout() @@ -133,19 +134,6 @@ Partial Class dlgSummaryTables Me.grpDisplay.TabStop = False Me.grpDisplay.Text = "Display" ' - 'ucrNudColumnFactors - ' - Me.ucrNudColumnFactors.AutoSize = True - Me.ucrNudColumnFactors.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudColumnFactors.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudColumnFactors.Location = New System.Drawing.Point(111, 49) - Me.ucrNudColumnFactors.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudColumnFactors.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudColumnFactors.Name = "ucrNudColumnFactors" - Me.ucrNudColumnFactors.Size = New System.Drawing.Size(50, 20) - Me.ucrNudColumnFactors.TabIndex = 19 - Me.ucrNudColumnFactors.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' 'lblColumnFactors ' Me.lblColumnFactors.AutoSize = True @@ -157,46 +145,6 @@ Partial Class dlgSummaryTables Me.lblColumnFactors.Tag = "" Me.lblColumnFactors.Text = "Column Factors :" ' - 'ucrChkDisplaySummaryVariablesAsRow - ' - Me.ucrChkDisplaySummaryVariablesAsRow.AutoSize = True - Me.ucrChkDisplaySummaryVariablesAsRow.Checked = False - Me.ucrChkDisplaySummaryVariablesAsRow.Location = New System.Drawing.Point(11, 73) - Me.ucrChkDisplaySummaryVariablesAsRow.Name = "ucrChkDisplaySummaryVariablesAsRow" - Me.ucrChkDisplaySummaryVariablesAsRow.Size = New System.Drawing.Size(231, 23) - Me.ucrChkDisplaySummaryVariablesAsRow.TabIndex = 17 - ' - 'ucrChkDisplayVariablesAsRows - ' - Me.ucrChkDisplayVariablesAsRows.AutoSize = True - Me.ucrChkDisplayVariablesAsRows.Checked = False - Me.ucrChkDisplayVariablesAsRows.Location = New System.Drawing.Point(11, 97) - Me.ucrChkDisplayVariablesAsRows.Name = "ucrChkDisplayVariablesAsRows" - Me.ucrChkDisplayVariablesAsRows.Size = New System.Drawing.Size(186, 23) - Me.ucrChkDisplayVariablesAsRows.TabIndex = 11 - ' - 'ucrChkDisplaySummariesAsRow - ' - Me.ucrChkDisplaySummariesAsRow.AutoSize = True - Me.ucrChkDisplaySummariesAsRow.Checked = False - Me.ucrChkDisplaySummariesAsRow.Location = New System.Drawing.Point(11, 73) - Me.ucrChkDisplaySummariesAsRow.Name = "ucrChkDisplaySummariesAsRow" - Me.ucrChkDisplaySummariesAsRow.Size = New System.Drawing.Size(175, 23) - Me.ucrChkDisplaySummariesAsRow.TabIndex = 10 - ' - 'ucrNudSigFigs - ' - Me.ucrNudSigFigs.AutoSize = True - Me.ucrNudSigFigs.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSigFigs.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudSigFigs.Location = New System.Drawing.Point(111, 23) - Me.ucrNudSigFigs.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudSigFigs.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSigFigs.Name = "ucrNudSigFigs" - Me.ucrNudSigFigs.Size = New System.Drawing.Size(50, 20) - Me.ucrNudSigFigs.TabIndex = 5 - Me.ucrNudSigFigs.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' 'grpMargin ' Me.grpMargin.Controls.Add(Me.rdoBoth) @@ -245,20 +193,11 @@ Partial Class dlgSummaryTables Me.rdoOuter.Text = "Outer" Me.rdoOuter.UseVisualStyleBackColor = True ' - 'ucrPnlMargin - ' - Me.ucrPnlMargin.AutoSize = True - Me.ucrPnlMargin.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrPnlMargin.Location = New System.Drawing.Point(6, 14) - Me.ucrPnlMargin.Name = "ucrPnlMargin" - Me.ucrPnlMargin.Size = New System.Drawing.Size(0, 0) - Me.ucrPnlMargin.TabIndex = 13 - ' 'lblMarginName ' Me.lblMarginName.AutoSize = True Me.lblMarginName.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMarginName.Location = New System.Drawing.Point(159, 287) + Me.lblMarginName.Location = New System.Drawing.Point(159, 288) Me.lblMarginName.Name = "lblMarginName" Me.lblMarginName.Size = New System.Drawing.Size(41, 13) Me.lblMarginName.TabIndex = 15 @@ -332,19 +271,6 @@ Partial Class dlgSummaryTables Me.grpPercentages.TabStop = False Me.grpPercentages.Text = "Percentages" ' - 'ucrReceiverPercentages - ' - Me.ucrReceiverPercentages.AutoSize = True - Me.ucrReceiverPercentages.frmParent = Me - Me.ucrReceiverPercentages.Location = New System.Drawing.Point(16, 60) - Me.ucrReceiverPercentages.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverPercentages.Name = "ucrReceiverPercentages" - Me.ucrReceiverPercentages.Selector = Nothing - Me.ucrReceiverPercentages.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverPercentages.strNcFilePath = "" - Me.ucrReceiverPercentages.TabIndex = 4 - Me.ucrReceiverPercentages.ucrSelector = Nothing - ' 'lblFactorsAsPercentage ' Me.lblFactorsAsPercentage.AutoSize = True @@ -356,24 +282,6 @@ Partial Class dlgSummaryTables Me.lblFactorsAsPercentage.Tag = "Factors as Percentage:" Me.lblFactorsAsPercentage.Text = "Of Factor (Optional):" ' - 'ucrChkPercentageProportion - ' - Me.ucrChkPercentageProportion.AutoSize = True - Me.ucrChkPercentageProportion.Checked = False - Me.ucrChkPercentageProportion.Location = New System.Drawing.Point(5, 171) - Me.ucrChkPercentageProportion.Name = "ucrChkPercentageProportion" - Me.ucrChkPercentageProportion.Size = New System.Drawing.Size(160, 23) - Me.ucrChkPercentageProportion.TabIndex = 3 - ' - 'ucrChkDisplayAsPercentage - ' - Me.ucrChkDisplayAsPercentage.AutoSize = True - Me.ucrChkDisplayAsPercentage.Checked = False - Me.ucrChkDisplayAsPercentage.Location = New System.Drawing.Point(14, 19) - Me.ucrChkDisplayAsPercentage.Name = "ucrChkDisplayAsPercentage" - Me.ucrChkDisplayAsPercentage.Size = New System.Drawing.Size(135, 23) - Me.ucrChkDisplayAsPercentage.TabIndex = 0 - ' 'lblFrequencyMarginName ' Me.lblFrequencyMarginName.AutoSize = True @@ -384,6 +292,16 @@ Partial Class dlgSummaryTables Me.lblFrequencyMarginName.TabIndex = 25 Me.lblFrequencyMarginName.Text = "Margin Name :" ' + 'cmdMissingOptions + ' + Me.cmdMissingOptions.Enabled = False + Me.cmdMissingOptions.Location = New System.Drawing.Point(205, 261) + Me.cmdMissingOptions.Name = "cmdMissingOptions" + Me.cmdMissingOptions.Size = New System.Drawing.Size(75, 23) + Me.cmdMissingOptions.TabIndex = 27 + Me.cmdMissingOptions.Text = "Options" + Me.cmdMissingOptions.UseVisualStyleBackColor = True + ' 'ucrChkFrequencyDisplayMargins ' Me.ucrChkFrequencyDisplayMargins.AutoSize = True @@ -393,6 +311,37 @@ Partial Class dlgSummaryTables Me.ucrChkFrequencyDisplayMargins.Size = New System.Drawing.Size(213, 23) Me.ucrChkFrequencyDisplayMargins.TabIndex = 24 ' + 'ucrReceiverPercentages + ' + Me.ucrReceiverPercentages.AutoSize = True + Me.ucrReceiverPercentages.frmParent = Nothing + Me.ucrReceiverPercentages.Location = New System.Drawing.Point(16, 60) + Me.ucrReceiverPercentages.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverPercentages.Name = "ucrReceiverPercentages" + Me.ucrReceiverPercentages.Selector = Nothing + Me.ucrReceiverPercentages.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverPercentages.strNcFilePath = "" + Me.ucrReceiverPercentages.TabIndex = 4 + Me.ucrReceiverPercentages.ucrSelector = Nothing + ' + 'ucrChkPercentageProportion + ' + Me.ucrChkPercentageProportion.AutoSize = True + Me.ucrChkPercentageProportion.Checked = False + Me.ucrChkPercentageProportion.Location = New System.Drawing.Point(5, 171) + Me.ucrChkPercentageProportion.Name = "ucrChkPercentageProportion" + Me.ucrChkPercentageProportion.Size = New System.Drawing.Size(160, 23) + Me.ucrChkPercentageProportion.TabIndex = 3 + ' + 'ucrChkDisplayAsPercentage + ' + Me.ucrChkDisplayAsPercentage.AutoSize = True + Me.ucrChkDisplayAsPercentage.Checked = False + Me.ucrChkDisplayAsPercentage.Location = New System.Drawing.Point(14, 19) + Me.ucrChkDisplayAsPercentage.Name = "ucrChkDisplayAsPercentage" + Me.ucrChkDisplayAsPercentage.Size = New System.Drawing.Size(135, 23) + Me.ucrChkDisplayAsPercentage.TabIndex = 0 + ' 'ucrPnlSummaryFrequencyTables ' Me.ucrPnlSummaryFrequencyTables.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink @@ -417,7 +366,7 @@ Partial Class dlgSummaryTables Me.ucrInputMarginName.AutoSize = True Me.ucrInputMarginName.IsMultiline = False Me.ucrInputMarginName.IsReadOnly = False - Me.ucrInputMarginName.Location = New System.Drawing.Point(206, 284) + Me.ucrInputMarginName.Location = New System.Drawing.Point(206, 285) Me.ucrInputMarginName.Name = "ucrInputMarginName" Me.ucrInputMarginName.Size = New System.Drawing.Size(74, 21) Me.ucrInputMarginName.TabIndex = 16 @@ -437,7 +386,7 @@ Partial Class dlgSummaryTables Me.ucrChkOmitMissing.Checked = False Me.ucrChkOmitMissing.Location = New System.Drawing.Point(10, 266) Me.ucrChkOmitMissing.Name = "ucrChkOmitMissing" - Me.ucrChkOmitMissing.Size = New System.Drawing.Size(271, 23) + Me.ucrChkOmitMissing.Size = New System.Drawing.Size(152, 23) Me.ucrChkOmitMissing.TabIndex = 9 ' 'ucrChkStoreResults @@ -458,6 +407,59 @@ Partial Class dlgSummaryTables Me.ucrChkDisplayMargins.Size = New System.Drawing.Size(150, 23) Me.ucrChkDisplayMargins.TabIndex = 10 ' + 'ucrNudColumnFactors + ' + Me.ucrNudColumnFactors.AutoSize = True + Me.ucrNudColumnFactors.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudColumnFactors.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudColumnFactors.Location = New System.Drawing.Point(111, 49) + Me.ucrNudColumnFactors.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudColumnFactors.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudColumnFactors.Name = "ucrNudColumnFactors" + Me.ucrNudColumnFactors.Size = New System.Drawing.Size(50, 20) + Me.ucrNudColumnFactors.TabIndex = 19 + Me.ucrNudColumnFactors.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkDisplaySummaryVariablesAsRow + ' + Me.ucrChkDisplaySummaryVariablesAsRow.AutoSize = True + Me.ucrChkDisplaySummaryVariablesAsRow.Checked = False + Me.ucrChkDisplaySummaryVariablesAsRow.Location = New System.Drawing.Point(11, 73) + Me.ucrChkDisplaySummaryVariablesAsRow.Name = "ucrChkDisplaySummaryVariablesAsRow" + Me.ucrChkDisplaySummaryVariablesAsRow.Size = New System.Drawing.Size(231, 23) + Me.ucrChkDisplaySummaryVariablesAsRow.TabIndex = 17 + ' + 'ucrChkDisplayVariablesAsRows + ' + Me.ucrChkDisplayVariablesAsRows.AutoSize = True + Me.ucrChkDisplayVariablesAsRows.Checked = False + Me.ucrChkDisplayVariablesAsRows.Location = New System.Drawing.Point(11, 97) + Me.ucrChkDisplayVariablesAsRows.Name = "ucrChkDisplayVariablesAsRows" + Me.ucrChkDisplayVariablesAsRows.Size = New System.Drawing.Size(186, 23) + Me.ucrChkDisplayVariablesAsRows.TabIndex = 11 + ' + 'ucrChkDisplaySummariesAsRow + ' + Me.ucrChkDisplaySummariesAsRow.AutoSize = True + Me.ucrChkDisplaySummariesAsRow.Checked = False + Me.ucrChkDisplaySummariesAsRow.Location = New System.Drawing.Point(11, 73) + Me.ucrChkDisplaySummariesAsRow.Name = "ucrChkDisplaySummariesAsRow" + Me.ucrChkDisplaySummariesAsRow.Size = New System.Drawing.Size(175, 23) + Me.ucrChkDisplaySummariesAsRow.TabIndex = 10 + ' + 'ucrNudSigFigs + ' + Me.ucrNudSigFigs.AutoSize = True + Me.ucrNudSigFigs.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSigFigs.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudSigFigs.Location = New System.Drawing.Point(111, 23) + Me.ucrNudSigFigs.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudSigFigs.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSigFigs.Name = "ucrNudSigFigs" + Me.ucrNudSigFigs.Size = New System.Drawing.Size(50, 20) + Me.ucrNudSigFigs.TabIndex = 5 + Me.ucrNudSigFigs.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'ucrChkSummaries ' Me.ucrChkSummaries.AutoSize = True @@ -536,6 +538,15 @@ Partial Class dlgSummaryTables Me.ucrSelectorSummaryTables.Size = New System.Drawing.Size(213, 183) Me.ucrSelectorSummaryTables.TabIndex = 0 ' + 'ucrPnlMargin + ' + Me.ucrPnlMargin.AutoSize = True + Me.ucrPnlMargin.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.ucrPnlMargin.Location = New System.Drawing.Point(6, 14) + Me.ucrPnlMargin.Name = "ucrPnlMargin" + Me.ucrPnlMargin.Size = New System.Drawing.Size(0, 0) + Me.ucrPnlMargin.TabIndex = 13 + ' 'ucrInputFrequencyMarginName ' Me.ucrInputFrequencyMarginName.AddQuotesIfUnrecognised = True @@ -553,6 +564,7 @@ Partial Class dlgSummaryTables Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True Me.ClientSize = New System.Drawing.Size(489, 571) + Me.Controls.Add(Me.cmdMissingOptions) Me.Controls.Add(Me.ucrChkFrequencyDisplayMargins) Me.Controls.Add(Me.grpPercentages) Me.Controls.Add(Me.rdoFrequencyTable) @@ -639,4 +651,5 @@ Partial Class dlgSummaryTables Friend WithEvents lblFrequencyMarginName As Label Friend WithEvents ucrChkFrequencyDisplayMargins As ucrCheck Friend WithEvents ucrReceiverPercentages As ucrReceiverSingle + Friend WithEvents cmdMissingOptions As Button End Class \ No newline at end of file diff --git a/instat/dlgSummaryTables.vb b/instat/dlgSummaryTables.vb index ea4f5b7bdcf..b1e159487fa 100644 --- a/instat/dlgSummaryTables.vb +++ b/instat/dlgSummaryTables.vb @@ -90,6 +90,7 @@ Public Class dlgSummaryTables ucrChkOmitMissing.SetText("Omit Missing Values") ucrChkOmitMissing.SetValuesCheckedAndUnchecked("TRUE", "FALSE") ucrChkOmitMissing.SetRDefault("FALSE") + ucrChkOmitMissing.SetLinkedDisplayControl(cmdMissingOptions) ucrChkDisplayMargins.SetParameter(New RParameter("include_margins", 6)) ucrChkDisplayMargins.SetText("Display Outer Margins") @@ -629,4 +630,14 @@ Public Class dlgSummaryTables ucrReceiverFactors.SetMeAsReceiver() End If End Sub + + Private Sub ucrChkOmitMissing_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkOmitMissing.ControlValueChanged + cmdMissingOptions.Enabled = ucrChkOmitMissing.Checked + End Sub + + Private Sub cmdMissingOptions_Click(sender As Object, e As EventArgs) Handles cmdMissingOptions.Click + sdgMissingOptions.SetRFunction(clsNewSummaryFunction:=clsSummaryDefaultFunction, clsNewConcFunction:=clsConcFunction, bReset:=bResetSubdialog) + bResetSubdialog = False + sdgMissingOptions.ShowDialog() + End Sub End Class \ No newline at end of file From ec5dbd7bc260f093f55f6d3dbe14dc48631a69fc Mon Sep 17 00:00:00 2001 From: MeSophie Date: Fri, 21 Oct 2022 11:15:14 +0100 Subject: [PATCH 055/122] Added some modifications on the Bar and Pie Chart dialog. --- instat/dlgBarAndPieChart.Designer.vb | 61 ++++++++++++++-------------- instat/dlgBarAndPieChart.vb | 33 +++++++++++++-- 2 files changed, 59 insertions(+), 35 deletions(-) diff --git a/instat/dlgBarAndPieChart.Designer.vb b/instat/dlgBarAndPieChart.Designer.vb index 8ea11695b1a..c848bcde7b1 100644 --- a/instat/dlgBarAndPieChart.Designer.vb +++ b/instat/dlgBarAndPieChart.Designer.vb @@ -54,7 +54,6 @@ Partial Class dlgBarAndPieChart Me.lblLollipopSize = New System.Windows.Forms.Label() Me.lblLollipopColour = New System.Windows.Forms.Label() Me.lblReorder = New System.Windows.Forms.Label() - Me.lblReorderX = New System.Windows.Forms.Label() Me.rdoTreeMap = New System.Windows.Forms.RadioButton() Me.lblFill = New System.Windows.Forms.Label() Me.lblArea = New System.Windows.Forms.Label() @@ -67,6 +66,7 @@ Partial Class dlgBarAndPieChart Me.lblWordcloudSize = New System.Windows.Forms.Label() Me.lblWordcloudColor = New System.Windows.Forms.Label() Me.lblWordcloudAngle = New System.Windows.Forms.Label() + Me.ucrChkReorderFrequency = New instat.ucrCheck() Me.ucrChkReorderValue = New instat.ucrCheck() Me.ucrInputPlace = New instat.ucrInputComboBox() Me.ucrInputLayout = New instat.ucrInputComboBox() @@ -91,7 +91,6 @@ Partial Class dlgBarAndPieChart Me.ucrReceiverWordcloudColor = New instat.ucrReceiverSingle() Me.ucrReceiverX = New instat.ucrReceiverSingle() Me.ucrInputReorderX = New instat.ucrInputComboBox() - Me.ucrReceiverWordcloudAngle = New instat.ucrReceiverSingle() Me.ucrChkIncreaseSize = New instat.ucrCheck() Me.ucrInputAddReorder = New instat.ucrInputComboBox() Me.ucrChkAddLabelsText = New instat.ucrCheck() @@ -105,6 +104,7 @@ Partial Class dlgBarAndPieChart Me.ucrChkBacktoback = New instat.ucrCheck() Me.ucrChkPolarCoordinates = New instat.ucrCheck() Me.ucrVariablesAsFactorForBarChart = New instat.ucrVariablesAsFactor() + Me.ucrReceiverWordcloudAngle = New instat.ucrReceiverSingle() Me.SuspendLayout() ' 'lblByFactor @@ -282,16 +282,6 @@ Partial Class dlgBarAndPieChart Me.lblReorder.TabIndex = 36 Me.lblReorder.Text = "Reorder:" ' - 'lblReorderX - ' - Me.lblReorderX.AutoSize = True - Me.lblReorderX.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblReorderX.Location = New System.Drawing.Point(255, 196) - Me.lblReorderX.Name = "lblReorderX" - Me.lblReorderX.Size = New System.Drawing.Size(48, 13) - Me.lblReorderX.TabIndex = 11 - Me.lblReorderX.Text = "Reorder:" - ' 'rdoTreeMap ' Me.rdoTreeMap.Appearance = System.Windows.Forms.Appearance.Button @@ -410,13 +400,22 @@ Partial Class dlgBarAndPieChart Me.lblWordcloudAngle.TabIndex = 21 Me.lblWordcloudAngle.Text = "Angle:" ' + 'ucrChkReorderFrequency + ' + Me.ucrChkReorderFrequency.AutoSize = True + Me.ucrChkReorderFrequency.Checked = False + Me.ucrChkReorderFrequency.Location = New System.Drawing.Point(252, 189) + Me.ucrChkReorderFrequency.Name = "ucrChkReorderFrequency" + Me.ucrChkReorderFrequency.Size = New System.Drawing.Size(125, 23) + Me.ucrChkReorderFrequency.TabIndex = 66 + ' 'ucrChkReorderValue ' Me.ucrChkReorderValue.AutoSize = True Me.ucrChkReorderValue.Checked = False Me.ucrChkReorderValue.Location = New System.Drawing.Point(253, 236) Me.ucrChkReorderValue.Name = "ucrChkReorderValue" - Me.ucrChkReorderValue.Size = New System.Drawing.Size(93, 23) + Me.ucrChkReorderValue.Size = New System.Drawing.Size(119, 23) Me.ucrChkReorderValue.TabIndex = 65 ' 'ucrInputPlace @@ -573,7 +572,7 @@ Partial Class dlgBarAndPieChart Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink Me.ucrBase.Location = New System.Drawing.Point(7, 491) Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(405, 52) + Me.ucrBase.Size = New System.Drawing.Size(408, 52) Me.ucrBase.TabIndex = 60 ' 'ucrPnlOptions @@ -684,19 +683,6 @@ Partial Class dlgBarAndPieChart Me.ucrInputReorderX.Size = New System.Drawing.Size(93, 21) Me.ucrInputReorderX.TabIndex = 12 ' - 'ucrReceiverWordcloudAngle - ' - Me.ucrReceiverWordcloudAngle.AutoSize = True - Me.ucrReceiverWordcloudAngle.frmParent = Me - Me.ucrReceiverWordcloudAngle.Location = New System.Drawing.Point(252, 191) - Me.ucrReceiverWordcloudAngle.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverWordcloudAngle.Name = "ucrReceiverWordcloudAngle" - Me.ucrReceiverWordcloudAngle.Selector = Nothing - Me.ucrReceiverWordcloudAngle.Size = New System.Drawing.Size(120, 21) - Me.ucrReceiverWordcloudAngle.strNcFilePath = "" - Me.ucrReceiverWordcloudAngle.TabIndex = 20 - Me.ucrReceiverWordcloudAngle.ucrSelector = Nothing - ' 'ucrChkIncreaseSize ' Me.ucrChkIncreaseSize.AutoSize = True @@ -823,6 +809,19 @@ Partial Class dlgBarAndPieChart Me.ucrVariablesAsFactorForBarChart.ucrSelector = Nothing Me.ucrVariablesAsFactorForBarChart.ucrVariableSelector = Nothing ' + 'ucrReceiverWordcloudAngle + ' + Me.ucrReceiverWordcloudAngle.AutoSize = True + Me.ucrReceiverWordcloudAngle.frmParent = Me + Me.ucrReceiverWordcloudAngle.Location = New System.Drawing.Point(252, 191) + Me.ucrReceiverWordcloudAngle.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverWordcloudAngle.Name = "ucrReceiverWordcloudAngle" + Me.ucrReceiverWordcloudAngle.Selector = Nothing + Me.ucrReceiverWordcloudAngle.Size = New System.Drawing.Size(120, 21) + Me.ucrReceiverWordcloudAngle.strNcFilePath = "" + Me.ucrReceiverWordcloudAngle.TabIndex = 20 + Me.ucrReceiverWordcloudAngle.ucrSelector = Nothing + ' 'dlgBarAndPieChart ' Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) @@ -830,6 +829,7 @@ Partial Class dlgBarAndPieChart Me.AutoSize = True Me.ClientSize = New System.Drawing.Size(415, 547) Me.Controls.Add(Me.ucrChkReorderValue) + Me.Controls.Add(Me.ucrChkReorderFrequency) Me.Controls.Add(Me.ucrInputPlace) Me.Controls.Add(Me.lblPlace) Me.Controls.Add(Me.ucrInputLayout) @@ -874,9 +874,6 @@ Partial Class dlgBarAndPieChart Me.Controls.Add(Me.lblWordcloudAngle) Me.Controls.Add(Me.ucrInputReorderX) Me.Controls.Add(Me.cmdBarChartOptions) - Me.Controls.Add(Me.lblXvariable) - Me.Controls.Add(Me.ucrReceiverWordcloudAngle) - Me.Controls.Add(Me.lblReorderX) Me.Controls.Add(Me.ucrChkIncreaseSize) Me.Controls.Add(Me.ucrInputAddReorder) Me.Controls.Add(Me.ucrChkAddLabelsText) @@ -893,6 +890,8 @@ Partial Class dlgBarAndPieChart Me.Controls.Add(Me.lblWordcloudLabel) Me.Controls.Add(Me.lblArea) Me.Controls.Add(Me.ucrVariablesAsFactorForBarChart) + Me.Controls.Add(Me.lblXvariable) + Me.Controls.Add(Me.ucrReceiverWordcloudAngle) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.MinimizeBox = False @@ -940,7 +939,6 @@ Partial Class dlgBarAndPieChart Friend WithEvents ucrChkLollipop As ucrCheck Friend WithEvents ucrInputAddReorder As ucrInputComboBox Friend WithEvents lblReorder As Label - Friend WithEvents lblReorderX As Label Friend WithEvents ucrInputReorderX As ucrInputComboBox Friend WithEvents ucrInputReorderValue As ucrInputComboBox Friend WithEvents rdoTreeMap As RadioButton @@ -971,4 +969,5 @@ Partial Class dlgBarAndPieChart Friend WithEvents ucrChkIncreaseSize As ucrCheck Friend WithEvents ucrNudMaxSize As ucrNud Friend WithEvents ucrChkReorderValue As ucrCheck + Friend WithEvents ucrChkReorderFrequency As ucrCheck End Class \ No newline at end of file diff --git a/instat/dlgBarAndPieChart.vb b/instat/dlgBarAndPieChart.vb index 3a172a1cf1a..a92fb425740 100644 --- a/instat/dlgBarAndPieChart.vb +++ b/instat/dlgBarAndPieChart.vb @@ -74,6 +74,7 @@ Public Class dlgBarAndPieChart Private clsGeomTextWordcloudFunction As New RFunction Private clsGeomTextWordcloudAesFunction As New RFunction Private clsScaleSizeAreaFunction As New RFunction + Private clsDummyFunction As New RFunction Private ReadOnly strAscending As String = "Ascending" Private ReadOnly strDescending As String = "Descending" @@ -125,7 +126,7 @@ Public Class dlgBarAndPieChart ucrPnlOptions.AddToLinkedControls({ucrChkFlipCoordinates, ucrChkPolarCoordinates, ucrReceiverByFactor, ucrInputBarChartPositions, ucrChkAddLabelsText, ucrVariablesAsFactorForBarChart, ucrChkBacktoback}, {rdoFrequency, rdoValue}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrPnlOptions.AddToLinkedControls({ucrReceiverX, ucrChkReorderValue, ucrChkLollipop}, {rdoValue}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrPnlOptions.AddToLinkedControls(ucrInputReorderX, {rdoFrequency}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrPnlOptions.AddToLinkedControls(ucrChkReorderFrequency, {rdoFrequency}, bNewLinkedHideIfParameterMissing:=True) ucrPnlOptions.AddToLinkedControls({ucrReceiverArea, ucrReceiverFill, ucrChkLayout, ucrChkStart, ucrChkAddLabelsTreemap}, {rdoTreeMap}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrPnlOptions.AddToLinkedControls({ucrReceiverWordcloudAngle, ucrReceiverWordcloudColor, ucrReceiverWordcloudLabel, ucrReceiverWordcloudSize, ucrChkIncreaseSize}, {rdoWordCloud}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrReceiverByFactor.SetLinkedDisplayControl(lblByFactor) @@ -305,7 +306,6 @@ Public Class dlgBarAndPieChart ucrInputReorderX.SetItems({strAscending, strDescending, strReverse, strNone}) ucrInputReorderX.SetDropDownStyleAsNonEditable() - ucrInputReorderX.SetLinkedDisplayControl(lblReorderX) ucrInputReorderValue.SetItems({strAscending, strDescending, strReverse, strNone}) ucrInputReorderValue.SetDropDownStyleAsNonEditable() @@ -314,6 +314,11 @@ Public Class dlgBarAndPieChart ucrChkReorderValue.AddFunctionNamesCondition(False, "reorder", False) ucrChkReorderValue.AddToLinkedControls(ucrInputReorderValue, {True}, bNewLinkedHideIfParameterMissing:=True) + ucrChkReorderFrequency.SetText("Rorder Frequency") + ucrChkReorderFrequency.SetParameter(New RParameter("Checked", iNewPosition:=0)) + ucrChkReorderFrequency.SetValuesCheckedAndUnchecked("TRUE", "FALSE") + ucrChkReorderFrequency.AddToLinkedControls(ucrInputReorderX, {True}, bNewLinkedHideIfParameterMissing:=True, bNewLinkedAddRemoveParameter:=True) + ucrInputLayout.SetParameter(New RParameter("layout", 2)) dctLayout.Add("Squarified", Chr(34) & "squarified" & Chr(34)) dctLayout.Add("Scol", Chr(34) & "scol" & Chr(34)) @@ -391,6 +396,7 @@ Public Class dlgBarAndPieChart clsGeomTextWordcloudFunction = New RFunction clsGeomTextWordcloudAesFunction = New RFunction clsScaleSizeAreaFunction = New RFunction + clsDummyFunction = New RFunction ucrBarChartSelector.Reset() ucrBarChartSelector.SetGgplotFunction(clsBaseOperator) @@ -409,6 +415,8 @@ Public Class dlgBarAndPieChart rdoPie.Checked = True rdoFrequency.Checked = True + clsDummyFunction.AddParameter("Checked", "FALSE", iPosition:=0) + clsBaseOperator.SetOperation("+") clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) clsBaseOperator.AddParameter("geom_bar", clsRFunctionParameter:=clsRgeomBarFunction, iPosition:=2) @@ -610,6 +618,7 @@ Public Class dlgBarAndPieChart ucrChkAddLabelsTreemap.SetRCode(clsBaseOperator, bReset) ucrNudMaxSize.SetRCode(clsScaleSizeAreaFunction, bReset) ucrChkIncreaseSize.SetRCode(clsScaleSizeAreaFunction, bReset) + ucrChkReorderFrequency.SetRCode(clsDummyFunction, bReset) End Sub Private Sub TestOkEnabled() @@ -718,13 +727,13 @@ Public Class dlgBarAndPieChart ucrChkLollipop.Enabled = If(rdoValue.Checked, True, False) If rdoFrequency.Checked Then If ucrVariablesAsFactorForBarChart.bSingleVariable Then - ucrInputReorderX.Visible = True + 'ucrInputReorderX.Visible = True ucrInputAddReorder.Visible = Not ucrReceiverByFactor.IsEmpty() If Not ucrInputAddReorder.Visible Then ucrInputAddReorder.SetText(strNone) End If Else - ucrInputReorderX.Visible = False + 'ucrInputReorderX.Visible = False ucrInputReorderX.SetText(strNone) End If ElseIf rdoValue.Checked Then @@ -1019,4 +1028,20 @@ Public Class dlgBarAndPieChart clsBaseOperator.RemoveParameterByName("geom_treemap_text") End If End Sub + + Private Sub ucrPnlOptions_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrVariablesAsFactorForBarChart.ControlValueChanged, ucrReceiverX.ControlValueChanged, ucrReceiverLabel.ControlValueChanged, ucrReceiverByFactor.ControlValueChanged, ucrPnlOptions.ControlValueChanged, ucrNudMaxSize.ControlValueChanged, ucrInputReorderX.ControlValueChanged, ucrInputReorderValue.ControlValueChanged, ucrInputAddReorder.ControlValueChanged, ucrChkReorderValue.ControlValueChanged, ucrChkLollipop.ControlValueChanged, ucrChkIncreaseSize.ControlValueChanged, ucrChkAddLabelsText.ControlValueChanged + + End Sub + + Private Sub ucrReceiverByFactor_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverByFactor.ControlContentsChanged, ucrPnlOptions.ControlContentsChanged + + End Sub + + Private Sub ucrReceiverX_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverX.ControlContentsChanged + + End Sub + + Private Sub lblReorder_Click(sender As Object, e As EventArgs) Handles lblReorder.Click + + End Sub End Class \ No newline at end of file From 71357551e6950761337ea68d4d52bd1040f3c016 Mon Sep 17 00:00:00 2001 From: Fidel365 <107605960+Fidel365@users.noreply.github.com> Date: Tue, 25 Oct 2022 10:42:13 +0300 Subject: [PATCH 056/122] Aligniment of controls --- instat/dlgLinePlot.designer.vb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/instat/dlgLinePlot.designer.vb b/instat/dlgLinePlot.designer.vb index ed9d0556e2c..f8840caa6e3 100644 --- a/instat/dlgLinePlot.designer.vb +++ b/instat/dlgLinePlot.designer.vb @@ -897,7 +897,7 @@ Partial Class dlgLinePlot ' Me.ucrReceiverXEnd.AutoSize = True Me.ucrReceiverXEnd.frmParent = Me - Me.ucrReceiverXEnd.Location = New System.Drawing.Point(246, 288) + Me.ucrReceiverXEnd.Location = New System.Drawing.Point(248, 288) Me.ucrReceiverXEnd.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverXEnd.Name = "ucrReceiverXEnd" Me.ucrReceiverXEnd.Selector = Nothing @@ -936,7 +936,7 @@ Partial Class dlgLinePlot ' Me.ucrReceiverSlopeColour.AutoSize = True Me.ucrReceiverSlopeColour.frmParent = Me - Me.ucrReceiverSlopeColour.Location = New System.Drawing.Point(249, 288) + Me.ucrReceiverSlopeColour.Location = New System.Drawing.Point(247, 288) Me.ucrReceiverSlopeColour.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverSlopeColour.Name = "ucrReceiverSlopeColour" Me.ucrReceiverSlopeColour.Selector = Nothing @@ -1069,10 +1069,8 @@ Partial Class dlgLinePlot Me.Controls.Add(Me.lblXVariable) Me.Controls.Add(Me.lblAvailable) Me.Controls.Add(Me.lblXEnd) - Me.Controls.Add(Me.ucrReceiverXEnd) Me.Controls.Add(Me.ucrReceiverSlopeX) Me.Controls.Add(Me.ucrReceiverX) - Me.Controls.Add(Me.ucrReceiverSlopeColour) Me.Controls.Add(Me.ucrFactorOptionalReceiver) Me.Controls.Add(Me.ucrChkSlopeLineOptions) Me.Controls.Add(Me.UcrNudSlopeYTextSize) @@ -1092,6 +1090,8 @@ Partial Class dlgLinePlot Me.Controls.Add(Me.ucrChkValley) Me.Controls.Add(Me.lblSopeTextColour) Me.Controls.Add(Me.lblSlopeLabelColour) + Me.Controls.Add(Me.ucrReceiverXEnd) + Me.Controls.Add(Me.ucrReceiverSlopeColour) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.MinimizeBox = False From d7cde8241273aa7a2ac11f49fd613cf95831aa2d Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Tue, 25 Oct 2022 12:15:25 +0300 Subject: [PATCH 057/122] Removing paramenters when checkbox not checked. --- instat/dlgColumnStats.vb | 4 ++++ instat/dlgDescribeTwoVariable.vb | 10 +++++++++- instat/dlgOneVariableSummarise.vb | 5 ++++- instat/dlgSummaryTables.vb | 9 +++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/instat/dlgColumnStats.vb b/instat/dlgColumnStats.vb index 08683962d35..ddc5d469a6b 100644 --- a/instat/dlgColumnStats.vb +++ b/instat/dlgColumnStats.vb @@ -192,6 +192,10 @@ Public Class dlgColumnStats End If If Not ucrChkOmitMissing.Checked Then clsDefaultFunction.RemoveParameterByName("na_type") + clsDefaultFunction.RemoveParameterByName("na_max_n") + clsDefaultFunction.RemoveParameterByName("na_min_n") + clsDefaultFunction.RemoveParameterByName("na_max_prop") + clsDefaultFunction.RemoveParameterByName("na_consecutive_n") Else clsDefaultFunction.AddParameter("na_type", clsRFunctionParameter:=clsConcFunction, iPosition:=9) End If diff --git a/instat/dlgDescribeTwoVariable.vb b/instat/dlgDescribeTwoVariable.vb index 39f3dffa7eb..f628b431ceb 100644 --- a/instat/dlgDescribeTwoVariable.vb +++ b/instat/dlgDescribeTwoVariable.vb @@ -27,7 +27,6 @@ Public Class dlgDescribeTwoVariable clsSummaryMapFunction, clsCombineMultipleColumnsFunction, clsCombineFactorsFunction, clsMmtableMapFunction, clsHeaderTopLeftSummaryVariableFunction, clsCombineFrequencyFactorParameterFunction, clsSelectFunction, clsRenameCombineFunction As New RFunction - Private clsTempCustomizeFunction As New RFunction Private clsGroupByPipeOperator, clsMmtablePlusOperator, clsMapFrequencyPipeOperator, clsMmtableTildeOperator, clsDataSelectTildeOperator, clsEmptyOperator, clsSecondEmptyOperator As New ROperator Private lstFrequencyParameters As New List(Of String)({"percentage_type", "margin_name", @@ -481,6 +480,15 @@ Public Class dlgDescribeTwoVariable Else clsRCorrelationFunction.RemoveParameterByName("use") End If + If Not ucrChkOmitMissing.Checked Then + clsRCustomSummaryFunction.RemoveParameterByName("na_type") + clsRCustomSummaryFunction.RemoveParameterByName("na_max_n") + clsRCustomSummaryFunction.RemoveParameterByName("na_min_n") + clsRCustomSummaryFunction.RemoveParameterByName("na_max_prop") + clsRCustomSummaryFunction.RemoveParameterByName("na_consecutive_n") + Else + clsRCustomSummaryFunction.AddParameter("na_type", clsRFunctionParameter:=clsCombineFunction, iPosition:=9) + End If MissingOptions() End Sub diff --git a/instat/dlgOneVariableSummarise.vb b/instat/dlgOneVariableSummarise.vb index c714fb0fd51..276c3853f91 100644 --- a/instat/dlgOneVariableSummarise.vb +++ b/instat/dlgOneVariableSummarise.vb @@ -249,10 +249,13 @@ Public Class dlgOneVariableSummarise Private Sub ucrChkOmitMissing_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkOmitMissing.ControlValueChanged If Not ucrChkOmitMissing.Checked Then clsSummaryTableFunction.RemoveParameterByName("na_type") + clsSummaryTableFunction.RemoveParameterByName("na_max_n") + clsSummaryTableFunction.RemoveParameterByName("na_min_n") + clsSummaryTableFunction.RemoveParameterByName("na_max_prop") + clsSummaryTableFunction.RemoveParameterByName("na_consecutive_n") Else clsSummaryTableFunction.AddParameter("na_type", clsRFunctionParameter:=clsConcFunction, iPosition:=9) End If - cmdMissingOptions.Enabled = ucrChkOmitMissing.Checked End Sub diff --git a/instat/dlgSummaryTables.vb b/instat/dlgSummaryTables.vb index b1e159487fa..c0ad319fb5d 100644 --- a/instat/dlgSummaryTables.vb +++ b/instat/dlgSummaryTables.vb @@ -633,6 +633,15 @@ Public Class dlgSummaryTables Private Sub ucrChkOmitMissing_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkOmitMissing.ControlValueChanged cmdMissingOptions.Enabled = ucrChkOmitMissing.Checked + If Not ucrChkOmitMissing.Checked Then + clsSummaryDefaultFunction.RemoveParameterByName("na_type") + clsSummaryDefaultFunction.RemoveParameterByName("na_max_n") + clsSummaryDefaultFunction.RemoveParameterByName("na_min_n") + clsSummaryDefaultFunction.RemoveParameterByName("na_max_prop") + clsSummaryDefaultFunction.RemoveParameterByName("na_consecutive_n") + Else + clsSummaryDefaultFunction.AddParameter("na_type", clsRFunctionParameter:=clsConcFunction, iPosition:=9) + End If End Sub Private Sub cmdMissingOptions_Click(sender As Object, e As EventArgs) Handles cmdMissingOptions.Click From 1be302e76ed4bf903a46373fded4fb40208b710b Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Tue, 25 Oct 2022 15:33:32 +0300 Subject: [PATCH 058/122] making the sub private --- instat/sdgFiltersFromFactor.Designer.vb | 1 - instat/sdgFiltersFromFactor.vb | 18 ------------------ instat/ucrFactor.vb | 2 +- instat/ucrFilter.Designer.vb | 1 - 4 files changed, 1 insertion(+), 21 deletions(-) diff --git a/instat/sdgFiltersFromFactor.Designer.vb b/instat/sdgFiltersFromFactor.Designer.vb index b8bad5f0842..1adf29bbc1e 100644 --- a/instat/sdgFiltersFromFactor.Designer.vb +++ b/instat/sdgFiltersFromFactor.Designer.vb @@ -76,7 +76,6 @@ Partial Class sdgFiltersFromFactor Me.ucrFactorLevels.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle Me.ucrFactorLevels.Location = New System.Drawing.Point(267, 57) Me.ucrFactorLevels.Name = "ucrFactorLevels" - Me.ucrFactorLevels.SelectionControlsVisible = True Me.ucrFactorLevels.Size = New System.Drawing.Size(270, 208) Me.ucrFactorLevels.TabIndex = 1 ' diff --git a/instat/sdgFiltersFromFactor.vb b/instat/sdgFiltersFromFactor.vb index 33d547f9add..91d4bc81285 100644 --- a/instat/sdgFiltersFromFactor.vb +++ b/instat/sdgFiltersFromFactor.vb @@ -76,24 +76,6 @@ Public Class sdgFiltersFromFactor End If End Sub - Private Sub cmdSelectAll_Click(sender As Object, e As EventArgs) Handles cmdSelectAll.Click - ucrFactorLevels.SelectAllGridRows(Not ucrFactorLevels.IsAllGridRowsSelected()) - End Sub - - Private Sub ucrReceiverFactor_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverFactor.ControlValueChanged - cmdSelectAll.Enabled = Not ucrReceiverFactor.IsEmpty - End Sub - - Private Sub ucrFactorLevels_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrFactorLevels.ControlValueChanged - If ucrFactorLevels.IsAllGridRowsSelected() Then - cmdSelectAll.Text = Translations.GetTranslation("Deselect All Levels") - cmdSelectAll.FlatStyle = FlatStyle.Flat - Else - cmdSelectAll.Text = Translations.GetTranslation("Select All Levels") - cmdSelectAll.FlatStyle = FlatStyle.Popup - End If - End Sub - Private Sub ucrSelectorFiltersFromFactors_DataFrameChanged() Handles ucrSelectorFiltersFromFactors.DataFrameChanged clsAddFilterFromFactors.AddParameter("data_name", Chr(34) & ucrSelectorFiltersFromFactors.ucrAvailableDataFrames.cboAvailableDataFrames.Text & Chr(34), iPosition:=0) End Sub diff --git a/instat/ucrFactor.vb b/instat/ucrFactor.vb index 2aa41a0abbd..a420ae9ff46 100644 --- a/instat/ucrFactor.vb +++ b/instat/ucrFactor.vb @@ -137,7 +137,7 @@ Public Class ucrFactor Public Const SelectorColumn As String = "Select" End Structure - Public Property SelectionControlsVisible As Boolean + Private Property SelectionControlsVisible As Boolean Get Return Me.Controls.Contains(pnlSelectOptions) End Get diff --git a/instat/ucrFilter.Designer.vb b/instat/ucrFilter.Designer.vb index ed3075a896b..916cdb7447e 100644 --- a/instat/ucrFilter.Designer.vb +++ b/instat/ucrFilter.Designer.vb @@ -420,7 +420,6 @@ Partial Class ucrFilter Me.ucrFactorLevels.Location = New System.Drawing.Point(398, 65) Me.ucrFactorLevels.Margin = New System.Windows.Forms.Padding(5) Me.ucrFactorLevels.Name = "ucrFactorLevels" - Me.ucrFactorLevels.SelectionControlsVisible = True Me.ucrFactorLevels.Size = New System.Drawing.Size(354, 262) Me.ucrFactorLevels.TabIndex = 2 ' From e72c44041eea6f5647f251f7dcc3f9435f7b942f Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Tue, 25 Oct 2022 18:19:54 +0300 Subject: [PATCH 059/122] minor bug fixes --- instat/dlgMergeAdditionalData.vb | 24 +++++++++++++------ .../static/InstatObject/R/instat_object_R6.R | 10 ++++---- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/instat/dlgMergeAdditionalData.vb b/instat/dlgMergeAdditionalData.vb index da4d4522640..70badb35f6c 100644 --- a/instat/dlgMergeAdditionalData.vb +++ b/instat/dlgMergeAdditionalData.vb @@ -20,7 +20,7 @@ Imports RDotNet Public Class dlgMergeAdditionalData Private bFirstLoad As Boolean = True Private bReset As Boolean = True - Private clsInsertColumnFunction, clsGetColumnsFromData As New RFunction + Private clsInsertColumnFunction, clsGetColumnsFromData, clsListFunction, clsImportDataFunction As New RFunction Private lstJoinColumns As New List(Of String) Private clsLeftJoinFunction As New RFunction Private clsByListFunction As New RFunction @@ -70,6 +70,8 @@ Public Class dlgMergeAdditionalData clsLeftJoinFunction = New RFunction clsByListFunction = New RFunction clsInsertColumnFunction = New RFunction + clsImportDataFunction = New RFunction + clsListFunction = New RFunction clsGetColumnsFromData = New RFunction clsGetVariablesFunction = New RFunction @@ -90,7 +92,12 @@ Public Class dlgMergeAdditionalData clsGetColumnsFromData.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_columns_from_data") clsGetColumnsFromData.AddParameter("use_current_filter", "FALSE", iPosition:=2) - clsInsertColumnFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + + clsListFunction.SetRCommand("list") + + clsImportDataFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_data") + clsImportDataFunction.AddParameter("data_tables", clsRFunctionParameter:=clsListFunction, iPosition:=0) + clsImportDataFunction.AddParameter("prefix", "FALSE", iPosition:=1) SetDataFrameAssign() ucrBase.clsRsyntax.SetBaseRFunction(clsInsertColumnFunction) @@ -133,20 +140,23 @@ Public Class dlgMergeAdditionalData Private Sub SetDataFrameAssign() If clsLeftJoinFunction IsNot Nothing Then - If ucrToDataFrame.cboAvailableDataFrames.Text <> "" Then + Dim strParam As String = ucrToDataFrame.cboAvailableDataFrames.Text + If strParam <> "" Then clsLeftJoinFunction.RemoveAssignTo() If ucrChkSaveDataFrame.Checked Then clsLeftJoinFunction.SetAssignTo(ucrInputSaveDataFrame.GetText, strTempDataframe:=ucrInputSaveDataFrame.GetText) + ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsLeftJoinFunction) ucrBase.clsRsyntax.SetBaseRFunction(clsLeftJoinFunction) ucrInputSaveDataFrame.Visible = True bJoinColsAreUnique = True cmdCheckUnique.Visible = False SetInputCheckVisibility(False) Else - clsLeftJoinFunction.SetAssignTo(ucrToDataFrame.cboAvailableDataFrames.Text) - clsInsertColumnFunction.AddParameter("data_name", Chr(34) & ucrToDataFrame.cboAvailableDataFrames.Text & Chr(34), iPosition:=0) - clsInsertColumnFunction.AddParameter("col_data", clsRFunctionParameter:=clsLeftJoinFunction, iPosition:=1) - ucrBase.clsRsyntax.SetBaseRFunction(clsInsertColumnFunction) + clsLeftJoinFunction.SetAssignTo(strParam) + clsListFunction.ClearParameters() + clsListFunction.AddParameter(strParam, strParam, iPosition:=0) + ucrBase.clsRsyntax.AddToBeforeCodes(clsLeftJoinFunction) + ucrBase.clsRsyntax.SetBaseRFunction(clsImportDataFunction) ucrInputSaveDataFrame.Visible = False cmdCheckUnique.Visible = True End If diff --git a/instat/static/InstatObject/R/instat_object_R6.R b/instat/static/InstatObject/R/instat_object_R6.R index 6ee334f42ac..c5f5cd2138a 100644 --- a/instat/static/InstatObject/R/instat_object_R6.R +++ b/instat/static/InstatObject/R/instat_object_R6.R @@ -53,7 +53,7 @@ DataBook$set("public", "import_data", function(data_tables = list(), data_tables data_tables_column_selections = rep(list(list()),length(data_tables)), imported_from = as.list(rep("",length(data_tables))), data_names = NULL, - messages=TRUE, convert=TRUE, create=TRUE, + messages=TRUE, convert=TRUE, create=TRUE, prefix=TRUE, add_to_graph_book = TRUE) { if (missing(data_tables) || length(data_tables) == 0) { @@ -92,9 +92,11 @@ DataBook$set("public", "import_data", function(data_tables = list(), data_tables for ( i in (1:length(data_tables)) ) { curr_name <- names(data_tables)[[i]] if(is.null(curr_name) && !is.null(data_names)) curr_name <- data_names[i] - if(tolower(curr_name) %in% tolower(names(private$.data_sheets))) { - warning("Cannot have data frames with the same name only differing by case. Data frame will be renamed.") - curr_name <- next_default_item(tolower(curr_name), tolower(names(private$.data_sheets))) + if (prefix){ + if(tolower(curr_name) %in% tolower(names(private$.data_sheets))) { + warning("Cannot have data frames with the same name only differing by case. Data frame will be renamed.") + curr_name <- next_default_item(tolower(curr_name), tolower(names(private$.data_sheets))) + } } new_data = DataSheet$new(data=data_tables[[i]], data_name = curr_name, From 1a0ada8cd8b692088294cf6ab44b7d4a6a182209 Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Wed, 26 Oct 2022 14:36:35 +0300 Subject: [PATCH 060/122] Minor changes --- instat/ucrCalculator.vb | 46 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index 932c0c432ed..d51c8c6268d 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -219,42 +219,42 @@ Public Class ucrCalculator ttCalculator.SetToolTip(cmdChoosez, "computes binomial coefficient choose(n,k) as a big integer. For example, chooseZ(20,2)=190") ttCalculator.SetToolTip(cmdNextPrime, "gives the next prime number. For example, nextprime(14)= 17") ttCalculator.SetToolTip(cmdFactorize, "computes the prime factorizations. For example, prime_factors(20)= (2,5,2,1)") - ttCalculator.SetToolTip(cmdFactorize2, "Compute the prime factorization(s) of integer(s) n. For example, Factorize(21)=c(3, 7, 1, 1)") + ttCalculator.SetToolTip(cmdFactorize2, "compute the prime factorization(s) of integer(s) n. For example, Factorize(21)=c(3, 7, 1, 1)") ttCalculator.SetToolTip(cmdIsPrime, "checks if the number is prime and returns 0 or 2, 0= False, 2= True. For example, is.prime(10) returns 0") ttCalculator.SetToolTip(cmdFibonacci, "generates Fibonacci numbers. For example, Fibonacci(8)=21") ttCalculator.SetToolTip(cmdDivisors, "returns the divisors of x. For example, Divisors(21)= c(1,3,7)") ttCalculator.SetToolTip(cmdRankPercent, "returns the percentile that the number correspods to. For example, PercentRank(c(1,2,5,11,15)) = 0.2,0.4,0.6,0.8,1.0") ttCalculator.SetToolTip(cmdDigitSum, "calculates digit sum of x. For example, DigitSum(12344)= 14") ttCalculator.SetToolTip(cmdBinary, "converts an integer into a binary number. For example,intToBin(c(2,5,7,8))= 10,101,111,1000") - ttCalculator.SetToolTip(cmdOctal, "converts an integer into octal number. For example, intToOct(c(2,5,12,17))= 02,05,14,21") - ttCalculator.SetToolTip(cmdHex, "converts an integer into hexadecimal number. For example, intToHex(c(2,7,10,15)))= 2,7,a,f") - ttCalculator.SetToolTip(cmdOctmode, "converts an integer into a octal number. For example, as.octmode(intToOct(c(2,5,12,17)))= 02,05,14,21") + ttCalculator.SetToolTip(cmdOctal, "converts an integer into an octal number. For example, intToOct(c(2,5,12,17))= 02,05,14,21") + ttCalculator.SetToolTip(cmdHex, "converts an integer into a hexadecimal number. For example, intToHex(c(2,7,10,15)))= 2,7,a,f") + ttCalculator.SetToolTip(cmdOctmode, "converts an integer into an octal number. For example, as.octmode(intToOct(c(2,5,12,17)))= 02,05,14,21") ttCalculator.SetToolTip(cmdHexmode, "converts an integer into a hexadecimal number. For example, as.hexmode(intToHex(c(2,7,10,15)))= 2,7,a,f") ttCalculator.SetToolTip(cmdNthPrime, "gives the n-th prime. For example nth_prime(1000)= 7919") ttCalculator.SetToolTip(cmdGeneratePrimes, "generates the first n prime numbers equal to the number of rows in the data") - ttCalculator.SetToolTip(cmdGCD, "Greatest common divisor, for example gcd(18,42) = 6") - ttCalculator.SetToolTip(cmdSCM, "Smallest common multiple, for example scm(18,42) = 126 (= 718 & 342)") - ttCalculator.SetToolTip(cmdCoprime, "Also called mutually prime, for example coprime(30,77) = TRUE. (30 = 235, 77 = 7*11)") + ttCalculator.SetToolTip(cmdGCD, "greatest common divisor, for example gcd(18,42) = 6") + ttCalculator.SetToolTip(cmdSCM, "smallest common multiple, for example scm(18,42) = 126 (= 718 & 342)") + ttCalculator.SetToolTip(cmdCoprime, "also called mutually prime, for example coprime(30,77) = TRUE. (30 = 235, 77 = 7*11)") ttCalculator.SetToolTip(cmdPhi, "Euler’s Totient Function. For example phi(12) = 4 (1, 2, 5, 7 are less than 12 and coprime)") - ttCalculator.SetToolTip(cmdTwin, "Twin primes, for example, twin(0,10) gives (3,5), & (5,7)") - ttCalculator.SetToolTip(cmdCousin, "Cousin primes, for example cousin(0,20) gives (3,7) & (13,17)") - ttCalculator.SetToolTip(cmdSexy, "Sexy primes (6 in Latin is sex!), for example sexy(0,40) gives (23,29) & (31,37)") - ttCalculator.SetToolTip(cmdThird, "Third cousin primes, for example third(0,100) gives (89,97)") - ttCalculator.SetToolTip(cmdTriplets, "Sexy prime triplets, for example triplets(0,100) gives (47, 53, 59)") + ttCalculator.SetToolTip(cmdTwin, "twin primes, for example, twin(0,10) gives (3,5), & (5,7)") + ttCalculator.SetToolTip(cmdCousin, "cousin primes, for example cousin(0,20) gives (3,7) & (13,17)") + ttCalculator.SetToolTip(cmdSexy, "sexy primes (6 in Latin is sex!), for example sexy(0,40) gives (23,29) & (31,37)") + ttCalculator.SetToolTip(cmdThird, "third cousin primes, for example third(0,100) gives (89,97)") + ttCalculator.SetToolTip(cmdTriplets, "sexy prime triplets, for example triplets(0,100) gives (47, 53, 59)") ttCalculator.SetToolTip(cmdKTuple, "k_tuple general formula for all these keys. For example k_tuple(0, 10, c(0,2)) gives twin primes") - ttCalculator.SetToolTip(cmdRoman, "converts a small(upto 3899) positive integer to Roman numbers. For example as.roman(14)=XIV") - ttCalculator.SetToolTip(cmdPalindrome, "Generate palindromes to the length of the dataframe. For example the 100th palindromic number is 909") - ttCalculator.SetToolTip(cmdFibonacci2, "Generates fibonacci numbers to the length of the data frame. For example the 10th fibonacci number is just 34, but the 50th is much larger, 7778742049") - ttCalculator.SetToolTip(cmdAbundant, "When divisors sum to more than the number. So 12 is less than 1+2+3+4+6 = 16. Opposite is Deficient") - ttCalculator.SetToolTip(cmdPerfect, "Divisors add to the number. So 6 = 1+2+3. Only 51 perfect numbers are currently known.") + ttCalculator.SetToolTip(cmdRoman, "converts a small(up to 3899) positive integer to Roman numbers. For example as.roman(14)=XIV") + ttCalculator.SetToolTip(cmdPalindrome, "generates palindromes to the length of the dataframe. For example the 100th palindromic number is 909") + ttCalculator.SetToolTip(cmdFibonacci2, "generates fibonacci numbers to the length of the data frame. For example the 10th fibonacci number is just 34, but the 50th is much larger, 7778742049") + ttCalculator.SetToolTip(cmdAbundant, "when divisors sum to more than the number. So 12 is less than 1+2+3+4+6 = 16. Opposite is Deficient") + ttCalculator.SetToolTip(cmdPerfect, "divisors add to the number. So 6 = 1+2+3. Only 51 perfect numbers are currently known.") ttCalculator.SetToolTip(cmdFrugal, "125 is frugal because 125 = 5(cubed) and 5 and 3 are fewer digits (2) than 125 (3).") ttCalculator.SetToolTip(cmdPowerful, "36 = 2(squared)*3(squared) is powerful because for each divisor, here 2 and 3, its square is also a divisor.") - ttCalculator.SetToolTip(cmdUgly, "Also called Regular or Hamming or 5-smooth numbers. Numbers for which the factors are only 2, or 3 or 5.") + ttCalculator.SetToolTip(cmdUgly, "also called Regular or Hamming or 5-smooth numbers. Numbers for which the factors are only 2, or 3 or 5.") ttCalculator.SetToolTip(cmdHappy, "13 is happy because 1(squared) + 3(squared) = 10, then 1(squared)+ 0(squared) = 1.") - ttCalculator.SetToolTip(cmdAchilles, "Powerful numbers that are not perfect squares. 72 is the smallest Achilles number.") - ttCalculator.SetToolTip(cmdPadovan, "Sum of last but 1 and last but 2 values. So from ...7, 9, 12, next is 7+9 = 16.") - ttCalculator.SetToolTip(cmdTriangle, " Number of objects in a triangle, so 0, 1, 3, 6, 10...") - ttCalculator.SetToolTip(cmdSquare, "Squares of each integer, so 1, 4, 9, 16.") + ttCalculator.SetToolTip(cmdAchilles, "powerful numbers that are not perfect squares. 72 is the smallest Achilles number.") + ttCalculator.SetToolTip(cmdPadovan, "sum of last but 1 and last but 2 values. So from ...7, 9, 12, next is 7+9 = 16.") + ttCalculator.SetToolTip(cmdTriangle, "number of objects in a triangle, so 0, 1, 3, 6, 10...") + ttCalculator.SetToolTip(cmdSquare, "squares of each integer, so 1, 4, 9, 16.") End Sub @@ -3253,7 +3253,6 @@ Public Class ucrCalculator End Sub Private Sub ZseqFunctions(strRCommand As String) - clsDataFunction.SetRCommand("nrow") clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem) @@ -3264,6 +3263,7 @@ Public Class ucrCalculator ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsZseqFunction.ToScript, 0) End Sub + Private Sub cmdPalindrome_Click(sender As Object, e As EventArgs) Handles cmdPalindrome.Click ZseqFunctions("Palindromic") End Sub From 7e03846f4ecc0e3826ada925a88203877665bc10 Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Wed, 26 Oct 2022 15:10:38 +0300 Subject: [PATCH 061/122] code changes --- instat/dlgHideDataframes.vb | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 63f94c3ac64..200288b64d1 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -99,20 +99,11 @@ Public Class dlgHideDataframes Private Sub TestOKEnabled() If rdoUnhideDataFrame.Checked Then - If Not ucrReceiverMultipleUnhide.IsEmpty Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If + ucrBase.OKEnabled(Not ucrReceiverMultipleUnhide.IsEmpty) Else ' You cannot hide all data frames. When the receiver is blank all data frames are unhidden so this is allowed. - If ucrReceiverMultiple.lstSelectedVariables.Items.Count <> ucrSelectorForDataFrames.lstAvailableVariable.Items.Count Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If + ucrBase.OKEnabled(ucrReceiverMultiple.lstSelectedVariables.Items.Count <> ucrSelectorForDataFrames.lstAvailableVariable.Items.Count) End If - End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -122,7 +113,6 @@ Public Class dlgHideDataframes End Sub Public Sub SetRCodeForControls(bReset As Boolean) - ucrPnlHideUnhide.SetRCode(clsDummyFunction, bReset) ucrReceiverMultiple.SetRCode(clsHideDataFramesFunction, bReset) End Sub From 91ea9fc5a5a97164096965abeb247a8e62448ed5 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Thu, 27 Oct 2022 11:13:48 +0300 Subject: [PATCH 062/122] Fixed bug on displaying big number in data view --- .../static/InstatObject/R/stand_alone_functions.R | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index d54e2e073af..f577a18b6f6 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -23,8 +23,19 @@ convert_to_character_matrix <- function(data, format_decimal_places = TRUE, deci #which are recognised oddly by the R.Net out[, i] <- as.character(data[[i]]) } else { - out[, i] <- - format(data[[i]], digits = decimal_places[i], scientific = is_scientific[i]) + #out[, i] <- + # format(data[[i]], digits = decimal_places[i], scientific = is_scientific[i]) + #out[, i] <- + # format(data[[i]], digits = decimal_places[i], scientific = is_scientific[i]) + temp_data <- c() + for(val in data[[i]]){ + if(nchar(val) > 9){ + temp_data <- append(temp_data, format(val, digits = decimal_places[i], scientific = is_scientific[i])) + }else{ + temp_data <- append(temp_data, val) + } + } + out[, i] <- temp_data } if (!is.null(na_display)) { out[is.na(data[[i]]), i] <- na_display From 1a3326840597baa0a57dac1ec04e08cc6bed0794 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Thu, 27 Oct 2022 11:20:18 +0300 Subject: [PATCH 063/122] minor change --- instat/static/InstatObject/R/stand_alone_functions.R | 2 -- 1 file changed, 2 deletions(-) diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index f577a18b6f6..39211efa5be 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -24,8 +24,6 @@ convert_to_character_matrix <- function(data, format_decimal_places = TRUE, deci out[, i] <- as.character(data[[i]]) } else { #out[, i] <- - # format(data[[i]], digits = decimal_places[i], scientific = is_scientific[i]) - #out[, i] <- # format(data[[i]], digits = decimal_places[i], scientific = is_scientific[i]) temp_data <- c() for(val in data[[i]]){ From 8d8d1f19b6d1ae42fc393a5e1edb6683beeda609 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Thu, 27 Oct 2022 11:43:15 +0300 Subject: [PATCH 064/122] minor bug fixes --- instat/static/InstatObject/R/stand_alone_functions.R | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index 39211efa5be..83809767dbb 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -27,11 +27,12 @@ convert_to_character_matrix <- function(data, format_decimal_places = TRUE, deci # format(data[[i]], digits = decimal_places[i], scientific = is_scientific[i]) temp_data <- c() for(val in data[[i]]){ - if(nchar(val) > 9){ + #if(nchar(val) > 9 && is_scientific[i]){ + # temp_data <- append(temp_data, format(val, digits = decimal_places[i], scientific = is_scientific[i])) temp_data <- append(temp_data, format(val, digits = decimal_places[i], scientific = is_scientific[i])) - }else{ - temp_data <- append(temp_data, val) - } + #}else{ + # temp_data <- append(temp_data, val) + #} } out[, i] <- temp_data } From afac9083ae7f5668a7c8fe0cc963302d5db0e86a Mon Sep 17 00:00:00 2001 From: Sophie Date: Fri, 28 Oct 2022 14:51:23 +0100 Subject: [PATCH 065/122] Minor code modification --- instat/dlgBarAndPieChart.vb | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/instat/dlgBarAndPieChart.vb b/instat/dlgBarAndPieChart.vb index a92fb425740..f966e7ac1e6 100644 --- a/instat/dlgBarAndPieChart.vb +++ b/instat/dlgBarAndPieChart.vb @@ -727,13 +727,11 @@ Public Class dlgBarAndPieChart ucrChkLollipop.Enabled = If(rdoValue.Checked, True, False) If rdoFrequency.Checked Then If ucrVariablesAsFactorForBarChart.bSingleVariable Then - 'ucrInputReorderX.Visible = True ucrInputAddReorder.Visible = Not ucrReceiverByFactor.IsEmpty() If Not ucrInputAddReorder.Visible Then ucrInputAddReorder.SetText(strNone) End If Else - 'ucrInputReorderX.Visible = False ucrInputReorderX.SetText(strNone) End If ElseIf rdoValue.Checked Then @@ -1028,20 +1026,4 @@ Public Class dlgBarAndPieChart clsBaseOperator.RemoveParameterByName("geom_treemap_text") End If End Sub - - Private Sub ucrPnlOptions_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrVariablesAsFactorForBarChart.ControlValueChanged, ucrReceiverX.ControlValueChanged, ucrReceiverLabel.ControlValueChanged, ucrReceiverByFactor.ControlValueChanged, ucrPnlOptions.ControlValueChanged, ucrNudMaxSize.ControlValueChanged, ucrInputReorderX.ControlValueChanged, ucrInputReorderValue.ControlValueChanged, ucrInputAddReorder.ControlValueChanged, ucrChkReorderValue.ControlValueChanged, ucrChkLollipop.ControlValueChanged, ucrChkIncreaseSize.ControlValueChanged, ucrChkAddLabelsText.ControlValueChanged - - End Sub - - Private Sub ucrReceiverByFactor_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverByFactor.ControlContentsChanged, ucrPnlOptions.ControlContentsChanged - - End Sub - - Private Sub ucrReceiverX_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverX.ControlContentsChanged - - End Sub - - Private Sub lblReorder_Click(sender As Object, e As EventArgs) Handles lblReorder.Click - - End Sub End Class \ No newline at end of file From 631f3d5bfc8f921cbb9978a74d9e4e446939e10c Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 31 Oct 2022 09:18:05 +0000 Subject: [PATCH 066/122] New translations r_instat_not_menus.json (French) --- instat/translations/fr/fr_r_instat_not_menus.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/instat/translations/fr/fr_r_instat_not_menus.json b/instat/translations/fr/fr_r_instat_not_menus.json index 4b172a03d21..c6d7ac64f13 100644 --- a/instat/translations/fr/fr_r_instat_not_menus.json +++ b/instat/translations/fr/fr_r_instat_not_menus.json @@ -2270,7 +2270,6 @@ "Save Calculation and Result": "Enregistrer le calcul et le résultat", "Save Column Position": "Enregistrer la position des colonnes", "Save Data As": "Enregistrer les données sous", - "Save Data To:": "Enregistrer les données à:", "Save Date:": "Enregistrer date:", "Save Details": "Enregistrer les détails", "Save Downloaded File To:": "Enregistrer le fichier téléchargé dans:", @@ -2315,6 +2314,7 @@ "Scaled Fractions": "Fractions à l'échelle", "Scaled Points": "Points de mise à l'échelle", "Scales": "Echelles", + "Scale/Distance": "Scale/Distance", "Scatter Matrix": "Matrice de dispersion", "Scatter Plot": "Graphique de dispersion", "Scatter Plot Options": "Options de graphique de dispersion", @@ -3707,6 +3707,7 @@ "Variable Name": "Nom de la Variable", "Variable Label": "Etiquette de la Variable", "Levels": "Niveaux", - "Category": "Catégorie", - "Show Command": "Afficher la commande" + "Category:": "Category:", + "Show Command": "Afficher la commande", + "Lists:": "Lists:" } \ No newline at end of file From 33a6d886818bf1959d40894ba8e8020daca1e72a Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 31 Oct 2022 09:18:06 +0000 Subject: [PATCH 067/122] New translations r_instat_not_menus.json (Spanish) --- instat/translations/es/es_r_instat_not_menus.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/instat/translations/es/es_r_instat_not_menus.json b/instat/translations/es/es_r_instat_not_menus.json index 1d3fc9fc063..a8ac1b241cc 100644 --- a/instat/translations/es/es_r_instat_not_menus.json +++ b/instat/translations/es/es_r_instat_not_menus.json @@ -2270,7 +2270,6 @@ "Save Calculation and Result": "Guardar cálculo y resultado", "Save Column Position": "Guardar posición de columna", "Save Data As": "Guardar datos como", - "Save Data To:": "Guardar datos en:", "Save Date:": "Guarde la fecha:", "Save Details": "Guardar detalles", "Save Downloaded File To:": "Guardar el archivo descargado en:", @@ -2315,6 +2314,7 @@ "Scaled Fractions": "fracciones escaladas", "Scaled Points": "Puntos escalados", "Scales": "Escamas", + "Scale/Distance": "Scale/Distance", "Scatter Matrix": "Matriz de dispersión", "Scatter Plot": "Gráfico de dispersión", "Scatter Plot Options": "Opciones de diagrama de dispersión", @@ -3707,6 +3707,7 @@ "Variable Name": "Variable Name", "Variable Label": "Variable Label", "Levels": "Levels", - "Category": "Category", - "Show Command": "Show Command" + "Category:": "Category:", + "Show Command": "Show Command", + "Lists:": "Lists:" } \ No newline at end of file From 6f5eb2c43ea598370c1f0e4dbc983ad63a6d283a Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 31 Oct 2022 09:18:09 +0000 Subject: [PATCH 068/122] New translations r_instat_not_menus.json (Portuguese) --- instat/translations/pt/pt_r_instat_not_menus.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/instat/translations/pt/pt_r_instat_not_menus.json b/instat/translations/pt/pt_r_instat_not_menus.json index a56ff4a342e..0603a06906a 100644 --- a/instat/translations/pt/pt_r_instat_not_menus.json +++ b/instat/translations/pt/pt_r_instat_not_menus.json @@ -2270,7 +2270,6 @@ "Save Calculation and Result": "Salvar cálculo e resultado", "Save Column Position": "Salvar posição da coluna", "Save Data As": "Salvar dados como", - "Save Data To:": "Salvar Dados para:", "Save Date:": "Data de envio:", "Save Details": "Salvar Detalhes", "Save Downloaded File To:": "Salvar arquivo baixado para:", @@ -2315,6 +2314,7 @@ "Scaled Fractions": "Frações dimensionadas", "Scaled Points": "Pontos de Escala", "Scales": "Escamas", + "Scale/Distance": "Scale/Distance", "Scatter Matrix": "Matriz Scatter", "Scatter Plot": "Gráfico de dispersão", "Scatter Plot Options": "Opções do Scatter Plot", @@ -3707,6 +3707,7 @@ "Variable Name": "Variable Name", "Variable Label": "Variable Label", "Levels": "Levels", - "Category": "Category", - "Show Command": "Show Command" + "Category:": "Category:", + "Show Command": "Show Command", + "Lists:": "Lists:" } \ No newline at end of file From 93f75c5e32103317ef687a10ee8a040d71d55e18 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 31 Oct 2022 09:18:10 +0000 Subject: [PATCH 069/122] New translations r_instat_not_menus.json (Russian) --- instat/translations/ru/ru_r_instat_not_menus.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/instat/translations/ru/ru_r_instat_not_menus.json b/instat/translations/ru/ru_r_instat_not_menus.json index df7be3e527d..d0c85639ae7 100644 --- a/instat/translations/ru/ru_r_instat_not_menus.json +++ b/instat/translations/ru/ru_r_instat_not_menus.json @@ -2270,7 +2270,6 @@ "Save Calculation and Result": "Сохранить расчет и результат", "Save Column Position": "Сохранить положение столбца", "Save Data As": "Сохранить данные как", - "Save Data To:": "Сохранить данные в:", "Save Date:": "Дата сохранения:", "Save Details": "Сохранить детали", "Save Downloaded File To:": "Сохранить загруженный файл в:", @@ -2315,6 +2314,7 @@ "Scaled Fractions": "Масштабированные дроби", "Scaled Points": "Масштабированные точки", "Scales": "Весы", + "Scale/Distance": "Scale/Distance", "Scatter Matrix": "Матрица рассеяния", "Scatter Plot": "Точечная диаграмма", "Scatter Plot Options": "Параметры точечной диаграммы", @@ -3707,6 +3707,7 @@ "Variable Name": "Имя переменной", "Variable Label": "Метка переменной", "Levels": "Уровни", - "Category": "Категория", - "Show Command": "Показать команду" + "Category:": "Category:", + "Show Command": "Показать команду", + "Lists:": "Lists:" } \ No newline at end of file From c54115abbdfc9c302bd41257341aa1726c531bd2 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 31 Oct 2022 09:18:12 +0000 Subject: [PATCH 070/122] New translations r_instat_not_menus.json (Swahili) --- instat/translations/sw/sw_r_instat_not_menus.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/instat/translations/sw/sw_r_instat_not_menus.json b/instat/translations/sw/sw_r_instat_not_menus.json index 07bda5fedb5..3d52adb972b 100644 --- a/instat/translations/sw/sw_r_instat_not_menus.json +++ b/instat/translations/sw/sw_r_instat_not_menus.json @@ -2270,7 +2270,6 @@ "Save Calculation and Result": "Hifadhi Hesabu na Matokeo", "Save Column Position": "Hifadhi Nafasi ya Safu wima", "Save Data As": "Hifadhi Data Kama", - "Save Data To:": "Hifadhi Data Kwa:", "Save Date:": "Hifadhi Tarehe:", "Save Details": "Hifadhi Maelezo", "Save Downloaded File To:": "Hifadhi Faili Iliyopakuliwa Kwa:", @@ -2315,6 +2314,7 @@ "Scaled Fractions": "Scaled Fractions", "Scaled Points": "Scaled Points", "Scales": "Mizani", + "Scale/Distance": "Scale/Distance", "Scatter Matrix": "Scatter Matrix", "Scatter Plot": "Scatter Plot", "Scatter Plot Options": "Scatter Plot Options", @@ -3707,6 +3707,7 @@ "Variable Name": "Variable Name", "Variable Label": "Variable Label", "Levels": "Levels", - "Category": "Category", - "Show Command": "Show Command" + "Category:": "Category:", + "Show Command": "Show Command", + "Lists:": "Lists:" } \ No newline at end of file From d484621563a62e7a68da6716fe65a37e0a0d424f Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Fri, 28 Oct 2022 11:11:29 +0300 Subject: [PATCH 071/122] Adding Import from json function --- instat/dlgImportDataset.vb | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index eb62d0cae0e..8a7398bd38f 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -5,8 +5,9 @@ Imports instat.Translations Public Class dlgImportDataset - Private clsImportTextFileFormats, clsImportCSVFileFormats, clsImportRDS, clsReadRDS, clsImportExcel, clsImport As New RFunction + Private clsImportTextFileFormats, clsImportCSVFileFormats, clsImportRDS, clsReadRDS, clsImportExcel, clsImport, clsImportfromJSON As New RFunction Private clsGetExcelSheetNames As New RFunction + Private clsJsonDataFunction As New RFunction Private clsRangeOperator As New ROperator ''' ''' Ensures that any file paths containing special characters (e.g. accents) are @@ -295,6 +296,8 @@ Public Class dlgImportDataset clsImportExcel = New RFunction clsImport = New RFunction clsReadRDS = New RFunction + clsImportfromJSON = New RFunction + clsJsonDataFunction = New RFunction clsGetExcelSheetNames = New RFunction clsRangeOperator = New ROperator clsEnc2Native = New RFunction @@ -330,6 +333,9 @@ Public Class dlgImportDataset clsReadRDS.SetRCommand("readRDS") clsReadRDS.SetAssignTo("new_RDS") + clsImportfromJSON.SetPackageName("jsonlite") + clsImportfromJSON.SetRCommand("fromJSON") + 'This R command ensures that any file paths containing special characters (e.g. accents) 'are correctly encoded clsEnc2Native.SetRCommand("enc2native") @@ -465,6 +471,7 @@ Public Class dlgImportDataset ucrInputFilePath.AddAdditionalCodeParameterPair(clsImportExcelMulti, New RParameter("file", 0), iAdditionalPairNo:=6) ucrInputFilePath.AddAdditionalCodeParameterPair(clsGetFilesList, New RParameter("path", 0), iAdditionalPairNo:=7) ucrInputFilePath.AddAdditionalCodeParameterPair(clsFileNamesWithExt, New RParameter("path", 0), iAdditionalPairNo:=8) + ucrInputFilePath.AddAdditionalCodeParameterPair(clsImportfromJSON, New RParameter("txt", 0), iAdditionalPairNo:=9) ucrInputFilePath.SetRCode(clsImport, bReset) 'Save control @@ -475,6 +482,7 @@ Public Class dlgImportDataset ucrSaveFile.AddAdditionalRCode(clsImportMultipleFiles, iAdditionalPairNo:=5) ucrSaveFile.AddAdditionalRCode(clsImportMultipleTextFiles, iAdditionalPairNo:=6) ucrSaveFile.AddAdditionalRCode(clsPipeOperator, iAdditionalPairNo:=7) + ucrSaveFile.AddAdditionalRCode(clsJsonDataFunction, iAdditionalPairNo:=8) ucrSaveFile.SetRCode(clsImport, bReset) 'todo. commented temporarily until we are able to add an OR condition for the panel @@ -671,6 +679,8 @@ Public Class dlgImportDataset ucrBase.clsRsyntax.SetBaseRFunction(If(clbSheets.CheckedItems.Count > 1, clsImportExcelMulti, clsImportExcel)) ExcelSheetsPreviewVisible(True) FillExcelSheets() + ElseIf IsJSONFileFormat() Then + ucrBase.clsRsyntax.SetBaseRFunction(clsJsonDataFunction) Else ucrBase.clsRsyntax.SetBaseRFunction(clsImport) End If @@ -772,7 +782,7 @@ Public Class dlgImportDataset bCanImport = False 'grid preview is only supported for a few file formats. It is also not supported for folders - If bImportFromFolder OrElse Not (IsTextFileFormat() OrElse IsCSVFileFormat() OrElse IsExcelFileFormat()) Then + If bImportFromFolder OrElse Not (IsTextFileFormat() OrElse IsCSVFileFormat() OrElse IsExcelFileFormat() OrElse IsJSONFileFormat()) Then lblNoPreview.Show() bCanImport = True 'assume its true if preview is not supported for the file Exit Sub @@ -783,6 +793,8 @@ Public Class dlgImportDataset strRowMaxParamName = If(rdoSeparatortext.Checked, "nrows", "n_max") ElseIf IsCSVFileFormat() Then strRowMaxParamName = "nrows" + ElseIf IsJSONFileFormat() Then + strRowMaxParamName = "nrows" ElseIf IsExcelFileFormat() Then If dctSelectedExcelSheets.Count = 0 Then lblNoPreview.Show() @@ -1198,6 +1210,10 @@ Public Class dlgImportDataset Return {".xlsx", ".xls"}.Contains(strFileExtension) End Function + Private Function IsJSONFileFormat() As Boolean + Return {".json"}.Contains(strFileExtension) + End Function + Private Sub RemoveMissingValues() Dim clsPreviousBaseFunction As RFunction = ucrBase.clsRsyntax.clsBaseFunction If strFileExtension = ".rds" _ From 8a6bf2dccfdca5232223033791701a3902dfe8ef Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Tue, 1 Nov 2022 09:40:45 +0300 Subject: [PATCH 072/122] Few additions --- instat/dlgImportDataset.vb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 8a7398bd38f..2b3d1d782e4 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -7,7 +7,7 @@ Public Class dlgImportDataset Private clsImportTextFileFormats, clsImportCSVFileFormats, clsImportRDS, clsReadRDS, clsImportExcel, clsImport, clsImportfromJSON As New RFunction Private clsGetExcelSheetNames As New RFunction - Private clsJsonDataFunction As New RFunction + Private clsJsonDataFrameFunction As New RFunction Private clsRangeOperator As New ROperator ''' ''' Ensures that any file paths containing special characters (e.g. accents) are @@ -297,7 +297,7 @@ Public Class dlgImportDataset clsImport = New RFunction clsReadRDS = New RFunction clsImportfromJSON = New RFunction - clsJsonDataFunction = New RFunction + clsJsonDataFrameFunction = New RFunction clsGetExcelSheetNames = New RFunction clsRangeOperator = New ROperator clsEnc2Native = New RFunction @@ -336,6 +336,9 @@ Public Class dlgImportDataset clsImportfromJSON.SetPackageName("jsonlite") clsImportfromJSON.SetRCommand("fromJSON") + clsJsonDataFrameFunction.SetRCommand("as.data.frame") + clsJsonDataFrameFunction.AddParameter("x", clsRFunctionParameter:=clsImportfromJSON, iPosition:=0) + 'This R command ensures that any file paths containing special characters (e.g. accents) 'are correctly encoded clsEnc2Native.SetRCommand("enc2native") @@ -482,7 +485,7 @@ Public Class dlgImportDataset ucrSaveFile.AddAdditionalRCode(clsImportMultipleFiles, iAdditionalPairNo:=5) ucrSaveFile.AddAdditionalRCode(clsImportMultipleTextFiles, iAdditionalPairNo:=6) ucrSaveFile.AddAdditionalRCode(clsPipeOperator, iAdditionalPairNo:=7) - ucrSaveFile.AddAdditionalRCode(clsJsonDataFunction, iAdditionalPairNo:=8) + ucrSaveFile.AddAdditionalRCode(clsJsonDataFrameFunction, iAdditionalPairNo:=8) ucrSaveFile.SetRCode(clsImport, bReset) 'todo. commented temporarily until we are able to add an OR condition for the panel @@ -680,7 +683,7 @@ Public Class dlgImportDataset ExcelSheetsPreviewVisible(True) FillExcelSheets() ElseIf IsJSONFileFormat() Then - ucrBase.clsRsyntax.SetBaseRFunction(clsJsonDataFunction) + ucrBase.clsRsyntax.SetBaseRFunction(clsJsonDataFrameFunction) Else ucrBase.clsRsyntax.SetBaseRFunction(clsImport) End If From 06941e9b78bd6fc489c2bc4414cd779b896d1ddb Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Tue, 1 Nov 2022 10:13:57 +0000 Subject: [PATCH 073/122] Update source file r_instat_not_menus.json --- instat/translations/en/r_instat_not_menus.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/instat/translations/en/r_instat_not_menus.json b/instat/translations/en/r_instat_not_menus.json index 972edeb8665..460bc5d3a10 100644 --- a/instat/translations/en/r_instat_not_menus.json +++ b/instat/translations/en/r_instat_not_menus.json @@ -2270,7 +2270,6 @@ "Save Calculation and Result": "Save Calculation and Result", "Save Column Position": "Save Column Position", "Save Data As": "Save Data As", - "Save Data To:": "Save Data To:", "Save Date:": "Save Date:", "Save Details": "Save Details", "Save Downloaded File To:": "Save Downloaded File To:", @@ -2315,6 +2314,7 @@ "Scaled Fractions": "Scaled Fractions", "Scaled Points": "Scaled Points", "Scales": "Scales", + "Scale/Distance": "Scale/Distance", "Scatter Matrix": "Scatter Matrix", "Scatter Plot": "Scatter Plot", "Scatter Plot Options": "Scatter Plot Options", @@ -3707,5 +3707,7 @@ "Variable Name": "Variable Name", "Variable Label": "Variable Label", "Levels": "Levels", - "Category": "Category", - "Show Command": "Show Command"} \ No newline at end of file + "Category:": "Category:", + "Show Command": "Show Command", + "Lists:": "Lists:" +} \ No newline at end of file From 7a1e8036c3fb569213b4f3faa776c214df8a3871 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Tue, 1 Nov 2022 10:14:03 +0000 Subject: [PATCH 074/122] New translations r_instat_not_menus.json (Russian) --- instat/translations/ru/ru_r_instat_not_menus.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instat/translations/ru/ru_r_instat_not_menus.json b/instat/translations/ru/ru_r_instat_not_menus.json index d0c85639ae7..6be3ad3d48d 100644 --- a/instat/translations/ru/ru_r_instat_not_menus.json +++ b/instat/translations/ru/ru_r_instat_not_menus.json @@ -2314,7 +2314,7 @@ "Scaled Fractions": "Масштабированные дроби", "Scaled Points": "Масштабированные точки", "Scales": "Весы", - "Scale/Distance": "Scale/Distance", + "Scale/Distance": "Масштаб/расстояние", "Scatter Matrix": "Матрица рассеяния", "Scatter Plot": "Точечная диаграмма", "Scatter Plot Options": "Параметры точечной диаграммы", @@ -3707,7 +3707,7 @@ "Variable Name": "Имя переменной", "Variable Label": "Метка переменной", "Levels": "Уровни", - "Category:": "Category:", + "Category:": "Категория:", "Show Command": "Показать команду", - "Lists:": "Lists:" + "Lists:": "Списки:" } \ No newline at end of file From 5dd0ce7f93be148386884dc84f238b5441f17820 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Tue, 1 Nov 2022 21:59:47 +0300 Subject: [PATCH 075/122] mionor bug fix --- instat/dlgMergeAdditionalData.vb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/instat/dlgMergeAdditionalData.vb b/instat/dlgMergeAdditionalData.vb index 70badb35f6c..cf5d43ecef7 100644 --- a/instat/dlgMergeAdditionalData.vb +++ b/instat/dlgMergeAdditionalData.vb @@ -145,7 +145,6 @@ Public Class dlgMergeAdditionalData clsLeftJoinFunction.RemoveAssignTo() If ucrChkSaveDataFrame.Checked Then clsLeftJoinFunction.SetAssignTo(ucrInputSaveDataFrame.GetText, strTempDataframe:=ucrInputSaveDataFrame.GetText) - ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsLeftJoinFunction) ucrBase.clsRsyntax.SetBaseRFunction(clsLeftJoinFunction) ucrInputSaveDataFrame.Visible = True bJoinColsAreUnique = True @@ -154,8 +153,7 @@ Public Class dlgMergeAdditionalData Else clsLeftJoinFunction.SetAssignTo(strParam) clsListFunction.ClearParameters() - clsListFunction.AddParameter(strParam, strParam, iPosition:=0) - ucrBase.clsRsyntax.AddToBeforeCodes(clsLeftJoinFunction) + clsListFunction.AddParameter(strParam, clsRFunctionParameter:=clsLeftJoinFunction, iPosition:=0) ucrBase.clsRsyntax.SetBaseRFunction(clsImportDataFunction) ucrInputSaveDataFrame.Visible = False cmdCheckUnique.Visible = True From 3dfcc3a0aad7f05198051b4c284fd218c991c507 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Wed, 2 Nov 2022 14:24:45 +0300 Subject: [PATCH 076/122] added coin, pingr, vcdExtra packages --- instat/static/InstatObject/R/install_packages.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/instat/static/InstatObject/R/install_packages.R b/instat/static/InstatObject/R/install_packages.R index 964d1d8b77e..26ea7553a1b 100644 --- a/instat/static/InstatObject/R/install_packages.R +++ b/instat/static/InstatObject/R/install_packages.R @@ -131,7 +131,10 @@ pkgs <- "statip", # also install mmtable2 from GitHub devtools::install_github("ianmoran11/mmtable2") "corrr", - "dslabs" + "dslabs", + "coin", + "pingr", + "vcdExtra" ) pkgList <- pkgDep(pkgs, type="win.binary", repos = "https://cran.rstudio.com/", suggests = FALSE, includeBasePkgs = FALSE, Rversion = r_version) pth <- "C:/Users/Christopher Marsh/Documents/RPackages" From a23e383ecda2b007a79f2792e5fb5bc0c34f1989 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Wed, 2 Nov 2022 21:28:10 +0000 Subject: [PATCH 077/122] New translations r_instat_not_menus.json (French) --- instat/translations/fr/fr_r_instat_not_menus.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instat/translations/fr/fr_r_instat_not_menus.json b/instat/translations/fr/fr_r_instat_not_menus.json index c6d7ac64f13..5c272d04c8d 100644 --- a/instat/translations/fr/fr_r_instat_not_menus.json +++ b/instat/translations/fr/fr_r_instat_not_menus.json @@ -2314,7 +2314,7 @@ "Scaled Fractions": "Fractions à l'échelle", "Scaled Points": "Points de mise à l'échelle", "Scales": "Echelles", - "Scale/Distance": "Scale/Distance", + "Scale/Distance": "Échelle/Distance", "Scatter Matrix": "Matrice de dispersion", "Scatter Plot": "Graphique de dispersion", "Scatter Plot Options": "Options de graphique de dispersion", @@ -3707,7 +3707,7 @@ "Variable Name": "Nom de la Variable", "Variable Label": "Etiquette de la Variable", "Levels": "Niveaux", - "Category:": "Category:", + "Category:": "Catégorie:", "Show Command": "Afficher la commande", - "Lists:": "Lists:" + "Lists:": "Listes:" } \ No newline at end of file From 31de45aa4c98d61f185df5e6c3934dd25cc525b5 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Fri, 4 Nov 2022 10:54:28 +0300 Subject: [PATCH 078/122] Minor bug fixes --- instat/static/InstatObject/R/stand_alone_functions.R | 9 ++++----- instat/ucrColumnMetadata.vb | 8 +++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index 83809767dbb..200fd6538cc 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -27,12 +27,11 @@ convert_to_character_matrix <- function(data, format_decimal_places = TRUE, deci # format(data[[i]], digits = decimal_places[i], scientific = is_scientific[i]) temp_data <- c() for(val in data[[i]]){ - #if(nchar(val) > 9 && is_scientific[i]){ - # temp_data <- append(temp_data, format(val, digits = decimal_places[i], scientific = is_scientific[i])) + if(nchar(val) > 9 && is.na(is_scientific[i])){ temp_data <- append(temp_data, format(val, digits = decimal_places[i], scientific = is_scientific[i])) - #}else{ - # temp_data <- append(temp_data, val) - #} + } else{ + temp_data <- append(temp_data, format(val, digits = decimal_places[i], scientific = is_scientific[i])) + } } out[, i] <- temp_data } diff --git a/instat/ucrColumnMetadata.vb b/instat/ucrColumnMetadata.vb index c34350ba4e8..ec9e2b28f6b 100644 --- a/instat/ucrColumnMetadata.vb +++ b/instat/ucrColumnMetadata.vb @@ -154,7 +154,7 @@ Public Class ucrColumnMetadata Dim strNameColumn As String Dim iTemp As Integer Dim strNewValue As String - Dim strBooleanValsAllowed As String() = {"T", "TR", "TRU", "TRUE", "F", "FA", "FAL", "FALS", "FALSE"} + Dim strBooleanValsAllowed As String() = {"T", "TR", "TRU", "TRUE", "F", "FA", "FAL", "FALS", "FALSE", "N", "NA"} strNameColumn = _grid.GetCellValue(iRow, strNameLabel) If strNameColumn = "" Then @@ -174,12 +174,14 @@ Public Class ucrColumnMetadata If strBooleanValsAllowed.Contains(newValue) Then If newValue(0) = "F" Then newValue = "FALSE" - Else + ElseIf newValue(0) = "T" Then newValue = "TRUE" + ElseIf newValue(0) = "N" Then + newValue = "NA" End If strNewValue = newValue Else - MsgBox("Type TRUE/T to change to scientific display and FALSE/F back to numeric display", MsgBoxStyle.Information) + MsgBox("Type TRUE/T to change to scientific display and FALSE/F back to numeric display and N or NA for a mixture", MsgBoxStyle.Information) Exit Sub End If Else From 09a6112f0b38f7e11df183a2baa7a4e876de6c5d Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Fri, 4 Nov 2022 10:55:14 +0300 Subject: [PATCH 079/122] minor change --- instat/ucrColumnMetadata.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/ucrColumnMetadata.vb b/instat/ucrColumnMetadata.vb index ec9e2b28f6b..7b9fdf0786b 100644 --- a/instat/ucrColumnMetadata.vb +++ b/instat/ucrColumnMetadata.vb @@ -181,7 +181,7 @@ Public Class ucrColumnMetadata End If strNewValue = newValue Else - MsgBox("Type TRUE/T to change to scientific display and FALSE/F back to numeric display and N or NA for a mixture", MsgBoxStyle.Information) + MsgBox("Type TRUE/T to change to scientific display and FALSE/F back to numeric display and NA/N for a mixture", MsgBoxStyle.Information) Exit Sub End If Else From aea2e734e1237cd1d23d33ceca587dd51ffb6ff7 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sun, 6 Nov 2022 09:29:32 +0000 Subject: [PATCH 080/122] New translations r_instat_not_menus.json (French) --- instat/translations/fr/fr_r_instat_not_menus.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/translations/fr/fr_r_instat_not_menus.json b/instat/translations/fr/fr_r_instat_not_menus.json index 5c272d04c8d..8ca9f20ab0d 100644 --- a/instat/translations/fr/fr_r_instat_not_menus.json +++ b/instat/translations/fr/fr_r_instat_not_menus.json @@ -3675,7 +3675,7 @@ "Use path or step": "Utiliser le chemin ou l'étape", "Smooth options": "Options de lissage", "Add Line": "Ajouter une ligne", - "Add SE": "Ajouter SE", + "Add SE": "Ajouter ES", "Formula": "Formule", "Dumbbell options": "Options d'haltère", "X End Variable:": "Variable de fin de X :", From e3718d3c5c4ee3a0f57b531a98a9d14dfd76edc1 Mon Sep 17 00:00:00 2001 From: lloyddewit Date: Sun, 6 Nov 2022 11:54:05 +0100 Subject: [PATCH 081/122] Merged CrowdIn changes from PR #7943 into translations table in database --- instat/translations/rInstatTranslations.db | Bin 6492160 -> 6496256 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/instat/translations/rInstatTranslations.db b/instat/translations/rInstatTranslations.db index 948090f701fec79a8140f8ee24f3ab2e24a41f95..ef2f9024c0a0e881229c8ebdcd124c4c575ab3b0 100644 GIT binary patch delta 387890 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�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

LT6qZEE4Vo;&#yOg3khWLHR9=D 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

h z++GOl62Zh>MyUITG;1`G>dWdb7!1V0KJitLLv-X$Fl6!A(0jMx9EBs24wI#j`b`9L zSo}LB6r8FSVufachiWL@@;jEryO22QcanA2;CLnv)oN^*Dlk|Oed4^N!qzIMt2fx^ z>gNk*JAiuyU3eRQzAqn95`u+uFMuinJom3G_XOeGLq8v3?%%na;)%(Ia~I{4tl3G; z#7wah2@6rkwAsPO^TcsuQM`T+$7Zq7=? zxL~T`Tut9SAP2vS_CKgx%TqYzK|T~ZE4XS422~CeSVP?<_PN?v;ao{`jwut;g>wZK zG6-}|F62WXch2S4$X#n2$Q`bif!qb;u+sjX^AF7x&ZVFpMRcMbW}QzRW6*K3OeL32 zmttbGg|n18j`P9YS;FiWrIy+Kak_UFW4#att_-L9MB!XQ(I@15Ek;UuWh0(0LjRUf z>QehOeU5N00x_tfnwy~}w)}xlZ_b4@{|^eNm$MKHTSG0=?Ey!Y*(brJ$_YW`AHX3C z=K}iv56TV{@~PpE5=!#W*?J~*fpqqdd?0n^f|g`c=W_cbASP!Hx{hd%%W;N_63%Q| z^bo5foLSWT5bqo(n}Z>-_X@i^;BtoQPptS~2X^pP^9k4j=lG2IeB|>Og!pmZClRV5 z6~g=Drc#sM_&ei5W3Zvm(1w&+Uivo>mSViuCtjz)_Ko-4;aQBFStoSsbaSD6dr3Rf ze0dW@Xe?&=5 z5KcBgig(j>L^tPSI0PAPvzQCFWy}!H8R*YKNcilCiY%Pd$^0jr`h;^DW&TN7iNaL6 z|4&L7c2*i2AC=JY3j5s#jc}&2O$_q*F`Zq%%D!BmDV$TV{FQWJJCrg#tFZn6trUuW z6h~0uOvWaH%xASd2H~TeNfM&=uC`BOu$)Ys;^_S25}Qo`fm=x9tDrir z6wX-0<6u#WGlmX7p_HKzP5nj6+g=YCZ`uY`K*$DUOqHe?rZD4wjL#T%8RHFKAY(+k zVV3>}oU``9oIV-xUxb&2a^eERR6V2e6gj zsad88gsuGJYOhN5cm$w(lx{txWRm_lXu^b3hZ#$!mlgo776_*nxM@ArOeqec#^>0K z%IQH5J|`DILtj59aUaLBO{0$s?BNLH4pfF99i%GR2rY`S$HNrIu?8-~5PAql4gK^I(=G>}p(?2*Cc}?@iUCb1 z7LF>=j5a#akJIDASo?ICCOGWWeU{k|M6?GCddN|LQI^r| z3HIp>2Md5YX3#qc_6R*j$(G)eY4OW3!G??y;mDKXtjq|Q;l1|0GUNGI6z#b7Yy`)E z!u)Z|CL}!$M1YRpnRlAge0qEi`PBI2!?X36_jd1D-jUv(roY3;Zaz5ezZx5j(~Ta6 zHx2h2ZZxbnOfq=u{{s`dJurXKdwt~fB-rf%&o?}O=efc&T=%`MQ@2#-1<_}Vc9Pb^ z0Y5b&MT>&HCt`MkxM_nFLzE3z-JKDDWz+9JU>Ue0i$3^(4P70X0IfZAH3P!?Gm~JFnkyVkm^U4nY|n&F!lBSBA2K0z z%qQ(fay!h!8(XMnvV8&XM-DRtGq`+g+^0TbO5m77mp_s#m~rG|1#U79HV&UmEsxuw zhK>~u)__c-?;=@9nk^i&sQzQ-P8~>y@-Zs}95YD$3ES2>reo(Uea)o{A%tR(;BrHI6BC z(3y%6plm+?2-5@f%1EpBX`8p-X3KRhBFbvsUr0pxSQO+ z8qo=4D85MHhy$c0(_vqGC`9y*2^9Ca-1M=4@l?R#M$({ zpFI%~KONz;rI(G39bxhacFwURoc8*I4+7#0CG|yR1%?qqt1dEybOh6$i%LG84w5+H z_5k3BdBPEht4ew|z@8rNFC6UY2zd(k?boga2!}s?_q_tKiNlZdSC#o_#TTQ8>?jat zDeOU53SU)XFzw^m@@*D<|I?B6#WzgYys&;O%?qaXV0+?hOr8-PgwUdH-MVWi?85CAI*?od zedNFtm{;7o#ze_GYlTBk?LR7YXwM7ZE1=aOz-_=3o)k79F~5%H4zOU%p{3pK8V`D4 zKuK*kYT8sct8+bk{-Al&r_-m=r_^V*Pl)C*q(SfTehFCOM$PTsb>0Q;5ON+f5k&5B z(=9N{U9Q=s*O{i7qD|wBKYPR>NlLHr9Rvn>$l?#<{w>A|W0rBErrg6|_}=io;YGs< z^Qhq#Lo2-GvkeKF`I>L_1Nu+&?Jw(3n0xgC4txvrll4KCWP`ugRj<#z-tv0d{F>KM za3GtYpvf`iA-6%CSAdtN=Oy!T&oe+m&7Osx8Rk1ZCwYb;kJYH|D|5Tt8ZMxOEEM1~*oOux<=3YcX-KVs_w|u4T&~8Q)l6;>f(*G z>pPq&Ro{F~4ZfBr%JH=zb=v4MzRJP<{d5S`y1FfD?^`H2)DlKjVV3Y15vq~cx)7Xs+T03@hZ!S(fOfF%g?)=#EDOC;_WL%M50{=AF3uXmh3 z!Oj1NngfwWTQ$0b?m)p$b#a#kTgKgs1b*U6dMD7b08cFDLNuiZS>o}LoybXSiIyYj zqmx0hjUtG5Wg9zwZG*E6e)Dhg3AP~D+~^{ji$a*{;`Sh5tm`v)E#)CU`32n#i;1we{P{ zFcL&np>oO!>8?=j(#36bF4W@B(|L)mhFVI)d|pz8UGLd%Awc!g-x&ge>FzMgRCJ_( z-UyQm(ngoUEdH_&7in_1obd&;2nEde*6TCQ0L3Hhr9ul9%{y2cB<~oRO-kSQ2 zdC_m@4ZyVjf2M)o{+#AUSRyDe0%_4zqj`K~!ysB2{xBck^w22tE}sD!aX*)@kjoIx z#%|z83!hPQq$LA4bGQ&nuSHsTvu(b%C-B6l6dxr=m`$r?;UeU9QI;S*?tNm(R2`y! zpxR3{niU4FfGm@}r&?7Pn{X!r^Cov3JMD7NE_W7N)i)nA%!V*r2F77r2d+iQb%%8yw#nETCdnoq&iqR<@T^E7;~6OrHZJ?}FJ z@U+*v$~)IP#^i+YWVI>FWClNYkFg0-m~n>h45tjuh73cvL8X5a{?>N=M1%)DO`=VO+I9NhEvdtJFgFULbN(N38C7<2yg2)L`F6te)%cbTn65FjuX55FF6G-qM-`|l4(-|;il8RP#j5cv`|sZ zAfK9t+vVZ!yHFhdW{csybl)IUs$zH#*1M6eegk3mw}b4rGQ67uYfq-MZ&yaqf+5%{ zis4=Kz>u;Dg`H#?W+}(8JR2q-iLf^rHjCly{7N*va-uStz8mJF>hKLT&%v6a;cdXH ziDZqm2O+TJa2sD`H`KG7QqpJ`yYS(I*@1L1ypeNb3+Qw{{V5X8Q!~VHEBd~W zdLzNu1c~7mTI^JU@r}(??^GsE7Q@Yu2u#VYZ>{BIrOXvP0u!2joSp=sat>YCmoZHY zb9}mmbSMf2IFVwwk-l*7MBtbErvHS)0T~N#;qK0mm5GNTr>i1B}NQyq+Az^ zBZlj#!KK`d9&W(I6;aItK7JH3!sqPa^`wljcyM?fb&ar$Ww?&M8)50{@LEb6p-*N)EKP+wIB-wKXO{cAZ*4BIL9 zCpJ?WuB4qmv2=NOHFf>O(vRU)QI>Hfw|!UVXco9{q zZ9%xd5N}3g*R<7ca67-8y>RpS7qHZYbV$vifQJhJ0VVXk7tVWA#P9+M9T)VFW@nU& z;e4FLZ=n6T?z%1uio3dji%R3J505vNhYK5BP2q&72IQjF%atiONR4? z$G|gA2Ilz`AtWpH^S~y00{c9Vw82=kcBg zd2I10@(6=f_ib?X8mD>{+4nAJ{-mjdtT$B?T6*IvMLe618~2!Kn%~N zm$WwCL8rGbMF)+x z^yy-FGFCq^ds*4CB6RN<@)jM1A>J|kztdX`PhxdNc3BxVU|AU;H4zUd)8a2GgY*EL z1R#NOYWbpaPPj!3$4d!rG3zppqJf8i87Hz`R~ViDqH+_XojBTSvPJoc;R&)?R(oXU z}cr(UOFP=al`iQqJCO`~Z@nlezv_6C7Gd!AxqiB}54RXWbNGuOR);$R_ z-0Wl1QAJ-RQp$_r2s(*(@jy6sJ_6|WRYq###c&w8ylrsJ9Y)emXz)V6tc-^j-Easd ztC_Br_yln)kP{AbSlMZaHdPrJj2Q@G1x=Q8H9CJ5pAW>INTiEjRt6{eieZ^#EUT@! z4TC-md<%CZvlwPOx`3=U&TGa0vCw`LW46K7V%QfOGMnoEQ<(tG`S5taMkYP*pUN0U zB;)8QvklV4VGCU_+fvbIGwvs6wbs>a;)Aj~F9NVK{Nj)u0hEC=qL)xne`VSPbcQou zM`X2TaXP=l*r2rcV;L2Cfle)xPkQ}uY|1h*tV4BtR`XU^TQHe<0L1HgHWP$z3;6n#^5pteX1t7+|B$OI&YRrK6lu~D&N zh!c?|W;M%9iHBkJ4xEIKojrdB!Rhx(vfBRN${=j9p*`*|H`Q%r|5`ljK4K%@s2JK! zDR;+CE*3+(&>Xtg;5N77J;-t7Ui1?~I|0-YS#ag&Nj{9~JI?Y+9&z6Y6l#L!mSbPtli ziJ>h3o_Un{b!7~slS8e%y43u2Ww4iz+NqkZ_9L%qpH;{ zR4@Me_avQb}gpM=Gtjq zqN@mEhD=K9SrbgtEVU8SMAss2#+uO3+>~ft*LtnsFS5 z-XmJAk->j#pB07Cziugv(0W9x{z?P46k0=3dJrQHDMfC?Ms&{oi`tvXc57h*Ke?J3 zZY`XEW>iR+0_jTh)L97mc57h}#jo|5sP(v8l|kR%S~!aqul1Rw2M7FvG`2bZB%<-} zxvek=<5P9hy|)!k;L<(x%58;6V6IYC%hnFRQxZg$gM|TnGl>!o7A61#9Ic0;6k^$K zniT$*N7wqSFi8Wo9M!Wb%gdI-mSTi1coFuaYs}MpeuSE&7-nggV3bzn9e_AQdrZm3 z9&p0DzzHW9HHHrie>Lnhlo^td0QObn4qK>?@Ol<8{?ZU^sNHj|?nmA2I-B;Y_8qtt zRcT?dqV++*(_W8mk7keAuo3?V%Et8Na2zr~+^`uQMhU7fRL??_V${5*IiM-iL_iDq z3>*X(BOQoC)wN??Ywo&rAWpRa^-1)f2{x$MhZ3O?siA*-UO68IAwvmN5od#*VJMz< z#@XVKnqi_2Ds~Ii{39%g&c@lGP9BN_(kr94dn;3*CL5YSb0*rr!VSez^F&)9UWw67 zV=wZSG7I8*O|(IOH3a4d;QP|W$}reC4Oz($&xC6zijw1P&;kr0x_3PD0z*jX6mNrE zYbcz)jc4pW6h`9`Z2s8CoZ&GnvuSt9$uxItspsu^ zC$_e<5kLPIZ2TbHjm~Vc!Z=1UT`W?UX}NO5P#_νrqk0rMivlVk`21XApyu(Q7HTTs*py%u{T@ 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

v!rnux=IU?DpVYf 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

  • kHH+3hj%kZw^Q6uv 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 PX*M3^4lCt3)8_sk-EI+Y From 26f10d5e12f519610c8bd17c08f0588dea953d7e Mon Sep 17 00:00:00 2001 From: N-thony Date: Sun, 6 Nov 2022 15:22:53 +0300 Subject: [PATCH 082/122] Update instat/static/InstatObject/R/stand_alone_functions.R Co-authored-by: lloyddewit <57253949+lloyddewit@users.noreply.github.com> --- instat/static/InstatObject/R/stand_alone_functions.R | 2 -- 1 file changed, 2 deletions(-) diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index 200fd6538cc..6ad77ae5e74 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -23,8 +23,6 @@ convert_to_character_matrix <- function(data, format_decimal_places = TRUE, deci #which are recognised oddly by the R.Net out[, i] <- as.character(data[[i]]) } else { - #out[, i] <- - # format(data[[i]], digits = decimal_places[i], scientific = is_scientific[i]) temp_data <- c() for(val in data[[i]]){ if(nchar(val) > 9 && is.na(is_scientific[i])){ From 2462e0f6074aac27e81436a2d73de27e96a76328 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Mon, 7 Nov 2022 09:34:21 +0300 Subject: [PATCH 083/122] minor code change --- .../static/InstatObject/R/stand_alone_functions.R | 6 +----- instat/ucrColumnMetadata.vb | 15 ++++++++------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index 6ad77ae5e74..e7966982005 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -25,11 +25,7 @@ convert_to_character_matrix <- function(data, format_decimal_places = TRUE, deci } else { temp_data <- c() for(val in data[[i]]){ - if(nchar(val) > 9 && is.na(is_scientific[i])){ - temp_data <- append(temp_data, format(val, digits = decimal_places[i], scientific = is_scientific[i])) - } else{ - temp_data <- append(temp_data, format(val, digits = decimal_places[i], scientific = is_scientific[i])) - } + temp_data <- append(temp_data, format(val, digits = decimal_places[i], scientific = is_scientific[i])) } out[, i] <- temp_data } diff --git a/instat/ucrColumnMetadata.vb b/instat/ucrColumnMetadata.vb index 7b9fdf0786b..c4f6985a4aa 100644 --- a/instat/ucrColumnMetadata.vb +++ b/instat/ucrColumnMetadata.vb @@ -172,13 +172,14 @@ Public Class ucrColumnMetadata ElseIf strColumnName = strLabelsScientific Then newValue = newValue.ToString.ToUpper If strBooleanValsAllowed.Contains(newValue) Then - If newValue(0) = "F" Then - newValue = "FALSE" - ElseIf newValue(0) = "T" Then - newValue = "TRUE" - ElseIf newValue(0) = "N" Then - newValue = "NA" - End If + Select Case newValue(0) + Case "F" + newValue = "FALSE" + Case "T" + newValue = "TRUE" + Case "N" + newValue = "NA" + End Select strNewValue = newValue Else MsgBox("Type TRUE/T to change to scientific display and FALSE/F back to numeric display and NA/N for a mixture", MsgBoxStyle.Information) From b722738b8bb5d4d2a518ae8a28dec894fd856e98 Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Mon, 7 Nov 2022 12:13:17 +0300 Subject: [PATCH 084/122] Added 2 keys to the Transform keyboard. --- instat/dlgCalculator.vb | 2 +- instat/ucrCalculator.Designer.vb | 699 +++++++++++++++++-------------- instat/ucrCalculator.resx | 3 + instat/ucrCalculator.vb | 118 ++++-- 4 files changed, 465 insertions(+), 357 deletions(-) diff --git a/instat/dlgCalculator.vb b/instat/dlgCalculator.vb index 2eda94003d0..2e1203f7f9d 100644 --- a/instat/dlgCalculator.vb +++ b/instat/dlgCalculator.vb @@ -172,7 +172,7 @@ Public Class dlgCalculator Me.Width = iBasicWidth * 1.37 ucrBase.iHelpTopicID = 130 Case "Transform" - Me.Width = iBasicWidth * 1.37 + Me.Width = iBasicWidth * 1.48 ucrBase.iHelpTopicID = 166 Case "Circular" Me.Width = iBasicWidth * 1.36 diff --git a/instat/ucrCalculator.Designer.vb b/instat/ucrCalculator.Designer.vb index d276870ee5d..e5c15390547 100644 --- a/instat/ucrCalculator.Designer.vb +++ b/instat/ucrCalculator.Designer.vb @@ -83,6 +83,22 @@ Partial Class ucrCalculator Me.cmdYmd = New System.Windows.Forms.Button() Me.cmdLeap = New System.Windows.Forms.Button() Me.grpInteger = New System.Windows.Forms.GroupBox() + Me.cmdFactorize2 = New System.Windows.Forms.Button() + Me.cmdSquare = New System.Windows.Forms.Button() + Me.cmdTriangle = New System.Windows.Forms.Button() + Me.cmdPadovan = New System.Windows.Forms.Button() + Me.cmdAchilles = New System.Windows.Forms.Button() + Me.cmdHappy = New System.Windows.Forms.Button() + Me.cmdUgly = New System.Windows.Forms.Button() + Me.cmdPowerful = New System.Windows.Forms.Button() + Me.cmdFrugal = New System.Windows.Forms.Button() + Me.cmdPerfect = New System.Windows.Forms.Button() + Me.cmdAbundant = New System.Windows.Forms.Button() + Me.cmdFibonacci2 = New System.Windows.Forms.Button() + Me.cmdPalindrome = New System.Windows.Forms.Button() + Me.cmdRoman = New System.Windows.Forms.Button() + Me.cmdHexmode = New System.Windows.Forms.Button() + Me.cmdOctmode = New System.Windows.Forms.Button() Me.cmdKTuple = New System.Windows.Forms.Button() Me.cmdTriplets = New System.Windows.Forms.Button() Me.cmdThird = New System.Windows.Forms.Button() @@ -96,9 +112,12 @@ Partial Class ucrCalculator Me.cmdGeneratePrimes = New System.Windows.Forms.Button() Me.cmdNthPrime = New System.Windows.Forms.Button() Me.ContextMenuStripInteger = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.GmpToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.DescToolsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.RutilsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.PrimesToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ZseqToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.UtilsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.cmdHex = New System.Windows.Forms.Button() Me.cmdOctal = New System.Windows.Forms.Button() Me.cmdBinary = New System.Windows.Forms.Button() @@ -303,8 +322,6 @@ Partial Class ucrCalculator Me.cmdBeta = New System.Windows.Forms.Button() Me.cmdDigamma = New System.Windows.Forms.Button() Me.grpTransform = New System.Windows.Forms.GroupBox() - Me.cmdHelpZoo = New System.Windows.Forms.Button() - Me.cmdHelpDplyr = New System.Windows.Forms.Button() Me.cmdSortF = New System.Windows.Forms.Button() Me.cmdNasplin = New System.Windows.Forms.Button() Me.cmdNaapprox = New System.Windows.Forms.Button() @@ -314,7 +331,7 @@ Partial Class ucrCalculator Me.cmdRowRank = New System.Windows.Forms.Button() Me.cmdDiff = New System.Windows.Forms.Button() Me.cmdCumdist = New System.Windows.Forms.Button() - Me.cmdmovemean = New System.Windows.Forms.Button() + Me.cmdMovMean = New System.Windows.Forms.Button() Me.cmdCumMean = New System.Windows.Forms.Button() Me.cmdNtile = New System.Windows.Forms.Button() Me.cmMovMed = New System.Windows.Forms.Button() @@ -322,12 +339,12 @@ Partial Class ucrCalculator Me.cmdDRank = New System.Windows.Forms.Button() Me.cmdMovMax = New System.Windows.Forms.Button() Me.cmdMovSum = New System.Windows.Forms.Button() - Me.cmdpercentrank = New System.Windows.Forms.Button() - Me.cmdcumsum = New System.Windows.Forms.Button() - Me.cmdcummin = New System.Windows.Forms.Button() - Me.cmdcummax = New System.Windows.Forms.Button() + Me.cmdPercentRank = New System.Windows.Forms.Button() + Me.cmdCumSum = New System.Windows.Forms.Button() + Me.cmdCumMin = New System.Windows.Forms.Button() + Me.cmdCumMax = New System.Windows.Forms.Button() Me.cmdPMin = New System.Windows.Forms.Button() - Me.cmdpmax = New System.Windows.Forms.Button() + Me.cmdPMax = New System.Windows.Forms.Button() Me.cmdLead = New System.Windows.Forms.Button() Me.cmdLag = New System.Windows.Forms.Button() Me.grpLogical = New System.Windows.Forms.GroupBox() @@ -431,31 +448,20 @@ Partial Class ucrCalculator Me.cmdbegin = New System.Windows.Forms.Button() Me.cmdAny1 = New System.Windows.Forms.Button() Me.cmdStringRHelp = New System.Windows.Forms.Button() - Me.cmdOctmode = New System.Windows.Forms.Button() - Me.cmdHexmode = New System.Windows.Forms.Button() - Me.cmdRoman = New System.Windows.Forms.Button() - Me.cmdPalindrome = New System.Windows.Forms.Button() - Me.cmdFibonacci2 = New System.Windows.Forms.Button() - Me.cmdAbundant = New System.Windows.Forms.Button() - Me.cmdPerfect = New System.Windows.Forms.Button() - Me.cmdFrugal = New System.Windows.Forms.Button() - Me.cmdPowerful = New System.Windows.Forms.Button() - Me.cmdUgly = New System.Windows.Forms.Button() - Me.cmdHappy = New System.Windows.Forms.Button() - Me.cmdAchilles = New System.Windows.Forms.Button() - Me.cmdPadovan = New System.Windows.Forms.Button() - Me.cmdTriangle = New System.Windows.Forms.Button() - Me.cmdSquare = New System.Windows.Forms.Button() - Me.cmdFactorize2 = New System.Windows.Forms.Button() - Me.ZseqToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() - Me.GmpToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() - Me.UtilsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.cmdCumProd = New System.Windows.Forms.Button() + Me.cmdMovProd = New System.Windows.Forms.Button() + Me.cmdRev = New System.Windows.Forms.Button() Me.cmdIntegerRHelp = New instat.ucrSplitButton() Me.ucrSaveResultInto = New instat.ucrSave() Me.ucrTryCalculator = New instat.ucrTry() Me.ucrInputCalOptions = New instat.ucrInputComboBox() Me.ucrSelectorForCalculations = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrReceiverForCalculation = New instat.ucrReceiverExpression() + Me.cmdTransformRHelp = New instat.ucrSplitButton() + Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.BaseToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.DplyrToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ZooToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.grpBasic.SuspendLayout() Me.grpDates.SuspendLayout() Me.grpInteger.SuspendLayout() @@ -472,6 +478,7 @@ Partial Class ucrCalculator Me.grpCircular.SuspendLayout() Me.grpModifier.SuspendLayout() Me.grpSymbols.SuspendLayout() + Me.ContextMenuStrip1.SuspendLayout() Me.SuspendLayout() ' 'lblExpression @@ -1039,6 +1046,165 @@ Partial Class ucrCalculator Me.grpInteger.TabStop = False Me.grpInteger.Text = "Integer" ' + 'cmdFactorize2 + ' + Me.cmdFactorize2.Location = New System.Drawing.Point(149, 39) + Me.cmdFactorize2.Name = "cmdFactorize2" + Me.cmdFactorize2.Size = New System.Drawing.Size(75, 23) + Me.cmdFactorize2.TabIndex = 44 + Me.cmdFactorize2.Text = "factorize2" + Me.cmdFactorize2.UseVisualStyleBackColor = True + ' + 'cmdSquare + ' + Me.cmdSquare.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdSquare.Location = New System.Drawing.Point(223, 257) + Me.cmdSquare.Name = "cmdSquare" + Me.cmdSquare.Size = New System.Drawing.Size(75, 23) + Me.cmdSquare.TabIndex = 43 + Me.cmdSquare.Text = "square" + Me.cmdSquare.UseVisualStyleBackColor = True + ' + 'cmdTriangle + ' + Me.cmdTriangle.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdTriangle.Location = New System.Drawing.Point(149, 257) + Me.cmdTriangle.Name = "cmdTriangle" + Me.cmdTriangle.Size = New System.Drawing.Size(75, 23) + Me.cmdTriangle.TabIndex = 42 + Me.cmdTriangle.Text = "triangle" + Me.cmdTriangle.UseVisualStyleBackColor = True + ' + 'cmdPadovan + ' + Me.cmdPadovan.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdPadovan.Location = New System.Drawing.Point(75, 257) + Me.cmdPadovan.Name = "cmdPadovan" + Me.cmdPadovan.Size = New System.Drawing.Size(75, 23) + Me.cmdPadovan.TabIndex = 41 + Me.cmdPadovan.Text = "padovan" + Me.cmdPadovan.UseVisualStyleBackColor = True + ' + 'cmdAchilles + ' + Me.cmdAchilles.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdAchilles.Location = New System.Drawing.Point(1, 257) + Me.cmdAchilles.Name = "cmdAchilles" + Me.cmdAchilles.Size = New System.Drawing.Size(75, 23) + Me.cmdAchilles.TabIndex = 40 + Me.cmdAchilles.Text = "achilles" + Me.cmdAchilles.UseVisualStyleBackColor = True + ' + 'cmdHappy + ' + Me.cmdHappy.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdHappy.Location = New System.Drawing.Point(223, 235) + Me.cmdHappy.Name = "cmdHappy" + Me.cmdHappy.Size = New System.Drawing.Size(75, 23) + Me.cmdHappy.TabIndex = 39 + Me.cmdHappy.Text = "happy" + Me.cmdHappy.UseVisualStyleBackColor = True + ' + 'cmdUgly + ' + Me.cmdUgly.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdUgly.Location = New System.Drawing.Point(149, 235) + Me.cmdUgly.Name = "cmdUgly" + Me.cmdUgly.Size = New System.Drawing.Size(75, 23) + Me.cmdUgly.TabIndex = 38 + Me.cmdUgly.Text = "ugly" + Me.cmdUgly.UseVisualStyleBackColor = True + ' + 'cmdPowerful + ' + Me.cmdPowerful.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdPowerful.Location = New System.Drawing.Point(75, 235) + Me.cmdPowerful.Name = "cmdPowerful" + Me.cmdPowerful.Size = New System.Drawing.Size(75, 23) + Me.cmdPowerful.TabIndex = 37 + Me.cmdPowerful.Text = "powerful" + Me.cmdPowerful.UseVisualStyleBackColor = True + ' + 'cmdFrugal + ' + Me.cmdFrugal.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFrugal.Location = New System.Drawing.Point(1, 235) + Me.cmdFrugal.Name = "cmdFrugal" + Me.cmdFrugal.Size = New System.Drawing.Size(75, 23) + Me.cmdFrugal.TabIndex = 36 + Me.cmdFrugal.Text = "frugal" + Me.cmdFrugal.UseVisualStyleBackColor = True + ' + 'cmdPerfect + ' + Me.cmdPerfect.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdPerfect.Location = New System.Drawing.Point(223, 213) + Me.cmdPerfect.Name = "cmdPerfect" + Me.cmdPerfect.Size = New System.Drawing.Size(75, 23) + Me.cmdPerfect.TabIndex = 35 + Me.cmdPerfect.Text = "perfect" + Me.cmdPerfect.UseVisualStyleBackColor = True + ' + 'cmdAbundant + ' + Me.cmdAbundant.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdAbundant.Location = New System.Drawing.Point(149, 213) + Me.cmdAbundant.Name = "cmdAbundant" + Me.cmdAbundant.Size = New System.Drawing.Size(75, 23) + Me.cmdAbundant.TabIndex = 34 + Me.cmdAbundant.Text = "abundant" + Me.cmdAbundant.UseVisualStyleBackColor = True + ' + 'cmdFibonacci2 + ' + Me.cmdFibonacci2.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFibonacci2.Location = New System.Drawing.Point(75, 213) + Me.cmdFibonacci2.Name = "cmdFibonacci2" + Me.cmdFibonacci2.Size = New System.Drawing.Size(75, 23) + Me.cmdFibonacci2.TabIndex = 33 + Me.cmdFibonacci2.Text = "fibonacci2" + Me.cmdFibonacci2.UseVisualStyleBackColor = True + ' + 'cmdPalindrome + ' + Me.cmdPalindrome.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdPalindrome.Location = New System.Drawing.Point(1, 213) + Me.cmdPalindrome.Name = "cmdPalindrome" + Me.cmdPalindrome.Size = New System.Drawing.Size(75, 23) + Me.cmdPalindrome.TabIndex = 32 + Me.cmdPalindrome.Text = "palindrome" + Me.cmdPalindrome.UseVisualStyleBackColor = True + ' + 'cmdRoman + ' + Me.cmdRoman.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdRoman.Location = New System.Drawing.Point(149, 105) + Me.cmdRoman.Name = "cmdRoman" + Me.cmdRoman.Size = New System.Drawing.Size(75, 23) + Me.cmdRoman.TabIndex = 31 + Me.cmdRoman.Text = "roman" + Me.cmdRoman.UseVisualStyleBackColor = True + ' + 'cmdHexmode + ' + Me.cmdHexmode.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdHexmode.Location = New System.Drawing.Point(149, 83) + Me.cmdHexmode.Name = "cmdHexmode" + Me.cmdHexmode.Size = New System.Drawing.Size(75, 23) + Me.cmdHexmode.TabIndex = 30 + Me.cmdHexmode.Text = "hexmode" + Me.cmdHexmode.UseVisualStyleBackColor = True + ' + 'cmdOctmode + ' + Me.cmdOctmode.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdOctmode.Location = New System.Drawing.Point(75, 83) + Me.cmdOctmode.Name = "cmdOctmode" + Me.cmdOctmode.Size = New System.Drawing.Size(75, 23) + Me.cmdOctmode.TabIndex = 29 + Me.cmdOctmode.Text = "octmode" + Me.cmdOctmode.UseVisualStyleBackColor = True + ' 'cmdKTuple ' Me.cmdKTuple.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) @@ -1162,26 +1328,44 @@ Partial Class ucrCalculator ' Me.ContextMenuStripInteger.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.GmpToolStripMenuItem, Me.DescToolsToolStripMenuItem, Me.RutilsToolStripMenuItem, Me.PrimesToolStripMenuItem, Me.ZseqToolStripMenuItem, Me.UtilsToolStripMenuItem}) Me.ContextMenuStripInteger.Name = "ContextMenuStripInteger" - Me.ContextMenuStripInteger.Size = New System.Drawing.Size(181, 158) + Me.ContextMenuStripInteger.Size = New System.Drawing.Size(127, 136) + ' + 'GmpToolStripMenuItem + ' + Me.GmpToolStripMenuItem.Name = "GmpToolStripMenuItem" + Me.GmpToolStripMenuItem.Size = New System.Drawing.Size(126, 22) + Me.GmpToolStripMenuItem.Text = "Gmp" ' 'DescToolsToolStripMenuItem ' Me.DescToolsToolStripMenuItem.Name = "DescToolsToolStripMenuItem" - Me.DescToolsToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.DescToolsToolStripMenuItem.Size = New System.Drawing.Size(126, 22) Me.DescToolsToolStripMenuItem.Text = "DescTools" ' 'RutilsToolStripMenuItem ' Me.RutilsToolStripMenuItem.Name = "RutilsToolStripMenuItem" - Me.RutilsToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.RutilsToolStripMenuItem.Size = New System.Drawing.Size(126, 22) Me.RutilsToolStripMenuItem.Text = "R.utils" ' 'PrimesToolStripMenuItem ' Me.PrimesToolStripMenuItem.Name = "PrimesToolStripMenuItem" - Me.PrimesToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.PrimesToolStripMenuItem.Size = New System.Drawing.Size(126, 22) Me.PrimesToolStripMenuItem.Text = "Primes" ' + 'ZseqToolStripMenuItem + ' + Me.ZseqToolStripMenuItem.Name = "ZseqToolStripMenuItem" + Me.ZseqToolStripMenuItem.Size = New System.Drawing.Size(126, 22) + Me.ZseqToolStripMenuItem.Text = "Zseq" + ' + 'UtilsToolStripMenuItem + ' + Me.UtilsToolStripMenuItem.Name = "UtilsToolStripMenuItem" + Me.UtilsToolStripMenuItem.Size = New System.Drawing.Size(126, 22) + Me.UtilsToolStripMenuItem.Text = "R Utils" + ' 'cmdHex ' Me.cmdHex.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) @@ -3615,8 +3799,10 @@ Partial Class ucrCalculator ' 'grpTransform ' - Me.grpTransform.Controls.Add(Me.cmdHelpZoo) - Me.grpTransform.Controls.Add(Me.cmdHelpDplyr) + Me.grpTransform.Controls.Add(Me.cmdTransformRHelp) + Me.grpTransform.Controls.Add(Me.cmdRev) + Me.grpTransform.Controls.Add(Me.cmdMovProd) + Me.grpTransform.Controls.Add(Me.cmdCumProd) Me.grpTransform.Controls.Add(Me.cmdSortF) Me.grpTransform.Controls.Add(Me.cmdNasplin) Me.grpTransform.Controls.Add(Me.cmdNaapprox) @@ -3626,7 +3812,7 @@ Partial Class ucrCalculator Me.grpTransform.Controls.Add(Me.cmdRowRank) Me.grpTransform.Controls.Add(Me.cmdDiff) Me.grpTransform.Controls.Add(Me.cmdCumdist) - Me.grpTransform.Controls.Add(Me.cmdmovemean) + Me.grpTransform.Controls.Add(Me.cmdMovMean) Me.grpTransform.Controls.Add(Me.cmdCumMean) Me.grpTransform.Controls.Add(Me.cmdNtile) Me.grpTransform.Controls.Add(Me.cmMovMed) @@ -3634,41 +3820,21 @@ Partial Class ucrCalculator Me.grpTransform.Controls.Add(Me.cmdDRank) Me.grpTransform.Controls.Add(Me.cmdMovMax) Me.grpTransform.Controls.Add(Me.cmdMovSum) - Me.grpTransform.Controls.Add(Me.cmdpercentrank) - Me.grpTransform.Controls.Add(Me.cmdcumsum) - Me.grpTransform.Controls.Add(Me.cmdcummin) - Me.grpTransform.Controls.Add(Me.cmdcummax) + Me.grpTransform.Controls.Add(Me.cmdPercentRank) + Me.grpTransform.Controls.Add(Me.cmdCumSum) + Me.grpTransform.Controls.Add(Me.cmdCumMin) + Me.grpTransform.Controls.Add(Me.cmdCumMax) Me.grpTransform.Controls.Add(Me.cmdPMin) - Me.grpTransform.Controls.Add(Me.cmdpmax) + Me.grpTransform.Controls.Add(Me.cmdPMax) Me.grpTransform.Controls.Add(Me.cmdLead) Me.grpTransform.Controls.Add(Me.cmdLag) Me.grpTransform.Location = New System.Drawing.Point(434, 62) Me.grpTransform.Name = "grpTransform" - Me.grpTransform.Size = New System.Drawing.Size(251, 218) + Me.grpTransform.Size = New System.Drawing.Size(310, 227) Me.grpTransform.TabIndex = 189 Me.grpTransform.TabStop = False Me.grpTransform.Text = "Transform" ' - 'cmdHelpZoo - ' - Me.cmdHelpZoo.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdHelpZoo.Location = New System.Drawing.Point(172, 189) - Me.cmdHelpZoo.Name = "cmdHelpZoo" - Me.cmdHelpZoo.Size = New System.Drawing.Size(75, 23) - Me.cmdHelpZoo.TabIndex = 200 - Me.cmdHelpZoo.Text = "R Help(zoo)" - Me.cmdHelpZoo.UseVisualStyleBackColor = True - ' - 'cmdHelpDplyr - ' - Me.cmdHelpDplyr.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdHelpDplyr.Location = New System.Drawing.Point(98, 189) - Me.cmdHelpDplyr.Name = "cmdHelpDplyr" - Me.cmdHelpDplyr.Size = New System.Drawing.Size(75, 23) - Me.cmdHelpDplyr.TabIndex = 199 - Me.cmdHelpDplyr.Text = "R Help" - Me.cmdHelpDplyr.UseVisualStyleBackColor = True - ' 'cmdSortF ' Me.cmdSortF.ImeMode = System.Windows.Forms.ImeMode.NoControl @@ -3682,9 +3848,9 @@ Partial Class ucrCalculator 'cmdNasplin ' Me.cmdNasplin.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdNasplin.Location = New System.Drawing.Point(185, 160) + Me.cmdNasplin.Location = New System.Drawing.Point(231, 160) Me.cmdNasplin.Name = "cmdNasplin" - Me.cmdNasplin.Size = New System.Drawing.Size(62, 30) + Me.cmdNasplin.Size = New System.Drawing.Size(77, 30) Me.cmdNasplin.TabIndex = 197 Me.cmdNasplin.Text = "nasplin" Me.cmdNasplin.UseVisualStyleBackColor = True @@ -3692,9 +3858,9 @@ Partial Class ucrCalculator 'cmdNaapprox ' Me.cmdNaapprox.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdNaapprox.Location = New System.Drawing.Point(124, 160) + Me.cmdNaapprox.Location = New System.Drawing.Point(155, 160) Me.cmdNaapprox.Name = "cmdNaapprox" - Me.cmdNaapprox.Size = New System.Drawing.Size(62, 30) + Me.cmdNaapprox.Size = New System.Drawing.Size(77, 30) Me.cmdNaapprox.TabIndex = 196 Me.cmdNaapprox.Text = "naapprox" Me.cmdNaapprox.UseVisualStyleBackColor = True @@ -3702,9 +3868,9 @@ Partial Class ucrCalculator 'cmdNaest ' Me.cmdNaest.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdNaest.Location = New System.Drawing.Point(63, 160) + Me.cmdNaest.Location = New System.Drawing.Point(79, 160) Me.cmdNaest.Name = "cmdNaest" - Me.cmdNaest.Size = New System.Drawing.Size(62, 30) + Me.cmdNaest.Size = New System.Drawing.Size(77, 30) Me.cmdNaest.TabIndex = 195 Me.cmdNaest.Text = "naest" Me.cmdNaest.UseVisualStyleBackColor = True @@ -3714,7 +3880,7 @@ Partial Class ucrCalculator Me.cmdNafill.ImeMode = System.Windows.Forms.ImeMode.NoControl Me.cmdNafill.Location = New System.Drawing.Point(2, 160) Me.cmdNafill.Name = "cmdNafill" - Me.cmdNafill.Size = New System.Drawing.Size(62, 30) + Me.cmdNafill.Size = New System.Drawing.Size(78, 30) Me.cmdNafill.TabIndex = 194 Me.cmdNafill.Text = "nafill" Me.cmdNafill.UseVisualStyleBackColor = True @@ -3722,7 +3888,7 @@ Partial Class ucrCalculator 'cmdMovmin ' Me.cmdMovmin.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdMovmin.Location = New System.Drawing.Point(2, 102) + Me.cmdMovmin.Location = New System.Drawing.Point(246, 73) Me.cmdMovmin.Name = "cmdMovmin" Me.cmdMovmin.Size = New System.Drawing.Size(62, 30) Me.cmdMovmin.TabIndex = 193 @@ -3734,7 +3900,7 @@ Partial Class ucrCalculator Me.cmdRowRank.ImeMode = System.Windows.Forms.ImeMode.NoControl Me.cmdRowRank.Location = New System.Drawing.Point(2, 131) Me.cmdRowRank.Name = "cmdRowRank" - Me.cmdRowRank.Size = New System.Drawing.Size(62, 30) + Me.cmdRowRank.Size = New System.Drawing.Size(78, 30) Me.cmdRowRank.TabIndex = 192 Me.cmdRowRank.Text = "r_rank" Me.cmdRowRank.UseVisualStyleBackColor = True @@ -3752,27 +3918,27 @@ Partial Class ucrCalculator 'cmdCumdist ' Me.cmdCumdist.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdCumdist.Location = New System.Drawing.Point(185, 102) + Me.cmdCumdist.Location = New System.Drawing.Point(246, 102) Me.cmdCumdist.Name = "cmdCumdist" Me.cmdCumdist.Size = New System.Drawing.Size(62, 30) Me.cmdCumdist.TabIndex = 190 Me.cmdCumdist.Text = "cumdist" Me.cmdCumdist.UseVisualStyleBackColor = True ' - 'cmdmovemean + 'cmdMovMean ' - Me.cmdmovemean.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdmovemean.Location = New System.Drawing.Point(124, 73) - Me.cmdmovemean.Name = "cmdmovemean" - Me.cmdmovemean.Size = New System.Drawing.Size(62, 30) - Me.cmdmovemean.TabIndex = 189 - Me.cmdmovemean.Text = "movmean" - Me.cmdmovemean.UseVisualStyleBackColor = True + Me.cmdMovMean.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdMovMean.Location = New System.Drawing.Point(185, 73) + Me.cmdMovMean.Name = "cmdMovMean" + Me.cmdMovMean.Size = New System.Drawing.Size(62, 30) + Me.cmdMovMean.TabIndex = 189 + Me.cmdMovMean.Text = "movmean" + Me.cmdMovMean.UseVisualStyleBackColor = True ' 'cmdCumMean ' Me.cmdCumMean.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdCumMean.Location = New System.Drawing.Point(124, 44) + Me.cmdCumMean.Location = New System.Drawing.Point(185, 44) Me.cmdCumMean.Name = "cmdCumMean" Me.cmdCumMean.Size = New System.Drawing.Size(62, 30) Me.cmdCumMean.TabIndex = 188 @@ -3782,7 +3948,7 @@ Partial Class ucrCalculator 'cmdNtile ' Me.cmdNtile.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdNtile.Location = New System.Drawing.Point(124, 102) + Me.cmdNtile.Location = New System.Drawing.Point(185, 102) Me.cmdNtile.Name = "cmdNtile" Me.cmdNtile.Size = New System.Drawing.Size(62, 30) Me.cmdNtile.TabIndex = 187 @@ -3792,7 +3958,7 @@ Partial Class ucrCalculator 'cmMovMed ' Me.cmMovMed.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmMovMed.Location = New System.Drawing.Point(185, 73) + Me.cmMovMed.Location = New System.Drawing.Point(2, 102) Me.cmMovMed.Name = "cmMovMed" Me.cmMovMed.Size = New System.Drawing.Size(62, 30) Me.cmMovMed.TabIndex = 186 @@ -3802,9 +3968,9 @@ Partial Class ucrCalculator 'cmdMRank ' Me.cmdMRank.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdMRank.Location = New System.Drawing.Point(185, 131) + Me.cmdMRank.Location = New System.Drawing.Point(231, 131) Me.cmdMRank.Name = "cmdMRank" - Me.cmdMRank.Size = New System.Drawing.Size(62, 30) + Me.cmdMRank.Size = New System.Drawing.Size(77, 30) Me.cmdMRank.TabIndex = 185 Me.cmdMRank.Text = "m_rank" Me.cmdMRank.UseVisualStyleBackColor = True @@ -3812,9 +3978,9 @@ Partial Class ucrCalculator 'cmdDRank ' Me.cmdDRank.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdDRank.Location = New System.Drawing.Point(124, 131) + Me.cmdDRank.Location = New System.Drawing.Point(155, 131) Me.cmdDRank.Name = "cmdDRank" - Me.cmdDRank.Size = New System.Drawing.Size(62, 30) + Me.cmdDRank.Size = New System.Drawing.Size(77, 30) Me.cmdDRank.TabIndex = 184 Me.cmdDRank.Text = "d_rank" Me.cmdDRank.UseVisualStyleBackColor = True @@ -3839,74 +4005,74 @@ Partial Class ucrCalculator Me.cmdMovSum.Text = "movsum" Me.cmdMovSum.UseVisualStyleBackColor = True ' - 'cmdpercentrank - ' - Me.cmdpercentrank.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdpercentrank.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdpercentrank.Location = New System.Drawing.Point(63, 131) - Me.cmdpercentrank.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) - Me.cmdpercentrank.Name = "cmdpercentrank" - Me.cmdpercentrank.Size = New System.Drawing.Size(62, 30) - Me.cmdpercentrank.TabIndex = 181 - Me.cmdpercentrank.Text = "% rank" - Me.cmdpercentrank.UseVisualStyleBackColor = True - ' - 'cmdcumsum - ' - Me.cmdcumsum.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdcumsum.Location = New System.Drawing.Point(63, 44) - Me.cmdcumsum.Name = "cmdcumsum" - Me.cmdcumsum.Size = New System.Drawing.Size(62, 30) - Me.cmdcumsum.TabIndex = 180 - Me.cmdcumsum.Text = "cumsum" - Me.cmdcumsum.UseVisualStyleBackColor = True - ' - 'cmdcummin - ' - Me.cmdcummin.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdcummin.Location = New System.Drawing.Point(185, 44) - Me.cmdcummin.Name = "cmdcummin" - Me.cmdcummin.Size = New System.Drawing.Size(62, 30) - Me.cmdcummin.TabIndex = 179 - Me.cmdcummin.Text = "cummin" - Me.cmdcummin.UseVisualStyleBackColor = True - ' - 'cmdcummax - ' - Me.cmdcummax.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdcummax.Location = New System.Drawing.Point(2, 44) - Me.cmdcummax.Name = "cmdcummax" - Me.cmdcummax.Size = New System.Drawing.Size(62, 30) - Me.cmdcummax.TabIndex = 178 - Me.cmdcummax.Text = "cummax" - Me.cmdcummax.UseVisualStyleBackColor = True + 'cmdPercentRank + ' + Me.cmdPercentRank.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdPercentRank.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdPercentRank.Location = New System.Drawing.Point(79, 131) + Me.cmdPercentRank.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdPercentRank.Name = "cmdPercentRank" + Me.cmdPercentRank.Size = New System.Drawing.Size(77, 30) + Me.cmdPercentRank.TabIndex = 181 + Me.cmdPercentRank.Text = "% rank" + Me.cmdPercentRank.UseVisualStyleBackColor = True + ' + 'cmdCumSum + ' + Me.cmdCumSum.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdCumSum.Location = New System.Drawing.Point(63, 44) + Me.cmdCumSum.Name = "cmdCumSum" + Me.cmdCumSum.Size = New System.Drawing.Size(62, 30) + Me.cmdCumSum.TabIndex = 180 + Me.cmdCumSum.Text = "cumsum" + Me.cmdCumSum.UseVisualStyleBackColor = True + ' + 'cmdCumMin + ' + Me.cmdCumMin.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdCumMin.Location = New System.Drawing.Point(246, 44) + Me.cmdCumMin.Name = "cmdCumMin" + Me.cmdCumMin.Size = New System.Drawing.Size(62, 30) + Me.cmdCumMin.TabIndex = 179 + Me.cmdCumMin.Text = "cummin" + Me.cmdCumMin.UseVisualStyleBackColor = True + ' + 'cmdCumMax + ' + Me.cmdCumMax.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdCumMax.Location = New System.Drawing.Point(2, 44) + Me.cmdCumMax.Name = "cmdCumMax" + Me.cmdCumMax.Size = New System.Drawing.Size(62, 30) + Me.cmdCumMax.TabIndex = 178 + Me.cmdCumMax.Text = "cummax" + Me.cmdCumMax.UseVisualStyleBackColor = True ' 'cmdPMin ' Me.cmdPMin.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdPMin.Location = New System.Drawing.Point(192, 15) + Me.cmdPMin.Location = New System.Drawing.Point(246, 15) Me.cmdPMin.Name = "cmdPMin" - Me.cmdPMin.Size = New System.Drawing.Size(55, 30) + Me.cmdPMin.Size = New System.Drawing.Size(62, 30) Me.cmdPMin.TabIndex = 177 Me.cmdPMin.Text = "pmin" Me.cmdPMin.UseVisualStyleBackColor = True ' - 'cmdpmax + 'cmdPMax ' - Me.cmdpmax.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdpmax.Location = New System.Drawing.Point(149, 15) - Me.cmdpmax.Name = "cmdpmax" - Me.cmdpmax.Size = New System.Drawing.Size(44, 30) - Me.cmdpmax.TabIndex = 176 - Me.cmdpmax.Text = "pmax" - Me.cmdpmax.UseVisualStyleBackColor = True + Me.cmdPMax.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdPMax.Location = New System.Drawing.Point(185, 15) + Me.cmdPMax.Name = "cmdPMax" + Me.cmdPMax.Size = New System.Drawing.Size(62, 30) + Me.cmdPMax.TabIndex = 176 + Me.cmdPMax.Text = "pmax" + Me.cmdPMax.UseVisualStyleBackColor = True ' 'cmdLead ' Me.cmdLead.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdLead.Location = New System.Drawing.Point(106, 15) + Me.cmdLead.Location = New System.Drawing.Point(124, 15) Me.cmdLead.Name = "cmdLead" - Me.cmdLead.Size = New System.Drawing.Size(44, 30) + Me.cmdLead.Size = New System.Drawing.Size(62, 30) Me.cmdLead.TabIndex = 175 Me.cmdLead.Text = "lead" Me.cmdLead.UseVisualStyleBackColor = True @@ -3916,7 +4082,7 @@ Partial Class ucrCalculator Me.cmdLag.ImeMode = System.Windows.Forms.ImeMode.NoControl Me.cmdLag.Location = New System.Drawing.Point(63, 15) Me.cmdLag.Name = "cmdLag" - Me.cmdLag.Size = New System.Drawing.Size(44, 30) + Me.cmdLag.Size = New System.Drawing.Size(62, 30) Me.cmdLag.TabIndex = 174 Me.cmdLag.Text = "lag" Me.cmdLag.UseVisualStyleBackColor = True @@ -5147,182 +5313,35 @@ Partial Class ucrCalculator Me.cmdStringRHelp.Text = "R Help" Me.cmdStringRHelp.UseVisualStyleBackColor = True ' - 'cmdOctmode - ' - Me.cmdOctmode.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdOctmode.Location = New System.Drawing.Point(75, 83) - Me.cmdOctmode.Name = "cmdOctmode" - Me.cmdOctmode.Size = New System.Drawing.Size(75, 23) - Me.cmdOctmode.TabIndex = 29 - Me.cmdOctmode.Text = "octmode" - Me.cmdOctmode.UseVisualStyleBackColor = True - ' - 'cmdHexmode - ' - Me.cmdHexmode.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdHexmode.Location = New System.Drawing.Point(149, 83) - Me.cmdHexmode.Name = "cmdHexmode" - Me.cmdHexmode.Size = New System.Drawing.Size(75, 23) - Me.cmdHexmode.TabIndex = 30 - Me.cmdHexmode.Text = "hexmode" - Me.cmdHexmode.UseVisualStyleBackColor = True - ' - 'cmdRoman - ' - Me.cmdRoman.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdRoman.Location = New System.Drawing.Point(149, 105) - Me.cmdRoman.Name = "cmdRoman" - Me.cmdRoman.Size = New System.Drawing.Size(75, 23) - Me.cmdRoman.TabIndex = 31 - Me.cmdRoman.Text = "roman" - Me.cmdRoman.UseVisualStyleBackColor = True - ' - 'cmdPalindrome - ' - Me.cmdPalindrome.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdPalindrome.Location = New System.Drawing.Point(1, 213) - Me.cmdPalindrome.Name = "cmdPalindrome" - Me.cmdPalindrome.Size = New System.Drawing.Size(75, 23) - Me.cmdPalindrome.TabIndex = 32 - Me.cmdPalindrome.Text = "palindrome" - Me.cmdPalindrome.UseVisualStyleBackColor = True - ' - 'cmdFibonacci2 - ' - Me.cmdFibonacci2.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdFibonacci2.Location = New System.Drawing.Point(75, 213) - Me.cmdFibonacci2.Name = "cmdFibonacci2" - Me.cmdFibonacci2.Size = New System.Drawing.Size(75, 23) - Me.cmdFibonacci2.TabIndex = 33 - Me.cmdFibonacci2.Text = "fibonacci2" - Me.cmdFibonacci2.UseVisualStyleBackColor = True - ' - 'cmdAbundant - ' - Me.cmdAbundant.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdAbundant.Location = New System.Drawing.Point(149, 213) - Me.cmdAbundant.Name = "cmdAbundant" - Me.cmdAbundant.Size = New System.Drawing.Size(75, 23) - Me.cmdAbundant.TabIndex = 34 - Me.cmdAbundant.Text = "abundant" - Me.cmdAbundant.UseVisualStyleBackColor = True - ' - 'cmdPerfect - ' - Me.cmdPerfect.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdPerfect.Location = New System.Drawing.Point(223, 213) - Me.cmdPerfect.Name = "cmdPerfect" - Me.cmdPerfect.Size = New System.Drawing.Size(75, 23) - Me.cmdPerfect.TabIndex = 35 - Me.cmdPerfect.Text = "perfect" - Me.cmdPerfect.UseVisualStyleBackColor = True - ' - 'cmdFrugal - ' - Me.cmdFrugal.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdFrugal.Location = New System.Drawing.Point(1, 235) - Me.cmdFrugal.Name = "cmdFrugal" - Me.cmdFrugal.Size = New System.Drawing.Size(75, 23) - Me.cmdFrugal.TabIndex = 36 - Me.cmdFrugal.Text = "frugal" - Me.cmdFrugal.UseVisualStyleBackColor = True - ' - 'cmdPowerful - ' - Me.cmdPowerful.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdPowerful.Location = New System.Drawing.Point(75, 235) - Me.cmdPowerful.Name = "cmdPowerful" - Me.cmdPowerful.Size = New System.Drawing.Size(75, 23) - Me.cmdPowerful.TabIndex = 37 - Me.cmdPowerful.Text = "powerful" - Me.cmdPowerful.UseVisualStyleBackColor = True - ' - 'cmdUgly - ' - Me.cmdUgly.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdUgly.Location = New System.Drawing.Point(149, 235) - Me.cmdUgly.Name = "cmdUgly" - Me.cmdUgly.Size = New System.Drawing.Size(75, 23) - Me.cmdUgly.TabIndex = 38 - Me.cmdUgly.Text = "ugly" - Me.cmdUgly.UseVisualStyleBackColor = True - ' - 'cmdHappy - ' - Me.cmdHappy.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdHappy.Location = New System.Drawing.Point(223, 235) - Me.cmdHappy.Name = "cmdHappy" - Me.cmdHappy.Size = New System.Drawing.Size(75, 23) - Me.cmdHappy.TabIndex = 39 - Me.cmdHappy.Text = "happy" - Me.cmdHappy.UseVisualStyleBackColor = True + 'cmdCumProd ' - 'cmdAchilles + Me.cmdCumProd.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdCumProd.Location = New System.Drawing.Point(124, 44) + Me.cmdCumProd.Name = "cmdCumProd" + Me.cmdCumProd.Size = New System.Drawing.Size(62, 30) + Me.cmdCumProd.TabIndex = 201 + Me.cmdCumProd.Text = "cumprod" + Me.cmdCumProd.UseVisualStyleBackColor = True ' - Me.cmdAchilles.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdAchilles.Location = New System.Drawing.Point(1, 257) - Me.cmdAchilles.Name = "cmdAchilles" - Me.cmdAchilles.Size = New System.Drawing.Size(75, 23) - Me.cmdAchilles.TabIndex = 40 - Me.cmdAchilles.Text = "achilles" - Me.cmdAchilles.UseVisualStyleBackColor = True + 'cmdMovProd ' - 'cmdPadovan + Me.cmdMovProd.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdMovProd.Location = New System.Drawing.Point(124, 73) + Me.cmdMovProd.Name = "cmdMovProd" + Me.cmdMovProd.Size = New System.Drawing.Size(62, 30) + Me.cmdMovProd.TabIndex = 202 + Me.cmdMovProd.Text = "movprod" + Me.cmdMovProd.UseVisualStyleBackColor = True ' - Me.cmdPadovan.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdPadovan.Location = New System.Drawing.Point(75, 257) - Me.cmdPadovan.Name = "cmdPadovan" - Me.cmdPadovan.Size = New System.Drawing.Size(75, 23) - Me.cmdPadovan.TabIndex = 41 - Me.cmdPadovan.Text = "padovan" - Me.cmdPadovan.UseVisualStyleBackColor = True + 'cmdRev ' - 'cmdTriangle - ' - Me.cmdTriangle.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdTriangle.Location = New System.Drawing.Point(149, 257) - Me.cmdTriangle.Name = "cmdTriangle" - Me.cmdTriangle.Size = New System.Drawing.Size(75, 23) - Me.cmdTriangle.TabIndex = 42 - Me.cmdTriangle.Text = "triangle" - Me.cmdTriangle.UseVisualStyleBackColor = True - ' - 'cmdSquare - ' - Me.cmdSquare.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) - Me.cmdSquare.Location = New System.Drawing.Point(223, 257) - Me.cmdSquare.Name = "cmdSquare" - Me.cmdSquare.Size = New System.Drawing.Size(75, 23) - Me.cmdSquare.TabIndex = 43 - Me.cmdSquare.Text = "square" - Me.cmdSquare.UseVisualStyleBackColor = True - ' - 'cmdFactorize2 - ' - Me.cmdFactorize2.Location = New System.Drawing.Point(149, 39) - Me.cmdFactorize2.Name = "cmdFactorize2" - Me.cmdFactorize2.Size = New System.Drawing.Size(75, 23) - Me.cmdFactorize2.TabIndex = 44 - Me.cmdFactorize2.Text = "factorize2" - Me.cmdFactorize2.UseVisualStyleBackColor = True - ' - 'ZseqToolStripMenuItem - ' - Me.ZseqToolStripMenuItem.Name = "ZseqToolStripMenuItem" - Me.ZseqToolStripMenuItem.Size = New System.Drawing.Size(180, 22) - Me.ZseqToolStripMenuItem.Text = "Zseq" - ' - 'GmpToolStripMenuItem - ' - Me.GmpToolStripMenuItem.Name = "GmpToolStripMenuItem" - Me.GmpToolStripMenuItem.Size = New System.Drawing.Size(180, 22) - Me.GmpToolStripMenuItem.Text = "Gmp" - ' - 'UtilsToolStripMenuItem - ' - Me.UtilsToolStripMenuItem.Name = "UtilsToolStripMenuItem" - Me.UtilsToolStripMenuItem.Size = New System.Drawing.Size(180, 22) - Me.UtilsToolStripMenuItem.Text = "R Utils" + Me.cmdRev.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdRev.Location = New System.Drawing.Point(124, 102) + Me.cmdRev.Name = "cmdRev" + Me.cmdRev.Size = New System.Drawing.Size(62, 30) + Me.cmdRev.TabIndex = 203 + Me.cmdRev.Text = "rev" + Me.cmdRev.UseVisualStyleBackColor = True ' 'cmdIntegerRHelp ' @@ -5392,14 +5411,48 @@ Partial Class ucrCalculator Me.ucrReceiverForCalculation.TabIndex = 120 Me.ucrReceiverForCalculation.ucrSelector = Nothing ' + 'cmdTransformRHelp + ' + Me.cmdTransformRHelp.AutoSize = True + Me.cmdTransformRHelp.Location = New System.Drawing.Point(216, 195) + Me.cmdTransformRHelp.Name = "cmdTransformRHelp" + Me.cmdTransformRHelp.Size = New System.Drawing.Size(91, 23) + Me.cmdTransformRHelp.TabIndex = 204 + Me.cmdTransformRHelp.Text = "R Help" + Me.cmdTransformRHelp.UseVisualStyleBackColor = True + ' + 'ContextMenuStrip1 + ' + Me.ContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BaseToolStripMenuItem, Me.DplyrToolStripMenuItem, Me.ZooToolStripMenuItem}) + Me.ContextMenuStrip1.Name = "ContextMenuStrip1" + Me.ContextMenuStrip1.Size = New System.Drawing.Size(181, 92) + ' + 'BaseToolStripMenuItem + ' + Me.BaseToolStripMenuItem.Name = "BaseToolStripMenuItem" + Me.BaseToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.BaseToolStripMenuItem.Text = "base" + ' + 'DplyrToolStripMenuItem + ' + Me.DplyrToolStripMenuItem.Name = "DplyrToolStripMenuItem" + Me.DplyrToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.DplyrToolStripMenuItem.Text = "dplyr" + ' + 'ZooToolStripMenuItem + ' + Me.ZooToolStripMenuItem.Name = "ZooToolStripMenuItem" + Me.ZooToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.ZooToolStripMenuItem.Text = "zoo" + ' 'ucrCalculator ' Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True + Me.Controls.Add(Me.grpTransform) Me.Controls.Add(Me.grpInteger) Me.Controls.Add(Me.grpDates) - Me.Controls.Add(Me.grpTransform) Me.Controls.Add(Me.grpWakefield) Me.Controls.Add(Me.grpLogical) Me.Controls.Add(Me.grpSummary) @@ -5435,11 +5488,13 @@ Partial Class ucrCalculator Me.grpSummary.ResumeLayout(False) Me.grpProbabilty.ResumeLayout(False) Me.grpTransform.ResumeLayout(False) + Me.grpTransform.PerformLayout() Me.grpLogical.ResumeLayout(False) Me.grpTestString.ResumeLayout(False) Me.grpCircular.ResumeLayout(False) Me.grpModifier.ResumeLayout(False) Me.grpSymbols.ResumeLayout(False) + Me.ContextMenuStrip1.ResumeLayout(False) Me.ResumeLayout(False) Me.PerformLayout() @@ -5480,11 +5535,11 @@ Partial Class ucrCalculator Friend WithEvents cmdYmd As Button Friend WithEvents cmdLeap As Button Friend WithEvents grpTransform As GroupBox - Friend WithEvents cmdcumsum As Button - Friend WithEvents cmdcummin As Button - Friend WithEvents cmdcummax As Button + Friend WithEvents cmdCumSum As Button + Friend WithEvents cmdCumMin As Button + Friend WithEvents cmdCumMax As Button Friend WithEvents cmdPMin As Button - Friend WithEvents cmdpmax As Button + Friend WithEvents cmdPMax As Button Friend WithEvents cmdLead As Button Friend WithEvents cmdLag As Button Friend WithEvents grpTestString As GroupBox @@ -5574,10 +5629,10 @@ Partial Class ucrCalculator Friend WithEvents cmdComma As Button Friend WithEvents cmdClear As Button Friend WithEvents cmdMultiply As Button - Friend WithEvents cmdpercentrank As Button + Friend WithEvents cmdPercentRank As Button Friend WithEvents cmdDiff As Button Friend WithEvents cmdCumdist As Button - Friend WithEvents cmdmovemean As Button + Friend WithEvents cmdMovMean As Button Friend WithEvents cmdCumMean As Button Friend WithEvents cmdNtile As Button Friend WithEvents cmMovMed As Button @@ -5809,8 +5864,6 @@ Partial Class ucrCalculator Friend WithEvents cmdMathsHelp As Button Friend WithEvents cmdLogicalHelp As Button Friend WithEvents cmdSummaryHelp As Button - Friend WithEvents cmdHelpZoo As Button - Friend WithEvents cmdHelpDplyr As Button Friend WithEvents cmdStringRHelp As Button Friend WithEvents cmdProbRHelp As Button Friend WithEvents grpInteger As GroupBox @@ -5865,4 +5918,12 @@ Partial Class ucrCalculator Friend WithEvents GmpToolStripMenuItem As ToolStripMenuItem Friend WithEvents ZseqToolStripMenuItem As ToolStripMenuItem Friend WithEvents UtilsToolStripMenuItem As ToolStripMenuItem + Friend WithEvents cmdRev As Button + Friend WithEvents cmdMovProd As Button + Friend WithEvents cmdCumProd As Button + Friend WithEvents cmdTransformRHelp As ucrSplitButton + Friend WithEvents ContextMenuStrip1 As ContextMenuStrip + Friend WithEvents BaseToolStripMenuItem As ToolStripMenuItem + Friend WithEvents DplyrToolStripMenuItem As ToolStripMenuItem + Friend WithEvents ZooToolStripMenuItem As ToolStripMenuItem End Class diff --git a/instat/ucrCalculator.resx b/instat/ucrCalculator.resx index 8752fd4b5db..5182f2b46a1 100644 --- a/instat/ucrCalculator.resx +++ b/instat/ucrCalculator.resx @@ -123,6 +123,9 @@ 17, 17 + + 313, 24 + 78 diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index 88bb115c574..ae0ac4b6c07 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -70,24 +70,28 @@ Public Class ucrCalculator ttCalculator.SetToolTip(cmdRound, "round(x) to round to whole numbers, round(x,2) to round to 2 decimal places, round(x,-2) to round to the nearest 100") ttCalculator.SetToolTip(cmdSiginf, "signif(x,3) to round to 3 significant figures") - ttCalculator.SetToolTip(cmdLag, "Shift a variable down. For example lag(1:5) = (NA,1,2,3,4); lag(1:5,3) = (NA,NA,NA, 1,2)") - ttCalculator.SetToolTip(cmdLead, "Shift a variable up. For example lead(1:5) = (2,3,4,5,NA); lead(1:5;3) = (4,5, NA,NA,NA)") + ttCalculator.SetToolTip(cmdSortF, "sorts a vector into ascending or descending order. For example sort(c(5,7,4,4,3)) = (3,4,4,5,7)") + ttCalculator.SetToolTip(cmdLag, "shift a variable down. For example lag(1:5) = (NA,1,2,3,4); lag(1:5,3) = (NA,NA,NA, 1,2)") + ttCalculator.SetToolTip(cmdLead, "shift a variable up. For example lead(1:5) = (2,3,4,5,NA); lead(1:5;3) = (4,5, NA,NA,NA)") ttCalculator.SetToolTip(cmdDiff, "difference between successive elements. For example diff(c(1,4,3,7)) = (NA 3,-1,4)") - ttCalculator.SetToolTip(cmdpmax, " maximum of a set of variables. For examples pmax(c(1,3,5),c(6,4,2)) = (6,4,5)") + ttCalculator.SetToolTip(cmdRev, "reverse a variable. For example rev(c(1,2,3,4,5)) =(5,4,3,2,1)") + ttCalculator.SetToolTip(cmdPMax, " maximum of a set of variables. For examples pmax(c(1,3,5),c(6,4,2)) = (6,4,5)") ttCalculator.SetToolTip(cmdPMin, "minimum of a set of variables. For examples pmin(c(1,3,5),c(6,4,2)) = (1,3,2)") - ttCalculator.SetToolTip(cmdcummax, "cumulative maxima. For example cummax(c(3,2,1,4,0)) = (3,3,3,4,4)") + ttCalculator.SetToolTip(cmdCumMax, "cumulative maxima. For example cummax(c(3,2,1,4,0)) = (3,3,3,4,4)") ttCalculator.SetToolTip(cmdMovMax, "moving (or rolling) maxima. For example rollmax(x=c(3,2,1,4,0) ,3,fill=NA, align=""right"") = (NA,NA, 3,4,4)") - ttCalculator.SetToolTip(cmdcumsum, "cumulative sums. For example cumsum(c(3,2,1,4,0)) = (3,5,6,10,10)") + ttCalculator.SetToolTip(cmdCumSum, "cumulative sums. For example cumsum(c(3,2,1,4,0)) = (3,5,6,10,10)") + ttCalculator.SetToolTip(cmdCumProd, "cumulative products. For example cumprod(c(2,3,5,7)) = (2,6,30,210)") + ttCalculator.SetToolTip(cmdMovProd, "moving products Fror example rollapply(c(2,3,5,7,11),width=3,fill=NA, FUN=prod) = (NA,30,105,385,NA)") ttCalculator.SetToolTip(cmdCumMean, "cumulative means. For example cummean(c(3,2,1,4,0)) = (3,2.5,2,2.5,2)") - ttCalculator.SetToolTip(cmdcummin, "cumulative minima. For example cummin(c(3,2,1,4,0)) = (3,2.,1,1,0)") + ttCalculator.SetToolTip(cmdCumMin, "cumulative minima. For example cummin(c(3,2,1,4,0)) = (3,2.,1,1,0)") ttCalculator.SetToolTip(cmdMovSum, "moving (or rolling) totals. For example rollsum(c(3,2,1,4,0) ,3,fill=NA, align=""left"") = (6,7,5,NA,NA)") - ttCalculator.SetToolTip(cmdmovemean, "moving (or rolling) mean. For example rollmean(c(3,2,1,6,2) ,3,fill=NA) = (NA,2,3,3,NA)") + ttCalculator.SetToolTip(cmdMovMean, "moving (or rolling) mean. For example rollmean(c(3,2,1,6,2) ,3,fill=NA) = (NA,2,3,3,NA)") ttCalculator.SetToolTip(cmMovMed, "moving (or rolling) medians. For example rollmedian(c(3,2,1,6,2) ,3,fill=NA) = (NA,2,2,2,NA)") ttCalculator.SetToolTip(cmdMovmin, "moving (or rolling) minima. For example rollapply(c(3,2,1,6,2),width=3,fill=NA, FUN=min) = (NA,1,1,1,NA)") - ttCalculator.SetToolTip(cmdNtile, " Use ranks to divide into (almost) equal sized groups. For example ntile(c(15,11,13,12,NA,12),2) = (2,1,2,1,NA,1)") - ttCalculator.SetToolTip(cmdCumdist, "Proportion of values less than or equal to the current rank. For example cume_dist(c(2,4,6,8,3)) = (0.2, 0.6, 0.8, 1.0, 0.4)") + ttCalculator.SetToolTip(cmdNtile, " use ranks to divide into (almost) equal sized groups. For example ntile(c(15,11,13,12,NA,12),2) = (2,1,2,1,NA,1)") + ttCalculator.SetToolTip(cmdCumdist, "proportion of values less than or equal to the current rank. For example cume_dist(c(2,4,6,8,3)) = (0.2, 0.6, 0.8, 1.0, 0.4)") ttCalculator.SetToolTip(cmdRowRank, "row numbers as ranks. For example :row_number(c(15,11,13,12,NA,12)) = (5,1,3,2,NA,3)") - ttCalculator.SetToolTip(cmdpercentrank, "rescale of minimum ranks to [0,1]. For example percent_rank(c(15,11,13,12,NA,12)) = (1,0,0.75,0.25,NA,0.25)") + ttCalculator.SetToolTip(cmdPercentRank, "rescale of minimum ranks to [0,1]. For example percent_rank(c(15,11,13,12,NA,12)) = (1,0,0.75,0.25,NA,0.25)") ttCalculator.SetToolTip(cmdDRank, "dense ranks. For example d_rank(c(15,11,13,12,NA,12)) = (4,1,3,2,NA,2)") ttCalculator.SetToolTip(cmdMRank, " minimum ranks. For example m_rank(c(15,11,13,12,NA,12)) = (5,1,4,2,NA,2)") ttCalculator.SetToolTip(cmdNafill, "fills missing values at the start, middle and end. For example na.fill(c(NA,2,NA,4,5,NA),fill=""extend"") = (2,2,3,4,5,5); while fill=c(15,""extend"",NA) = (15,2,3,4,5,NA)") @@ -526,7 +530,7 @@ Public Class ucrCalculator grpSymbols.Visible = False grpHydroGOF.Visible = False grpInteger.Visible = False - Me.Size = New Size(iBasicWidth * 1.33, iBaseHeight) + Me.Size = New Size(iBasicWidth * 1.47, iBaseHeight) Case "Wakefield" strPackageName = "wakefield" grpDates.Visible = False @@ -1332,7 +1336,7 @@ Public Class ucrCalculator End If End Sub - Private Sub cmdpmax_Click(sender As Object, e As EventArgs) Handles cmdpmax.Click + Private Sub cmdpmax_Click(sender As Object, e As EventArgs) Handles cmdPMax.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("pmax(x= )", 1) Else @@ -1348,7 +1352,7 @@ Public Class ucrCalculator End If End Sub - Private Sub cmdcummax_Click(sender As Object, e As EventArgs) Handles cmdcummax.Click + Private Sub cmdcummax_Click(sender As Object, e As EventArgs) Handles cmdCumMax.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cummax(x= )", 1) Else @@ -1356,7 +1360,7 @@ Public Class ucrCalculator End If End Sub - Private Sub cmdcummin_Click(sender As Object, e As EventArgs) Handles cmdcummin.Click + Private Sub cmdcummin_Click(sender As Object, e As EventArgs) Handles cmdCumMin.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cummin(x= )", 1) Else @@ -1364,7 +1368,7 @@ Public Class ucrCalculator End If End Sub - Private Sub cmdcumsum_Click(sender As Object, e As EventArgs) Handles cmdcumsum.Click + Private Sub cmdcumsum_Click(sender As Object, e As EventArgs) Handles cmdCumSum.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cumsum(x= )", 1) Else @@ -1372,7 +1376,7 @@ Public Class ucrCalculator End If End Sub - Private Sub cmdpercentrank_Click(sender As Object, e As EventArgs) Handles cmdpercentrank.Click + Private Sub cmdpercentrank_Click(sender As Object, e As EventArgs) Handles cmdPercentRank.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("dplyr::percent_rank(x= )", 1) Else @@ -1415,7 +1419,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("c(NA, diff(x= , lag = 1, differences = 1))", 29) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("c(NA,diff())", 2) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("c(NA,diff(x= , lag = 1, differences = 1))", 29) End If End Sub @@ -1459,7 +1463,7 @@ Public Class ucrCalculator ucrReceiverForCalculation.AddToReceiverAtCursorPosition("dplyr::min_rank()", 1) End Sub - Private Sub cmdmovemean_Click(sender As Object, e As EventArgs) Handles cmdmovemean.Click + Private Sub cmdmovemean_Click(sender As Object, e As EventArgs) Handles cmdMovMean.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("zoo::rollmean(x = , k=3, fill = NA, na.pad = FALSE, align = c(""center"", ""left"", ""right""))", 72) Else @@ -2300,7 +2304,7 @@ Public Class ucrCalculator clsBrowserListFunction.SetRCommand("c") clsBrowserListFunction.AddParameter("chrome", Chr(34) & "Chrome" & Chr(34), iPosition:=0, bIncludeArgumentName:=False) - clsBrowserListFunction.AddParameter("IE", Chr(34) & "IE" & Chr(34), iPosition:=1,bIncludeArgumentName:=False) + clsBrowserListFunction.AddParameter("IE", Chr(34) & "IE" & Chr(34), iPosition:=1, bIncludeArgumentName:=False) clsBrowserListFunction.AddParameter("firefox", Chr(34) & "Firefox" & Chr(34), iPosition:=2, bIncludeArgumentName:=False) clsBrowserListFunction.AddParameter("safari", Chr(34) & "Safari" & Chr(34), iPosition:=3, bIncludeArgumentName:=False) clsBrowserListFunction.AddParameter("opera", Chr(34) & "Opera" & Chr(34), iPosition:=4, bIncludeArgumentName:=False) @@ -3077,9 +3081,9 @@ Public Class ucrCalculator Private Sub cmdMovmin_Click(sender As Object, e As EventArgs) Handles cmdMovmin.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("zoo::rollapply(data = , width = , FUN = min , by = 1, by.column = TRUE, fill = NA, na.pad = FALSE, partial = FALSE, align = c(""center"", ""left"", ""right""), coredata = TRUE)))", 151) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("zoo::rollapply(data = , width = 3, FUN = min , by = 1, by.column = TRUE, fill = NA, na.pad = FALSE, partial = FALSE, align = c(""center"", ""left"", ""right""), coredata = TRUE)", 150) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("zoo::rollapply( , width = , FUN = min, k = 3, fill = NA)", 40) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("zoo::rollapply( , width = 3, FUN = min, fill = NA, align= ""center"")", 52) End If End Sub @@ -3813,22 +3817,6 @@ Public Class ucrCalculator End If End Sub - Private Sub cmdHelpZoo_Click(sender As Object, e As EventArgs) Handles cmdHelpZoo.Click - CalculationsOptions() - If ucrInputCalOptions.GetText = "Transform" Then - strPackageName = "zoo" - End If - OpenHelpPage() - End Sub - - Private Sub cmdHelpDplyr_Click(sender As Object, e As EventArgs) Handles cmdHelpDplyr.Click - CalculationsOptions() - If ucrInputCalOptions.GetText = "Transform" Then - strPackageName = "dplyr" - End If - OpenHelpPage() - End Sub - Private Sub cmdBigZ_Click(sender As Object, e As EventArgs) Handles cmdBigZ.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("gmp::as.bigz(a = , mod = NA )", 13) @@ -4258,4 +4246,60 @@ Public Class ucrCalculator End If OpenHelpPage() End Sub + + Private Sub cmdCumProd_Click(sender As Object, e As EventArgs) Handles cmdCumProd.Click + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cumprod(x= )", 1) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cumprod()", 1) + End If + End Sub + + Private Sub cmdMovProd_Click(sender As Object, e As EventArgs) Handles cmdMovProd.Click + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("zoo::rollapply(data = , width = 3, FUN = prod , by = 1, by.column = TRUE, fill = NA, na.pad = FALSE, partial = FALSE, align = c(""center"", ""left"", ""right""), coredata = TRUE)", 150) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("zoo::rollapply( , width = 3, FUN = prod, fill = NA, align= ""center"")", 53) + End If + End Sub + + Private Sub cmdRev_Click(sender As Object, e As EventArgs) Handles cmdRev.Click + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("rev(x= )", 1) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("rev()", 1) + End If + End Sub + + Private Sub cmdTransformRHelp_Click(sender As Object, e As EventArgs) Handles cmdTransformRHelp.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Transform" Then + strPackageName = "base" + End If + OpenHelpPage() + End Sub + + Private Sub BaseToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BaseToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Transform" Then + strPackageName = "base" + End If + OpenHelpPage() + End Sub + + Private Sub DplyrToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DplyrToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Transform" Then + strPackageName = "dplyr" + End If + OpenHelpPage() + End Sub + + Private Sub ZooToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ZooToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Transform" Then + strPackageName = "zoo" + End If + OpenHelpPage() + End Sub End Class From c51a3cf8a1eebe1be1eada4b4fa129aa19541b1c Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Mon, 7 Nov 2022 12:16:37 +0300 Subject: [PATCH 085/122] Minor additions --- instat/ucrCalculator.Designer.vb | 132 ++++++++++++++++--------------- instat/ucrCalculator.resx | 6 +- 2 files changed, 70 insertions(+), 68 deletions(-) diff --git a/instat/ucrCalculator.Designer.vb b/instat/ucrCalculator.Designer.vb index e5c15390547..2b0f26e8b66 100644 --- a/instat/ucrCalculator.Designer.vb +++ b/instat/ucrCalculator.Designer.vb @@ -111,6 +111,7 @@ Partial Class ucrCalculator Me.cmdGCD = New System.Windows.Forms.Button() Me.cmdGeneratePrimes = New System.Windows.Forms.Button() Me.cmdNthPrime = New System.Windows.Forms.Button() + Me.cmdIntegerRHelp = New instat.ucrSplitButton() Me.ContextMenuStripInteger = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.GmpToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.DescToolsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() @@ -322,6 +323,10 @@ Partial Class ucrCalculator Me.cmdBeta = New System.Windows.Forms.Button() Me.cmdDigamma = New System.Windows.Forms.Button() Me.grpTransform = New System.Windows.Forms.GroupBox() + Me.cmdTransformRHelp = New instat.ucrSplitButton() + Me.cmdRev = New System.Windows.Forms.Button() + Me.cmdMovProd = New System.Windows.Forms.Button() + Me.cmdCumProd = New System.Windows.Forms.Button() Me.cmdSortF = New System.Windows.Forms.Button() Me.cmdNasplin = New System.Windows.Forms.Button() Me.cmdNaapprox = New System.Windows.Forms.Button() @@ -448,17 +453,12 @@ Partial Class ucrCalculator Me.cmdbegin = New System.Windows.Forms.Button() Me.cmdAny1 = New System.Windows.Forms.Button() Me.cmdStringRHelp = New System.Windows.Forms.Button() - Me.cmdCumProd = New System.Windows.Forms.Button() - Me.cmdMovProd = New System.Windows.Forms.Button() - Me.cmdRev = New System.Windows.Forms.Button() - Me.cmdIntegerRHelp = New instat.ucrSplitButton() Me.ucrSaveResultInto = New instat.ucrSave() Me.ucrTryCalculator = New instat.ucrTry() Me.ucrInputCalOptions = New instat.ucrInputComboBox() Me.ucrSelectorForCalculations = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrReceiverForCalculation = New instat.ucrReceiverExpression() - Me.cmdTransformRHelp = New instat.ucrSplitButton() - Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.ContextMenuStripTransform = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.BaseToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.DplyrToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.ZooToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() @@ -478,7 +478,7 @@ Partial Class ucrCalculator Me.grpCircular.SuspendLayout() Me.grpModifier.SuspendLayout() Me.grpSymbols.SuspendLayout() - Me.ContextMenuStrip1.SuspendLayout() + Me.ContextMenuStripTransform.SuspendLayout() Me.SuspendLayout() ' 'lblExpression @@ -1324,6 +1324,18 @@ Partial Class ucrCalculator Me.cmdNthPrime.Text = "nth_prime" Me.cmdNthPrime.UseVisualStyleBackColor = True ' + 'cmdIntegerRHelp + ' + Me.cmdIntegerRHelp.AutoSize = True + Me.cmdIntegerRHelp.ContextMenuStrip = Me.ContextMenuStripInteger + Me.cmdIntegerRHelp.Location = New System.Drawing.Point(210, 289) + Me.cmdIntegerRHelp.Name = "cmdIntegerRHelp" + Me.cmdIntegerRHelp.Size = New System.Drawing.Size(91, 23) + Me.cmdIntegerRHelp.SplitMenuStrip = Me.ContextMenuStripInteger + Me.cmdIntegerRHelp.TabIndex = 16 + Me.cmdIntegerRHelp.Text = "R Help" + Me.cmdIntegerRHelp.UseVisualStyleBackColor = True + ' 'ContextMenuStripInteger ' Me.ContextMenuStripInteger.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.GmpToolStripMenuItem, Me.DescToolsToolStripMenuItem, Me.RutilsToolStripMenuItem, Me.PrimesToolStripMenuItem, Me.ZseqToolStripMenuItem, Me.UtilsToolStripMenuItem}) @@ -3835,6 +3847,48 @@ Partial Class ucrCalculator Me.grpTransform.TabStop = False Me.grpTransform.Text = "Transform" ' + 'cmdTransformRHelp + ' + Me.cmdTransformRHelp.AutoSize = True + Me.cmdTransformRHelp.ContextMenuStrip = Me.ContextMenuStripTransform + Me.cmdTransformRHelp.Location = New System.Drawing.Point(216, 195) + Me.cmdTransformRHelp.Name = "cmdTransformRHelp" + Me.cmdTransformRHelp.Size = New System.Drawing.Size(91, 23) + Me.cmdTransformRHelp.SplitMenuStrip = Me.ContextMenuStripTransform + Me.cmdTransformRHelp.TabIndex = 204 + Me.cmdTransformRHelp.Text = "R Help" + Me.cmdTransformRHelp.UseVisualStyleBackColor = True + ' + 'cmdRev + ' + Me.cmdRev.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdRev.Location = New System.Drawing.Point(124, 102) + Me.cmdRev.Name = "cmdRev" + Me.cmdRev.Size = New System.Drawing.Size(62, 30) + Me.cmdRev.TabIndex = 203 + Me.cmdRev.Text = "rev" + Me.cmdRev.UseVisualStyleBackColor = True + ' + 'cmdMovProd + ' + Me.cmdMovProd.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdMovProd.Location = New System.Drawing.Point(124, 73) + Me.cmdMovProd.Name = "cmdMovProd" + Me.cmdMovProd.Size = New System.Drawing.Size(62, 30) + Me.cmdMovProd.TabIndex = 202 + Me.cmdMovProd.Text = "movprod" + Me.cmdMovProd.UseVisualStyleBackColor = True + ' + 'cmdCumProd + ' + Me.cmdCumProd.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdCumProd.Location = New System.Drawing.Point(124, 44) + Me.cmdCumProd.Name = "cmdCumProd" + Me.cmdCumProd.Size = New System.Drawing.Size(62, 30) + Me.cmdCumProd.TabIndex = 201 + Me.cmdCumProd.Text = "cumprod" + Me.cmdCumProd.UseVisualStyleBackColor = True + ' 'cmdSortF ' Me.cmdSortF.ImeMode = System.Windows.Forms.ImeMode.NoControl @@ -5313,48 +5367,6 @@ Partial Class ucrCalculator Me.cmdStringRHelp.Text = "R Help" Me.cmdStringRHelp.UseVisualStyleBackColor = True ' - 'cmdCumProd - ' - Me.cmdCumProd.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdCumProd.Location = New System.Drawing.Point(124, 44) - Me.cmdCumProd.Name = "cmdCumProd" - Me.cmdCumProd.Size = New System.Drawing.Size(62, 30) - Me.cmdCumProd.TabIndex = 201 - Me.cmdCumProd.Text = "cumprod" - Me.cmdCumProd.UseVisualStyleBackColor = True - ' - 'cmdMovProd - ' - Me.cmdMovProd.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdMovProd.Location = New System.Drawing.Point(124, 73) - Me.cmdMovProd.Name = "cmdMovProd" - Me.cmdMovProd.Size = New System.Drawing.Size(62, 30) - Me.cmdMovProd.TabIndex = 202 - Me.cmdMovProd.Text = "movprod" - Me.cmdMovProd.UseVisualStyleBackColor = True - ' - 'cmdRev - ' - Me.cmdRev.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdRev.Location = New System.Drawing.Point(124, 102) - Me.cmdRev.Name = "cmdRev" - Me.cmdRev.Size = New System.Drawing.Size(62, 30) - Me.cmdRev.TabIndex = 203 - Me.cmdRev.Text = "rev" - Me.cmdRev.UseVisualStyleBackColor = True - ' - 'cmdIntegerRHelp - ' - Me.cmdIntegerRHelp.AutoSize = True - Me.cmdIntegerRHelp.ContextMenuStrip = Me.ContextMenuStripInteger - Me.cmdIntegerRHelp.Location = New System.Drawing.Point(210, 289) - Me.cmdIntegerRHelp.Name = "cmdIntegerRHelp" - Me.cmdIntegerRHelp.Size = New System.Drawing.Size(91, 23) - Me.cmdIntegerRHelp.SplitMenuStrip = Me.ContextMenuStripInteger - Me.cmdIntegerRHelp.TabIndex = 16 - Me.cmdIntegerRHelp.Text = "R Help" - Me.cmdIntegerRHelp.UseVisualStyleBackColor = True - ' 'ucrSaveResultInto ' Me.ucrSaveResultInto.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink @@ -5411,21 +5423,11 @@ Partial Class ucrCalculator Me.ucrReceiverForCalculation.TabIndex = 120 Me.ucrReceiverForCalculation.ucrSelector = Nothing ' - 'cmdTransformRHelp - ' - Me.cmdTransformRHelp.AutoSize = True - Me.cmdTransformRHelp.Location = New System.Drawing.Point(216, 195) - Me.cmdTransformRHelp.Name = "cmdTransformRHelp" - Me.cmdTransformRHelp.Size = New System.Drawing.Size(91, 23) - Me.cmdTransformRHelp.TabIndex = 204 - Me.cmdTransformRHelp.Text = "R Help" - Me.cmdTransformRHelp.UseVisualStyleBackColor = True - ' - 'ContextMenuStrip1 + 'ContextMenuStripTransform ' - Me.ContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BaseToolStripMenuItem, Me.DplyrToolStripMenuItem, Me.ZooToolStripMenuItem}) - Me.ContextMenuStrip1.Name = "ContextMenuStrip1" - Me.ContextMenuStrip1.Size = New System.Drawing.Size(181, 92) + Me.ContextMenuStripTransform.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BaseToolStripMenuItem, Me.DplyrToolStripMenuItem, Me.ZooToolStripMenuItem}) + Me.ContextMenuStripTransform.Name = "ContextMenuStrip1" + Me.ContextMenuStripTransform.Size = New System.Drawing.Size(102, 70) ' 'BaseToolStripMenuItem ' @@ -5494,7 +5496,7 @@ Partial Class ucrCalculator Me.grpCircular.ResumeLayout(False) Me.grpModifier.ResumeLayout(False) Me.grpSymbols.ResumeLayout(False) - Me.ContextMenuStrip1.ResumeLayout(False) + Me.ContextMenuStripTransform.ResumeLayout(False) Me.ResumeLayout(False) Me.PerformLayout() @@ -5922,7 +5924,7 @@ Partial Class ucrCalculator Friend WithEvents cmdMovProd As Button Friend WithEvents cmdCumProd As Button Friend WithEvents cmdTransformRHelp As ucrSplitButton - Friend WithEvents ContextMenuStrip1 As ContextMenuStrip + Friend WithEvents ContextMenuStripTransform As ContextMenuStrip Friend WithEvents BaseToolStripMenuItem As ToolStripMenuItem Friend WithEvents DplyrToolStripMenuItem As ToolStripMenuItem Friend WithEvents ZooToolStripMenuItem As ToolStripMenuItem diff --git a/instat/ucrCalculator.resx b/instat/ucrCalculator.resx index 5182f2b46a1..7fe5123d532 100644 --- a/instat/ucrCalculator.resx +++ b/instat/ucrCalculator.resx @@ -120,12 +120,12 @@ 123, 24 + + 313, 24 + 17, 17 - - 313, 24 - 78 From 37d6bbd0e91dea031f25f46aad4e11e435bbf77c Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Tue, 8 Nov 2022 18:49:34 +0300 Subject: [PATCH 086/122] reset changes --- instat/dlgHideDataframes.vb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 200288b64d1..688e92c2e43 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -37,6 +37,7 @@ Public Class dlgHideDataframes If bReset Then SetDefaults() End If + SetHiddenColumns() SetRCodeForControls(bReset) bReset = False autoTranslate(Me) @@ -53,6 +54,8 @@ Public Class dlgHideDataframes ucrReceiverMultipleUnhide.SetParameterIsString() ucrReceiverMultipleUnhide.Selector = ucrSelectorForDataFrames + + ucrPnlHideUnhide.AddRadioButton(rdoHideDataFrame) ucrPnlHideUnhide.AddRadioButton(rdoUnhideDataFrame) ucrPnlHideUnhide.AddParameterValuesCondition(rdoHideDataFrame, "checked", "rdoHide") @@ -74,6 +77,8 @@ Public Class dlgHideDataframes clsTildeOperator = New ROperator clsDummyFunction = New RFunction + ucrSelectorForDataFrames.Reset() + clsDummyFunction.AddParameter("checked", "rdoHide", iPosition:=0) clsMappingFunction.SetPackageName("purrr") From 9b531855c29c77241c65affdae0fe713914f008c Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Wed, 9 Nov 2022 09:51:32 +0300 Subject: [PATCH 087/122] cleaning code --- instat/dlgHideDataframes.vb | 2 -- 1 file changed, 2 deletions(-) diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 688e92c2e43..846560bdd62 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -54,8 +54,6 @@ Public Class dlgHideDataframes ucrReceiverMultipleUnhide.SetParameterIsString() ucrReceiverMultipleUnhide.Selector = ucrSelectorForDataFrames - - ucrPnlHideUnhide.AddRadioButton(rdoHideDataFrame) ucrPnlHideUnhide.AddRadioButton(rdoUnhideDataFrame) ucrPnlHideUnhide.AddParameterValuesCondition(rdoHideDataFrame, "checked", "rdoHide") From e85147e2eeafcb30ebb1c376f3ed686a4e5c8abf Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Wed, 9 Nov 2022 11:26:02 +0300 Subject: [PATCH 088/122] More changes to the Integer keyboard. --- instat/ucrCalculator.Designer.vb | 156 +++++++++++++++---------------- instat/ucrCalculator.vb | 28 +++--- 2 files changed, 94 insertions(+), 90 deletions(-) diff --git a/instat/ucrCalculator.Designer.vb b/instat/ucrCalculator.Designer.vb index 2b0f26e8b66..deda6c34aa6 100644 --- a/instat/ucrCalculator.Designer.vb +++ b/instat/ucrCalculator.Designer.vb @@ -83,7 +83,7 @@ Partial Class ucrCalculator Me.cmdYmd = New System.Windows.Forms.Button() Me.cmdLeap = New System.Windows.Forms.Button() Me.grpInteger = New System.Windows.Forms.GroupBox() - Me.cmdFactorize2 = New System.Windows.Forms.Button() + Me.cmdFactorize = New System.Windows.Forms.Button() Me.cmdSquare = New System.Windows.Forms.Button() Me.cmdTriangle = New System.Windows.Forms.Button() Me.cmdPadovan = New System.Windows.Forms.Button() @@ -111,7 +111,6 @@ Partial Class ucrCalculator Me.cmdGCD = New System.Windows.Forms.Button() Me.cmdGeneratePrimes = New System.Windows.Forms.Button() Me.cmdNthPrime = New System.Windows.Forms.Button() - Me.cmdIntegerRHelp = New instat.ucrSplitButton() Me.ContextMenuStripInteger = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.GmpToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.DescToolsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() @@ -127,7 +126,6 @@ Partial Class ucrCalculator Me.cmdRankPercent = New System.Windows.Forms.Button() Me.cmdDivisors = New System.Windows.Forms.Button() Me.cmdFibonacci = New System.Windows.Forms.Button() - Me.cmdFactorize = New System.Windows.Forms.Button() Me.cmdNextPrime = New System.Windows.Forms.Button() Me.cmdChoosez = New System.Windows.Forms.Button() Me.cmdFactorial = New System.Windows.Forms.Button() @@ -323,7 +321,10 @@ Partial Class ucrCalculator Me.cmdBeta = New System.Windows.Forms.Button() Me.cmdDigamma = New System.Windows.Forms.Button() Me.grpTransform = New System.Windows.Forms.GroupBox() - Me.cmdTransformRHelp = New instat.ucrSplitButton() + Me.ContextMenuStripTransform = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.BaseToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.DplyrToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ZooToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.cmdRev = New System.Windows.Forms.Button() Me.cmdMovProd = New System.Windows.Forms.Button() Me.cmdCumProd = New System.Windows.Forms.Button() @@ -453,15 +454,14 @@ Partial Class ucrCalculator Me.cmdbegin = New System.Windows.Forms.Button() Me.cmdAny1 = New System.Windows.Forms.Button() Me.cmdStringRHelp = New System.Windows.Forms.Button() + Me.cmdLucas = New System.Windows.Forms.Button() + Me.cmdIntegerRHelp = New instat.ucrSplitButton() + Me.cmdTransformRHelp = New instat.ucrSplitButton() Me.ucrSaveResultInto = New instat.ucrSave() Me.ucrTryCalculator = New instat.ucrTry() Me.ucrInputCalOptions = New instat.ucrInputComboBox() Me.ucrSelectorForCalculations = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrReceiverForCalculation = New instat.ucrReceiverExpression() - Me.ContextMenuStripTransform = New System.Windows.Forms.ContextMenuStrip(Me.components) - Me.BaseToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() - Me.DplyrToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() - Me.ZooToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.grpBasic.SuspendLayout() Me.grpDates.SuspendLayout() Me.grpInteger.SuspendLayout() @@ -473,12 +473,12 @@ Partial Class ucrCalculator Me.grpSummary.SuspendLayout() Me.grpProbabilty.SuspendLayout() Me.grpTransform.SuspendLayout() + Me.ContextMenuStripTransform.SuspendLayout() Me.grpLogical.SuspendLayout() Me.grpTestString.SuspendLayout() Me.grpCircular.SuspendLayout() Me.grpModifier.SuspendLayout() Me.grpSymbols.SuspendLayout() - Me.ContextMenuStripTransform.SuspendLayout() Me.SuspendLayout() ' 'lblExpression @@ -996,7 +996,8 @@ Partial Class ucrCalculator ' 'grpInteger ' - Me.grpInteger.Controls.Add(Me.cmdFactorize2) + Me.grpInteger.Controls.Add(Me.cmdLucas) + Me.grpInteger.Controls.Add(Me.cmdFactorize) Me.grpInteger.Controls.Add(Me.cmdSquare) Me.grpInteger.Controls.Add(Me.cmdTriangle) Me.grpInteger.Controls.Add(Me.cmdPadovan) @@ -1033,7 +1034,6 @@ Partial Class ucrCalculator Me.grpInteger.Controls.Add(Me.cmdRankPercent) Me.grpInteger.Controls.Add(Me.cmdDivisors) Me.grpInteger.Controls.Add(Me.cmdFibonacci) - Me.grpInteger.Controls.Add(Me.cmdFactorize) Me.grpInteger.Controls.Add(Me.cmdNextPrime) Me.grpInteger.Controls.Add(Me.cmdChoosez) Me.grpInteger.Controls.Add(Me.cmdFactorial) @@ -1046,14 +1046,14 @@ Partial Class ucrCalculator Me.grpInteger.TabStop = False Me.grpInteger.Text = "Integer" ' - 'cmdFactorize2 + 'cmdFactorize ' - Me.cmdFactorize2.Location = New System.Drawing.Point(149, 39) - Me.cmdFactorize2.Name = "cmdFactorize2" - Me.cmdFactorize2.Size = New System.Drawing.Size(75, 23) - Me.cmdFactorize2.TabIndex = 44 - Me.cmdFactorize2.Text = "factorize2" - Me.cmdFactorize2.UseVisualStyleBackColor = True + Me.cmdFactorize.Location = New System.Drawing.Point(75, 39) + Me.cmdFactorize.Name = "cmdFactorize" + Me.cmdFactorize.Size = New System.Drawing.Size(75, 23) + Me.cmdFactorize.TabIndex = 44 + Me.cmdFactorize.Text = "factorize" + Me.cmdFactorize.UseVisualStyleBackColor = True ' 'cmdSquare ' @@ -1324,18 +1324,6 @@ Partial Class ucrCalculator Me.cmdNthPrime.Text = "nth_prime" Me.cmdNthPrime.UseVisualStyleBackColor = True ' - 'cmdIntegerRHelp - ' - Me.cmdIntegerRHelp.AutoSize = True - Me.cmdIntegerRHelp.ContextMenuStrip = Me.ContextMenuStripInteger - Me.cmdIntegerRHelp.Location = New System.Drawing.Point(210, 289) - Me.cmdIntegerRHelp.Name = "cmdIntegerRHelp" - Me.cmdIntegerRHelp.Size = New System.Drawing.Size(91, 23) - Me.cmdIntegerRHelp.SplitMenuStrip = Me.ContextMenuStripInteger - Me.cmdIntegerRHelp.TabIndex = 16 - Me.cmdIntegerRHelp.Text = "R Help" - Me.cmdIntegerRHelp.UseVisualStyleBackColor = True - ' 'ContextMenuStripInteger ' Me.ContextMenuStripInteger.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.GmpToolStripMenuItem, Me.DescToolsToolStripMenuItem, Me.RutilsToolStripMenuItem, Me.PrimesToolStripMenuItem, Me.ZseqToolStripMenuItem, Me.UtilsToolStripMenuItem}) @@ -1448,22 +1436,13 @@ Partial Class ucrCalculator ' 'cmdFibonacci ' - Me.cmdFibonacci.Location = New System.Drawing.Point(223, 39) + Me.cmdFibonacci.Location = New System.Drawing.Point(149, 39) Me.cmdFibonacci.Name = "cmdFibonacci" Me.cmdFibonacci.Size = New System.Drawing.Size(75, 23) Me.cmdFibonacci.TabIndex = 7 Me.cmdFibonacci.Text = "fibonacci" Me.cmdFibonacci.UseVisualStyleBackColor = True ' - 'cmdFactorize - ' - Me.cmdFactorize.Location = New System.Drawing.Point(75, 39) - Me.cmdFactorize.Name = "cmdFactorize" - Me.cmdFactorize.Size = New System.Drawing.Size(75, 23) - Me.cmdFactorize.TabIndex = 6 - Me.cmdFactorize.Text = "factorize" - Me.cmdFactorize.UseVisualStyleBackColor = True - ' 'cmdNextPrime ' Me.cmdNextPrime.Location = New System.Drawing.Point(149, 137) @@ -3847,17 +3826,29 @@ Partial Class ucrCalculator Me.grpTransform.TabStop = False Me.grpTransform.Text = "Transform" ' - 'cmdTransformRHelp + 'ContextMenuStripTransform ' - Me.cmdTransformRHelp.AutoSize = True - Me.cmdTransformRHelp.ContextMenuStrip = Me.ContextMenuStripTransform - Me.cmdTransformRHelp.Location = New System.Drawing.Point(216, 195) - Me.cmdTransformRHelp.Name = "cmdTransformRHelp" - Me.cmdTransformRHelp.Size = New System.Drawing.Size(91, 23) - Me.cmdTransformRHelp.SplitMenuStrip = Me.ContextMenuStripTransform - Me.cmdTransformRHelp.TabIndex = 204 - Me.cmdTransformRHelp.Text = "R Help" - Me.cmdTransformRHelp.UseVisualStyleBackColor = True + Me.ContextMenuStripTransform.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BaseToolStripMenuItem, Me.DplyrToolStripMenuItem, Me.ZooToolStripMenuItem}) + Me.ContextMenuStripTransform.Name = "ContextMenuStrip1" + Me.ContextMenuStripTransform.Size = New System.Drawing.Size(102, 70) + ' + 'BaseToolStripMenuItem + ' + Me.BaseToolStripMenuItem.Name = "BaseToolStripMenuItem" + Me.BaseToolStripMenuItem.Size = New System.Drawing.Size(101, 22) + Me.BaseToolStripMenuItem.Text = "base" + ' + 'DplyrToolStripMenuItem + ' + Me.DplyrToolStripMenuItem.Name = "DplyrToolStripMenuItem" + Me.DplyrToolStripMenuItem.Size = New System.Drawing.Size(101, 22) + Me.DplyrToolStripMenuItem.Text = "dplyr" + ' + 'ZooToolStripMenuItem + ' + Me.ZooToolStripMenuItem.Name = "ZooToolStripMenuItem" + Me.ZooToolStripMenuItem.Size = New System.Drawing.Size(101, 22) + Me.ZooToolStripMenuItem.Text = "zoo" ' 'cmdRev ' @@ -5367,6 +5358,39 @@ Partial Class ucrCalculator Me.cmdStringRHelp.Text = "R Help" Me.cmdStringRHelp.UseVisualStyleBackColor = True ' + 'cmdLucas + ' + Me.cmdLucas.Location = New System.Drawing.Point(223, 39) + Me.cmdLucas.Name = "cmdLucas" + Me.cmdLucas.Size = New System.Drawing.Size(75, 23) + Me.cmdLucas.TabIndex = 45 + Me.cmdLucas.Text = "lucas" + Me.cmdLucas.UseVisualStyleBackColor = True + ' + 'cmdIntegerRHelp + ' + Me.cmdIntegerRHelp.AutoSize = True + Me.cmdIntegerRHelp.ContextMenuStrip = Me.ContextMenuStripInteger + Me.cmdIntegerRHelp.Location = New System.Drawing.Point(210, 289) + Me.cmdIntegerRHelp.Name = "cmdIntegerRHelp" + Me.cmdIntegerRHelp.Size = New System.Drawing.Size(91, 23) + Me.cmdIntegerRHelp.SplitMenuStrip = Me.ContextMenuStripInteger + Me.cmdIntegerRHelp.TabIndex = 16 + Me.cmdIntegerRHelp.Text = "R Help" + Me.cmdIntegerRHelp.UseVisualStyleBackColor = True + ' + 'cmdTransformRHelp + ' + Me.cmdTransformRHelp.AutoSize = True + Me.cmdTransformRHelp.ContextMenuStrip = Me.ContextMenuStripTransform + Me.cmdTransformRHelp.Location = New System.Drawing.Point(216, 195) + Me.cmdTransformRHelp.Name = "cmdTransformRHelp" + Me.cmdTransformRHelp.Size = New System.Drawing.Size(91, 23) + Me.cmdTransformRHelp.SplitMenuStrip = Me.ContextMenuStripTransform + Me.cmdTransformRHelp.TabIndex = 204 + Me.cmdTransformRHelp.Text = "R Help" + Me.cmdTransformRHelp.UseVisualStyleBackColor = True + ' 'ucrSaveResultInto ' Me.ucrSaveResultInto.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink @@ -5423,37 +5447,13 @@ Partial Class ucrCalculator Me.ucrReceiverForCalculation.TabIndex = 120 Me.ucrReceiverForCalculation.ucrSelector = Nothing ' - 'ContextMenuStripTransform - ' - Me.ContextMenuStripTransform.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BaseToolStripMenuItem, Me.DplyrToolStripMenuItem, Me.ZooToolStripMenuItem}) - Me.ContextMenuStripTransform.Name = "ContextMenuStrip1" - Me.ContextMenuStripTransform.Size = New System.Drawing.Size(102, 70) - ' - 'BaseToolStripMenuItem - ' - Me.BaseToolStripMenuItem.Name = "BaseToolStripMenuItem" - Me.BaseToolStripMenuItem.Size = New System.Drawing.Size(180, 22) - Me.BaseToolStripMenuItem.Text = "base" - ' - 'DplyrToolStripMenuItem - ' - Me.DplyrToolStripMenuItem.Name = "DplyrToolStripMenuItem" - Me.DplyrToolStripMenuItem.Size = New System.Drawing.Size(180, 22) - Me.DplyrToolStripMenuItem.Text = "dplyr" - ' - 'ZooToolStripMenuItem - ' - Me.ZooToolStripMenuItem.Name = "ZooToolStripMenuItem" - Me.ZooToolStripMenuItem.Size = New System.Drawing.Size(180, 22) - Me.ZooToolStripMenuItem.Text = "zoo" - ' 'ucrCalculator ' Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.Controls.Add(Me.grpTransform) Me.Controls.Add(Me.grpInteger) + Me.Controls.Add(Me.grpTransform) Me.Controls.Add(Me.grpDates) Me.Controls.Add(Me.grpWakefield) Me.Controls.Add(Me.grpLogical) @@ -5491,12 +5491,12 @@ Partial Class ucrCalculator Me.grpProbabilty.ResumeLayout(False) Me.grpTransform.ResumeLayout(False) Me.grpTransform.PerformLayout() + Me.ContextMenuStripTransform.ResumeLayout(False) Me.grpLogical.ResumeLayout(False) Me.grpTestString.ResumeLayout(False) Me.grpCircular.ResumeLayout(False) Me.grpModifier.ResumeLayout(False) Me.grpSymbols.ResumeLayout(False) - Me.ContextMenuStripTransform.ResumeLayout(False) Me.ResumeLayout(False) Me.PerformLayout() @@ -5874,7 +5874,6 @@ Partial Class ucrCalculator Friend WithEvents cmdBigZ As Button Friend WithEvents cmdNextPrime As Button Friend WithEvents cmdChoosez As Button - Friend WithEvents cmdFactorize As Button Friend WithEvents cmdFibonacci As Button Friend WithEvents cmdDigitSum As Button Friend WithEvents cmdRankPercent As Button @@ -5916,7 +5915,7 @@ Partial Class ucrCalculator Friend WithEvents cmdAbundant As Button Friend WithEvents cmdFibonacci2 As Button Friend WithEvents cmdPalindrome As Button - Friend WithEvents cmdFactorize2 As Button + Friend WithEvents cmdFactorize As Button Friend WithEvents GmpToolStripMenuItem As ToolStripMenuItem Friend WithEvents ZseqToolStripMenuItem As ToolStripMenuItem Friend WithEvents UtilsToolStripMenuItem As ToolStripMenuItem @@ -5928,4 +5927,5 @@ Partial Class ucrCalculator Friend WithEvents BaseToolStripMenuItem As ToolStripMenuItem Friend WithEvents DplyrToolStripMenuItem As ToolStripMenuItem Friend WithEvents ZooToolStripMenuItem As ToolStripMenuItem + Friend WithEvents cmdLucas As Button End Class diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index ae0ac4b6c07..5e15d1d33ae 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -222,8 +222,7 @@ Public Class ucrCalculator ttCalculator.SetToolTip(cmdFactorial, "factorial n!, as big integer. For example, factorialZ(6)= 720") ttCalculator.SetToolTip(cmdChoosez, "computes binomial coefficient choose(n,k) as a big integer. For example, chooseZ(20,2)=190") ttCalculator.SetToolTip(cmdNextPrime, "gives the next prime number. For example, nextprime(14)= 17") - ttCalculator.SetToolTip(cmdFactorize, "computes the prime factorizations. For example, prime_factors(20)= (2,5,2,1)") - ttCalculator.SetToolTip(cmdFactorize2, "compute the prime factorization(s) of integer(s) n. For example, Factorize(21)=c(3, 7, 1, 1)") + ttCalculator.SetToolTip(cmdFactorize, "compute the prime factorizations. For example, Factorize(20)= (2,5,2,1)") ttCalculator.SetToolTip(cmdIsPrime, "checks if the number is prime and returns 0 or 2, 0= False, 2= True. For example, is.prime(10) returns 0") ttCalculator.SetToolTip(cmdFibonacci, "generates Fibonacci numbers. For example, Fibonacci(8)=21") ttCalculator.SetToolTip(cmdDivisors, "returns the divisors of x. For example, Divisors(21)= c(1,3,7)") @@ -259,6 +258,7 @@ Public Class ucrCalculator ttCalculator.SetToolTip(cmdPadovan, "sum of last but 1 and last but 2 values. So from ...7, 9, 12, next is 7+9 = 16.") ttCalculator.SetToolTip(cmdTriangle, "number of objects in a triangle, so 0, 1, 3, 6, 10...") ttCalculator.SetToolTip(cmdSquare, "squares of each integer, so 1, 4, 9, 16.") + ttCalculator.SetToolTip(cmdLucas, "generartes lucas numbers to the length of the dataframe. For example the 10th lucas number is 76") End Sub @@ -1402,7 +1402,7 @@ Public Class ucrCalculator iCallType:=2, bSeparateThread:=False, bUpdateGrids:=False) End Sub - Private Sub cmdHelp_Click(sender As Object, e As EventArgs) Handles cmdRHelp.Click, cmdHydroHelp.Click, cmdTransformHelp.Click, cmdCircularHelp.Click, cmdWakefieldHelp.Click, cmdMathsHelp.Click, cmdLogicalHelp.Click, cmdSummaryHelp.Click, cmdProbRHelp.Click, cmdStringRHelp.Click + Private Sub cmdHelp_Click(sender As Object, e As EventArgs) Handles cmdRHelp.Click, cmdHydroHelp.Click, cmdCircularHelp.Click, cmdWakefieldHelp.Click, cmdMathsHelp.Click, cmdLogicalHelp.Click, cmdSummaryHelp.Click, cmdProbRHelp.Click, cmdStringRHelp.Click OpenHelpPage() End Sub @@ -3857,14 +3857,6 @@ Public Class ucrCalculator End If End Sub - Private Sub cmdFactorize_Click(sender As Object, e As EventArgs) Handles cmdFactorize.Click - If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("primes::prime_factors(x = )", 2) - Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("primes::prime_factors()", 1) - End If - End Sub - Private Sub cmdFibonacci_Click(sender As Object, e As EventArgs) Handles cmdFibonacci.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("DescTools::Fibonacci(n = )", 2) @@ -4215,7 +4207,7 @@ Public Class ucrCalculator End If End Sub - Private Sub cmdFactorize2_Click(sender As Object, e As EventArgs) Handles cmdFactorize2.Click + Private Sub cmdFactorize2_Click(sender As Object, e As EventArgs) Handles cmdFactorize.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("DescTools::Factorize(n= )", 1) Else @@ -4302,4 +4294,16 @@ Public Class ucrCalculator End If OpenHelpPage() End Sub + + Private Sub cmdLucas_Click(sender As Object, e As EventArgs) Handles cmdLucas.Click + clsDataFunction.SetRCommand("nrow") + clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem) + + clsZseqFunction.SetPackageName("Zseq") + clsZseqFunction.SetRCommand("Lucas") + clsZseqFunction.AddParameter("n", clsRFunctionParameter:=clsDataFunction, iPosition:=0) + clsZseqFunction.AddParameter("gmp", "TRUE", iPosition:=1) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsZseqFunction.ToScript, 0) + End Sub End Class From d895f6bfbc59f3cbbc4dc82f8a98cff11b844c30 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Wed, 9 Nov 2022 14:31:01 +0300 Subject: [PATCH 089/122] Made suggested changes --- instat/Model/Output/clsOutputElement.vb | 12 +++- instat/Model/Output/clsOutputLogger.vb | 30 ++++++--- instat/UserControl/ucrOutputPage.vb | 4 +- .../Webview/Windows/CefRuntimeWrapper.vb | 41 +++++++++--- .../Webview/Windows/ucrWebViewer.vb | 14 ++-- instat/UserControls/frmMaximiseOutput.vb | 30 +++++++-- instat/UserControls/ucrTextViewer.vb | 64 ++++++++++++------- instat/frmMain.vb | 6 +- 8 files changed, 148 insertions(+), 53 deletions(-) diff --git a/instat/Model/Output/clsOutputElement.vb b/instat/Model/Output/clsOutputElement.vb index a4a68a70527..f228b9c59fc 100644 --- a/instat/Model/Output/clsOutputElement.vb +++ b/instat/Model/Output/clsOutputElement.vb @@ -22,13 +22,18 @@ Public Class clsOutputElement Private _id As Integer 'hold the script elements that form the R script that produced the output Private _lstRScriptElements As New List(Of clsRScriptElement) + Private _outputType As OutputType + 'todo. deprecate this list with _lstTextOutput ? Private _lstStringOutput As New List(Of String) + 'holds the file paths to the text outputs Private _lstTextOutput As New List(Of String) + 'holds the file paths to the image outputs Private _lstImageOutput As New List(Of String) + 'holds the file paths to the html outputs Private _lstHtmlOutput As New List(Of String) @@ -54,11 +59,13 @@ Public Class clsOutputElement _id = value End Set End Property + Public ReadOnly Property TextOutput As String Get Return _lstTextOutput.FirstOrDefault() End Get End Property + ''' ''' Holds image file path if outputType is image file ''' @@ -68,11 +75,13 @@ Public Class clsOutputElement Return _lstImageOutput.FirstOrDefault() End Get End Property + Public ReadOnly Property HtmlOutput As String Get - Return _lstHtmlOutput.FirstOrDefault + Return _lstHtmlOutput.FirstOrDefault() End Get End Property + ''' ''' Defines the type of output ''' @@ -156,4 +165,5 @@ Public Class clsOutputElement _lstRScriptElements = script _outputType = OutputType.TextOutput End Sub + End Class \ No newline at end of file diff --git a/instat/Model/Output/clsOutputLogger.vb b/instat/Model/Output/clsOutputLogger.vb index 905a902f289..a303773f9eb 100644 --- a/instat/Model/Output/clsOutputLogger.vb +++ b/instat/Model/Output/clsOutputLogger.vb @@ -22,6 +22,7 @@ Public Class clsOutputLogger Private _filteredOutputs As List(Of clsOutputList) Private _lastScriptElement As clsOutputElement Private _output As List(Of clsOutputElement) + ''Output not used externally at the moment but will this will need to ''change if we are to remove from the output list. Public ReadOnly Property Output As List(Of clsOutputElement) @@ -29,6 +30,7 @@ Public Class clsOutputLogger Return _output End Get End Property + ''' ''' Constructor ''' @@ -36,22 +38,26 @@ Public Class clsOutputLogger _output = New List(Of clsOutputElement) _filteredOutputs = New List(Of clsOutputList) End Sub + ''' ''' Event to show a new filtered list has been added ''' ''' Public Event NewFilteredListAdded(listName As String) + ''' ''' Event to show a new output as been added ''' ''' Public Event NewOutputAdded(outputElement As clsOutputElement) + ''' ''' Event to show an output as been added to a new filtered list ''' ''' ''' Public Event NewOutputAddedToFilteredList(outputElement As clsOutputElement, listName As String) + ''' ''' Holds a list of outputs that can be edited ''' @@ -64,6 +70,7 @@ Public Class clsOutputLogger _filteredOutputs = value End Set End Property + Public Sub AddFileOutput(strFileName As String) Dim strFileExtension As String = Path.GetExtension(strFileName).ToLower Select Case strFileExtension @@ -74,10 +81,13 @@ Public Class clsOutputLogger Case ".txt" AddTextOutput(strFileName) Case Else - 'todo. developer error - Return + MessageBox.Show("The file type to be added is currently not suported", + "Developer Error", + MessageBoxButtons.OK, + MessageBoxIcon.Error) End Select End Sub + ''' ''' Adds string output to be displayed within the output ''' @@ -93,6 +103,7 @@ Public Class clsOutputLogger RaiseEvent NewOutputAdded(outputElement) End If End Sub + ''' ''' Adds text file to be displayed within the output ''' @@ -108,6 +119,7 @@ Public Class clsOutputLogger RaiseEvent NewOutputAdded(outputElement) End If End Sub + ''' ''' Adds image file to be displayed within the output ''' @@ -123,6 +135,7 @@ Public Class clsOutputLogger RaiseEvent NewOutputAdded(outputElement) End If End Sub + ''' ''' Adds html output to be displayed within the output ''' @@ -138,6 +151,7 @@ Public Class clsOutputLogger RaiseEvent NewOutputAdded(outputElement) End If End Sub + ''' ''' Adds an output to the given filtered list ''' @@ -150,6 +164,7 @@ Public Class clsOutputLogger filteredList.Output.Add(outputElement) RaiseEvent NewOutputAddedToFilteredList(outputElement, strListName) End Sub + ''' ''' Adds script to be displayed within the output ''' @@ -162,6 +177,7 @@ Public Class clsOutputLogger _output.Add(_lastScriptElement) RaiseEvent NewOutputAdded(_lastScriptElement) End Sub + ''' ''' Deletes output from a filtered list ''' @@ -176,6 +192,7 @@ Public Class clsOutputLogger element.Id -= 1 Next End Sub + ''' ''' Deletes output from main output list ''' @@ -183,6 +200,7 @@ Public Class clsOutputLogger Public Sub DeleteOutputFromMainList(outputElement As clsOutputElement) _output.RemoveAll(Function(x) x Is outputElement) End Sub + ''' ''' Returns the filtered list given the name. Will create the list if doesnt already exist. ''' @@ -199,6 +217,7 @@ Public Class clsOutputLogger End If Return filteredList End Function + ''' ''' Checks to see if list name is a valid name for a filtered list ''' @@ -211,10 +230,5 @@ Public Class clsOutputLogger End If Return True End Function -End Class - - - - - +End Class \ No newline at end of file diff --git a/instat/UserControl/ucrOutputPage.vb b/instat/UserControl/ucrOutputPage.vb index f7d03c6c6f2..5972b2b9fba 100644 --- a/instat/UserControl/ucrOutputPage.vb +++ b/instat/UserControl/ucrOutputPage.vb @@ -243,8 +243,6 @@ Public Class ucrOutputPage 'todo. instead of copy paste, add image to rtf directly from file? Clipboard.SetImage(GetBitmapFromFile(element.ImageOutput)) richText.Paste() - Case OutputType.HtmlOutput - 'todo End Select richText.AppendText(Environment.NewLine) richText.AppendText(Environment.NewLine) @@ -308,7 +306,7 @@ Public Class ucrOutputPage ucrTextViewer.LoadTextFile(strFileName:=outputElement.TextOutput) ucrTextViewer.FormatText(OutputFont.ROutputFont, OutputFont.ROutputColour) - AddHandler ucrTextViewer._richTextBox.MouseLeave, AddressOf panelContents_MouseLeave + AddHandler ucrTextViewer.richTextBox.MouseLeave, AddressOf panelContents_MouseLeave panel.Controls.Add(linkLabel) panel.Controls.Add(ucrTextViewer) diff --git a/instat/UserControls/Webview/Windows/CefRuntimeWrapper.vb b/instat/UserControls/Webview/Windows/CefRuntimeWrapper.vb index 819c5fd85a1..313f3307ac0 100644 --- a/instat/UserControls/Webview/Windows/CefRuntimeWrapper.vb +++ b/instat/UserControls/Webview/Windows/CefRuntimeWrapper.vb @@ -1,5 +1,19 @@ -Imports System.IO -Imports System.Runtime.ConstrainedExecution +' R- Instat +' Copyright (C) 2015-2017 +' +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU General Public License for more details. +' +' You should have received a copy of the GNU General Public License +' along with this program. If not, see . +Imports System.IO Imports CefSharp Imports CefSharp.SchemeHandler Imports CefSharp.WinForms @@ -12,7 +26,7 @@ Imports CefSharp.WinForms ''' the class is declared as 'NotInheritable` and the constructor is declared as 'Private'. ''' '''
  • On_amW$?)F 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 <7TM1<%`zwr8rheI1_2y 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�aBP24!gm4x8YgiF73lcSLmRz-Z9FePgA?)Aq`2L;YlZbfT zkufcXLxw#DpZ*)&-DC6M0p4b)(E1D!q1Wm6{}L@CHHoi7noPl@b|zNxo4ia39ny*Z zthfe_FIBQ`$X*G1Vl`W!T?#OtGnObSXCQ;)ixtI~fx%T^Epy6w!Il-HO=EAR6EPxg zf8RK9LOVVP9(IDtrm-(q)Z*Yb;M%bVSOuq_Pp8I->_WWz)5a`<5ne74tjMwz8vBaT zJ^(1;_ywei7XXgWc?RIl4V8y)#!8NMDF~vyMPDZf zd*c6?TyEzLIzLgQEDrx01609PJF_ZW;BCbw8O;JnGW%CuWMIent0I`Cb%sso$Js5! zB>NSw)2H}Si3>OZBn`PiFkPl!q(8eLTq@uY7jwl7i52hAa}nx3~7Aw;7k@;xzu<;h>^DvHh#!C3(W=3R~!gz)r(mYlxC!g z1+$Hw5Z-wzsiQOGxi^B1bzY3`R2vU4wt-w!*M4{=3*Xsdd>>MNhf+mewkZ@Ap-~9i ziHm(OdLR%-!Of6B9B`5XTJ^f)a~WiG@{2SXh-T{paBs&um_B7B6b(n#4G0kEMA59wIjFmC#(R^pMpb8g;5h zE9>jg27aeWzk^n5#B{u3te_8)-@lwWpd$I3={b!670GYktrY-#{7p1XD<-5#eNi(8DBdh_uu7YOa@CZk6Aa;0kbTSTCFb@p_6;Vow-sH^_zbmJJY2*s!2YFSPvCMIXlsWGAmU=Hh>bea20;b?APPdo9#CHiWrhn-#Qeno21_AG;bc~rzlhd{ z3&>aaS(m7p`lppcmnd8S?)6Uq3{^ohk2v!H$@&Wbxy`1|BYFg{yfYX zQ~}eLCeT+$oayNp0IRd7*>QXDL`4 zej^=<6ySvV4fH{z>W!YFqXYx)5m=NuDt_8I2||YcaM~6npmXRSt7`^#t-C2Uo1Tjj zlXhFghe#cxR(NMdYdl5&-I*OePx`}+Zt-ucE z(hJ?ODdc*_nG#+nhc1I)cQYMNXw9L6&)_Vl%Arf?_G|$JbLbM>T+_((tTPYh;)b^1 zY+yUE)qC6%*bFMPKn`uD=p13icQ(**5)wFl8Hk2I}T);%L$RQUk z%oQ-bJ;XLN@hRZ`szSOPT2DK21r&~k)=_`1Xv8=!#@bJ&?&mPP@p9-Q$`~*5I^>YD znQ33idcmlz{>RCoHB4mZ80!%S{v+j(GPrGD*{ISQp;fLdENcf`(RL7E}^n z|0-p9AcdiAe$O%P3&@iv;*;eNa|YAYBhOfVz)?Vn96Fz#%Tp7)ba%c0%V!86Q9eIW zLyIxMOjH2e3l0Y4@!B@R8h8g5{ye%oU!*0A`%F883$% z=uCnFD+8IxYoX7Ohp#kKbb(02a@(;kW)ODK;R|3OV2CZ##4(W;3HY5WhZ=EXHjpCJ zUjCvjnzk1Rc=ZK^>Ka)HOjs{&uLAZknL>jFt9I5SiG* z3wR4F${Txr1ie2;4%J`_7eas=RI5@sR8293Vj?D#T^DlEfY$>Ru*;$O@GHHHx+YiW z(4+M>Bi&f2K2S;b6$*&P56z=z3k3u=hUU`ti>niM7m4^xImAv0)6hiF#Pw)sr5u_K zQBB;N7gvvm;-zy&c(WXugd8B%%Ast!VOwk}&AQXct~7_T=$%rLOS-SD55Ux;h)w^jLYI2wKPI4wg2p!Z3{r?h z^>{hhfK{GGUtI?Zl|>HLQ}hWd0LnodlpCw4>klj9ss4l&{TmeII$_0wIar4pP^rHj zP*Rp0TtttYu!5vCxR8#Yu!6!jSWBs2TX8uLTB-hPD`X`H7tp0&TXDVzYsmAp6}ppy z)i?_kWVjI^$y7O5h1U!A3^zB#QtE%LxO@la)13cW@l+00(yISj!IdAJM>imVs&nzI z)X=FLohAJFIrQm&)#qnZ^fy*K^@Fo$_BU4Ck%Kd-^BZecx*VK=bt{H+!;1P zHvq~>NDKt>IMjX7BECCWOzHgZTiD zt7zV~d8stF#|alOaxjk~zPEx)Jjg`uirwdD$I|@ot+;;%bLoYXO%}R2HFgX&_?Kjn zexuU{4VA&1Ga2J)&JWf`l+C7HKUn{SKo%AKX#F#q%LEKtPIEWmP~^)&3wFh1TE7Ws zQlcEpp!A=tNfYH@x|%Tzh9_r3yIBsV;asM$APXA>4*YjuGXUlTDEGxCXL@y#9E2Jb z&Pxa6EH|?F4yFe|Rv zJmbkG7>JUCtiT?JDC^5$jbZL-FrG4hwnD*skWIj+G{W#WzF!3qVURwM9ZL38shbzT=9%Vnqt=+2VwIOF0-#r6;X9=%O-B1S;sp zzD(Rs7RW&pU4Bv>4I|xiQmwmzo;zv9%QdK{&rezb?hZ!aId#zG zJC^{Qz7+G1yC9s}eo?1(EXiNgVH`vE{Gv{F7`^k0It4mPI;DP=!H{OK+6L=u#*6UZgozCw9&x!z)W?rceqAa#R0A# zF9)_!<7sO`njF}QwM=VlV^d>n)^{{CUJhJFSDm(k%s+4`?Ky3Qz}vtjC|geNZgr;b zh>-(ZFdbNel~{om<$Gd=UVB~0HqCN<=xkk7=(ka`^`B{DLvtg))0am+6?$FduF%&b z&yTE(%rpK?b0So0I&5k+U23>O^Op7t(_H-(rbOc>nmyXX#_NsCjHSkS%`Mtt!v}_E z4G$Q0Yv+bPVpwXJZLk=0QAfg0C+d&t_v&|#DT~^tCH+PErFvWVl&AqHXuQCNUw2gSQ2EmGF0kn{m%iKSHKxoz;Fn5ipKsY>fgRX znFO{IwKj`~w60qyszoG~hyTPRRIU)9J8@SaaIdlZl7Y1#r-!9`EwvEnV;t1oEP`r5U5&nROn|U>2GP{mhv{gGDA&5we*&dA@GxrZx0A~* z5+l%jUO-t_VXHk3AcijgIVle~fNg8+Bec9pq=97EHlBWRh|FoOp#Z%y_#sfIUJWk` zIXl1H@$_Hyg;R3L?i6`i*C1Wy6ywu0c7-wWuwCmwhzf`$wB-ampS@6TkEIu#KrCGY z=cJfg0ljJLLlo00l=0!VY_hcqNDlP#e>&aQDp+!0kX(o{0kbWOergrjb6vgwYj|`H z(dmC;LC#qTE}Stss{v%2lQIJnlGzQHx;^KKTAFJYNqSy3w*{zvC~=OS=f6Q;45BUV zT_O^~INw7li^XEC%gg@-Z4^+DWy*jGj5(1ic zM-RPyfr!_-c9U%hQ+?e5av&E&sTcGgtIdSiZ#F3tGXF$J(FwX|iAdMF`Z$u3YS000 z6oirkLI`J$B8aa$Om=8Amo5X9)6~Zkk6P(rJba?V%S3uO%4|0shr>JHGEu3E+!V5a zL&PX>O(1i5s;?cQKHM?yHuR z(sz|i%p2GM^aQrl7eVOr=G59~IrTh9N#gwuG#F9)o(50j?8+JI; zfQJpZ)aztd@HBp_(Ng@NaCyh2J<&4qS{k zs)_EqZbc%ER52lC;39gyN`Q?yuoj(frpyD*1X|Vvcxk#ESVMEF1z67mtLf5eoGv*4 zPp8!atmlCadb?VHC^5kN#JI*9(Sk4FH(L(0Q*@2U*&zp%)w9O=3+E#XztM7lQSAhT zE1OkPWwTKZtY8$Rv0@@pD&VhTfb|s3jng?ko#V=qY~!?Y#HW=bu1M95(>Q+`=bx|2 zPo0MN)MtZrpFA1y^Hlz1&Y#TrY)#hOIEglO%pN9_a)2&vT50`5Cr-X;J_dE{+z zCIQ?YXry?n$c~i*4VXD|11wO0*xkD!K@QZD%_q?1P} zMN9@Am_ifkL_TIl=_x9m81*68E1fY%4op(SlU<8J*F!;|$8T|_(w~Hw&>#o$R5!X5uLh+90d$Wo zrKJR-JY4_N4s zO-#?00~whA%!V%LJT^DuK56LPv;lVL5iXJg>9_;u(zWN~MqDZf(!%D##@6yL#wF9g z&Uem+FbZG=#)C4KIoW*PKnf-&iJKa2CRYw5)A4$Bnv#GMbkMQ56=_u1z;vjAL|WP) zAZR?00C;RNwZ*S6(_jOW!v^9}xRs8-H!g)PzQCC`)`Zu>8S)xrz07;)!7h;lA)5aA zbmF6|LfAg)uO#DMGe{5p^MKQ9Hag@e=K&%7EnrsCdr zQS_>WR5;9XM$^Lk%{i!AjteTT-UR@&9-Kad?4N>_H`fE`=eX>jOgGhE-waw&|3u7WO1(05+T6Q#6Rw3y*wX>Kkir9k#ipo$08Toll% z2hHH(_2-lOK{Jr5{ycgVDX76NPbO2@cxO6D?ESfv^pF{>mi`9_S} z$^JB={brD1`oX;2Z^o_L&&GSRsWIP~I44E+Lqh_y#daZJcNcC^z#DY3hn!B31QKLF z6z93gU^b3HAalk9*`G-B9yUXRsXu`_A2#Ef>SuBEg!&*&kpEZBlKpYGJFL`wUTo6t zaAyW=kMzgl+K8(MH3ZGoyVlQ`Ec>Cr_ON-%G}*6QoYgyoKo)+DvOk6&rg|pu;wMt} zNAm?y-%weJ1pMa6{wP{=z>HVFKay@fV1}wuzlr{KK+UKT=sNtP4On6F;h-5WOg~$2 zgTM6&cwy3Izn+#JRQol8wjDH2ohkdnRr8h2+&q5uvR`>gtyl3_**}J_i+W27*o(kO z)t{w4Q}&0^7YEH*C9+?Kwau)z*q~~oW)nenwT2yrwnAa-++2^QpSTZmucbMUsEwha zWsjJ_fawnbm#dss+-{Af&o8Vq(Dou{1YRHC4mzL;__hO{Sx9BaV8i0nBW94!eA_7N zQ8S2XzO7XMs2Ox1-(|GsQL_bsOX<2tdF_3d&|U;Gq;CsWDAyMBb_Xp#;BM{8#KSb{ z+f0}DHzn*Y0Xm*1eVeG{kQwYAUoR~_q#D^sI}VxS3#3mOPq6{D1FW#F7mQvX8&8R| zvC})Cj5chac^P0h=KdJvr|EB&~&ENI+=-v7o^&R?I z8ehbJBA$r2HKIGBR>hm`uLeO-{UuCYHDD1fud>L42X0|5kwm7~P|j5tJqQmL*oSB93K}~+8J?WjT_)Y*HQ!P+f0Ph*zf$`L<7#cgTA~%{3%@1Rv18? z6%TvxN=BydIGe)Q-5X)e3hh#@2Qcdvz6~FJE$p1xVtfq_U|`H_RPKON9tjW_ zf_*`q&m%H`;*HKew>$Ayl{jTq08@v!LIV9kGBM-eIVmqmMa+1V=3W^fX3V6_tAPzZ zzQ{h7X8um(Yh4G&-*XcWo=q{KiI0rY zEc%Bgcz2}mfjMu*nFBMHR$Qx4^Qm;>wIVIk^+13sp-vBKe`q*+5O}U(^904PA;3$% zR%B$m?hnXL1x^<#d|)`|ba9QzRB{~?Z`!6%<8>mf(zP$}1$F#T;eCTAWORLb3&0_G z5;ld(26e^kGM?=L=if(rt`pEL*h?>8C$e_%Cno*o0CTlYT`$a2`&kAM%4cY1 zdO(Y2jSGz&H$D=`;3k49HEZB>QDa_bDhe^t;p-tDGlTpa2;;o%nZ{gY1XZV=fn=`8O+c}Cf)pygaxr0ljJy!3LZjFrBXU`sma$Wv8m)YrrECcbu+ z(qH4uAWx4l(wH!3qRuXT7gEed(Tuun9EhbCrc~;7uU-NRx*Hh-@vWdk8(B`rx17G( z$N~z!3n;UfWvzV6ln7Z_tMfc7JV3?%37wFv+zI5qZipdAa0^Q`|sy2A> zR6Rc%vq;|(fOL8ED^5t0Wg(4*rIX-ffk>< z9c<=Q>1zTYm`AQ~XQCxm`WnxaQUg$>W&qA=P`tc*!y&FyD1G$`19&?e?9W{3V}0c^ ziirTMiabF_H;W?7Tpg-ZPUV>$^w2_Fi*Y$i*E+SbizlD?@l>oQ@-Xv=BWWh|lSn?jFY#+bElGDZZ;T?UNk zC6kjaefuU+`c_dECVgeP$rOEWQyeQ4F|<38uG*^RsuXz7TAryrbECCu` zPA^0PzXKRuO!3>8M(Ha8tzt19j{@3X9|ajLOh6&H_Dsj{Dft2NMLFYPw$KMv3#_V= zo9ACZ-uX;|L6`}5>JM|IC>@BD+SuJuFpwpEh96Y}-W< zc8KyVgW{?V5P~e6(1mp5QLCBGKkl%A^yABr9 z=%?e3WC#fQ($x*r0dqFWz9eK35b9v8AdS}VPyy2F3_bN)LC_tbm^hxp(jJ{2z?{; zAE5`qN;{~%F6ugCc+~k}A4W~lZjLhP-;VrH7Zv%mc1`46V=5wV48JIHm9`~vu5o^3 zqUk}?E859W)ZJ)miEx-ov=&o@vETT9#9xdLXv2-t*u388G;AE>Ha@F;(P#->VE9x& z!|)Hy4~Dx8w;8TC%rTs&`_PaJv&CNn?*B{JYCY*M2Ul;2ev#&5eW5-@Z;bdR;>|Hf zBkqZ~C1QKT8cko=ZhFoq79@v$KBjO?>X^u|pENJ%&JX)%*x|6dwV#J=4{f6<{o=ls z@Qx6jf*VGax-`vMXXDtwn&u3}1X20LurUj)n=Mspn$s2QN2LeMRA`#h0t_Bj?P5LS z=2Qh=1d6cPT26x*T3E$VX&g-s6oIobXezWRyrMZN@Wnt{fI`Nc!sbNvIybj%>af6u zZ$L@2IbpY7DDGi%JX!7*3Hv`85IRj+@GA<5)HD|;REBE?^%j<4jn4FgVS_)zQoYD4 z?21#8_vd`0Yhy)oSa2LL#W#u!HBX=}Q~-Fk8>Uep&v@^UNY!@5awLPQ?-DVgnq~|7 zR)!+C(9>5`mnC(X<8k2z#=g=56PZdxLerc{+x;RTAzT41m>Jk=+;HYQxpcQ*<@4(^XEpgCd8)5$noRkebpcMC~#$f*dv@*5r~&dyWRIqESGyoz6`a<9Le1z9Y;C~7a6@RCbLfL%QK0P_PthX+>fO!x zzZxsIz#koNHHBj)+A8&641_gZqQ46Wu%r7-7Zj zA}q;p5a`cuwjYN|cKcZVpb>dID-+30v! zk_Qvl9`Toec{8<%dGB+>eZLwJ7vr!c8AD_Ue|Hv2yw2P-b5}o$RHW- z6lvNn3l-ielE$b8J+ugE$n2+!?u5!oR|e6YB7ZVh^!?wB#L)3u81-+?6EAH7eSN1W z({`m(?p>m!f*bHErDrt&@bckZN0F_$jW-PkM;G@T-A}GFK-b>|=2aI217Jl;)rCGr z#WKU|fMg%L3oxy5CPHuDB_{l@72=+#Bbt(8>?iN`&XZ9$kWh(ylnKkO!yd~6>5@M#G?iQIkQzb$f_W)Bh zeUDJhJ)(YWS8@RRRhp@L?-3R~kNUQ=cN#OT&Hsul49N@)sIQv$fD0U{xTkS7KO*qP9+9q#vY^l}TrsK^p`3eBF{%e4 zaW8}V1K_i6z88Gfs233$zE>16Sf5C*+$%~*ceA*2{KcUB!7cZy4G=C{*{d$*9?kl= zD}T>Maqdg*2sr1d3|X&38O_!0o3-O_SY#-})&T>< zu({F8_T3@&Z3g9Oj@*?fpzaCy4CpRP9s?4ckjk)BfVSb-QA2Fc_H9Vj1ze`Q6({;>18$DnRNV( z<*}6UsUr!1rgtNGiDhuTJ$RdnY3rws49N9+H-H`Cpr(azX?^%pM-Eu9-fo)nCsu{< zc0u-jDZRUSc@E9~k0TF?30@a?DmAogw>6cn|BoX*+%CPH=>1YUv1NH4y@gWHw(+i~ zhCj3Fgm)d?@MlKSyv$jzqMe^P%6Y&Sfw|vK{S}Ehly2JcGnfo)W_5t!}G zw~6c$>1|h-0XL&|b+Eli=~di!e1~@$ehZ|xjgH^O+u6H4;dy?_}lmfrI);F*+h3|paEdRqa)J80*mxMb=)<^X#~dY$yVn|az^2exJ@J#`FQ z8WYljLsba9ZAThRQ+bvbM|vCRu!qGRy!G@^AYh{?FRMy;g#xJC;2@LHLj1F-0Bn*v5?-jzO79|`BxJ1Z zf}_hIQ}kESbm?XD)P;20KOM>7E_rKlYoQAl z2R=yXACHS-=ze<_(9id&O;STedj;4s-fFsVuYgpkw+g_28Qu4iBR3ppGVE~Df9l^JyF{h}~j zdZ)1YtO)Ag1Vfdl?-!M*I~n5ko2maAD_oYp>XBw&%4{hq{`fo6K)!OvU5Pk~@s zYZu#49t|Z*Z!vW~D3Wl)74d!-?7*G#@rS)xNS+7Pt;A|#rPTDABMaP0ZvmZnP+ed7 zl=+az!TKqDlWW2JRG>O^B5(r6(~5_L1+C{YUlIl2`Hr>K+SW~y-W;Nb#N<@zWuw9B zF$8b%tT!Z-$fCX1SH;uGhZy1XW>V^YbtPGFp4(~X12IXo>@X-)rEfT*c^a9`o_iJn z;t+H})z)s5-gFSKR#WAJF==$|8;(-Q_;^`XI73yyjt&;@*nokjlI3AFaORX&P}G}_ zZ1{NaCWB?ZoMH~3iKTA_j(rlYM_}#;ViM`?hd~FI-bB(L5EV(%s~nsPNQehCD?x;V z`y+2Woqs?LCyurrP`fIYh7YLw-K;K@$KP@kK%2-rjtmDyUb*zf@WDqrtho?StVGw@ zhHwTavZF5iL)iwKz#_eDAfuQTzm2O8cTFUA3XHwIjk^Xni;3<&$h0`Gk={W7SEqp= zO>V|=j&mi;$_~pq*5Ks+vg`Ofn)8k$5y}JJ2x@smUFPiOs+e43Y{}&NdXWw~Y~Hct zeMFsYHlHyW+J}w|P#L^ni#{SU^QBjZ)$nQMHiBuGi4cA$1pA2%%riTTWou)e9hjn&Kn9mq>ABLg9cQ;x zti8B{jz4Nk&~s?R#w_XCMsGjLkB4U~x)1+8`y7cd{N}j~u}rGm=ZMGnJ(tq_Lp**D zOA;5-_4^!bx6iXhz1n;CIf`|2rDro8Iwa0zxkc*WVo1iE^t%e3_( zaif~puKO{ui1kqGVjsA7NqL_HPFut@v zNsKR8ut<7b^!j6bJUyMHKg>#fp7j8t8faHiT`YMYzynw=J?qG`sVa%CKg@g4b1~h0 znD?URB6{VpIBDqUYzOF5QzAWU>8;24q4cbws3WS?)in2rN?AqSM+9UUJRKN)4ISBB z6-$pF5gAd^vl1PhEuf|cZyeRs{|DfFo`)QffG|Am6#E3r33@KXDPBfp8FfkIdIF3Z z>1iYP6TCe=E9iwM#Iz~W!=@`SL~aK|gkm59Fn{N{027)iI+W47Coi|GZtI1mn;GfS zvy5gwDKfBZtmvJ=CD^iiumI*}DQ$dGK+wXo1hZdC>mGKbW})Px489T z`q%>Uom>vELYXEwj*iCck(gThHc)spgbqu~WuhMKhXg!n<5bZ3jVbtC5~Ya{pB< z$d;Z4^f*J{HroiAD8CV-L43EK^QdgQFoyvk^4KW-ZwwH51l9dbB&A4C9R`@fH9Cu- zP7n-W+byCUe`7%|4^xX#fZbqJcWmec1w2}MYB9|T%A*O_0UQ!9Jyv`Q1+gtzV}#Rr zheEZ%vj9gTX*6dvBT{;l?{rQNq@iSWpf_+l$w#){6|o+kNMQEfQ$;yXseL$~>Yrki zz*C7v^XT439SJa2>Y0bB%T|sn@nz^Fvd1{~n}L;`ONX9P`*RL`{uI+;J+mqNX@(d) zvjCbw6IE0tQ{&SNYk6kUB?usE2Eh3`I$m7`@smS18JN5Zdi!Z6%6g_F4_b!{s^X~Y zF+2csq-PqEpxwK)$xIjiomF8yQ|Sf-@cnYNCEGBjb9-i#o+%7Xh~{dHzPTD}g`4s3 zBB@GxCShnPbuj1%pb5hXggP)`Wmt>2I@g8ZUhr>>^sty+QXPEYqFlYJqjx3L|2?HN z`yXOThV+#1>esF9+1v*I;vnmt3C@z9V!HVsVm4Nq-}j`tj!SsPtDu|N!^edM>k4UN zzav?X*`L7oZ(RqS*bkhdtKSh0Al6erWzR4W>&eGOIG66~cjQ7a)00O#pAm73q=&6W zC)8ofsLRcDNn0;+l~eON99CuTB^VedJvk_hPOJkx4Bb@!)1@aHm`n}rT@Vvb%Lag& z)JjhlE(c&yAIwQ2-++S+D|s?$<+H4Q?SXI#o{5M-0AHB*3_A3zD9)3fbl$9WZCza; zVyZvPeHzbwofVKAex^!KD#aWX({LDBj4o~weDDGw>0R52!NW<&QIUuBVJn;|i+Y)H zhAhC$a0%l{q`sq!t9laXnWLb2Ne?)GM;VRv#F6niR^j)=QrUAN53|a;J4pc-XP9j3 zTAYs=czDKPdM8t+AKNTjdSG1hIgw+Mo@m@4#evew+<&^NfJJ92Z$cm=*h;nZMAGT! zL=8@~iOjG_#$8;fe9>W^gMr!7qr-YPQ2!5( zM7sC()(Ey-5lNRE69z19C}yLI?j6CJCrOW%4jyCOe~$)FOa(Q)xG0vsJjQaDo)9v; zD5fMyH{{2mc5G;p?jEwd zB5@MRWPbze+xzRcI0`y${|kjsB*Q4;OB+mR0s z#_qLPpyl-LIKbZPUSS%BoBdqQrX#1ZWcy!H)3jRY1YCX|h%A@i<4BnrFWsv!tc-;) z2m$pSo)MT~*#J6utaNv%-KTQS$&l`qFcQohD0e%xy~?+@`$F3FDuX2MHro3t0|V|A z^!}@&Bv-nZGbFaKbLHAiN|l8h3WPh>VM#7f0O^-|aDPmbZe}gRf?YE1?vi^Q>0mIq z&kyXzm22Di+2Xngq)GQuy8B-&3GQA(NB_m|g?lmH3oGqeH5KYjc@To=UzaUy`|QphW5P0 zV4s^UTI1D~j-v2|(p`lbFhuYfYM6fKD28`n_k8qZH9h{f#VI7;W+`NMB{q$fj!eO_ zJpVRdqwaZRi)qRx%QX%Yjk(&9f-BuUmnz>;n_&)hzr%6~?%A~G9R?BI@GkWZbTIU~ zub`)wuMfQ}?DMc!!X6L1J?v)fk+8O~g<+GzQp3h*@6x@Y`>XCga0su`-lAKqtBU%M zp)=|c?Y5}v4bf4{BBG+owQHjyjSokDWbkM%(Kbc;OevAwkxiP#+Oo)Trms!^42?3m zLsyvAm~5uW#>+I-I+yWV^rR z)8C-^O!osF{0e$}VVCZI`zw*5nPS2%71{!QI51mUey2DQEs#C7v_p;^dZnOS$1Tt) z1`ij)t*vRfn#xWAHq*3RsmT2;ZI`TbZLn0YZCefBpIqPyMV@bI+hVB&-;8Z%Xj*m# z%LdadlP_GW(k~BuaoCG4Vn=5$j*O;d8{K?TB=7(4 z*J7onxO7={*tv$I9b&NVdVTUGcMYWo)Y7d79CWNr6l97#xwF#Vso;}2X%H-C#Qqq*=T zJ^rn@Oxt}O&Hhewg=$)EfaPE@EmYHPq|EQdB-W81^}fhhcxA-|?Hp;3@&}!C$R2QuWmJ zBUITMe}pPq_ca`u60T{vHU+P2C>^HOIBk0bo%#{HuQz`b7H#*{9GQ;J{GQ%LDjN@O z4_Ah{xaFSBm-L*OJ`Aq=cW1KDuP@K+JFXRWrXa`0(rrJ%CRw*sOh>itP~$)PGgY{? ztIqC8t}`ascn^QK+hByPFs_J_VWu-#XysGmhM;cVIr{@!k(=DEI7g#9gvx&w6%+r* zuEpmrJRL|syP1Mq%&Y17Qz9;0)2>O!)upAToo(@S>}Nc6-B+HI5`7Yni>5`=o)h4G zq5C@Cz)7_JqzF%mK+o5A{dTwVAVaxSMp^^}$y6_Yv$8yf9rWx;kvFd!M=(1^J31EZ zc8vXF(-k4(0yRfZKyY~H9$;?ea+>^$kh;jSkQD0w1zY|3UqB-4-WeD|bbWSw1loH) z@|qA!C~=g;DHi!`*HZT>k)Vs*4{p=-r`T-TPtf#xFl>eMObSuI2;_cZgY zHX>v@%{;3?)Yx*Gc~<{KXyo)L&+66FqL_5=3LkZ?b;QQay;Ae4=1$EYG%ihU$bVxp z7T`LcNk`vhF*ElJN;|IJjS5io+v(W2rd0A>1KP(W(mkDSJuWUqp=p%xo_dd_0-kbE zW+)!SJAV&8MUHfr(@pO&)!IFU_P-~J%cXmA;BjtW*UR!s3p)|m07n;YGGtOKJ7L8GCe>(5`>8h>5!xZz^;V>#Z5|+`k#~ za~IL~|5oo=A!WVKEFt#qwTqWIUx{jFM-R~?Yq8T?irb6$`ok~YPV!bnWiduxWeUnnC z@M8r*Bm<%bRJm_bEUo`oHI}60aV%{BM*u-3BHv0UlA2=a+S_gLF!r&C!)O!e+mG2W zojab2K4BYB?l@}uM8x46u@DjlQSE~`3%Ng0@3)zbexly*aiss0aW{920;MybaU|2& zc1$*)CYFoFsM;Oo@KouJ!g+#fN;`;e*cOpkh`GCMScjvZ3Rvog#xQ##*xT;NpKg?H z7OpifY_em=G}#en0aY`!@er@>L0lh*<55$t=iL#i@ywMVxd93fr*;2Ppwn2o_CErC z@7-fm`Fxm{TbN&fofQUj1~A)7M-HqWyP1BOPWGnj z+ZbK1btzDw_Q?l8@yV2ZTj}%97@Y6B49f|s^G>j8;g54H9Sz3{b-sm7Cq5UEp|bB% zTK2gRD0vBvXagNt<(Lbj(tTS%$1f-2YT)oz*#{%RUqIwr_HCkzzu@WZ>s3OYD}Dz8 z_p_@V!ORk z(=(y$qqPBS?OR1Nv^Eg@`Z^ShyKCQK9G;6E7MKj~QznCJ*Yb^1)rKo(Lxt>XM+*Rj zUyqKXm$f#aCVdyuk6Igew0&(fA=C!VwZ0Y96l&w)EvKEKwzx^MkLi(dwH@oafcI3Q z!C2Y1jBhj~tp_&5%c=sCW#9SgmS{VEK`gx)Y6GUzx0FtX+O9xg3GLL`B>K7-jM>dJ z@#V%``hLA*T4kK}v&9lv@kWNUly;7{OK#hJoJq zfEL*2#LAS>Wu3Sp(q*3mHz(wkIvvSIe5&c0gueyrLfRv1FGP0W*h3wU-=vdhvM z@XxHmK_|^=vabd=LN3|t;IwDRzG}K9+-3=veO0Jd45N#y94U?{**Bk;*SZ13Gyd$_ zo=DkO$y5hU3Z&q~GHo&eDd6)cKGwz_)SMfv$@-e?_!b|TgC)qL^k(2Xh|MMuVFM!6 zH;Y^mwn=kkA1eeGC}TuD7OP_+x8K&ahAEvY9xwY?(ls+s;@n*1RM5K-HYkAgO{bqC zY(SX$rcu7$#wT>DqMBXQ0#ZS>>?^0s^|l)1PobyvYBeX*2?S7Z67GoEG}i$x6c(q9 z>I^o}|NAD=HiO#qrF4(M2I4~>%d*ZTlhaWIc2!?7Y%Qv}FQTbN_31)di2w>tz^7-@ zt4?smaWD$#aib0IMPELSnvF86%HwE8t0N000Q&OOtah^XEGvGoVaKZtyS>$s4Ek?h zE=HbhT^BHa57K#;Wo6!9|FCu)Hc1YxGO6>LP1l-iskmOVa35z|J79!)Ba_IiPu}5L z54lp%s&H&FK^4lQ((@dNNmx4zmMMvg^1kA7GxB9$2K{WZ72vvKBSR_|nJDvwuTu7< z;W}xhn+XJwXV1enMG`!bM%w0M6e*aPa%%@ReA_zOr4zBSJr;O61&?k6jP7C4S>rN~ zE?MkIfpdU9W+5)5ojt&u54PF#G&@QyVIs9gsp|$R=TSD0efj|6mOw3V?h?m1t{0~O zm&{Gk$+UTiBVDi8CqYrJI7~l-!Y#HJCmCLkoM3DQk}D(c)ojz$80VUfna#S( z#ynGxDbZAIIHa#L>WyC*j~O2{Tt|_aw#xxtR@1Ib+lAWhBjhf%HBwEM%?U92N%Cdd z8Wk=ypEC-nE60{gRoS*yZTI8nq&=w+L8*p9}D0RaKg~Fab{@%5m6o)G%b&xi7|*imwdTkJ#NdjWoo+*abyM> zJWM;0TFnLKC}kCR3Ft+lFNY8Fe_!WoFUw@wSBg?t{S=xz7`VjbI;XS{@yZaOs(3$+H3TJwSDN zHV9a@JQ6@;U6%H>8`>d(0U`j3&7dQBn5lt0o~eg9GAUita!_f;wYV%7c370NF&4(^ zSjiPCC??;Qt?k}VQ}bmj|*(+HJX+O&izP_ChLbbuwOX`f8TifoDd+b7sEG!Z6!NQ4%Cw%e(x$X2XQhE?UO-~xKP#8#++RVo#n zH%-e^|Km%X{@sd`Y|#xISg<*%xRu^jx1NzaiIZTA!O1$sb7i+E&ziz&n=>gTwkLH_vr($D)COa4rM4+72DyTxPm(U$wkNz}1GWs@lF`A5wqzg| zeX#)DVDx&4gMB>rnGvfaTx4LhZI0H_#29R3**6aRDZvWp1PmSZr#)96?|IgNUz(-YO|IeG=hmbz$^dK!j=nzr}5_mHSq|(!g zq(CO2LjZl)3u@*hGxl|hu2K>(iXhn5j={C8tD>wuSYUPS!vA~jn*?_MzfV4&%&q61 zTi(6ro_mUrmBlBR+Y}07!*??6-=7CI!lhh9Mk;qXaFv?WpP%fZ2cKFv$WhY|0K|u# zz6legsg3M|WxNaAWrbkQ3c7#mpcK0A*diNk`=-c34TELeJnv$wy>OX!Z&5hiy1Xbd z3de#O{Rz))7KcnuH8g+jGSN$e1(j-~?+44H!2w?m4^!| zR721BKZstZl?T5Il`?3SzA0V7evh}@VOV&RWu_I zuLL*Jj!33mgB$3cNTwQstvKV;=;Q=EZlTo{Iu|Kg^-)R`u5U`P86AseKp`+ON^m{3 zMag(^39iFfji+6G%fsoVv?AD3R)S6RLX<$MkxmSfVHNL8mWds8L)a+Tz?8LW-Av3e zn>m{?ObOPLCt3zqA-I+{M9VNZ7rY9z_EbtamK#9_qGk9d3D#j1O!ZGH8e(3m1lK@H zay=c~J#+}=Pb!+MAE^XusUU`DBv?b+VnoMSxM2ky{AM}KL&wNqGX$&XY>Ye|fl3+~ zD;lgIZ!D8U!E%tYnRIG0NTLZ!a5e3Vl_9tpTm=}Jl$l;M0X8#&E6MHVyG?Kfxz6Ut z&|~S)pqZ`&ms6u#hVor-87@UI65~mara@ONikOpJQ@05=#Dgrekdliq8|manKfX61 z@7ae2DM9wh87(qdv<7KcD8W*Yaw~NWuLP>qw10Zh0=z&3=i|1qipn3DoIo{+0!l8mC(5{r2j`*SLMk}4GLG()8Q>q5K5x@tCCJwR^tYMW|M?K5#(Q6c5}bpND*<9q!gp<9 z|0byfXJfg@Bz-n1g2v8*$Q{=FELxBzPLva{m<1Z1BEA$Ws;1Ss~}_) zCJ8LYf#jV@kIn(9JX;AuDq)fgdnUm#bZU}VCs*LhnMws2MI%9v2S;PKz<9B}dVVpjAc4WhtQUEdF&7+n8MsC)k`^Ft~mq_jgQ+) z#uZ>T%&_1St{n`P(s(79M8Btty)}_0Op)QAGngPo7`2+j2&>g+Oi_aIxcy{P*oLxb z+CD`FGbI>DcTEwy2#Xn(&`1Aq#nER-K~^kGDjw60~B`r~v8I(V__YC<^=4OeJWcuo*J+ zaf4>cpTWmt&_p|Dh(R>cy)$I6b%Sj7KEr>F3v8BX@vIoslVzqn7F&u=e2v_%fo?gK zpcZQ`lCf74vCbqapDD*-IpZkmji3*jz4eia4p_&n> zrMENW(QQ_#PIJ9fR3 zG=6A2VSL13)$TAV#`VUP+INk!bV;UoPyZI$6s!ySe#+UE@UI;&LVI_rAJ zWzxT)&2{atUgOGk4c8yij&koh_N;TVu|t2Y^sD1%d$!{ZOPqea z^r>U7eXOI#a*w`5dc_fI-*5lS{*r!%w9kH<-DfYc!aK0kZg<$ex4m!9)7uTzwtH;X z+ghz3>wYx6Vw-9kVsl!5(w#Alf-%<~>jOrw?hR>=b%V9mT4tT2>oHYYEtYTMEpJ*L z*9A>)T6S5gEqRtS-FovkQiH{$yTNz`xeH{k-tae#p4KmsBO>@_)G97IB~8t&IV%7!ob1Z^vH6oA*pB=U0g0lUdd_d!){3(>jDW|EBM}|BK0*glnUlIr|l4SS3+sR zx2tM*rD!{?UIn66JP8+V<4CM%ZY%Ys%!`heinfTG18P<+Syx@n_Hw17&2+9rj&XBv zlXyhq?Bq-N8+)ExEZ?tH-7J;VwXET%Zg`313RlyXA~{Xlyonwyl4ISbM5v5~V6?1( zSa6w;YL<$wp^u8d3y~^+hLu)1ZIZZ*l_m=TK!$U@NZ^Lybp}u9)L{oEL??>na(GbX+T+Egox2l4Q;dZ| z6PCzv!eVN-Z6P{C-;~KwVhpdP9VPNqZSw~HjWMHLqZu!~biPauH;T&F@jzlyD}N+M zsXTICbE|k$ylgm8NqtqnY#6z7+W#GQM)wC*MQ+8dFz$L=sXQrk;Q&0O%} zrA{(H6TMj`PfBc7_>oDAwY`=#Vso%t@o}^nJ&dtl!wWqU?4T-%<}8(CbW)X(%9hG; zgPN}qoCfhpplCEN(Rgk1W_n<$oSNNywRn-gd{R&-%J#o2it*6>fAhzwdU7t4M-FLL zUvn=51UQklE*LEdrHK!P21QorbyD*dYDKNN&AUSLHL%1{E5be;PPQ(aubTgB8t}C@ zZ>9H_$>X)nJIS$Jj+tn`2#E;P3*mWb^ttTz{^c23vYZA1Hq@i06v{xG+K7@O!i2wzz_tL>=wAazO-bUL_AP zfPFA46hE{|K8>TujH9TG){lZH(Qp^|$T-4Gbb2+@Y5^ntwwgJ=0RttM^W{6B$8t`i z<1U>0iAq36E6Qbvyalw>R?b(IfP_Jj>C_|6a2o&b`F8pnsv%!PAC=2^0O@3r!swhP zmSPh+;H#9*9q@m#nZo|%7)lux@^q8Zxg9UTo2mR?j$xcK4HQ=AHm0z0ni_->lKNX6 zp>%F#dMT%=s+N7O&-20V@P_J%gOtuKAS=)e(sA48pCqMoGcG@=IZb8BkmzZ~8xO?D zRfSHr(TnsLrE?Q=IdTAlHN+rPtp-it2qr6?8>zgK``Ebw)WJykRj|0sTHQ- zCj4Hd42jCl7F>SIXz#?_A(U9fWLKw;@~Y(cM5VKtXrwF1K``V9fps>GI)O;3Mb zIF8Y&pjB%GI^}fF8or%(t_JxviEgoipL}kOYy*r{bYTsXGMy`FLLHOaohxW50#2oK zITsF%4Xs-vCx9yITt)}#M4LR;Py+)r(=4siB_lHJyv-zIr(xpcgW=oKsf?-W>nmg=x<-?n(*UwSo%97v+)r z>%z7AsY>Sp+S?#MftpwL$c=K3MEbe%30JjndC6++4InCODD4B>>_3|;zQSsMrVIgt zKow2Rl;JEYP>FliObYwZ8AFMQV3kZz0u@wn8Uqmg1O^fx|GwA`MnRyQk{-y%Z78uQ zQomXWtfupsa(SE*5IQ8dpTjQ^1`)Dzko;^;Rst)jAxmrfL%DoW#3H)IL1>Qq za3xtpDf7gYWFgI&C&1*9j@<0iZM`kWD*snWqxS z0=i(S>x+_b?GI#POkyDp9g>O$FJih9m`mU0$}{FE0d@cwH?Of4I(^W2%tWA^pJD^7 z_!&8`k;zgpQ*dz&uvHR=2$g#+M``JgnEzzlj} zzE};@>Fj*b;c56D>nPt?vE8)lKknT7%Zl}{%$-CC2c0=q6j2~5PCq^fyBj|WSWHTRyq53Ib#87?KjJQeOw za;QUgB`|>*-AEEW#K?~a40Ny(#;Y1@Q7pTu3TFjZ9;ctowHwy4AE4s8Dp<)5j1{Y( zUTE+$6XV(Iq5r`zNIn>G4U7@1zSE3VKTZi;K?Qj-MArlC4=9BsOHl;W(*m&dpC=ak zC_0|UkCB0q^j;osje!wlSSSL+Y5YPNnj(Q=f*1USMZM1srL7CasvSZPEfjar6nayw zkxUmBiup+5i$1JM2{raWA{8uRrcr=xeq_^xyJtkut&4ag3dGZaMPiqTqnA+zDcH0Z z3CvuloBKR`8Kaay zxHt&T+lz*oF^7C(NT3u41^}ZJMyouc7lY_#j~D-!`fxciJ%Y>Zf&3yS`j@1%y z0+W5!l}Sp#LEn1Bkl67x!y#=W=$D~RaEGInfQ`z%Akmb76({uyN_lx@40U(~niiaM z1+?=)X9S)0;w^+tGv`VZG_LntJ+9kbb*^ydtIk`U(;=pO*zthlR!5m5-Ql)>Za-{;oTsyG7TkO_wIn zXFFxAh9?Rm>C{enm0`C=>73v5>Uvo#VY|=mIn^xB;?O)A)WXjUojH`+BB$c)V7F!o zIn^!Yb@kYja3+ZmPLM2WY>{W8XeRA%&Ucght-@G{Ep^Vt5>2Cww+e^r=PI3W@!l$D z;=r0CwxqN@E2F5fmDfP$Y`R4a%%Xj*yw*Br(z^)Y;GQ84Zg6PpS~k-eZ($Ua91(u@ zAsnDEFtI_PIE@x;U_M*tRBGP9UwY>hdSC;yH#*bleKln=**6M$X%bD_$V|@8iB!Ll z*K21Qmdtn>{g1)~h<0>Npq`DqOLvZ^C)bH?jiaB}@dS55J08T@H~#=hGE(UrLo3$H zqb4ey(0KvjRSlIR9OFw`*TIPw#D{?VXng3mvokK|4!pz3b6fmCG(wS?sqG`l?g=uge*O`os zb1h|V0wMFz7D1CG(djLCpjSE*DQ>GsNud0#@*)CpBd36jjSysPbtN03 z;Ld^e5y4!g6P9JR%kxo~nV(pSBI8n#@k(bHww|f9eh7H*`%V`|Lr}3(6;wQRx-c9< zNu4h0-7W}iCk8cxp8h2>oNPPfcq~_zRESpJaQTS_azLFd*T6}@gOgx%vC~HRJH((^ z>E<1B4#v^~lDr&(z?nm6-wr&M7~1$fq|=Nco=4}O&V-figN3NpCc{!orwLTFOa%uE zGhl|X(@6W;`$-PA$#fC8t=e_TM#6NPpHi z?(4DMCSN5P9S0mI9mi?QUb(5wca;#tsDj`WF0;Q2(F=}%Sx{U*5aSEwSz#o#s;MG* zR8FdICfrrJLK6$Up0$m(?P8^nm)fnPBBZxwMj^UmzFzHqD0Bh=!!e> zDDJBw&z*8|n^asQEc#Z}f$YLdGz0ro9S%;ZuLt%uYS+{__n`9f0_epLmlxokR9~LJ zAU_G!sO6_}fb1_oU*9R4wZ01a@lH9hR4T3tRTSm8;>YSF*VWXZR+T!fh%grA16e@f z`++QOzj7ePF#bgi?cC+nbX&WeJV7e12z42cl%Tq}$e9o<$Zl`kS`n&UStQM`ZCs{>8VFM)~FVaH)8;klU!jzNn7khg9MRzr(kJHu>emB~tM!wQpi0 z^D&6i>O!clMVqVCxko0NT;897j(yvo!Tnm znnjR5@hzotl7}pnikA!dld5Xiis|pU>RG)C(j35Ix!OfU7>zP@P!IziUkzk2BFhG1 z+|EDg0|I}@S4z$fJgG~?ODUs6jxtJB?}F1unVonYPc~#4sHH<5YVef|Bp&FHM`DeZ zsn)Rywk(JiYxEy9r&CU#m`-_^)>q7txd2*9yE^5ha;fSab$Ec+#;v95h?I*j3okF> zVOsPB_@3?0V026RBaH3a!tz)Z4BkQRbK}+$b>2jjdtFFUKul=yWf@%WEt(LJQ>OZs z2rJoDxUJx#0%eL>pQ+0!l)&vlKmew-`-^bpH|e^7JY4HrO#1`!uw_y)cIXtf$SNQE zHR3{l4-Gi(K^wOghK3k74PaF;kc9@}qaK=C44xZXG7w`JZ_v1)ENgxF{0k>cLC^tG z@nU*4C=XARs!sL8;jeIUf6a1k!b`5ZU_+3x3k$f$C=>x&GC-o9>-=!g=3*3 z(f%{k>yE?hW{Z86JD24DQ%LZ|&lz$d2t`k;%08 zg-kb%*v*7u$2JhOAjG;0VK_(W*h*V>^Yy!93k7!bCA4ERJ+)hgj%CLt!IL@lYGx#@ zI#d`F=}}k7 zbTpybNV@-UVJsw@IvV)~&P6~%;eVRa(Ll?tVM4E?o^HE_8514sDm$Cx#|p22GH%CJ zKs5nTi!Kb{V@Mx9Q_o+umw zL6?rDlz5$hUM2+FGp$1tsO~xz(CT3OV6&<5Na1K0rS2%f7$tCzFLgLp=_sZ%*FhFu z>0owHTn>x{f;9r;)*;W@d0iGNt7UNw$q>zv#)tJ2}&SL_@-Tq9fQV8_1j zdYgfZX#P>GVW72$8gAfAb;m*&(PtKC2b}uez)Yi#1@w;_So*2sO8<>=l0oU1ug|8v zS7jwo@iB}|s?w25wKp=yvtu5(p);xcI%hQPzme~}9XVJ(N%ZZp!btNpr6U`Yy^z9g z1Uu%!jZCt3WMS-PQvOqgspev(BNK#i9rZ?+K`i4YzH)WUrF}Q?BYQ^%aGp(RZ=JMNA8YUnBn1c|M9|DSbgeX1JVh2|74jEVSuHXLn%tf4D#R1 zx0{aX^dul)8Bb$|zIZCdMKv2@J@_QTl@2x`9ewEqH6N!X)N?wfP}D5~`*id-lkP8d zM$$`96gp}3-a;p=F?B%13{0XedvQO+*iNF(Tg2E-q$3Cb&oq#w(#XqqoXSlCbcu;FTqi z?e9W!o6<4bP{+39?_0WZ9BsOzaFO6Klxd#VxK6qL;=0jQ?~+|poF6!6J3e>pciiY` zbY$7zvp;Qr#J<~JY)`lS+jiJ?yR8B{^kiF-O>6D5{@wbRwcWY|`?TBgt>v&~uf=C6 zwj^6j=6B2o&3nvi%mwD*rteL!neI0=n-&1FGEOrNG1?9140+EO9yHuwXffm% z67=6ed;3}aANBdVi{Loy)D6{sj$L}McCB`1DGVf1Lx~v*N%T>ed#+9)4GkUa22;!5 zM)F`cR=Ix%T{YM}DMs-Ng{rel|C5k#x>c$g?=3D z#sv5`(~xjC7*zgEbY-|3Ux9xkW+vxXj z_f(W^f!bCrrL~pDQ%QsyoOi#EZisM0mCD~NlrHnX%ZMlERfS{C1&V(?wgUJ_$jeQl z(UERET=>_~@FSPzbPkMA{0;PQq!@vEdNa}u z=9zyj{Tk^W8>{$v&ju**Hb1YX29h$cn(wcp%qY?GHMA_sjjzpLi=BQtompErViCrz zhWUuuArW_ApoYNl9IW`+EJQ4)u#!Q&Y4XOl1FR$l*3o*k4u*rB{%GtX2LPH}-!2N=l7!V=wowpwbvO9=ZI>>6#eP zt!4Dr7&ioC{Y&Y6WVsbT8-a?=UekmYdBGsCX$F!@DJj;C*ARaR&5jjQTTE+W#ni&i zL#!KIB7Y%073+q4secKMifp>I35*@!yqFwrfpYw=*8PAp81Ez zi5}(AqBuA9YX1Uih(o)IpPeSgaTT%A2^f$&^v|dJOQ1#5~QS=?U(U zQxyM9th!jZec*SJe3r4~MK=S8Cm^x9WzF=>o7 zIkv5iv8I1I!nG&uzu2C$pRwxg$F;}o_t*ew9P`=2_W%{Et!_dmXX?_7ND8MiB(9VKn)Ep z5LUHpUWd(2DzS)bY{P(gW~sz1Zd_^#moTZ#3d_V&iBV|fumGS`Vo;l@!Y3h>=tB|s zb(KnVYANg#Qi)bz*Va(kSlz%@BBc^ZEm{d0R4UP^MPUv~D!!;@u(JrM_=4Ii{?=Jc zRw`Ece|SQ~vzt`>o4ENQ#)fF6;$PLyK_HuTXTYE1#9xNtbJwBOx^jB_SvgA2iBw*- zAbu2weiHZd1~|m4u3uBmx{*@xk0G$NtnMKd|3LRXE2o*I>P@OKgs|%u#L()h1<5Ag z4+AMt!`8LTzFz+dL}t*I+8?%zQZh&lujR0d3Z9c^>!j+9bf#*-@KoP_ge=&l)&b)> z%Px&k*Psq~!&=CFNF{^m!{;D6CRJ|`_wa^tV1^s>Wq9%>9lWvVFs;Z0oNHAJ8x2jY zQ!JH)Q|9w>T(wl)Dwrn?<;;8dL2U)2$@NtxC2~0OojL}norY-3U==n;0sD`aG8uNn zr6}&>)pyX-&&#oGEn$KO!3dzrg9A-*k*#VBSsc4vEr`zgHf{?a=sCALXdnwP{$T1~ z8(eGqKtYb}9g1nzHZ+V93bn~i&9rUHl0j7WH{6I?Tq2X!Z&?yYU4O&wCY6NwUyxJi zH$>W`>f40&Sp&Eb+rmOq$BjEf$!Pk4&Ti?0Qg{z+#jj!-h7 zzzTU7)*>s*Rqs;6YpVwV%**`|WZXgrUyx&`x8MVgM33;PqvpMq{_lnBwy9l57US^J zr5N&VCf$qj*t8a#P^ZH84-<{aqb5ukn?5}ifbKCrqxs*@gh4`l2-UDOZ=$^~%1Lc4 zR>8^*Z78UCx5XX$Ebz5)jV+h&IE=>&|CN9eH>yhwwxc(08`zF`NG$ysfP0tPv8r^2 zxm%6YH4bKgf9sEN)(w>TlAJoW#VjQ3AU2PW91orN$^j&3)j-to^38&)Y$HMy^yzwf z_9c1b6)h$q9(UR9hpGXqPor0Bs=E`{+)0ry;~`n9zK$|pmQ#ke7zH!1e~U!5PU|~p zF@!s_p{lPY1w~QkT6*YZIU%LRAoyEq9n|Qs{ixBa^DI{VHS{@(VfCq2a#$M?<8*1K z<$=P6%4+~w06^+IBf`zWR1TPfoW(=+v`s~&d=skqep8nmKJjh+do@GTg^~fwuOd>} z9FO9^_hSV>C)98im)Fp}ugKAHEn0QDs=!E_-LAG%DOiaY=+rB6L|Zx+mO_Qn(WoBY z@Elm@oMF15KLfSzw2xLZ;H$0gvC!zHa|fQXXQ?@GA@_5#if9!;>Fi~Yd2C>OOxK5! z0q73u~sPCe>gw<(9rQ7YjmzFR9`hKS4ucCwM@xlqe zs<>8ScikpAjPM?J{#7}$&5_Kw@mZzm>+T-_ZtY3OG&P5@PEgUSL|u);%ji`y)_X$9 zK;Sk{v1HM)zQT{d`fEi4))JI z!+OH;x|+kl;?xmPI|zUm9Oobl+Az>z(>0eD0Nh)ggD(|e*az@wEF7r94Lt6gaH$A4 z;#LZj5^>^n&=zsD7&3(UmAPcZ>cGhZ~tC1S>Fw9$D^hLyG_vN5#&yEA)wRGi%=xf0 z*71?!F0dR%+57Ad+qc^1+MTu!Z7fQ@j$_%;Jukc`U!&DK z&uCVW_q05o-n^IxdDYYMR5KdO29Ib7t^36W3L>-ALe>xEU)r9Rp0^pFF?JgtG`8zI zjGK&g#$|>tjG6iyjiaDz;4*3r|IzONVfeb?S;J$7hxF?Ww;8TBY&6swO7!K1X@*g7 zVdK|M(&xKQ+QzsZHKuDv>T_H-SU+(29A#REeza?ZeTMTpqerXJCpcfT|K>d8yi5Cl z-r#I-{N33$$M&6eukL%N-G0__)=t_Tx-*V$$9;}l96oKO?r)Acj-d{V+V-*S4cjxeKTB`x*4UbDCAQht zo3%x{r69VE)}O6kYA@*Wz(_x0{i`*o{l+jq#=6Z~Z(U(sq)PJ!wdZ%z5c^eIe#yezgt#96DkJx<5b3)mj?q6IQv9RP> z@v7#lu2nVOx%e}oCLqZuG$cx%77EXhxIseysmldVgqmg&x8yiwd@DzT8h=Xc0X{(@ zA5%f$Y^|vg6x&g?m*pG41m{{$svye2JCRC`h)A^aZ+R?Kw+eL^sK=geSYO z`j}G{8o2dbV4fO*a48~-Dd7uwthS|>7JVU)nIe_Ep?(A~+b^sxuByTk;DQBe`$z|B zZ>TLI!l=DY`@Z1U_mWcs$y_6!-uXgKNNZ7_3Vn5uGOqzHMzS3j;btu;0E0u}W^(+6*|yq;eV%{XF=%&X!U5}9ah)ul{s3#h;) zoyg>-WP18bIc{9bE1^1AG^n#uEyUXh7s?LRK_*8R!2}tj_cC44$1nONuZGYohxla^ zmsm(E`ncaOsUPQ>a(s;dyWIM&Iy~6wxY(7KeXJbMqrakBTg!|6)v!UL+A>>8i1PFa zy6(yTYRKkl3)Fc5P>jW;&6I}%TP6rl-dX`?sqH5CNmlpS%Xcd-ctmK^V6$CSNAu6h zsk2)Cb}5Bz==q=}pi=8|${f%0PR?a72g9h$R5#qYOO{8p)yx;fNoWHHYX7yNbED5+ zUH}M|s^G-#%c2)Gb3+N@2;hWVbwyXN2e^UbfI&Uip8+r>!rvL?d@Bz!aNbcW{0jC` zTAro0ujI%v_Oq%-w}F#@0cZYy#|fwA(21{jbv&c44qgv{UvxQ|+`#evO^GANXwKI# zyOQ)ZUd>yc=7?Kz@QD%0F2-tRt0Qy*N0PQCi*ET^9xAt-5bnzc5JDSE9KV7N8%X&- zjwNpEsn7t5^9w`rj5A(C7rvGg_0A&A5ZGjs)Ai14V1J|R8`$4)o*`dkv!8g$4ab+Mh=vxl$fKE^LxAM$5S39U)u_Vno zf=Kr9-tBQ6Lo=P!;!7MOQx%sa_^ zPM+!*WEcfizLiS+=-Qt})*E#A zXZaAa@~Qq8<~HOlruJX>K3RH-j{gGf1*sO^l75jR$@D9<8>GAf%J>y?K2yX>d#UVK zmanPx&=M1jt7SoDCzKxAvVbmS;^lx%ff|TbKOB5LZXR{7O8l}>c zG~st3H~4q?&)U|x^x^M#fn_AJI5-dbc~4W*1*9>i8ETNTGdalFC;S)XWP0ZU4^-_U zL~=189-gN}s=dhf_tMvpnn(vP;yF>OUC5E-G+g_~%MNKZ2=*fy*W0cKU29!STr-@% zJ3n&XD*@Mv^-j+t zY-0xE*)GpVZPKrrgVJ9ITU#t~x>mzpU9I`wU=_b(IB&RGR|Z+<`^1HF|B0n~rGRV52rhTTnOgEY~8)oXlOvR=g(@)t; z5U>5W@k!%fjdvMuHaN5&8`l}jjZ2L4^cS^n8ArFleXGlGQU9&>dBaDBUht6*=uc}8 zNq?1|l-`$K)t}TpD1Bue+;#Pu0m6?{vK_ME8a23 z`J>sbzg1i9e8n-|xzF6D-wMmrK3Jw+WIm=Z*G_d@baXjhwP^KMY7-s19d(WZ`xbp$ zs&o;iso%CgZtv7vEi3HH?X&GkwmWn`SQgkmvGv-H+5W8i$TG>c%~oS8u+7xH3{SO# ztiM=4wZ5V2u^xxV+JN;sbF=PY!ymwnFS0JMPSbUo)>xyhM#~SDk91dCUdDUwy_Opw zchhJow=A*bTE^*C=zh|Dil>JYv?I*3XmHCJ^?(y(Jb%=c^nREp$zp(monLoT zD>4zQu;eSD3kj>ib?e4K$4u2h<6xgkwxJC4L__z4FVz#h1>`Un`9i%K zAS%u{PWoKM0Zb~j$Y<&v?-Q2~h+f8mh#0tMe4_4We79L6$o7xb0&UP}5oW7P{-qxL z>)C>%RH8~?K`V~!mPjQZsihHRFA`G8hbnfgAkER!g1_%u2ifA9&67CggUeF{o&Wyj zDdHaW9#SAuifXXv$Sw(`l7Fg5fK1|8h!$y7G5&{|hZv7|Nzc{co_OsLQ)Fo0@v-YX zspQ|6ca#f4ed=STbUso^7SUfE0zM`B*Wy^;ueS%>@ zrDm9f<{O7k(5R{usSjCPVYPY!^N8WZx@`QgEw!BXe^Mz`SCUw{#%qCoHNG0E0K3$Wz@^ZQnm9;JZq3f!H5aYDys{uUm(t7_PfB^qKl&?+hERDex~2|)EAGcq&HDfOYB+6; zI$M}i%)zC_#8dFjKo($KWxmLtU({;UfwVMJpjcO^b7{$Oowow$@ePhr%uken(7T=8TsgkSP%H<=T#C*%>|y#Ho#REY350cFR}lqzp6zFl~--{yap|W#1R~>XZIYn z`q_Vfteo^I6(o4ZYg@kL--vj?+Xl__m=N}toh2IeC=oY_FX&=|C(?|GJ?o4CLHs2^ z=$)%T5XUEavh~hAP-w4A^gyBgC=}XnNc2q7y$deqi9}DV-erLV>j#ORF?!cH@DvSQZs@kCV3_f*{vCbrunb|a^?ngvl4M&w$ZgulT3S(JfjjIR0~oayCO=}tLw?P z9z`~|&Hzy&(fX;l0B;}O!LI{7)N_9C~X;< z&or)H*Iw7vkg8qan&e7y*+GRJa27aDIXWB#4m)gmZnDevaklquciXOmtky)F`KNK- z2O&?JYI)W2AWrlO%Q!r&KWo0-oNLyY-ZULHwVI|I&l!7-HyX=~bBseFMcbtRT3?UT z{v+K%-AL`r+IiB~QtUF#XUUZ;4wVeAY0$rc_)tc3Ywzu+=&l2vJpFp5Z#Dh?ipOVG z`c@fMh3%S8yL#rP(vSbDSY<9$`c{G`yPeM8yeNi}U-LkYvu_0)FnM+%u$<1k=2?co zGRipV*@M7Rdhw)ZOq|kJhHWWj-ljTm4A9bzrebafi}ZY=9A)lb(3$Ep`o}eV$fO}@9fsDAnG4tKXDbXtqLjWYjP!7}Xbl|i1yBG!b^WQEhADlST!(HwTaj!o zQ~KsYwz-Ycezm#j;lm#2vG-*lWjlp^XNxDxV;(rd?3;rQL$(z{k^pumy81XIZu(}^ zvd26ScJ7-+ZI5{%7t=QrP69p9eeRn92{IT!`?_L+d5qFG9b30dv%jtwWgepRO#@=k zQvbRl5gNmNQxS`spOeFo?*QyOXUtUkrqGHW&ny5;r@MMQP}A+3OyBf~CMJ>NaS!B1 z`zB)jweg!k6z$uyVkT78`_gFd$aa`>vairK^vhT6y zK(PM2?H{%$Y@N6aBv?O#-J(0Kt=1WqpDll~+=%U9viWoK!{%k?Ay5px&yDSyIr=Kc?(asZ|>BD1{ zv+SLGm18ltXL-Y)L~)rJ36>c#%2~EQ zHk=OpYjwn+Ny^zlSQHEU4gZmJHZGhFoU4d{1##%0jfB))@41T6Q=^r$e2NSg4Pq=W zYj2QpmT8Jud@PW*=a@LN^iH|Z{ZShpaznZ-#o;Xf7SmNMn6*3cHVJA<2vrM7R2 zlew*+dA@R1!lH$-%^xbV@x`9ih%Z)pce$Is_@QDZ%<=WX5y7(_C}H;Ppwnt#J0(5m zfys@&ZP<32$aNLuQ|&)t_n5BqZKXdy=Yha|-xlPprQ0fyci&GHlYvCs7$_9}fFASJk-Zh3J@G@Rg6Og00PR-n3q z4*Xm(oxjKyn))}-Gyw5o&q-yIpKK?&wf8}6MmsTmS7V<$kfiiA)84;%Aa~fe9uqR3 zcKlK?(mYA&TgNMg4*mkv<|%zmrna{vF7FrKeSDBFmvp1xSi;0K*dyA_iIJW zEbP$ryhCp&uWtp;r}psl+W0(}SOQK`HRe1FimA-09dGYoKs@cy4FU>lZ2}N)G)MnuVIbXk5>^ zI$X^(sMoXBlB|Ch($j5vnXc>g#Osm!m!1cDJ=g2>hH}l2p7C#bCQ5o&v1TNlx{w#w zv-2&_+k&=;?^*hx=g-M{?Fmg`yTO}hIcnKsS!$VKiD_T%oj6AKh3;+L0o`@FMx96J z)}Djz%){Ds+8nJ_`ls|KsZpAv`9;&K{vCeIYt`!YcFo|P=d|7{CB6AK&4ivodhb_y zz2z%Syx)Ql$eF~Ra~5xyalGE6@i0&6jO&2Q?^@;>>Fjmh;#}&S;dD7pJ8p2aLPIFU zVYGj0KL82zN}4>#TSm7I^2Y1HQR?~2An%`adb<~`EspU1Zqhp*(M0qtiT9RC)O0a# zc+aT>?<8$oh2}er>qCf1mb$_Kf4g(M<8?=~V}$*C`!n{S{d#+)eY9P&y=S}6wiS}? zBfus354a?~RzF@#>#W7rbnrwZOCPk5j#&O|xzkcVevEj3gaohi!Ji{N0Hnm!_BOJB=)`8 zP*wsP@n{#TN%%*g@O(OVzbl@8>0-@wKinX9%L_9U|1d21=T$f~c31J4ErvL;7HRc6KK1dU8>er92ryNFc+8 z<{^Q(n~oonV;}$@i}oV3Sl$O9QaTK>Uw?692PsQCF3I253>LzeCs zI6HWQ^&OkyAA|!tJd4Gc%UOomh5jaFG4rXM4SV#5oQmIxQz|m6H6LCO_&-wk+(OEH zFogL3NX2i5XLVNe@Z0Fd$K(;|il04vCS~Cjlr9)ccdel>x3S%#RiCmAfu@^sk>Q19LZ($r% z(AwLm_HlV=xzfG^$#GdtEiJ+__PoaAigNbf-M$@2h0cK7A@ar7WB+80xJ0>QF0Dh zc)=b{-#x*qK<(?ubwnNqo1LFpPaoswh_mL%j zqm=e~vFPd=n;Pm^VmT`m!T_!n16bE6cwI;jb^Iz7OyiPjSQotvs@0Rbw_0*sF3#MwCJcj&8oC7WAYUFbn(%Jk+gDnp%IFP?Mvy=qw)x3m*JMT zfV0Q_76V_ZtBUOo81<>Z;$o*|?YN^JlZRrFl>pgjlw*vLH&kgaruoO%P)&OgH6CNb zW9@~oD9>hi+SyTPIh9vO$I!VEg;vTK0o}SXrF}6aJ|!&2nCzg^k%h@1Fx$PVz537WaIke;hAvS%d*gv&@-OWPboX&Ky3sCE zCP9VqpU349@PyXBh))81$&o$gMAdZ5)a@-BHuQ_mJAy;|A0oo zUDkCtV@F%w|QW@O_nBtm%p-}+DVFY51v zM(|?&6n(tz6Wy!2qq+xlyLA=1#ky(QKJ7n2+4!}4w9VSl(ihSpsX|IdA2sn;zq=9N z{LoQKcPeIke0DkI7Ux2vw|f-M&Uu7`Hj!>A&c#4=kEDIYxww3GkMNh|LIbvYxF~|- zHGzssa-r|nJq)@dAW%0IrclOfrAc!KDcwV{VAX@Rx-oRnb`KFp=8`2y;e)n2MU>$a z7AgEQM(Ji(ag+F<1(T{YH!51`P7<~9b5SNgH&5wK#6l^cLH4X6w7fKT_*kVIT8Pl1 z37xno77E#w?s!o*hwJ9##w*=%w69cj%1tNL0G3v1ZuAvOcMKQB`C8qGe-TP|wAjtn zqZ%&q*8e72IMF|m#QMx1WeI+3d)80_?5m{;w7=+V3 zWdei2^i)|cRIj_k=%cdSG<0K7sG54}ifU@ms&u>flAHxzYS!i`rP~R+qPfu{mG01a zn%{~Hal%5tG<3pp%KXM;r5pYnmgeGk@3ulqGB*JYS;Sr_PFR!@znBen>kuuDS2eLQ zQRy~O-_qP9uhMN)tMI|fx%>;z2Hg8bideF+FX`ja(zX4vqn8VaGkCDl#fB_#+;Ox&*{O7G6)5546=`cwZi`xuPhC#q-%(1} zX1Zm0F1DAhO&~Ic)A{aFcMhs=RI96~G_^!1T^rQq#c|8^MF3!1Rj_=@ax(wMD_t!V zzalpwL+SFVfa<~W=fii9($y^HfX`GU@ei6?FG?YzCXG?L)`@RKoT;Y|l}4IJD_u>n zbCgD_iwYy?=!)F%Or?vDQXJ1XUAZ290KOrVR;i{{t_6~56iQ|;B`B+7zI<*p?rXm%;F-q4Ov4HyzQ<0&bt8S&M7DrV|R$XmqWpHMH7=7f! zG?LF(PA}(PS98j!ES#@M!hg(m)#b-4r>Y0-M5U{ePOi+I1Z*n=UgA*Y0(`jIm9BE} zX;(6&N(QuA04m>H?W<#P_^eO}1GGvE5FfLgj2~dWQeY0$RLcS)BNWCOS;5;U&OaDM9I4u7Yn)4lP$4#2iB5Wps2^ZfcU!#U3z{P%Bw@KVy)gAeKiNotwZXR97ht zO7r3--G$erG;eIQ(p4-vf=6AhfTBgbhf~Jmr7_Ss>?)+|)bdN{P?{H;c^5mkfN#v| zXg4)IQEH-#Y2Lv|F2MQerIb%_ev0J3d~A2?^OUZ9T0POb5Dj{1-$XAg26TBu$unoY zLuk+>0aC_EJD*S5BwBQ&GyxjGU5jY!7nuok%aPJJFtNH8;;2ohv@bFv=;S0X403km zfm4%72R^sQk!i9w9`m$79aHtf*U0NXbopzn!rWgeRs&Mhbj;v<(eVXfWo0eMMm$%I zXK@^!%DPzPGcqf8J`NK8k6B~I{1hhYl7-Ww>c&gqX~<^BcxpB?P_XPowg>|pGmRrb z3X1e^WwtW^MsU4WNxVG%no>h1)Lp#!L5N zSL>QZYtp^Yn(bn{jgx5o6J8kkI$9bIW3yc|#2}^oDbG#+O!q?7v}?LZ$vjp%#q5yY z(u~*qq@ldI-uq2IA%s5)%d}tF^V3}Kc}Z{iD&kF?NUPIm%bDyXZR36lp2>#jW5Gf3`k9Yy72aUD z!~}ZnO!n-as1|P&!0e-Ot==(lQo#Ws!G@L_Sf8o?e3e#@r`A?406t3oRxbnG9|G81 z*HneGOjGjjq}6lDyvaLO+xQes-6TfmggQD5OSJ_7!wig31}Hi#&^tDH)I5HtYDmX6W z8wJShrgC3Pa_9q+R?ndeo45x@Y2;?_h#0BhDWNN-7KJdJ3UxMBZ|3Hoq&qi@=8s+0 zJY-mL0cA2mT0M*2+w4u#HXb487B8gU3XW3d7B8&mubxTEw(w{?L3_4%A=OpzBpux1 z4WBQqo*^FfxkcZ`4R@-G2NAqPHaabkb;DwDLAEKgd-Z3`EeR$^1hoz6oYTC8U>t4`! z=+bw_a1W|$qizExbWszG;o!WGYWn^gAh$H>Qaz4NB&iMClvMB--M8Hvg9$vWPT-|4 zmeKet&D`#-j&^*b(f>C{Zo7+75(c_fr!$nOB!)cMd6Q-daK3~Q%9{VpsZ=mBDw$4> zii(Z;|IkLE);a-YD8ud+GQsG%IwZ-eXBL>}+HkA$ZOGrn)hwxl@ zax=7fbEKh^*XEtUOxkU9U7I(BLnZWRC^WI>jW+N232nylnmtmcS;}-x){THcrVewp z_B-=L(?!!ghFRKUrngNmf)V~azmcoroTtp8K;ib`?};!t_?dZuqx+-~Nhyx$YO~5&K=( zinrVAbzd46*%#Vp*hgz$kx2U?w&nM1FWMg0!P^KP$F8?+vBm0MF}??hxoq1M+eqC} z(;}PI`m6P8>r1*0>mRMVtt+89L%$xtw;plOJC-ICxh5KT>{rk|hrDhNCOvPz*hn&4 zh5Cx>yxx*v6k-;cEy-ocv$@dW{^BKx8(g*tm8~@ z1UGW=hsEcViF*jg9_o3e%X`0erc{ePHz`az&dyEJKmlzZ;EfrL;(2nh-4jnD&%3W^jdLr0XZ zNU=mvK=k=+Sg`98M4wNe&;Ard5cqzx=ca(~`{&-XyR&U}cXoDmb_Q2H-JwDH7>By0 z7|%f!VgyjAi-@F9yMp5eYEfsn&0`~%OpyY`Z19TYEYxd3f- zp(}W*+x=|bYRt#Ny*sf-K;x&fKr;=L5-$=LJ>}tI67Rrs$I3A+ zDCctaHK*mHm}BOv+`gK^+a?1S(vxmBfz;OL@qY@BbxywcG$Xa>Vh{af+BE^*qkcX# z-f89;nbS6^T~to4ZJM819#LO+TjAV_Bji5r4zcp*iE!{+GV@y$q`nfQCE30<9BTAh{QK z@`|m5i$N)Wx69Cf=K!8Jwpn)!cvL9xVE$n~*3!Mtx&1NWuuX+>ZjMC$Gi~y4y}jDZ zVGj4BSD$kavcLm}Ma*O-1>rn{Ve8|0cT`_#7JQI~ivsyY8%jKFZ!Qw#fQ#tUb{TL) zUt09M8)h(PJ*l-t5Dw%#Wfz2oY0j)e^v3hzX6b>kFEK zVRH=EfE|rHSr-Ee1pFzEWza^_f;IJi*9NsoMv2cm9;2U6f<>2R9j5A&?hbm#W6+^m ze$w4ZkGHOgboiuugu$82PCcqm{dI@h)N7O2#C4WDf;=^M2AM0< zu~kLuM$i|!F~Ln2PrKv%8%w2VgMEcG%6!q_l;@k5n@h}T=1BcTIo@Pp>_)_PD!R{T7<(Bn& zo3zT2;TY&hu+Gq3GhDU*4)fg~+YjsBHT`CvX73BHQ!nY3+veGNKu2S{wMIA9eA60f z`LE?w%YNMuQ>>-LGR~4DZ)C8ec^mn=wZHk#GqGb*hcE%^XE2&hR~SNib-W@*xrY50e3;mIg1iAH?njupvW z=;Hg@9+Q?x&JWySBDOP~&kK!eYI@hbTGmO$Nfdp~4HN7ixb+c+AEEatC~KRV`QAWE z>&~^Js!5O0wh!EW%u;ceFbHKZEzEZYMD-YC3def&AaFQA3fpzhybL#%BEd6vZAEmwmHMa9;PAhxg(f%Jw=h9 zx)bQfPuyLB;$9p|O8(yy3ACsK&o%OAnypr8+dNt8dX&D z*YV&oy3z9U?rPbYK-bQ@@m9<07feYP++Fm}jeaSVeZf6U?>qw^N?R^4XWbht@|~-^|`w^5M8^Qe*6tx&%NZv>!q}NXxb%&_FUp4 zTdtnox#Wh$-r~FXBa(Vtb^{w}%jg#l)n0bT0Z2z%E<-ayDqc#*#YfuR^zmhPukv6|d!w7<%dto&agV~(XtL_+puI3P&$EU5u<1kP%G&a|tu3vTIEm-j?O1Z`#X=^C&nj3!4a$Pi6 z#1ubB2ehQsbmp2nz{~lZ+6)x60lVF`bs&P=rIl@xfnU4>gibo7Drg%ccvYJ)m*$`m ze~M9jfTrW4gOv7Q3xseMpKGVpe+sI1KYs+#rvg50C0#&B^u$I1*F`s1P=9;`N@))W z)}3puNF2m+m|QEBU1#2|csV_Yj{qs{e!+nVm>8BR zmK2ou#5=i0%DlFP|r2Rokf+9Ae+_`i*LBUimzD!@?BS=cSB2GqV z0hHeBh57Q_28!q`D!D|%@PS%>Z>|OE}9Ze`bTF4Ql8>p$(hI>X_sh3q5^SGZXHcd6ixXrEx|`ODebrBrm#0C@$e?M)&&L4 zPCN};FvL^!D!rYkY}ZL8Myl+>wWq@bkOl@hZLM$T$-R#bbzxML82BTYu60o&by7Mc z<_L+=xtIDUDOf=zdMXwl=|)d+1n_vKxsynv~4QN;fpOunvk88oHO!+GIvn ziA+!7BT!1$HzP{`F&6HoZ<9qW5`}f;k8~YLU6lYnfaKnV%>>)_u1-ocE$^x%nc!!fgQ0@}?q8nFIe1ks%C?Q1& zi;&W_moSXT8n}4U(@))%_WoTA|AAlD|8_9HVQw;SG??Tx^8|ArbAaiF{ujBg={?g)(|*$${U>rH zB@I_PHp(W$2ZqyzgN6z$y2{5~ ze!8K~51gl+2j!i*Wx8Z%p8227LGoh96`j@5N8D>eggjm3RnZBd25lULLVTs>^IyP&{vI2;moBf9RT?|1|4K=+wq9Rbt>NY^2 zROvJ67pYT+eo}gY5V4BXF}SIUQ7apmXHB0WNR=<1^*}{zzGi8^-Ic5`Iej{n-KmU{ ziyo(AcPjVGIo+Cuj#OmXB;|g^qe7WdCs2u!8B{h}iE4F?nm+6H2JuM$la5NA5=TiT z`QjarsMsgPtE%hyl+o*FLPy1h%xR)Evs>Hf1Lcywq)55bkU(?2$RQ{)aujl>DyUNK z6c`9|T@XHTWQ<$WrjpVt=`Fca5FM5~jcj)-E~WHBI)A4UY^jwjv$RL@JuYVj$mvCt zKUV2LqsKB;Et$@t7}pHG4P^Ce(L$&Wk5$0$$0~{Aq>{YW?y+k);1%6Fg2oD} zAll@UJ*QW-cFzaO-Mgr<6ib&53#J~a3b>4tX{}LU@OvJ%sD66QDJB~iXI44ASQ|Lb zCD#Av)Rd|u43_&TpF`3Weq(NBu-0nlN5T3X{^y1;^`yYB@{geovdn3rahi zUKbzfWps4BkDh-=0clFtDN;#^kkWDH)*(k*U$8x`*})U7Ef89g+}E#L)>$h!$Nxw0 zqYMl;q19GLI-X^1OH)G4_|hiZ^h;R*rjnVl(0IbR?$bL$>6bJm4#PgHO;o>hCZ_2n zG&P+mWbVIdNxISxoh{;zkOZ{sc}MzR&{&o~qma!L zIoQ8y(-Rc)oZ}E++WxW{jbe9q5YVLEP_YLav*#_@(9;r4o{{#)bY zuE$;3E}d<;{vVcplr&w*l`U~}?{p<9LjGCjlFwPk=nh&FVbbYK-Fc`gud|d|M(OUS z7p5yKjK)3Ezi`%KFO3#RgDx&Y#G0l@@|EtAL3^l;w-6zw`jssKVFP29qczND+niOj zOByo?czum_x$WUidkU2AB%L&Q+`7lhCex3F3erkmK_J^!RoAPVZJD15bcKc%DhlUM zf1O~f;b~+@U6)q5kbd5FXJ49KtTZJ`C4bjuXp2WnDP6mG()>+I>2D;!#gwf1%A8fA zbisJP*Cy&2M4??D(D?!-4(Ec&S!A89M8woDWQTG(IK;$D!Fe%|{qpDu^1&TiOa}{; zuqimKTo)ob9~@?0t>A}!VO~P-wgo`%a@zuM=iYA{fjKl8=8YkrqR4$?g6X~43fS$E zbM)J6UUTX1QO{BZ$F<2SDWyux0IB31A;d$4!lfrF=;!>#Pp=UHc-!Ox$KQe@j`7g` zQl97~Z`0fO07r68qbn^AKp9G5S4T3f-8UwP;>(ms;O?!Kr~sN)rojDC`a86wjJcJ` zZrV{M*2BOJH)%u#Z!MG4X=;V&_3N|@AHh=kSzoW4 z8^HCa(dh~$BtR;8O{1MaBCy&W>n(!5t58m%1FtqcUa3rsG0*W^D`h$Czms{5(yP(* znQ@>#*F4hP1xo#wjnVqyrk6|yOlypXj1GN@X|idYX@IGd;fg-gc-8nXIM6$7_*!q0 zvLx7;G}Rm4(0%VZ;!s=*%=LyNx^u2%$7bhc^9;jw-6`iO$3^F6^9jQ$-C<|BbA(f| zgc}yy%TDm@yGAjRC_4?bpL zC}tHde^;BSp&SC3eQq72}1oO(~;ibD>;7 z4jGkppyY zqmnQ}n%!A!SH2RsPRxHYm9^kxCO8dI;K17(#|Yj}14xO9lx8Og%H%5s>{+jk<|)2O zh3*QW!{mdshWIEtJDxuR>0?s-oh^;#;`VUQf|xY#CI3wVHjY06BT?dd+f8stqi@A6 z=X#u`?^NIxe)40qW|NZ8L7EN2;4K5f5QpgIRwXG@%IJG*zj%uG7uT3P{GzLV(C3@^SU96~caCTn~jX`>U zI=o(Csnq0W=+qV^6={9=BbJi3Dv;}C^n(*AC6-U9lb=q8cX63|ZbR{pY*kXs((K-? zQLqxx>k<3+&|ctnO)6~Z8g{QjG3>aw;%SLg5j?_JNMu%a@>4Wvn*t%{>|TNsWe{zJ zpv+w;Q*2Wli#5XV#{}(c1>?9U>A7tRZmwqc6uX`e8U;M;80~A+sQg=2uUMvx^JsEz zS31T>vwO54Uo;w-cRD_4$t-3L!*`+5?MhgHG`qXt{J1KfV>vG6c(|IIxd0_c3lY80B23!~cRuXMfj!Cl52Nh5h>}raSa+$kE2@#`DHg z#>e%?WruNvvB6kmbn73HF2nJP&2Y)^g?^RvrQw8OFL=wj`daA~KGaJSqPk#4J`Js zsrrn)W1Rcu*;@IE4lrWP$u@)^76 z{4+{8pA9n}*3KDHzl;v?QpQfPUVNaOyrWHopq|_5)Y`NNvy`z-^9_0ChdYC4&4~7T zI&n-n5P%-F&B6VNXli&;c?~|tWY~MECsS;>Es8EcVvUqlC_;2*#ygA(0nvf253qx8aCe(~-XU#g#Nx zn*FfYcyB=#ib*hT@zZjl4Auy&WYKkoreJalFc%g}Mb9ulI~#b5Y$rFP80Exk#&vu# z3>$gNC~!;+oq9&O19Wo-e}r3+t&{07?gh1bo+X?akBM<&LN_Iv);8fCa!nI6(zCa7 zD6F4lJ#OQKpn$t9nhW2n+~6m~u==Wx@fMZ|fhbeYDN*!AlM+=d&E6)+oeu_;$7!35 zz&rzX)>`bFeH;_tCI?QeHG|uZH4~4mZ2?eZtR;(Qa|CV(rzH5U14|r%wCh;~H-xj{ z0GkgD9*(;3tP*IJrle?hcw$<$JFblG)Mj;X4Ue{rFgK`6n@PC(xMJ4%kQXR$mPAh- zSJV)bZcNE-W6F7xDe8n09&Y`gIAnlslyyRZ2!HnD)ObP(>}uN%g03ODb&7JE_TGXh zj@eDpb4mn#c7o;8vmfKoP>kmxibb?&TURQ0PKk?>W*^k%a`X7r0Bb$$?VuWingk`_ z+oIWf=;h~>9@uCOgy4m~ELxGM$-VN+x?m6K-QBLjY)jztO2M!Xf1E?>L0BLiO{?G7QYVe)Y_zl<57pE}GC!ALL>0w@`J*_^iMC)B&_{Gt&(@J;V zF8rJRby|t^H;#jBce0+$?;|l>_503F$5c4vz~O#vVYixfYceETqwVYLGwuCsm#x2BKDRa4`pY|vos5A-li{ko1}0?QG#oPEGVPqw zK`&>+=FRAHiWjr_&3LHA%Ot@C9-Ta=B!)o)K z#CI_`u)(KlVzg9Y|3j)DAZ9VL)>ny>J&(mJRP(L^#emY$v`>6wj-@m2fs zLr5z+P7l7P;Ih2bP0!<_M9TDNr3kg(W)(~>1=jJQdNa1Z9Kt5dmdj#2YeDXAW}9Tp z!k^nDqt;BNO_)o2n>_C;vrumaJ@>v67A$4D#abMTH!*x3nDUl}anI$^(J>>pIx_sM zqQ|M)FZVGke}=G8HRWA8^O=&=G~ol~2gr3Y@iOq7q7ja>l=l%cxuxUzBZgl6hq3@yCMhU zH*rLV$Vp$yYT#qZl3xQ6olCK>F@_i5R>ZnhCy*jNBKc{1Le$I zMpM_$QsyMl!qj|N6YRt-&e3q%QU}LjxnEF1LZ!@!f2o3#CvX*kYzZ(^^IFDPSt`xZ)Th>V9XUYP`>I_GU>LXk<2G&M@JCt?0N9UDAX7f+rq9Mg z?D2sTPt!kBdZ4WA)~Hm>ygwWne`zw0llQin!*Ra3e#?sCc!j4BHty0iiaxJIgh-_m z#U#*hhDxqD_F;cd6<83fU8VB#N?a$Ybb{ChQd^J-;NKnJLSd#kiU%)9?JNOf-SL7lR_|O7WsLF*N@qQ+=XRw{7nBitmoS%m0o2pwg-tO3&y|sS z*Zt6E%l=&Ht%rZy5L)%QlB{?A+b^W)ZGZ0R3&0c zAK{N+I@NA0u0k_+(}i|pIlU9P+m8*Ql=fpGKP%nEA&8(eAEh-$Pk*F$q;@7xG<|FI zaQP2&XcW>Pp&yKhZZLVU!luSHJ#6ymB#h2}O@*@Oz>yL3irE7lkj#VBUGHH7vCGKrdN55aN~Y`)8%>6KN5oQ4f59p`DQm-N+2_XN zR@p5J>NBol4#Ztx{TX~Itv(0i!EeQTm|EVXcJGc4rNVc|L-^^Is4>pN??u2iAJAICV8W*TnbAQf>tX=jqBQ=Bvvx-L+Y9iLypN4wgFT1`3J7X~pYv(eW{ zo~TgCt$AVdrEpCvd%y{xOh=PFi8MOd(;GEe+eGb06l${5g=7yj)2BW_{#`u*2~wFw z*ux$VZn4kH!b!w<-g(?M-!~V1KaKAyx@o2od~}f9nq|px!u|t8te{O@8O3ELI*pHD z$!!r7a$IemPin?c%js%Yfqx@)>L&27=~s-ajTu=FqX3$s%GCQPzniGeKuhp}>P!Nw z<0=~RaXE{E?xn-sJlF=y^!yP>zjyP5M@nv^*b9A=C2wqgeXaIpQ<{1Ybx+|*T&5!h zA4bV-0M|%$DW0>yldK&tc3qheMAN!^pf%{$Yi9_K5=;JWI@jIPfu8Q}f%v^l;t*zt zTlY*4kKR9Fw|vo0{@Hxme8gZj?=r75FEh_E=jnejr@~iXxY?l7={m?4n>r5nBuGul z2+ta6r07w4;T-Tk7}xr>VmZLHM{P_UOr!8n*R%mar)RZq6UGSTtfO;{dk+0F z%F`hOC0`P!0j+-xb(+SV2yxG9TNA75`f3l0L?TbTdcnGhAUE+hI<1wxQgoLqo@OJ{ zI8VG>wt`Z|iOKeWm~8yEOi1OKnoP4&$v96ZxokPD8pjmJeZPj{W*~;K(BH>-_Q+-T zQTccQv!WHoM-8T#Y0r317rE?SdS|=`DqHU5f+G->wUUBqCTf@F=`5GsLxa-9)V@!U z76GO`y5kCsG&hY~zKnLJiI(5n+VbW%chd~?sVM4h(xr={?rANG&4EDxilX#1BAti# zE}EGxhIg4Zyxczs3K>L4o71`JOX+Xvp2QiF`|j4JvlIhj0S42wBSlMV8|u1h_~&AH ztTgRNk%+Mx-kQi`rD;csL@r38%nVOxV_Bov7C0JN++ri(0OwfR65pC6CWaKWO_cO)3SmZ-)X(4!k=E0o$ zCk48B#OKo;ZZYD}PlBpRdP!+vSxIpv3|XRhu=DBn5-K~*6E%wr>@43VHj*kGDOOIb?vFwbk8c;kk|C$bdMrCgrqnlpM`|( z8x&pOi8LAfafHmsr(s2&BtExKn=htKM*iHA^7?W?`mfWn0?$u6N%5oA#h$K>45bZe z27JH)r$@yga)2?aF##L`K0jzl;yN`ZfRnfkcr%2xVKfIt9BFPEm+)tE0t$HD_HXdF zqRoE)JjzfO4srfPlvL=6?O%3H$km!#j6AQ|#4O-?$}0Iim}0%9Q=EAr-Bsx6FPB}V z=L(s*asNp>3Oyl$o-CktMV`rW*&qC$M4O6uZ*gCv9wnYYX0FTq=}3VmZUld78+?ZF zV9H^q7%RO$y8O50K*>u`Hng-X;YsZGt`{lg#Dh3|LNUm`i4X6+q z^gNs)9CbJCt?={@mK5D>!^(x-Mb1i35LqjE<|{G}axiCFO4BMmY7ETliNO|gA%8|K zRFt3yCng2wUefeVrKeYn`EkERy5)Z656HU4Gha5JZn}4kXSZHfUZit7J>t1x9!&Ti zO^ubyPt&QRso*)3GXm9_mCc3~q`cv@Z38yS@>8(QmkJ(Sc|q)M0P(^}HJlo-m?>`< zd1&sI;2sr=QJ zm>^oURe--vYqokqnI7hiqqAGNyjMuK&4cs4@*4TC7t<^+l^)!ND$2KcqU7?wbAZ!d zrE0{AykqI&HqT(W{BQgpM*X+*5ls0z-9ShHjHVa1<7~fayC*>|e~AM)@hdOWHpB{m zQIx#H(_Joqk*4hMq(n%{--NM!4W}dF-U(+lt=}VQ?+$Fi<6foAhdiNj`8)LHYkbC5G$k+w;AD?rtukR9 zsJ5YgyVz_w!2Nog+P&@xL5nmIEk|<>h<#WQ{EOFt^l7hql1=4rwTU_WI&<*KJLF#H ziPJMY4SNIQ7WIbbOH=uq+EMk3H#`y4=`0^rmA5J5tXNZ-bn2`pme!y302^mHfZKlM zEm{P$fVSjiGbt6$Q7DrRN2zVRlyASN@9q4^q5hFU5wx9Q={5d zmOS*cQ5DY%rq88VlR84KxXk~NwA7^H6`$uyEUf$BBIW3m5GD!J8+Pr{!^_-e7 zSNzKV-DtH{g$TlPiJ`g)fI9l!swPKN{8x}y^sk_VZF(?HVJqW`^JTw#X{b%TD@<$= zNS_03WSFU#h525IQ#(7@sUABlI8v&VZU^CB-rWKcC`?P-bvqExG@qj$loQCrTGa_+ zeM@5y?fESU=8ecBsc}tP?U*Nem+aStUURAg^{(;Ie>J+)Q3lt2c!4XLL`5z&mW2#M zML4i&mrI=<tFLh&9m1nM)e$CREY2osB`xi%h7aZ;J|hSm9w5M!rlkJ8IV1?g z%YxZL8gzSVO8EMQ755nKZ=!(S{Hblc4CEDVQD9bvqhAz5ETVa~)oSJ@)H9?EP(%3| zLw!N4IEF}!XLqgYX>njd1P4wvz0pg34`SE+J84&6)g9bi9;7$mV@gY^L_=PsrM*?m zyjsbs8W-c9SZj!2G4UzXF4Q+jx+^_du6%(~?n)0zF|xx#0jE`1&*vHSY;y&z{lNUr zA3=}zQzL>58qcTJ&(f3=MCEVNg??&S2)~k0D+L$E>Asf)>RaUBUrioUd0MPIQC~AA zs_F*(VtxSXZ5*qiyndEI+dHkTXa?q145y|2)k$<}sESQfeT8=PS3}8vfNGG<4^VX< zRlKfNU!w{jm(mBQF>>W84n#(oulVV;Ve~bv`HqnL{I(bkrW5(Y=#>F#bYta7Ar9bn zVN}r0AFXftoIW9r0f)35HjWr7j+RKRZD@G3c?fxGJ>Q&wVlFqMnscNHCQGfah+#8h zxKstX;pV&>{67*ngNGIl#P(46Htie8+k<*eY!6%lJpILFLHm=z6#Dl-wNHUP zoz7;909;)Qt>8|N<&_c=g|F1+CD{sqb{%pK#xv{oLsdMpz6Z~&hYeN77~r-%Qb!fn za^Z_$s2XK(892Q9S}xR2hpLg?rTj74yg_X!<1tqZ6g_;1*JZRMp=p1*#zD~|ZkQUc zcg=*y^o(I@u->&9amB+_Jk~f1^@Z)jRH1Cqr|BKU`8Vpm_FEv$a+%MXpV9R*-=#Zi zcH=@TLU+@whuNbajLS_Q>V7mmC2u#aGu;IfNFGxUd7<$q<6Fij44Vvba`bi*Hp^M)4Qzh2gLa5d@9rBl?9rgv2}K#DiH zpkRb{x6Qy)^D$or{yx}b%TiOJ8Iga4CQbm^t4g7z6V$-2Mop64+6;z1^q01C>|v^S zB)zX()s6q*HDscymyGnqBo$iD-T~Y(9KG|Op!A7qe5b0e;tssET&(3vlgrm6tk9}1 zj5*w|=O3k?CW6O*eIj`Ls$>qt#G1aqiVKHn4el5Z6fl?{BVNCVVHn7WilmHewPT}{ z|G3y+e7LG@nA@%`D!8tswg6~Jxpp(9mCb#7s%;KX^bX&&h2SE3i~BY&GC3)>fnPjL^RC1WVUZ2kQFDSWaTKG0SQ4ooEc z1*e>`mw2w(+z?*Q$R29j2-!pBWVN&2_9b*IwoF!24fam_8je>u-I%P#8|)`q!o#Mh zkW1wsqaD2b7EMv_ko1n!>jU_Rlk~e%)VUF`lym{t^p%k+Y%cVvRZ!jIVbK#n$umnGs4`J*lC|RV20( zFAB#9YJz_bFqPRXI1~<{<%)sy5I# zH5I2{FKKJ4n0=b_b;*n%3Z0`y%2n%Wz#J7q6z@ijxOJ;_>kG9UEHtpz0XBR-iQS~tWfFdx)kNCzI zm5m$4HN{fZLN$&?E>x4{s+}CjL`}Qs%t93!95Z6pou3&>xOF*^AWfa@BU)x=4ix(YsTK5P1g1jDmgWlCs*Ep+mWvDEikT?)5gZFBZMt(b{Wa z-;{wOY3yRPw_LTA7A{tyR_WbNM;G&MH3Jrv7OQApr4B3|!S8d0YP@=Oe)bB#O`H$AgNO$bb`HfyU$c$poPqpcgw6K|Ha zCB$u7L7oljgL1WrE^bgEhs?4FIi#1}&c@7O%k_}CVPy^pqUL_?|#bao>zi7XSnuwD(|Hr`7eNbM|F>*)?sA+gUgih~3fgG=I> zDMc)_nsE=!CoIZpTsjjk$}EF6e+3i+ETdOReXu7C2Z?E3RS4zds=7g%GAE?j2x4w$ z>3!Ka%-QaydpBW5RZDbq6R3N22U@jodN6&pNrjL*E0ANg3A~x2KHFDqi7b z1qgm0#u{N8dS=Uw>j zld2Ib7TtrCwgZfheusK@N;M1y;y5FE4eZX)C>A${k?Uv;GHzGW(>r)%t#o0B7+JeE zvcmZ>3_l2cs2LAX#7=dRTy5e1F7)tD6-L0aY~5fN3>FV}s&S$b_doNnD&bHt!|!gX z(WR?01jtjM?e?(weshifPk9txlP1H=#+~}_^HO5GXrH2U#~I@^H0 zb;jGJ%~K+cAjsx_8OVJKQ-Kjn)bq3&5YC?)1;xw48=QQY3M~*WTcoTFwEbx{hP`}e ztrrJ}tm2XyJ~wDw567<)qzCZ@r4a86=}^`~Vl`wH<7!!~jU_RUN(ttGi*Tz>hTOyn6;Gm zj2awbVxw__W-+R2i{aCNJG7aOJSE6ZL3`T!3`leJ8hY~?H7wQ#!^fMfEw^Eci*HBf zCUuZ@_!9l*C0F3`)xh}kvA)Yub1N2^#uWI|+$J@$sCu;^O&YebcrKZK11l(ke;HHG z7SIX~CUD+@)>2t?P`#>6GD`c+oC{f8Rfh+T=j#(aD+Bk&4Y*xznUT4 z^7Yi$doi}#{>PYebDVVlvubk3>Xkx(pcUuSP(o?{wXJXN3{P7qxfKM(=|^HTzxaHV zxFacuqL}0AV7Yo5|A$e-aTRxWSv$lO5Dku`ACE)8|Mqbv^jkU53zT5Hc8|7p_hi^* zFNmO_C)D^M)my~5tz~S%*ALd)ZXIuKbjWQT<~cRqTfOPlDj{+iEZtTmj|<&er6?j)JdA899HY6+b{wx4H$A7u zCfG}07_=p=sOB$|flFOSpFgKg;K2=+tJm`~ds22RBKf46BUf*vDJQ|M!#Ze3T6$6) z0z3uNnUm^hxq1WtN5hWdpzFBrz=2`uy6iAhQBCVgV|9%BDH?}S^?FDEtvsbx%P!c% zJ*D>2yJq->Qs2{RH@)kCUoR>;twNLgeVj%PoyKVd7Z6>WK0d8>kBRn||1f`|yJFsE zUS!TQy=3Sj>&#JRv*}mUCkB`FEhSv!Gw}Pyc%#4JPs6|T|CCM|o;B<;JRt8e4Abp~ zq~}xD(}p7bIq5Oi5>viws=UV4TesR}bzX9QVIHk-lGZxcTbi8t#=-jChPloz=BrM< zJm2xLZl2?igB*7`2I?ojJ%eGfn1Tjs8ZHlSCK76dVz{^1vjDRvs zu#@!9)PN9af=%pX6RMyagV!feFymA!o&E+=6KR4)4B-S=Cu`oNIoaG4`lXtoi@&8* zo?s7%dCT<(y)K4z(y1>~lgHGcBs|q`QxCu09lXpqP&bZdgYAhNdrbMg06 z_kX5#9$tf2r7*72CK)B&W9olv<(%Qc+dIdRD`?|CQ`6yiQIm6W&229|CbXl&|4hY` zy02AZs9=Xh+w$ka6W~mo5!hT^PJg=owL0hyu|Qgz&ZV!`;xvr;DCsuS>03~Rd0Jzo z+HcgJeQQkONm?_8asMuKqtKzH=H5POMROvHWVnj^$n`J54HYb>U%yeijI05p84rZC z87364#C!s#ecMJB3Ch6j)!r?}c#8`QS?FG{lJfqoPL8$)K(d7#8v5HJhJn`5qJOJl zqgejF)za}+Y;%`1rihErDk(4Y^?kSYgs2rs4C$o)->MmO<2x1l8%58M@~!Xs=h6S! zLe65NbKin%t#Q$fZ`Gg_>vq3DF`?TGon~T9)YLj!$Xnl+8vg@2J>@^@63Ib3|AUSF z5`OfyK6uE{?mM-U-nI^gi3fbAE|aFw$?w!ez2imDh;P4BPnv5SV+~6!&P!#Z&l&>VwtybrV~u4%(h>QIRLCPdTX zxxrodZn|KHrk~K$;*BQzm#Twio4nyn1ZyJNq|CE;p}8<2it10U^5x*-kx$zFb%W|Jitbj$;-lzf=zUlP^d>|~6FO*wvK5S>9!k__VBW8d9RWKm zPH$Ja#-HpiuY%dqp7LB?SV%5dD;6vcmys80a8X@l>g%lP)hL z4n;pVedO{c#WWhL{a%x1()% z_?uyiuEw+r4k8wtsthZ2GffjrV@-ohU0@K$i(}C5#&3)t8A^2{jn5kQ8#f#8F=Xqy z8>bn^8~Yo(7{=*hjZUMV;a9^KhW5WilD9hBJB^NOw!Zo%d9~wX$63c2+amn|d8uO)92GCJy{+FQS2-Hf z9D^K5_D=fy|MoqtB6h*gM!|+kb5r z^<(5H+ezDFwk@^?^!*L*f*r_%4~h}Elc~3Lw6(YCtiS8SjghdK@V@mmYm?q$ItCZ+ zcUh~g({)!&A=Y8m6l;{#5vBXaY_fcB`G@5V%L(0wX0mLyEVse<(-G%-?3fiqlbVuYB)Giq>&hw1LCMxzXfgx@O$3KNZ*QPYb9p;~UXQZO+@ zkdPUba|!+ zL3DCPVO>L^R(*S|2*}pBj&@oda79xFcS{`OuVp|C9=vdb3wH^$dVn`5RGO%1@InK< zHU++!$_i5ib{tKw^!8qo8fyc@&LLWi23OVHvCkOpC&&%Pt+tv=)2tFSgJ6-*+#m#L zGtj5nh6Sx11RbmG(2|6*_8O}NvI<6?)@wijoMR;(cF9`i~+ zOdj@D77dz7td0;Fz;LMBmEe zqWjcBFB*>|e7Hunk7^UFWKPM<5`oI(wu8Yr*U}xjaiPhzF0G>&6l8nEywW!-7zBhq z5YrGz99lz*`+H;MS|{!5?+uDBD5+sX`C|Gc-7=I6yqZ4j?~U$M>(JVz4Jj&kSZh~V zKBUd;y=7uo3K`&q%I?fnR6PLh?mYv%QF5)F1K|;tbm+rqL+;C0IZIRCpV*D|5Afpk z=*$P{;s8+nS{vC0dK1{I*G!yky)L=(p9YxNQ+G{v%Ei&Nd zwwU0E$0%wL*NMj{T&Fg4$oaf=4^A__rOtp`wVWCNM;xT;LEhNL+C;Ging<41pR@J! zDN-=WV9;$EDf5jT#~cuwZ$SxG01OC$>>xkpe`jAbN;#p`&G#}hxBEc&d%u{f+O$UQ z;o2)2EzCtEv`I%X$L(|c^jcB;Qe);0fl3XW!~4iH*c+Zw8!tErv1*a)SP`k@0&;U5%QK5%| zRJ5dJ^Wav*HYcE%ryOR;XT+}3W+F0FpjM%_#n34Fu|03z|1Wj*jp} zBj;h~op_8MJJcH+?VJjMr7x#(w?^Dh4uGC;E`zE{{!nkHaOYOskzDLaRH6ZOuY{Q~KYp*S?Sy5Q?KWD1gIZqbOd=rkG=?n(ud&~2DELRaS(L+Qi3 ziIJ`cp<09;mWzH^j2r?e`=IL>&OvL3d1J#}uW{v!Z{tp_a+q$pZ<+mF3dK%+<6Xx~j-&b!vfbfc_Ap4r_yzK?sQQcR@ z&bIZodti5Ew(cY20!sIIJIdw=s`7Y)B8;zCddf1qSpOTMyYk98we{tgdjEM3NcX4R z9&dc3lpQOUO1aS4FML>xzXn;`urSu}u^<2y1#_}A9w=MeW-Ib*`9=%-Teh|}@);#2 zv4EMoY>iA-S`Ll(%?=lALOGr(a%z|_KU`SXvOFtWlOw^JNL_K+ycoVS z*PN_nhqOYLF*BDPEY5TSQsZFTOW8q!;EOm032e&odfm`1DBMX0CwL=!)&Zgbg7jB{Qmoh?=>p}#n<557S$IvWo zQgF$Svw@Tdwl^fy zJQu{hTvHpafC@o5R0z0Zy(lHe3)xm7(bycWN!y!zGXOOma13qcXe#*RUZ`=aJ^+r` zNLzBeof_)`gv7mNMj-EA%PljUfnn1PwnkfkIBJ97Aw(3`X`49&qFdLYH4z1BzFfre zmk87aH)A=#aMHE5%IMqs918%C#J&{9JD!jm-5%$aUR00I^ke zPuk@b;+n!E^hB<=uUwbH|9IS$>&3lyc8`sdy}>NiDm*N9B1}N$Z@e0{-oz@XYaL-YQ@ZPeIqZAJn| zZMPH7pmE(=GD8zt%k&f{{MQ0t~V)av>M zwLX{U?aIuOqv^XmZ%|B6SAgFxom~eesL@nynyKq;>SKy-)9RprWd z4KqzLpL2C_MLQd)#}aRtY)WrRU*bI_Ypw)p>nnrIjCtsKZQN;&pqy@yuchvommz23n9dw_1->&0WL?8~ADRMjEV&|55Pc+%lM z%oi(&k0V75Vr_BXF;17ovf}_xs9&2J@AIycB6<$B zB-dTjngukXmQ`9U2%uTn*IPoIVIkc_hQ_+9S_WvcA;W_j2m+kp&z2BpSRnR7tPM0u z6As~0t#5!yns0WH5aZfz_U|qx3qg@}zX{C}Ece=C*3~P9 z$rt7meg|a@Y5HKbx4XabG3f(PStx3Gvm~0f%ezXh??ONB@&+YKImrSe^U9e|E;=ZB zG*4{bi;_jtIe=EyCsOxEyde{$oTQd$&T&A?F_SHREb=8Gz&Sd%B%y03v|LC+?{YL5 z>^y|HjQzCj5nfFRbovo5EDGdkrqSlk1!9Z)^ zEEj$Rv#7IJBI4~)Jx*6xa1BsH9NOfI<`yLQzB%U}y7y6UvRn@n=#TP+V@^C>eAEm3 zN=3Wr_eXKrRNs+ec6*@~nG+{uAq{Leu_lkVbf>_(?PigxYc)tVC{R;x(hTs!H_ zJy@;vkzxoNU@a6?9T7vw0j?;zCBzwaP`ka}P`N&Wy6*Lcq)9p2RY!wwgtu#hfCmwa zqBO({wRBA~)PN(;&?kJ+T(ovE(jaE!Hd?)x>3tX-*$WOs%83y4z5(kL7bRTvR_($# z_Ay&D8TWaUP4%H|VzT#%5e?sXSll2NZJ|T^ys2`12>rfK>>t{Jw;{if&5m(-o2kow zo{hnjzF*8n=nX*wWlm)UPDsKVMA0T%x}SHvAlkd1uQPK(#Eu7$ycQUu3;Vg@fpl}f zs3=%8d`?LX%k;UTjnwl1<1B#E4|qe`NjcgT#+-smnDdj0HcU4v2OHYVGj7 zgk_NR^yUF?@PzvIg2K(o=UruwSkL%oOa?Ru7B_+wx&yw0A1NaPc$`Ki1|99kb2BTzrf(C*gGIc$=L?pA2Lu1~1Q~mSb(j zp<~uLnB&LVLbZC@awlB;etN9!9md~5uvVEj{rTf2jw-SnjIZPUm7}*g{ZVr~iqS!6$iL z6d%U`S2LBz$=IJMuhC?j9797qW15tq?by9^BuxNNbbj_$sZdmJd3yMY=&`qB#McArKtUDlc;CBf6zp zG|>f4Z&-jekU%GrWk~0{YUs6OIW9q~{DIE_v5Cd~gb#bbEb7u{9P&f4iCUL<9m_ry z;1Cc6gI$@S7s_NuhSs};@935~ikJWZ+*1@*^Er1N!J1T{;Bpy~mC6eN5rdQG%noWP zmvd3CYN!dzkTGyArMJrERzy0Lqil;@k%~Z*$w6RIrq_w|CJT)MlXYy;7XW z%Mi3wo}qI~WoR^bOZE%$eqq&q;fDRf>SqK+E9iCqtZAX(y~>bzN+bM z?p4xtZ)o12sRs?|({Jom-VD;~-_pcSAKIrBY3YuY4UXw=ZdD@8y8qC4D0otVGTx-p z6_ud6-#FGg|=n(Hr$EM-2kxiY9 z=T!cM{x;%aJ(EJ_Q3kluC~wrmdgftj8TBm2D<=bR6B2lzN;9LL(sHfx5T8yChzX!W zUf|P-1z3;ZMhVO>3ttt_YI^Y z74H48U19;2DvwSCQawhm2U2CzmmF~Al4&ci_fg8($}`NOCJwlAXd_;&(<(1Fj58*ye$WRpk+C+2&z{FqO7&z?DwEZ7h{* zF`e4x!8BH$rostN0+}W}ps(Iy7FvS$i)d=XlSsD%4MOo$z^&iqA7kwFCyw$i{0S9D zQQJMByRH&y-wuxu>v%|cl5W}V!F2U5pyM2H71PJtJ)lI&Z^^WS50fIw<$!A;HSgfV zOG*4rht-nqjvV) zo-~J6fs#X%T>p|;oLxOdswZs|` z_CwgmVNXKXX=j)xY*|-)J|68on_8*6^a?xZxgyN<%{} zpG>cqENTkTLsT}0#MEUe259eFH5&aCIfI+x@&T;~2&|6}=C}2A!w}f`#Am>s0(F7Qw~TCtJkbc_;lM3! zq~qH<($}D&&`2e`#eWj9K#F!QL_CD^rv8Evm~O+RMZpBi&xrhj7jrHpa3zA1zL(fH z&htDr!{#OQ8+S%g{zONef)p{!+1pwEwi|X@*oE;GV0=7}?)E;g&Olu-M{5H5nYX4^_Ld1Zs!4ULIhYN<_L;<-E(b#PvKHk+arMER`!fDIyj!cg1rh~gX%7Q^3l?61r zyJKDAK7K;p3KP_j+=Xoj39VsZ?SoR((E$v{M6~^2Ch~XkR-I#*X=Hrs7c{k}1B%`w z+WE)n*q#oFgT4FrcI@BV`OMy~GYY6uBE9lK7Zzn#GX3yD7g!(Vfo#}U3L?jOvy+-X zWbeEQwBy4rSc`Ne(c2$(wP7M3q>R}vMpEt6!~s_#_0M)O-tvB$ob6&uP&^&yfGdIC zob6(ZC^S`OyDIQ1jsft)@lh8X&A9B>tV4Zbj;4JarQGL$nJoC82^V7N^haH=oaK$3 zg9`b$3yiNTo?1SJ=BSH@lzV9iA>+g7`L3AhrRTd|O4*}mzSGz)+J0x-WAoZ1 zTZHwz^=0cZtJ|7k4GQ}TVww-Zf8s!x7?vDnw0v**#PX`;Da#?tI!n6wEAwmS6QEXA zrXNhNLzePZQ>iHd_AeecE;oDu6V?-kK8POF8j=lqIDfn)bQBI*D?`H|m3lH{Q^@L& zd`O-ydKJ2OTY^i1HTpO8_vqK_)4)N^>W=F+>Kb)XL0<=*3i_v@=AfLQQ0*n{6WSfx zdTpZSJGRlP(xl1ZZOdUtf2U&zh@MK-*A3U85``bIMAA2AIhB2K1MCurlw?7sd8)6A z-mew%k!dG|)Cp+-Iw-$RC?R7#DfE#IVolpm0J-t#VWT8$T++3DJv{`oQ6II_j zve)y7YpJSUSd55kXsli+1EA1}dZ8F8R>N3BHBDLN9DR}MyMbaGgatsaf|;`>y7>WD z6!kO+PGDp-S1AcLIn9u%`q~g$L_;I3~yWYT%ip z`j*4A#sa!@&YfXMQhhFTMmjApuZqu(P<>5EVGrzEkpjEf7ay!JslH`6a|>r%(9?UX zRbM0hYMHPE9VF{-Z~U6w4aXmTv?VYX6g`%fQnAXwp0eRcRiHrd{BCn%^( zEtdTlz9U5bY@cXVeKnv{QEVp&6n-tLPehF)u$cp*sWw{m3CKS2=Up3z#vBV)s=lR= z3-2MmY1_VBC`8*W!QN_u?aSInO;Z>^_8f;Qhho4nQvd-e9s-P&rp4f=?=G$iF_83<2RC> z%HMZq>g!Zr30-vy^}rWXV~dcDCSHhpPv=5MU7we!G%a*Mn69@M+JWey1$3Z=kFg>; z-onRNAziovo^kJ=-7$JW^%YQ(B#7wUd^B7f=a+hi3!pbTHj38FL(9blc=YscoRp`} zSADsx)69h*akB_UE$ec7x7IPcv%3?Y0+8j@tOBun_kEc|5tpg>t*r@?ab_vX{)+suWg zE2hs)51YD7ImT}x0RN(K!q{$XFcui2jX{R549^zWxXOjJ`Y^di;2jE(*pHvRBpQT>g9 za19IBSXF-mo3J$vjcq{S*P;6BY1Sz@b*jIPt~jMcWLC>3^)@CYBjPtz_192QiUd;Z z7io2hlv=9#1vGDrcwGd^J&4O>d=0 zAo2bxx|$*hp{l=9FNU{~^VeAHJ5nVqQvM2HMo4^KiKoF_c~QMh^_OG(M~P$5*+s^9 zpr~aiYAS;R7#QpC+cMS@uKG(cSYpI6FYMRi)!^ypMx#~#VsfTQF>$JY5gVi8sAG+z znh{3!j8Xk1uvRR^qDhMJIvKC)2SB*-8p{{vTY~Cei29||mOMGuP^|hFU@2QlTTUsF z^n99>i24-K`84TQ01Bx;T`Epi{RLQ;lEo3w@or2+kk{cs2=}0YT2+5Ool2KhqON&- zPQ(_-$$F>i&!vhCDWyjB=b*lJ5yrxyvCz#@K_k z-f)@fPr*Xtrjvzoi9SO0J833UibO#js7{v=>C#eva2hii~s zYjW@=fTJ+do~HT}8NVS83~ueDb5e5z4Z$=4IWEXznu&xyU0I;3+tvh0m>W>WM=u+3hgIDqrWZblGSacH=w zUiI7bmEr3}YSqaCn~YW($dRHk;KLZj5;wD3r`};VDJQT-t>HB3`CE^yG5 zTxlWl3&v7cPgAc-(d5pPl98332J}H0sDq;8&)M8n}*7qxNpN?e<$m& z>mXK(t@KoZBN`b02usqC$x=hQria zC{+U3LU$BOBH|2TB$v{qTflD~Fv?K|EO~=KEhpzbpmvG^Mv`xU4v9iKVs8fbyPl*Y K$nl~mWc?o;Nt>bo delta 377754 zcmb5XcYIV;^FMyKB-tc)@7<8z$R?qe&_O~8HS}H+YJdRIkc1S9BJGCWK^R0tKm|oW z5G6`Su{otZOd&N*}Dv^iy$U)pF|zJH@> zYq-a|lH}QLn>_(Q+=!=7&e}i1@~U~Ek*Pc6k!Pdd_b%|+?6cE1%-7#n_Vw_o_4&uA z!sid48$Lh#eB*P~=Yt)~N4MJ1)@HVNpHMrg-PNW$&Wt`}^nUf!$0K(csKPX4@Qzo; zeB_ng(cUj@PTHx3V>@~*GneLX50@nK>)MZg_;_gNV(=-;Kh+8!qjq*UJ|+3vrb&`V zkNh{LN|Iq+{?<4UgYvfp0^5?mc^E#~`CEG7b1{G8bV)Kc&EJ%aPwV^*{Xo2&zp(+Z zPWkHx0(&ZdgBe(h{B@myHJFpX-T*Wve=SgB_x!cFJGv*2mCb)?=awOrYufplJN70w znf9sn!D8T7wGSfj`AmDi8$O?FS2FPVQoCZu=PT{K0r-5Qy_=2Cx7xd*_re16t0a!Iyo7j5_))Gl<}5j`o#{IT}o&{Ml7tu`#nUjsJN{roixkg3@G z)vfVqp1&HH>2Ch2ScsUBzbY5RF8TRL+SoZie>Ogi@--Qs$MUsN_{8O}^n&;``71}@ zlb^rB7sOWiD>&@i{N(}oMCUJ`0%2yY7P&L*)E*|{^R~9E)&ta4T5TWjbk(X+a>E&| zrZ1BJORLJm=TEJ=J3jZc%1nIz)~edzQ>j&Y;`5JI2|bvqwFitywP?7a{Wb=y?X_RH-n_J5S-%~$8###i zP%EAcmY206n2tF^yMf|L-)m0R$T+PK@g%3_Xaekr=0rTx1MNE7S~ue`24N?xDcP&+D~)vIh_C9jzQC+muWw+sh`xo=Ll`J?`Gn2O8XYZZGKbxW(Yo~ zwXZq#0_`idy|dbvY52UYeF=*CdUO<#24n9Uo>kG@9R`lgH&CttN9#O{M{VM*NxZXU3lg{yg#Lg+B}ayz%E#P?PCv zKC#U3k+j;7E~(|}b@dbV9rYD;m%2(#SI4OFYK-cw+)_a<81FW z#!By=-l3MemTxU@S$0|$SjJnrSi-z&yb8UpcpdiIU`+HHV*JTV_AK$d>iLf6%bwdj zmwG<#Il;55XShd=N1?~N9xr?38xDKS^yupm<6$%x8`heym=BrPnA6O|4C&?}?aV=@ zN|V#{siEBTj_I)J8PiHrhT&&ZvT1;+gUN2P8a^^s8gClEHNI!uYv^yxGmbDeGjd(H z|AQ8rnkXf(b!2pEjzNAt+}zI3)HicpR(fh~sy#b%VU9gBBYiQ4JxiO46T*BL+-)~^ z^D|NJF@uBqF;0-{VX~RS^|&e7si_%;=2zSav$GAMPc<+{=^U9EsTsK(bB|X`sh?3~ zfaZVQJBCjFmSCr8Hxuk0EaD?t@kc_i8PJE+`c^^+O}~{8EJEI=`SqMEdl|L+BO%Cx z!KGC5hl@3o@g@G|Xt!kJQ!}K}8cMp65Mz?6XVX#uL6UR(e`O9#)w_xlf~oLELL?Yd zfpmp zl5@)={i3i^=>xj`OTuH2JA;8xO87M)3UW77%C8AsO;YK7dj8jhMhH)#D*|wCqT9bF zG`2{k|1>mrMS}BV;)5vew}ifCuO}os-T5scfNVbv_b^H4Kc#KZq}h9hi*AXFi$kJU zOXIyF zm)@mrHxuTWy^l(b>C2l55vV2U{3oK8yyiuyp8E5rF_cp`g(N90(V3{|mScs~gLIEX0<~r(M zB4qwW3riAOA-TzPNC3{Y^leE(>t#~upNcuu&xnRSFEb-&VOFjRl*fP1CPoOdZI5qMsPlyhX zN=xhWl9Dki9(l<;-Bvc(yr9RGhQB4U^pfpHrGG(-Uh+)?weBMan{y1-0}O?jq;eAt z>?8kel4{Z^p|9M+Bo*$als>XQEVJB5T3;EpSn~wE2_Ql$q!4pUKU2T7oUHVe#r83I z^X8>wFGeku8z`Zl98nO~Pkz^c2#=GqzuX?ec2S!|Iha}|$`KZ+T#7VzLF4Q-J|U21 zCCYY-RFmdLIv_}eI~#(_q;okEWvH&~AsGkA9U*vbLDvEDlLoqzGO~~+43bsuFDjoU z#~`F~VUUcTt7bN19W7GfcF}cF%7i4enX+nXH&}+X)TA=tPdS6-P~>nMZ5b>FBD{(Y z4`v0_%%X1uP`H&0Lu8IxNg+doB4*Mc0Tgbb6a;bNWe;e_5H4%Y4Ejg_g`25nh#X>( z%I-Hd4?uZ~(uPG+{7|_W%A4XwS_2Ytu!(vOm1BHZ)<3#7zK9+dNPi6#3YzXlYCBAZ z5fpBuHUs5w)KJ+y${r^2JdIue5GECF2r@T)R6~i`ne({+FS|>{!$b+DQowLI&Pys> z&s9l-hRems`V?w2g7sUtj+PFTLs;}*ba{jvUhw<~c~&nrrWXvQ68UVEha2UOD0!>g z#OOP}VC7bMsDbRg<>(#9GQ(*9b~%WRzw!>nY?q%hNsdUSbudXKYe?N8hfvve8J%in z1!J8pk|QF*+yQmH;@w{UG<}C0wM;5m9cXUsXX-s`mVHcWdg{#F)LGei2FqvvLq$Wq zUHLy$HiucFxe5vWIc}93j#wp4-EijL7Jw9u%s-lHcZdv@Q`9qDIgW4|{EXZj1z1H3 zo{=%;RF={60&s-Um1pF}2+F6DXJmBzm8ImjlL1F4b>1n*B1ogjJGss(OK2H@X_6yE zbQPS~$dt5f^e(>ke^WA~l9i%YWS-%fxm<#e-3eUqd+r1-!}JJqCz#r{yTL&euuG1# zNR_vBlHX=IfQIdoF@idRY1A$`l-BOzJe91V*LJZ{RNkU%0&oP8m1K0+CCe#+*sv=9 zC`c!Hks(ZS1PaUIObts-$*>Pi%Sc7SCCjLGx7-ArH>v5fa+46r5fEUG)hlpVO7@(z zj2vcLN~zDvZNc_C?G}K;pH4n22XYfCd76HGR^E%i-za~NY)4`Z>UDy2o?xCOt^(de z0l(QJ3ixY1DS)ici30kO-*a+kH;(X>yNFcQV&%UmYza;NMM12}t)x9Cs`(c>0w7p& z*u->-%RMw@21aF;{UrVRoT%|)^4Tk6I^|HsbgG_U-;IHt6G==c39i0Ypme+G7|a$v^mfldZ&lQt`d`?Qj0sp0^-l+O=vi>)#;hUuFlj^u-KNJHk> z?Q8Z&!%k1nS(q6t12zFh|5Rn5X$R#Xo8)L+M`d=RRR_85t0X!K0CnF=ulw}0IT`aX zvWsMQ(eDR^!9OJ1i^AYr>IR=aCo?-OckVp9VB1NLQnrM@KUw2F2Ch>#pjU3I!3C1Yl)eMDAn8fHYyx{VAk%Ms|V4VH%tLWw0UbsB;z zchd5g=MG8~Pm-61)IhqIC`uF3dO zIfzytlA~cZ_uWYEgM}bY)Wt%P>*)5Yq7wh4kRuE@8dCow za?1p%WNm%AV>9i;Qx~$bfBG*P_d}llMdJ#{qRU6*V58+n{ssgyn}>WyY9QJ_#Pwg4 zmXn(%Dy%?#O}=4(!%xa*3$LqXwsdbg_J-V~z2xZRGSd1`9(sEG4-txaAsl0}kqpOV ze{VFLhOQyHRj)vcRAqS-XofYeqUxh^7>eAH0bOnT=;krGSwE@DOCMK}p}v_|{$gf~ z82S2;?M7rX?(jcUuA=8@%W(`>^Nw@hUggPHB+UnjS5%JnI>?NB>E>~+sVWchdtDCb zRbMREGKSgP{Wp;#KIexeI`kpsBfVKp<~#QQK2& zPE`$QiU1sg>A)$>T%SM1Q}>cLsr(e$!sn;t%V3J6sc)j0z51pcf$A7UAH6B&U8ks4 zP^uy*@+}cGkh;Ict*7J-n*5d=woIxD*E^VuIq9jWpl9_Sg)vs!fJZ1>%m_CWc|57Y z31aM>F=yI>lx%1Z{%tr#TsYfbm^%Zc?{;Tk`G!Qg_ZHW0$q5QMExPhh>M8(7e@Z?r zf?lU3r@0@h3ZWMOG?g6v^pQIwC4F&DS`O!I=)Wn*+;RF%j}=Vb1svVcms%BYpHp&- zwiU<`lwQDHbX5>zJrUlAPBOWyK#uJ%l^oUcJ})y5T|WxfQqQ}NbKwHr8Bn+#?hIVG z-ZcJgQGnNI(c5xFAE_!ptUP-Q8Hll6pNa~UBlL2^xljY$aTMtYefKsmHmdx|_Z78J@0I`7zcHQG3vGCck%vn@-7LDmfz$ zM7WKCXqtFdZVIOEi)VQ{Tyls$JIhv7rBW#XbgkX=9HwW@O^N3m_hp>y=UAUr z3ZrYt1IhFPV-Iiel;5#hgoy#9g7y~6O=w;*PvfeR7#j_aRdlCV9s@DuwC@+W zDP{b^LaQb+HWuOe6#c8*j3R#(X_e8iU*$dspTIyvI`J!yZ4Qkx8N2(dSb~&Njwwj^T|Q<2|2RemL*5GN{)gPi zB9+{ZHYcF_Z+EkIC>&2rsv28Q3a5|$VC_4WQ|TXK5pj!bw`BP0s>U!7O0#aU!8?}G zrr+f-ZKG3MTocLFHAcS}^pX!walWh^D-wj3pNb(6;57L%`0^fZ8FlH+MHC~_^# z$wm_tgZA&TInd9@G_=RrRv;!uxG|2b4??^8x;}{OZAm@G{pxRGR@i4yUx-K*^FP2W zVMJX31T6ciE`$Xcd#Z;(CmQ6w`$gp{=3xD*&{^Mfwy1lLGtLv|N2%aD(inf@=s3 z0MK4?EPTYp3pg=^T9*m7fixZfsx;S)jh7gL&7t?A3sSSu&X9#EdM~QuoQnbO z4A8A>HLNqRZgSjXa0ah8fD7E%8*|>=0mu?do$OClWwH&1nn+5yP+7LFjCwAPd5s2@ zi!q@;WdOjmeZD?z&&$o6my(+{lbL>|L*=6D>PKG#uu6_BAK%;3CBu4?@7D!B74kJh z1Ickf43&M-VV{Up>Pz?U$Pw+Os$4My^hwJ~&&)+>?u!moN4YTj-EfZQLy3Qiu`h?x z00c^o7sN={CoLm$UK&<_;PIw?e~NB7o6ZC9mmK?CQZjT0U8#jibdLGt`30YJ(3ijpH8dvBN(*Hx(}(O<%%GU)<Vr`9KkI|I;Ct#ZmSLtIf6F1Qq^fy(jMUr|#JHpL0O1(V z)?*w4Zlu43qSEOl0PrI0))keSospTBp2j>z*Ye}^#31_nZ(fm9J>f>`aF ziROb#sMny^SnBLdIBXVXF4r|DP%hKsZo$Z7xmz&ja+e#5EE{xheDj05Z4EmAQ;r3)5!h&W*P-+h5eBN~mx$r3=8ZmJU?OAz@O< zpF!~Gi1F;vOao>yp9-twK$}!G3F{4OeR#qBD!Grr%ympXYvdq|vxjIxjr=XP2yE1* zRxD-a>$|0lZv~AzP&?9YqYWY$@!LdJ*eo~l|% zT?OEHk+#(c|8S|5Ha?WYhDuc!8sMHlH<$4Q60EH2^fI2{6c0W^S)g3UE5`2)b%FW- zo>%baLs=ck&gNsLX_$|Vv`#V@h84^jWi2r*!$6;xmNOTd9NbiPiCvF6N>*;$aNY7; zES&Va|Dy2J^y7b1ke^n%uJT6aLFupQ+5y5Tpbhd&0~n--S?TjJRv&2RGF=;E4ectG zwseIL!2VL^5m(d!yt`EOOnnfdhSmphrY=$3SSz+2N?Xw2u~uH(?VyDMa9pI9##%8$ zD{W3+jkWS(b~{xGz;S^Zjk97hUfPU?kF)ahdmGIYfa5%E9B0L9uCyr~9cK;eDOGLN zb&S323?v_@>zFZ4|J);#HFCubg*uv$dAt?V{HiU~MgWeplsw+rJVh#PtoL!*sVPrz zr~Z=OrwNpcyxA=nsrtJGbFydLa8CDKcN_^fqF=@fZEPaH2@E*ip`H_jHexA#f;A*w zs@kY)HM`FMB;coO6$p!eyB=fVmmXmd9YYr;SYJY!Hc;wBE4g6$=Vuw$##8YxV&s^5Y11r@?f#fjdVhg9B=7^h2SbrvSM;v z8btxgRyez>*3tk0INqe`$w+fcGS^;dLpq*pg|Dn?4Sg;E$0@2vwnjCPN+Wf{&RisV zP-uFuZnQ1}>v}bHnq=kG>>D(3k`=4j(g<2INyuA8&kMkDk}gcLVjf-^PKA?%#pKgN z0XR-j!^y&8!l>tDp;=AWY-a9UXx2;D9uU^->-89Gw%`#4&4$v}$wKr>dR+jH z8XG;6t-MTK!9Wmoox+TcV>EG!6}v&D!L)gbFtp|LjsP4->6a;1?6Z^xk!`9q1YQXY zjobh;d6LxDNjReT>D>&VST8as4z7APn2wB8y7juZ@T!JNRWZa9mF69v1| zx-^#V?{B6i)2vwKRV|@m)3`5iyh016i7uc4?Vl#}gEfiJPx>q*A-QyrK8q7LT#vE% zx;jkf6;vr&j_9uQ#B_hF6}|0DgO8-%z=@)@>f`EYoF|f$pOiP0^~!8zuwsKh{u<5> zow4q-ZnQ444z-5Kx8!A?$uG(2@?bf@_fOwFzKOmezDA!C9CWTTX_a~ z-1qp%}MjMYOMVOmu&gm3$-oH8GO{3xG{hI=qN{i0>#{!r_`_B7Ex6_=H zVFAI3Y1ug<$M`hRoReUJq0kS8SS|*C<1}Y7HWfRO;kOO}bmaA>-+g#Z7z?#AZ1Zd9DkLXyD==69<7$qbWtw{1G=Zd623o3IYC$Vc~ zQcxTUI6^NV%d3lK)11R~RivluveM&YH0LndchNr#Vk*VK)iE0coh`pTqGoSJkFBKx-Za432p_1qTUG*ojAKno4ztvZon`V7sPXioD> zqsxCyjiaO6;@gF5&i<|(@LCwGsqyVKXFn`Ix>CyfBZEoZ9v{*{bM_SqO`VaQC)RU` zE(qo7Bg&OBFO8kXiQ)@0=uMe_B?eOF_V|FtnzNU%>Xf-C`P@`tr}eO1b0*-#KvO!N zpA->;s_Q9IN|~9PnaxYSL>Giy^$@x0T`)3)YPZJ+LqXlmZT#9$+^VETkD+F|iJH;* z>m!05|A<~MFutwk?22O^U1-G{BLivEj`$GBd(7P0uQh$PDk;X&U2}F3248qr4X5DM zF!&~#v$J66wK^%rjEd?+-Jgk%ZLT>xa@FWLwGT~QfMWx$eCrr0uY;((3#*gDxRJD{ zL(jx>BWXvQKZ26~cqTp|MRT^*RmnxK6M*cuab-U>*QE~zp!hf!H&DTiFQ~2Ssd`yc zbK}v_Tj7{tJ2F(O0d!?eQUl9K&DqjC!EXXpJeb;;yw)Z)HILPtE$G_L_;IMO=C1Oj z=GxO;d(J3bJ%+kyMuq<*hEdk8_)rw1DQ(;p&;3#pI=(Bu6M)8)bw4qHDtE>E18YP! ziVuZ?V?`tB9hKlu@2pD-G^2^f&}52l1Ey%&O!3X3O}ns2PR~^?MRP_8O9o9Rp&w{S zg^-EfBvP>V9y+E!!uaE(IU~$|etwDVKxk*toZ)8GPfY~UNOOi!i{0^!k(E%<`5suS zhET?C(QHC!<8D!$V0vYDd^EBYM4y5gKp_3C0|6BAY&^G3e-XWC=&%r)`fPkSnn(k# zr~Zp_vs33Gmo5PH=T}FEW$JVQXs$Loiii-d(#OxnM?$6|WUknvhLL4Yd}yTRv~t7g zzbFgK{v7O^a`Za*be7f2-o>aED}SpWs7KUI>U_1gaz*u%56KH;oK{j!%F(jwTkU(x z_b26m@5jDpeP8q4>$_3e=DUP?Znef3eI6^AvDHcjWAoRjYMXVVF?0s4+io3&asL5b z-)N* zDLEU4qBAh*?ATwNl~%X2UAmU86VL6d?ocIw29h&UtaAh}%UnZEc8k(g&;S5XK!mGw z@K^~KU+HREyqo9pRq)XRz=7Ft;V$T#mOV2sU3YMnuA=XDTN8Rnfu=gL>&WH_;RbLc zVjkw**89M}IgypCU()Djts~6d-{WxS^zBw`U!Q-S&OK|5Fz>~AP>Q}k%pd1Hzo6(n z(6z@Nq3bfng7r;`x-{%ub2*s&p@ogyBPt-D=I*iD2TN71BZ97+W45@$=Mwgj>!Na` zP_fFWqae3(w6E&M!&=kmt38iOo1XS$s;jie>Pzb)a%o%3-?~a$M?`5qqv6k4Bl=5K zC1Qrm>G7Up+o#10SVuWKA#OM)z0$=#Gc`LCM;yh3nqGg-ik=1iEq(T!HBRi&?%Hd0 zZQC~9Yh8-<+8=S|B;L$;-rA%K(!o6r=_S}qnsDXX`{-?gr|gv>uqNYwhak!}n*McY zAa6LMcV&>?{W_Evaa*bA>(E$_`t})F@Z9s(1qSNM+t>LDSs&u@>yB-eZn`%x0|okr_|@X&jz1)K4W~Me7w9bd++dm!h3+X zzvXkwi6D;j4Ca<5pj(IKi8s^p5%i#H~=V8yqp0OU6J)Xvqd4F@U`DJsexraH{ z>|rV}tuhTUH8uGfZyUciUN*jFOfq^K{xMuP9BX6PVOVTPF$^&@#esnzrPnaW{?2^C zyvv+x9&PSus>KX@w`qo{y(!Gt0{1hhb7e?N`l%wshjN=G1<{Jikcd#t(TK-`ewm9g z$npPn%@HeR5j``LB8E2595Fl$_RGx0={@G)Z-C~A=B^l+-VwQgAkAUtIS0_zvr>5a zSqC8`iW*jhV5;G0C`PU?k17E)vMMC7gXV~IMG}@TA_+**91(iva^ZY~DEm;&5pEvi zH-=93NQfn6R8nKhaLo~B9_KfXQjRE%nB+-mqmt|ck@HYJ=krpqJ%Z@`1vNyc&YF|j zo~it`X^vnX`UK`8Mre*89Da+XqESg914A@NAWxF}rD3ZA2jSpmuLq&A0M;1J(&lET z&B)`n-1u>x^+ zNsOfC4@2yrc$riEQYm^|QY(rYmlS6ntvNjD_`{IVSi(3wsC<7cmM{)8MII1804{DDC=uVY2#xXHh+T@)>fogxnJ^#Rk&xmtsS3YbjIMV_MG4Y)qU4tAN6^>ta!f znw^=Mk--OAxt3jUoOXR4j_|~yKCh<>6Q3W{(w{Ptv4V-vu0J7+X-hI{zJ+%EanfEE zDoUf1FUN)>e6Fzcv{@LC`{Dl;AkFby5$(4knntx5HzM_Q zzZz>XoUX7w*BgD`hXwoEDd(|&T-}zYc2MBza!#gg9Tc26Ed78AJ19YPxr2gUvbqgp z?J<#=6oy*DR`jQ1F`$*cPi;GLwCXqp0%=i41?SwI$#kM4;vN-P=@t68qXKtib!)mS z04zT3ofP&Gy+_+RDGllIP71sv)vXxA7P)gGWia{gP6`e>l)g(5ofRBftHz4Evl2!* zofVv1bWYIEmls`yTkj-D;Ji%VbXG8ds%}9w0>C=8Nf(7(u9xWYV@g25tS-teL&5KN zMocr%v3SJ~yiMqGyn>x?=V&_7MG3Mr{0ww1teP9*0Da66R(zBG^ zP2{=}JqsXJa*ovJXgW``#?5)eJEMtU~=djLKk}|I6YSSmVRjTg`4n&-sz!y1u=U8)+5GD zb9Z>Srds=BCVN}nDObriver=uyuCvq7E^a}5vyx%iT@ILCj%X^u3 zn)hf^FYj*NjlC7ieanxgXv-PPUdz*#X_f&dZ%Z5a$Rw{nyuLU7WB$wQO|OGq+q_m7 z*LltNn&CCttFKpc^V?pk=RMDBp6_`cH6QTY>AB2vuIFga-p1cN+j`nPRgZ@rx6B(o zzQyF=D12#s^UaGqvOK1E4D#sg5nya*e8v2gdA#bh?oeJ-KT_XNpTkYURHL8aj^QiA z8<-$0GE6b_!9>OFA1&XY@O3lE`Ii9c%~1*tnU_t`9pdf2#fED6CJQvVaif{! z{8RUlgNtvU$d$Bzj1og9CUaF|u9!?GrznAq7))|mE{Kcbt<1oN`f;Mf7jJy(N6gltStK>5>k9ZFE_!&By^Vj&Ou9r|JdTR*@Gx-td&)a&c1zg>degSS$w5R6ju~tlPJ$LH0kG$xrE~&9d>oG(nj?A`pg=;oG4um z{Mk(WM;yc#GIQ*?nYk%AlMeD-eLciU@g+uklGwH9kiTil7$rLTUy9+Hy!A-8j5;_k zSk{jbt?ml>j#YRCS@GZb!sU=;N**iv%lAkF5F$Ct|0kzlOQP?_iXP)#`Ue1djIw`K z7g#1z{5S<0KGm0L4uCMpS^9qz4~!G&-Em^XxI}jWU;$Y2e-{|M<7x7EG5TDjrvUg% z&fD&01&(oaX1rp5Osc-%x;`b0BOZ6bo!`;}o8(V5g}1ZN_*w`^9DY z;22JCCJUt((C-3p7IS0Z{<&-z4WA^&vD1_X0G4v&zncfRhSHTuLc&}0j{uxSqQM9e zLul$`WpudJUz}0bTM15^=$y>l|g1M1!Q(QB8(?tO|?{L$OH0LawmwbA4YW;EAq$ye8_Y3-6PiPJ^F>?! zf*P$7ZMj-+%X!)G0_WOs&_7R{Q!ATIPplH!|D1LMKufLC>(<4|Ba3KPsRh?oDIE=- zQuSxC=Dy@yr9@JPHQZl1E2(U?!gsx;vRSlZjc6HH83?5RtPxY-2Xtw(62v#~W|Cp8 zn7)3>Kp0J2%bkexK1Bf&B4$w0S|y6!S*r{;G@{FEpm%#L~7EnBcN(+PDIfXbjZT ze7=(e9kcw;Bs#cWnP`-AsCvDUh^qaV-X|p!5q614h5Rc{6Zdj1Q1iZZsNc?Ezj-l*G{0*OicP zrmhn6*?wHek=ZEaBDS8&e8JEax+)2`G(#64MpkxYu!~Q)+zg?o#n@Muggw)BttZD2 z+KxIORNz9c*-7gUDsWsDUKWnaei%!}Wa;@SZ%OYSWIL#NhW-E$EEQf7cEC&{Q?t`> z{T!EiTTr7H75G4Fw$mU05Otwml(?tBOwDM;i%KsrZDSx3OKJtDpbO8F;i%FOW?bHs zroV&pNESLNtVKB+uZ zQI<&lrha)@>1i`DHNd3V`bojT*A%OIo|4*ag&@#MD<4ext%C#Md>3$tQYb54SkUVcOhBmA;V8}SoHUHTE-JzgA z+Hv}X(#C|WeNXLAabHnn5`9Jg1sEAIX7IL{R6dX9ol^Y zt_z?Lhh*PkpHF!jwR%g$|B6Nlpsh1tiVhj0J3o;eqRtw_JoT*tzy znMGdj2t&F`Z2^Qxg%8B|(Vv&YxEY{NQOajh#ydQ{s`-?j1rRC~-WTQrHe5=tKmA)i zgMNBP*#*8&DCZ1MlM4T#FA9_Z?$}f4&KcD7muE!B{xM^CFsAUH=-44BH5*IboV@g0 z`=E^6Oi{bjsoz;qasQzw08Ez(@9H)nxLrGo<pDg;U{^D_s`PW1*#R%u+{rVte<#>G%=R`lK&WxOqNfdQnBy)v&0YL9x;Ywy! zv!TreOEP7j7h}zP^a22kHRWQgfe3r%Y`le#lB2h@B#OA8giw_(5I)WeN@op0+xO4n!UI?9^Bi^tn0;Z5K6g!&%xAdg*InXTQ=X03xI!Ki$q2;W$@)BX~-0$D{U6MbrL9H0@v9 zNYg<=7iOb}KPwSYkcw+OIB|!2w-|WmZPKe72zRqL=;Aj@s4eu}dMciCYT-*azfo`u zvZk0Kzh$6ErKoEP9(a<<7t_3Nc}%OhLHh(yq|oQz@@lnw5#9V&SW6Lkf5+BRWYw)@ z(aiL`S*cvWh1BgkQNTi)0RWvcE{)^Wr~ZrJIGQEgN8nmO&wnR+JSSZO5GWP->Rrg9 z6n^na7(pK0{Z3hqd^l*)_aZSLS7JCzB%XLE&!r>ZD|?1YHP`jFw+II)PzfLFjg2v` z1Mf#D=P*a-#m?7a)Ti#o>(3Zh=QY~;gMy9uB8wi0=^QDW&ix>U>YwRn03lM5mtM0A zQuW*S<@2$k;_?1REG=97s5F6f{p3c<0SRjMq_`jTWmY+^QU56F;79WNNq1ou;g;}E z3KrDmnFXyt!#+mM57hr>rCA%P$gDS&1u0pX**U z7B}i#T;pLC2LCsab+UqvJ9t4|bBlp++`4Z6BkjA6sdjUx(wnw8ln7ewRH7LQE4b`b zdbRcSd0yIP=xFd+<1?S|p4&AA2UIrWfXXrP&p*MvXz!bn&6Q@b+#yG_9E=xQBL7boM6SfcNw^N|x^#^t*H~dnE*uqK z-OZf=8y6++3{Zh{jyr+#^QE{%u8WAbk4>fA7mswbFK9{=zVA@om6ig4OET3hMXu}8&*?-Hz86#d7<~@_ zi{x3NZRui~<%s^e^s_LW=`zx#3>>p+*;K~vRdp8{)ReDF@R`k~{J2o*RodH>FGp5) zW&o?{rg9YA;WHv}uF^yYn(9vom3~TXoALV{)twl?Zdfxp91hMDH$8JrjKTC&yg^a= z37u#r1g%PCyg|Lkgk z+r8g4=exeu?Sb&2qpA9#hN1x-A``*$k!TWn@$F+5XQlGsSKaP^s9b+jtdB{f;1Xl= z(Rn$Q4+;B)-6*A{9OBJ!`|u)z)RufJ#+kwNP@2+`>!tLEf~76xGX`!k@vZqOi|XD4 zN(gDKIUHwjhqrcJPx+oMw-##a#Xul=#|gEiyQz&GML z7vY^x(Ccxcy1u1P5Z+L#?kOr)FNF}%4`&K-T@e;rOfR%RZacT(3r3~i(B?L{4+B#l zPh~A|!*xR&TrLI_Lhk|s$JgA(1jo43cGb|9ueYo-TJV{7>DsI@E7R#I7Iq(@|Qty)^+84x+ zR@)c~CZ3dA8EEHN6{c8nnof;X`Bp;|-59G55~r|!6Wr_}DrumDsG7@&KP;oTOsv?HEgulbOBb0`-`zHaA)d`P)QPkgS8O;RSSI zvI;LuRZ}V!fMX0Vi2C1(SnLA>6Oxge!ZgQ&!K)+;TUs`dcyNIExFZ5b$)z%#tVJ6}L>By!s~+T3{-Vtb*nW$m=<))!9k|vt!GRAWMK6S? zkcDb<%qISHBh3K`>!%niUrn2zLcPs>O8wna zswu}_Ic<9ig3_0;Hj2V2YYFV=)g@{)m{-x&C2U4DWprNvMPU^CH0QS*ZwEdNqn`OR z+j31QV`vXWp>*Lw>Ux8UPHLyAy`+|?KdA4k zCkq-ZS7Qx^sDh3w)LVvtK4M9(A4%@RXTYTLm#AXfkO;c0sUhrttHqh4Z9~v$YpjE! zt{f0b=LJ^&A~`g!?OK_EP->sAVpJ@8Odl1eQ+yz0fP|bLq^74d=@)zi*Ror4~E%Z3q-QdQL{Db5tPbI->wnW-xga6Fv{??Y8VWB zj~(ZrF~#Pi+2hu#u@{`0Bfd{#w7G&S3;t7rNXK3U`wHJbF7>J}38%185(|pGM+Q^+n`3?%(#8z2TP2B`g z)Ql!?685&8mg+%O^nxDLlrHH(I3Bf0^fi^_y_tccCe(Jb%08#9G;y=a&btS+LI6dL z>BwfaDRhaKZCRH%QyxNhHnT2k?z@pXZV~xwL`$|nmy3XfN#(c&jmHbHxOJU6M@1_< z0j0OLsF=JI#TJxoQ3Gu}k$BE<+fd-MU;W%bTlaeeP{OlAq6_4M>RafP93Rk?7uDtk zpNz7uG-z)4a3FOmsL#m96t(fcFmRc#gkoXBQhTn1ME@8hJ)h=@;j(D#w4J$ z56OqsRt4W5QhzkymO1X3TRSOJ8=lK2+%CdWt^A(k^R38yns{4)^ zgD7pqEo#6V;k!D7*?UpLSH%$gDs=4^FU&I%uDfdiFBvdMiK zk^gIKppLJo_iNmxmUgFkuW=__^)hV*5GOgl)Rz|h5?$v{rP6MCy1Z$cc}7n`?3z}+ zM2^=)x?j{$Io)_NA7!hldXZWKz~%AJ#qzIj-`;hDF|&20Cv>)h^bCM*lH)U-EpAZU zu+-eSnZmA#RX;hVYSFX&u7RJ5$;*Q5`SPdH{Io@Ds79>a$op2Er_zsOA`K?}uYzs1_|)blvUEbU0sj;q-7sCr%$1Tn=96Oz@>t<(`X?f;1U*HKt{2P!x&1n;G50C2hg zBQZpQN53J)OzkP)b)oR*s0RQj{6nEhW`YkxzwacKwxg$B=Q^+2Q*iiobxPZ1Y0@o8 z-HxZ$$EuI13LY*jR6bQsD=YD6VTkpX^^$e7b)vPSRmNelbMhW}Hn!G-@PPUczQ=uc z`9A48)pxLO6WonFgO}5n_)PWb<z3DdUMIX(dp(it)!8e=%jo%o=RVJ=o;^K7JdGX~JYK>T$vz$dcq;uT z^T*~R=I!Qmb9Zxq=}(ix^sea@(=OAKrZ|($c*Z!?Xf_lY&KUL>78qvZeqz|r2tiPfa zCy8)8n*$vGgECQ2dXGUH9ftp9t#|_8iX7IPqx9}?*NVr}wOg3EXvO1p!3BZuShC+% zahIof3?GE1eT|bNEd8|N(dHq3L#XIL?759Tx4Lo?@OWMBUKYdlI#)fOf{rK!K$KrQ7MRWiWT5(^pm8p^bT5%s%5g0^Z zBdxeM^(s>vBe%Wu-15UQLo;VS(LyUupeM`FC27Sy>6J1J8d`A=`m9Xt8m$#~=Yz*! zbM3{{LA|u%Zu(K^xBMdMLG$FOum)OjJRf8iEbt@h-x#eJ&X967wy9S97#}zunwc`o zJ{wO5!+#H+dZfEntl!D=d&e)F4!1~-v~<>rJL@;G-th~gTP>19%uTf7PBb+-78f9k zJBrlsf-7(C@Jp^a@nKqV2ig}Mi=*nr?de=JpTsV1M}^URX1us9$uY6GC|leH?_xBk z+Lp-;=b{?oL^bFS7KwL@P!e&|juAYV&a&}^>{e_LjM>El9D0ZjhiJtuMOAaCzUe9$ z8EmE%x1dWgvCWZmb8(#f&cIQ)N!lveFBwvs)k_ub50_K{Lu%7{sZ4PTL|BvhFnxPe zq{tu)sWD~5#+tc15pJLdKJur)0zYMiwX~?rHx{_?S+Ypk(c6m^Hwk9yUn!!<~a-Go5KFEZszorm-Cm&nT`|UtZWZfLb*ZHEf{7W+JXcSVP1sXcimjrQLX1WM|t!zd(8}AUU{w1MS8Vy-4UuxYEQMr#9`z zQ@R>wv(s>BDn23FjVD=+R1uII5Ts}~77N2ckj~IVyRnF#Y0kO0v5+n_XQkd)Ae5T2 zI5SVk(SaE4MxH47*1+V3mdCXlxuTOcyn<`oBU;3Eu;7Pfq*cZtc*dnd^)?uW6g0S_ zb~Vt2Z9}5y@jum1FgZS~ucQnAQiBVYuTb|H=+D2!itZh1aF-YAwK3EmK%`VOT=?`7 z#V}pJZ!H#{Z`03rRXe?LmxuP+XvPvTNghTILH5A7UtU0i?g?pjS|Wg=q4fGa6?YZN zPt$+y@d~0gitYmlmx_jn!(Xn19=(=Z{uU+t!^`bjTsi;{DisYD{!bUD>(;SU{wBSq z^F`8k0w@|phWo0&r&N9lCzr_ZK=r5A_tnoJDuQb7tL+;~MFYj%2$v|{1+^z;<1iU# z{tX)bfM@-+;S2=R-Uq_PFo5tII?g;`0OE$FFr%O{>G;Z&(2#W)rPurAca6N`*U${68+r?oQ8h6 zz{SDke7!D@NCauLsmlXUE<%V~FcJuG3tq+v^m8My{GskR#23FdyZ zHLiSP4aQf#`&6rKv91nuBfS6;47WEKYSflgBe3$<@ZOS&MRASrf&?%&6-;n=Gr3`{ ziq}-ikI>j!VVnN6OaMg*bfi|ef?lQXYE^6=)i$8OhYS?;q_Gd#vseBKJ@Zh+@}r9a zDC$vg>!BKAw}eS#NRw3jpqbrfH6rpl3X8FE=HA*BV+-V`ohzc6Vwz^8lP@Mk(S{fs z9AmX>-ALC!0{@#-7-MTBA~bZJs*SaU(#TjFo|UX!<3`#ElBZO3D#n~Z?HbwqX}Ptp zg`00hBspVk>;qcOKoGTPWMd!D8x+^bCZ6`Hh@e@GZ0x34Me6|I%*aXIL6x04KQA?7 zCT}fPgwy3lHuw^2^Jzq5TL|rMY{R;v=mcGEY=iTtB8(i3S#YgJH30mjBK?$5B4!se z`6;rBP-@l0#@>pR*h6BV=s0a|VuNG3B7_b%vB4!#yMh)pwXsX$7`@!ohF>D7aG4f< zB4`>mLbFLX9f7jtE!Qni;IO=PZozDMc!CyB!ypfc&6fA3JB~aBJ&L{v()Gixf_)K7 zw=Z)GhxoORqAz0cuhINwHu%sg0%=<_8=M-oOX+O^6dfUFGaI}c6#?YcoGY{TY3e9| zqE{)Uxed$X3V+(72Q8sVP$J_Xkuf5bF%eKa& z$nuTl!-CUUw&@0|d9h?Q4M@$vlq=m%vDvl>$oTeePq@qu0NsbLJDS=gVrhPfW240{~1W@z|-Omv=(21Jl+Q#@{wD+q^ z9J&8&7_HB>!C_LnkB$kT=wtdK*9OmZMMwHOmwS`i=c#F)=vMwiz4B~$tt5{tqM`$B z&SQ(H-OE4}{hh~#QuGm>WUSi)TN6*IqCNT!+LmVvru_?SW?H#`yN}xE{!RT5RK)y{ z{1zgnbs_Uqw5#XIT8NmV1+{k1zo`T&VtznH9P>IbyHwFuxV;9X;8$hsqvf{|e%t{g!Fx*haR-cK#@#M5%=sl3nT`313uaUPv<`+L#|aP2 zfd1nl<_+O=0nBo!E&zgFtP5aC?=jNL1U8oSNnH@Piq@iy4CvPnqn^Q{Ka|E8qTMd3 z4`b^aPa%s%``JZ31W@!Y%~&kjPb*rxnA>RWPV93qP;{AoT5N+)v7#lJpXBbZ_8ICR zfTBw@<4GG_vlT69`;$W84k{2p(M7uUq!8Ggj8BQ6?bK8NMHgu3Q*47Fea#*W)`R-{^jb~}-(>4s`6^-ffr-kirCK5o=8M^Ycu>D5#=hNJ{ zYBy2jQqjuZp@BSh2x`U(Maj$zFy^6hK?~16PAYe^2v7n-20~PFw z24iCHjV^1_i(ljxZXks*pi6$n|;{dx9u`A!_?CU7z{rThf^YM_|nVl`K-PzgM z-Pzd&p}OKo?RWu&pp3VjqA7hc7qNm?FYxhYhyGVI$8}sdca`W5`h0;;2V}XN9xf1r zBbWYNfWZ-+Ee1yfjm#Dww~Pb6bWotL9HaLbx|}V9SNO4oK89rdV)^4-<5{1hG7VcF zA3+y?@xhtOvr>ja$p2SvdwVE+8ep8iETH1o>6Kr_6jwqYh=4tW9KQ;I_Zs>BCc3tm zdWwKOm@JRs1R) zJ?|4ptIi7{ahoB0wLK6vP(Zu=E+oZbO8?y_B)9kPKHsn!a*KQ}a_#H^6n)Xh7bWLt z=2~mthi8JUi#{-^e0H-2>O+CD`)gK~pz@E^6~7{SCN7P=0#El4J;MO^%#Et3jLcT< zRZ-|EyI&Q=;|R{O{}jD+odbci{!bs=EVlcGVr7Oq&hHPw;-YvVo&QsG)iv_?ivxCC z6a32uc1Ok8H1sdgm{)132-sDMzTm@VmBkC_>|Z{t@fUHxk3uhTpW3a|<&qB$rHbd% z&`YekJS(KR2&g){BBqYG)JYk*9l+I_M~5$od8>d(5Oz$O z%{v1u6i$=nZ=V1;;0`tZ+Xp@%+ELu!qBsYoA%Nn1DvO((D!ir^&!Me=NbIf?9-eYWUz6)#Zs6(8IfsTho>27Ua)&|MXS#G!S z)#2qr#Xvf9g&C`20F_+vX(Q|G5Q^w+&0K8ilOaJg&hFC()yUa&#V3N>{uW)d z`@{hA3WeqS;Kp+CP0bvBZ9Y`eq5i@6$U(XJ7b#)`Ur}Q^Rf&6kkN=3z&;4lF3lW0sB0-diPPWA}KD^hC%f3SbrK{=!5gsili!(FYPJh z!D64QjSNs}nsfm*E<&YTi$tXo8RAOKq4Xjyyx2i&i&!XC^yPq!E*AN~P{}^~xzER` zM9LV=NlFia=t)o|2xK+e6!~}ep!ZW+Nj(R#58l!Ph zXTOi_(_22XX^5qtA6s?Ur&H2xZpVtD9NUd+ zx%ReCsHkPJwtDJz3o`Q2ZC+4Sz$+N9u^0ubzgDl(q>A@KE{IitKukq zDgySusUXIJ!;g|!vh=WEZm&2(9Ynx>iAMLZV3IHCMJsz)xUJu#4@JNZYt0^(I(2m= zSm)zm#CSN|PMs8v*>$>hN>+*Bq4_S=?PJuTe*hiQcf*e}w- zo)!qbk{CMO(}LcqI7Bx^zKK^>=DEJ`BVK^3;3XJ1LE9erCn-*)CCFQP<=r=$D7nF3Sc6}_EY%1QN zG!d}>LW}xX)LIzTC7px{5ucKg0Znjvo)E4A;xF7oXZu(J`|0fGs_~piJ0FaX?TIAc z3#|-cP5?C!&r|_GCts+HV1Cig3lYJ|J5a}X3lF8YX_^Swf2Ni37C#o~CGEw`)h7!s z{bx@9R?JllaPDu><#>yK7oGh~6`E7D6P4?eH914*f|@5_0ixs^#nrJOel(QYB#6e? zMdL)k{u718S=h%yNn1LaV8NtT@h1IItgq-M^A3 zdYUNsa0`VdS$GosPE3M*(r~{^cpxunPRU7@&8XBHxi^w5LCxiU7=sHfjU`#?w>COR zd(bX!_Lynuu}QsHSai-Ey~r{h6Jv#>9nPnC_YI~;ukaYNHzDa2ODz`Uq(z<_J1CeY z=2&1Dq3v8I?LXWqE}eLSr9^rf0f(t*;5*d0NSvDXv6Bf&}qf%Y2&Mw>zLo4 zXeL)9m*BW*_Y!Vadwu$OiKTXeu6UgoFmV%b4HpcG4M~{(2?!ke>~VD@MnF(?B#(i5 z)gYI)mb$)X32&!+_DG1DIN0;|$K@fU3lyiql?YC%z3x|u;nZt#=`~At7)LzAn`N(C zu;FX3BQ|{F;CCr~95!96T4yyyF17Hs(*t@@1njkG9t{xzdo7x}%p%?jEnY#Fm*Jf3_%deSXXOmB)*C@58Qpd{%fsU3 z^wM&c)6eeW!m1G1;k0MD=-p*>T8k>9Vl66+Y%47Lk!mNMTw&n}%Z+X$5U8`a684dC zS(DS?8xQB{Y3yK1SGNO23GJy#-0DEH>!S z+cZTPekstKwKdfk0E-*#?T0u(=o2ip@Ing%+#gX@5Z7ZX4O?XiMD_-ngMgy5H`ls4 zeY!AmF5W`#tP+D0(=Gy`I(suQIIG!D2$@c=+?29c zTf)UuySaM2<6bKV^4;l| zeU>J*bS2ZpE@^@|*#bjXXq_rR?zc-6v7c299Qt+JFEos4G;+VF=3lf3foxsAQOpO( z0)ATfjKIhI90JWgwXzUUpb+hbla_!B`Ljkey3<@)2T*f|YEM*aM1s((;OfeSQ91aL(8%0UZubxWquk%Ja2 ziz@!$KrIS8#G^1D@1Y!mXS>M)Dw#~14+%#2osNq@zD#z+BmE?DJ1nBkQxg%$m#F_? z5jBx!9cG5A_>B&VK)#OF9tOXa9kv8Rf1DtMdIBsNGI7xft)zMLsYGx){YtIh75ZZZ zz4)%sAJb^wyP`9Gq3t4Ie?}+X6+APZF25_ZfOBMgj|29n)bu?|olsrLIBoExhzY4o z8!iC2h_f{HJr?x#C$!={OF*`+WUMxF@tiGJ3Xh9p`buDk$$zenM8_GbBhhd6$JHQr zn`R#>l7ih!Qa$uK-3Gan&Rk$VZ9d|*&%Dt**F4hP%iLVI2OxC-JzzoaQ2So|pQ z152o^Yrp`s%KSkz@_h@x{9N({o&3PkMAp^kUn}W9v|!r-);eJy3dwYW=6z@hr9mHB z>d3l!40K2I06O_0cT34}a(rlskacy*_z~-7`TfPbTxpfU75E%45L)78T^;_dMF&3; z{MC=%1H?ss;&T|8!~C+ljFoXf&LKam>cinYtfv@^P2cy3m%WvZ0BJ-T0vL=8T*Y>{hf>sMqH=v|L~!Ns*28DqHX-!dXRI~l_ZC_c zY&9kd?^8SrmwZ59eP(GS>wCVw@(0#JI-28eovw0u(=4H2g6OG ziD?<48t>7&$1Op!&Yw;n=Q%jPhsLi=$klw8?jN^=MCr6sEKbi);^qm|U_3vNJ_=6)d>up1ruLNwq3GH;Lfr7K@Bt67hI z34fGrHcL}<=G*4K%|Drsn-80J;MQEW^w`{6UT#)R4^97?&YDi*X@uRTji%S6C9&<5X>QxI%OmGUTJswy^LAlAi3WaEbs^2DYMwv3br&_EGm%% zC0`VaN`$$%1C)N(0xQ^j&F&UhChtaP?pplm@LfxotlQ53_UH1?(^1BTm9sQ0#jUAw z9#;EkLb(`LztMUi5YvT@ms{G)y1o1xK$d$Eru6G31}6i&{(vYW~3DOO^-R{fP z6#eKS*R!-O1wG>EH>v+45&a`geuU^ZABpHTbn+3iGF1IX_zJJbLMb^-K92!KKNfXt zO(~CA{O+K|k69k)pQ61$AoEsq`mv=$8>^@jKk&^@sGS%u#vIpOpt$B&z0%J~2*6_DT#VE%HvQLBn7CI_-I4`Ch6;B~LBBp3Vjv8)4`S zpR^V~FW#_5xVB`jvz!mo>^*hD3}&MvnXA7 zCKfed7TG3dVgVw7Lx?f~F?(pcGy+7CKDg|T8%)1Fv#jB(hRrK5d(5e@*w}F~G8~hZ zg|iw-w^hsm8jLJ2v#6(|6=-S>oI@bn*$89cv@b4!(`@m8@9qs!oKEj&SZBQ(%W2?cK=R zB-imO@jCDIvDY@Q1+vj=q*shr9WOV}>(VvPA3fjmTD`@e$0G|1zF(IcxmHxZk+h__}e1%L(Hc;{ao{vAHqK<*?D@`por~ z>))>5xNLAe=(^r@j_WAb1eXP_ZCoQ&MSScQJA+9NLRd-+G8{kq*Z~b z3dJ-Bk%~7JVSOkv!Kx2yVBiGgWXiNDQO!9)eq|2L`ljH`P07bziQt+rH@#1NObT|K z^8cwB!y-G5R+rzDkN=+&<^MsBTHK?xNlKuLE)PanbTU!F8yiUq_buhg3byX@OGIs06E1y;8tJ(W zzo7)Z-~!EWh_n7oF_c#8m58>wuf@_ytHX3$RBq$_T)nw}?mUO##6#$z$o?w|G>GhP zKlf>%c#(z~6ik*UX`Vr0Rs2@XZw0{%^qE0{4)P`4HYmJTaFait9oUr)ra>+o^##4| zBBE}H@hmWVl>QDN=is#8#arawixDbSlgqyBCRZxIx+ zTSr zaG*%L+#%MQcyP~tOo<)}>sk&Wjzr@m(n${m`d=>H_E30n0CQ?wb#}IrQ$8WDzO)MR ziN<-d7&yiNFU2rX3aJHx1WNQ$e5siici~42u)cGJWf_(brSbHM7kAKybkj?8&}Eiw zzSvGE?W4Wgd@iKb)0&Et2R1?CfP1zW}W|FRV1t>V(&$9xp2dA3^!uB7$T zyEHU-VIT00;hf<^!)AT4VV)ty(9_V+ZLQl8>AKr=w}EbLj5pj2(mCU=#!unjc$xl! zahmZZ_%?2AwCcZbedKC){lWF9>lXb!*BsZ$u7mM9ScHBlF1|QizIEB_vRXgYWv0tW zmpG}PG{;;Z9Wx){m2ovEhL`X;79rZ`gvQxj>T zK2+N4UFx0hect=H-qm{#F7V9o9^oA?yL-3wj`a4BZ(;hp==G)7KKRP~-D{557_Yuw zZM{O|&%N|`&E>3TuIEm9x94k~8J;hCM!VJa43Rc^Jo32ek^P6q_wojhT+F4LJ(haR zkQaH3_UPx)#iOxDusqen%l)bQE%$%if09SKe-2O3TiuttXUZX%V|%#=%B|dP%dXO& z(tA=)jakqs@-%U!9dJX4JwZcj!WKsQxLYDMoWLf;6dAAhY4@f2a)eN~q`+F$q;Q-Z z7(rq2V2X-9ic5ev8>lG_ok_yzQlb(Vz~rIYtit(;R0Ln`fB#h#j(c+0CKE*#!93_i{mABwD9ns=W zKCudP;aH5mg>j01v+A$n~SjOi|WI+SZrF-Vb!T zufp2}<^R`rqu>$LFi{zXG*ZLyv?38Rs@u;xBidPOZthE=ze^1#(uqVROHhszyd>O_ zUib9GPRr#)MVK3$SnEk5e^Kmp&$KY#N+GR@$n4@xN%y4L5H5FB+LV z8bk}CS-Ad*?H(nxrOx5{9D|~m3{A1;8e_GY;+2guE5mTA>N(Q2n1(?1{XObKWmxjt1}Vn_Q_<5QChX}Y{rWvXQSb3 zPE2{e8L=?BZPL}CK?TmNrd2(;udwghll#gcYkkGpz$HlPjI`95qL4|H)C;prR4*l1 z)}3bn7bzSVyLdI}f5sPTJ&}&}V%GVM@_X^5wS!AKQ6 zCT-o2McRKv1zOVW?0<0FYft`z<1QOZ{o)iWwT@E)WgVRN#R;Z=#zS4qzvJmhoC34T zbD9Rqp9^gv(tJwSMEe|86`le#Yaj-s`>h%x0@c&DeEHiULMy7|1@|{j+Tq%ZqmXGx zRTSs>qzXbc<nvSDo}+nWz`ScTYd?-4>I(#7UZwQW z%(ZYoGn!?IBajXQftbZ)8lwc$wb9J@w;1Sx=m5$XqlD0;F$#{UN^@xK7^SPMyUD-7 zbX#B@{&bX~W~mB{IZI#B4v0^F9}_||QQM|V<{c;vWCWao4Ww}whkkZo>+otzp)!f8!$~H;XU8}?>WKC0W;o zWL-8B43c$M`L`b3(uhi2;r3*BRuPb>mR!W(mgc)^3RTvv>n;_c8N;@X-;u7@p z$vhGB(wzwkw$lq4XyvMNU{Z;qT@w^>?pr#KMor`~Q$Xt{@|ba0=*l>S%_mCd(%%!6 zwzAH_zy8#8lIRs5N}8nLaI|y|O`4A4=;;N;LdB3aK>0Viy|iTfWJbCla+?;bq;UmfS(MH zWYfdz_wC!0pCT!pSt%;BCZ$7EY9~_|Dgc?sF4NJ;LR3~w=!oESGwAYUuExLQIYm^% z(^(CO_SxY**`*tkWl_Qu=DUAr;uMjON2Rm`853mEmMJ{q{-)zoc*Hr}E5#&F5$u1r zbh>ul+wZT~5K_~XI!4{4DohZ)lrA{SjYgy^;sm&Knszd_>#x|_^h>(ZSl0b@EJG=R zm5^hHX1srH$WVVWu4CRVbEC%Vlvr7s%D>^Xah=F+J0&yp&pHJ=pk+pKTd%Z~r3~u4 zo|SCJHauzxwphAe33k(!xoQSymUe^je%N{?!YHNJz*MZ~Rf1zHMQ>1osPhJf%3N|s zZor7bxGAfPd%SQL)^RY*_#8_$=UmAhYlZ41X$sxhgw~TL)8#i5KR0xUGzkP`AqdlM zq?lxBA|;a&AWIV{W2+M2!6a##tCf?x8><2yuX%7>Gi<0$k;aMkPlSuvRGjEb(pXx( zQL(k=V5(rW#4Px}WpIq>h{W_6sg<;&HG=fa(c_t5)TSMZ8p@#*p=l<j_y8w^ofl}?D=$SsO<^3n=gwN)8}3T~)wSRovqQP?(c zLC`j(9b(sO&3ty)P}azv(zI<#Bj_0GYBV@XDt$snwkf@l|5|Q&v6OyHzT1`hiq5g7 zx(Ar_5hZU|qHH?H>gT$GqaM;GEeYOc$0jM7UR+};eL!coE4`5WO70v{%lp(~htexp z=UDN7^%7@xkB;nsbUL(y)lJ88?lVpLl~dGCh|wlHML#U#POK;Lyt{texLWl4PNk)^ z4=zfSrBc0ybA=WL&Vq~a(Y&^3AryfmTuKh_o;oRgCWbsp;F8D5cjZ>22N`aeN>up9Dt{7#BlcnwY1KPCXtNRar?1~pe8D^i1@j~cN_M+9*r|z@*{JDW)Wv%*XS{#`>~}a0kOf## zs7j0XLc&Y)Y42VIXU2~G8aHc{*5q`*R6o1{bbuxItQwd}2ZZF_O&JHU1<4gP(Ypt@g=g}wA3ZrBTKMfv2b~S< zP3;as6_937+CiZTyhV!+Dyk4MUYa>-*dZ)&&mF`xCS_@u)sJzH!v7G@Mvh(7`H+|( zJZa=1>_|zO{2M?Y9%41l@g~g&B&y;;%?=~N`!Lp+(sTx}#&ql?3$TK~oy=R~gWWMW za;s)NKln2a6+-fd%8Kwd!%=wcSr9A-oerwZ?m`F z>mDAH|HT~O^{Lm}Udz2Qy+)c{yb^L}e5nkQ+UZrDs;?m&uuA_zFowYOoFb%w<`laU z!#z-o^k4C~Tuu$YQbIh0VBs&xrG8&A3$5f|e|qaH!9t(VWI&=hBI)v1%!Vs+^bRcaZfEj2LV-zltse5aWyH}4vZSHQ}eYYY%&8R<*e-zh)K z(i>#?9$Lc0?-iWtIq;AkAW{8h^xpT%aH$KO`yT6SeDR4zbmeC#qF6P)MXU3aFdCPq z)Rm>p48ZWy@eMUSDfaKmno`sc;8x2IP+}!wfR)&V#Kw2;M<2bJRnm)3@ z&7?fVHdN>MLM+CgkLUCaw8?A=%*C_*&?d7fd=FGwR~dm^ZdOKcElyMdoV-3Y_(_TE zAgyI57_wk?Hn2mQ8`@OCGbm#?*fx>th9g*Th>bJ=X36HA@q@*hv#;>WEXnK4-|S^+Yl;iOWpEW z(|(hG!*RPtFvO2^7?9xcHgrFq)$Er(~A%Kpl(3Qs;M#J(17kwCPUAJi4-O^hFVt%x@GawPk5P z1Km)^^K=Xh&S0|tuSINg~8^v`vcZ10eCLrk#0XmZp^#Vpc^z)Mgt_R#1X zymRO{M{92I&S6K(#*lESU+)L|kDgA>@A-doiDPsmC_fK*P&sRyhtpu}uZZPe< zi4W7Ad50F<#-Yaxx0#7{Gk`-6$60z4SkZ_bsPHy-#@l4MgEcny1U0;)1a_Db-hEp7 zOej_Sz1oclt}ljUk=Wy5fXC!pVl#-LjLfzsj)Hq6r3JHT0R3Xel!5GZpZO>bd+Doel7w3b#JFBRx$S4%5C zs%!$?ZfV8k^On|+WVa7!Nh@n3Ij}c<(8}6aZn%!Fw6ZplrC<5iN|CLtFmiKL(3dT& zeAlZiP19kbzZmRC(_333jnXeQFdw$IvR3m_H%CIw$`l@mN1XS5+*4tGXqDU zs8TBZ+0F`vJ3~*~S;Mn+4(+815KNlQ`~M&rBhK#`0}G_-GiPYG7@aV8!%sB{&=Z|2 zo0Ai;pwo_OohdlW(Hd8CmbjIHJlwt&m@q*D6jI$Nd5#Fl9=$}LwdW80kuJ5jhGO1( zfRZ+KutHZjP3=2ac?(4|IYU1D7(1f3%11d9; z4t3<#{ek}KXl)#>b7-6DN!X*AR=J-l2J{GRia*-P8i4m$tLitcP>4SyI7?`*}$_>NxfY~@u+sW!!lVte<{>isfa zUqwg%*4YXr{#yocQ^ZlCDe!_ahBu35!Ql&k%1gAcixp2Icj1h`VStBRF?DHY4Pyp` z@1yp7sxmXum-Jn&&}+V~f$84W%9_d@N@-^mTEGxZfj;-IpC7%|)jCSQOlp;D>}G8u zQTQ-x5G6%hdE4bJ%8bS^kUeQvv=tJmpe>yN0x`SjNi?b=dr)L|Zk>WQ)Tg@@Cz54v z((&%r2wLCWT3?pk8Hhu4Yl?`*z_~p>(nJkntk_2^+ergstPNz@jj{!zpcNee0x>)2 z_ZVxGEE~zahZP6f1uf}LjMYZ{dRVb5TDF}sdRW`bvMc`v&^JAJL=?2Zoj5=hJ*?s3 zx-!iUDH&d>;1qjCoLGMg2rMbPP}iQ^Qw34++Lz_n$kWXkY+Re4iXt^+(Ru*6AF$MX^6TZ zfTLn@=AI14Tzp#!BWs!%5|s!Hl7hyx1f=bCWt)U7OimdC`;i&lg_vZ3$7e-V6tb9F z6~)OL(dAenLpIVAaX`17eukWt>Lb^vUObz zbE%{cx+^^@IGo<;ZH;k}9zTz)*N0iWpdKCWW9>})1yr_{M#NiNQLT7uM_GErz!cEb zrL*zYbmY4RPf>BczO*Jd&W9!@Sev^@51&VVmtckWkb*jto?vZ25q+7#%2v~H1ZZ(z z9@Y;S7z>)(RKnQ7iPpBDSw(9S(cjX2I-V%{JCdX%@buF}t3SGFrPdeyV=X7$;yk|721uM@Rq?a&`h${H%jF-Fux~R>t*W-B0Qw&cr7nO zZ@ywaX@1N6x_Js*VsPw;Bx73}5WdCT*6&#&Mpa|=$>r+bd{Oz>>yS=-a%@zmqG$61eK z9@{)}JkmUpJ-R1&wDPFy5#ZtJ{tRd6m)uXgf98I`eT#dJ`y}^4?p@vMyDRcnZg=H- zZhyGt;Wg!rZW(UzZuQ(`<3Glajq8k)jIqWD*C(zwT>o_afleh`$I5zzn)kED7~Be^ zB+AH-u{DF;93KPW1-#K{t1Vhv0pPakR|PT84Pl5r%#W#8N3JdQ$CI(6nS#Blwr_~3 zPy;z(GG5@SM?Q|2_JMMwSRNp5a>^939iJvP@C%Y?v?B(G6=k2$dPhuKNujU$TbIgm zE$TZ!jQd2&7$C;*$FyMpi@pf@Y=97beaQ|4`Y=~JrC2l&Tv2PFHOwf7*TB3qkf(`) z1R60Alg0+bqqJjm3;|gVqd&ChczU44d_;kRtU)8?P;u;#oSHImIzDZkCdnA$FY8kc za+~z80b(S6=#(;iLz1n}W{h+WbPd6xFoZS^5}((bJ{}}K?*qDoa~NtrIAJa|s3rk&UtN=c^N*z& zgGKusrOgOL%D9MuXHB#$qL5-$jTBLwq8I%MLdbw4yu*Cu1 zV|1Mv!Ve#a$P-(fpAQhN;SuO{j$DRV+sU#Ybsb{$)l3_cQ>Nig4c=;l@+I0Zh9(UW z)5T%hGK6`+mp&U}4Ti;suAsZ~^N<9NOVPr8fS}?b)*ypmd-G7MpXN***$PgG)&>V4 zCdVVW7#zKZLQKjkB@eaQ_vWB^djbU9u zS8Df?n9%prNCX08MXcRX9{l3*m0M)^s#vVZe_X;Jj+!!LfVk@XOY4TKuv#S;p?hm(*Fjr+VTII@jMC;f}@)fVN*5 z1I6gfr_^njHCmQ^_&0>!9A-683PPgSI%z>}kscx#!n)Ku;w2%W4K#(0m7W0>?av0} zRBO0ZTVhlEaBE#{*`389v4Yt-+*(fyof>YfuZ8Xnw>F|f!!V%Rk3i?}(LTL60+Ys+ z5txN`jIc(sLKT|(?+9z1Wc?t?jf@!y@7DcJIwGx*CP;(e2Kc`2JKc9pURl-!ui3Qi z+c{_XF!-e$keCXa=sQKVniv9e@-oS5YC@1PCvQ4x*=SS5;9x^YPTn+1oSG1-&&iug z=~ELLB9KAbrY69hX)?gp%Jw2f|l8(o8Z%a&vQ`$tlZ0?zpHxBNI zt%=y~U^pjlEUlTI5D}J>m&)EP6VoP-%9`FkeKMjegUxgD#?aa62~oj0d85IeL5a|A z$4(oNl{O<~N@jFU-Y9(cOPfB6Qz^Fg;0A`)Ie95GJTsvUDm4;2@jk<*B%^X z0QCqsvr6cWxZ&6^X+mA=pivs+)u^IoFuSqZ@i z45iPr5?X;~2y+cOfHBQOB(RwOhiL^Bg2 zktT_b&rGO`G>Po!my+ub_U{sulh+q(c$)fFtc}cb z62kHIU9jO5MVA^5j({)Myw3E}9KpDqX#SjpHXU>FI*RP02XOZI>yeY!f&E`63Rum_ zYtJrG6LFIY_vyz@6F=dJ5jlD7==Pk1T1|8E+M;hG5^?8RSdJl=@V+Ti@NnalOyt!D zuQpf{f&A(S+P*b)nJXBh6%Cu400+c*Eio2b)5v|XD&2Z3-jfzI9_((YpOe>uKG6uG z;LxNug&&CZ+cZy9ygAjHmjM6CdCe$sUIN?&=QXAA^Af@lXhO^9iLP%HyF=;j_@@6VV7*PfH1zM$nB(!yQ+{5CZm9B!zWlh=Tn&QGY1OzP8+`682gls!Me z7n}~M1P|fqc(!<2@}#Wk;JZ4=78uwdU`prBi!Iwt`SZUlPyoty)M-}S{Z1P^=ou=RI-OD>vD#Url z&-!^V9DP;#+G~_oH~kQ=P|wHGoA3sIOy9Fk9eYZk{;?ij#?jNRqQPM>IZ{qj@&#*c&7wUS z0wOaUTOqvHgSa2aa>*Lu$-!@p7x3hLGFg7HM!GnU(f)!y+U+l^0dt}hIGF2bOJp@{ z$A2ry$nD~MrMl*6sceoXZ_{RSd{C1N{1HwX7{9gpL)cnC-ojrJDuQp&(ci71Y~3Jl z*1lzJudd;GNhbc3u%;ZbN$k?r{2s<`6nm~37S7ojwSl_*X@v^7UemR>0T{iGzr1!w zd2MArlT+}>>KI(D;@CBs8Z`~C+lmMDWbKT;(ngO-R&Dy%+KMeJ#uBHuZX+VC9rv7aWt)naWtmX$ZWgTq^;514E z=}r3MZz~RX3qEyzRh7Bo-P(A+(AvrXq8l9ImGviRoz~d$x*JKm{sntv9gWJXbv+zJ9(EzMe{fo73 zQ(eIi{~ZL}Y%Rqp&2xhQpZb zNOWE-NWbMV28!UzrJT+6FL>h*^eUP}wU zu98Pg-$b*gjJjYAWcs_+Al1LX>xP1_c$D+igu9Jt^95@HYwkul*}2o@98El2UKHI+ zO)g^BXxK$-{YJWila=gKE#{CxNpgTtS;; z70dU+MwBb76HpkO0_fEOS!OSwDmI=A8&Xq)DmI?)ZlDgeRsE=stBM`eyKCr8h8DW2 zCuI2{bu)^5>d;i9+ALIeceU7q>7P0VcG)vE&jk#yFnmBKjH-W_u26G1!)UabwXs-z z3J5h^Mde2IX(Rc5Wj;72ZMV9TgilBdBdZ|(BslMMSFr-UM?KtC?3fqU50MmDqShnDdON1USp(bi!S&C(C!K$X$gWtHN+G&iliL zCS}Svb^**(%W~^@s0ETNm(drVYAtH&rPg=T6^3c%eikoP917lDN(;TXKTGL7FVUZ& z&i)(?bLDWSH5KRgI^FY9zm??@I_|APQWS;=Nr6(C5bn!ygvfNSkz_*uxLu%d{te8a zt|m3KW5Z8`1nZA0{?ky)RJ6Fe^gIe5db7#%C}jAEXfra(mW#zsSpP9YCdK0DtleU< z6Q+UOM8P#+uE&xp^6pva>%LXd-Lts2@6?D!ZaFogIX7(Mz%rk6?+z#5y1TCiX&pW$ znKMh!x)=awb(@mRs{bHeVPF-SlPq?oh=phFneoo3SbpplSAd}4%KgX0&PLITs-n1H z&C?D?aUMDJxmgWpB;)X2BzlsBfyKhrsf3>}=_u}6GdP|FL$I*B*%28(i9)GP;YxMD@i*=(aX2SZT3 zGFT0k^)3wHK15-ZxDU}kRa7c^5_XAF(y)sK`mJYOJi+^KUqwCRJg?Uf7Io0}{1=gI2$&*27bzYExM+GcXX@G;M^p#$Ynz z{{oJ$?rtV!2sf349Xs&}O`M-FNwe%5pOzu2MD+O()t|Nw!6?`3sM%0_&&;7JTyPdP zc7BHtE_f|oIKEHi@7P4|4OMsIwa`|%{a#W(mgGj=D0vuChV!4|msPeEk^=8Da=gKm zg!B1b!&Ivq#&seK8v0|HigU3?J4ioVP4WxW_fMUIO*p6DKIb|8HzLdStR(d?hr&|e zzeK3XnF68LJQss;H<`bca)+x8w5`hL;(7RVB-ESj1@7)4(+IUW-`DRpLhV3ThO3Qe z&j=M3z=a)-jZ{C!sbS%p^u;SG+{~AIQ28rrYgs>?8t16+a8tOGd~z`F%*o-YwA`Jx z=BN>}ej1&~5gfOJt^k1;H*#6b38zx0#UkN$3SW$b%NC1-Mmo3{vR$7+zbzJ>y^Wp% zfrPG9?^U&dtWT%@ud3M8E!;};fk2E4?SB=LRzHREUgbHka0?Xy;ifA$Xs*{YmY`p2 zFHvh7^^*C zPB>Jb`GXKW3_z&qC+04EO&u!v;+jGg9vxFIIb}!LP?Zcz)o`PJLJdsUr9zr)qLig9 zP0DqYy;O~8t4|Z!{eS`CEt*HQ#)fQrf1yuTBDm`|K8Im$te`)Tova^E50l87;Bg`MR zrV?Q4M|5jBrU3nDt>uvi$Sqn617Lbh|ESFVAw{j=>_=(YC&q)`N6RrWp2;=MVnAX% zXa9gQR;U5l`V=ku#JGVVH*47gVEUC+5GS~=W!pOjEu)!{4d@-ijWV(_0vVXJ@_NT` z`W2M`C%-4Q+6VNiG*Un=$FZ;Nwo>(x^&{|jrdoTXu5h_flB%gVWw}r!2lSYfJ`RaK z7n-AhxbWfCktp7)I+81}tQzEu?$VBx+@iy@PmWGZL=sQ!BLQ%VrBx6oD8uWVYD-!F zGWo3%D(CAIwF;7r<4S4VD)q3ee~Elo3;pgjO~1>6e;(%}P`bM%)NeIUGDG>-MsKVZ zQgw+YRY4geY`QbU6JUG7nHJNz)oK$D{SbcV=ruV3&OX;*gj0C5S3Lt83F3AL%YY&r z(63W*v{ycfF0X@Xd~zKN0@!@5<9ZfJ)O(yoyw?V}kqkIA_+Mq_u`d|4sgsyB*an-7@0v=W{zeJP_hFICC zVv;FOqlFt$e#%BJ{}%>WHGf8DH=_I>H;VGdYcu-E`Y+kYWfRZw=W1ZOZ&I=NDtxMW zITu9PAVS{b=)@+pHoDpEQw|2mfj0#T_cGMbhK*Wl%z~@RqhaaKPfJRA?PB17Djav} z6KYE;mT%=_apOa^YZG|^MWgb&Ef8jVNtbmghk8pI@ZHVbKXz`Lv@9Z#Oq3xi7>^B$C`LTEgwVgzoG7u^*_;|ErK;3)~qPh0VWzv zYqoHk{YdX^QE?}<@PW`gwG5eH6#cV>CDv(@wyNRHb%pmefs#5-?3pu(bL^&K#WHhN zeT{Via66o$ep^+z%`LoFh2|6^Y0g$?{rVqh|5g>oS%u|PLMmT{EFVF|TUh|-X<`uS z{gg56@}d0_XSo`J8}#mT7|wS%#cg9o|DNV<6WUZ6rEF7$@6z&Nl(&s%mhb4{HnAux zCCheIC_3dYQ_Oa*&$l#fyQohI?b@zl;amO^J=>1i>5uJLMCrd_0Hza##T33n6$W|b zLuu>|R&Tzh^*dA;@)X{oFL$Ua_THmPuss<)zCr_(|x9QEzD*M7M ze^E0c1$hvCfJj+?GWXI>wSG6lGO39UZsXPKjm;Bad)gjG2}bYwrdy`pOrM%|nU;B5 zOw&!nOubCaP5xdFO*-#u-sikOrO+$tAHn*oHMoiwePW>`c(jNtcAor-Y#a#T3r6MH zyh7i32P)xIJAY}BO7m~2e8-@C0TtUJJZ{?6Rw23~>;IW8XEC2T=d*@U$iIHHJYU5v zj3R|r17cmfe4aMy`fZ8xqx^g|%&0G@!q_O(!3s-}g`yp-Oq9>1kq))3tatD)u3S1; zPbu=*bW>%c(DFHS$HB5OpMQO+Ljfl$GE1;5Gh^ zKk3pn71nS?uEHA5na_Ysp^39KTzLl7z0M=yA`QCE>+vENu^z9a9G}YXq%mPS{d*lE z`IGBvZCQVT0hs$188+R}7WU;+sK*Vi`X7{jLsVT~v+Cj~g|nHQd*p^1DH*&!g;T|B z%pqQlEV5Jjj0vZ6w^S>6-BRE6!%XB?9f6r@B6Oo!eVD>m*59IQw|L+d;cf|%h!)PF z=C{>G!TOs*Gq1`Mn?x*54hYSB=53+ezCychGn2rF%Wd%Zwc9*F7WqBTsS|wwP5aW0`&xeSTM6 zD(mj^Z#2DLuEwG(V53&9Ml+|CuH=Y%xQ;$FkcQk-<7C~v8W_htL0^mMokZ#P)i_*| zTtP2CWK<|tItw4DuJjmqSy%o%x-SZgpk2>XS{{lVmNO};c9(ynss1BTR5(*d(+7_P z%`$rSNF`ZU#=mj&?_)I)Ifha5Cn~w>N|$yq%%+hKA@X@zsjHigw*JS_#7|IuEek3f|4BhG7NE^%H zDfDlo4a2Sc0zHVdMaqU~3aM>_%Zj4OVh3+P+PEp<15;r(1R3)O4XSO6kPY2vR&5)W zO+}M5#bG=)tS5HhCkD!Yr^AAzE1d-i3YbV`K%jv0c)!)wmJ;jOy2yqu3}hmD0!7!g zwWH2;ZJj~$8_ln4n<&HYAAVcp2G_IwAmvV)+P{T_hvK+)9jH@78_V6Xn%o_qJ~JH8 zC6C5tskUudewI!)w4nHnKI44eh9BBOA{IV>EHf zISt6dqg~T@!>;@coovL}G~#U9GQio4rhkAHE%_4#Hs*ZVP|wC9pHVgP$wY&U6T0J% zw4|}EiHtWrKWc2_X&^99gG_=yD@RYB5_|c#yHlCwLQh0qE zU(hN)MH`#gqGb4n%4=fdId}wJX=2mVvLDFSl)JVC^=c}bXn1uKv8^Io9*$!vP@YF8 zn}TC@H?;-HxVi;^TXa|r@=60LQM2#Kvze{8(a>B|y4KXU1=GxCHYi<1FVn7OHtao= ze@BhykMyU1o7uu-L$hPeZBjScyFTeNY~`|P13k*HO$OC9nlRNCA{+YC(y6v!e_hc6 zO-Dv!O%gS`s(t*(iG6Ijzf83qmt;dfT07k~31!Wvs0FrG+zLh1E|c3dnZ{*`Hl3%n zX&T=duOU^-3+Y`!m_&braEh*IZcRcMujAoi!Po^t@C^_dU@|=5tQO}7xoAkN5uK6Q zL3>wJqlQ>4np1QJd69KHv_DgWzk4rg`WB^UxZ&c3+!-xmMzr9fJbJX zaKvmI>zkPrJ==zh9_9bgu-RORSXwvRhWBWTrfVxE2#AzSY@UXL$>GgsnHx; zILUKt^<+aY1|Z3brcn~GLUp~Q@ly1`{=xL=99w;(p=S+@%Ur=-Q>ocp8%w#r@Wc%r zsf9}3srQ06&7Ny(k8KPOK**x3BCeUwr@2mH z9p3N)4Vo`9$e~x}+h8GIev6LGxBVm=22=I|oAZLu<^?uhciyBg7uXufFyy|qz=k7~ zqD3_`)zlkigc}r<&2$54c($NhSd$K$&RLV$t#0{sI+ty;(ns00K-n;W0oK5>k1ezr zMjBS>Wo#QLvAT+2 z!TWH>kUk9$2(%h0cwGa*`*ux5&|oM)X3gib6UO@u?`wy&CGBIwX?cN-A0`RXP*)0U zp>(0ZhMiA)EUhfCMN+*&?tA{uO}?!93sIi{4}O)k2<5ijR<25mQ$L zPpg96bXSMiK>DD_h6Cyfe+?CV6@%e!5sNH)59)LkHE4I0q2hOG z_*GGyA1x9AdkpQqDoQ#`c~@JDexM9O7S7>D13FT7+)H3O_XG-LgDq; zYc`w)*rPT3lb?h7K|)>=opO-m>pYSxRB9^%_HNYgy3Lnfxo!(d(iI;NdvLw`^@k(* z7Gm2CVRj>Lt&Bilw62Wcj_6tma4*20CvH9<3An3xKix*o!MX}XOWOmgU8`0aMGrR2 zwRfTL8#X@_yU$4hU2b}FCk2LwuEJ6ofut=fBRFa2N`Q;)Sp}fjy|mT=8Ght7IilQ5Q`VZk)}maPPZc+uqB zJdfJj;bNc-PgfMbMZet^eBepCPP%%$^;{quBO)8}lj8hvtvWyUZ)hv&<=;c5@$dD|3k1Xe#zRZMtas+H?r_;TL;; zVwz@3F(sM0m>PQSG5L~jiEV{6h~6%-4U+Y*(7zS75b`T!MlFPshEj}zpZf>9KoY@s zL#Yk>dW-lsguc*d4nrjcA40PDk+BR~ihd!rC}S<9@Q|jZr0{wO?wr#mi7DQfrkB~U zhR&ufWi~$CKB%ps1sQJOh=r;x_k5YHDK^^XlS{b`FRc{ruaOzdnZlz*X1IXX5!0V# z6Ev7n<+dwE{XFfQ;9PWnm4@Hr*{yINExc#ra{`5S+_T|mY%c$Xlkqws@rwZP8pIN97KEm(Y#1UY*58b{Gy+A*kLLRVQP`F2%?)fXa zr>AG)-G&rg*VL7pY0Lu~c2;J=i8sr?!rhepz$RQXPLF=sDQ+rH1#^ThvJNbY11jn@kYq zMku0PuD-soZM2G+1Xw1YuaUQ7@~gQp`aZZWli=kB(HDkG3Qu|PWuL=2~&rIEGb^mR3| zRwDhC$_S(%SQ){^dshPgkFD>3tLn)9f0b8xh`_z~(TfO3k)op59)cAC5o}oS(G;a4 zVn?_)1(agiNlbN1deJ0C6BE?zZnB#So6V-I(U=4wCYl5{n$G__bFpN9|Bnf8=1eRvRGf!A%h8ezE`Xu5^reM-&E?3<_N zsu_}aZu8X$%Uw@9EW&D?_CM@5mOQKiOiuTkRFl&!76B&ck*kh2SOwVn`Izpt3JGDF zewC)2i^pkGJv+V&DmL-w@uk`kroT;)NM{qqn6w|=0GVwQa6#zDqrd?d!>G81I&1=T zu|K5eky+IAa}6jxs~CE_G0p0x{0b=pgG+DlNCoPv+Uc?uh~armCZ=^+z-&Gv!1 zU7>@@W-Z!nD*g(3X>xt;&sq2ZXu|0G$ zLcqP{()S>o;cU^Zp$07w>sxN&#cHSFi|Zru{e3@K_<7ejY2}C3EQ;?nU;l7$M}y z{3zj8EyeE2h1h?LFp923^TAUnJ4%RT>*^w9#|RKLTt+)$1l+UwWq!|M^ATFI9<-wp z=-#o3xIll2!LhDeN?*tDW4%>9)>+176{RDpm|xSlaSZV#lsircM|CZn^2n=WJ~&xT zU#YLE^kuLe@CW2F=?ZRuoE;}HDdgSiJBwxF>*hQ~#$x^J@@Zi#U;oYgUZGZebx(as zx5P3W7t_I5j^nQDI4*{E5*PEjG)Na?g~K{s9{o9v=h}HguCjGdnPgZF(C2Z&L>E{A*) z_*UG;@7EmP>!x)teL)2Y4C8FtnIMdXp8MA8xMaiK72p=BH*5@8-0vj_Q1o4R z4dO?R@dDU;{aa|%ctJI5^%*S~&+y8k?c+IKO|%bqF~bdK)$4m$Q?4(a9xsG8>lS!o zCvVh_(s-To>V*rE+q^b;&G6DWK6bq9*y~v280Y!5=Nq2SdhYk!?YY5ov1gq9zxH>a z@6v7GWnX2VVK>-L*>1LNww2qK+UD3M*~UW8#lw2pdd~W9>uc6$tq)muTdS=()lMm}hXnkIEbRC-trRTK#hU1l@mi&+7K;T6NXB0-Z}2t^EN8)lX>m zYZYz1wosd_9Yv=TgulEkEaQd8S=n1 zrsy?7V=b#52{_~dt{|pH+27IfKpGe<&P7}aoMmLn;NkMX6dFBMhzOGhCWCzv1hBhu z6LU~|HRLZ3q(ZqajC$TK6rct;Fo|lX3h_W;B0V%!@N1R_Cg4C5xdt{X2Gwgp9!TM} zxm8VSfJZ{3ai2|Qc6(0tiTVDZrc{KwIV~9f75YeaWBjA+xS(rb; z;(-hD8NBr%GS9@hEe`}zqW?UJetou3Scs_!P^Shpj#P$;^j9acvJ6wnXG{$t#W|7! zzH>Fq=`M0JS^;=P3B@l~x~tV#}y0@z_F@h+jdy@j!KI5{u@gW^f&k^{rAQrLCFZxJpC zXb*oes5S~r37i=(4_NuaRPO;uRRdOez`~R;*#m3QqDk_AnJ0r9zZulFs53LI9@xz1AnmsHC&lC^k|{f?2ykj^K?90kdD8j(aJejH0LzgQS*m?WR8p;eOtQ>)~2)ocS@y=*d>fa~F4 z`CJt{e6K>(tLTj}3}Yo5Mg~($`pV}vvSo4gj#)ht2$#=oxGOaf%FX90XsjAoPrBbvM{0rgBKVrB8e`~a`CJ)0z}4tguppl+W!nYN5wlfS zL#U@@q#kCCiWgu3z>BZJIqIr0D)iWm9!Er?f*UMI-55)g&#i@rm2^6=bg4g$eYr4@ z;a(-`^ONgt8E1(%^fx-(e!4TSa=_~SV^jzo}ZXdRPY(H$j8@Gp8n1k7AE3-vfzkx<5^XEjOi_tZ*v!j7O74x`)Mh*tpx6YfLo!WO&Dexv<|cB|G4BFv{XkLuRz;$S7|pV}vrm3A%pmI^8UO1lPI zHK@Q{%-Dmy2l`rjdwP!vN?S9zO9j!awCys^^=|RL-Mci1?k^Q)o0PVlhHUQ@ezdr_h|3Sz0Wel(sGoxO*rHl z=+NeLKbo-)G#aI?ftuC{vw%W9W_KB#oFY2uqjf?wlIqB?UPwk#EtYi#^*!c}G$$)< zHMrEK(?P}UOS{(NQmeF8(|zl4k5t;K=-7H(8kM$6`Wi(M*hpa&LY}A6wgF2iOJ%H+ z_O5_ny1zp3M1~4_szOLXBkN(wU_RaZggeoYrnIf2fDOXbP^FD+z{nAXJo@uc@8RAf zeVypj;TWZ@j5co&#-VU2mT?qqeA4YSV=zjfPajF$PlCrDrL+~(=Nou`+~n9OWCts4 zYjHS*p-w(&GU|G{_uxFGtq8)PHI(<1JJaA)+Sbs?jd*h@ZL8_@M%?C=wpFM$iGF*^ z9b_1zw5_D6l|m%a3#p`1$V6ZTJzgnHL&oLkN(r5P+C81k<}ymC5+YFJQk+pikU@nY zCtoZFd!G+e+Lq9UDn7LZ)Kw*jD4vg-Qw62VD+8$a84O3P(zcj>sS@JQMjpjh-b>rE4|P69_-uQ*9sKpVdthYp|*x(8ow`G zup|RGmjNl^c8o@d(gte`-Ql5VX*PxK3y(q|lNRg?AB#!Kz_7)Rh{Q2U_(AM+g z^Jv;6rEL}lK8uELcPASHm9}(xcVBoAYH-mvYG5XL-3I&hO4|%dye*t{dODTg7S7h! zG`jb;a2EnoVOu|(4NMw2ZV#V;z!aK&JI^y2($V2*=zJ=UKQ|2C&iA3Uce&%5t=i8t z4`|yAUg3@kFN@(4k8T5j$BkggTU-kLm%#O&TsgBw5K{OfxTyV6GahB1kx-dQH=uzFIL}w(ojzdo;X=T8|lG68}W5 z7b#tt7rsI>@Bkv+YNcup6uWFzDe@yNp-3OzjT>}Vn?_3$RC@eK4s>eZeq@<@4Ldqh zFW}L{+*SoOuy^UeeU#H6fW>y%gJ3-Z5;!$X-F&a+5G$XQ*VqVHDrUNG=0+ zQ&OYAX;hbWu;2pPv|%HskFgG-bCWnhi$z$+Mzm=VV?(2*lZ_zp7&g%9MgcyR2ULyP z{F+MkjL=+$pz>xRV7;M&6N~_6E|t^bIl+j>Se18PkD|=?!`xtfKCHWK`8#Jb(0l#d$$v%)Z-=M9AxE`jhHo!Bh+(H}MofjYxF7J(rB!0oEsW)*m6>+$?y>J6J! zX{BGuvk6=XLpjAY36ORlP`wl6^Q;V&Uub0$o18Mbxe14`W?&y3Y7%@FYQFzj?NDV+ zEd&|2{8jA%i!oG7uO|XqRjW9kB{GB|y$BZtJj$B*iAHS^APiN)e*I|q7J+nt@I=$nyO_F!Ai=O!?FjP`ijpw?#xQ3wR&4L}C@XWB-qCPS{!74hj?D!`{t3+J>QR&oT!%J2DKAgcvF7Pbjdvkhym*RuR-En(LSs4!Mb z`~L!2E&o+%J>GBPiFRn45Na~4z7Any7D~fA!75@Ew6P!;s=GvS+d(`stb%bGK~nw2 zah!9@Lo;AetgM0e8{EO|f-qk5{gAp#&?_u~W9lwJgsp&;*OJf}SHY(DwhLLRO|kGD zLbMvn*&&E(sA7i@$~kgJI(7)(YYjMuM$yf?gvIpT7QvUk-X#R_(2<~KVPI7AZQ4m1 zuR*U9UXQ{O^=_^QFwJYM*C;QI;~eN$Z#kZZGr--B4WMF8hW!JF=PA#>dmi;{hfVr9 zo}r#r*lsyz|EK+B`)&56_E~nT?J|rLzGnM_O|h-ACEG?>hpd0M?zdK2XIXtM=Wr|C zZ>hJeu`IA8TKp{rbMr;>$1ptj2lK7wZRS$*QnSk(XEvBVGreYd*whMNxJyl$ress7 z$?ow3+#9~(@vz4o9-H9WaE8Y?P`C`BaJ^%E+IR;pvBkz&#yDJK-!L3C+-KMY55fx# zlMK-Yjebb~g}zt+lKxNnPWTM2)fejL=#%xq`cZn_4BbWDzjUwa9@Ta0cIiq%0Gpv3 zqx04NqWx6+mbORxkhWdBMO&)P(N21CHG7c4l1i08=QJWEiMkbg$rSmM?L_TD_ZjO$MoGBw&{>O=Yi4L^({5FQu{f7wFDqq0!~= zMszg`#%1`Fy^D_a;&qVoDULJI_`UXbHt>+=BrW)Ow#JiW1KO12D z#ZXMV>pn(uyEK6n;?|mA#JWti+k_Cxq_8qb0SSlwMFYtrc}sx^1`1FfLjRLk|5;qE zqO{B^UrJ;nRLAnc5Y(mdJXVKT9r7pe{I$(6odifNegKT;!0MWM7-*_vKY+!luwq6I zuB*lmMuQo3a@MVLL(COG{)-02@dnBPDaY8vu(7EtWf@A{C=<=gl&r64U?}ikKvzd` zaB)RF-jLOG{1@P{Bhcy^h6x(2VW>oMREi;Q!hrZeqholZpfl8^AQr)6pfA=XjgjG- zq4s_uGD^M_#=x~0h+4L;LRsat4JBNdUH!$n3Za+p7Xn22QZQ?UEmw4y{~$4lE+SDc z!^4XG0m12%F9ooyWI_;)`B3nKjD&eGx(KaEmXm$HbCwz zSch7^;IMXUtI%l;?=-ko2{4Pv_IT~JaHu@g%;>`$($H9ZV}`5IKzV2vr}-sRu99X+ z^3YDah(dUYk;TBOW5Hl~Xa^&8@w5^*cPuc{+DL4S3?FcR`pgyCEDvqt{bfuvH4o@g zLtFW1Rk|D4&W5cv{95IqExbDwfK(t)6VEfU`)fyb|IlWh2fM$vT#$zv*+EqcLUY9? zUj0bOS038L=c#P;CiRR(9u`0!8>sMeSI`Q1sGj46?aAffp)Q+4UL$w?_ za(L8^93De8BT#;L0E%B=R875~yTn*|sESu#T;XQRmHmv8hbmPVKUr$o$%1j(NTa`S z!NwnaP^KYZl7}kTOwj|?s{+mAQQxL)GiOL;#--00BhZ)n1hvU zozyU?1*_h%rh>F=? z)H+G6m8q8De5m3kAVaY$CNf$xqO|V3D_E3=CS1!`iG{`URc?LZAwiosSHD#Akane~ z;aS51$5{I+&%?HR4EGvRJnK9|JXd;7GHf=(3uwEx4LXDHYIX5X*-*uKYh#TcaT zx2Nk)+GFgajJ43vUeGHbcsfr*5Nzva$`gJpNu~;6Bw~ z5~JoZ!92s;wDvuLYgu2ep|gDgLeiqTxI_&->(JnK~@mqxgolLrN|6F~k^- zP`>)7Ag(dIt7hh1V(@qV2Tun3;2NGR_V3^0$w2S_4o?R8mx?E&kb1HBdj>bWj^#HN zhZeBG5p{--*vRUuVh^uMn;|B`s@3`c@V%h)A@f3 z3-y{oIH~+Vfb{wxB-1|-G7zxPa~}whY#ubz`42!Y)(mPW^g{uPN0&><{UI;q0c(%~ z^l}D`^y7!Zd;|e^?8b%hV;p)=@d7pTe_z`YB<8zv0dQ z&m6H#4YcQ!Fck$G>B1=?l)gMAWSI=gZ{L#Xa{=m=gMsP}Xsm7k`Hk=0n`zqT!bF|n z8*2ER&u;*=d?PSbugf>lYo7~H&b&xps-^u$N^_k?hUaAkMgfF9I>QBe;tNJG9dxQ& zT~&MJCP`T~nZo)ZXRPZN?$a5*rn-K?ho0+a(o2I9z1uIqoWtc-3O*-@^jp6G#j~$i zgsnD_a?h&Rv{2nSMiDyCetqeMbAo@MW)Nwypo5LHcU`9G@^1S297OgEUy^e`fJW7z zpSp8Ka%ST@g72&5ax<+S5T4W-2FW%kKyhObE|~`et^j#?7wtm>R67V+LBjxxKo)t> zhn@n|$O`YI0iJe_%wGzyDm17%6B<=Al~?MoripfmJS)9)4>Z6 zEi-&UA6#IfWrL&C6HZ+%>aw`JjYeM-{;V^6PA^^*!V@%uUL!{jUs9ZqdU-3>iAx6* zuCCFBrmeHCtr|T-l=O`t>kQw~qHhFWGl*iZvq3!a&u@g}&}L`?XuSU7b(7Z;uPDd& z&?mXmG0)-SdEE2Qpjd74T;}QW9OG%RpSHhdf7~vEv*EU9*^}&kw%=_1w!edqagS}2 zZJuqs&Bryyd?qlv8^9wFNNN>y^Gey)XJHUDHq^jNd|0;+4MLy)XB*^d9zCy4d9? zM!kt5rKk5$-=4l()M80WR~k6(b8!uImzILQxf#}zL+fdhAcmNft|_>z%_P@-#SwY=^BT7r#Bb}y|0W>x?-qM5+jq9 zu4slSu9$#hg!(!prHhe(B5~tu;2hPLfzGo?0bdnqW9g72I?+lby^R2n9CO31vc8dB zA91V1I79v4DT15a6;2^eF$^6KLpLYVo(GHl%}5VLxhOjHV6otZaSy@TpFMIZq=T)J zK;J%CJjxKJbOqBLAMx-nJ0KFU?RZye-#J^th@O4Qs@Sy3(8jh;>HN2OT>WrRWUX)((Fo?z~k^4 z%oZCu??)H>dFOq}5+KH)OFrnt6xv%~46F7^*JwVL6>N-O1}3jWDqY@G6CjQS(xd3^ z01@ovE-yL}AcmNgE~bDPQ$;6}BtJu_(&c$qpcs~>zyPW@CWOxi*3My6%Vg4>Ri&^@ ziE5wkJ?c=ptN@8srBFLypozfELMsC~Zf0r<6oauqO}tnMtWhHm_6j=W!8=p}$bG#B zoJyCGjs^1NWS|cN#W-|`QBx+;1DlHd4Hys|#RQ3CfV7qt1&QFsc4???Vpa$}7{u0G zXEPm|nB@-^S+Qguqjc`V`*$K8z`f1jr*!V5;9yZ`Ryvt*lN0m{)-3kui-OX*9iXTx z=GUqB5R(81Wy`Dg;Ao|D8-I3if-Y7Q|8*#xTY;8e73j2p;jcyM+`?8fpDJIavx!YN zv~Fur-%EWmc6v|mOa4mdW_T`nE?9K>D4ks3sj?0`5`QG6a}%9GLa@@=fJGF; z_X?)%h2F!FN@qP5WISEiTpT8iQabC9NrYjuO0>v-P(v-{hKSBkrL%?|HGnd0CAM>W zpJT^Uw9;9P0|U(Yrs6SJ$emSmFhmSbRyvt%Qxx(iBl`=$b~l2~x@AIf<1)W4aK}zRx-ZgH>4H=#X zdaUV#iA=Adl93 z!IKuz-Y+Dq_|9B<`3q?(0y*^47t)j$LPgW4X1(4G;phf@o|C=29ACp^>m!bv92*^Z zj#PNQGI)Na5Au9np9}9-w|TaB7JFvkbM0Xtu>V8%tG!J>9s&sC>^9p^wlCot;P190 z5IeZbb`w6?rM7%qhE1@3X?+xV$=JdCqdHWtAn#5@PW*|7<>Q{xH=1y7^)A zO<*)-nj_45(?!!q_*@^v3-uOLy=k>+-jRnB#UyQ&)>~iT-V!rFfdF3j(arKeNGARQiJZ>NahVGoYy4+$>T1;UZ$ z@;&rRiWs9a>L_Z0$gax?BiKRiOI6C@9lD#=PY_ddMlIbxL4;w1!FX;Mf!7l{r(QL( z3Kl4U)nT>m334fNd2z%BHQ{F^T5;TLc z*TAgAosovQa5=z4&F-6sZ;j!%>wqsO!hED=a2!1}Q4Hr-;5(>uk{C&ACy8-7!>=r| z2pMAN>?9Ea4VP~xTdEipYxsrpkPFhY^V17LH>V`PomJYu*{xK61B}f~G_6Jfl)Q~@ zK|p8tnGU9kzJC9cm#Ib#M$t#eV%A*Vrz!}aO@e2~kjY|%$?($+khPOV1D#63cSAEc zmIVUo05YMCZiq9Ac;Wm==O>H7F|5u=^^LQ&ib;qw2Nr(uzlUIix+rOixI}08f&E4? z9`--UD_Mlyfx$6!21%$Ij`PyQXevq*@n*TgB5^b|S%i}0U<3<9llN3{e5&Shhbk$< zE z?G5spiLBO{7z~6$j^xc04~8}yd^Kg7k2PMqyh^=tyry}DgOUEJLi@>Zs*W%Wlh3OQQKV^S{kcnp@4~<}`CK4zs_T9$#bHV47gkdGvbpc(i*|do1vn z<`HK+Z@kO6)HumF+VHjE9gqw68a5dU3~6ADzoFj?6_7aHZ@OOH1G-w>0$n&b-w$Y) zYBQnu5eT`Pk2N1_1LY?J4U*hnPqiCxS(5wfXzvCwB3dC_d4hejFI~{(9w;!7Rvn<^yxCju))Ka^8CREoZ+pp;&%#4eEgOXy;y2oe7NVpX#E{ycwj zRf*s<_Pc3q6>oMe-CBj&|G0UEayGEQDCigGK#R&eu zKz_y_tK6T5+lqG%$U=z9{fp?+8ZnejdoI1b*2ShhhdBdt(wWVLqJT-w=93DSU?_pV z2{Jq-j(5ADDbSxqZUlhG0xlZO-GDvib~%l5|9nFRt=+WHmwKBD$HG-w|2(o3yTFw0 zpG#52E;g5QD7)ANeIB^`+gZ$8&ZK*aT`?F}CPfLSTTP)0-NlRsaxFMk?w>_xi(OEl z=uhW-rqHd0;byEA7p|nSl(QA0_CRqatuEmx&Y-Rm7aPIpJom@Q%~sYlI#c3`^pX3g z^3f@4;%#8W(?~4k*iE772%z9(&dt1UTcKnQmito~$C6HLEA$_WPEF#ocg_13tK_OD zuxPn|A_VxxlX-jL7&d9}hf?Ya3X=O%*d<=|0)_(kOm8lmEcYjKu2Y|PL;z)$G2T=^ z7n0y^z*x4bvNUu)k@w=A?SL{RzA~Ol|`Y0py71Ip78i0Q^M< zx%W^(P(bQ7zf;toYzW%w~ z1w}A8cYVFw6+2b#kK}E@7Z}>$9>My#m_rVa`^xV zIlbimP{#bpK^_ck2yI=**Gn+bI>zkk52BOn7-teT1HM_uSe*R=#Ff zgR!)D47LMD;0W!K`#tIGAM&_0KYt3|;F@k?){{H5pTIAnm`(+?;>ULIJ0R@C1Sje@ zQ$n2>PQRE|*bULGXUoW1G%Lo`dbX6Gh+%&o>q|LBv&8V$vrIfZ1XjPwrza*%fdX=xNu8LdGrmHJ^&$)o4Soq%grYy)QZK^b(3O080s)=zWqPMxguRBrLHbTj zSxkNnEaezYZr~{cv=RW6$)n~5F;ZuIi5_mi`&cu0j@||UDU0a)263X!_#(w^5*g{V zpGIxMeQ4VzG1#oRk~{K=--0jn;Z2~57>{0u92wdq{sI@#N9fzlVu;T80(m!yAc7v| z1xS@hpOzAdFq|%00y0!wu_9r z@(CMvtd}cu={Hd4=%?)>>~ajAVspR<_gCgn-VQM%Kr{HC|Ib{owq{fB4l#({+9775 z;KyucxX+g>nKW^y=mNF;qyIZgtY8Lp?Gzbf=R-bSd@N?s_dCVuc+7mjA2U~Hh#3T6 zMbas2mzV_J!@qwwfh@^I`*!ix-oM(~^_gVpGwG{cV)!V{;J>a;DTB_Spl0zV;P4)s z+Zbm3?aFkxyM}&r?@#VAM}BD*&7sZHG>>V#j1DUr3wQ!))-i#wJW=T$H1_+Lf+`1n$pyxw-AHcu+(;Q0sE_QS- znV*R?_BT{%--$17EammP;Z0R(-$BlY#bD?kZD+&~rW?-)Ie!2t<9Oem(MtO^%6nM! z(JSp+Y2Cw&9@oBwI@LfE9e!AhH7V_z@u8SXp@-dI-aIUV#M0hK&PT);QEA_V=AEq8 ztCdD6?G3cz5iuI&>VbPKY_37m2H-jzrPC>Cz#U<5Debk?`-qs1Of|Ut)W8wJGJz5v z6(;~vjcaEO{W{>DZO&HOt9bg^A7CQrokzuFv(jE^%<^stq3=e`522{X#Dyrb5eN51 zsy*a}i}c6DL_juhNZ-$y0(}AqaITRP3=ml>ycx7g_H!7PEYpAex5)m{qhR#Mn; zH2mZfc>5{sCG^n~IGvUDVjA_Nn1g_u+)v_WthBGCmM6t1Oi>Z$BCG(iBaHI&2Topw z4o!m6z6KxrT)OXT_qZ^p(!Lt^qYz|sZ^9#C6Px`%_T9whABr&TtH|dmF%`A0r0l0~ zq$ur$wD&3T4+yNFq^HI82rQ@jo)%{#u#CQVT1)`GOK}sPNuJ-hqs?e;32rm#l>Uu- zoFQImFQBGp!~_gbzA@Fi#YhLrq5AdeGvW-xc%^+Y{mB)<1~v~@xRrG3gnObnMQL9I z6!R(Qq?`dawnuGK!J0Z@9d99v%lxCc1Jcs>nEXA?c+`5N82gQP z8ctBF$B45h`0_2kTE-#3uO zK^qNGS`63~OCT$Qy}&5dY4u8r-k9RuGM&bI6#7xoBxwa2(HWO{ zw?xp%$1@^nRjL$2j#McUaIG=dyJbA(Wn_gh_!59L#&zB;jnrZx6H+Jv5Yl;M>*zO&aK82AncW=<8UWUq; zTJLI_@zcg=~cjJMq z58r6En*B7lYbSdgF}ox`t@bPhr%OG!3zQu>lP-ne4)@Mo84|k={6wAE64Rx)Qc5c_ zq$r*7ZEDSsU~6meM@~#zT7frUZt(^#Xs@|aLMJjLTwmUz{tOA`ng@SS?W2OXyu7g+TWVXaF9&UOhQ+h^ce1n$HmYBT3W%ZlS>VR=~R>fNC zm@Pe}Gya37&5;5PA;adRc8Xbt|Cyyr?>RO!kZ+BBEp z`8wS*m*aWqI-Z%Z8OX}7roOpSlg{`WEtn^bftbLM+6avER=~J369dy+S*6~rzMCh( zE#^Ea(q#PG4Uj<;M8n^a*L(@yN3N_?eLWtSFZpAYOJhyOzuo}3d%lD__~5s6V!i~! zF;@yz@?+B9!o|B5ND(IEU#Sn=^(*fS)tlpYWZ8ZM1NW!jWHQt zy#X?SN>Kkr8cvs(C8jIOX?&IxmTEl7Rf?95bgXvM)D!B6j{q1&^TO{Stmn((h&pRTj6vzN8&!+-py8@9(nJ>-^)X}5*{P( zUWb4*IQ1PmkuLck`8ijzjB1{zc}o>Z*y5G#<#hbw_{8zLqs_6_k?8p!@Ht966F~>G z+ArFlwclsYut(Xxu^q6rLV0F_&1QYu`hs;kL=Oz0`t7i!Lt*CM<~z-`=48`lXvkEU zMti*Daks}7k4%qf;}x9#eZ~!jFJa>)Nk6Rri@r@?q>ql#8+E62hjfj)$=WNR>`l?? zHE+Q$fKh)&|E8Yw&H9WMbL*QcX=bq$W=K(5b7?}UgpYh{4s9%zpk>;cO$SP)Vw2Lk z5CpL%creKeq_JfZ)TUdrsHlvcuB{8`p)x5Af%&v6Fnuxnw_0Crv>hoz|^myrotb-LsA(1S9I} zq+Ni_puF|cF0;})ogIdr)Em8a&A3rY>ogonjOd0h&;8)ZwT3#B)~Spy3@YRZC|+qz z!y6q7M`@ix-4zm;@~x9qy4K$+7>}(rl|HS&(V(el{r?Ai!(n9@2P z_r)agj9VLIn69)Y(61Z$AjZ>-O2$QNjibs+397oSu{eEm>0;d46!T=IbsP@Ye2R}> zJHaqdX^o-KD)#+uji$;fDb=d9Mj>}TC}MP=K0u)M__Yqo>0IM!NlR5)$D(W=O-opt z65yk>Mq;GGkdqG!6I6ioN1D<)h9*`^(2s77z-MASeVDK|3_9Me;dEa$ju@pi44N5M->a z%$t1xy-_1g3LdSrGC_m@PQU^lcjJ!Gm4;sWqZfIUs9ih3jPgwMAcktSYkd>!N~;9C znM?cnM*KkyB2t4G{fc+wf!^-k?(s@1V}4~&k9KV=8(u%UuP>afQD6F`FC4e>FvuQY;en;fbjKl8(|40oX=Q38kt6gipdQ+L8}cJeS_puZ?57#zr^47aonpY-ODK9M%dZ#zH;saYW7Z%X{HdUZ|A}qnhC%LgRHe zL~7@H#evPx?>Ocl94sjgo#zLh_d-K2#QwSckMO8I&UVrEEM%MNZOd)bY=N*XbuuHsuuA8GSsGyZ)$*R@A(o9CHROv9!xO)r8=+GHv* zEifgR^d4tD4tq53^;qXI%R@B&Y<$_c*SN{J2vSX>U}x%IhQAux4Lb}~h9!oXh7f~A z|D*mZ{rmcp`bYG)>u=K6=oje|Alr0K_cz@$x-Q)g+)?N1CcxIjm)bY9FKO@6ZqP2$ z`fG-?W_M*`>;20aF)zPyjMAL|(%E!q+Tob4Z={Nw@bL?1ksNgN#p0-7LFtae5j%?jOQwM zC=78COyF_+e*_i0f(oLj;AURISlWHF6gW}oW_!p9tvg-=j2NJfF}VLmT~)VJ;h5-y zq0zlB#Ee$DBj9{c@&TUVyl8$V&vKymjzFb5jDEUV3UVsl5CVbn9$(|Y?0zh;r-GDj zxYf8t!iBCI+^Jh6h*fn5A>VX5bF3JKl$7p3x(8sS2hg!wq`+pS+aLW4t79Ya61e}| zhJjV-b^_{MS6AN%?K!1eLZ3yhH3tCGH3DuTU=dtv4lu0Y9$*0(6XX_nZl+O$6s|(2 zbaTR}syYXtszjr7`%dA_lmk?5SGu{8B&g3J3LQG7do-hfs=9LkaV;2(fH$D=b#Sd# zEczo8SK3l_=8%c2zxXQM5CghZ@(Wd<{0u3rx)e57Dd?9cZx8}abxD(yZaaN{tCSkA zbTgf9zgl%Uw4zcgYgyHmt8Y|)!3+L2(Y1_h1pQ5jYs3 zbergoHYUB%?Lo)d*mtbkNN3t4KTL+7#dT;q67@n= z4i#g0qVhvbdd!{)wgJ5}$IK%MAf(m;{q-dF6q0wQ$G>QN;0EU?;c!KrgB zVLWSjl+v|@O(<7&!(g!Khdfmij;fRqMK_>{{nOXRR{`u{^zBXPYlRHjW{g)Do!(b0 znB$bLM&O=t*KNhon6)lOGznrlZ7BO7nmN|DJ5lLspbdMaBnTwdqjtX$r8c0`)%(1l zbTOrx)_nbWrw(O+eiWiviB88sxd}m08??} za3-mSepUhKtgV`MUBnEsU`(8dYrCQEP~m{|+eR#w$XeFavpB>tRBYa3m97owZUz?)%foe~qk1ntc`mZ`A;ABZg7 zf_=#Bia^XN6vAgEd_{2WG>+~ue%@fSLFTNOuiOg2AM8Dfyl$SCZ!n(sIppOQTab4x z&x_rLRi!|-u!tQ)wPo~0rz8NIHS}wzgzsM0YRptT)!tbg6o~FJ5uy;Tn8q8~53<`s zp_syzRM#c>AbTO2jHh?+ESA!MzzU84--jFlKH})f%b3CCXfTK?p_P|HOzvtZLg`vY zpL9tP*j8Oj`CKxkw2|WYPWB$0taL3Qt+$99UsnN5R|EO9)mwzUpRUDp$XlENRPyi* zUP9ZbcrxxmU5oe)p@)hm;QQW{OVy*f*lP|wGaAHXr7N4xkLEQlq_IAb`B1vDD9=a4 zov&*FwfZnxR@Z!b#)r|ey5`Y2A8;p>uDN9O6{CWct~uB*F;FA}o`<+#+Dm-pK{Tyv zHs$(?G04MInj*R87;@c#PmRpJ=DjaYP`WZyJ+i9(#kjjDU9;#NUs1qjPB+eERD-&e z#R2r@{^HCRx+UYHX6;yw*T1};gjm#0*o@RV-g6vx-0RrosDR}17|$O)KlbeLe9*HV zR-bJ4kGR}&r@h|3#6HFDWxHg1(RK@j1!mhqY-a1%);@?o?T4+%)z&m?pw+{2-trb~ ztlVm;vP`!`STyF(&F?^9V6VBsTwtDVjxw7~-!_A2{D`R;$O zk2M}MJt949kXL>hG^K6E)y70)xX}Zzi`NZL81@@(fqs3C0ryzEG%o7j)jtJ6f(rdy zeU#pz`%(8HzU+_a+CXMb)&8V?P1~(4(~k8{y=Ha(su}C@dipB2z{fYC^@A0d)9ICE zFe+G@&@ff$%%;?SM*iqzM761OaR-h@2mxl%fqwRK=v+V_^h-%dpO4$Yd^*rG+mFVa z!)r|GoQLaZD)sIxj>ea$gc4yGG0Vxy+OsD$?*f+d$8uh42FkCetVJ~*3p<=&E=DMNxSaeLF(m91j z4N5@}Qk=~8_C`k71|cm#=}aZppahCe=Oii`WUrUbiL`xC@{dwFCos%6G9UCfKA-FB z@KiceP+Hu;NO5=czJOianM^OMrIP5wL5^M`{eDWQbrrzra?$ zRq0GXJ>C_#HdNHbD4p??{-uOX)EP(BUrLax?u?~9UrGU(pK&-PoE5NNT*fl95os8txSYEjO%(c1fIv2fYXGL!Zhhw z%6d-Ye;%fKw6Xu zR67~?Diq@qN}rzRqZvZKoaeI@Od(&fk9=nkWgvi-0#Pn(U40oSp6vRLO^;X8M5Qx; zn!mz>M(Olthr&8$hymF5z_8O{3?D>@$0?modhaVPASsddYsnAQisbxS3dC|0*pNX) zHlez>zESqZ^E@N0+!Ecy8mnT zhVAsGSH6})02zg>&hpBd8un$zou>B~q(qr;7Rb-#aMlG`R0nxqkV3KEJ=tKFS2S#O zOCe8H81ql-DohJJEg5*Rq z9vHZw-^;2(gw;s#7kNHd8oJ1bTu;?%Ku7y7N)XEL)Y20dr4R`5YS_*z+rlK3aV2By z3sLD{*Q3a?EvgW#dT-!*43g5Zi+;Vx1Z6vz$;dF38^JUL*z@e>aHV4hC4K{{l+v-C zmVP6}2}%dE73nO4U7^O_r?B=9CMX?S>F#eB38G^Qz447S3D4P%Ci-P<%=A zdMk><@g?tQ#E3uK<+T^S%ya4v|_k)+xQOi&)tzs1S=kf7B3KXIHxFk!W zpWNXvnbuJax#NzO9K&r5*CsNWzyb@xRj!N2I9FC3Kv5_7v4iAh_IyPWx zVoEEZhsWMQ?771vkZv;F zZI4qr+;plW9L%|nwKySWQ{J}uB1M*l;w|UO>bb4wajr_^agwOB>|#V$9!}d(01-Z#Hid50mkt@q}@oF@1?K76QOb9q0~2xgpgczy#w`{ZxIZ?mOLky2DTbYSJy#g=kM{ zAJ^{DF3~!H>qX7WnqK_-AVF@arK-6u(J(_kK8hBFxMrH<<6aoN3`!qf?WAWyT!DJ| zxP#saaU~l9XwOXrk%k!gxRol? zUE@%Jh3-jrMcd@#W)N87Gis`;sIMg3mp)B*SyJWW+(ZR~LZ+mi{Wezn%f~&iiXvHz z>Ex<#grLA*)__zah0bC!H<0d}G0PQ)fS#&mxukIUxDEv&p91Z$>Qcx(kA%w7(&gh? z5F&G_ZnT#_ot)(wW0sF=jCJ1NU%787s5b}6J;mxn~zC8LaM}o%CD= z6BO#%L1!~uLWtb69ZMvLR~=nmzqF!$U1Mcgbe7z+4Kjyt8GUM1Fdm!*Fajg@Y$bOl z6Nc*9g5D?5sJ4P|m;>!;!b5L97`62wbTPYIGMb;M)I8PicOV!n6U`f3U1FZ z-8B-Z7v-J?wU5m68M6rm>uWVox^GBJk$dW?X0~ernybScO($)zmk+%%n~haZE#;)m za?+#i=w7_sQ$yZ!Trd;dQ%$qxxDrvM3PonpcWJYHXzv_0_dS*L#2jYRp=Tp*(kZvE zt@foC_Z0X*BCclxnddTDy`Bn`nnEYW+5IRVs|lsnvt}5H=`4sagv&jvX~BFZtJSlLYUlG& zSV;%wyI_2`rw~`lRAAUxMc=&!LC9a*vrP~P>{$USW)khQWrtYO7RWuzL6|IoG`Yh` ztGWu}&9mj6Ww=wiDQuF%j~?$Th=Wbpo~2k(~5! z;s(61nrBj14xh&vbRx&)43&GPU+u#0Mz28bnP$kx%zgW7ZUohq6~sU9G`N}7!$31U`#PwoNAN!m3hwT-12aM+a1==Gw+t%9_f}{SD^?vIl zt7Q4a@&q1B*%m9Tl09bLYMx?_Fnwiu-_&N>4E2yOk8?P;BaLqupEPzrxTerJ&T!dq z0yY;~_>ujZ{uzDjJ^HOUxij=*bl>0!v|1OZ?bjZKOii5Dra7rSqPB%7S?n_VN8AZWhP-_AHc# zCy{%uGaF4$q(gI^!N7I`RvC-|FUSa_p}9`jlNnAy(FpKdxt-MgDAk2-&3F2tXdFe)cj8+(%&dXMz@}7@U|A*)k269hKuhTl7A-cE$-^;VjylVc zJ(^+`IF}#*7XJe0WRzo^m3-RQQZymaPabB*y~46!)`VRo_v1!&9RCh_$-`sV0B6me z&B3?#J~dAsj-WAF&iO&|a5x*l1&v$_>~6emaDAB|4~L=REUIZOO7zDdbGq4ID&nbYK9CvvPNZ>4AwJ`KYX&B=D+{2vx+OSW?|#-BY_ zViv#}64!mhqmmIY@p8s%s6-z2qrPlsX{0>ti%KIGxT_oCKNt(93%5#@2EBKuJnUm! z&BQJGa*D>0lH<&k@N>PqZI_lq??Oiv|oms#IRgv zFcv6N1&y3v&D`f;P@cuG$v|dz-`=tEuqUm_<$K6Zw<5P$9=547dff za}3VuVJr0}y3)`~3wb8F!Z9Xhe1qJS_s<2sv>?e94~PkSDDSRYi&A~<@-TbPc+anf zi{-}N+d}1GBmE-va14UXpGaD1XALXx$wQ2 z%&uy`vD?agI@MMbYsis*+eH;Au3WwR+fF*B26m9=1XmIu+bMkl5M%>l1*a@=}KmUsw7CRvha7IJ>7dye}zp#N`UF;m6 zruq3juAP&C`xunkYBwboK^MncKN1J~{WM1YIslyU3l*v;fa{snBF)NoLKNWVf8GF+ zIq39ns&oL)_1AnSxc?W{)A@WSJoNnBM?M8CaQau8R)87OTv$it1$v}T4*H}|?Gwf9}C2AaMLw5ZQ>8vwl zBi*lTsAz=tQq315z2))x#xa_o-?=ddT2S?yGRk-k*2GV=d5IGq950m8-AkO1YyJ6c zI>rO1f27k(oMFM53nko!Ckj=fjnBBc8jG+FyhTAvol>*r^bgm-3{lPX7|<+Md+Ba0 zS-%xEoK<_lqpXfMZ%77;%Wg6G4k93mBAc?P2!b1+9uA9wA}H=V^1dA?ptRJd+|o2FQ`1UqQOdeoJ65(A z(7kcP((2yswVUGa|D8El-rw(EemL{a%sVsh%ri63Jo7xymzBqm1e^O^z2JIg6};){ z1Xl!Vn0t2yR>i;Xj$n1%{;vpBQbm6A%y3X~^NsU`^UMvF$U;UFVmSf+P zU4x7Aax;{SZ~ln|LMXq26WTv$MFo4~+5+0mV{ZPDdMeD33Uej>y}}%&h(1bQmF7R; z#XrzzmF75<`6K;QY38cY*D5GvhQvG|2%m8S10$8%U{PRe8Mdu`4bz1*Y+$l!!7bx*ME;@ zRnDilg`DaxQ85A**;g)w8N64wI%*M|f6A`S8>3pt;g|Aa=(&YvV6NSK^|z=f@>yg~ z*2%v5J_)&$0BOpLVwy77=F;Xx{HtG~rw~BN-;I1VcgN>)AjC4xp=*oyc=XUHyBWGy zUtQ%oO}P$+62pOeWY=cXG&?WtBCSIpSoYP>NNI2y!NwP7M&^&^TA53WDfFKC=JTK0 z&B5{*)BEz-Ktnie>M*S^&67`rlzg; ztFC5Q$egBzm22u)*R47)Uu@Q3YTf*T^h?-m>(kMXi$~^I3(Z?%-hsr=>FN?jN_|=v zDb=GC_WDZls|QOcyZIR`Wmuq3L$eyq%%|106|}FOkMXDUDgu78KG+flW2d+a-t1a4 z{o=~>2?aLrOsYGX;K!EP8>6Hqn$y6yfsbh`0s*o<=G29kgiIl;T>xj-meYj>GZX=D ze#8Q1@?2^LbabC05F0a`k2j3;Pa~Bqw?ek{As6g4ZEgU^{gltN=!U9UT#Tp04i{@zBvE1xK zpEsGus+jv4@@h86yFxk5<~(|prS5Mw2eOdg`S+U5hcO^SWwh!swqxG7NCzG>M=La= z=`WA5g>$Hs{)q^rT%h11<}`&Sg8jn#&k;tXL$hcnVv+nZy>$c&pC+7sKEj4!sDuKK z@*-cN{G;Yrg(i$vA7x!SR7{5vfp=b{_l}wa6&iuAA2kCeZD=ML9yddG^2Q4k|F}6= zp$Vm#kMnwps2LGRIZrzgn5qfkTgUtms01_o*hw*bl8ii~$A)Iy9f9HSoBdxA(8W7P z|9aeJ?6aj3G+*GjcjOIq^gjz zpF)QoGR*hjT7b{f_fMKrbsAvB0+?<-g@nUSG~+2V3}%K3Y4THMj(vRNIXd$cXzzii z%pnSmjXi)OhYG0p2{TtseU^%jV~8S;o5K|vD|^U7dOqzq&imjDJ$sz>sD=8DGuj-= ze|szX;Py*^SfG_%t@F+^5;V0Oj^+wuKE%r5%Xn&3%RfPoSO~PqTUg*aNF) z3RRup^_-%%6Rd;$>HG=aLBJ?EVdj{BH%`)wljxm@ljaD8#*aPZ;ME-3d6MlKH%`#C zlc18fPqI;jo0gMi_=pA5@_HaCQ2n;Z^1LJt9)hQN(wE_Gi$K8 zWJajy^hai&^Uqy2@5Iu4Z71b_U>;+W-TXBG(kVr5BW!!2)(b%H^-N6w+|^F_?!%hR zmXpyuNUwdsrrot2H1L5rWt?gP&?@e{hg=t*=PI&yVlao?QdGO{%7gxT=L${#&^+B= zW*&L7Zp7w{x#hd~9G(2oY&L5K{%IJ{fT)}l+1?>3-@-Mkib6u#gXRTiDP{* z!L5m2_{0p?;5ge;-zVnasNV*DRr6wosnM74Uoos{<9P1TpPE-F+?Dk3r{=5_*)6$0 z_8d-owRP)53Y*|ByAJ3IWA<}@bc~Yjif84@#y%gq_(( zu^e%(eRqVMc{Hm&h3|OJeP-SyPou=o&AHgp|A*Fm&bgCVdh&BKd?sGoO<#O&UZ{`- z)9Lrk0ZQ4$b9CZ;vxQcCVb+es^5yKEk7?Hz=9LO~5Y>KZj-~CNp)2#gG@Ie>1RHD3 zm*yB(Xy=z^*!kTYrZ2z5dEwPB(f?jwnFUv9`d8*MB;KOKUzulusfdb#D*`1YU7sIJ zetm4qyY?VG&}R;%x<0lw-n_}43NUz)6#9W#IDf0ptRAyXb3`_m$r^`DJB&Yq39U9x zHijDhWw;-X=In-4xS4w#J{_jQx!kb(-`(GLKkI$~^2P?Zmt*Re@8}=X*XyU~N9*07 zdij#ueQvcFVJkGeKhZs*YsFdj$-DMxn}}|Z`m}kZoZ9<6!Y7K@pP#;D-*DEJ!uqJnrEYq#j`C5qr{$ZIE$Ne zo9h-Y<`P@>>nZl6Vxsu-SSEKyWTx1Y0-VXBEJ%`J4RxjnlFXj5wD(Mr1%V_wf2JrI zV&gG*&&+4!;+DKR_=;$OXg(2y8B1?0nH>`3C-yM$T_7Vz7k%FeMT$M~H09Z%C=?e* z&CeFW7{7;UN+(leJp}O)Vowa{A&Cyu&kki*G|>>=OsAi&!KM9|h|-jcJs5NHlH)QW z^SPoNydH_0g(b9eHa@q#VRj-c;Cn{X$IlfpDR>0ZAZ9k_*vPmP7X-7!o^X&%9i5(* z7fkD(FJhM`P~3xv>d?~Jel{PmM}XMGiuN-159k(G0P!%edA|Uqi1-0D}!02S7>fSOAVa-;O&tRuG%nq++#nBX=GPWz+Y`-vHpBaG5=edS$_75 zCiu~$b45VP>+w~UL$f>SfFX)bH_lGhC5b&g=*$dq95DFOm2*XK3(*6v_gqmq0;8zt zd=a}q@S?Tni`a#mCp~_?2u?M6Omz7?|4bwOa=wUNRv9Szg`#MS*yDk|GJ{oS=O(lP zf%WN#cBjS{ir8(Jp6+{rkF^_}eW8e5_2}sH7mDI>GoVFRh32vo3|@pKeaq|51A}g? z*rS085X^m>XD6ueIclnSvB(lC_NZ9j;n3nbk1TE}YR1)f1KeLHB%m}U?S8Q+6kn~t zDPt->Wsov^b`ZPSk%OR8DLxxFJGfqyQP4|8kknt?Mwu@a!Qsfot+;J1CNA)L-j(U% z7J9^$X*0d_Qjukxc#&N;TJMOb*l$Z6+-qOl$cg2SOld^8WEL-Oz-We1RnBbR>0aW+ z^$feq@#W^!IAiX1CmY~pj7$wL;mlrTgmQ0zsfdJuR=5W$+^5=qpE7aOVXLQyRW zSVnmli=sosi%T&up}$ECSY|Ffc>Sq#BsS0k7mFZXy;x5s_Yw=ebFs*Z<}JY)3}8p< ztWfgoDN1w`FD}+>clX+!N?F>ROp4B%Jy$hHyjVvAJwB9t`wnf$xDRbMRk)urO*JK%Y$l!YJNKQ&cWG>>WvxO3kmFDb zykiYDa50(-mU*P9ML3dXhgm{se3&IptC?_D zOlOz{yVp=1JrHJz;Qaf0^w%&;szNiKEa4U~UqiJtE8GItwKv|S<>8img(i*thR{dh z7IqwjeIK6qtM5>FgayZ!aWpH!!j3Q1e2XvVXE|4k+0pvO+w@fg3OE~K0c)Si9@z24 zK_}uYq0HFpE!sXBpHe;Af-__adtisSD!PnMV(D+v<L8FOe2@4q3=g76wH)vKAo{o4VWYwY95(FOgO+Q_>{X@E04#=x%|nkTDS2f*Uz_PMd)((y3twS2_(6Qv{WQFV<>`C%D*&(+qxS>! zYp>gJ81hVW8}FvTE%q_pQaC%baYU`-IIGUoh673KeIUh8KdPyM`Hl)siT8q&48T?P z*Q#FCaqyGX0Erh=I^|c&ca_JK9m;z62rE#IS9&NuQk(;CSq+pdz5EaIQ}R{-#7D_) z(YsleAeuYV;)(rXU>qHqW&z_gzzpY7=_m6nUyA*-+!yK^11WTSng#sYKr%!xN%Yg- ze0^xrbc=VOI53v6B8AIWa6~}YZ;m*Sq$xJerrL#L)&l48YyMD%53 z;S#8nLe$5^DWIbNdK@PXByhaz>~DQ7NlSdKAUmS>_xFQRfn1OJbR%D6r7YD+4)+k8k3!|b(ivt4oF?`ar?j`ANp)cDnNkx*VB(vQWqky zj!LGcuF{JAYgO}rjQrEo)Cl@vYHE~O>}Oi9<^sp6`j9Xb#(ynh|7seO$9kxL70t}! zZEm5Bd8wGX{VQpIUMf7a^{?QkrJ!@=e$cJzZ{}l}bq-^RrzXPQ zM{llQd=|$z$_I8UW*`5_68o3IT~$6MeN+-eoAY^1OX*-fuc?7k@#T+8tn~N%RH&Qu z*Rx@!*7M~)P^;))!YgTMUb6yoAfNw^7W)@ddO<2QQTppxLwPh8PK{*YVT?-c?jN9o zV|}6A8;0@QJ88i6Z`FKQ1YQe&RWlYjAH*HaQ43J z!4-u@F~wCgV(J*qpX(Q2&J1?gyLGTp=RZMWeM2Zxj${9P`W|&A ziv9Ckr8!nGhhyAL!79`-_qSO7;YdwK=g*;W(>Qs}rUlbdL(Y|0R9UL+iZ5j6^*bz= z6tv@z+MB+3&~gAWphL9zA;t*wy-g<{vOqj^eH`^YWLb}-N2y{LV<`LHB5@bnoUf&IIUv8Pg$_zF#W*b)hr<9akD9khIiva?8OgOq&bHn$kC1B(oJGYmuCeVKI2?go>oM|93t)Bdjyq@m7dJH3LN5&ZaB{7l zbL9-}jy<_??wgrN04I(`=vf zS##T!nZKzSc2x$H#@ag8e$6eCpR#zvfB`6~E99DA`605dc8$x~#z^xu|Dm5w zS$rq39KY~J)vjsbcE)ne4L)0H*8p=2@9-hez^ky?OL@oMLazB2ee$Fw-bZ$IqN^Vp z8?upEx9sW!S4VSW7nX2@c0OfE50G7jXK&m~ z-!-f(^)dRZtGKk^$Ct$)roiKtBwyK8E^o(Mu7PGrhp6VbCBjQ~)paU!K^@9|d6XVG zZb?9sT?em`p=U1~q|cA@rX{;jjdv11Bu- zb$2!H4h6B;J@noQ-uJO1q=YYF@w>_GBrgVMPzLm=h6?)S)lcC>jVqn@bWxc#`->?Ll-Q5YzxVu z=I5CZ=+@IL;7=EyXB%eU$8-r#d|%6^8D}jK6m*u!k!~GlPbJ9l5j}dA@3dL;##y%a z-g=7ufdI5OuJBosi#2MbDXb-#H0GRTKC(T@0@3vRIktuOeMk%O#J9)E2@otR$a8AW zXv#cqflkt`Cw_~HqC@BT3m;JLE0(xil$gQy5LAPkIvA~Bb758Dp6=M4gcYlk7Trm} z=F<26od?#SNtFG9B`8&P>v5MVTl0zyV3zU9LQYb-u4nez<+~%;s}pJ03!Ei6N`K^m zzFsOm!^Ixg)5-Lr5byT~Fg$39L=7`_MdgP(gE7ty^AZd_xwaB>5W) zeEehwj{SE=mru~_Cr!Te2NX#=?Z#v^yM+7Ze8>gMd{EH!eEQ;|C61oB$Qhv1>}e6I z{(_Jpo{>l%HT75)DrLb+Vg>2ZB^N*WylP{OIwpQK6? zhu4w+dh2+!U@eudw?cV&cnv+U-Z~9|)%3-BD{f(iSCM*yH5v7{sG)K!$K@qXuk$xp zp)NkW5*KY{l#pys(V?^zyr!mPd$MZ2INVI8jn;BxYQhn;j=aW)`jWKKid(MX<#?@} z7NpqIbOqvYBaX0jgd?mUnKoIWCqBH4vNu_A_8VSG_D$BQc%uQ$E~JI2_9UF`hU=++ zlND#>;Uze5X3&qHd-_n&W;O=HIC5>aLK-t%hpvgFka1A`4itx(86hM#&KtFA@!s2bXl7hBbCm~Ql3%Bu% z<>;z3+BCr)0XvFe$TGKC$Hs`m?2HxdI-{b3hoJX=0d~7^wsE-&)iB=&8T_zHy`L`h zGcZ>gtHj|sj4t5M^xsnhsU#iLmM#v@rjni3iKwxR?%!!`LZFoXXQvgHX~VN9;Xy0z zP=`xs`h(VN1d8c_2RW(06dwxfJKrzyrfHMxF}SfBF2c!mBDGGkhv}lk;Td3NCekyL z?BS|0;_!4@^pF+i62sGwDUJLy?4hZ?;&36FiNh{VrTB)!Os5|f&S!nZ;Q~w^o^V(E zivi+rK7Id?)f_Gk=i$w0ekMf@V&Bb;Fkv4ZCJs-V%^v}}wgHR9XpKz$uKIv_xw;ZO z^1oF*DhZAYMnSfDOgVZn%yj+=A4D4z7NDyghH1`Jd8F(rTJ?+U4aHP(I2UBPgsNVE zAwcIYD@<#KbI@aUa!j_T!Z2Ytn+^LOMU`KuSsZ2-O_BV3%?ueHVwSMXc)Itc^oind zCZ+7QPC@~bA*EYJQJL_Nh{>KoFYe|eI7tof5EOcG8o&l_FY=?1JyzUr4^O1&d#tc< z8BV9|d#tbl7@k09_gE*Rpz)9#E~HbT_H@-GaX5{}6Q9}RP(EBqZVv;1*dD8q4R!ZArJGi$I{$~t!XGbiFQ0}O-0%4az28xo5Q?ydE#&))&Uq0 zeUs-)w;r}8fKn2;$f7A{P0N~m{KaAyPnnNc;j@1jH}a2IaltzrONSoei$V;&|A-YL ztKn$+C6tdq6fyi(W&D?K=NN_li z*6!#1VS})8IfbtEw9xmF_OYt*;;@x&@3&4sCJPIgX~jBE4V53TT5RI5na>Y)_T;S@ zalnF)hv)bM)_A<_57xw-KXoooKiT^rR(d~(n_}}|8qOFsMi@t3*5R<90@PDF7DZqB z`2g=9AF>>@rlKNmykpK=108ba9gV#M_h<*liNm94*+FX>mOU@#8`VmOH+hE9I|r== z7&A}4((c^s=}n1`T4DY)Y(jhe^IBZJ`*831^ayd-NOh0$-N8WjKWdG`ShAZVUzQ8? zAQM(KcY5zpYZ4<7xQ1;FOGe>tAhujO6>E=os~3lL%uTTuojFn-ObOe=*gCI;@N)}Y z3WM--MI1;HouQ%2+rwB_s>#q6hU@ZS6(zLs7$q%j3u7b!iBek_+rH%VPFvXcWN}!A zS!4!IP@Nr?L$2RZ;;n7J#jYQTT^}#rV#sOvG$Fwrts5iW+5+m%hbL-#9EkqbW_m<~ zdtUL@CVEEg`wf_Q-v`fWQ{7|Tef7WSuKJ?BN+y`~RK;7HA`*kTg4ZNhi z0%s~)v~#o(nt$Vp<&b6>@K>VLKdXD-AkD5Gqq+?n??%8pW;~^=Qv9swf^XjMT^6_#3N~=H0F2D%n-!R#EL-rglUjh`P+OBY{6~`ET88 z4k-xRLmt9>exCW_?qWNjl|}QVkwvGMNnLZeKir>6rv^}hP@SgAle%V8@t`$dCv}yv z&Cx*e!Ac+)3e`EPda0|FxesC4kh)+jH-t@A>Y7H4 zLs&ngu0ndml~h1)4Plv-y7EbW)tcllb>*RF%N!WCp!8U*Nd z)Er%12-ogi<0$5uH4@ROh+al#;w)C0thBk&=4)2?BI`<_C$C`}lDd*HHIwQ7nCf6S zp6D7&rt7>{lW5X)Y;0237+P}O8m*VQn8oG1|OSB zA#v3}B9^+MXxk4~UvzdP8=CnvCbBw^I^%%OhyfbS2k4nNc>luOi`f0H4PJ-3!r8Ep zCB8bu4ZRY^24z0Y@~RHPsLV%^0vnb2Bcn1h`1A1Z8c-pPP#Y3)ud7X6PUHt`Xby+k8B8O+u)3) z%S6-FHn?%?GSWS2TWW~Z#Wa3H=QX#~y0~BF{s=a!SmZoF0l73hsv1-yb-9yPV`D3Y zp2lfx@FCLWMvF8ywutCxhsHJq0WE#3vB42vmjyr3R@lpVt5n4=r#Y zUlm4&e5$>5X;PO8GXO8?f`urhaUp-49yFiJZ&gQ-ZPi+&jCG^ukF zZFRGaw@RHGF?B-GD7INV$kzt&{Q*+v2Dc^>oe627fP|>&Q#b`mPfgGkP0b z<#w*2LcJ{zWiwr}IrO7{^;ozi>SWlUq4Qu($XJ)1;M!pM-TR_V>TID4$d4CS(ieIg zoU3-Oz?aXV{Q=dfaO~FE%zc&|ZkXy%3*Bv4pgWsrtGg`{uQF{i>pTXcw3=Imv!-rO zpCENM(j|9WI|wWTz+7z)X6-fPo)c%>I4-a zFls2)z(=5(Dh;-AI;qp4F7w(xk&=$MhtUOttpa_`(LU!n8eM%2@Y2g&z0U_ropwqx z+TbFra}mup+Tdccb0KXq+5q3%xquECZF9n<&Pula&C3ZXDJfxl=!3mGL$JR-(feq6 zp43^vIrPiF2)>kHvL&FZa(tWrTy~A#vWEX;NS*U>cD2*e!0HKDIXdTIuUSQon}RpJ zWwNEJlBCYL^v72P_|xy4L%+T%U>)e3O-YvoOq0$sT6Reoj}9rt$`(Dhp}CQJQ#=e; z0L+8hE6m+dh}1cY{%}cv6SmG0P#gRi2ZMA`S25bxOx$Jm#$ZtSbg6SDsJWRA3)%40 zk0>~I>nx(jKuQ&S@C_T-yGVBZ9TFklJ78?JS@RuM1ho zm{0%ny1*tt9wq)kh(z~KRpUSvM%+XCsed?%&UxD8A=~t8WmU2dWu^6+8!zdZij4^;g@} zPpT#LZ20>5R&@a`a!XW`RW@b6@`Ca)Wefa9*c87izEZrVIIeh5FIbeCXv{yn@{X7q9RW2g}esfyFJg4NWk(N8Cs#TpTRL1dGKp zu0v`=@@QK+CayR*i}t45!UDy?5{#yqC*u~_^*df1EasXFJIm*q>1I!bbz6WqI1}R; z%rk`KFo3Gxf}Y}F5u-I8F%oYS2WMd3_#zHgf9$W1I5-^yY%S&l&%Tbwr=!vwUa8CGl>x1~Qh*AJwCuam zl73H1N)HkTvuNui8+0B9GwIMITUwYnIN6oEuEl}-9G-h57$**9aK6v$;kmwK%CPxh zU?%Yq#R!L#mCa_=xUke=*P{`q>8 zm99Nh5vW5O$MQA~d_BsWewd7fRvb(sT_$!0ac~Sd^aU2`*i{jr87mGZswU8wf8_?y z=1d!0ObjOQQMimOdv;gYpte2;CnQY!>k3?wT+6h1&-x^XmpMVe(+{97)}B3t%v9^{<()Qjq;(AYJcD9;-J8X zgcUKhiIL?<2yG1IZDh|mbqo{RmBzzpRS1qv-o=gVmB!i}aS&!M)&9BB;$RRbT3Fu} zF9QVzatg#{Up2eBEOrG@IFzkw{H>YdAk+L0F0QFz3S2d8uG|UYOD#OD8pca&>uMQs z-3j7L&EQTWDe7T#J%%yBHH<011wL8h?}sn-=Y!#S3}5Fx!kE%n;7`+Q{ry0z-mGJ0u7RYYp$2u|38Au4w6zuh=;ELkovQUuVU{~P zwoda?rHF$jx?SrJS<|2qdqWz{s`K}y;yV8T#29#kLZ3#1YWG%*g4)!e2R&TJYj%eb zwEqNT(qsQfrCAdMAM#nuz&8ioz<}T;V*EagBr4ER)nZRp7fI|CJsHTAp$v3O%s|Nq+Xyz)WJ@wGxC4p45)Ia!K zmJO`_B3Zx8)C0e?dtrCqVp?DtZyIHM*Lcc!(Aa8hf>XQ{qt4K8c-wHyP;V$Pj5a7d zp7&Vok>e5I{v_O-mp7*o*6ZL-eQuQ)AacfU*|atP{nd8NB4W)ob8nsi~Cz28lz{aUO^$ty=}( zj|`TwnbmsN6LL(WJqvA6GaV|#Nji)?ZIuD=I0WnJ;QE39`f;HRGa9zkv+4`HDR7Yu zkfTF+RJ>{mPN<7)!0Uy9^r89!Kl;R0>4Vu0bLe;L3#?=ctb_ruIF!pr37YNfa-3Jr zLpBk{&tEOV8AODc^X)}AwuwVoG{$a&oN_3W8trVu8k!71zBv?9J|mn?+ij8Y;t-Rv znDGg9tD#Nl`bC#b;$6mKM$4Op`)=t#T|xwPH|`gwAVO^1b9h)#2DK*5!MkeUvSqyEDJYfUQI9usg^Hk87afZd+~#AmEH1RJ-zAjX5enx;qp} zb6qi`Y3oq|Y{pOo9X|@^q2f?Dy?a!E2!AMyf*$AP2vp( z7iI8YEFS7Ru{mp8u@Dc7Ln_|L+7cdD!eW%Jn0y>SN^A2sAV%SealMzb28*9-yL`nw z1Lgw91)H-9{{o#=LC&gRXI02K;LRM`RtTxL>3zuN+i^$>01)10<20jSR2yD2)EP`3 z10E+l?)QlEP{5#ezI&v*32=B%;7+hoAL90n+fz7}Epwaf7KDS@C%P(KhW3&+8z!{R zX*OzRXe@BK`h)sY^`F&G1KQGC^*;Qq&Vdv2KHLV@DyPBU>OU3J{s1WSM#XrA5qKoM zICNFX6J-Cvec(H?_t^gs_n+47hsb}0t^)8VDY_tt{{N|X&;Xhd+T)Ctz{?n)@k&XR$yp#g;;p& zXxm%%ak>ntwE(#*>C#*F393}7HJ|R)2@s96=BX!o0j6@+@?10Z>lips>r@JL6U=j^ z)+u0$%|*;j-hK#Nc8`);b3sLcMLC7JJZ>khH1_&PtvQGdEy^w{Eba?Hov2sSEOq93Q{=OD zCg*ESq&)@!pa`uAblJdMLbt}F6O!oVXYIj^*y7M#5i^=uv-ZG!UMp)<@5|Gr)>s;6 z6lPeZ))>~&Gn#9bAq#QE2EbRuORdp#z$ie%*cwIe8igG6PNW(l7Zd&ToP7cN_R+N7 z#6&Tz5ib3g?6Y2h^!W2oV6jN8;q+xzJiLUrhSANec!uF9(3tFah@4wPX;F538CuFP z_~>}$Ay81AwBOzrvf!3JzQ!Hq?I}Gkj%CM z6(=VilG#=uF66{J5U@~UE-%SUOLF7OvZU4ktk$6@iC=5&gD4A5sC!?)s4&y$c$UEL zd0Z)H;dY+87>|@%{V?tmY4Qv9FgBNcDRfGF40j}*C4=(Q%ckw7T9b$Iit$lnqv03B zYlcS*O@`?PUylnO)7{^5AFChGFVIKnRc>e9*17pYh;$ZlVS<9&VUvwBAi1kfGHn5V_$+2BZ4 zrAQrP=^Y;-6*-fzafy%7A67hfQxAh7!0YyOkW^?mIq+qF$tR;!KzHD!ygPZZ=xSLtZZI(_|irzbCBNQ zLkF#bIZx{F#uTywEIb)gi0Rd|C3{I7qedd3t?h~&>nnA5AulDqv?)k<1i3U!i)|uhmqM6xZ>}SX76tRS)#^mA?P=6F z)lsjTBXy|M$FQK`+ge0no+AAl@|^ z&KTMaDZo+b_88;-H}@0nTix^ZxAkx8*XZNjK6cygrqsO-EbRoiYCnsa7X?t=`!rJk zZ}y7%A$7glUG*Qqp4}Q%HoEnD25q3)pbZQMleEfM$(E1=Az#@n)XEq zqfuOhI*B(GVHD-xYlr4qlwd?I8#$tQis8*3MT0Q{fPtJ|NMA;${#KQxDwLd_)Ep~J!}}(>5X;sCr;%>O3Y(D8 zfHS}r@*1p~i9O!wLA`N88PeTpbUZ_-b?T`pUI2oy(+$i(J}v!wRh(|BJgF#CM9PQ3aWja6 zEplI&N53aKC=VlPi~xTK$%4-C8-ho)B)XF$g<)BUdb&SFfU1P(#=y_r>GETvg6Pc@ zA;(J+buI~O%bMb4R!P)SU@F@VL=8Z2q7uWOMrTs0!gaGG zQNc-cAf>7ZOT8$k^l@yd7iF|%94n}88|@#*=&WrkeKC&RleKLjzcd`Nq_)j?wUP#& zfVjLQjn&b%iMFJ%+1Iv_iY(cII$(HifXJwZewtU|PwMe(%WPW@f}1lU4IR%~)V7Wv z4i2YPL7*VDt)-X8Gp4m|4W$1YDEI`V{~6<}#;c}DZL6thf-oIvt3d1vakCG>*-dc)_g@CwuZokcqqR`}4LCRM@mS!!F1jXBgM^#m0@!Eidj(DjUy+Un@B4BoZ1 z^hE~aciU=6K3T9LP))&;+1}jdp!CV?!mzE1nh-!0c65IkT|S8J&zM{l;kHF;Tg0Yc zDy@8YR5-b33UdG;yO43F5nT3pPo_|e_ZDzoyD_sW0@J^(66fS*I*^H#%ObT^&<|As zR$%0oV;Y6dbivXcU^_IleNX#HZS!66+>iGG@D(pX)23&I)HaVY904t;Z!S|IpGO04 z%?hIbgjR)9rZqcTy&WlY7y$3R_=4H=RyFXLrM5EqXLSHnY1&HBTXpoAP?hCYEw#;J zJA{=SL9i^G7*Jzv(p=DN)8wds z0Z7Sq^&Isi?17J~R;c2^dA_6URIXB{E9Hul3cDgk;VmDOeziI&=vXx1Dd#v-*djn%-inr67v0XqeE@!+zO zr1nJGJ%^pV+Y>8s@Vts6C9%%oh@DQai(~3gxBUU09UV z9!fXovw7JbLXqX{xZMtwYLNLQPsbQ2&$S29!EzxV>4EfZxc~s+b{i(=EZQ!DJ9^a1 zA?T(^?aaSL4ZY*#$YQTp=y(Nx#Y{g}u+^y@qTNaX=dgBvYN}+n?CpMZq>}B=?Y=Zn z$(D?E%;W_;;7#QVgfx@X&Ro3~mpRtfG1)VnDHr_dm)EikssyRsi~hWT9lzT>xt7Qd zAIDf7y26B}7Xcj45wA*=+Kp7dPylvfyMgvCWKxQD4{WPTXr-?MXa-WdJ9#Z)+its_ z3Kj{__h@&cdlvDb)!~EI(MmtZG**z7JnXz64Q1LHN7JsR8arD++EsMGES&ps78@N<(Hx8V)?pjnvb|R!-*zc;{zplyf~C^9%Lh z2i7sBJd>*a;|nD^tD};i9yiLpWTv-p^RmOV(lpOB!4!s5KEs~?Y|(C5VVG(dYY?z2|HI>o$7>$<0v#~JBf`VO{Zlxd>vFGg&vf_Kf31H} zzYQnONWIdn&+U1)d)&$aQS`0u4Y-@z39fgpE>XA5Tl-J#`#=Od4LR0gU;?IVW3(2n zR`acFNwG+ghb3c_LM^{0zXCTRyX1*-ujWQ8%yV$1 zAJg{H60mh?fQ1Ta2834yR#l)*H&y$&Ii&7#w#%z2X;WbkO{)_!1Ep@Z>_*hWcO<6E zZ@|mFX8~_DkB-#|;oGEcX6+tWYlrp$6JxxBwHbOoK2rA_SA0X0ov98!Z|{B9-h07K z>YmNeml;3w95R(*$%&|03m}75NM_CheBnaxSzvWBRhWpHHOp76!OPgMUcsU>vK4f* z8<#+&Er*&+!5ZuX!0Y00U?o`B*h|anI93=#8h(ZCbiEhwsl|9Jnk71*=FC?Sj`8Wj z{_CCz*mS{`EOi%wU-Pb6g%;(O%{5BhT-l;#)pC3r`>U6_r?XYE2Fq5>s$i*m8uc$0 zLb9Z8X5ryq(^8X+Lnr_7kh%+y)wc$6CkRnmeWmVvCK0M>M&V4i2T*GrtRX=3%A>3$ z9LQ`cEp!E@(8eV~Adt3l@s1gbFK;yVLm;f>(8(o?$Lh|e50*gmEp=zn%_VF?c4y*} zhZi)NCe<_6s5^ri>V+tvj7`Ea5?KQnq!yQHFtp?u7;77cK#P#NnKEkzEyx7~E~-t3 zKR+g{?4Ce3>V*&l;OMGBh*~Ulr|}joujd1E;c`1ZbR7Rs*HB#m_89YA7*W&MyoQZ4 z!{TN5t6(ufQ7Nb<9!X2^4~geFON{SgFnE`{&QHPH-2m0{veq=LZK!3s zz9WGksXK|jX%K=@)firN18)puOWlbW=Xm;IN_7Cx*t-+h-o;^%kpVy_Af=b^b@70k z=U*2`^-BfYSgAXf*Hdj@V*JATkBqgm6c8L9|S0r4EcpMeaImYe~RhvSv#>NTrb;phiUun~kf zCkL)I>L30V4%Bv5lbHK(m`Tm3h#*Cbpw=yVIE_0jIZaJ$>fN<3^@t-UT{JYv$!> zsj`^?$#-k8>!j|P4$=hzo|;a&l2vrMSx79x#8a|uAFEgsh!zBgufZwo9*~y;3BfFZ zb>m3FSj01@G5iHYv!MY3nn9JGsRGNu;UglC>)CwhbQjZ$VQP1MiGm$ z8OF5P!559wOmQ|+>RM06udPuQscRjhPDc|Xv3*!O&oHAh=*O?6lCP~H2ypO3N7E|Q z!@dt64a{^_7aFjd9{AeoXO+5E@oxoM0G~scrO40|Bz3jWt6y6I4cN63#F9n>Md)7C zxq{sPYPBM|8B-<_;8WFpIAwG-p(&Bv+X1u{c@Mt?2%ED=Sx%0>TKy4d{+a?+mU$*&+J$Mm}F!IJkaIsXzpS(KGgo(e=Tc%3)<17I(C_Dr-;8T=L7*of?TwMzAbYK7prtq}Gka5c8xlwuq< zo-}STPB#XFhj_~Huwk2FiXqyd^%(Nl;30SKbQknzaF;d#w`u=_lYAT0ww1a+L&0$m zc!VHmYpl{%YIC%HnjbWWHTP%=)!)FnZiPBRZBpHY|FDayr&N1Xt*Yg!8LBZVALXyG zwA-ij->NJG2k@riVMVUUIGmcUw-eHpc{ArsQ0OV?`ycuz}OINzN9EzDIy= zvU4S(;Q>B%o)7(Ca|D^l*=rHOMBxf_fpeqV=#6(&oXA|3w zUHQ40XDlGJBpkp$aT4y5|m#L%=a>PfNCFe4Jlg(G9D?6<3Q-dzCj;CJEh`HdJ0>ZWog)tS9(INOBq!5c z4tAv_|DKc#A>tBBZ0AD6#WdX&sG}wALeOH#S<7g-tfY{?@M!PDqaFrvn+yWitzAkHkHOY*joPzlb}4Yq(>PlG9G#wF^=4l5-K3 z3jeYxe8c2FsB9sxEPLimUd9ecv=4wIUO-tLoFlHJ&JHFIa5AL62Fm&gQoJh3S-$69 z!2v#bKGojK4jImQbm(6Gg>&h`y~1?F%pv`K0`#Pv&`-Wkh=ype3{8tDUBhqqZPK9aMPEuPTd;TJ`R807rr&h$Bwa~9oyAD45M(BJQ4VsK|MP3Yv(#hJ9SlS>ba z=uD^J9V9s!gB6KF_^2?9DO7=FG9AZ(>GX9cZ{;)!>Jnz6oI+~uVh1Q^0UhXK=M85* zhT2ZhH1eVEy4ZH(%p*&;5R@%Br}B0;W530z^|yjiCuEqpt;1-MmqI?-7mCshQH*Th~zMr z{t#;tCIY)K>`70PoauW)h4GjH6WEr)v)rA-AUVh5OMRh6gy=)PJ<}v-8m{;1h$|EQ z_#a4*!X+njF`Yp%zgC5)q9kW3eICjs$tk22pd%tVlWBq=#G^;YqDNQK;j~mAQr(1b zI9YNg(Tf5X%#NWS1tA-`6DcK(-FP_@&{KBu3ao^es9ROB{G62|drW591KqY_Q#97Z zFX48v9X5bhp=Hnkd5H<;EKhnkJks26;T*LEZo9*QvEHvg0^opXy}z5&t;B7D?w`6R zb=A61*!^wPWB8b_O=nTF*1opZ7LzK=h+=RNzrJj?I7S5>2ulyU!6ey+S$aP@{l9dCUsGg3JyOL?n!~BBS zHIBAF>_|sGNn-zMc?6I02)Qef{_!xsn{_3Sc{jgPb&aK@-JA{8HHK<;^ZQa4WQgFS zm%B!5%Q(t_>ut9QD>%pjNIkGPCS`TKk6K%iIKaacmIyxs=Dkn`ge}e$T3O_UbB{*M<8CebT2mF zX>wO2cKW4sc&{@@UnO@%fO6hWm!AVKD|nA1(?{+K=i%s$CRlf0X3wYBe&@*0Pn5gD zK=ZAp$M!ihK(6cxMJF$%zJ1QghQ)GM2xp0Tk@5>6 zU4iJewJ;s%oCXF*7vxy?I;MrnUH(`K5hzcv&i8=34jbgDau-yp_Bzth24Bv?fv)yr zvtr1+&#^2-?&AEvfZ1zXJy&^Lqq@BDBAQH#);c9kiQHwQqx(3Eugglq`#2e-%R-a( zJ7S~cE;H6n>}zrW_9O&|*`HyjKYL|{4d`wIdEuDGHF%1m5E)D(es00RHmzv%?D)H%{ z+WowQ8)ugiw3tQo{MrS6RPwxpO|VNro1T|AGngOm08DKM(Pf<6xsASfUIM+Rb1PY2 zkXFC}uHOq1C_J5a&~qvhA>y+Wf%`eAD_g^gTkY3X2;g z6d44RTuTfDSpQ<)1_4%`>AdNWK|b(XjxeXD*)eFP${+tgFldexxnYmiBvQaz+<1(_rtmnEI@edQtLBg!4h z7KpbNE5|7M`7Px1dG8%Zl#%SYn0$6s0bSP;y1yMVZNC^6L_?6>y`9ef(GgM4+}qGW zK^#Am3z+dAD|2t<)69dZ$^XNLKLFs<1Zi~s-

    -''' '''------------------------------------------------------------------------------------------------ +''' '''--------------------------------------------------------------------------------------------- Public NotInheritable Class CefRuntimeWrapper '''-------------------------------------------------------------------------------------------- @@ -24,9 +38,15 @@ Public NotInheritable Class CefRuntimeWrapper Private Sub New() End Sub + '''-------------------------------------------------------------------------------------------- + ''' + ''' Initialises the Cef Runtime that runs the Cef browser processes. + ''' + ''' True if successful else false + '''-------------------------------------------------------------------------------------------- Public Shared Function InitialiseCefRuntime() As Boolean - Try + If IsCefInitilised() Then Return False End If @@ -66,15 +86,16 @@ Public NotInheritable Class CefRuntimeWrapper Return Cef.Initialize(settings, performDependencyCheck:=True, browserProcessHandler:=Nothing) Catch ex As Exception - 'An excpetion "Could not load file or assembly 'CefSharp.Core.Runtime.dll' or one of its dependencies. The specified module could not be found.":"CefSharp.Core.Runtime.dll" + 'An exception "Could not load file or assembly 'CefSharp.Core.Runtime.dll' or one of its dependencies. The specified module could not be found.":"CefSharp.Core.Runtime.dll" 'could be thrown. Return False End Try - End Function - - + ''' + ''' Checks if Cef runtime is initialised + ''' + ''' true if already initialised else false Public Shared Function IsCefInitilised() As Boolean Try 'An excpetion "Could not load file or assembly 'CefSharp.Core.Runtime.dll' or one of its dependencies. The specified module could not be found.":"CefSharp.Core.Runtime.dll" @@ -85,13 +106,15 @@ Public NotInheritable Class CefRuntimeWrapper End Try End Function + ''' + ''' Stops the Cef runtime + ''' Public Shared Sub ShutDownCef() If IsCefInitilised() Then Cef.Shutdown() End If End Sub - 'todo. left here for future reference 'Private Shared Function GetCustomSheme() As CefCustomScheme ' Dim cefCustomScheme As New CefCustomScheme diff --git a/instat/UserControls/Webview/Windows/ucrWebViewer.vb b/instat/UserControls/Webview/Windows/ucrWebViewer.vb index b9f6cbccf5c..1b299cca687 100644 --- a/instat/UserControls/Webview/Windows/ucrWebViewer.vb +++ b/instat/UserControls/Webview/Windows/ucrWebViewer.vb @@ -18,7 +18,11 @@ Imports CefSharp.WinForms Imports CefSharp Imports CefSharp.DevTools.DOM -'todo. inherit panel? +'''-------------------------------------------------------------------------------------------- +''' +''' Control for viewing html output content +''' +'''-------------------------------------------------------------------------------------------- Public Class ucrWebViewer Inherits Panel @@ -73,11 +77,11 @@ Public Class ucrWebViewer MyBase.Dispose(bDisposing) End Sub - Private Sub InitializeComponent() - Me.SuspendLayout() - Me.ResumeLayout(False) + 'Private Sub InitializeComponent() + ' Me.SuspendLayout() + ' Me.ResumeLayout(False) - End Sub + 'End Sub 'Public Sub LoadUrl(strUrl As String) diff --git a/instat/UserControls/frmMaximiseOutput.vb b/instat/UserControls/frmMaximiseOutput.vb index 0c9b552ba8c..dcb0253abe3 100644 --- a/instat/UserControls/frmMaximiseOutput.vb +++ b/instat/UserControls/frmMaximiseOutput.vb @@ -1,8 +1,26 @@ -Imports System.IO +' R- Instat +' Copyright (C) 2015-2017 +' +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU General Public License for more details. +' +' You should have received a copy of the GNU General Public License +' along with this program. If not, see . +Imports System.IO Imports System.Runtime.InteropServices -Imports System.Windows.Controls -Imports CefSharp.DevTools +'''-------------------------------------------------------------------------------------------- +''' +''' Form for viewing maximised output content +''' +'''-------------------------------------------------------------------------------------------- Public Class frmMaximiseOutput Private _strDisplayedFileName As String = "" Private _strFileFilter As String = "" @@ -45,9 +63,13 @@ Public Class frmMaximiseOutput Return End If Case Else - 'todo. developer error + MessageBox.Show(Me, "The file type to be viewed is currently not suported", + "Developer Error", + MessageBoxButtons.OK, + MessageBoxIcon.Error) Return End Select + MyBase.Show() End Sub diff --git a/instat/UserControls/ucrTextViewer.vb b/instat/UserControls/ucrTextViewer.vb index f1994fa36f3..f51b2663ff0 100644 --- a/instat/UserControls/ucrTextViewer.vb +++ b/instat/UserControls/ucrTextViewer.vb @@ -1,22 +1,42 @@ -Imports System.IO +' R- Instat +' Copyright (C) 2015-2017 +' +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU General Public License for more details. +' +' You should have received a copy of the GNU General Public License +' along with this program. If not, see . +Imports System.IO Imports System.Runtime.InteropServices +'''-------------------------------------------------------------------------------------------- +''' +''' Control for viewing text output content +''' +'''-------------------------------------------------------------------------------------------- Public Class ucrTextViewer Inherits Panel - Public ReadOnly _richTextBox As RichTextBox + Public ReadOnly richTextBox As RichTextBox Public Sub New() - _richTextBox = New RichTextBox - _richTextBox.BorderStyle = BorderStyle.None - Me.Controls.Add(_richTextBox) - _richTextBox.Dock = DockStyle.Fill - AddHandler _richTextBox.KeyUp, AddressOf richTextBox_CopySelectedText + richTextBox = New RichTextBox + richTextBox.BorderStyle = BorderStyle.None + Me.Controls.Add(richTextBox) + richTextBox.Dock = DockStyle.Fill + AddHandler richTextBox.KeyUp, AddressOf richTextBox_CopySelectedText End Sub Public ReadOnly Property TextLength As Integer Get - Return _richTextBox.Text.Length + Return richTextBox.Text.Length End Get End Property @@ -29,14 +49,14 @@ Public Class ucrTextViewer End Sub Public Sub AddText(text As String) - _richTextBox.AppendText(text) - 'by default always set the height of this control to correspond to the heigh of the rich text box contents + richTextBox.AppendText(text) + 'by default always set the height of this control to correspond to the height of the rich text box contents 'todo. what happens when the rich text box has multiple fonts? - Me.Height = (_richTextBox.GetLineFromCharIndex(_richTextBox.Text.Length) + 1) * (_richTextBox.Font.Height + _richTextBox.Margin.Vertical) + 5 + Me.Height = (richTextBox.GetLineFromCharIndex(richTextBox.Text.Length) + 1) * (richTextBox.Font.Height + richTextBox.Margin.Vertical) + 5 End Sub Public Sub AddTextAndFormat(text As String, font As Font, color As Color) - Dim intStartSelection As Integer = _richTextBox.Text.Length + Dim intStartSelection As Integer = richTextBox.Text.Length AddText(text) FormatText(font, color, intStartSelection, text.Length) End Sub @@ -46,21 +66,21 @@ Public Class ucrTextViewer Optional iSelectionLength As Integer = -1) If iSelectionLength = -1 Then - iSelectionLength = _richTextBox.Text.Length + iSelectionLength = richTextBox.Text.Length End If If RuntimeInformation.IsOSPlatform(OSPlatform.Linux) Then 'Mono cannot have multiple fonts and colours within RichTextBox - _richTextBox.SelectAll() - _richTextBox.Font = font - _richTextBox.ForeColor = color - _richTextBox.SelectionLength = 0 + richTextBox.SelectAll() + richTextBox.Font = font + richTextBox.ForeColor = color + richTextBox.SelectionLength = 0 Else - _richTextBox.SelectionStart = iSelectionStart - _richTextBox.SelectionLength = iSelectionLength - _richTextBox.SelectionFont = font - _richTextBox.SelectionColor = color - _richTextBox.SelectionLength = 0 + richTextBox.SelectionStart = iSelectionStart + richTextBox.SelectionLength = iSelectionLength + richTextBox.SelectionFont = font + richTextBox.SelectionColor = color + richTextBox.SelectionLength = 0 End If End Sub diff --git a/instat/frmMain.vb b/instat/frmMain.vb index c6b0f9d4052..6d30c054dde 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -84,7 +84,11 @@ Public Class frmMain clsOutputLogger = New clsOutputLogger clsRLink = New RLink(clsOutputLogger) If RuntimeInformation.IsOSPlatform(OSPlatform.Windows) Then - CefRuntimeWrapper.InitialiseCefRuntime() + If CefRuntimeWrapper.InitialiseCefRuntime() Then + MessageBox.Show(Me, "Cef runtime could not be initialised." & Environment.NewLine & "Htmlcontet will be shown in your default browser.", + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) + End If + End If End Sub From 2d56724ad66695fda0bbd20b483206ea33af1cca Mon Sep 17 00:00:00 2001 From: patowhiz Date: Wed, 9 Nov 2022 14:38:53 +0300 Subject: [PATCH 090/122] removed bug --- instat/frmMain.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 6d30c054dde..0db977c7f6a 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -84,8 +84,8 @@ Public Class frmMain clsOutputLogger = New clsOutputLogger clsRLink = New RLink(clsOutputLogger) If RuntimeInformation.IsOSPlatform(OSPlatform.Windows) Then - If CefRuntimeWrapper.InitialiseCefRuntime() Then - MessageBox.Show(Me, "Cef runtime could not be initialised." & Environment.NewLine & "Htmlcontet will be shown in your default browser.", + If Not CefRuntimeWrapper.InitialiseCefRuntime() Then + MessageBox.Show(Me, "Cef runtime could not be initialised." & Environment.NewLine & "Html content will be shown in your default browser.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If From 71aea87675c645f9fb4f3fb0b3a56a64fd916a10 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Thu, 10 Nov 2022 11:02:05 +0300 Subject: [PATCH 091/122] corrected conflict errors --- instat/instat.vbproj | 2 ++ .../InstatObject/R/stand_alone_functions.R | 22 +++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/instat/instat.vbproj b/instat/instat.vbproj index af3c5f13be3..b2a5e6215f9 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -243,6 +243,8 @@ frmMaximiseOutput.vb + Form + dlgWordwrap.vb diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index 91266890c74..bf86305f14b 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -2599,6 +2599,16 @@ read_corpora <- function(data){ } +# Bind two data frames +# and remove any duplicates from data frame x that are in data frame y +# x = our data to remove duplicates from +# y = data frame that contains variables in cols argument +# cols = columns to bind into data1 +cbind_unique <- function(x, y, cols){ + x <- x %>% dplyr::select(c(setdiff(names(x), cols))) + x <- dplyr::bind_cols(x = x, y = dplyr::select(y, tidyselect::all_of(cols))) +} + #object is the object to be displayed #object_format is the display format view_object <- function(object, object_format) { @@ -2733,14 +2743,4 @@ view_html_object <- function(html_object){ message("R viewer not detected. File saved in location ", file_name) return(file_name) - - -# Bind two data frames -# and remove any duplicates from data frame x that are in data frame y -# x = our data to remove duplicates from -# y = data frame that contains variables in cols argument -# cols = columns to bind into data1 -cbind_unique <- function(x, y, cols){ - x <- x %>% dplyr::select(c(setdiff(names(x), cols))) - x <- dplyr::bind_cols(x = x, y = dplyr::select(y, tidyselect::all_of(cols))) -} \ No newline at end of file +} From 31e7c883ae2b359112325b1b3c8e09aeaed7c571 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Thu, 10 Nov 2022 11:45:32 +0300 Subject: [PATCH 092/122] minor hanges --- instat/clsRCodeStructure.vb | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index 9535b7c293b..6241ccda611 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -286,7 +286,6 @@ Public Class RCodeStructure If Not strTempGraph = "" Then strNewRObjectTypeToAssignTo = strTempGraph strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.Graph - 'assumption is by default a model is in image format strNewRObjectFormatToAssignTo = RObjectFormat.Image End If @@ -462,13 +461,13 @@ Public Class RCodeStructure ' 'guinea_two_stations'. 'todo - If Not String.IsNullOrEmpty(Me._rObjectToAssignTo) Then - strScript = strScript & ConstructAssignTo(Me._rObjectToAssignTo, strTemp) & Environment.NewLine + If Not String.IsNullOrEmpty(_rObjectToAssignTo) Then + strScript = strScript & ConstructAssignTo(_rObjectToAssignTo, strTemp) & Environment.NewLine Else strScript = strScript & ConstructAssignTo(strAssignTo, strTemp) & Environment.NewLine End If - If Not String.IsNullOrEmpty(Me._rObjectTypeToAssignTo) AndAlso Not String.IsNullOrEmpty(Me._rObjectNameToAssignTo) AndAlso Not String.IsNullOrEmpty(Me._rObjectFormatToAssignTo) Then + If Not String.IsNullOrEmpty(_rObjectTypeToAssignTo) AndAlso Not String.IsNullOrEmpty(_rObjectNameToAssignTo) AndAlso Not String.IsNullOrEmpty(_rObjectFormatToAssignTo) Then Dim clsAddObject As New RFunction Dim clsGetObject As New RFunction @@ -477,17 +476,17 @@ Public Class RCodeStructure clsAddObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_object") clsGetObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_object") - If Not String.IsNullOrEmpty(Me._rDataFrameNameToAddObjectTo) Then - clsAddObject.AddParameter("data_name", Chr(34) & Me._rDataFrameNameToAddObjectTo & Chr(34)) - clsGetObject.AddParameter("data_name", Chr(34) & Me._rDataFrameNameToAddObjectTo & Chr(34)) + If Not String.IsNullOrEmpty(_rDataFrameNameToAddObjectTo) Then + clsAddObject.AddParameter("data_name", Chr(34) & _rDataFrameNameToAddObjectTo & Chr(34)) + clsGetObject.AddParameter("data_name", Chr(34) & _rDataFrameNameToAddObjectTo & Chr(34)) End If - clsAddObject.AddParameter("object_name", Chr(34) & Me._rObjectNameToAssignTo & Chr(34)) - clsAddObject.AddParameter("object_type_label", Chr(34) & Me._rObjectTypeToAssignTo & Chr(34)) - clsAddObject.AddParameter("object_format", Chr(34) & Me._rObjectFormatToAssignTo & Chr(34)) - clsAddObject.AddParameter("object", Me._rObjectToAssignTo) + clsAddObject.AddParameter("object_name", Chr(34) & _rObjectNameToAssignTo & Chr(34)) + clsAddObject.AddParameter("object_type_label", Chr(34) & _rObjectTypeToAssignTo & Chr(34)) + clsAddObject.AddParameter("object_format", Chr(34) & _rObjectFormatToAssignTo & Chr(34)) + clsAddObject.AddParameter("object", _rObjectToAssignTo) - clsGetObject.AddParameter("object_name", Chr(34) & Me._rObjectNameToAssignTo & Chr(34)) + clsGetObject.AddParameter("object_name", Chr(34) & _rObjectNameToAssignTo & Chr(34)) 'construct the scripts strScript = strScript & clsAddObject.ToScript() & Environment.NewLine From 60b803d430dda6e17fef253c7f544ba354891787 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Fri, 11 Nov 2022 09:50:53 +0300 Subject: [PATCH 093/122] more code enhancements --- instat/clsRCodeStructure.vb | 418 +++++++++++------------- instat/clsRFunction.vb | 450 +++++++++++++------------- instat/clsROperator.vb | 20 +- instat/clsRSyntax.vb | 162 +--------- instat/dlgOneVariableSummarise.vb | 12 +- instat/dlgOpenNetCDF.vb | 1 - instat/dlgRegularSequence.vb | 2 - instat/dlgScatterPlot.vb | 2 +- instat/dlgSummaryTables.vb | 2 +- instat/dlgThreeVariableFrequencies.vb | 18 +- instat/dlgThreeVariablePivotTable.vb | 4 +- instat/dlgTwoWayFrequencies.vb | 18 +- instat/dlgViewLabelsAndLevels.vb | 4 +- instat/ucrButtons.vb | 7 +- instat/ucrCore.vb | 2 +- instat/ucrSave.vb | 21 +- instat/ucrTry.vb | 9 +- 17 files changed, 475 insertions(+), 677 deletions(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index 6241ccda611..ffda0c9a231 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -38,77 +38,28 @@ '''
    '''-------------------------------------------------------------------------------------------- Public Class RCodeStructure - ''' If the output from the R command needs to be assigned, then this string is - ''' the part of the script to the left of the assignment operator ('<-'). - ''' This could be a data frame, data frame colmun, model, graph, surv or table. - ''' If the output from the R command doesn't to be assigned, then this string is - ''' empty. - Public strAssignTo As String - - ''' The name of the data frame to assign to - ''' (i.e. the data frame name associated with the R "data_name" parameter). - ''' - ''' todo. deprecate - Public strAssignToDataFrame As String - - ''' The name of the column to assign to - ''' (i.e. the column name associated with the R "col_name" or "col_names" - ''' parameters). - ''' - ''' todo. deprecate - Public strAssignToColumn As String - - '------------------------- - Public _rDataFrameNameToAddObjectTo As String - Public _rObjectToAssignTo As String - Public _rObjectNameToAssignTo As String - Public _rObjectTypeToAssignTo As String - Public _rObjectFormatToAssignTo As String - - '-------------------------------- - ''' If true then a list of data frames is assigned (i.e. the R "data_names" - ''' parameter needs to be set). - ''' - Public bDataFrameList As Boolean = False - - ''' The names of the new data frames (i.e. the data frame names associated with - ''' the R "data_names" parameter). Only used if 'bDataFrameList' is true. - ''' - Public strDataFrameNames As String + '-------------------------------------------------------------- + 'todo. the properties in this block should eventually be private + 'start block - ''' If true then, at the current stage of running code within R, the output of - ''' the R command needs to be assigned to: - ''' - ''' - ''' The variable defined by 'strAssignTo' - ''' - ''' R elements such as data frame, columns, graphs, models etc. (only if - ''' specified by the 'AssignTo...' variables). - ''' - ''' + ''' + ''' If the output from the R command needs to be assigned, then this string is + ''' the part of the script to the left of the assignment operator ('<-'). + ''' This could be a data frame, data frame colmun, model, graph etc. + ''' If the output from the R command doesn't to be assigned, then this string is null or empty. ''' - Public bToBeAssigned As Boolean = False - - ''' If true then the output of the R-command has been assigned to: - ''' - ''' - ''' The variable defined by 'strAssignTo' - ''' - ''' R elements such as data frame, columns, graphs, models etc. (only if - ''' specified by the 'AssignTo...' variables). - ''' - ''' - ''' This variable is only relevant in the string case, as RFunction and - ''' ROperator have internal equivalents. - ''' - ''' Note: Both bToBeAssigned and bIsAssigned are needed. - ''' bToBeAssigned defines if the R command actually needs to be defined. - ''' bIsAssigned defines if the R command has already been defined (only relevent - ''' if bToBeAssigned is true). - ''' + Public _strAssignToObject As String + Public _strAssignToName As String + Public _strAssignToObjectTypeLabel As String + Public _strAssignToObjectFormat As String + Public _strDataFrameNameToAddAssignToObject As String + + ''' + ''' If true then a list of data frames is assigned (i.e. the R "_strAssignToName" + ''' parameter needs to be an R string list). ''' - Public bIsAssigned As Boolean = False + Private bDataFrameList As Boolean = False ''' If true then the R parameter "use_col_name_as_prefix" is set to true, ''' else the parameter is set to false. @@ -136,6 +87,9 @@ Public Class RCodeStructure ''' Public bRequireCorrectLength As Boolean = True + 'end block + '--------------------------------------------------------------------- + ''' The list of parameters associated with this R code. Public clsParameters As New List(Of RParameter) @@ -149,7 +103,7 @@ Public Class RCodeStructure Public iPosition = -1 ' TODO SJL 03/04/20 This seems to be a constant, should we declare it with 'const'? 'TODO SJL 03/04/20 - Also, it only seems to be used by RSyntax. Move the constant to that class and give it a less confusing name? - ''' What to do with the result returned by executing the R code: + ''' Deprecated. What to do with the result returned by executing the R code: ''' ''' ''' 0 Ignore the result of the R code. @@ -177,11 +131,11 @@ Public Class RCodeStructure ''' If true then potentially exclude the assignment part of the script from the R ''' command. - ''' Normally, the assignment part of the script should only be excluded if the - ''' output has already been assigned. + ''' Normally, the assignment part of the script should only be excluded if the assignement + ''' has been set. ''' For example: ''' - ''' If bExcludeAssignedFunctionOutput AndAlso bIsAssigned Then + ''' If bExcludeAssignedFunctionOutput AndAlso IsAssigned Then ''' 'process script without assignment part ''' Else ''' 'process script with assignment part @@ -221,8 +175,18 @@ Public Class RCodeStructure ' bExcludeAssignedFunctionOutput which it uses for the base code. Eventually migrate these out of RSyntax. End Sub + Public Function GetRObjectToAssignTo() As String + Return _strAssignToObject + End Function + + Public Function IsAssigned() + Return Not String.IsNullOrEmpty(_strAssignToObject) + End Function + '''-------------------------------------------------------------------------------------------- - ''' Sets the 'assignTo' variables. + ''' Deprecated. + ''' Sets the 'assignTo' variables. + ''' ''' ''' The new value for the assignment string. ''' (Optional) The new value for the dataframe. @@ -241,7 +205,6 @@ Public Class RCodeStructure ''' names of new data frames if data frame list is ''' not named. ''' (Optional) The new value for strAdjacentColumn. - ''' todo. deprecate some of the options '''-------------------------------------------------------------------------------------------- Public Sub SetAssignTo(strTemp As String, Optional strTempDataframe As String = "", @@ -257,25 +220,36 @@ Public Class RCodeStructure Optional bDataFrameList As Boolean = False, Optional strDataFrameNames As String = "", Optional strAdjacentColumn As String = "") - strAssignTo = strTemp + + _strAssignToObject = strTemp + + If Not strTempDataframe = "" AndAlso Not strTempColumn = "" Then + SetAssignToColumnObject(strColToAssignTo:=strTemp, + strColName:=strTempColumn, + strRDataFrameNameToAddObjectTo:=strTempDataframe, + bAssignToIsPrefix:=bAssignToIsPrefix, + bAssignToColumnWithoutNames:=bAssignToColumnWithoutNames, + bRequireCorrectLength:=bRequireCorrectLength, + bInsertColumnBefore:=bInsertColumnBefore, + strAdjacentColumn:=strAdjacentColumn) + Return + End If + + If Not strTempDataframe = "" Then - strAssignToDataFrame = strTempDataframe - If Not strTempColumn = "" Then - strAssignToColumn = strTempColumn + If bDataFrameList Then + SetAssignToDataFrameObject(strDataFrameToAssignTo:=strTemp, + strDataFrameName:=strDataFrameNames, + bDataFrameList:=True) + Else + SetAssignToDataFrameObject(strDataFrameToAssignTo:=strTemp, + strDataFrameName:=strTempDataframe, + bDataFrameList:=False) End If + Return End If - bToBeAssigned = True - bIsAssigned = False - Me.bAssignToIsPrefix = bAssignToIsPrefix - Me.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames - Me.bInsertColumnBefore = bInsertColumnBefore - Me.strAdjacentColumn = strAdjacentColumn - Me.bRequireCorrectLength = bRequireCorrectLength - Me.bDataFrameList = bDataFrameList - Me.strDataFrameNames = strDataFrameNames - '----------------------------------------------------------------------- 'for dialogs that produce objects shown to the output viewer 'using this deprecated subroutine. call the SetAssignToRObject subroutine 'this part can be deleted once all the dialogs that have these types of outputs are refactored @@ -292,62 +266,77 @@ Public Class RCodeStructure If Not strTempModel = "" Then strNewRObjectTypeToAssignTo = strTempModel strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.Model - 'assumption is by default a model is in text format + 'assumption is, by default a model is in text format strNewRObjectFormatToAssignTo = RObjectFormat.Text End If If Not strTempTable = "" Then strNewRObjectTypeToAssignTo = strTempTable strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.Table - 'assumption is by default a table is in text format + 'assumption is, by default a table is in text format strNewRObjectFormatToAssignTo = RObjectFormat.Text End If If Not strTempSurv = "" Then strNewRObjectTypeToAssignTo = strTempSurv strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.Structure_label - 'assumption is by default a survival is in text format + 'assumption is, by default a survival is in text format strNewRObjectFormatToAssignTo = RObjectFormat.Text End If If Not strNewRObjectTypeToAssignTo = "" Then - SetAssignToRObject(strRObjectToAssignTo:=strNewRObjectTypeToAssignTo, + SetAssignToOutputObject(strRObjectToAssignTo:=strNewRObjectTypeToAssignTo, strRObjectTypeLabelToAssignTo:=strNewRObjectTypeLabelToAssignTo, strRObjectFormatToAssignTo:=strNewRObjectFormatToAssignTo, strRDataFrameNameToAddObjectTo:=strTempDataframe, - strObjectName:=strNewRObjectTypeToAssignTo, - bAssignToIsPrefix:=bAssignToIsPrefix) + strObjectName:=strNewRObjectTypeToAssignTo) End If - '---------------------------------------------------------- End Sub - 'Not used for assigning columns - Public Sub SetAssignToRObject(strRObjectToAssignTo As String, - strRObjectTypeLabelToAssignTo As String, - strRObjectFormatToAssignTo As String, - Optional strRDataFrameNameToAddObjectTo As String = "", - Optional strObjectName As String = "", - Optional bAssignToIsPrefix As Boolean = False) - - If strRObjectTypeLabelToAssignTo = RObjectTypeLabel.Dataframe OrElse strRObjectTypeLabelToAssignTo = RObjectTypeLabel.Column Then - MsgBox("Developer Error: Incorrect Set Assign." & - Environment.NewLine & - "This can only be done for objects that can be displayed in the output viewer") - Return - End If + Public Sub SetAssignToOutputObject(strRObjectToAssignTo As String, + strRObjectTypeLabelToAssignTo As String, + strRObjectFormatToAssignTo As String, + Optional strRDataFrameNameToAddObjectTo As String = "", + Optional strObjectName As String = "") + + Me._strAssignToObject = strRObjectToAssignTo + Me._strAssignToObjectTypeLabel = strRObjectTypeLabelToAssignTo + Me._strAssignToObjectFormat = strRObjectFormatToAssignTo + Me._strDataFrameNameToAddAssignToObject = strRDataFrameNameToAddObjectTo + Me._strAssignToName = strObjectName + End Sub - Me._rObjectToAssignTo = strRObjectToAssignTo - Me._rObjectTypeToAssignTo = strRObjectTypeLabelToAssignTo - Me._rObjectFormatToAssignTo = strRObjectFormatToAssignTo - Me._rDataFrameNameToAddObjectTo = strRDataFrameNameToAddObjectTo - Me._rObjectNameToAssignTo = strObjectName + Public Sub SetAssignToColumnObject(strColToAssignTo As String, + strColName As String, + strRDataFrameNameToAddObjectTo As String, + Optional bAssignToIsPrefix As Boolean = False, + Optional bAssignToColumnWithoutNames As Boolean = False, + Optional bRequireCorrectLength As Boolean = True, + Optional bInsertColumnBefore As Boolean = False, + Optional strAdjacentColumn As String = "") + + Me._strAssignToObject = strColToAssignTo + Me._strAssignToObjectTypeLabel = RObjectTypeLabel.Column + Me._strDataFrameNameToAddAssignToObject = strRDataFrameNameToAddObjectTo + Me._strAssignToName = strColName Me.bAssignToIsPrefix = bAssignToIsPrefix - Me.bToBeAssigned = True - Me.bIsAssigned = False + + Me.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames + Me.bInsertColumnBefore = bInsertColumnBefore + Me.strAdjacentColumn = strAdjacentColumn + Me.bRequireCorrectLength = bRequireCorrectLength End Sub + Public Sub SetAssignToDataFrameObject(strDataFrameToAssignTo As String, + strDataFrameName As String, + Optional bDataFrameList As Boolean = False) + Me._strAssignToObject = strDataFrameToAssignTo + Me._strAssignToObjectTypeLabel = RObjectTypeLabel.Dataframe + Me._strAssignToName = strDataFrameName + Me.bDataFrameList = bDataFrameList + End Sub '''-------------------------------------------------------------------------------------------- ''' Resets all the 'AssignTo' variables. @@ -357,19 +346,15 @@ Public Class RCodeStructure '''-------------------------------------------------------------------------------------------- Public Sub RemoveAssignTo() ' TODO SJL 03/04/20 should bRequireCorrectLength, bDataFrameList, strDataFrameNames also be reset? - strAssignTo = "" - strAssignToDataFrame = "" - strAssignToColumn = "" - bToBeAssigned = False - bIsAssigned = False + bAssignToIsPrefix = False bAssignToColumnWithoutNames = False bInsertColumnBefore = False - Me._rObjectToAssignTo = "" - Me._rObjectNameToAssignTo = "" - Me._rObjectTypeToAssignTo = "" - Me._rObjectFormatToAssignTo = "" + Me._strAssignToObject = "" + Me._strAssignToName = "" + Me._strAssignToObjectTypeLabel = "" + Me._strAssignToObjectFormat = "" End Sub '''-------------------------------------------------------------------------------------------- @@ -432,27 +417,16 @@ Public Class RCodeStructure ''' Else returns . '''-------------------------------------------------------------------------------------------- Public Overridable Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String - Dim clsAddColumns As New RFunction - Dim clsGetColumns As New RFunction - Dim clsAddData As New RFunction - Dim clsGetData As New RFunction - Dim clsAddModels As New RFunction - Dim clsGetModels As New RFunction - Dim clsAddGraphs As New RFunction - Dim clsViewGraphObjects As New RFunction - Dim clsAddSurv As New RFunction - Dim clsGetSurv As New RFunction - Dim clsAddTables As New RFunction - Dim clsGetTables As New RFunction - Dim clsDataList As New RFunction - - ' if R script already assigned for this object then return the existing assign script - If bIsAssigned Then - Return (strAssignTo) - End If + + + ' if R script still needs to be assigned to this object - If bToBeAssigned Then + If Not String.IsNullOrEmpty(_strAssignToObject) Then + + Dim clsAddRObject As New RFunction + Dim clsGetRObject As New RFunction + Dim strRObject As String = _strAssignToObject 'Append the new script (including the intial assignment part) to 'strScript', e.g. ' 'my_stations <- rio::import(file=""C:/myDir/my_stations.csv"", stringsAsFactors=TRUE)" & vbCrLf' @@ -460,100 +434,95 @@ Public Class RCodeStructure 'Note2: Initially, 'strAssignTo' is typically the name of the variable to assign the result of 'strTemp' to, e.g. ' 'guinea_two_stations'. - 'todo - If Not String.IsNullOrEmpty(_rObjectToAssignTo) Then - strScript = strScript & ConstructAssignTo(_rObjectToAssignTo, strTemp) & Environment.NewLine - Else - strScript = strScript & ConstructAssignTo(strAssignTo, strTemp) & Environment.NewLine - End If - - If Not String.IsNullOrEmpty(_rObjectTypeToAssignTo) AndAlso Not String.IsNullOrEmpty(_rObjectNameToAssignTo) AndAlso Not String.IsNullOrEmpty(_rObjectFormatToAssignTo) Then - Dim clsAddObject As New RFunction - Dim clsGetObject As New RFunction - - 'set the R command and parameters for the add object R function. This is used for adding the object in the data book - 'set the R command and parameters for the get object R function. This is used for viewing the object. - clsAddObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_object") - clsGetObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_object") - - If Not String.IsNullOrEmpty(_rDataFrameNameToAddObjectTo) Then - clsAddObject.AddParameter("data_name", Chr(34) & _rDataFrameNameToAddObjectTo & Chr(34)) - clsGetObject.AddParameter("data_name", Chr(34) & _rDataFrameNameToAddObjectTo & Chr(34)) - End If + strScript = strScript & ConstructAssignTo(_strAssignToObject, strTemp) & Environment.NewLine - clsAddObject.AddParameter("object_name", Chr(34) & _rObjectNameToAssignTo & Chr(34)) - clsAddObject.AddParameter("object_type_label", Chr(34) & _rObjectTypeToAssignTo & Chr(34)) - clsAddObject.AddParameter("object_format", Chr(34) & _rObjectFormatToAssignTo & Chr(34)) - clsAddObject.AddParameter("object", _rObjectToAssignTo) - - clsGetObject.AddParameter("object_name", Chr(34) & _rObjectNameToAssignTo & Chr(34)) - - 'construct the scripts - strScript = strScript & clsAddObject.ToScript() & Environment.NewLine - strAssignTo = clsGetObject.ToScript() - - ElseIf Not strAssignToDataFrame = "" AndAlso (Not strAssignToColumn = "" OrElse bAssignToColumnWithoutNames) Then - 'if we need to assign to a column in a data frame - clsAddColumns.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - clsAddColumns.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) + If _strAssignToObjectTypeLabel = RObjectTypeLabel.Column Then + 'for column object + clsAddRObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + clsAddRObject.AddParameter("data_name", Chr(34) & _strDataFrameNameToAddAssignToObject & Chr(34)) 'if we need to assign to a named column If Not bAssignToColumnWithoutNames Then - clsAddColumns.AddParameter("col_name", Chr(34) & strAssignToColumn & Chr(34)) + clsAddRObject.AddParameter("col_name", Chr(34) & _strAssignToName & Chr(34)) End If - clsAddColumns.AddParameter("col_data", strAssignTo) + clsAddRObject.AddParameter("col_data", _strAssignToObject) If bAssignToIsPrefix Then - clsAddColumns.AddParameter("use_col_name_as_prefix", "TRUE") + clsAddRObject.AddParameter("use_col_name_as_prefix", "TRUE") Else If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsAddColumns.AddParameter("use_col_name_as_prefix", "FALSE") + clsAddRObject.AddParameter("use_col_name_as_prefix", "FALSE") End If End If - clsAddColumns.AddParameter("before", If(bInsertColumnBefore, "TRUE", "FALSE")) + clsAddRObject.AddParameter("before", If(bInsertColumnBefore, "TRUE", "FALSE")) If Not String.IsNullOrEmpty(strAdjacentColumn) Then - clsAddColumns.AddParameter("adjacent_column", strAdjacentColumn) + clsAddRObject.AddParameter("adjacent_column", strAdjacentColumn) End If If Not bRequireCorrectLength Then - clsAddColumns.AddParameter("require_correct_length", "FALSE") + clsAddRObject.AddParameter("require_correct_length", "FALSE") End If - ' add '$add-columns_to_data' parameters to 'strScript' + ' add '$add_columns_to_data' parameters to 'strScript' ' e.g. "row_names1 <- data_book$get_row_names(data_name=""survey"")" & vbCrLf & "data_book$add_columns_to_data(data_name=""survey"", col_name=""row_names1"", col_data=row_names1, before=TRUE)" & vbCrLf - strScript = strScript & clsAddColumns.ToScript() & Environment.NewLine + strScript = strScript & clsAddRObject.ToScript() & Environment.NewLine - clsGetColumns.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_columns_from_data") - clsGetColumns.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) - clsGetColumns.AddParameter("col_names", Chr(34) & strAssignToColumn & Chr(34)) + clsGetRObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_columns_from_data") + clsGetRObject.AddParameter("data_name", Chr(34) & _strDataFrameNameToAddAssignToObject & Chr(34)) + clsGetRObject.AddParameter("col_names", Chr(34) & _strAssignToName & Chr(34)) ' set 'strAssignTo' to e.g. "data_book$get_columns_from_data(data_name=""survey"", col_names=""row_names1"")" - strAssignTo = clsGetColumns.ToScript() - ElseIf Not strAssignToDataFrame = "" Then 'else if we need to assign to a data frame - clsAddData.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_data") + strRObject = clsGetRObject.ToScript() + + ElseIf _strAssignToObjectTypeLabel = RObjectTypeLabel.Dataframe Then + 'for data frame object + clsAddRObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_data") If bDataFrameList Then - clsAddData.AddParameter("data_tables", strAssignTo, iPosition:=0) - If strDataFrameNames <> "" Then - clsAddData.AddParameter("data_names", strDataFrameNames, iPosition:=5) + clsAddRObject.AddParameter("data_tables", _strAssignToObject, iPosition:=0) + If _strAssignToName <> "" Then + clsAddRObject.AddParameter("data_names", _strAssignToName, iPosition:=5) End If Else + Dim clsDataList As New RFunction clsDataList.SetRCommand("list") - clsDataList.AddParameter(strAssignToDataFrame, strAssignTo) - clsAddData.AddParameter("data_tables", clsRFunctionParameter:=clsDataList, iPosition:=0) + clsDataList.AddParameter(_strAssignToName, _strAssignToObject) + clsAddRObject.AddParameter("data_tables", clsRFunctionParameter:=clsDataList, iPosition:=0) End If 'append the next line of script to 'strScript' e.g. ' "my_stations <- rio::import(file=""C:/myFolder/my_stations.csv"", stringsAsFactors=TRUE)" & vbCrLf ' & "data_book$import_data(data_tables=list(my_stations=my_stations))" & vbCrLf - strScript = strScript & clsAddData.ToScript() & Environment.NewLine + strScript = strScript & clsAddRObject.ToScript() & Environment.NewLine - clsGetData.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_data_frame") - clsGetData.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) + 'todo. when is this ever used? as of 11/11/2022, this is code is not used during execution + clsGetRObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_data_frame") + clsGetRObject.AddParameter("data_name", Chr(34) & _strAssignToName & Chr(34)) 'Set 'strAssignTo' to final assign-to script ' e.g. "data_book$get_columns_from_data(data_name=""my_stations"", col_names=""Calc1"")" - strAssignTo = clsGetData.ToScript() + strRObject = clsGetRObject.ToScript() + + ElseIf Not String.IsNullOrEmpty(_strAssignToObjectFormat) Then + 'for output objects like graphs, texts, table + 'set the R command and parameters for the add object R function. This is used for adding the object in the data book + 'set the R command and parameters for the get object R function. This is used for viewing the object. + clsAddRObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_object") + clsGetRObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_object") + + If Not String.IsNullOrEmpty(_strDataFrameNameToAddAssignToObject) Then + clsAddRObject.AddParameter("data_name", Chr(34) & _strDataFrameNameToAddAssignToObject & Chr(34)) + clsGetRObject.AddParameter("data_name", Chr(34) & _strDataFrameNameToAddAssignToObject & Chr(34)) + End If + + clsAddRObject.AddParameter("object_name", Chr(34) & _strAssignToName & Chr(34)) + clsAddRObject.AddParameter("object_type_label", Chr(34) & _strAssignToObjectTypeLabel & Chr(34)) + clsAddRObject.AddParameter("object_format", Chr(34) & _strAssignToObjectFormat & Chr(34)) + clsAddRObject.AddParameter("object", _strAssignToObject) + + clsGetRObject.AddParameter("object_name", Chr(34) & _strAssignToName & Chr(34)) + + 'construct the scripts + strScript = strScript & clsAddRObject.ToScript() & Environment.NewLine + strRObject = clsGetRObject.ToScript() + End If - bIsAssigned = True - bToBeAssigned = False - 'return the final assign-to script - Return strAssignTo + Return strRObject Else 'else if R script doesn't need to be assigned to this object ' just return the right side of the assignment Return strTemp @@ -736,7 +705,7 @@ Public Class RCodeStructure Else 'TODO SJL 03/04/20 Do something here? End If - bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned + 'bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned iNumberOfAddedParameters = iNumberOfAddedParameters + 1 OnParametersChanged() 'TODO SJL 03/04/20 can this line be removed? End Sub @@ -837,7 +806,7 @@ Public Class RCodeStructure clsParam = clsParameters.Find(Function(x) x.Position = -1) clsParameters.Remove(clsParam) End If - bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned + 'bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned OnParametersChanged() 'TODO SJL 03/04/20 can this line be removed? End Sub @@ -857,7 +826,7 @@ Public Class RCodeStructure clsParam = clsParameters.Find(Function(x) x.strArgumentName = strArgName) clsParameters.Remove(clsParam) ' End If - bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned + 'bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned OnParametersChanged() 'TODO SJL 03/04/20 can this line be removed? End Sub @@ -877,7 +846,7 @@ Public Class RCodeStructure clsParam = clsParameters.Find(Function(x) x.Position = iPosition) clsParameters.Remove(clsParam) End If - bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned + 'bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned OnParametersChanged() 'TODO SJL 03/04/20 can this line be removed? End Sub @@ -891,7 +860,7 @@ Public Class RCodeStructure If Not clsParameters Is Nothing Then clsParameters.Remove(clsParam) End If - bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned + ' bIsAssigned = False 'parameters have changed so the output of the R command needs to be reassigned OnParametersChanged() 'TODO SJL 03/04/20 can this line be removed? End Sub @@ -935,7 +904,7 @@ Public Class RCodeStructure Public Overridable Sub ClearParameters() clsParameters.Clear() iNumberOfAddedParameters = 0 - bIsAssigned = False + 'bIsAssigned = False OnParametersChanged() 'TODO SJL 03/04/20 can this line be removed? End Sub @@ -948,19 +917,13 @@ Public Class RCodeStructure Dim clsTempCode As New RCodeStructure Dim clsRParam As RParameter - clsTempCode._rObjectToAssignTo = Me._rObjectToAssignTo - clsTempCode._rObjectNameToAssignTo = Me._rObjectNameToAssignTo - clsTempCode._rObjectTypeToAssignTo = Me._rObjectTypeToAssignTo - clsTempCode._rObjectFormatToAssignTo = Me._rObjectFormatToAssignTo - clsTempCode._rDataFrameNameToAddObjectTo = Me._rDataFrameNameToAddObjectTo + clsTempCode._strAssignToObject = Me._strAssignToObject + clsTempCode._strAssignToName = Me._strAssignToName + clsTempCode._strAssignToObjectTypeLabel = Me._strAssignToObjectTypeLabel + clsTempCode._strAssignToObjectFormat = Me._strAssignToObjectFormat + clsTempCode._strDataFrameNameToAddAssignToObject = Me._strDataFrameNameToAddAssignToObject - clsTempCode.strAssignTo = strAssignTo - clsTempCode.strAssignToDataFrame = strAssignToDataFrame - clsTempCode.strAssignToColumn = strAssignToColumn clsTempCode.bDataFrameList = bDataFrameList - clsTempCode.strDataFrameNames = strDataFrameNames - clsTempCode.bToBeAssigned = bToBeAssigned - clsTempCode.bIsAssigned = bIsAssigned clsTempCode.bAssignToIsPrefix = bAssignToIsPrefix clsTempCode.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames clsTempCode.bInsertColumnBefore = bInsertColumnBefore @@ -992,15 +955,10 @@ Public Class RCodeStructure 'TBD SJL 06/04/20 This is a 'get' function but it does not return any value! Rename? SortParameters() ' if this object is to be assigned, but is not yet in the lists - If bToBeAssigned AndAlso Not lstCodes.Contains(Me) Then + If Not String.IsNullOrEmpty(_strAssignToObject) AndAlso Not lstCodes.Contains(Me) Then 'add this object and its assign script to the respective lists lstCodes.Add(Me) - If Not String.IsNullOrEmpty(Me._rObjectToAssignTo) Then - lstValues.Add(_rObjectToAssignTo) - Else - lstValues.Add(strAssignTo) - End If - + lstValues.Add(_strAssignToObject) End If For Each clsTempParam As RParameter In clsParameters ' if parameter is a function or operator then also add its respective RCodeStructure diff --git a/instat/clsRFunction.vb b/instat/clsRFunction.vb index 647ff7f5178..a38465061d8 100644 --- a/instat/clsRFunction.vb +++ b/instat/clsRFunction.vb @@ -30,232 +30,226 @@ ''' ''' '''-------------------------------------------------------------------------------------------- -Public Class RFunction - Inherits RCodeStructure - - ''' The R command associated with this object (e.g. "plot"). - ''' Note that this variable only stores the command's name, it doesn't include any - ''' the parameters associated with the command. - Public strRCommand As String - - ''' The R command's package name. - Private strPackageName As String = "" - - ''' Initializes a new instance of this class. - Public Sub New() - OnParametersChanged() 'TODO SJL is this still needed? - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' Sets the R command's name (e.g. "facet_grid") and flags that the R script - ''' associated with this object is no longer correctly assigned. - ''' - ''' Name of the R command. - '''-------------------------------------------------------------------------------------------- - Public Sub SetRCommand(strTemp As String) - strRCommand = strTemp - bIsAssigned = False - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' Sets package name. - ''' - ''' The package name - '''-------------------------------------------------------------------------------------------- - Public Sub SetPackageName(strName As String) - strPackageName = strName - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' - ''' Creates, updates and returns the script that generates the expected output for this - ''' object. This script will have the form 'RCommand(param1=param1Val, param2=param2Val, ...)'. - ''' - ''' - ''' [in,out] (Optional) The existing script including any - ''' assignment part. - ''' This script is passed to the 'ToScript' function of the base - ''' class. This script is also passed to the 'ToScript' function - ''' of the operator's parameters. - ''' (Optional) Ignored, only included so that this function overrides - ''' its parent function. - ''' - ''' The script that generates the expected output for this object. - ''' - '''-------------------------------------------------------------------------------------------- - Public Overrides Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String - Dim i As Integer - 'TODO Legacy comment:'For method with OrderedIndices, replace clsParameters.count by Mybase.OrderedIndices.count and i by Mybase.OrderedIndices(i)' - - SortParameters() - 'if the object has an associated package name, then prefix the script with the package name - If strPackageName <> "" Then - strTemp = strPackageName & "::" - End If - - 'add each parameter to the script (e.g. "source(file=""Rsetup.R"")" - strTemp = strTemp & strRCommand & "(" - For i = 0 To clsParameters.Count - 1 'e,g, set strTemp to "data_book$get_data_frame(convert_to_character=TRUE, max_cols=30, data_name=""survey""" - If i > 0 Then - strTemp = strTemp & ", " - End If - 'append the script associated with the parameter (e.g. "max_cols=30") - strTemp = strTemp & clsParameters(i).ToScript(strScript) - Next - - 'close final bracket e.g. set strTemp to "data_book$get_data_frame(convert_to_character=TRUE, max_cols=30, data_name=""survey"")" - strTemp = strTemp & ")" - - 'if the string needs to be passed directly to R - If bToScriptAsRString Then - 'if string is intended to be assigned to a script then raise error (because modified script will no longer suitable for this) - 'TODO SJL if we only allow these 3 flags to be accessed through 'set/get' functions then we can guarantee that this error situation doesn't occur - 'TODO legacy comment:'should also check assignment of parameters' - If bToBeAssigned OrElse bIsAssigned Then - MsgBox("Developer error: Using bToScriptAsRString = True when RFunction is assigned will not produce the correct script. Remove assignment to use this options correctly.") - End If - - 'replace double quotes with single quotes - ' Note : Can't have double quotes ("") in the string because strTemp will be wrapped - ' with "". In most cases single quotes (') will give the same functionality, - ' though it's preferable to avoid this when constructing the RFunction. - strTemp = strTemp.Replace(Chr(34), Chr(39)) - - 'wrap the entire string in double quotes - strTemp = Chr(34) & strTemp & Chr(34) - End If - - 'if object needs to be assigned to then create/update the assignment script (if needed) - ' and return the assignment script. Otherwise just return 'strTemp'. - Return MyBase.ToScript(strScript, strTemp) - End Function - - '''-------------------------------------------------------------------------------------------- - ''' - ''' Adds a parameter to this function. Sets the parameter's name to - ''' . - ''' Sets the parameter's argument to one of , - ''' , , - ''' or . - ''' - ''' - ''' (Optional) Name of the parameter. - ''' (Optional) The parameter value. - ''' (Optional) The R function parameter. - ''' (Optional) The R operator parameter. - ''' (Optional) The R code structure parameter. - ''' (Optional) True to include, false to exclude the - ''' argument name. - ''' (Optional) The relative position of the - ''' parameter in this object's parameter list. - '''-------------------------------------------------------------------------------------------- - Public Overrides Sub AddParameter(Optional strParameterName As String = "", Optional strParameterValue As String = "", Optional clsRFunctionParameter As RFunction = Nothing, Optional clsROperatorParameter As ROperator = Nothing, Optional clsRCodeStructureParameter As RCodeStructure = Nothing, Optional bIncludeArgumentName As Boolean = True, Optional iPosition As Integer = -1) - 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? - MyBase.AddParameter(strParameterName, strParameterValue, clsRFunctionParameter, clsROperatorParameter, clsRCodeStructureParameter, bIncludeArgumentName, iPosition) - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' - ''' If the R function already has a parameter with the same name then changes the parameter's - ''' value to the value in . Else adds - ''' to the object as a new parameter. - ''' - ''' This function also ensures that there is no existing parameter with the same position as - ''' the newly added/updated parameter. - ''' - ''' - ''' The new parameter to add. - '''-------------------------------------------------------------------------------------------- - Public Overrides Sub AddParameter(clsParam As RParameter) - 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? - MyBase.AddParameter(clsParam) - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' - ''' Returns the parameter object named . - ''' - ''' - ''' The name of the parameter to return. - ''' - ''' The parameter object named . If the parameter - ''' doesn't exist then returns 'Nothing'. - '''-------------------------------------------------------------------------------------------- - Public Overrides Function GetParameter(strName As String) As RParameter - Dim iTempIndex As Integer = -1 'TODO SJL remove this variable? - If Not clsParameters Is Nothing Then - iTempIndex = clsParameters.FindIndex(Function(x) x.strArgumentName = strName) - If iTempIndex <> -1 Then - Return clsParameters(iTempIndex) - End If - End If - Return Nothing - End Function - - ''' Clears this object to its blank/initial state. - Public Overrides Sub Clear() - SetRCommand("") - SetPackageName("") - MyBase.Clear() - End Sub - - ''' Clears the parameters. - Public Overrides Sub ClearParameters() - 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? - MyBase.ClearParameters() - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' Makes a deep copy of this object. - ''' - ''' A copy of this object. - '''-------------------------------------------------------------------------------------------- - Public Overrides Function Clone() As RCodeStructure - Dim clsRFunction As New RFunction - Dim clsRParam As RParameter - - 'RCode properties - 'todo. why not use the MyBase.Clone() for some of these inherited from the parent properties? - clsRFunction._rObjectToAssignTo = Me._rObjectToAssignTo - clsRFunction._rObjectNameToAssignTo = Me._rObjectNameToAssignTo - clsRFunction._rObjectTypeToAssignTo = Me._rObjectTypeToAssignTo - clsRFunction._rObjectFormatToAssignTo = Me._rObjectFormatToAssignTo - clsRFunction._rDataFrameNameToAddObjectTo = Me._rDataFrameNameToAddObjectTo - - clsRFunction.strAssignTo = strAssignTo - clsRFunction.strAssignToDataFrame = strAssignToDataFrame - clsRFunction.strAssignToColumn = strAssignToColumn - clsRFunction.bToBeAssigned = bToBeAssigned - clsRFunction.bIsAssigned = bIsAssigned - clsRFunction.bAssignToIsPrefix = bAssignToIsPrefix - clsRFunction.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames - clsRFunction.bInsertColumnBefore = bInsertColumnBefore - clsRFunction.iNumberOfAddedParameters = iNumberOfAddedParameters - clsRFunction.iPosition = iPosition - clsRFunction.iCallType = iCallType - clsRFunction.bExcludeAssignedFunctionOutput = bExcludeAssignedFunctionOutput - clsRFunction.bClearFromGlobal = bClearFromGlobal - clsRFunction.bToScriptAsRString = bToScriptAsRString - clsRFunction.Tag = Tag - For Each clsRParam In clsParameters - clsRFunction.AddParameter(clsRParam.Clone) - Next - - 'RFunction specific properties - clsRFunction.strPackageName = strPackageName - clsRFunction.strRCommand = strRCommand - - Return clsRFunction - End Function - - '''-------------------------------------------------------------------------------------------- - ''' Gets the number of parameters. - ''' - ''' The number of parameters. - '''-------------------------------------------------------------------------------------------- - Public ReadOnly Property iParameterCount() As Integer - Get - Return clsParameters.Count - End Get - End Property +Public Class RFunction + Inherits RCodeStructure + + ''' The R command associated with this object (e.g. "plot"). + ''' Note that this variable only stores the command's name, it doesn't include any + ''' the parameters associated with the command. + Public strRCommand As String + + ''' The R command's package name. + Private strPackageName As String = "" + + ''' Initializes a new instance of this class. + Public Sub New() + OnParametersChanged() 'TODO SJL is this still needed? + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' Sets the R command's name (e.g. "facet_grid") and flags that the R script + ''' associated with this object is no longer correctly assigned. + ''' + ''' Name of the R command. + '''-------------------------------------------------------------------------------------------- + Public Sub SetRCommand(strTemp As String) + strRCommand = strTemp + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' Sets package name. + ''' + ''' The package name + '''-------------------------------------------------------------------------------------------- + Public Sub SetPackageName(strName As String) + strPackageName = strName + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' + ''' Creates, updates and returns the script that generates the expected output for this + ''' object. This script will have the form 'RCommand(param1=param1Val, param2=param2Val, ...)'. + ''' + ''' + ''' [in,out] (Optional) The existing script including any + ''' assignment part. + ''' This script is passed to the 'ToScript' function of the base + ''' class. This script is also passed to the 'ToScript' function + ''' of the operator's parameters. + ''' (Optional) Ignored, only included so that this function overrides + ''' its parent function. + ''' + ''' The script that generates the expected output for this object. + ''' + '''-------------------------------------------------------------------------------------------- + Public Overrides Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String + Dim i As Integer + 'TODO Legacy comment:'For method with OrderedIndices, replace clsParameters.count by Mybase.OrderedIndices.count and i by Mybase.OrderedIndices(i)' + + SortParameters() + 'if the object has an associated package name, then prefix the script with the package name + If strPackageName <> "" Then + strTemp = strPackageName & "::" + End If + + 'add each parameter to the script (e.g. "source(file=""Rsetup.R"")" + strTemp = strTemp & strRCommand & "(" + For i = 0 To clsParameters.Count - 1 'e,g, set strTemp to "data_book$get_data_frame(convert_to_character=TRUE, max_cols=30, data_name=""survey""" + If i > 0 Then + strTemp = strTemp & ", " + End If + 'append the script associated with the parameter (e.g. "max_cols=30") + strTemp = strTemp & clsParameters(i).ToScript(strScript) + Next + + 'close final bracket e.g. set strTemp to "data_book$get_data_frame(convert_to_character=TRUE, max_cols=30, data_name=""survey"")" + strTemp = strTemp & ")" + + 'if the string needs to be passed directly to R + If bToScriptAsRString Then + 'if string is intended to be assigned to a script then raise error (because modified script will no longer suitable for this) + 'TODO SJL if we only allow these 3 flags to be accessed through 'set/get' functions then we can guarantee that this error situation doesn't occur + 'TODO legacy comment:'should also check assignment of parameters' + If IsAssigned() Then + MsgBox("Developer error: Using bToScriptAsRString = True when RFunction is assigned will not produce the correct script. Remove assignment to use this options correctly.") + End If + + 'replace double quotes with single quotes + ' Note : Can't have double quotes ("") in the string because strTemp will be wrapped + ' with "". In most cases single quotes (') will give the same functionality, + ' though it's preferable to avoid this when constructing the RFunction. + strTemp = strTemp.Replace(Chr(34), Chr(39)) + + 'wrap the entire string in double quotes + strTemp = Chr(34) & strTemp & Chr(34) + End If + + 'if object needs to be assigned to then create/update the assignment script (if needed) + ' and return the assignment script. Otherwise just return 'strTemp'. + Return MyBase.ToScript(strScript, strTemp) + End Function + + '''-------------------------------------------------------------------------------------------- + ''' + ''' Adds a parameter to this function. Sets the parameter's name to + ''' . + ''' Sets the parameter's argument to one of , + ''' , , + ''' or . + ''' + ''' + ''' (Optional) Name of the parameter. + ''' (Optional) The parameter value. + ''' (Optional) The R function parameter. + ''' (Optional) The R operator parameter. + ''' (Optional) The R code structure parameter. + ''' (Optional) True to include, false to exclude the + ''' argument name. + ''' (Optional) The relative position of the + ''' parameter in this object's parameter list. + '''-------------------------------------------------------------------------------------------- + Public Overrides Sub AddParameter(Optional strParameterName As String = "", Optional strParameterValue As String = "", Optional clsRFunctionParameter As RFunction = Nothing, Optional clsROperatorParameter As ROperator = Nothing, Optional clsRCodeStructureParameter As RCodeStructure = Nothing, Optional bIncludeArgumentName As Boolean = True, Optional iPosition As Integer = -1) + 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? + MyBase.AddParameter(strParameterName, strParameterValue, clsRFunctionParameter, clsROperatorParameter, clsRCodeStructureParameter, bIncludeArgumentName, iPosition) + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' + ''' If the R function already has a parameter with the same name then changes the parameter's + ''' value to the value in . Else adds + ''' to the object as a new parameter. + ''' + ''' This function also ensures that there is no existing parameter with the same position as + ''' the newly added/updated parameter. + ''' + ''' + ''' The new parameter to add. + '''-------------------------------------------------------------------------------------------- + Public Overrides Sub AddParameter(clsParam As RParameter) + 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? + MyBase.AddParameter(clsParam) + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' + ''' Returns the parameter object named . + ''' + ''' + ''' The name of the parameter to return. + ''' + ''' The parameter object named . If the parameter + ''' doesn't exist then returns 'Nothing'. + '''-------------------------------------------------------------------------------------------- + Public Overrides Function GetParameter(strName As String) As RParameter + Dim iTempIndex As Integer = -1 'TODO SJL remove this variable? + If Not clsParameters Is Nothing Then + iTempIndex = clsParameters.FindIndex(Function(x) x.strArgumentName = strName) + If iTempIndex <> -1 Then + Return clsParameters(iTempIndex) + End If + End If + Return Nothing + End Function + + ''' Clears this object to its blank/initial state. + Public Overrides Sub Clear() + SetRCommand("") + SetPackageName("") + MyBase.Clear() + End Sub + + ''' Clears the parameters. + Public Overrides Sub ClearParameters() + 'TODO SJL what's the purpose of overriding this function if it just calls the parent function? + MyBase.ClearParameters() + End Sub + + '''-------------------------------------------------------------------------------------------- + ''' Makes a deep copy of this object. + ''' + ''' A copy of this object. + '''-------------------------------------------------------------------------------------------- + Public Overrides Function Clone() As RCodeStructure + Dim clsRFunction As New RFunction + Dim clsRParam As RParameter + + 'RCode properties + 'todo. why not use the MyBase.Clone() for some of these inherited from the parent properties? + clsRFunction._strAssignToObject = _strAssignToObject + clsRFunction._strAssignToName = _strAssignToName + clsRFunction._strAssignToObjectTypeLabel = _strAssignToObjectTypeLabel + clsRFunction._strAssignToObjectFormat = _strAssignToObjectFormat + clsRFunction._strDataFrameNameToAddAssignToObject = _strDataFrameNameToAddAssignToObject + + clsRFunction.bAssignToIsPrefix = bAssignToIsPrefix + clsRFunction.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames + clsRFunction.bInsertColumnBefore = bInsertColumnBefore + clsRFunction.iNumberOfAddedParameters = iNumberOfAddedParameters + clsRFunction.iPosition = iPosition + clsRFunction.iCallType = iCallType + clsRFunction.bExcludeAssignedFunctionOutput = bExcludeAssignedFunctionOutput + clsRFunction.bClearFromGlobal = bClearFromGlobal + clsRFunction.bToScriptAsRString = bToScriptAsRString + clsRFunction.Tag = Tag + For Each clsRParam In clsParameters + clsRFunction.AddParameter(clsRParam.Clone) + Next + + 'RFunction specific properties + clsRFunction.strPackageName = strPackageName + clsRFunction.strRCommand = strRCommand + + Return clsRFunction + End Function + + '''-------------------------------------------------------------------------------------------- + ''' Gets the number of parameters. + ''' + ''' The number of parameters. + '''-------------------------------------------------------------------------------------------- + Public ReadOnly Property iParameterCount() As Integer + Get + Return clsParameters.Count + End Get + End Property End Class \ No newline at end of file diff --git a/instat/clsROperator.vb b/instat/clsROperator.vb index 988c35eaf81..6286b4ae5c2 100644 --- a/instat/clsROperator.vb +++ b/instat/clsROperator.vb @@ -94,7 +94,7 @@ Public Class ROperator Public Sub SetOperation(strTemp As String, Optional bBracketsTemp As Boolean = True) strOperation = strTemp bBrackets = bBracketsTemp - bIsAssigned = False + 'bIsAssigned = False End Sub '''-------------------------------------------------------------------------------------------- @@ -196,7 +196,7 @@ Public Class ROperator 'if string is intended to be assigned to a script then raise error (because modified script will no longer suitable for this) 'TODO SJL 03/04/20 if we only allow these 3 flags to be accessed through 'set/get' functions then we can guarantee that this error situation doesn't occur 'TODO Legacy comment:'should also check assignment of parameters' - If bToBeAssigned OrElse bIsAssigned Then + If IsAssigned() Then MsgBox("Developer error: Using bToScriptAsRString = True when RFunction is assigned will not produce the correct script. Remove assignment to use this options correctly.") End If @@ -298,17 +298,11 @@ Public Class ROperator 'RCode properties 'todo. why not use the MyBase.Clone() for some of these inherited from the parent properties? - clsTempROperator._rObjectToAssignTo = Me._rObjectToAssignTo - clsTempROperator._rObjectNameToAssignTo = Me._rObjectNameToAssignTo - clsTempROperator._rObjectTypeToAssignTo = Me._rObjectTypeToAssignTo - clsTempROperator._rObjectFormatToAssignTo = Me._rObjectFormatToAssignTo - clsTempROperator._rDataFrameNameToAddObjectTo = Me._rDataFrameNameToAddObjectTo - - clsTempROperator.strAssignTo = strAssignTo - clsTempROperator.strAssignToDataFrame = strAssignToDataFrame - clsTempROperator.strAssignToColumn = strAssignToColumn - clsTempROperator.bToBeAssigned = bToBeAssigned - clsTempROperator.bIsAssigned = bIsAssigned + clsTempROperator._strAssignToObject = _strAssignToObject + clsTempROperator._strAssignToName = _strAssignToName + clsTempROperator._strAssignToObjectTypeLabel = _strAssignToObjectTypeLabel + clsTempROperator._strAssignToObjectFormat = _strAssignToObjectFormat + clsTempROperator._strDataFrameNameToAddAssignToObject = _strDataFrameNameToAddAssignToObject clsTempROperator.bAssignToIsPrefix = bAssignToIsPrefix clsTempROperator.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames clsTempROperator.bInsertColumnBefore = bInsertColumnBefore diff --git a/instat/clsRSyntax.vb b/instat/clsRSyntax.vb index 384362501a2..90b4913385d 100644 --- a/instat/clsRSyntax.vb +++ b/instat/clsRSyntax.vb @@ -413,10 +413,13 @@ Public Class RSyntax ElseIf bUseCommandString Then strTemp = clsBaseCommandString.ToScript(strScript, strCommandString) End If + If bExcludeAssignedFunctionOutput Then - 'Sometimes the output of the R-command we deal with should not be part of the script... - ' That's only the case when this output has already been assigned. - If (bUseBaseFunction AndAlso clsBaseFunction.bIsAssigned) OrElse (bUseBaseOperator AndAlso clsBaseOperator.bIsAssigned) OrElse (bUseCommandString AndAlso clsBaseCommandString.bIsAssigned) Then + 'Sometimes the output of the R-command we deal with should not be part of the script... + 'That's only the case when this output has already been assigned. + If (bUseBaseFunction AndAlso clsBaseFunction.IsAssigned()) OrElse + (bUseBaseOperator AndAlso clsBaseFunction.IsAssigned()) OrElse + (bUseCommandString AndAlso clsBaseFunction.IsAssigned()) Then Return strScript End If End If @@ -443,8 +446,8 @@ Public Class RSyntax For Each clsTempCode In lstCodes strScript = "" strTemp = clsTempCode.ToScript(strScript) - 'Sometimes the output of the R-command we deal with should not be part of the script... That's only the case when this output has already been assigned. - If clsTempCode.bExcludeAssignedFunctionOutput AndAlso clsTempCode.bIsAssigned Then + 'Sometimes the output of the R-command we deal with should not be part of the script... + If clsTempCode.bExcludeAssignedFunctionOutput AndAlso Not String.IsNullOrEmpty(clsTempCode.GetRObjectToAssignTo) Then lstScripts.Add(strScript) Else lstScripts.Add(strScript & strTemp) @@ -574,40 +577,6 @@ Public Class RSyntax End If End Function - '''-------------------------------------------------------------------------------------------- - ''' TODO SJL 04/04/20 This function is not used, remove? - ''' - ''' True if it succeeds, false if it fails. - '''-------------------------------------------------------------------------------------------- - Public Function GetbIsAssigned() As Boolean - If bUseBaseFunction Then - Return clsBaseFunction.bIsAssigned - ElseIf bUseBaseOperator Then - Return clsBaseOperator.bIsAssigned - ElseIf bUseCommandString Then - Return clsBaseCommandString.bIsAssigned - Else - Return False - End If - End Function - - '''-------------------------------------------------------------------------------------------- - ''' TODO SJL 04/04/20 This function is not used, remove? - ''' - ''' True if it succeeds, false if it fails. - '''-------------------------------------------------------------------------------------------- - Public Function GetbToBeAssigned() As Boolean - If bUseBaseFunction Then - Return clsBaseFunction.bToBeAssigned - ElseIf bUseBaseOperator Then - Return clsBaseOperator.bToBeAssigned - ElseIf bUseCommandString Then - Return clsBaseCommandString.bToBeAssigned - Else - Return False - End If - End Function - '''-------------------------------------------------------------------------------------------- ''' If the output from the R command needs to be assigned, then returns ''' the part of the script to the left of the assignment operator ('<-'). @@ -621,125 +590,16 @@ Public Class RSyntax '''-------------------------------------------------------------------------------------------- Public Function GetstrAssignTo() As String If bUseBaseFunction Then - Return clsBaseFunction.strAssignTo - ElseIf bUseBaseOperator Then - Return clsBaseOperator.strAssignTo - ElseIf bUseCommandString Then - Return clsBaseCommandString.strAssignTo - Else - Return "" - End If - End Function - - '''-------------------------------------------------------------------------------------------- - ''' TODO SJL 04/04/20 This function is not used, remove? - ''' - ''' A String. - '''-------------------------------------------------------------------------------------------- - Public Function GetstrAssignToColumn() As String - If bUseBaseFunction Then - Return clsBaseFunction.strAssignToColumn - ElseIf bUseBaseOperator Then - Return clsBaseOperator.strAssignToColumn - ElseIf bUseCommandString Then - Return clsBaseCommandString.strAssignToColumn - Else - Return "" - End If - End Function - - '''-------------------------------------------------------------------------------------------- - ''' TODO SJL 04/04/20 This function is not used, remove? - ''' - ''' A String. - '''-------------------------------------------------------------------------------------------- - Public Function GetstrAssignToDataFrame() As String - If bUseBaseFunction Then - Return clsBaseFunction.strAssignToDataFrame + Return clsBaseFunction.GetRObjectToAssignTo() ElseIf bUseBaseOperator Then - Return clsBaseOperator.strAssignToDataFrame + Return clsBaseOperator.GetRObjectToAssignTo() ElseIf bUseCommandString Then - Return clsBaseCommandString.strAssignToDataFrame + Return clsBaseCommandString.GetRObjectToAssignTo() Else Return "" End If End Function - '''-------------------------------------------------------------------------------------------- - ''' TODO SJL 04/04/20 This function is not used, remove? - ''' - ''' True to new. - '''-------------------------------------------------------------------------------------------- - Public Sub SetbIsAssigned(bNew As Boolean) - If bUseBaseFunction Then - clsBaseFunction.bIsAssigned = bNew - ElseIf bUseBaseOperator Then - clsBaseOperator.bIsAssigned = bNew - ElseIf bUseCommandString Then - clsBaseCommandString.bIsAssigned = bNew - End If - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' TODO SJL 04/04/20 This function is not used, remove? - ''' - ''' True to new. - '''-------------------------------------------------------------------------------------------- - Public Sub SetbToBeAssigned(bNew As Boolean) - If bUseBaseFunction Then - clsBaseFunction.bToBeAssigned = bNew - ElseIf bUseBaseOperator Then - clsBaseOperator.bToBeAssigned = bNew - ElseIf bUseCommandString Then - clsBaseCommandString.bToBeAssigned = bNew - End If - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' TODO SJL 04/04/20 This function is not used, remove? - ''' - ''' The new. - '''-------------------------------------------------------------------------------------------- - Public Sub SetstrAssignTo(strNew As String) - If bUseBaseFunction Then - clsBaseFunction.strAssignTo = strNew - ElseIf bUseBaseOperator Then - clsBaseOperator.strAssignTo = strNew - ElseIf bUseCommandString Then - clsBaseCommandString.strAssignTo = strNew - End If - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' TODO SJL 04/04/20 This function is not used, remove? - ''' - ''' The new. - '''-------------------------------------------------------------------------------------------- - Public Sub SetstrAssignToColumn(strNew As String) - If bUseBaseFunction Then - clsBaseFunction.strAssignToColumn = strNew - ElseIf bUseBaseOperator Then - clsBaseOperator.strAssignToColumn = strNew - ElseIf bUseCommandString Then - clsBaseCommandString.strAssignToColumn = strNew - End If - End Sub - - '''-------------------------------------------------------------------------------------------- - ''' TODO SJL 04/04/20 This function is not used, remove? - ''' - ''' The new. - '''-------------------------------------------------------------------------------------------- - Public Sub SetstrAssignToDataFrame(strNew As String) - If bUseBaseFunction Then - clsBaseFunction.strAssignToDataFrame = strNew - ElseIf bUseBaseOperator Then - clsBaseOperator.strAssignToDataFrame = strNew - ElseIf bUseCommandString Then - clsBaseCommandString.strAssignToDataFrame = strNew - End If - End Sub - '''-------------------------------------------------------------------------------------------- ''' Returns true if is in the list of 'before' R ''' functions/operators/commands (i.e. the ones that run before the base R code), diff --git a/instat/dlgOneVariableSummarise.vb b/instat/dlgOneVariableSummarise.vb index 72fee38aa68..1a812f48b7e 100644 --- a/instat/dlgOneVariableSummarise.vb +++ b/instat/dlgOneVariableSummarise.vb @@ -120,7 +120,7 @@ Public Class dlgOneVariableSummarise clsSkimrFunction.SetPackageName("skimr") clsSkimrFunction.SetRCommand("skim_without_charts") clsSkimrFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorOneVarSummarise.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) - clsSkimrFunction.SetAssignToRObject(strRObjectToAssignTo:="last_summary", + clsSkimrFunction.SetAssignToOutputObject(strRObjectToAssignTo:="last_summary", strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Summary, strRObjectFormatToAssignTo:=RObjectFormat.Text, strRDataFrameNameToAddObjectTo:=ucrSelectorOneVarSummarise.strCurrentDataFrame, @@ -137,7 +137,7 @@ Public Class dlgOneVariableSummarise clsMmtableOperator.AddParameter("mmtable_function", clsRFunctionParameter:=clsMmtableFunction, iPosition:=0) clsMmtableOperator.AddParameter("header_left_top_variable", clsRFunctionParameter:=clsHeaderLeftTopVariableFunction, iPosition:=1) clsMmtableOperator.AddParameter("header_top_left_summary", clsRFunctionParameter:=clsHeaderTopLeftSummaryFunction, iPosition:=2) - clsMmtableOperator.SetAssignToRObject(strRObjectToAssignTo:="last_summary", + clsMmtableOperator.SetAssignToOutputObject(strRObjectToAssignTo:="last_summary", strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, strRObjectFormatToAssignTo:=RObjectFormat.Html, strRDataFrameNameToAddObjectTo:=ucrSelectorOneVarSummarise.strCurrentDataFrame, @@ -172,7 +172,7 @@ Public Class dlgOneVariableSummarise clsSummaryFunction.SetRCommand("summary") clsSummaryFunction.AddParameter("maxsum", iMaxSum) clsSummaryFunction.AddParameter("na.rm", "FALSE", iPosition:=3) - clsSummaryFunction.SetAssignToRObject(strRObjectToAssignTo:="last_summary", + clsSummaryFunction.SetAssignToOutputObject(strRObjectToAssignTo:="last_summary", strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, strRObjectFormatToAssignTo:=RObjectFormat.Text, strRDataFrameNameToAddObjectTo:=ucrSelectorOneVarSummarise.strCurrentDataFrame, @@ -262,9 +262,9 @@ Public Class dlgOneVariableSummarise Private Sub ucrSelectorOneVarSummarise_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorOneVarSummarise.ControlValueChanged clsSkimrFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorOneVarSummarise.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) - clsSummaryFunction._rDataFrameNameToAddObjectTo = ucrSelectorOneVarSummarise.strCurrentDataFrame - clsMmtableOperator._rDataFrameNameToAddObjectTo = ucrSelectorOneVarSummarise.strCurrentDataFrame - clsSkimrFunction._rDataFrameNameToAddObjectTo = ucrSelectorOneVarSummarise.strCurrentDataFrame + clsSummaryFunction._strDataFrameNameToAddAssignToObject = ucrSelectorOneVarSummarise.strCurrentDataFrame + clsMmtableOperator._strDataFrameNameToAddAssignToObject = ucrSelectorOneVarSummarise.strCurrentDataFrame + clsSkimrFunction._strDataFrameNameToAddAssignToObject = ucrSelectorOneVarSummarise.strCurrentDataFrame End Sub Private Sub ucrChkOmitMissing_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkOmitMissing.ControlValueChanged diff --git a/instat/dlgOpenNetCDF.vb b/instat/dlgOpenNetCDF.vb index 8e771e967c5..431710c08bc 100644 --- a/instat/dlgOpenNetCDF.vb +++ b/instat/dlgOpenNetCDF.vb @@ -252,7 +252,6 @@ Public Class dlgOpenNetCDF If strFiles.Count > 0 Then CheckCloseFile() clsNcOpenFunction.AddParameter("filename", Chr(34) & Replace(strFiles(0), "\", "/") & Chr(34)) - clsNcOpenFunction.bToBeAssigned = True clsNcOpenFunction.ToScript(strTemp) frmMain.clsRLink.RunScript(strTemp, strComment:="Opening connection to first NetCDF file", bUpdateGrids:=False) bCloseFile = True diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index 27a7b64ed10..ff0232cb5f9 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -248,8 +248,6 @@ Public Class dlgRegularSequence 'clone the "rep" command base function clsNewRepClone = clsRepFunction.Clone() - clsNewRepClone.bToBeAssigned = False - clsNewRepClone.bIsAssigned = False 'set up "as.character" command to be usde for testing clsAsCharacter.SetRCommand("as.character") diff --git a/instat/dlgScatterPlot.vb b/instat/dlgScatterPlot.vb index ae0842aaf0d..8e4bc2a7aa9 100644 --- a/instat/dlgScatterPlot.vb +++ b/instat/dlgScatterPlot.vb @@ -213,7 +213,7 @@ Public Class dlgScatterPlot clsGeomSmoothFunction.AddParameter("method", Chr(34) & "lm" & Chr(34), iPosition:=0) clsGeomSmoothFunction.AddParameter("se", "FALSE", iPosition:=1) - clsBaseOperator.SetAssignToRObject(strRObjectToAssignTo:="last_graph", + clsBaseOperator.SetAssignToOutputObject(strRObjectToAssignTo:="last_graph", strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Graph, strRObjectFormatToAssignTo:=RObjectFormat.Image, strRDataFrameNameToAddObjectTo:=ucrSelectorForScatter.strCurrentDataFrame, diff --git a/instat/dlgSummaryTables.vb b/instat/dlgSummaryTables.vb index f5e17b37291..d96cdf3003d 100644 --- a/instat/dlgSummaryTables.vb +++ b/instat/dlgSummaryTables.vb @@ -387,7 +387,7 @@ Public Class dlgSummaryTables ucrBase.clsRsyntax.AddToBeforeCodes(clsFrequencyDefaultFunction, iPosition:=0) ucrBase.clsRsyntax.SetBaseROperator(clsJoiningPipeOperator) - clsJoiningPipeOperator.SetAssignToRObject(strRObjectToAssignTo:="last_table", + clsJoiningPipeOperator.SetAssignToOutputObject(strRObjectToAssignTo:="last_table", strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, strRObjectFormatToAssignTo:=RObjectFormat.Html, strRDataFrameNameToAddObjectTo:=ucrSelectorSummaryTables.strCurrentDataFrame, diff --git a/instat/dlgThreeVariableFrequencies.vb b/instat/dlgThreeVariableFrequencies.vb index dff94c7331f..4dd630a90b0 100644 --- a/instat/dlgThreeVariableFrequencies.vb +++ b/instat/dlgThreeVariableFrequencies.vb @@ -276,21 +276,21 @@ Public Class dlgThreeVariableFrequencies Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk Dim strGraph As String Dim strTempScript As String = "" - Dim bIsAssigned As Boolean - Dim bToBeAssigned As Boolean - Dim strAssignTo As String + 'Dim bIsAssigned As Boolean + 'Dim bToBeAssigned As Boolean + 'Dim strAssignTo As String If rdoBoth.Checked Then - bIsAssigned = clsGridArrange.bIsAssigned - bToBeAssigned = clsGridArrange.bToBeAssigned - strAssignTo = clsGridArrange.strAssignTo + 'bIsAssigned = clsGridArrange.bIsAssigned + 'bToBeAssigned = clsGridArrange.bToBeAssigned + 'strAssignTo = clsGridArrange.strAssignTo strGraph = clsGridArrange.ToScript(strTempScript) frmMain.clsRLink.RunScript(strTempScript & strGraph, iCallType:=3) - clsGridArrange.bIsAssigned = bIsAssigned - clsGridArrange.bToBeAssigned = bToBeAssigned - clsGridArrange.strAssignTo = strAssignTo + 'clsGridArrange.bIsAssigned = bIsAssigned + 'clsGridArrange.bToBeAssigned = bToBeAssigned + 'clsGridArrange.strAssignTo = strAssignTo End If End Sub diff --git a/instat/dlgThreeVariablePivotTable.vb b/instat/dlgThreeVariablePivotTable.vb index 826b5cc9417..ebf46750cc3 100644 --- a/instat/dlgThreeVariablePivotTable.vb +++ b/instat/dlgThreeVariablePivotTable.vb @@ -174,7 +174,7 @@ Public Class dlgThreeVariablePivotTable clsRPivotTableFunction.AddParameter("data", clsRFunctionParameter:=ucrSelectorPivot.ucrAvailableDataFrames.clsCurrDataFrame, iPosition:=0) clsRPivotTableFunction.SetAssignTo("last_table") - clsRPivotTableFunction.SetAssignToRObject(strRObjectToAssignTo:="last_table", + clsRPivotTableFunction.SetAssignToOutputObject(strRObjectToAssignTo:="last_table", strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, strRObjectFormatToAssignTo:=RObjectFormat.Html, strRDataFrameNameToAddObjectTo:=ucrSelectorPivot.strCurrentDataFrame, @@ -227,7 +227,7 @@ Public Class dlgThreeVariablePivotTable Private Sub ucrSelectorPivot_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorPivot.ControlValueChanged ChangeDataParameterValue() - clsRPivotTableFunction._rDataFrameNameToAddObjectTo = ucrSelectorPivot.strCurrentDataFrame + clsRPivotTableFunction._strDataFrameNameToAddAssignToObject = ucrSelectorPivot.strCurrentDataFrame End Sub Private Sub ChangeDataParameterValue() diff --git a/instat/dlgTwoWayFrequencies.vb b/instat/dlgTwoWayFrequencies.vb index 6c4bac5673b..f4cfee0920b 100644 --- a/instat/dlgTwoWayFrequencies.vb +++ b/instat/dlgTwoWayFrequencies.vb @@ -260,21 +260,21 @@ Public Class dlgTwoWayFrequencies Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk Dim strGraph As String Dim strTempScript As String = "" - Dim bIsAssigned As Boolean - Dim bToBeAssigned As Boolean - Dim strAssignTo As String + 'Dim bIsAssigned As Boolean + 'Dim bToBeAssigned As Boolean + 'Dim strAssignTo As String If rdoBoth.Checked Then - bIsAssigned = clsSjPlot.bIsAssigned - bToBeAssigned = clsSjPlot.bToBeAssigned - strAssignTo = clsSjPlot.strAssignTo + 'bIsAssigned = clsSjPlot.bIsAssigned + ' bToBeAssigned = clsSjPlot.bToBeAssigned + 'strAssignTo = clsSjPlot.strAssignTo strGraph = clsSjPlot.ToScript(strTempScript) frmMain.clsRLink.RunScript(strTempScript & strGraph, iCallType:=3) - clsSjPlot.bIsAssigned = bIsAssigned - clsSjPlot.bToBeAssigned = bToBeAssigned - clsSjPlot.strAssignTo = strAssignTo + 'clsSjPlot.bIsAssigned = bIsAssigned + 'clsSjPlot.bToBeAssigned = bToBeAssigned + 'clsSjPlot.strAssignTo = strAssignTo End If End Sub diff --git a/instat/dlgViewLabelsAndLevels.vb b/instat/dlgViewLabelsAndLevels.vb index cca6681757f..63e3f3a62c5 100644 --- a/instat/dlgViewLabelsAndLevels.vb +++ b/instat/dlgViewLabelsAndLevels.vb @@ -141,7 +141,7 @@ Public Class dlgViewFactorLabels clsSjTableFunction.AddParameter("show.id", "FALSE") clsSjTableFunction.SetAssignTo("variables_sjTable") - clsSjTableFunction.SetAssignToRObject(strRObjectToAssignTo:="last_table", + clsSjTableFunction.SetAssignToOutputObject(strRObjectToAssignTo:="last_table", strRObjectTypeLabelToAssignTo:=RObjectTypeLabel.Table, strRObjectFormatToAssignTo:=RObjectFormat.Html, strRDataFrameNameToAddObjectTo:=ucrSelectorViewLabelsAndLevels.strCurrentDataFrame, @@ -231,7 +231,7 @@ Public Class dlgViewFactorLabels End Sub Private Sub ucrSelectorViewLabelsAndLevels_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorViewLabelsAndLevels.ControlValueChanged - clsSjTableFunction._rDataFrameNameToAddObjectTo = ucrSelectorViewLabelsAndLevels.strCurrentDataFrame + clsSjTableFunction._strDataFrameNameToAddAssignToObject = ucrSelectorViewLabelsAndLevels.strCurrentDataFrame End Sub diff --git a/instat/ucrButtons.vb b/instat/ucrButtons.vb index b7717ee9310..90b3fe6e065 100644 --- a/instat/ucrButtons.vb +++ b/instat/ucrButtons.vb @@ -125,7 +125,7 @@ Public Class ucrButtons Dim bFirstCode As Boolean = True Dim clsRemoveFunc As New RFunction Dim clsRemoveListFun As New RFunction - Dim lstAssignToCodes As New List(Of RCodeStructure) + Dim lstAssignToCodes As New List(Of RCodeStructure) 'todo. remove after refactoring GetAllAssignTo Dim lstAssignToStrings As New List(Of String) 'rm is the R function to remove the created objects from the memory at the end of the script and c is the function that puts them together in a list @@ -217,11 +217,6 @@ Public Class ucrButtons Else frmMain.AddToScriptWindow(clsRemoveFunc.ToScript()) End If - For i As Integer = 0 To lstAssignToCodes.Count - 1 - lstAssignToCodes(i).bToBeAssigned = True - lstAssignToCodes(i).strAssignTo = lstAssignToStrings(i) - lstAssignToCodes(i).bIsAssigned = False - Next End Sub Public Sub OKEnabled(bEnabled As Boolean) diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index 991a923123d..6e5491a7384 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -517,7 +517,7 @@ Public Class ucrCore ''' Returns true if the control's R code can be safely updated. ''' True if the primary parameter is defined but is not part of the control's R code. ''' Else returns false. - Protected Overridable Function CanUpdate() + Protected Overridable Function CanUpdate() As Boolean Return (clsParameter IsNot Nothing AndAlso (Not clsRCode.ContainsParameter(clsParameter.strArgumentName)) AndAlso clsParameter.HasValue()) End Function diff --git a/instat/ucrSave.vb b/instat/ucrSave.vb index e1fa34a9ad9..1c2e1712b33 100644 --- a/instat/ucrSave.vb +++ b/instat/ucrSave.vb @@ -656,19 +656,19 @@ Public Class ucrSave RObjectTypeLabel.Summary, RObjectTypeLabel.Table, RObjectTypeLabel.Model - If _strRObjectLabel = RObjectTypeLabel.Table AndAlso String.IsNullOrEmpty(_strRObjectFormat) Then - 'todo. temporary check until all table dialogs are modified to set _strRObjectFormat + If (_strRObjectLabel = RObjectTypeLabel.Table OrElse _strRObjectLabel = RObjectTypeLabel.Model) AndAlso + String.IsNullOrEmpty(_strRObjectFormat) Then + 'todo. temporary check until all table and model dialogs are modified to set _strRObjectFormat clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, strTempTable:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix) Else - clsTempCode.SetAssignToRObject(strRObjectToAssignTo:=strSaveName, + clsTempCode.SetAssignToOutputObject(strRObjectToAssignTo:=strSaveName, strRObjectTypeLabelToAssignTo:=_strRObjectLabel, strRObjectFormatToAssignTo:=_strRObjectFormat, strRDataFrameNameToAddObjectTo:=strDataName, - strObjectName:=strSaveName, - bAssignToIsPrefix:=bAssignToIsPrefix) + strObjectName:=strSaveName) End If Case "surv" clsTempCode.SetAssignTo(strTemp:=strSaveName, strTempDataframe:=strDataName, strTempSurv:=strSaveName, bAssignToIsPrefix:=bAssignToIsPrefix) @@ -714,9 +714,7 @@ Public Class ucrSave If clsMainRCode IsNot Nothing Then If String.IsNullOrEmpty(strReadNameFromParameterName) Then - If clsMainRCode.bToBeAssigned OrElse clsMainRCode.bIsAssigned Then - strControlValue = If(clsMainRCode.strAssignTo IsNot Nothing, clsMainRCode.strAssignTo, "") - End If + strControlValue = If(clsMainRCode.GetRObjectToAssignTo IsNot Nothing, clsMainRCode.GetRObjectToAssignTo, "") Else If clsMainRCode.GetParameter(strReadNameFromParameterName) IsNot Nothing Then strControlValue = clsMainRCode.GetParameter(strReadNameFromParameterName).strArgumentValue @@ -736,7 +734,7 @@ Public Class ucrSave If GetText() = strAssignToIfUnchecked Then ucrChkSave.Checked = False Else - ucrChkSave.Checked = (clsMainRCode.bToBeAssigned OrElse clsMainRCode.bIsAssigned) + ucrChkSave.Checked = Not String.IsNullOrEmpty(clsMainRCode.GetRObjectToAssignTo()) End If End If @@ -818,7 +816,7 @@ Public Class ucrSave ''' If the type of object to save is specified (e.g. column), the R code's output ''' hasn't been assigned, and doesn't need to be assigned, then returns true. '''-------------------------------------------------------------------------------------------- - Protected Overrides Function CanUpdate() As Object + Protected Overrides Function CanUpdate() As Boolean 'TODO SJL 15/05/20 ' - Should this function return boolean? The parent function in ucrCore has no return type! Is this good coding practice? ' - The parent function returns true if the control has a paremter that is not yet included in the R command. Why is this control different? @@ -826,7 +824,8 @@ Public Class ucrSave If _strRObjectLabel = "key" OrElse _strRObjectLabel = "link" Then Return MyBase.CanUpdate() Else - Return ((Not GetRCode().bIsAssigned AndAlso Not GetRCode().bToBeAssigned) AndAlso _strRObjectLabel <> "") + 'Return ((Not GetRCode().bIsAssigned AndAlso Not GetRCode().bToBeAssigned) AndAlso _strRObjectLabel <> "") + Return (String.IsNullOrEmpty(GetRCode().GetRObjectToAssignTo()) AndAlso _strRObjectLabel <> "") End If End Function '''-------------------------------------------------------------------------------------------- diff --git a/instat/ucrTry.vb b/instat/ucrTry.vb index dbc910d4bb8..dbf965054fd 100644 --- a/instat/ucrTry.vb +++ b/instat/ucrTry.vb @@ -98,8 +98,9 @@ Public Class ucrTry Dim clsCodeClone As RCodeStructure = clsTempCode.Clone() Dim strBeforeAfterScript As String = "" Dim strBeforeAfterTemp As String = clsCodeClone.ToScript(strBeforeAfterScript) - 'Sometimes the output of the R-command we deal with should not be part of the script... That's only the case when this output has already been assigned. - If clsCodeClone.bExcludeAssignedFunctionOutput AndAlso clsCodeClone.bIsAssigned Then + 'Sometimes the output of the R-command we deal with should not be part of the script... + 'That's only the case when this output has already been assigned. + If clsCodeClone.bExcludeAssignedFunctionOutput AndAlso clsCodeClone.IsAssigned() Then lstScripts.Add(strBeforeAfterScript) Else lstScripts.Add(strBeforeAfterScript & strBeforeAfterTemp) @@ -184,8 +185,8 @@ Public Class ucrTry Dim clsCodeClone As RCodeStructure = clsTempCode.Clone() Dim strBeforeAfterScript As String = "" Dim strBeforeAfterTemp As String = clsCodeClone.ToScript(strBeforeAfterScript) - 'Sometimes the output of the R-command we deal with should not be part of the script... That's only the case when this output has already been assigned. - If clsCodeClone.bExcludeAssignedFunctionOutput AndAlso clsCodeClone.bIsAssigned Then + 'Sometimes the output of the R-command we deal with should not be part of the script... + If clsCodeClone.bExcludeAssignedFunctionOutput Then lstScripts.Add(strBeforeAfterScript) Else lstScripts.Add(strBeforeAfterScript & strBeforeAfterTemp) From 83544b86e32af3e965119f444bc0811d98c460ad Mon Sep 17 00:00:00 2001 From: patowhiz Date: Fri, 11 Nov 2022 11:13:51 +0300 Subject: [PATCH 094/122] added comment --- instat/clsRCodeStructure.vb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index ffda0c9a231..93ccc65dbe2 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -463,6 +463,7 @@ Public Class RCodeStructure ' e.g. "row_names1 <- data_book$get_row_names(data_name=""survey"")" & vbCrLf & "data_book$add_columns_to_data(data_name=""survey"", col_name=""row_names1"", col_data=row_names1, before=TRUE)" & vbCrLf strScript = strScript & clsAddRObject.ToScript() & Environment.NewLine + 'todo. when is this ever used? as of 11/11/2022, this code is not used during execution clsGetRObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_columns_from_data") clsGetRObject.AddParameter("data_name", Chr(34) & _strDataFrameNameToAddAssignToObject & Chr(34)) clsGetRObject.AddParameter("col_names", Chr(34) & _strAssignToName & Chr(34)) @@ -490,7 +491,7 @@ Public Class RCodeStructure ' & "data_book$import_data(data_tables=list(my_stations=my_stations))" & vbCrLf strScript = strScript & clsAddRObject.ToScript() & Environment.NewLine - 'todo. when is this ever used? as of 11/11/2022, this is code is not used during execution + 'todo. when is this ever used? as of 11/11/2022, this code is not used during execution clsGetRObject.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_data_frame") clsGetRObject.AddParameter("data_name", Chr(34) & _strAssignToName & Chr(34)) 'Set 'strAssignTo' to final assign-to script From ae42d03df5ae7dc7b36a99ae32cc2d684990fa6e Mon Sep 17 00:00:00 2001 From: patowhiz Date: Fri, 11 Nov 2022 11:14:17 +0300 Subject: [PATCH 095/122] removed spaces --- instat/clsRCodeStructure.vb | 3 --- 1 file changed, 3 deletions(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index 93ccc65dbe2..a5612707b24 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -418,9 +418,6 @@ Public Class RCodeStructure '''-------------------------------------------------------------------------------------------- Public Overridable Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String - - - ' if R script still needs to be assigned to this object If Not String.IsNullOrEmpty(_strAssignToObject) Then From 0954ba1829d00e51748c961e914fea0c02af5cbc Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Tue, 15 Nov 2022 08:34:16 +0300 Subject: [PATCH 096/122] Minor improvement in New Dataframe dialogue --- instat/dlgNewDataFrame.vb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/instat/dlgNewDataFrame.vb b/instat/dlgNewDataFrame.vb index d72a9f5538d..440367a8574 100644 --- a/instat/dlgNewDataFrame.vb +++ b/instat/dlgNewDataFrame.vb @@ -600,9 +600,12 @@ Public Class dlgNewDataFrame If dataTypeGridView.CurrentCell.ColumnIndex = 2 Then Dim iColumnLevelIndex As Integer = dataTypeGridView.CurrentRow.Cells("colLevels").ColumnIndex Dim iRowLevelIndex As Integer = dataTypeGridView.CurrentRow.Cells("colLevels").RowIndex + Dim iColDefaultIndex As Integer = dataTypeGridView.CurrentRow.Cells("colDefault").ColumnIndex + Dim iRowDefaultIndex As Integer = dataTypeGridView.CurrentRow.Cells("colDefault").RowIndex Dim selectedCombobox As ComboBox = DirectCast(sender, ComboBox) If selectedCombobox.SelectedItem = "Factor" Then dataTypeGridView(iColumnLevelIndex, iRowLevelIndex).ReadOnly = False + dataTypeGridView(iColDefaultIndex, iRowDefaultIndex).Value = "NA" Else dataTypeGridView(iColumnLevelIndex, iRowLevelIndex).ReadOnly = True dataTypeGridView(iColumnLevelIndex, iRowLevelIndex).Value = "" From ec4d93c12f4c36d607614df15188a5f124301c49 Mon Sep 17 00:00:00 2001 From: VictorM Date: Wed, 16 Nov 2022 09:18:12 +0300 Subject: [PATCH 097/122] Create new Search dialog --- instat/dlgSearch.Designer.vb | 42 ++++++++++++ instat/dlgSearch.resx | 120 +++++++++++++++++++++++++++++++++++ instat/dlgSearch.vb | 3 + instat/frmMain.Designer.vb | 22 +++++-- instat/frmMain.vb | 4 ++ instat/instat.vbproj | 9 +++ 6 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 instat/dlgSearch.Designer.vb create mode 100644 instat/dlgSearch.resx create mode 100644 instat/dlgSearch.vb diff --git a/instat/dlgSearch.Designer.vb b/instat/dlgSearch.Designer.vb new file mode 100644 index 00000000000..e5ac2666863 --- /dev/null +++ b/instat/dlgSearch.Designer.vb @@ -0,0 +1,42 @@ + +Partial Class dlgSearch + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + + Private Sub InitializeComponent() + Me.SuspendLayout() + ' + 'dlgSearch + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi + Me.AutoSize = True + Me.ClientSize = New System.Drawing.Size(390, 255) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow + Me.MaximizeBox = False + Me.Name = "dlgSearch" + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen + Me.Tag = "Search" + Me.Text = "Search" + Me.ResumeLayout(False) + + End Sub +End Class diff --git a/instat/dlgSearch.resx b/instat/dlgSearch.resx new file mode 100644 index 00000000000..1af7de150c9 --- /dev/null +++ b/instat/dlgSearch.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/instat/dlgSearch.vb b/instat/dlgSearch.vb new file mode 100644 index 00000000000..5b2c4608dee --- /dev/null +++ b/instat/dlgSearch.vb @@ -0,0 +1,3 @@ +Public Class dlgSearch + +End Class \ No newline at end of file diff --git a/instat/frmMain.Designer.vb b/instat/frmMain.Designer.vb index 3c32301a5f5..380e21e2dcc 100644 --- a/instat/frmMain.Designer.vb +++ b/instat/frmMain.Designer.vb @@ -498,6 +498,7 @@ Partial Class frmMain Me.mnuPrepareColumnFactorFactorDataFrame = New System.Windows.Forms.ToolStripMenuItem() Me.mnuPrepareColumnText = New System.Windows.Forms.ToolStripMenuItem() Me.mnuPrepareColumnTextFindReplace = New System.Windows.Forms.ToolStripMenuItem() + Me.mnuPrepareColumnTextSearch = New System.Windows.Forms.ToolStripMenuItem() Me.mnuPrepareColumnTextTransform = New System.Windows.Forms.ToolStripMenuItem() Me.mnuPrepareColumnTextSplit = New System.Windows.Forms.ToolStripMenuItem() Me.mnuPrepareColumnTextCombine = New System.Windows.Forms.ToolStripMenuItem() @@ -3839,7 +3840,7 @@ Partial Class frmMain ' 'mnuPrepareColumnText ' - Me.mnuPrepareColumnText.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuPrepareColumnTextFindReplace, Me.mnuPrepareColumnTextTransform, Me.mnuPrepareColumnTextSplit, Me.mnuPrepareColumnTextCombine, Me.mnuPrepareColumnTextMatch, Me.mnuPrepareColumnTextDistance}) + Me.mnuPrepareColumnText.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuPrepareColumnTextFindReplace, Me.mnuPrepareColumnTextSearch, Me.mnuPrepareColumnTextTransform, Me.mnuPrepareColumnTextSplit, Me.mnuPrepareColumnTextCombine, Me.mnuPrepareColumnTextMatch, Me.mnuPrepareColumnTextDistance}) Me.mnuPrepareColumnText.Name = "mnuPrepareColumnText" Me.mnuPrepareColumnText.Size = New System.Drawing.Size(186, 22) Me.mnuPrepareColumnText.Tag = "Column:_Text" @@ -3848,28 +3849,34 @@ Partial Class frmMain 'mnuPrepareColumnTextFindReplace ' Me.mnuPrepareColumnTextFindReplace.Name = "mnuPrepareColumnTextFindReplace" - Me.mnuPrepareColumnTextFindReplace.Size = New System.Drawing.Size(152, 22) + Me.mnuPrepareColumnTextFindReplace.Size = New System.Drawing.Size(180, 22) Me.mnuPrepareColumnTextFindReplace.Tag = "Find/Replace..." Me.mnuPrepareColumnTextFindReplace.Text = "Find/Replace..." ' + 'mnuPrepareColumnTextSearch + ' + Me.mnuPrepareColumnTextSearch.Name = "mnuPrepareColumnTextSearch" + Me.mnuPrepareColumnTextSearch.Size = New System.Drawing.Size(180, 22) + Me.mnuPrepareColumnTextSearch.Text = "Search..." + ' 'mnuPrepareColumnTextTransform ' Me.mnuPrepareColumnTextTransform.Name = "mnuPrepareColumnTextTransform" - Me.mnuPrepareColumnTextTransform.Size = New System.Drawing.Size(152, 22) + Me.mnuPrepareColumnTextTransform.Size = New System.Drawing.Size(180, 22) Me.mnuPrepareColumnTextTransform.Tag = "Transform..." Me.mnuPrepareColumnTextTransform.Text = "Transform..." ' 'mnuPrepareColumnTextSplit ' Me.mnuPrepareColumnTextSplit.Name = "mnuPrepareColumnTextSplit" - Me.mnuPrepareColumnTextSplit.Size = New System.Drawing.Size(152, 22) + Me.mnuPrepareColumnTextSplit.Size = New System.Drawing.Size(180, 22) Me.mnuPrepareColumnTextSplit.Tag = "Split..." Me.mnuPrepareColumnTextSplit.Text = "Split..." ' 'mnuPrepareColumnTextCombine ' Me.mnuPrepareColumnTextCombine.Name = "mnuPrepareColumnTextCombine" - Me.mnuPrepareColumnTextCombine.Size = New System.Drawing.Size(152, 22) + Me.mnuPrepareColumnTextCombine.Size = New System.Drawing.Size(180, 22) Me.mnuPrepareColumnTextCombine.Tag = "Combine..." Me.mnuPrepareColumnTextCombine.Text = "Combine..." ' @@ -3877,7 +3884,7 @@ Partial Class frmMain ' Me.mnuPrepareColumnTextMatch.Enabled = False Me.mnuPrepareColumnTextMatch.Name = "mnuPrepareColumnTextMatch" - Me.mnuPrepareColumnTextMatch.Size = New System.Drawing.Size(152, 22) + Me.mnuPrepareColumnTextMatch.Size = New System.Drawing.Size(180, 22) Me.mnuPrepareColumnTextMatch.Tag = "Match..." Me.mnuPrepareColumnTextMatch.Text = "Match..." Me.mnuPrepareColumnTextMatch.Visible = False @@ -3885,7 +3892,7 @@ Partial Class frmMain 'mnuPrepareColumnTextDistance ' Me.mnuPrepareColumnTextDistance.Name = "mnuPrepareColumnTextDistance" - Me.mnuPrepareColumnTextDistance.Size = New System.Drawing.Size(152, 22) + Me.mnuPrepareColumnTextDistance.Size = New System.Drawing.Size(180, 22) Me.mnuPrepareColumnTextDistance.Tag = "Distance..." Me.mnuPrepareColumnTextDistance.Text = "Distance..." ' @@ -5816,4 +5823,5 @@ Partial Class frmMain Friend WithEvents mnuFileImportFromRapidPro As ToolStripMenuItem Friend WithEvents mnuFileImportFromPostgres As ToolStripMenuItem Friend WithEvents mnuEditWordwrap As ToolStripMenuItem + Friend WithEvents mnuPrepareColumnTextSearch As ToolStripMenuItem End Class diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 7e9e0f4d0a9..7e09217fabb 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -2478,4 +2478,8 @@ Public Class frmMain Private Sub mnuEditWordwrap_Click(sender As Object, e As EventArgs) Handles mnuEditWordwrap.Click dlgWordwrap.ShowDialog() End Sub + + Private Sub mnuPrepareColumnTextSearch_Click(sender As Object, e As EventArgs) Handles mnuPrepareColumnTextSearch.Click + dlgSearch.ShowDialog() + End Sub End Class diff --git a/instat/instat.vbproj b/instat/instat.vbproj index 70c71c81b92..289743bc7cc 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -222,6 +222,12 @@ Form + + dlgSearch.vb + + + Form + dlgWordwrap.vb @@ -3021,6 +3027,9 @@ dlgScript.vb + + dlgSearch.vb + dlgSeasonalPlot.vb From ca6dbf4055cb7326193f43e11a66115ab2c46b3c Mon Sep 17 00:00:00 2001 From: VictorM Date: Thu, 17 Nov 2022 07:49:43 +0300 Subject: [PATCH 098/122] hide visibility of the dialog --- instat/dlgSearch.Designer.vb | 1 + 1 file changed, 1 insertion(+) diff --git a/instat/dlgSearch.Designer.vb b/instat/dlgSearch.Designer.vb index e5ac2666863..70fcc27a8d7 100644 --- a/instat/dlgSearch.Designer.vb +++ b/instat/dlgSearch.Designer.vb @@ -30,6 +30,7 @@ Partial Class dlgSearch Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True Me.ClientSize = New System.Drawing.Size(390, 255) + Me.Enabled = False Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.Name = "dlgSearch" From cccbce1f67150a5d0f6db4f7268ffd75c3a9e1a6 Mon Sep 17 00:00:00 2001 From: VictorM Date: Thu, 17 Nov 2022 08:25:01 +0300 Subject: [PATCH 099/122] Hide the visibility of the dialog --- instat/dlgSearch.Designer.vb | 1 - instat/frmMain.Designer.vb | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/dlgSearch.Designer.vb b/instat/dlgSearch.Designer.vb index 70fcc27a8d7..e5ac2666863 100644 --- a/instat/dlgSearch.Designer.vb +++ b/instat/dlgSearch.Designer.vb @@ -30,7 +30,6 @@ Partial Class dlgSearch Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True Me.ClientSize = New System.Drawing.Size(390, 255) - Me.Enabled = False Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.Name = "dlgSearch" diff --git a/instat/frmMain.Designer.vb b/instat/frmMain.Designer.vb index 380e21e2dcc..455ea71ede5 100644 --- a/instat/frmMain.Designer.vb +++ b/instat/frmMain.Designer.vb @@ -3858,6 +3858,7 @@ Partial Class frmMain Me.mnuPrepareColumnTextSearch.Name = "mnuPrepareColumnTextSearch" Me.mnuPrepareColumnTextSearch.Size = New System.Drawing.Size(180, 22) Me.mnuPrepareColumnTextSearch.Text = "Search..." + Me.mnuPrepareColumnTextSearch.Visible = False ' 'mnuPrepareColumnTextTransform ' From 1ab1f21e2d00b0422f4042de3286840869f22d62 Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Sun, 20 Nov 2022 11:28:13 +0300 Subject: [PATCH 100/122] clearing receivers --- instat/dlgHideDataframes.vb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 846560bdd62..0726c07ba63 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -38,6 +38,7 @@ Public Class dlgHideDataframes SetDefaults() End If SetHiddenColumns() + ReopenDialog() SetRCodeForControls(bReset) bReset = False autoTranslate(Me) @@ -126,9 +127,11 @@ Public Class dlgHideDataframes Dim clsGetHiddenDataFrames As New RFunction clsGetHiddenDataFrames.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_hidden_data_frames") + clsHideDataFramesFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$set_hidden_data_frames") ucrSelectorForDataFrames.lstAvailableVariable.Items.Clear() expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsGetHiddenDataFrames.ToScript(), bSilent:=True) + If expTemp IsNot Nothing AndAlso expTemp.Type <> Internals.SymbolicExpressionType.Null Then chrHiddenColumns = expTemp.AsCharacter For Each strDataFrame As String In chrHiddenColumns @@ -165,4 +168,10 @@ Public Class dlgHideDataframes TestOKEnabled() clsDataUnhideOperator.AddParameter("data", ucrReceiverMultipleUnhide.GetVariableNames(True), iPosition:=0, bIncludeArgumentName:=False) End Sub + + Private Sub ReopenDialog() + ucrReceiverMultiple.Clear() + ucrReceiverMultipleUnhide.Clear() + End Sub + End Class \ No newline at end of file From 0262d53b1f40015d56f7839087ed44e1f93dd971 Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Mon, 21 Nov 2022 09:50:29 +0300 Subject: [PATCH 101/122] clear the receivers when hide & unhide dataframes --- instat/dlgHideDataframes.vb | 1 - 1 file changed, 1 deletion(-) diff --git a/instat/dlgHideDataframes.vb b/instat/dlgHideDataframes.vb index 0726c07ba63..482f211ce9f 100644 --- a/instat/dlgHideDataframes.vb +++ b/instat/dlgHideDataframes.vb @@ -173,5 +173,4 @@ Public Class dlgHideDataframes ucrReceiverMultiple.Clear() ucrReceiverMultipleUnhide.Clear() End Sub - End Class \ No newline at end of file From d9206f296e682e8dbe6692310779faa14f409b67 Mon Sep 17 00:00:00 2001 From: Vitalis95 Date: Mon, 21 Nov 2022 10:22:43 +0300 Subject: [PATCH 102/122] database changes --- instat/dlgCluster.Designer.vb | 2 +- instat/translations/rInstatTranslations.db | Bin 6496256 -> 6496256 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/dlgCluster.Designer.vb b/instat/dlgCluster.Designer.vb index 41fb25c9194..a507889f50f 100644 --- a/instat/dlgCluster.Designer.vb +++ b/instat/dlgCluster.Designer.vb @@ -194,7 +194,7 @@ Partial Class dlgCluster Me.ucrPnlSelectData.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink Me.ucrPnlSelectData.Location = New System.Drawing.Point(255, 65) Me.ucrPnlSelectData.Name = "ucrPnlSelectData" - Me.ucrPnlSelectData.Size = New System.Drawing.Size(135, 48) + Me.ucrPnlSelectData.Size = New System.Drawing.Size(160, 48) Me.ucrPnlSelectData.TabIndex = 4 ' 'ucrPnlPrepareData diff --git a/instat/translations/rInstatTranslations.db b/instat/translations/rInstatTranslations.db index ef2f9024c0a0e881229c8ebdcd124c4c575ab3b0..fef21885f6e89ba07a1ea8be9fb8a163123e43b8 100644 GIT binary patch delta 712 zcmZwFJ4{ny7{>9_p0Av?+7=bCl%lQT6Fng9qw!w{BZ;e=~J ziT4*Rvt&9-rn6+KZ%pyM5>kJ80`8CA8E?w@&G|eqtUUDwJzqSJJQ@4e3(>2(+(o4) zARoUKtyiAs@UFA-nIjXcr>jP*T#G6S_!>=)L7x zzkEL@YX5Tx*XTcW5uK>UV^h=f0xr}*gBu=ru>vdMgC7CZVii_n4eC&j2CPL8jR>I$ zVKieM)+2%_Hee%KunC*71zWKV+tG?PRR4^l9Xrs0o!Eul=)@lE#XjuE0UX339L5nG z#W5U57ZT`34|F7P0w<9|FHYe!`p}O7q;bZco;M~MoZ75Z7mXIzkXzB7*=>u)h!*zU zQ0iP!ON*KLkwkucbSzge2d(m5T8hc^OA-8A>7SbX!OZpB`COzsJC=>;h3w5-#wy<- z+_5|y*9NTecy$(z&&EHqke>?v=Bdh(fwLIIIb?7i7jO|nxP;5Nf~&ZOtX)|ePA7i@ D>RT}r delta 654 zcmX}pJxmjE9LDkX?ti^rwJk!$+7_{bue2b(YgI(_ihxx-0bdXW&zP9#pix7N2{$w_ z*dTHE$HfG7Fkv_o#Dh)4Y9dbJqC1I+iBVU-G|}NR{C>~&JR|QOsUvut^v_SE+O&CJ zWB!$67j1vhR*JSdV~ZbdA~X@|P?nUb=#cMaC~kZ+o*8{cGWa3*(7W|obgEj^?|TrH zlW#?X48Kt0a_PN@$*<4VS~)%~5?5lz^RX6(RD?80vB!CvgcejGp!2XP38(Sjpr z#Zk237>>h49_=`R4s@amCsDvDoJKd!cw=+caJ3S?A=L$|UhC0+>QB7Pf^}Ut`km5! zHqo=v`C?_3TaU}{pRFomz$x8Z4x0Z5;qplG>77WW=yghWrTfWB$%@HBtUQ+dcso)v h>MmM1iyri%59e?m7jO~%xP$>*#uW^D?&45){x8LdB0B&8 From 90cf763fba8fa301ba58bcda8c0fe7fb3750424c Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Mon, 21 Nov 2022 11:55:18 +0300 Subject: [PATCH 103/122] Adding the frequency functions. --- instat/ucrCalculator.Designer.vb | 350 ++++++++++++++++++++++++++++--- instat/ucrCalculator.resx | 3 + instat/ucrCalculator.vb | 280 ++++++++++++++++++++++--- 3 files changed, 582 insertions(+), 51 deletions(-) diff --git a/instat/ucrCalculator.Designer.vb b/instat/ucrCalculator.Designer.vb index deda6c34aa6..23b1507838d 100644 --- a/instat/ucrCalculator.Designer.vb +++ b/instat/ucrCalculator.Designer.vb @@ -83,6 +83,7 @@ Partial Class ucrCalculator Me.cmdYmd = New System.Windows.Forms.Button() Me.cmdLeap = New System.Windows.Forms.Button() Me.grpInteger = New System.Windows.Forms.GroupBox() + Me.cmdLucas = New System.Windows.Forms.Button() Me.cmdFactorize = New System.Windows.Forms.Button() Me.cmdSquare = New System.Windows.Forms.Button() Me.cmdTriangle = New System.Windows.Forms.Button() @@ -259,7 +260,22 @@ Partial Class ucrCalculator Me.cmdCos = New System.Windows.Forms.Button() Me.cmdSqrt = New System.Windows.Forms.Button() Me.grpSummary = New System.Windows.Forms.GroupBox() - Me.cmdSummaryHelp = New System.Windows.Forms.Button() + Me.grpFrequencies = New System.Windows.Forms.GroupBox() + Me.cmdFreqQuantile = New System.Windows.Forms.Button() + Me.cmdFreqPropn = New System.Windows.Forms.Button() + Me.cmdFreqDistinct = New System.Windows.Forms.Button() + Me.cmdFreqIQR = New System.Windows.Forms.Button() + Me.cmdFreqMedian = New System.Windows.Forms.Button() + Me.cmdFreqSd = New System.Windows.Forms.Button() + Me.cmdFreqVar = New System.Windows.Forms.Button() + Me.cmdFreqMean = New System.Windows.Forms.Button() + Me.cmdFreqMad = New System.Windows.Forms.Button() + Me.cmdFreqMiss = New System.Windows.Forms.Button() + Me.cmdFreqMode1 = New System.Windows.Forms.Button() + Me.cmdFreqMax = New System.Windows.Forms.Button() + Me.cmdFreqMin = New System.Windows.Forms.Button() + Me.cmdFreqSum = New System.Windows.Forms.Button() + Me.cmdFreqLength = New System.Windows.Forms.Button() Me.cmdKurtosis = New System.Windows.Forms.Button() Me.cmdMode1 = New System.Windows.Forms.Button() Me.cmdMode = New System.Windows.Forms.Button() @@ -454,7 +470,14 @@ Partial Class ucrCalculator Me.cmdbegin = New System.Windows.Forms.Button() Me.cmdAny1 = New System.Windows.Forms.Button() Me.cmdStringRHelp = New System.Windows.Forms.Button() - Me.cmdLucas = New System.Windows.Forms.Button() + Me.ContextMenuStripSummary = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.BaseToolStripMenuItem1 = New System.Windows.Forms.ToolStripMenuItem() + Me.StatsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.StatipToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.E1071ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.RobustbaseToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.RasterToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.cmdSummaryRHelp = New instat.ucrSplitButton() Me.cmdIntegerRHelp = New instat.ucrSplitButton() Me.cmdTransformRHelp = New instat.ucrSplitButton() Me.ucrSaveResultInto = New instat.ucrSave() @@ -471,6 +494,7 @@ Partial Class ucrCalculator Me.grpWakefield.SuspendLayout() Me.grpMaths.SuspendLayout() Me.grpSummary.SuspendLayout() + Me.grpFrequencies.SuspendLayout() Me.grpProbabilty.SuspendLayout() Me.grpTransform.SuspendLayout() Me.ContextMenuStripTransform.SuspendLayout() @@ -479,6 +503,7 @@ Partial Class ucrCalculator Me.grpCircular.SuspendLayout() Me.grpModifier.SuspendLayout() Me.grpSymbols.SuspendLayout() + Me.ContextMenuStripSummary.SuspendLayout() Me.SuspendLayout() ' 'lblExpression @@ -1046,6 +1071,15 @@ Partial Class ucrCalculator Me.grpInteger.TabStop = False Me.grpInteger.Text = "Integer" ' + 'cmdLucas + ' + Me.cmdLucas.Location = New System.Drawing.Point(223, 39) + Me.cmdLucas.Name = "cmdLucas" + Me.cmdLucas.Size = New System.Drawing.Size(75, 23) + Me.cmdLucas.TabIndex = 45 + Me.cmdLucas.Text = "lucas" + Me.cmdLucas.UseVisualStyleBackColor = True + ' 'cmdFactorize ' Me.cmdFactorize.Location = New System.Drawing.Point(75, 39) @@ -3008,7 +3042,8 @@ Partial Class ucrCalculator ' 'grpSummary ' - Me.grpSummary.Controls.Add(Me.cmdSummaryHelp) + Me.grpSummary.Controls.Add(Me.cmdSummaryRHelp) + Me.grpSummary.Controls.Add(Me.grpFrequencies) Me.grpSummary.Controls.Add(Me.cmdKurtosis) Me.grpSummary.Controls.Add(Me.cmdMode1) Me.grpSummary.Controls.Add(Me.cmdMode) @@ -3041,20 +3076,214 @@ Partial Class ucrCalculator Me.grpSummary.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.grpSummary.Name = "grpSummary" Me.grpSummary.Padding = New System.Windows.Forms.Padding(2, 3, 2, 3) - Me.grpSummary.Size = New System.Drawing.Size(288, 191) + Me.grpSummary.Size = New System.Drawing.Size(288, 326) Me.grpSummary.TabIndex = 185 Me.grpSummary.TabStop = False Me.grpSummary.Text = "Summary" ' - 'cmdSummaryHelp - ' - Me.cmdSummaryHelp.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdSummaryHelp.Location = New System.Drawing.Point(210, 165) - Me.cmdSummaryHelp.Name = "cmdSummaryHelp" - Me.cmdSummaryHelp.Size = New System.Drawing.Size(75, 23) - Me.cmdSummaryHelp.TabIndex = 183 - Me.cmdSummaryHelp.Text = "R Help" - Me.cmdSummaryHelp.UseVisualStyleBackColor = True + 'grpFrequencies + ' + Me.grpFrequencies.Controls.Add(Me.cmdFreqQuantile) + Me.grpFrequencies.Controls.Add(Me.cmdFreqPropn) + Me.grpFrequencies.Controls.Add(Me.cmdFreqDistinct) + Me.grpFrequencies.Controls.Add(Me.cmdFreqIQR) + Me.grpFrequencies.Controls.Add(Me.cmdFreqMedian) + Me.grpFrequencies.Controls.Add(Me.cmdFreqSd) + Me.grpFrequencies.Controls.Add(Me.cmdFreqVar) + Me.grpFrequencies.Controls.Add(Me.cmdFreqMean) + Me.grpFrequencies.Controls.Add(Me.cmdFreqMad) + Me.grpFrequencies.Controls.Add(Me.cmdFreqMiss) + Me.grpFrequencies.Controls.Add(Me.cmdFreqMode1) + Me.grpFrequencies.Controls.Add(Me.cmdFreqMax) + Me.grpFrequencies.Controls.Add(Me.cmdFreqMin) + Me.grpFrequencies.Controls.Add(Me.cmdFreqSum) + Me.grpFrequencies.Controls.Add(Me.cmdFreqLength) + Me.grpFrequencies.Location = New System.Drawing.Point(2, 208) + Me.grpFrequencies.Name = "grpFrequencies" + Me.grpFrequencies.Size = New System.Drawing.Size(283, 107) + Me.grpFrequencies.TabIndex = 184 + Me.grpFrequencies.TabStop = False + Me.grpFrequencies.Text = "Frequencies" + ' + 'cmdFreqQuantile + ' + Me.cmdFreqQuantile.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqQuantile.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqQuantile.Location = New System.Drawing.Point(225, 72) + Me.cmdFreqQuantile.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqQuantile.Name = "cmdFreqQuantile" + Me.cmdFreqQuantile.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqQuantile.TabIndex = 186 + Me.cmdFreqQuantile.Text = "quantile" + Me.cmdFreqQuantile.UseVisualStyleBackColor = True + ' + 'cmdFreqPropn + ' + Me.cmdFreqPropn.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqPropn.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqPropn.Location = New System.Drawing.Point(169, 72) + Me.cmdFreqPropn.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqPropn.Name = "cmdFreqPropn" + Me.cmdFreqPropn.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqPropn.TabIndex = 185 + Me.cmdFreqPropn.Text = "propn" + Me.cmdFreqPropn.UseVisualStyleBackColor = True + ' + 'cmdFreqDistinct + ' + Me.cmdFreqDistinct.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqDistinct.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqDistinct.Location = New System.Drawing.Point(113, 72) + Me.cmdFreqDistinct.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqDistinct.Name = "cmdFreqDistinct" + Me.cmdFreqDistinct.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqDistinct.TabIndex = 184 + Me.cmdFreqDistinct.Text = "distinct" + Me.cmdFreqDistinct.UseVisualStyleBackColor = True + ' + 'cmdFreqIQR + ' + Me.cmdFreqIQR.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqIQR.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqIQR.Location = New System.Drawing.Point(56, 72) + Me.cmdFreqIQR.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqIQR.Name = "cmdFreqIQR" + Me.cmdFreqIQR.Size = New System.Drawing.Size(58, 30) + Me.cmdFreqIQR.TabIndex = 183 + Me.cmdFreqIQR.Text = "IQR" + Me.cmdFreqIQR.UseVisualStyleBackColor = True + ' + 'cmdFreqMedian + ' + Me.cmdFreqMedian.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqMedian.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqMedian.Location = New System.Drawing.Point(113, 43) + Me.cmdFreqMedian.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqMedian.Name = "cmdFreqMedian" + Me.cmdFreqMedian.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqMedian.TabIndex = 182 + Me.cmdFreqMedian.Text = "median" + Me.cmdFreqMedian.UseVisualStyleBackColor = True + ' + 'cmdFreqSd + ' + Me.cmdFreqSd.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqSd.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqSd.Location = New System.Drawing.Point(225, 43) + Me.cmdFreqSd.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqSd.Name = "cmdFreqSd" + Me.cmdFreqSd.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqSd.TabIndex = 181 + Me.cmdFreqSd.Text = "sd" + Me.cmdFreqSd.UseVisualStyleBackColor = True + ' + 'cmdFreqVar + ' + Me.cmdFreqVar.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqVar.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqVar.Location = New System.Drawing.Point(169, 43) + Me.cmdFreqVar.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqVar.Name = "cmdFreqVar" + Me.cmdFreqVar.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqVar.TabIndex = 180 + Me.cmdFreqVar.Text = "var" + Me.cmdFreqVar.UseVisualStyleBackColor = True + ' + 'cmdFreqMean + ' + Me.cmdFreqMean.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqMean.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqMean.Location = New System.Drawing.Point(56, 43) + Me.cmdFreqMean.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqMean.Name = "cmdFreqMean" + Me.cmdFreqMean.Size = New System.Drawing.Size(58, 30) + Me.cmdFreqMean.TabIndex = 179 + Me.cmdFreqMean.Text = "mean" + Me.cmdFreqMean.UseVisualStyleBackColor = True + ' + 'cmdFreqMad + ' + Me.cmdFreqMad.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqMad.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqMad.Location = New System.Drawing.Point(0, 72) + Me.cmdFreqMad.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqMad.Name = "cmdFreqMad" + Me.cmdFreqMad.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqMad.TabIndex = 178 + Me.cmdFreqMad.Text = "mad" + Me.cmdFreqMad.UseVisualStyleBackColor = True + ' + 'cmdFreqMiss + ' + Me.cmdFreqMiss.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqMiss.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqMiss.Location = New System.Drawing.Point(0, 43) + Me.cmdFreqMiss.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqMiss.Name = "cmdFreqMiss" + Me.cmdFreqMiss.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqMiss.TabIndex = 177 + Me.cmdFreqMiss.Text = "miss" + Me.cmdFreqMiss.UseVisualStyleBackColor = True + ' + 'cmdFreqMode1 + ' + Me.cmdFreqMode1.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqMode1.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqMode1.Location = New System.Drawing.Point(225, 14) + Me.cmdFreqMode1.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqMode1.Name = "cmdFreqMode1" + Me.cmdFreqMode1.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqMode1.TabIndex = 176 + Me.cmdFreqMode1.Text = "mode1" + Me.cmdFreqMode1.UseVisualStyleBackColor = True + ' + 'cmdFreqMax + ' + Me.cmdFreqMax.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqMax.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqMax.Location = New System.Drawing.Point(169, 14) + Me.cmdFreqMax.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqMax.Name = "cmdFreqMax" + Me.cmdFreqMax.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqMax.TabIndex = 175 + Me.cmdFreqMax.Text = "max" + Me.cmdFreqMax.UseVisualStyleBackColor = True + ' + 'cmdFreqMin + ' + Me.cmdFreqMin.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqMin.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqMin.Location = New System.Drawing.Point(113, 14) + Me.cmdFreqMin.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqMin.Name = "cmdFreqMin" + Me.cmdFreqMin.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqMin.TabIndex = 174 + Me.cmdFreqMin.Text = "min" + Me.cmdFreqMin.UseVisualStyleBackColor = True + ' + 'cmdFreqSum + ' + Me.cmdFreqSum.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqSum.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqSum.Location = New System.Drawing.Point(56, 14) + Me.cmdFreqSum.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqSum.Name = "cmdFreqSum" + Me.cmdFreqSum.Size = New System.Drawing.Size(58, 30) + Me.cmdFreqSum.TabIndex = 173 + Me.cmdFreqSum.Text = "sum" + Me.cmdFreqSum.UseVisualStyleBackColor = True + ' + 'cmdFreqLength + ' + Me.cmdFreqLength.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) + Me.cmdFreqLength.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdFreqLength.Location = New System.Drawing.Point(0, 14) + Me.cmdFreqLength.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) + Me.cmdFreqLength.Name = "cmdFreqLength" + Me.cmdFreqLength.Size = New System.Drawing.Size(57, 30) + Me.cmdFreqLength.TabIndex = 172 + Me.cmdFreqLength.Text = "length" + Me.cmdFreqLength.UseVisualStyleBackColor = True ' 'cmdKurtosis ' @@ -3129,7 +3358,7 @@ Partial Class ucrCalculator Me.cmdCor.Location = New System.Drawing.Point(2, 158) Me.cmdCor.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdCor.Name = "cmdCor" - Me.cmdCor.Size = New System.Drawing.Size(62, 30) + Me.cmdCor.Size = New System.Drawing.Size(63, 30) Me.cmdCor.TabIndex = 175 Me.cmdCor.Text = "cor" Me.cmdCor.UseVisualStyleBackColor = True @@ -3137,7 +3366,7 @@ Partial Class ucrCalculator 'cmdCov ' Me.cmdCov.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdCov.Location = New System.Drawing.Point(63, 158) + Me.cmdCov.Location = New System.Drawing.Point(64, 158) Me.cmdCov.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdCov.Name = "cmdCov" Me.cmdCov.Size = New System.Drawing.Size(56, 30) @@ -3255,7 +3484,7 @@ Partial Class ucrCalculator ' Me.cmdQuantile.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!) Me.cmdQuantile.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdQuantile.Location = New System.Drawing.Point(118, 158) + Me.cmdQuantile.Location = New System.Drawing.Point(119, 158) Me.cmdQuantile.Margin = New System.Windows.Forms.Padding(2, 3, 2, 3) Me.cmdQuantile.Name = "cmdQuantile" Me.cmdQuantile.Size = New System.Drawing.Size(56, 30) @@ -5358,14 +5587,59 @@ Partial Class ucrCalculator Me.cmdStringRHelp.Text = "R Help" Me.cmdStringRHelp.UseVisualStyleBackColor = True ' - 'cmdLucas + 'ContextMenuStripSummary ' - Me.cmdLucas.Location = New System.Drawing.Point(223, 39) - Me.cmdLucas.Name = "cmdLucas" - Me.cmdLucas.Size = New System.Drawing.Size(75, 23) - Me.cmdLucas.TabIndex = 45 - Me.cmdLucas.Text = "lucas" - Me.cmdLucas.UseVisualStyleBackColor = True + Me.ContextMenuStripSummary.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BaseToolStripMenuItem1, Me.StatsToolStripMenuItem, Me.StatipToolStripMenuItem, Me.E1071ToolStripMenuItem, Me.RobustbaseToolStripMenuItem, Me.RasterToolStripMenuItem}) + Me.ContextMenuStripSummary.Name = "ContextMenuStripSummary" + Me.ContextMenuStripSummary.Size = New System.Drawing.Size(136, 136) + ' + 'BaseToolStripMenuItem1 + ' + Me.BaseToolStripMenuItem1.Name = "BaseToolStripMenuItem1" + Me.BaseToolStripMenuItem1.Size = New System.Drawing.Size(180, 22) + Me.BaseToolStripMenuItem1.Text = "Base" + ' + 'StatsToolStripMenuItem + ' + Me.StatsToolStripMenuItem.Name = "StatsToolStripMenuItem" + Me.StatsToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.StatsToolStripMenuItem.Text = "Stats" + ' + 'StatipToolStripMenuItem + ' + Me.StatipToolStripMenuItem.Name = "StatipToolStripMenuItem" + Me.StatipToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.StatipToolStripMenuItem.Text = "Statip" + ' + 'E1071ToolStripMenuItem + ' + Me.E1071ToolStripMenuItem.Name = "E1071ToolStripMenuItem" + Me.E1071ToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.E1071ToolStripMenuItem.Text = "e1071" + ' + 'RobustbaseToolStripMenuItem + ' + Me.RobustbaseToolStripMenuItem.Name = "RobustbaseToolStripMenuItem" + Me.RobustbaseToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.RobustbaseToolStripMenuItem.Text = "Robustbase" + ' + 'RasterToolStripMenuItem + ' + Me.RasterToolStripMenuItem.Name = "RasterToolStripMenuItem" + Me.RasterToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.RasterToolStripMenuItem.Text = "Raster" + ' + 'cmdSummaryRHelp + ' + Me.cmdSummaryRHelp.AutoSize = True + Me.cmdSummaryRHelp.ContextMenuStrip = Me.ContextMenuStripSummary + Me.cmdSummaryRHelp.Location = New System.Drawing.Point(194, 164) + Me.cmdSummaryRHelp.Name = "cmdSummaryRHelp" + Me.cmdSummaryRHelp.Size = New System.Drawing.Size(91, 23) + Me.cmdSummaryRHelp.SplitMenuStrip = Me.ContextMenuStripSummary + Me.cmdSummaryRHelp.TabIndex = 185 + Me.cmdSummaryRHelp.Text = "R Help" + Me.cmdSummaryRHelp.UseVisualStyleBackColor = True ' 'cmdIntegerRHelp ' @@ -5452,12 +5726,12 @@ Partial Class ucrCalculator Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True + Me.Controls.Add(Me.grpSummary) Me.Controls.Add(Me.grpInteger) Me.Controls.Add(Me.grpTransform) Me.Controls.Add(Me.grpDates) Me.Controls.Add(Me.grpWakefield) Me.Controls.Add(Me.grpLogical) - Me.Controls.Add(Me.grpSummary) Me.Controls.Add(Me.grpHydroGOF) Me.Controls.Add(Me.grpMaths) Me.Controls.Add(Me.grpFactor) @@ -5488,6 +5762,8 @@ Partial Class ucrCalculator Me.grpWakefield.ResumeLayout(False) Me.grpMaths.ResumeLayout(False) Me.grpSummary.ResumeLayout(False) + Me.grpSummary.PerformLayout() + Me.grpFrequencies.ResumeLayout(False) Me.grpProbabilty.ResumeLayout(False) Me.grpTransform.ResumeLayout(False) Me.grpTransform.PerformLayout() @@ -5497,6 +5773,7 @@ Partial Class ucrCalculator Me.grpCircular.ResumeLayout(False) Me.grpModifier.ResumeLayout(False) Me.grpSymbols.ResumeLayout(False) + Me.ContextMenuStripSummary.ResumeLayout(False) Me.ResumeLayout(False) Me.PerformLayout() @@ -5865,7 +6142,6 @@ Partial Class ucrCalculator Friend WithEvents cmdWakefieldHelp As Button Friend WithEvents cmdMathsHelp As Button Friend WithEvents cmdLogicalHelp As Button - Friend WithEvents cmdSummaryHelp As Button Friend WithEvents cmdStringRHelp As Button Friend WithEvents cmdProbRHelp As Button Friend WithEvents grpInteger As GroupBox @@ -5928,4 +6204,28 @@ Partial Class ucrCalculator Friend WithEvents DplyrToolStripMenuItem As ToolStripMenuItem Friend WithEvents ZooToolStripMenuItem As ToolStripMenuItem Friend WithEvents cmdLucas As Button + Friend WithEvents grpFrequencies As GroupBox + Friend WithEvents cmdFreqQuantile As Button + Friend WithEvents cmdFreqPropn As Button + Friend WithEvents cmdFreqDistinct As Button + Friend WithEvents cmdFreqIQR As Button + Friend WithEvents cmdFreqMedian As Button + Friend WithEvents cmdFreqSd As Button + Friend WithEvents cmdFreqVar As Button + Friend WithEvents cmdFreqMean As Button + Friend WithEvents cmdFreqMad As Button + Friend WithEvents cmdFreqMiss As Button + Friend WithEvents cmdFreqMode1 As Button + Friend WithEvents cmdFreqMax As Button + Friend WithEvents cmdFreqMin As Button + Friend WithEvents cmdFreqSum As Button + Friend WithEvents cmdFreqLength As Button + Friend WithEvents cmdSummaryRHelp As ucrSplitButton + Friend WithEvents ContextMenuStripSummary As ContextMenuStrip + Friend WithEvents BaseToolStripMenuItem1 As ToolStripMenuItem + Friend WithEvents StatsToolStripMenuItem As ToolStripMenuItem + Friend WithEvents StatipToolStripMenuItem As ToolStripMenuItem + Friend WithEvents E1071ToolStripMenuItem As ToolStripMenuItem + Friend WithEvents RobustbaseToolStripMenuItem As ToolStripMenuItem + Friend WithEvents RasterToolStripMenuItem As ToolStripMenuItem End Class diff --git a/instat/ucrCalculator.resx b/instat/ucrCalculator.resx index 7fe5123d532..a2840f0e634 100644 --- a/instat/ucrCalculator.resx +++ b/instat/ucrCalculator.resx @@ -120,6 +120,9 @@ 123, 24 + + 519, 24 + 313, 24 diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index 5e15d1d33ae..e9e87648cb2 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -30,6 +30,7 @@ Public Class ucrCalculator Private clsDataFunction As New RFunction Private clsRepFunction As New RFunction Private clsZseqFunction As New RFunction + Private FrequencyFunction As New RFunction Public Sub New() @@ -834,7 +835,7 @@ Public Class ucrCalculator Private Sub cmdSum_Click(sender As Object, e As EventArgs) Handles cmdSum.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum(x = , na.rm = FALSE)", 17) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum(x = , na.rm = TRUE)", 16) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum()", 1) End If @@ -842,7 +843,7 @@ Public Class ucrCalculator Private Sub cmdMean_Click(sender As Object, e As EventArgs) Handles cmdMean.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean(x = , trim = 0 , na.rm = FALSE)", 28) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean(x = , trim = 0 , na.rm = TRUE)", 27) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean()", 1) End If @@ -850,7 +851,7 @@ Public Class ucrCalculator Private Sub cmdMax_Click(sender As Object, e As EventArgs) Handles cmdMax.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("max(x = , na.rm = FALSE)", 17) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("max(x = , na.rm = TRUE)", 16) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("max()", 1) End If @@ -858,7 +859,7 @@ Public Class ucrCalculator Private Sub cmdMin_Click(sender As Object, e As EventArgs) Handles cmdMin.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("min(x = , na.rm = FALSE)", 17) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("min(x = , na.rm = TRUE)", 16) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("min()", 1) End If @@ -866,7 +867,7 @@ Public Class ucrCalculator Private Sub cmdMedian_Click(sender As Object, e As EventArgs) Handles cmdMedian.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("median(x = , na.rm = FALSE)", 17) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("median(x = , na.rm = TRUE)", 16) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("median()", 1) End If @@ -874,7 +875,7 @@ Public Class ucrCalculator Private Sub cmdVar_Click(sender As Object, e As EventArgs) Handles cmdVar.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("var(x = , y = NULL, na.rm = FALSE)", 27) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("var(x = , y = NULL, na.rm = TRUE)", 26) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("var()", 1) End If @@ -882,7 +883,7 @@ Public Class ucrCalculator Private Sub cmdSd_Click(sender As Object, e As EventArgs) Handles cmdSd.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sd(x = , na.rm = FALSE)", 17) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sd(x = , na.rm = TRUE)", 16) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sd()", 1) End If @@ -890,23 +891,35 @@ Public Class ucrCalculator Private Sub cmdRange_Click(sender As Object, e As EventArgs) Handles cmdRange.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("range(x = , na.rm = False, finite = FALSE)", 33) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("range(x = , na.rm = TRUE, finite = FALSE)", 32) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("range()", 1) End If End Sub Private Sub cmdQuantile_Click(sender As Object, e As EventArgs) Handles cmdQuantile.Click - If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("quantile(x = , probs = 0.5, na.rm = FALSE, names = FALSE, type=7)", 53) - Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("quantile()", 1) - End If + Dim clsQuantileFunction As New RFunction + + clsDataFunction.SetRCommand("nrow") + clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem, iPosition:=0) + + clsQuantileFunction.SetRCommand("quantile") + clsQuantileFunction.AddParameter("x", "", iPosition:=0) + clsQuantileFunction.AddParameter("probs", "0.5", iPosition:=1) + clsQuantileFunction.AddParameter("na.rm", "TRUE", iPosition:=2) + clsQuantileFunction.AddParameter("names", "FALSE", iPosition:=3) + clsQuantileFunction.AddParameter("type", "7", iPosition:=4) + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsQuantileFunction, iPosition:=0) + clsRepFunction.AddParameter("len", clsRFunctionParameter:=clsDataFunction, iPosition:=1) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsRepFunction.ToScript, 57) End Sub Private Sub cmdIQR_Click(sender As Object, e As EventArgs) Handles cmdIQR.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("IQR(x = , na.rm = FALSE, type = 7)", 27) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("IQR(x = , na.rm = TRUE, type = 7)", 26) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("IQR()", 1) End If @@ -1402,7 +1415,7 @@ Public Class ucrCalculator iCallType:=2, bSeparateThread:=False, bUpdateGrids:=False) End Sub - Private Sub cmdHelp_Click(sender As Object, e As EventArgs) Handles cmdRHelp.Click, cmdHydroHelp.Click, cmdCircularHelp.Click, cmdWakefieldHelp.Click, cmdMathsHelp.Click, cmdLogicalHelp.Click, cmdSummaryHelp.Click, cmdProbRHelp.Click, cmdStringRHelp.Click + Private Sub cmdHelp_Click(sender As Object, e As EventArgs) Handles cmdRHelp.Click, cmdHydroHelp.Click, cmdCircularHelp.Click, cmdWakefieldHelp.Click, cmdMathsHelp.Click, cmdLogicalHelp.Click, cmdProbRHelp.Click, cmdStringRHelp.Click OpenHelpPage() End Sub @@ -1550,7 +1563,7 @@ Public Class ucrCalculator Private Sub cmdCv_Click(sender As Object, e As EventArgs) Handles cmdCv.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("raster::cv(x = , aszero = FALSE, na.rm = FALSE)", 33) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("raster::cv(x = , aszero = FALSE, na.rm = TRUE)", 32) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("raster::cv()", 1) End If @@ -1558,7 +1571,7 @@ Public Class ucrCalculator Private Sub cmdMad_Click(sender As Object, e As EventArgs) Handles cmdMad.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::mad(x = , center = median(x), constant = 1.4826, na.rm = FALSE,low = FALSE, high = FALSE)", 82) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::mad(x = , center = median(x = ), constant = 1.4826, na.rm = TRUE,low = FALSE, high = FALSE)", 84) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::mad()", 1) End If @@ -1566,7 +1579,7 @@ Public Class ucrCalculator Private Sub cmdMc_Click(sender As Object, e As EventArgs) Handles cmdMc.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("robustbase::mc(x =, na.rm = FALSE, doReflect = (length(x) <= 100),doScale = TRUE, maxit = 100, trace.lev = 0, full.result = FALSE)", 112) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("robustbase::mc(x = , na.rm = TRUE, doReflect = (length(x = ) <= 100),doScale = TRUE, maxit = 100, trace.lev = 0, full.result = FALSE)", 113) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("robustbase::mc()", 1) End If @@ -1582,7 +1595,7 @@ Public Class ucrCalculator Private Sub cmdSkew_Click(sender As Object, e As EventArgs) Handles cmdSkew.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::skewness(x = , na.rm = FALSE, type = 3)", 27) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::skewness(x = , na.rm = TRUE, type = 3)", 26) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::skewness()", 1) End If @@ -1649,11 +1662,21 @@ Public Class ucrCalculator End Sub Private Sub cmdMode_Click(sender As Object, e As EventArgs) Handles cmdMode.Click - If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv(x = , na_rm = FALSE)", 17) - Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv()", 1) - End If + Dim clsSummaryModeFunction As New RFunction + + clsDataFunction.SetRCommand("nrow") + clsDataFunction.AddParameter("x", ucrSelectorForCalculations.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem, iPosition:=0) + + clsSummaryModeFunction.SetPackageName("statip") + clsSummaryModeFunction.SetRCommand("mfv") + clsSummaryModeFunction.AddParameter("x", "", iPosition:=0) + clsSummaryModeFunction.AddParameter("na.rm", "TRUE", iPosition:=1) + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsSummaryModeFunction, iPosition:=0) + clsRepFunction.AddParameter("len", clsRFunctionParameter:=clsDataFunction, iPosition:=1) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsRepFunction.ToScript, 34) End Sub Private Sub cmdNA_Click(sender As Object, e As EventArgs) Handles cmdNA.Click @@ -3563,7 +3586,7 @@ Public Class ucrCalculator Private Sub cmdMode1_Click(sender As Object, e As EventArgs) Handles cmdMode1.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1(x = , na_rm = FALSE)", 17) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1(x = , na.rm = TRUE)", 16) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1()", 1) End If @@ -3571,7 +3594,7 @@ Public Class ucrCalculator Private Sub cmdKurtosis_Click(sender As Object, e As EventArgs) Handles cmdKurtosis.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::kurtosis(x = , na.rm = FALSE, type = 3)", 26) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::kurtosis(x = , na.rm = TRUE, type = 3)", 26) Else ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::kurtosis()", 1) End If @@ -4306,4 +4329,209 @@ Public Class ucrCalculator ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsZseqFunction.ToScript, 0) End Sub + + Private Sub cmdFreqLength_Click(sender As Object, e As EventArgs) Handles cmdFreqLength.Click + Dim clsLengthFunction As New RFunction + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) + clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) + + clsLengthFunction.SetRCommand("length") + clsLengthFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsLengthFunction.ToScript, 6) + End Sub + + Private Sub FrequencyFunctions(strRCommand As String) + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) + clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) + + FrequencyFunction.SetRCommand(strRCommand) + FrequencyFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) + FrequencyFunction.AddParameter("na.rm", "TRUE", iPosition:=1) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(FrequencyFunction.ToScript, 18) + End Sub + + Private Sub cmdFreqSum_Click(sender As Object, e As EventArgs) Handles cmdFreqSum.Click + FrequencyFunctions("sum") + End Sub + + Private Sub cmdFreqMin_Click(sender As Object, e As EventArgs) Handles cmdFreqMin.Click + FrequencyFunctions("min") + End Sub + + Private Sub cmdFreqMax_Click(sender As Object, e As EventArgs) Handles cmdFreqMax.Click + FrequencyFunctions("max") + End Sub + + Private Sub cmdFreqMode1_Click(sender As Object, e As EventArgs) Handles cmdFreqMode1.Click + Dim clsFreqModeFunction As New RFunction + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) + clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) + + clsFreqModeFunction.SetRCommand("mode") + clsFreqModeFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFreqModeFunction.ToScript, 6) + End Sub + + Private Sub cmdFreqMiss_Click(sender As Object, e As EventArgs) Handles cmdFreqMiss.Click + Dim clsMissFunction As New RFunction + Dim clsSumFunction As New RFunction + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) + clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) + + clsMissFunction.SetRCommand("is.na") + clsMissFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0, bIncludeArgumentName:=False) + + clsSumFunction.SetRCommand("sum") + clsSumFunction.AddParameter("x", clsRFunctionParameter:=clsMissFunction, iPosition:=0) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsSumFunction.ToScript, 6) + End Sub + + Private Sub cmdFreqMean_Click(sender As Object, e As EventArgs) Handles cmdFreqMean.Click + FrequencyFunctions("mean") + End Sub + + Private Sub cmdFreqMedian_Click(sender As Object, e As EventArgs) Handles cmdFreqMedian.Click + FrequencyFunctions("median") + End Sub + + Private Sub FreqStatsFunctions(strRCommand As String) + Dim clsFrequencyStatsFunction As New RFunction + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) + clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) + + clsFrequencyStatsFunction.SetPackageName("stats") + clsFrequencyStatsFunction.SetRCommand(strRCommand) + clsFrequencyStatsFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) + clsFrequencyStatsFunction.AddParameter("na.rm", "TRUE", iPosition:=1) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFrequencyStatsFunction.ToScript, 18) + End Sub + + Private Sub cmdFreqVar_Click(sender As Object, e As EventArgs) Handles cmdFreqVar.Click + FreqStatsFunctions("var") + End Sub + + Private Sub cmdFreqSd_Click(sender As Object, e As EventArgs) Handles cmdFreqSd.Click + FreqStatsFunctions("sd") + End Sub + + Private Sub cmdFreqMad_Click(sender As Object, e As EventArgs) Handles cmdFreqMad.Click + FreqStatsFunctions("mad") + End Sub + + Private Sub cmdFreqIQR_Click(sender As Object, e As EventArgs) Handles cmdFreqIQR.Click + FreqStatsFunctions("IQR") + End Sub + + Private Sub cmdFreqDistinct_Click(sender As Object, e As EventArgs) Handles cmdFreqDistinct.Click + Dim clsFreDistinctFunction As New RFunction + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) + clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) + + clsFreDistinctFunction.SetPackageName("dplyr") + clsFreDistinctFunction.SetRCommand("n_distinct") + clsFreDistinctFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFreDistinctFunction.ToScript, 6) + End Sub + + Private Sub cmdFreqPropn_Click(sender As Object, e As EventArgs) Handles cmdFreqPropn.Click + Dim clsFreqPropnFunction As New RFunction + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", " <= 1", iPosition:=0) + clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) + + clsFreqPropnFunction.SetRCommand("mean") + clsFreqPropnFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) + clsFreqPropnFunction.AddParameter("na.rm", "TRUE", iPosition:=1) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFreqPropnFunction.ToScript, 21) + End Sub + + Private Sub cmdFreqQuantile_Click(sender As Object, e As EventArgs) Handles cmdFreqQuantile.Click + Dim clsFreqQuantileFunction As New RFunction + + clsRepFunction.SetRCommand("rep") + clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) + clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) + + clsFreqQuantileFunction.SetRCommand("quantile") + clsFreqQuantileFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) + clsFreqQuantileFunction.AddParameter("probs", "0.5", iPosition:=1) + clsFreqQuantileFunction.AddParameter("na.rm", "TRUE", iPosition:=2) + + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFreqQuantileFunction.ToScript, 28) + End Sub + + Private Sub BaseToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles BaseToolStripMenuItem1.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Summary" Then + strPackageName = "base" + End If + OpenHelpPage() + End Sub + + Private Sub StatsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles StatsToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Summary" Then + strPackageName = "stats" + End If + OpenHelpPage() + End Sub + + Private Sub StatipToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles StatipToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Summary" Then + strPackageName = "statip" + End If + OpenHelpPage() + End Sub + + Private Sub E1071ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles E1071ToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Summary" Then + strPackageName = "e1071" + End If + OpenHelpPage() + End Sub + + Private Sub RobustbaseToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RobustbaseToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Summary" Then + strPackageName = "robustbase" + End If + OpenHelpPage() + End Sub + + Private Sub RasterToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RasterToolStripMenuItem.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Summary" Then + strPackageName = "raster" + End If + OpenHelpPage() + End Sub + + Private Sub cmdSummaryRHelp_Click(sender As Object, e As EventArgs) Handles cmdSummaryRHelp.Click + CalculationsOptions() + If ucrInputCalOptions.GetText = "Summary" Then + strPackageName = "base" + End If + OpenHelpPage() + End Sub End Class From bccb6de2ba390e96c9a83252c29cc0010c3c0f58 Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Mon, 21 Nov 2022 12:28:09 +0300 Subject: [PATCH 104/122] Adding tooltips --- instat/ucrCalculator.vb | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index e9e87648cb2..72d6c84cc70 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -261,6 +261,34 @@ Public Class ucrCalculator ttCalculator.SetToolTip(cmdSquare, "squares of each integer, so 1, 4, 9, 16.") ttCalculator.SetToolTip(cmdLucas, "generartes lucas numbers to the length of the dataframe. For example the 10th lucas number is 76") + ttCalculator.SetToolTip(cmdLength, "number of observations: For example length(c(1,2,3,4,NA)) = 5 ") + ttCalculator.SetToolTip(cmdSum, "the sum or total: So sum(c(1,2,3,4,10)) = 20 ") + ttCalculator.SetToolTip(cmdMin, "the smallest value: So min(c(4,3,10,1,2)) = 1 ") + ttCalculator.SetToolTip(cmdMax, "the largest value: So max(c(4,3,10,1,2)) = 10 ") + ttCalculator.SetToolTip(cmdRange, "gives both the min and the max. Use max - min to give the value of the range") + ttCalculator.SetToolTip(cmdMiss, "the number of missing values. So miss(c( NA,2,3,4,NA)) = 2") + ttCalculator.SetToolTip(cmdMean, "the average, usually sum/length. So mean(c(1,2,3,4,10)) = 4") + ttCalculator.SetToolTip(cmdMedian, "the value halfway up the values in order. So median(c(1,2,3,4,10) = 3") + ttCalculator.SetToolTip(cmdMode, "the most popular value. So mode(c(10,2,2,3,3) = 2 and 3") + ttCalculator.SetToolTip(cmdMode1, "the first mode. So mode1(c(10,2,2,3,3)) = 2") + ttCalculator.SetToolTip(cmdNonMiss, "the number of non-missing values. So nonmiss(c(1,2,3,4,NA)) = 4") + ttCalculator.SetToolTip(cmdVar, "the variance. The average of the squared deviations from the mean - dividing by (n-1)") + ttCalculator.SetToolTip(cmdSd, "the standard deviation. A typical distance from the mean. Often roughly a quarter of the range of the data.") + ttCalculator.SetToolTip(cmdMad, "the median of the absolute deviations from the median. So mad(c(1,2,3,4,10)) = median of (2,1,0,1,7). Median = 1 and multiplied by 1.483 to be like the sd for normally distributed data.") + ttCalculator.SetToolTip(cmdIQR, "the interquartile range. So, for (1,2,3,4,10) the upper quartile=4, lower=2, so IQR = 2.") + ttCalculator.SetToolTip(cmdDistinct, "the number of different values in the variable. So distinct(c(1,2,3,3,NA,NA)) = 4") + ttCalculator.SetToolTip(cmdCv, "coefficient of variation, namely 100 * sd/mean. So cv(c(1,2,3,4,10)) = 100*3.536/4 = 88.4.") + ttCalculator.SetToolTip(cmdMc, "median couple. A robust measure of skewness, between -1 and +1. mc(c(1,1,4,4,5)) = -0.5, while mc(c(2,3,3,4,10)) = 0.375.") + ttCalculator.SetToolTip(cmdSkew, "skewness defined as third central moment/sd^3. For skew(c(1,1,4,4,5)) = -0.18, while skew(2,3,3,4,10) = 0.95.") + ttCalculator.SetToolTip(cmdKurtosis, "kurtosis defined as 4th central moment/sd^4 -3. A measure of peakedness which is zero for normally distributed data.") + ttCalculator.SetToolTip(cmdAnyDup, "the row number of the first duplicated value, or 0 if no duplicates. So anydup(c(1,2,3,3,10) = 4.") + ttCalculator.SetToolTip(cmdPropn, "proportion of variable less than (or more than) a specified value. So prop(c(0,1,1,4,10) <=1) = 0.6.") + ttCalculator.SetToolTip(cmdFirst, "value in the first row. So first(c(NA,7,8,9,10)) is NA. Also first(c(NA,7,8,9,10),order=(2,3,0,1,2)) = 8.") + ttCalculator.SetToolTip(cmdLast, "value in the last row. So last(c(NA,7,8,9,10)) = 10. Also last(c(NA,7,8,9,10),order=c(2,3,0,1,2)) = 7") + ttCalculator.SetToolTip(cmdnth, "value in nth row, So nth(c(NA,7,8,9,10)) = 8. Also nth(c(NA,7,7,9,10),3,order=c(2,3,0,1,2))= NA.") + ttCalculator.SetToolTip(cmdCor, "correlation between 2 variables. It is a value between -1 and +1.") + ttCalculator.SetToolTip(cmdCov, "covariance between 2 variables.") + ttCalculator.SetToolTip(cmdQuantile, "a quantile, given a value between 0 and 1. So quantile(c(1,2,3,4,10), 0.25) = 2 and is the lower quartile.") End Sub Public Sub Reset() From 50c57ff74d96df73a7369fd1d044a028ee103728 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Mon, 21 Nov 2022 13:54:32 +0300 Subject: [PATCH 105/122] minor code change --- instat/dlgNewDataFrame.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/dlgNewDataFrame.vb b/instat/dlgNewDataFrame.vb index 440367a8574..d2d81d6784d 100644 --- a/instat/dlgNewDataFrame.vb +++ b/instat/dlgNewDataFrame.vb @@ -600,11 +600,11 @@ Public Class dlgNewDataFrame If dataTypeGridView.CurrentCell.ColumnIndex = 2 Then Dim iColumnLevelIndex As Integer = dataTypeGridView.CurrentRow.Cells("colLevels").ColumnIndex Dim iRowLevelIndex As Integer = dataTypeGridView.CurrentRow.Cells("colLevels").RowIndex - Dim iColDefaultIndex As Integer = dataTypeGridView.CurrentRow.Cells("colDefault").ColumnIndex - Dim iRowDefaultIndex As Integer = dataTypeGridView.CurrentRow.Cells("colDefault").RowIndex Dim selectedCombobox As ComboBox = DirectCast(sender, ComboBox) If selectedCombobox.SelectedItem = "Factor" Then dataTypeGridView(iColumnLevelIndex, iRowLevelIndex).ReadOnly = False + Dim iColDefaultIndex As Integer = dataTypeGridView.CurrentRow.Cells("colDefault").ColumnIndex + Dim iRowDefaultIndex As Integer = dataTypeGridView.CurrentRow.Cells("colDefault").RowIndex dataTypeGridView(iColDefaultIndex, iRowDefaultIndex).Value = "NA" Else dataTypeGridView(iColumnLevelIndex, iRowLevelIndex).ReadOnly = True From 258016656ec278bf9e9b6a5933df3e17d1563270 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Mon, 21 Nov 2022 13:56:46 +0300 Subject: [PATCH 106/122] removed the letters --- instat/dlgNewDataFrame.Designer.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/dlgNewDataFrame.Designer.vb b/instat/dlgNewDataFrame.Designer.vb index 115e16f4167..514b7ef0b89 100644 --- a/instat/dlgNewDataFrame.Designer.vb +++ b/instat/dlgNewDataFrame.Designer.vb @@ -534,7 +534,7 @@ Partial Class dlgNewDataFrame 'colDefault ' Me.colDefault.HeaderText = "Default" - Me.colDefault.Items.AddRange(New Object() {"NA", "0", "1", "1,1000", "letters[1:10]", "LETTERS[1:10]"}) + Me.colDefault.Items.AddRange(New Object() {"NA", "0", "1", "1,1000"}) Me.colDefault.Name = "colDefault" ' 'colLevels From e399060eff22174a798543e00bf893e89110eb78 Mon Sep 17 00:00:00 2001 From: Sophie Date: Mon, 21 Nov 2022 16:02:18 +0100 Subject: [PATCH 107/122] Minor code modification --- instat/dlgBarAndPieChart.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/dlgBarAndPieChart.vb b/instat/dlgBarAndPieChart.vb index f966e7ac1e6..ae4b2446f6b 100644 --- a/instat/dlgBarAndPieChart.vb +++ b/instat/dlgBarAndPieChart.vb @@ -314,7 +314,7 @@ Public Class dlgBarAndPieChart ucrChkReorderValue.AddFunctionNamesCondition(False, "reorder", False) ucrChkReorderValue.AddToLinkedControls(ucrInputReorderValue, {True}, bNewLinkedHideIfParameterMissing:=True) - ucrChkReorderFrequency.SetText("Rorder Frequency") + ucrChkReorderFrequency.SetText("Reorder Frequency") ucrChkReorderFrequency.SetParameter(New RParameter("Checked", iNewPosition:=0)) ucrChkReorderFrequency.SetValuesCheckedAndUnchecked("TRUE", "FALSE") ucrChkReorderFrequency.AddToLinkedControls(ucrInputReorderX, {True}, bNewLinkedHideIfParameterMissing:=True, bNewLinkedAddRemoveParameter:=True) From b02ae25661195554f0974af88dd92da53e531040 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Tue, 22 Nov 2022 08:20:58 +0300 Subject: [PATCH 108/122] Added new humidity elements into the Define Climatic Dialogue --- instat/DlgDefineClimaticData.Designer.vb | 100 ++++++++++++++++++----- instat/DlgDefineClimaticData.vb | 12 ++- 2 files changed, 89 insertions(+), 23 deletions(-) diff --git a/instat/DlgDefineClimaticData.Designer.vb b/instat/DlgDefineClimaticData.Designer.vb index 51e43bf17a1..b29b293bee6 100644 --- a/instat/DlgDefineClimaticData.Designer.vb +++ b/instat/DlgDefineClimaticData.Designer.vb @@ -73,6 +73,10 @@ Partial Class DlgDefineClimaticData Me.ucrInputCheckInput = New instat.ucrInputTextBox() Me.ucrBase = New instat.ucrButtons() Me.ucrSelectorDefineClimaticData = New instat.ucrSelectorByDataFrameAddRemove() + Me.lblMinimumRH = New System.Windows.Forms.Label() + Me.ucrReceiverMinRH = New instat.ucrReceiverSingle() + Me.lblMaxRH = New System.Windows.Forms.Label() + Me.ucrReceiverMaxRH = New instat.ucrReceiverSingle() Me.grpElements.SuspendLayout() Me.grpDateTime.SuspendLayout() Me.grpStation.SuspendLayout() @@ -80,6 +84,10 @@ Partial Class DlgDefineClimaticData ' 'grpElements ' + Me.grpElements.Controls.Add(Me.ucrReceiverMaxRH) + Me.grpElements.Controls.Add(Me.lblMaxRH) + Me.grpElements.Controls.Add(Me.ucrReceiverMinRH) + Me.grpElements.Controls.Add(Me.lblMinimumRH) Me.grpElements.Controls.Add(Me.ucrReceiverWindDirection) Me.grpElements.Controls.Add(Me.ucrReceiverRain) Me.grpElements.Controls.Add(Me.ucrReceiverSunshine) @@ -96,9 +104,9 @@ Partial Class DlgDefineClimaticData Me.grpElements.Controls.Add(Me.ucrReceiverMinTemp) Me.grpElements.Controls.Add(Me.lblWindSpeed) Me.grpElements.Controls.Add(Me.lblWindDirection) - Me.grpElements.Location = New System.Drawing.Point(306, 71) + Me.grpElements.Location = New System.Drawing.Point(306, 7) Me.grpElements.Name = "grpElements" - Me.grpElements.Size = New System.Drawing.Size(146, 344) + Me.grpElements.Size = New System.Drawing.Size(146, 424) Me.grpElements.TabIndex = 3 Me.grpElements.TabStop = False Me.grpElements.Text = "Elements" @@ -107,7 +115,7 @@ Partial Class DlgDefineClimaticData ' Me.ucrReceiverWindDirection.AutoSize = True Me.ucrReceiverWindDirection.frmParent = Me - Me.ucrReceiverWindDirection.Location = New System.Drawing.Point(16, 197) + Me.ucrReceiverWindDirection.Location = New System.Drawing.Point(16, 195) Me.ucrReceiverWindDirection.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverWindDirection.Name = "ucrReceiverWindDirection" Me.ucrReceiverWindDirection.Selector = Nothing @@ -133,7 +141,7 @@ Partial Class DlgDefineClimaticData ' Me.ucrReceiverSunshine.AutoSize = True Me.ucrReceiverSunshine.frmParent = Me - Me.ucrReceiverSunshine.Location = New System.Drawing.Point(16, 238) + Me.ucrReceiverSunshine.Location = New System.Drawing.Point(16, 236) Me.ucrReceiverSunshine.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverSunshine.Name = "ucrReceiverSunshine" Me.ucrReceiverSunshine.Selector = Nothing @@ -146,7 +154,7 @@ Partial Class DlgDefineClimaticData ' Me.lblRain.AutoSize = True Me.lblRain.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblRain.Location = New System.Drawing.Point(16, 18) + Me.lblRain.Location = New System.Drawing.Point(16, 16) Me.lblRain.Name = "lblRain" Me.lblRain.Size = New System.Drawing.Size(32, 13) Me.lblRain.TabIndex = 0 @@ -156,7 +164,7 @@ Partial Class DlgDefineClimaticData ' Me.ucrReceiverRadiation.AutoSize = True Me.ucrReceiverRadiation.frmParent = Me - Me.ucrReceiverRadiation.Location = New System.Drawing.Point(16, 279) + Me.ucrReceiverRadiation.Location = New System.Drawing.Point(16, 277) Me.ucrReceiverRadiation.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverRadiation.Name = "ucrReceiverRadiation" Me.ucrReceiverRadiation.Selector = Nothing @@ -169,7 +177,7 @@ Partial Class DlgDefineClimaticData ' Me.ucrReceiverMaxTemp.AutoSize = True Me.ucrReceiverMaxTemp.frmParent = Me - Me.ucrReceiverMaxTemp.Location = New System.Drawing.Point(16, 115) + Me.ucrReceiverMaxTemp.Location = New System.Drawing.Point(16, 113) Me.ucrReceiverMaxTemp.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverMaxTemp.Name = "ucrReceiverMaxTemp" Me.ucrReceiverMaxTemp.Selector = Nothing @@ -182,7 +190,7 @@ Partial Class DlgDefineClimaticData ' Me.ucrReceiverCloudCover.AutoSize = True Me.ucrReceiverCloudCover.frmParent = Me - Me.ucrReceiverCloudCover.Location = New System.Drawing.Point(16, 320) + Me.ucrReceiverCloudCover.Location = New System.Drawing.Point(16, 318) Me.ucrReceiverCloudCover.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverCloudCover.Name = "ucrReceiverCloudCover" Me.ucrReceiverCloudCover.Selector = Nothing @@ -195,7 +203,7 @@ Partial Class DlgDefineClimaticData ' Me.lblMaxTemp.AutoSize = True Me.lblMaxTemp.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMaxTemp.Location = New System.Drawing.Point(16, 100) + Me.lblMaxTemp.Location = New System.Drawing.Point(16, 98) Me.lblMaxTemp.Name = "lblMaxTemp" Me.lblMaxTemp.Size = New System.Drawing.Size(117, 13) Me.lblMaxTemp.TabIndex = 4 @@ -205,7 +213,7 @@ Partial Class DlgDefineClimaticData ' Me.lblCloudCover.AutoSize = True Me.lblCloudCover.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblCloudCover.Location = New System.Drawing.Point(16, 305) + Me.lblCloudCover.Location = New System.Drawing.Point(16, 303) Me.lblCloudCover.Name = "lblCloudCover" Me.lblCloudCover.Size = New System.Drawing.Size(68, 13) Me.lblCloudCover.TabIndex = 14 @@ -215,7 +223,7 @@ Partial Class DlgDefineClimaticData ' Me.lblMinTemp.AutoSize = True Me.lblMinTemp.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMinTemp.Location = New System.Drawing.Point(16, 59) + Me.lblMinTemp.Location = New System.Drawing.Point(16, 57) Me.lblMinTemp.Name = "lblMinTemp" Me.lblMinTemp.Size = New System.Drawing.Size(111, 13) Me.lblMinTemp.TabIndex = 2 @@ -225,7 +233,7 @@ Partial Class DlgDefineClimaticData ' Me.lblRadiation.AutoSize = True Me.lblRadiation.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblRadiation.Location = New System.Drawing.Point(16, 264) + Me.lblRadiation.Location = New System.Drawing.Point(16, 262) Me.lblRadiation.Name = "lblRadiation" Me.lblRadiation.Size = New System.Drawing.Size(55, 13) Me.lblRadiation.TabIndex = 12 @@ -235,7 +243,7 @@ Partial Class DlgDefineClimaticData ' Me.ucrReceiverWindSpeed.AutoSize = True Me.ucrReceiverWindSpeed.frmParent = Me - Me.ucrReceiverWindSpeed.Location = New System.Drawing.Point(16, 156) + Me.ucrReceiverWindSpeed.Location = New System.Drawing.Point(16, 154) Me.ucrReceiverWindSpeed.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverWindSpeed.Name = "ucrReceiverWindSpeed" Me.ucrReceiverWindSpeed.Selector = Nothing @@ -248,7 +256,7 @@ Partial Class DlgDefineClimaticData ' Me.lblSunshine.AutoSize = True Me.lblSunshine.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSunshine.Location = New System.Drawing.Point(16, 223) + Me.lblSunshine.Location = New System.Drawing.Point(16, 221) Me.lblSunshine.Name = "lblSunshine" Me.lblSunshine.Size = New System.Drawing.Size(85, 13) Me.lblSunshine.TabIndex = 10 @@ -258,7 +266,7 @@ Partial Class DlgDefineClimaticData ' Me.ucrReceiverMinTemp.AutoSize = True Me.ucrReceiverMinTemp.frmParent = Me - Me.ucrReceiverMinTemp.Location = New System.Drawing.Point(16, 74) + Me.ucrReceiverMinTemp.Location = New System.Drawing.Point(16, 72) Me.ucrReceiverMinTemp.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverMinTemp.Name = "ucrReceiverMinTemp" Me.ucrReceiverMinTemp.Selector = Nothing @@ -271,7 +279,7 @@ Partial Class DlgDefineClimaticData ' Me.lblWindSpeed.AutoSize = True Me.lblWindSpeed.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblWindSpeed.Location = New System.Drawing.Point(16, 141) + Me.lblWindSpeed.Location = New System.Drawing.Point(16, 139) Me.lblWindSpeed.Name = "lblWindSpeed" Me.lblWindSpeed.Size = New System.Drawing.Size(69, 13) Me.lblWindSpeed.TabIndex = 6 @@ -281,7 +289,7 @@ Partial Class DlgDefineClimaticData ' Me.lblWindDirection.AutoSize = True Me.lblWindDirection.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblWindDirection.Location = New System.Drawing.Point(16, 182) + Me.lblWindDirection.Location = New System.Drawing.Point(16, 180) Me.lblWindDirection.Name = "lblWindDirection" Me.lblWindDirection.Size = New System.Drawing.Size(80, 13) Me.lblWindDirection.TabIndex = 8 @@ -460,7 +468,7 @@ Partial Class DlgDefineClimaticData 'cmdCheckUnique ' Me.cmdCheckUnique.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdCheckUnique.Location = New System.Drawing.Point(9, 423) + Me.cmdCheckUnique.Location = New System.Drawing.Point(9, 435) Me.cmdCheckUnique.Name = "cmdCheckUnique" Me.cmdCheckUnique.Size = New System.Drawing.Size(139, 23) Me.cmdCheckUnique.TabIndex = 4 @@ -473,7 +481,7 @@ Partial Class DlgDefineClimaticData Me.ucrInputCheckInput.AutoSize = True Me.ucrInputCheckInput.IsMultiline = False Me.ucrInputCheckInput.IsReadOnly = False - Me.ucrInputCheckInput.Location = New System.Drawing.Point(154, 425) + Me.ucrInputCheckInput.Location = New System.Drawing.Point(154, 437) Me.ucrInputCheckInput.Name = "ucrInputCheckInput" Me.ucrInputCheckInput.Size = New System.Drawing.Size(253, 21) Me.ucrInputCheckInput.TabIndex = 5 @@ -482,7 +490,7 @@ Partial Class DlgDefineClimaticData ' Me.ucrBase.AutoSize = True Me.ucrBase.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.ucrBase.Location = New System.Drawing.Point(13, 452) + Me.ucrBase.Location = New System.Drawing.Point(13, 464) Me.ucrBase.Name = "ucrBase" Me.ucrBase.Size = New System.Drawing.Size(408, 52) Me.ucrBase.TabIndex = 6 @@ -499,12 +507,58 @@ Partial Class DlgDefineClimaticData Me.ucrSelectorDefineClimaticData.Size = New System.Drawing.Size(213, 183) Me.ucrSelectorDefineClimaticData.TabIndex = 0 ' + 'lblMinimumRH + ' + Me.lblMinimumRH.AutoSize = True + Me.lblMinimumRH.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblMinimumRH.Location = New System.Drawing.Point(16, 344) + Me.lblMinimumRH.Name = "lblMinimumRH" + Me.lblMinimumRH.Size = New System.Drawing.Size(87, 13) + Me.lblMinimumRH.TabIndex = 16 + Me.lblMinimumRH.Text = "Minimum RH (%):" + ' + 'ucrReceiverMinRH + ' + Me.ucrReceiverMinRH.AutoSize = True + Me.ucrReceiverMinRH.frmParent = Me + Me.ucrReceiverMinRH.Location = New System.Drawing.Point(16, 359) + Me.ucrReceiverMinRH.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverMinRH.Name = "ucrReceiverMinRH" + Me.ucrReceiverMinRH.Selector = Nothing + Me.ucrReceiverMinRH.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverMinRH.strNcFilePath = "" + Me.ucrReceiverMinRH.TabIndex = 17 + Me.ucrReceiverMinRH.ucrSelector = Nothing + ' + 'lblMaxRH + ' + Me.lblMaxRH.AutoSize = True + Me.lblMaxRH.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblMaxRH.Location = New System.Drawing.Point(16, 383) + Me.lblMaxRH.Name = "lblMaxRH" + Me.lblMaxRH.Size = New System.Drawing.Size(90, 13) + Me.lblMaxRH.TabIndex = 18 + Me.lblMaxRH.Text = "Maximum RH (%):" + ' + 'ucrReceiverMaxRH + ' + Me.ucrReceiverMaxRH.AutoSize = True + Me.ucrReceiverMaxRH.frmParent = Me + Me.ucrReceiverMaxRH.Location = New System.Drawing.Point(16, 398) + Me.ucrReceiverMaxRH.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverMaxRH.Name = "ucrReceiverMaxRH" + Me.ucrReceiverMaxRH.Selector = Nothing + Me.ucrReceiverMaxRH.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverMaxRH.strNcFilePath = "" + Me.ucrReceiverMaxRH.TabIndex = 19 + Me.ucrReceiverMaxRH.ucrSelector = Nothing + ' 'DlgDefineClimaticData ' Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.AutoSize = True - Me.ClientSize = New System.Drawing.Size(464, 510) + Me.ClientSize = New System.Drawing.Size(464, 522) Me.Controls.Add(Me.ucrInputCheckInput) Me.Controls.Add(Me.cmdCheckUnique) Me.Controls.Add(Me.grpStation) @@ -564,4 +618,8 @@ Partial Class DlgDefineClimaticData Friend WithEvents grpStation As GroupBox Friend WithEvents ucrInputCheckInput As ucrInputTextBox Friend WithEvents cmdCheckUnique As Button + Friend WithEvents ucrReceiverMinRH As ucrReceiverSingle + Friend WithEvents lblMinimumRH As Label + Friend WithEvents ucrReceiverMaxRH As ucrReceiverSingle + Friend WithEvents lblMaxRH As Label End Class diff --git a/instat/DlgDefineClimaticData.vb b/instat/DlgDefineClimaticData.vb index d26e669169f..0b0da8b0f32 100644 --- a/instat/DlgDefineClimaticData.vb +++ b/instat/DlgDefineClimaticData.vb @@ -59,9 +59,15 @@ Public Class DlgDefineClimaticData Dim kvpMonth As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("month", {"month"}.ToList()) Dim kvpDay As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("day", {"day"}.ToList()) Dim kvpDOY As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("doy", {"doy", "doy_366"}.ToList()) + Dim kvpMinRH As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("minhum", {"minhum"}.ToList()) + Dim kvpMaxRH As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("maxhum", {"maxhum"}.ToList()) - lstRecognisedTypes.AddRange({kvpRain, kvpStation, kvpCloudCover, kvpTempMax, kvpTempMin, kvpRadiation, kvpSunshineHours, kvpWindDirection, kvpWindSpeed, kvpYear, kvpMonth, kvpDay, kvpDOY, kvpDate}) - lstReceivers.AddRange({ucrReceiverCloudCover, ucrReceiverDay, ucrReceiverMaxTemp, ucrReceiverMinTemp, ucrReceiverMonth, ucrReceiverRadiation, ucrReceiverRain, ucrReceiverStationName, ucrReceiverSunshine, ucrReceiverWindDirection, ucrReceiverWindSpeed, ucrReceiverYear, ucrReceiverDOY, ucrReceiverDate}) + + lstRecognisedTypes.AddRange({kvpRain, kvpStation, kvpCloudCover, kvpTempMax, kvpTempMin, kvpRadiation, kvpSunshineHours, + kvpWindDirection, kvpWindSpeed, kvpYear, kvpMonth, kvpDay, kvpDOY, kvpDate, kvpMinRH, kvpMaxRH}) + lstReceivers.AddRange({ucrReceiverCloudCover, ucrReceiverDay, ucrReceiverMaxTemp, ucrReceiverMinTemp, ucrReceiverMonth, ucrReceiverRadiation, + ucrReceiverRain, ucrReceiverStationName, ucrReceiverSunshine, ucrReceiverWindDirection, ucrReceiverWindSpeed, + ucrReceiverYear, ucrReceiverDOY, ucrReceiverDate, ucrReceiverMinRH, ucrReceiverMaxRH}) ucrSelectorDefineClimaticData.SetParameter(New RParameter("data_name", 0)) ucrSelectorDefineClimaticData.SetParameterIsString() @@ -79,6 +85,8 @@ Public Class DlgDefineClimaticData ucrReceiverMonth.Tag = "month" ucrReceiverDay.Tag = "day" ucrReceiverDOY.Tag = "doy" + ucrReceiverMinRH.Tag = "minhum" + ucrReceiverMaxRH.Tag = "maxhum" ucrInputCheckInput.IsReadOnly = True ucrReceiverDate.SetIncludedDataTypes({"Date"}) From 3681be262ebcfc76375287ce8f3900ad26985e4c Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Tue, 22 Nov 2022 10:09:08 +0300 Subject: [PATCH 109/122] Minor bug fix --- instat/DlgDefineClimaticData.vb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/instat/DlgDefineClimaticData.vb b/instat/DlgDefineClimaticData.vb index 0b0da8b0f32..fe8a8d37efe 100644 --- a/instat/DlgDefineClimaticData.vb +++ b/instat/DlgDefineClimaticData.vb @@ -49,18 +49,18 @@ Public Class DlgDefineClimaticData Dim kvpDate As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("date", {"date", "record"}.ToList()) Dim kvpStation As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("station", {"station", "id", "name"}.ToList()) Dim kvpCloudCover As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("cloud_cover", {"cloud"}.ToList()) - Dim kvpTempMax As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("temp_max", {"tmax", "tx", "max", "tempmax"}.ToList()) - Dim kvpTempMin As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("temp_min", {"tmin", "tn", "min", "tempmin"}.ToList()) + Dim kvpTempMax As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("temp_max", {"tmax", "tx", "tempmax"}.ToList()) + Dim kvpTempMin As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("temp_min", {"tmin", "tn", "tempmin"}.ToList()) Dim kvpRadiation As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("radiation", {"radiation", "rad"}.ToList()) - Dim kvpSunshineHours As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("sunshine_hours", {"sunshine", "sunh"}.ToList()) + Dim kvpSunshineHours As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("sunshine_hours", {"sunshine", "sunh", "sunhrs"}.ToList()) Dim kvpWindDirection As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("wind_direction", {"winddirection"}.ToList()) Dim kvpWindSpeed As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("wind_speed", {"windspeed"}.ToList()) Dim kvpYear As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("year", {"year"}.ToList()) Dim kvpMonth As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("month", {"month"}.ToList()) Dim kvpDay As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("day", {"day"}.ToList()) Dim kvpDOY As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("doy", {"doy", "doy_366"}.ToList()) - Dim kvpMinRH As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("minhum", {"minhum"}.ToList()) - Dim kvpMaxRH As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("maxhum", {"maxhum"}.ToList()) + Dim kvpMinRH As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("hum_min", {"minhum", "hmin", "hn"}.ToList()) + Dim kvpMaxRH As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("hum_max", {"maxhum", "hmax", "hx"}.ToList()) lstRecognisedTypes.AddRange({kvpRain, kvpStation, kvpCloudCover, kvpTempMax, kvpTempMin, kvpRadiation, kvpSunshineHours, @@ -85,8 +85,8 @@ Public Class DlgDefineClimaticData ucrReceiverMonth.Tag = "month" ucrReceiverDay.Tag = "day" ucrReceiverDOY.Tag = "doy" - ucrReceiverMinRH.Tag = "minhum" - ucrReceiverMaxRH.Tag = "maxhum" + ucrReceiverMinRH.Tag = "hum_min" + ucrReceiverMaxRH.Tag = "hum_max" ucrInputCheckInput.IsReadOnly = True ucrReceiverDate.SetIncludedDataTypes({"Date"}) From 969056c9143c751865074f4f70b7fde69903d8fd Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Tue, 22 Nov 2022 10:57:42 +0300 Subject: [PATCH 110/122] minor addition --- instat/DlgDefineClimaticData.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/DlgDefineClimaticData.vb b/instat/DlgDefineClimaticData.vb index fe8a8d37efe..15ff0ba23a9 100644 --- a/instat/DlgDefineClimaticData.vb +++ b/instat/DlgDefineClimaticData.vb @@ -49,8 +49,8 @@ Public Class DlgDefineClimaticData Dim kvpDate As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("date", {"date", "record"}.ToList()) Dim kvpStation As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("station", {"station", "id", "name"}.ToList()) Dim kvpCloudCover As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("cloud_cover", {"cloud"}.ToList()) - Dim kvpTempMax As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("temp_max", {"tmax", "tx", "tempmax"}.ToList()) - Dim kvpTempMin As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("temp_min", {"tmin", "tn", "tempmin"}.ToList()) + Dim kvpTempMax As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("temp_max", {"tmax", "tx", "tempmax", "tmp_max"}.ToList()) + Dim kvpTempMin As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("temp_min", {"tmin", "tn", "tempmin", "tmp_min"}.ToList()) Dim kvpRadiation As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("radiation", {"radiation", "rad"}.ToList()) Dim kvpSunshineHours As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("sunshine_hours", {"sunshine", "sunh", "sunhrs"}.ToList()) Dim kvpWindDirection As KeyValuePair(Of String, List(Of String)) = New KeyValuePair(Of String, List(Of String))("wind_direction", {"winddirection"}.ToList()) From e75910598fd07bf4a21dfbb749d992adab12a138 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Tue, 22 Nov 2022 12:02:29 +0300 Subject: [PATCH 111/122] minor design change --- instat/DlgDefineClimaticData.Designer.vb | 460 +++++++++++------------ 1 file changed, 230 insertions(+), 230 deletions(-) diff --git a/instat/DlgDefineClimaticData.Designer.vb b/instat/DlgDefineClimaticData.Designer.vb index b29b293bee6..ca677ad2038 100644 --- a/instat/DlgDefineClimaticData.Designer.vb +++ b/instat/DlgDefineClimaticData.Designer.vb @@ -39,20 +39,12 @@ Partial Class DlgDefineClimaticData Private Sub InitializeComponent() Me.grpElements = New System.Windows.Forms.GroupBox() - Me.ucrReceiverWindDirection = New instat.ucrReceiverSingle() - Me.ucrReceiverRain = New instat.ucrReceiverSingle() - Me.ucrReceiverSunshine = New instat.ucrReceiverSingle() Me.lblRain = New System.Windows.Forms.Label() - Me.ucrReceiverRadiation = New instat.ucrReceiverSingle() - Me.ucrReceiverMaxTemp = New instat.ucrReceiverSingle() - Me.ucrReceiverCloudCover = New instat.ucrReceiverSingle() Me.lblMaxTemp = New System.Windows.Forms.Label() Me.lblCloudCover = New System.Windows.Forms.Label() Me.lblMinTemp = New System.Windows.Forms.Label() Me.lblRadiation = New System.Windows.Forms.Label() - Me.ucrReceiverWindSpeed = New instat.ucrReceiverSingle() Me.lblSunshine = New System.Windows.Forms.Label() - Me.ucrReceiverMinTemp = New instat.ucrReceiverSingle() Me.lblWindSpeed = New System.Windows.Forms.Label() Me.lblWindDirection = New System.Windows.Forms.Label() Me.lblStationName = New System.Windows.Forms.Label() @@ -62,21 +54,29 @@ Partial Class DlgDefineClimaticData Me.lblYear = New System.Windows.Forms.Label() Me.lblDate = New System.Windows.Forms.Label() Me.grpDateTime = New System.Windows.Forms.GroupBox() + Me.grpStation = New System.Windows.Forms.GroupBox() + Me.cmdCheckUnique = New System.Windows.Forms.Button() + Me.lblMinimumRH = New System.Windows.Forms.Label() + Me.lblMaxRH = New System.Windows.Forms.Label() + Me.ucrInputCheckInput = New instat.ucrInputTextBox() + Me.ucrReceiverStationName = New instat.ucrReceiverSingle() Me.ucrReceiverYear = New instat.ucrReceiverSingle() Me.ucrReceiverDOY = New instat.ucrReceiverSingle() Me.ucrReceiverDate = New instat.ucrReceiverSingle() Me.ucrReceiverMonth = New instat.ucrReceiverSingle() Me.ucrReceiverDay = New instat.ucrReceiverSingle() - Me.grpStation = New System.Windows.Forms.GroupBox() - Me.ucrReceiverStationName = New instat.ucrReceiverSingle() - Me.cmdCheckUnique = New System.Windows.Forms.Button() - Me.ucrInputCheckInput = New instat.ucrInputTextBox() + Me.ucrReceiverMaxRH = New instat.ucrReceiverSingle() + Me.ucrReceiverMinRH = New instat.ucrReceiverSingle() + Me.ucrReceiverWindDirection = New instat.ucrReceiverSingle() + Me.ucrReceiverRain = New instat.ucrReceiverSingle() + Me.ucrReceiverSunshine = New instat.ucrReceiverSingle() + Me.ucrReceiverRadiation = New instat.ucrReceiverSingle() + Me.ucrReceiverMaxTemp = New instat.ucrReceiverSingle() + Me.ucrReceiverCloudCover = New instat.ucrReceiverSingle() + Me.ucrReceiverWindSpeed = New instat.ucrReceiverSingle() + Me.ucrReceiverMinTemp = New instat.ucrReceiverSingle() Me.ucrBase = New instat.ucrButtons() Me.ucrSelectorDefineClimaticData = New instat.ucrSelectorByDataFrameAddRemove() - Me.lblMinimumRH = New System.Windows.Forms.Label() - Me.ucrReceiverMinRH = New instat.ucrReceiverSingle() - Me.lblMaxRH = New System.Windows.Forms.Label() - Me.ucrReceiverMaxRH = New instat.ucrReceiverSingle() Me.grpElements.SuspendLayout() Me.grpDateTime.SuspendLayout() Me.grpStation.SuspendLayout() @@ -104,52 +104,13 @@ Partial Class DlgDefineClimaticData Me.grpElements.Controls.Add(Me.ucrReceiverMinTemp) Me.grpElements.Controls.Add(Me.lblWindSpeed) Me.grpElements.Controls.Add(Me.lblWindDirection) - Me.grpElements.Location = New System.Drawing.Point(306, 7) + Me.grpElements.Location = New System.Drawing.Point(306, 6) Me.grpElements.Name = "grpElements" Me.grpElements.Size = New System.Drawing.Size(146, 424) Me.grpElements.TabIndex = 3 Me.grpElements.TabStop = False Me.grpElements.Text = "Elements" ' - 'ucrReceiverWindDirection - ' - Me.ucrReceiverWindDirection.AutoSize = True - Me.ucrReceiverWindDirection.frmParent = Me - Me.ucrReceiverWindDirection.Location = New System.Drawing.Point(16, 195) - Me.ucrReceiverWindDirection.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverWindDirection.Name = "ucrReceiverWindDirection" - Me.ucrReceiverWindDirection.Selector = Nothing - Me.ucrReceiverWindDirection.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverWindDirection.strNcFilePath = "" - Me.ucrReceiverWindDirection.TabIndex = 9 - Me.ucrReceiverWindDirection.ucrSelector = Nothing - ' - 'ucrReceiverRain - ' - Me.ucrReceiverRain.AutoSize = True - Me.ucrReceiverRain.frmParent = Me - Me.ucrReceiverRain.Location = New System.Drawing.Point(16, 33) - Me.ucrReceiverRain.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverRain.Name = "ucrReceiverRain" - Me.ucrReceiverRain.Selector = Nothing - Me.ucrReceiverRain.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverRain.strNcFilePath = "" - Me.ucrReceiverRain.TabIndex = 1 - Me.ucrReceiverRain.ucrSelector = Nothing - ' - 'ucrReceiverSunshine - ' - Me.ucrReceiverSunshine.AutoSize = True - Me.ucrReceiverSunshine.frmParent = Me - Me.ucrReceiverSunshine.Location = New System.Drawing.Point(16, 236) - Me.ucrReceiverSunshine.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverSunshine.Name = "ucrReceiverSunshine" - Me.ucrReceiverSunshine.Selector = Nothing - Me.ucrReceiverSunshine.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverSunshine.strNcFilePath = "" - Me.ucrReceiverSunshine.TabIndex = 11 - Me.ucrReceiverSunshine.ucrSelector = Nothing - ' 'lblRain ' Me.lblRain.AutoSize = True @@ -160,50 +121,11 @@ Partial Class DlgDefineClimaticData Me.lblRain.TabIndex = 0 Me.lblRain.Text = "Rain:" ' - 'ucrReceiverRadiation - ' - Me.ucrReceiverRadiation.AutoSize = True - Me.ucrReceiverRadiation.frmParent = Me - Me.ucrReceiverRadiation.Location = New System.Drawing.Point(16, 277) - Me.ucrReceiverRadiation.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverRadiation.Name = "ucrReceiverRadiation" - Me.ucrReceiverRadiation.Selector = Nothing - Me.ucrReceiverRadiation.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverRadiation.strNcFilePath = "" - Me.ucrReceiverRadiation.TabIndex = 13 - Me.ucrReceiverRadiation.ucrSelector = Nothing - ' - 'ucrReceiverMaxTemp - ' - Me.ucrReceiverMaxTemp.AutoSize = True - Me.ucrReceiverMaxTemp.frmParent = Me - Me.ucrReceiverMaxTemp.Location = New System.Drawing.Point(16, 113) - Me.ucrReceiverMaxTemp.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverMaxTemp.Name = "ucrReceiverMaxTemp" - Me.ucrReceiverMaxTemp.Selector = Nothing - Me.ucrReceiverMaxTemp.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverMaxTemp.strNcFilePath = "" - Me.ucrReceiverMaxTemp.TabIndex = 5 - Me.ucrReceiverMaxTemp.ucrSelector = Nothing - ' - 'ucrReceiverCloudCover - ' - Me.ucrReceiverCloudCover.AutoSize = True - Me.ucrReceiverCloudCover.frmParent = Me - Me.ucrReceiverCloudCover.Location = New System.Drawing.Point(16, 318) - Me.ucrReceiverCloudCover.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverCloudCover.Name = "ucrReceiverCloudCover" - Me.ucrReceiverCloudCover.Selector = Nothing - Me.ucrReceiverCloudCover.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverCloudCover.strNcFilePath = "" - Me.ucrReceiverCloudCover.TabIndex = 15 - Me.ucrReceiverCloudCover.ucrSelector = Nothing - ' 'lblMaxTemp ' Me.lblMaxTemp.AutoSize = True Me.lblMaxTemp.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMaxTemp.Location = New System.Drawing.Point(16, 98) + Me.lblMaxTemp.Location = New System.Drawing.Point(16, 96) Me.lblMaxTemp.Name = "lblMaxTemp" Me.lblMaxTemp.Size = New System.Drawing.Size(117, 13) Me.lblMaxTemp.TabIndex = 4 @@ -213,7 +135,7 @@ Partial Class DlgDefineClimaticData ' Me.lblCloudCover.AutoSize = True Me.lblCloudCover.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblCloudCover.Location = New System.Drawing.Point(16, 303) + Me.lblCloudCover.Location = New System.Drawing.Point(16, 297) Me.lblCloudCover.Name = "lblCloudCover" Me.lblCloudCover.Size = New System.Drawing.Size(68, 13) Me.lblCloudCover.TabIndex = 14 @@ -223,7 +145,7 @@ Partial Class DlgDefineClimaticData ' Me.lblMinTemp.AutoSize = True Me.lblMinTemp.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMinTemp.Location = New System.Drawing.Point(16, 57) + Me.lblMinTemp.Location = New System.Drawing.Point(16, 55) Me.lblMinTemp.Name = "lblMinTemp" Me.lblMinTemp.Size = New System.Drawing.Size(111, 13) Me.lblMinTemp.TabIndex = 2 @@ -233,53 +155,27 @@ Partial Class DlgDefineClimaticData ' Me.lblRadiation.AutoSize = True Me.lblRadiation.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblRadiation.Location = New System.Drawing.Point(16, 262) + Me.lblRadiation.Location = New System.Drawing.Point(16, 257) Me.lblRadiation.Name = "lblRadiation" Me.lblRadiation.Size = New System.Drawing.Size(55, 13) Me.lblRadiation.TabIndex = 12 Me.lblRadiation.Text = "Radiation:" ' - 'ucrReceiverWindSpeed - ' - Me.ucrReceiverWindSpeed.AutoSize = True - Me.ucrReceiverWindSpeed.frmParent = Me - Me.ucrReceiverWindSpeed.Location = New System.Drawing.Point(16, 154) - Me.ucrReceiverWindSpeed.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverWindSpeed.Name = "ucrReceiverWindSpeed" - Me.ucrReceiverWindSpeed.Selector = Nothing - Me.ucrReceiverWindSpeed.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverWindSpeed.strNcFilePath = "" - Me.ucrReceiverWindSpeed.TabIndex = 7 - Me.ucrReceiverWindSpeed.ucrSelector = Nothing - ' 'lblSunshine ' Me.lblSunshine.AutoSize = True Me.lblSunshine.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblSunshine.Location = New System.Drawing.Point(16, 221) + Me.lblSunshine.Location = New System.Drawing.Point(16, 217) Me.lblSunshine.Name = "lblSunshine" Me.lblSunshine.Size = New System.Drawing.Size(85, 13) Me.lblSunshine.TabIndex = 10 Me.lblSunshine.Text = "Sunshine Hours:" ' - 'ucrReceiverMinTemp - ' - Me.ucrReceiverMinTemp.AutoSize = True - Me.ucrReceiverMinTemp.frmParent = Me - Me.ucrReceiverMinTemp.Location = New System.Drawing.Point(16, 72) - Me.ucrReceiverMinTemp.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverMinTemp.Name = "ucrReceiverMinTemp" - Me.ucrReceiverMinTemp.Selector = Nothing - Me.ucrReceiverMinTemp.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverMinTemp.strNcFilePath = "" - Me.ucrReceiverMinTemp.TabIndex = 3 - Me.ucrReceiverMinTemp.ucrSelector = Nothing - ' 'lblWindSpeed ' Me.lblWindSpeed.AutoSize = True Me.lblWindSpeed.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblWindSpeed.Location = New System.Drawing.Point(16, 139) + Me.lblWindSpeed.Location = New System.Drawing.Point(16, 137) Me.lblWindSpeed.Name = "lblWindSpeed" Me.lblWindSpeed.Size = New System.Drawing.Size(69, 13) Me.lblWindSpeed.TabIndex = 6 @@ -289,7 +185,7 @@ Partial Class DlgDefineClimaticData ' Me.lblWindDirection.AutoSize = True Me.lblWindDirection.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblWindDirection.Location = New System.Drawing.Point(16, 180) + Me.lblWindDirection.Location = New System.Drawing.Point(16, 178) Me.lblWindDirection.Name = "lblWindDirection" Me.lblWindDirection.Size = New System.Drawing.Size(80, 13) Me.lblWindDirection.TabIndex = 8 @@ -299,7 +195,7 @@ Partial Class DlgDefineClimaticData ' Me.lblStationName.AutoSize = True Me.lblStationName.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblStationName.Location = New System.Drawing.Point(7, 22) + Me.lblStationName.Location = New System.Drawing.Point(7, 16) Me.lblStationName.Name = "lblStationName" Me.lblStationName.Size = New System.Drawing.Size(38, 13) Me.lblStationName.TabIndex = 0 @@ -309,7 +205,7 @@ Partial Class DlgDefineClimaticData ' Me.lblDOY.AutoSize = True Me.lblDOY.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblDOY.Location = New System.Drawing.Point(15, 181) + Me.lblDOY.Location = New System.Drawing.Point(15, 180) Me.lblDOY.Name = "lblDOY" Me.lblDOY.Size = New System.Drawing.Size(66, 13) Me.lblDOY.TabIndex = 8 @@ -319,7 +215,7 @@ Partial Class DlgDefineClimaticData ' Me.lblDay.AutoSize = True Me.lblDay.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblDay.Location = New System.Drawing.Point(15, 140) + Me.lblDay.Location = New System.Drawing.Point(15, 139) Me.lblDay.Name = "lblDay" Me.lblDay.Size = New System.Drawing.Size(29, 13) Me.lblDay.TabIndex = 6 @@ -329,7 +225,7 @@ Partial Class DlgDefineClimaticData ' Me.lblMonth.AutoSize = True Me.lblMonth.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMonth.Location = New System.Drawing.Point(15, 99) + Me.lblMonth.Location = New System.Drawing.Point(15, 98) Me.lblMonth.Name = "lblMonth" Me.lblMonth.Size = New System.Drawing.Size(40, 13) Me.lblMonth.TabIndex = 4 @@ -339,7 +235,7 @@ Partial Class DlgDefineClimaticData ' Me.lblYear.AutoSize = True Me.lblYear.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblYear.Location = New System.Drawing.Point(15, 58) + Me.lblYear.Location = New System.Drawing.Point(15, 57) Me.lblYear.Name = "lblYear" Me.lblYear.Size = New System.Drawing.Size(32, 13) Me.lblYear.TabIndex = 2 @@ -367,19 +263,85 @@ Partial Class DlgDefineClimaticData Me.grpDateTime.Controls.Add(Me.ucrReceiverMonth) Me.grpDateTime.Controls.Add(Me.ucrReceiverDay) Me.grpDateTime.Controls.Add(Me.lblDay) - Me.grpDateTime.Location = New System.Drawing.Point(154, 193) + Me.grpDateTime.Location = New System.Drawing.Point(154, 207) Me.grpDateTime.Name = "grpDateTime" - Me.grpDateTime.Size = New System.Drawing.Size(148, 222) + Me.grpDateTime.Size = New System.Drawing.Size(148, 223) Me.grpDateTime.TabIndex = 2 Me.grpDateTime.TabStop = False Me.grpDateTime.Tag = "" Me.grpDateTime.Text = "Date and Time" ' + 'grpStation + ' + Me.grpStation.Controls.Add(Me.lblStationName) + Me.grpStation.Controls.Add(Me.ucrReceiverStationName) + Me.grpStation.Location = New System.Drawing.Point(13, 208) + Me.grpStation.Name = "grpStation" + Me.grpStation.Size = New System.Drawing.Size(135, 57) + Me.grpStation.TabIndex = 1 + Me.grpStation.TabStop = False + Me.grpStation.Tag = "" + Me.grpStation.Text = "Station" + ' + 'cmdCheckUnique + ' + Me.cmdCheckUnique.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdCheckUnique.Location = New System.Drawing.Point(9, 435) + Me.cmdCheckUnique.Name = "cmdCheckUnique" + Me.cmdCheckUnique.Size = New System.Drawing.Size(139, 23) + Me.cmdCheckUnique.TabIndex = 4 + Me.cmdCheckUnique.Text = "Check Duplicates" + Me.cmdCheckUnique.UseVisualStyleBackColor = True + ' + 'lblMinimumRH + ' + Me.lblMinimumRH.AutoSize = True + Me.lblMinimumRH.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblMinimumRH.Location = New System.Drawing.Point(16, 338) + Me.lblMinimumRH.Name = "lblMinimumRH" + Me.lblMinimumRH.Size = New System.Drawing.Size(87, 13) + Me.lblMinimumRH.TabIndex = 16 + Me.lblMinimumRH.Text = "Minimum RH (%):" + ' + 'lblMaxRH + ' + Me.lblMaxRH.AutoSize = True + Me.lblMaxRH.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblMaxRH.Location = New System.Drawing.Point(16, 379) + Me.lblMaxRH.Name = "lblMaxRH" + Me.lblMaxRH.Size = New System.Drawing.Size(90, 13) + Me.lblMaxRH.TabIndex = 18 + Me.lblMaxRH.Text = "Maximum RH (%):" + ' + 'ucrInputCheckInput + ' + Me.ucrInputCheckInput.AddQuotesIfUnrecognised = True + Me.ucrInputCheckInput.AutoSize = True + Me.ucrInputCheckInput.IsMultiline = False + Me.ucrInputCheckInput.IsReadOnly = False + Me.ucrInputCheckInput.Location = New System.Drawing.Point(154, 437) + Me.ucrInputCheckInput.Name = "ucrInputCheckInput" + Me.ucrInputCheckInput.Size = New System.Drawing.Size(253, 21) + Me.ucrInputCheckInput.TabIndex = 5 + ' + 'ucrReceiverStationName + ' + Me.ucrReceiverStationName.AutoSize = True + Me.ucrReceiverStationName.frmParent = Nothing + Me.ucrReceiverStationName.Location = New System.Drawing.Point(7, 31) + Me.ucrReceiverStationName.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverStationName.Name = "ucrReceiverStationName" + Me.ucrReceiverStationName.Selector = Nothing + Me.ucrReceiverStationName.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverStationName.strNcFilePath = "" + Me.ucrReceiverStationName.TabIndex = 1 + Me.ucrReceiverStationName.ucrSelector = Nothing + ' 'ucrReceiverYear ' Me.ucrReceiverYear.AutoSize = True - Me.ucrReceiverYear.frmParent = Me - Me.ucrReceiverYear.Location = New System.Drawing.Point(15, 75) + Me.ucrReceiverYear.frmParent = Nothing + Me.ucrReceiverYear.Location = New System.Drawing.Point(15, 72) Me.ucrReceiverYear.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverYear.Name = "ucrReceiverYear" Me.ucrReceiverYear.Selector = Nothing @@ -391,8 +353,8 @@ Partial Class DlgDefineClimaticData 'ucrReceiverDOY ' Me.ucrReceiverDOY.AutoSize = True - Me.ucrReceiverDOY.frmParent = Me - Me.ucrReceiverDOY.Location = New System.Drawing.Point(15, 198) + Me.ucrReceiverDOY.frmParent = Nothing + Me.ucrReceiverDOY.Location = New System.Drawing.Point(15, 195) Me.ucrReceiverDOY.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverDOY.Name = "ucrReceiverDOY" Me.ucrReceiverDOY.Selector = Nothing @@ -404,8 +366,8 @@ Partial Class DlgDefineClimaticData 'ucrReceiverDate ' Me.ucrReceiverDate.AutoSize = True - Me.ucrReceiverDate.frmParent = Me - Me.ucrReceiverDate.Location = New System.Drawing.Point(15, 34) + Me.ucrReceiverDate.frmParent = Nothing + Me.ucrReceiverDate.Location = New System.Drawing.Point(15, 31) Me.ucrReceiverDate.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverDate.Name = "ucrReceiverDate" Me.ucrReceiverDate.Selector = Nothing @@ -417,8 +379,8 @@ Partial Class DlgDefineClimaticData 'ucrReceiverMonth ' Me.ucrReceiverMonth.AutoSize = True - Me.ucrReceiverMonth.frmParent = Me - Me.ucrReceiverMonth.Location = New System.Drawing.Point(15, 116) + Me.ucrReceiverMonth.frmParent = Nothing + Me.ucrReceiverMonth.Location = New System.Drawing.Point(15, 113) Me.ucrReceiverMonth.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverMonth.Name = "ucrReceiverMonth" Me.ucrReceiverMonth.Selector = Nothing @@ -430,8 +392,8 @@ Partial Class DlgDefineClimaticData 'ucrReceiverDay ' Me.ucrReceiverDay.AutoSize = True - Me.ucrReceiverDay.frmParent = Me - Me.ucrReceiverDay.Location = New System.Drawing.Point(15, 157) + Me.ucrReceiverDay.frmParent = Nothing + Me.ucrReceiverDay.Location = New System.Drawing.Point(15, 154) Me.ucrReceiverDay.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverDay.Name = "ucrReceiverDay" Me.ucrReceiverDay.Selector = Nothing @@ -440,51 +402,135 @@ Partial Class DlgDefineClimaticData Me.ucrReceiverDay.TabIndex = 7 Me.ucrReceiverDay.ucrSelector = Nothing ' - 'grpStation + 'ucrReceiverMaxRH ' - Me.grpStation.Controls.Add(Me.lblStationName) - Me.grpStation.Controls.Add(Me.ucrReceiverStationName) - Me.grpStation.Location = New System.Drawing.Point(13, 193) - Me.grpStation.Name = "grpStation" - Me.grpStation.Size = New System.Drawing.Size(135, 61) - Me.grpStation.TabIndex = 1 - Me.grpStation.TabStop = False - Me.grpStation.Tag = "" - Me.grpStation.Text = "Station" + Me.ucrReceiverMaxRH.AutoSize = True + Me.ucrReceiverMaxRH.frmParent = Nothing + Me.ucrReceiverMaxRH.Location = New System.Drawing.Point(16, 395) + Me.ucrReceiverMaxRH.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverMaxRH.Name = "ucrReceiverMaxRH" + Me.ucrReceiverMaxRH.Selector = Nothing + Me.ucrReceiverMaxRH.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverMaxRH.strNcFilePath = "" + Me.ucrReceiverMaxRH.TabIndex = 19 + Me.ucrReceiverMaxRH.ucrSelector = Nothing ' - 'ucrReceiverStationName + 'ucrReceiverMinRH ' - Me.ucrReceiverStationName.AutoSize = True - Me.ucrReceiverStationName.frmParent = Me - Me.ucrReceiverStationName.Location = New System.Drawing.Point(7, 37) - Me.ucrReceiverStationName.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverStationName.Name = "ucrReceiverStationName" - Me.ucrReceiverStationName.Selector = Nothing - Me.ucrReceiverStationName.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverStationName.strNcFilePath = "" - Me.ucrReceiverStationName.TabIndex = 1 - Me.ucrReceiverStationName.ucrSelector = Nothing + Me.ucrReceiverMinRH.AutoSize = True + Me.ucrReceiverMinRH.frmParent = Nothing + Me.ucrReceiverMinRH.Location = New System.Drawing.Point(16, 354) + Me.ucrReceiverMinRH.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverMinRH.Name = "ucrReceiverMinRH" + Me.ucrReceiverMinRH.Selector = Nothing + Me.ucrReceiverMinRH.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverMinRH.strNcFilePath = "" + Me.ucrReceiverMinRH.TabIndex = 17 + Me.ucrReceiverMinRH.ucrSelector = Nothing ' - 'cmdCheckUnique + 'ucrReceiverWindDirection ' - Me.cmdCheckUnique.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.cmdCheckUnique.Location = New System.Drawing.Point(9, 435) - Me.cmdCheckUnique.Name = "cmdCheckUnique" - Me.cmdCheckUnique.Size = New System.Drawing.Size(139, 23) - Me.cmdCheckUnique.TabIndex = 4 - Me.cmdCheckUnique.Text = "Check Duplicates" - Me.cmdCheckUnique.UseVisualStyleBackColor = True + Me.ucrReceiverWindDirection.AutoSize = True + Me.ucrReceiverWindDirection.frmParent = Nothing + Me.ucrReceiverWindDirection.Location = New System.Drawing.Point(16, 193) + Me.ucrReceiverWindDirection.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverWindDirection.Name = "ucrReceiverWindDirection" + Me.ucrReceiverWindDirection.Selector = Nothing + Me.ucrReceiverWindDirection.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverWindDirection.strNcFilePath = "" + Me.ucrReceiverWindDirection.TabIndex = 9 + Me.ucrReceiverWindDirection.ucrSelector = Nothing ' - 'ucrInputCheckInput + 'ucrReceiverRain ' - Me.ucrInputCheckInput.AddQuotesIfUnrecognised = True - Me.ucrInputCheckInput.AutoSize = True - Me.ucrInputCheckInput.IsMultiline = False - Me.ucrInputCheckInput.IsReadOnly = False - Me.ucrInputCheckInput.Location = New System.Drawing.Point(154, 437) - Me.ucrInputCheckInput.Name = "ucrInputCheckInput" - Me.ucrInputCheckInput.Size = New System.Drawing.Size(253, 21) - Me.ucrInputCheckInput.TabIndex = 5 + Me.ucrReceiverRain.AutoSize = True + Me.ucrReceiverRain.frmParent = Nothing + Me.ucrReceiverRain.Location = New System.Drawing.Point(16, 31) + Me.ucrReceiverRain.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverRain.Name = "ucrReceiverRain" + Me.ucrReceiverRain.Selector = Nothing + Me.ucrReceiverRain.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverRain.strNcFilePath = "" + Me.ucrReceiverRain.TabIndex = 1 + Me.ucrReceiverRain.ucrSelector = Nothing + ' + 'ucrReceiverSunshine + ' + Me.ucrReceiverSunshine.AutoSize = True + Me.ucrReceiverSunshine.frmParent = Nothing + Me.ucrReceiverSunshine.Location = New System.Drawing.Point(16, 231) + Me.ucrReceiverSunshine.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverSunshine.Name = "ucrReceiverSunshine" + Me.ucrReceiverSunshine.Selector = Nothing + Me.ucrReceiverSunshine.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverSunshine.strNcFilePath = "" + Me.ucrReceiverSunshine.TabIndex = 11 + Me.ucrReceiverSunshine.ucrSelector = Nothing + ' + 'ucrReceiverRadiation + ' + Me.ucrReceiverRadiation.AutoSize = True + Me.ucrReceiverRadiation.frmParent = Nothing + Me.ucrReceiverRadiation.Location = New System.Drawing.Point(16, 272) + Me.ucrReceiverRadiation.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverRadiation.Name = "ucrReceiverRadiation" + Me.ucrReceiverRadiation.Selector = Nothing + Me.ucrReceiverRadiation.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverRadiation.strNcFilePath = "" + Me.ucrReceiverRadiation.TabIndex = 13 + Me.ucrReceiverRadiation.ucrSelector = Nothing + ' + 'ucrReceiverMaxTemp + ' + Me.ucrReceiverMaxTemp.AutoSize = True + Me.ucrReceiverMaxTemp.frmParent = Nothing + Me.ucrReceiverMaxTemp.Location = New System.Drawing.Point(16, 111) + Me.ucrReceiverMaxTemp.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverMaxTemp.Name = "ucrReceiverMaxTemp" + Me.ucrReceiverMaxTemp.Selector = Nothing + Me.ucrReceiverMaxTemp.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverMaxTemp.strNcFilePath = "" + Me.ucrReceiverMaxTemp.TabIndex = 5 + Me.ucrReceiverMaxTemp.ucrSelector = Nothing + ' + 'ucrReceiverCloudCover + ' + Me.ucrReceiverCloudCover.AutoSize = True + Me.ucrReceiverCloudCover.frmParent = Nothing + Me.ucrReceiverCloudCover.Location = New System.Drawing.Point(16, 313) + Me.ucrReceiverCloudCover.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverCloudCover.Name = "ucrReceiverCloudCover" + Me.ucrReceiverCloudCover.Selector = Nothing + Me.ucrReceiverCloudCover.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverCloudCover.strNcFilePath = "" + Me.ucrReceiverCloudCover.TabIndex = 15 + Me.ucrReceiverCloudCover.ucrSelector = Nothing + ' + 'ucrReceiverWindSpeed + ' + Me.ucrReceiverWindSpeed.AutoSize = True + Me.ucrReceiverWindSpeed.frmParent = Nothing + Me.ucrReceiverWindSpeed.Location = New System.Drawing.Point(16, 152) + Me.ucrReceiverWindSpeed.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverWindSpeed.Name = "ucrReceiverWindSpeed" + Me.ucrReceiverWindSpeed.Selector = Nothing + Me.ucrReceiverWindSpeed.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverWindSpeed.strNcFilePath = "" + Me.ucrReceiverWindSpeed.TabIndex = 7 + Me.ucrReceiverWindSpeed.ucrSelector = Nothing + ' + 'ucrReceiverMinTemp + ' + Me.ucrReceiverMinTemp.AutoSize = True + Me.ucrReceiverMinTemp.frmParent = Nothing + Me.ucrReceiverMinTemp.Location = New System.Drawing.Point(16, 70) + Me.ucrReceiverMinTemp.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverMinTemp.Name = "ucrReceiverMinTemp" + Me.ucrReceiverMinTemp.Selector = Nothing + Me.ucrReceiverMinTemp.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverMinTemp.strNcFilePath = "" + Me.ucrReceiverMinTemp.TabIndex = 3 + Me.ucrReceiverMinTemp.ucrSelector = Nothing ' 'ucrBase ' @@ -501,58 +547,12 @@ Partial Class DlgDefineClimaticData Me.ucrSelectorDefineClimaticData.bDropUnusedFilterLevels = False Me.ucrSelectorDefineClimaticData.bShowHiddenColumns = False Me.ucrSelectorDefineClimaticData.bUseCurrentFilter = True - Me.ucrSelectorDefineClimaticData.Location = New System.Drawing.Point(13, 2) + Me.ucrSelectorDefineClimaticData.Location = New System.Drawing.Point(13, 14) Me.ucrSelectorDefineClimaticData.Margin = New System.Windows.Forms.Padding(0) Me.ucrSelectorDefineClimaticData.Name = "ucrSelectorDefineClimaticData" Me.ucrSelectorDefineClimaticData.Size = New System.Drawing.Size(213, 183) Me.ucrSelectorDefineClimaticData.TabIndex = 0 ' - 'lblMinimumRH - ' - Me.lblMinimumRH.AutoSize = True - Me.lblMinimumRH.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMinimumRH.Location = New System.Drawing.Point(16, 344) - Me.lblMinimumRH.Name = "lblMinimumRH" - Me.lblMinimumRH.Size = New System.Drawing.Size(87, 13) - Me.lblMinimumRH.TabIndex = 16 - Me.lblMinimumRH.Text = "Minimum RH (%):" - ' - 'ucrReceiverMinRH - ' - Me.ucrReceiverMinRH.AutoSize = True - Me.ucrReceiverMinRH.frmParent = Me - Me.ucrReceiverMinRH.Location = New System.Drawing.Point(16, 359) - Me.ucrReceiverMinRH.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverMinRH.Name = "ucrReceiverMinRH" - Me.ucrReceiverMinRH.Selector = Nothing - Me.ucrReceiverMinRH.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverMinRH.strNcFilePath = "" - Me.ucrReceiverMinRH.TabIndex = 17 - Me.ucrReceiverMinRH.ucrSelector = Nothing - ' - 'lblMaxRH - ' - Me.lblMaxRH.AutoSize = True - Me.lblMaxRH.ImeMode = System.Windows.Forms.ImeMode.NoControl - Me.lblMaxRH.Location = New System.Drawing.Point(16, 383) - Me.lblMaxRH.Name = "lblMaxRH" - Me.lblMaxRH.Size = New System.Drawing.Size(90, 13) - Me.lblMaxRH.TabIndex = 18 - Me.lblMaxRH.Text = "Maximum RH (%):" - ' - 'ucrReceiverMaxRH - ' - Me.ucrReceiverMaxRH.AutoSize = True - Me.ucrReceiverMaxRH.frmParent = Me - Me.ucrReceiverMaxRH.Location = New System.Drawing.Point(16, 398) - Me.ucrReceiverMaxRH.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverMaxRH.Name = "ucrReceiverMaxRH" - Me.ucrReceiverMaxRH.Selector = Nothing - Me.ucrReceiverMaxRH.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverMaxRH.strNcFilePath = "" - Me.ucrReceiverMaxRH.TabIndex = 19 - Me.ucrReceiverMaxRH.ucrSelector = Nothing - ' 'DlgDefineClimaticData ' Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) From cabe626703ea5547e6e08a09257af7200cc24f67 Mon Sep 17 00:00:00 2001 From: Antoine Ntalumeso Date: Tue, 22 Nov 2022 12:37:54 +0300 Subject: [PATCH 112/122] minor bug fix --- instat/DlgDefineClimaticData.vb | 26 +++++++++---------- instat/static/InstatObject/R/data_object_R6.R | 4 ++- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/instat/DlgDefineClimaticData.vb b/instat/DlgDefineClimaticData.vb index 15ff0ba23a9..d49f5e88bef 100644 --- a/instat/DlgDefineClimaticData.vb +++ b/instat/DlgDefineClimaticData.vb @@ -212,16 +212,16 @@ Public Class DlgDefineClimaticData Private Sub cmdCheckUnique_Click(sender As Object, e As EventArgs) Handles cmdCheckUnique.Click Dim iAnyDuplicated As Integer - Try - iAnyDuplicated = frmMain.clsRLink.RunInternalScriptGetValue(clsAnyDuplicatesFunction.ToScript()).AsInteger(0) - Catch ex As Exception - iAnyDuplicated = -1 + Try + iAnyDuplicated = frmMain.clsRLink.RunInternalScriptGetValue(clsAnyDuplicatesFunction.ToScript()).AsInteger(0) + Catch ex As Exception + iAnyDuplicated = -1 End Try - If iAnyDuplicated = -1 Then - ucrInputCheckInput.SetName("Developer error! Could not check uniqueness.") + If iAnyDuplicated = -1 Then + ucrInputCheckInput.SetName("Developer error! Could not check uniqueness.") ucrInputCheckInput.txtInput.BackColor = Color.Yellow - bIsUnique = False + bIsUnique = False ElseIf iAnyDuplicated > 0 Then ucrInputCheckInput.SetName("") ucrInputCheckInput.txtInput.BackColor = Color.LightCoral @@ -234,18 +234,18 @@ Public Class DlgDefineClimaticData MsgBox("You have multiple rows with the same dates for one or more stations. Use the Climatic > Tidy and Examine > Duplicates dialog to investigate these issues.", MsgBoxStyle.Information, Title:="Duplicates") End If Else - ucrInputCheckInput.SetName("No duplicate dates.") + ucrInputCheckInput.SetName("No duplicate dates.") ucrInputCheckInput.txtInput.BackColor = Color.LightGreen - bIsUnique = True + bIsUnique = True End If TestOKEnabled() End Sub Private Sub EnableDisableCheckUniqueBtn() - If ucrReceiverDate.IsEmpty Then - cmdCheckUnique.Enabled = False - Else - cmdCheckUnique.Enabled = True + If ucrReceiverDate.IsEmpty Then + cmdCheckUnique.Enabled = False + Else + cmdCheckUnique.Enabled = True End If ucrInputCheckInput.SetName("") ucrInputCheckInput.txtInput.BackColor = SystemColors.Window diff --git a/instat/static/InstatObject/R/data_object_R6.R b/instat/static/InstatObject/R/data_object_R6.R index cfa20c95b08..47e65f43562 100644 --- a/instat/static/InstatObject/R/data_object_R6.R +++ b/instat/static/InstatObject/R/data_object_R6.R @@ -2823,6 +2823,8 @@ station_label="station" date_asstring_label="date_asstring" temp_min_label="temp_min" temp_max_label="temp_max" +hum_min_label="hum_min" +hum_max_label="hum_max" temp_air_label="temp_air" temp_range_label="temp_range" wet_buld_label="wet_bulb" @@ -2842,7 +2844,7 @@ sunshine_hours_label="sunshine_hours" radiation_label="radiation" cloud_cover_label="cloud_cover" -all_climatic_column_types <- c(rain_label, rain_day_label, rain_day_lag_label, date_label, doy_label, s_doy_label, year_label, year_month_label, date_time_label, dos_label, season_label, month_label, day_label, dm_label, time_label, station_label, date_asstring_label, temp_min_label, temp_max_label, temp_air_label, temp_range_label, wet_buld_label, dry_bulb_label, evaporation_label, element_factor_label, identifier_label, capacity_label, wind_speed_label, wind_direction_label, lat_label, lon_label, alt_label, season_station_label, date_station_label, sunshine_hours_label, radiation_label, cloud_cover_label) +all_climatic_column_types <- c(rain_label, rain_day_label, rain_day_lag_label, date_label, doy_label, s_doy_label, year_label, year_month_label, date_time_label, dos_label, season_label, month_label, day_label, dm_label, time_label, station_label, date_asstring_label, temp_min_label, temp_max_label, hum_min_label, hum_max_label, temp_air_label, temp_range_label, wet_buld_label, dry_bulb_label, evaporation_label, element_factor_label, identifier_label, capacity_label, wind_speed_label, wind_direction_label, lat_label, lon_label, alt_label, season_station_label, date_station_label, sunshine_hours_label, radiation_label, cloud_cover_label) # Column metadata climatic_type_label <- "Climatic_Type" From 5873e79c56e14782357eeafd5f67111d9d33a317 Mon Sep 17 00:00:00 2001 From: lloyddewit <57253949+lloyddewit@users.noreply.github.com> Date: Tue, 22 Nov 2022 11:20:00 +0100 Subject: [PATCH 113/122] Update instat/dlgClimaticSummary.vb --- instat/dlgClimaticSummary.vb | 1 - 1 file changed, 1 deletion(-) diff --git a/instat/dlgClimaticSummary.vb b/instat/dlgClimaticSummary.vb index 08d6306939f..c1473ac7261 100644 --- a/instat/dlgClimaticSummary.vb +++ b/instat/dlgClimaticSummary.vb @@ -89,7 +89,6 @@ Public Class dlgClimaticSummary ucrReceiverWithinYear.SetParameterIsString() ucrReceiverWithinYear.SetClimaticType("month") ucrReceiverWithinYear.bAutoFill = True - 'ucrReceiverWithinYear.strSelectorHeading = "Factors" ucrReceiverWithinYear.Selector = ucrSelectorVariable ucrReceiverWithinYear.SetIncludedDataTypes({"numeric", "factor"}) From d9174b6bb909ac8f1bd003653447982ceb2c5354 Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Tue, 22 Nov 2022 15:14:01 +0300 Subject: [PATCH 114/122] Minor changes --- instat/ucrCalculator.vb | 224 +++++++++++++++++++--------------------- 1 file changed, 106 insertions(+), 118 deletions(-) diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index 72d6c84cc70..347460a53d8 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -289,6 +289,23 @@ Public Class ucrCalculator ttCalculator.SetToolTip(cmdCor, "correlation between 2 variables. It is a value between -1 and +1.") ttCalculator.SetToolTip(cmdCov, "covariance between 2 variables.") ttCalculator.SetToolTip(cmdQuantile, "a quantile, given a value between 0 and 1. So quantile(c(1,2,3,4,10), 0.25) = 2 and is the lower quartile.") + + ttCalculator.SetToolTip(cmdFreqDistinct, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqIQR, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqLength, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqMad, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqMax, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqMean, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqMedian, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqMin, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqMiss, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqMode1, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqPropn, "complete as rep(d > 50, f)) to give the proportion of values in variable d more than 50") + ttCalculator.SetToolTip(cmdFreqQuantile, "complete as rep(d ,f), prop=0.2), for example, for the 20% point.") + ttCalculator.SetToolTip(cmdFreqSd, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqSum, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + ttCalculator.SetToolTip(cmdFreqVar, "complete the command by rep(d ,f) for data in variable called d and frequencies in f") + End Sub Public Sub Reset() @@ -865,7 +882,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum(x = , na.rm = TRUE)", 16) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum( , na.rm = TRUE)", 16) End If End Sub @@ -873,7 +890,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean(x = , trim = 0 , na.rm = TRUE)", 27) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean( , na.rm = TRUE)", 16) End If End Sub @@ -881,7 +898,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("max(x = , na.rm = TRUE)", 16) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("max()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("max( , na.rm = TRUE)", 15) End If End Sub @@ -889,7 +906,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("min(x = , na.rm = TRUE)", 16) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("min()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("min( , na.rm = TRUE)", 16) End If End Sub @@ -897,7 +914,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("median(x = , na.rm = TRUE)", 16) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("median()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("median( , na.rm = TRUE)", 16) End If End Sub @@ -905,7 +922,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("var(x = , y = NULL, na.rm = TRUE)", 26) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("var()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("var( , na.rm = TRUE)", 16) End If End Sub @@ -913,7 +930,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sd(x = , na.rm = TRUE)", 16) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sd()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sd( , na.rm = TRUE)", 16) End If End Sub @@ -921,7 +938,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("range(x = , na.rm = TRUE, finite = FALSE)", 32) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("range()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("range( , na.rm = TRUE)", 16) End If End Sub @@ -942,14 +959,14 @@ Public Class ucrCalculator clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsQuantileFunction, iPosition:=0) clsRepFunction.AddParameter("len", clsRFunctionParameter:=clsDataFunction, iPosition:=1) - ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsRepFunction.ToScript, 57) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsRepFunction.ToScript, 66) End Sub Private Sub cmdIQR_Click(sender As Object, e As EventArgs) Handles cmdIQR.Click If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("IQR(x = , na.rm = TRUE, type = 7)", 26) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("IQR()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("IQR( , na.rm = TRUE)", 16) End If End Sub @@ -1593,7 +1610,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("raster::cv(x = , aszero = FALSE, na.rm = TRUE)", 32) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("raster::cv()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("raster::cv( , na.rm = TRUE)", 16) End If End Sub @@ -1601,7 +1618,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::mad(x = , center = median(x = ), constant = 1.4826, na.rm = TRUE,low = FALSE, high = FALSE)", 84) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::mad()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::mad( , na.rm = TRUE)", 16) End If End Sub @@ -1609,7 +1626,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("robustbase::mc(x = , na.rm = TRUE, doReflect = (length(x = ) <= 100),doScale = TRUE, maxit = 100, trace.lev = 0, full.result = FALSE)", 113) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("robustbase::mc()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("robustbase::mc( , na.rm = TRUE)", 16) End If End Sub @@ -1625,7 +1642,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::skewness(x = , na.rm = TRUE, type = 3)", 26) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::skewness()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::skewness( , na.rm = TRUE)", 16) End If End Sub @@ -4359,152 +4376,123 @@ Public Class ucrCalculator End Sub Private Sub cmdFreqLength_Click(sender As Object, e As EventArgs) Handles cmdFreqLength.Click - Dim clsLengthFunction As New RFunction - - clsRepFunction.SetRCommand("rep") - clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) - clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) - - clsLengthFunction.SetRCommand("length") - clsLengthFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) - - ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsLengthFunction.ToScript, 6) - End Sub - - Private Sub FrequencyFunctions(strRCommand As String) - clsRepFunction.SetRCommand("rep") - clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) - clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) - - FrequencyFunction.SetRCommand(strRCommand) - FrequencyFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) - FrequencyFunction.AddParameter("na.rm", "TRUE", iPosition:=1) - - ucrReceiverForCalculation.AddToReceiverAtCursorPosition(FrequencyFunction.ToScript, 18) + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("length(x=rep(x= ,times= ))", 11) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("length(rep( , ))", 5) + End If End Sub Private Sub cmdFreqSum_Click(sender As Object, e As EventArgs) Handles cmdFreqSum.Click - FrequencyFunctions("sum") + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum(x=rep(x= ,times= ),na.rm= TRUE)", 23) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum(rep(,),na.rm=TRUE)", 14) + End If End Sub Private Sub cmdFreqMin_Click(sender As Object, e As EventArgs) Handles cmdFreqMin.Click - FrequencyFunctions("min") + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("min(x=rep(x= ,times= ), na.rm= TRUE)", 23) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("min(rep( , ), na.rm= TRUE)", 18) + End If End Sub Private Sub cmdFreqMax_Click(sender As Object, e As EventArgs) Handles cmdFreqMax.Click - FrequencyFunctions("max") + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("max(x=rep(x= ,times= ), na.rm= TRUE)", 23) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("max(rep( , ), na.rm= TRUE)", 18) + End If End Sub Private Sub cmdFreqMode1_Click(sender As Object, e As EventArgs) Handles cmdFreqMode1.Click - Dim clsFreqModeFunction As New RFunction - - clsRepFunction.SetRCommand("rep") - clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) - clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) - - clsFreqModeFunction.SetRCommand("mode") - clsFreqModeFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) - - ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFreqModeFunction.ToScript, 6) + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1(x = , na.rm = TRUE)", 15) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1( , na.rm=TRUE)", 14) + End If End Sub Private Sub cmdFreqMiss_Click(sender As Object, e As EventArgs) Handles cmdFreqMiss.Click - Dim clsMissFunction As New RFunction - Dim clsSumFunction As New RFunction - - clsRepFunction.SetRCommand("rep") - clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) - clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) - - clsMissFunction.SetRCommand("is.na") - clsMissFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0, bIncludeArgumentName:=False) - - clsSumFunction.SetRCommand("sum") - clsSumFunction.AddParameter("x", clsRFunctionParameter:=clsMissFunction, iPosition:=0) - - ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsSumFunction.ToScript, 6) + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum(x=is.na(rep(x= ,times= )))", 11) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("sum(is.na(rep( , )))", 5) + End If End Sub Private Sub cmdFreqMean_Click(sender As Object, e As EventArgs) Handles cmdFreqMean.Click - FrequencyFunctions("mean") + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean(x=rep(x= ,times= ), na.rm= TRUE)", 23) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean(rep( , ), na.rm=TRUE)", 16) + End If End Sub Private Sub cmdFreqMedian_Click(sender As Object, e As EventArgs) Handles cmdFreqMedian.Click - FrequencyFunctions("median") - End Sub - - Private Sub FreqStatsFunctions(strRCommand As String) - Dim clsFrequencyStatsFunction As New RFunction - - clsRepFunction.SetRCommand("rep") - clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) - clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) - - clsFrequencyStatsFunction.SetPackageName("stats") - clsFrequencyStatsFunction.SetRCommand(strRCommand) - clsFrequencyStatsFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) - clsFrequencyStatsFunction.AddParameter("na.rm", "TRUE", iPosition:=1) - - ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFrequencyStatsFunction.ToScript, 18) + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("median(x=rep(x= ,times= ), na.rm= TRUE)", 23) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("median(rep( , ), na.rm=TRUE)", 17) + End If End Sub Private Sub cmdFreqVar_Click(sender As Object, e As EventArgs) Handles cmdFreqVar.Click - FreqStatsFunctions("var") + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::var(x = rep(x= ,times= ), na.rm = TRUE)", 24) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::var(rep( , ), na.rm=TRUE)", 17) + End If End Sub Private Sub cmdFreqSd_Click(sender As Object, e As EventArgs) Handles cmdFreqSd.Click - FreqStatsFunctions("sd") + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::sd(x = rep(x= ,times= ), na.rm = TRUE)", 24) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::sd(rep( , ), na.rm=TRUE)", 17) + End If End Sub Private Sub cmdFreqMad_Click(sender As Object, e As EventArgs) Handles cmdFreqMad.Click - FreqStatsFunctions("mad") + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::mad(x = rep(x= ,times= ), na.rm = TRUE)", 24) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::mad(rep( , ), na.rm=TRUE)", 17) + End If End Sub Private Sub cmdFreqIQR_Click(sender As Object, e As EventArgs) Handles cmdFreqIQR.Click - FreqStatsFunctions("IQR") + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::IQR(x = rep(x= ,times= ), na.rm = TRUE)", 24) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("stats::IQR(rep( , ), na.rm=TRUE)", 17) + End If End Sub Private Sub cmdFreqDistinct_Click(sender As Object, e As EventArgs) Handles cmdFreqDistinct.Click - Dim clsFreDistinctFunction As New RFunction - - clsRepFunction.SetRCommand("rep") - clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) - clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) - - clsFreDistinctFunction.SetPackageName("dplyr") - clsFreDistinctFunction.SetRCommand("n_distinct") - clsFreDistinctFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) - - ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFreDistinctFunction.ToScript, 6) + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("dplyr::n_distinct(x = rep(x= ,times= ))", 10) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("dplyr::n_distinct(rep( , ))", 5) + End If End Sub Private Sub cmdFreqPropn_Click(sender As Object, e As EventArgs) Handles cmdFreqPropn.Click - Dim clsFreqPropnFunction As New RFunction - - clsRepFunction.SetRCommand("rep") - clsRepFunction.AddParameter("x", " <= 1", iPosition:=0) - clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) - - clsFreqPropnFunction.SetRCommand("mean") - clsFreqPropnFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) - clsFreqPropnFunction.AddParameter("na.rm", "TRUE", iPosition:=1) - - ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFreqPropnFunction.ToScript, 21) + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean(x= rep(x= <=1, ), na.rm = TRUE))", 22) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("mean(rep( <=1, ), na.rm = TRUE)", 21) + End If End Sub Private Sub cmdFreqQuantile_Click(sender As Object, e As EventArgs) Handles cmdFreqQuantile.Click - Dim clsFreqQuantileFunction As New RFunction - - clsRepFunction.SetRCommand("rep") - clsRepFunction.AddParameter("x", " ", iPosition:=0, bIncludeArgumentName:=False) - clsRepFunction.AddParameter("y", " ", iPosition:=1, bIncludeArgumentName:=False) - - clsFreqQuantileFunction.SetRCommand("quantile") - clsFreqQuantileFunction.AddParameter("x", clsRFunctionParameter:=clsRepFunction, iPosition:=0) - clsFreqQuantileFunction.AddParameter("probs", "0.5", iPosition:=1) - clsFreqQuantileFunction.AddParameter("na.rm", "TRUE", iPosition:=2) - - ucrReceiverForCalculation.AddToReceiverAtCursorPosition(clsFreqQuantileFunction.ToScript, 28) + If chkShowParameters.Checked Then + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("quantile(x= rep(x= , times= ), probs= 0.2, na.rm = TRUE))", 38) + Else + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("quantile(rep( , ), 0.2, na.rm = TRUE)", 24) + End If End Sub Private Sub BaseToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles BaseToolStripMenuItem1.Click From 232110a404ddbb9bfba9f379f5471e777b2798d1 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Tue, 22 Nov 2022 18:26:19 +0300 Subject: [PATCH 115/122] updated the instat.vbproj --- instat/instat.vbproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instat/instat.vbproj b/instat/instat.vbproj index 2d2c4bec681..3fa6514465b 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -243,7 +243,8 @@ frmMaximiseOutput.vb - Form + Form + dlgSearch.vb From b5c26172ed283b133d01f202518b0369d07a57f7 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Tue, 22 Nov 2022 19:05:55 +0300 Subject: [PATCH 116/122] changed regular sequencer to use the new set assign to column subroutine --- instat/dlgRegularSequence.vb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index ff0232cb5f9..797415d16fe 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -179,7 +179,10 @@ Public Class dlgRegularSequence clsRepFunction.AddParameter("each", 1, iPosition:=2) clsRepFunction.AddParameter("length.out", ucrDataFrameLength.GetDataFrameLength, iPosition:=3) - clsRepFunction.SetAssignTo(ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText, bAssignToIsPrefix:=True) + clsRepFunction.SetAssignToColumnObject(strColToAssignTo:=ucrNewColumnName.GetText, + strColName:=ucrNewColumnName.GetText, + strRDataFrameNameToAddObjectTo:=ucrSelectDataFrameRegularSequence.strCurrDataFrame, + bAssignToIsPrefix:=True) ucrBase.clsRsyntax.SetBaseRFunction(clsRepFunction) End Sub From 6e166387e32db876848a5d94171a69440a3eec80 Mon Sep 17 00:00:00 2001 From: Derrick Agorhom <76208189+derekagorhom@users.noreply.github.com> Date: Wed, 23 Nov 2022 08:11:05 +0100 Subject: [PATCH 117/122] Implementing Tab and arrow keys in Reogrid --- instat/UserControls/DataGrid/ReoGrid/ucrDataViewReoGrid.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/UserControls/DataGrid/ReoGrid/ucrDataViewReoGrid.vb b/instat/UserControls/DataGrid/ReoGrid/ucrDataViewReoGrid.vb index eb2156058ca..62fedf7e6cd 100644 --- a/instat/UserControls/DataGrid/ReoGrid/ucrDataViewReoGrid.vb +++ b/instat/UserControls/DataGrid/ReoGrid/ucrDataViewReoGrid.vb @@ -174,8 +174,8 @@ Public Class ucrDataViewReoGrid End Sub Private Sub Worksheet_BeforeCellsKeyDown(sender As Object, e As BeforeCellKeyDownEventArgs) - e.IsCancelled = True If e.KeyCode = unvell.ReoGrid.Interaction.KeyCode.Delete OrElse e.KeyCode = unvell.ReoGrid.Interaction.KeyCode.Back Then + e.IsCancelled = True RaiseEvent DeleteValueToDataframe() End If End Sub From 49b87d6ea8fc5cf82f3798cb19b9b195172b4608 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Wed, 23 Nov 2022 14:52:17 +0300 Subject: [PATCH 118/122] Resolved comments --- instat/Enum/RObjectTypeLabel.vb | 4 ++-- instat/Model/Output/clsOutputElement.vb | 2 ++ instat/clsRCodeStructure.vb | 2 +- instat/clsRLink.vb | 27 ++++++++++++++++--------- instat/ucrInput.vb | 2 +- instat/ucrInputComboBox.vb | 2 +- instat/ucrSave.vb | 4 ++-- 7 files changed, 26 insertions(+), 17 deletions(-) diff --git a/instat/Enum/RObjectTypeLabel.vb b/instat/Enum/RObjectTypeLabel.vb index f1839baa00f..4b187786b15 100644 --- a/instat/Enum/RObjectTypeLabel.vb +++ b/instat/Enum/RObjectTypeLabel.vb @@ -12,6 +12,6 @@ Public Structure RObjectTypeLabel Public Const Graph As String = "graph" Public Const Table As String = "table" Public Const Model As String = "model" - Public Const Structure_label As String = "structure" - Public Const Summary As String = "summary" + Public Const StructureLabel As String = "structure" ' e.g Survival objects + Public Const Summary As String = "summary" ' e.g objects of text formats End Structure \ No newline at end of file diff --git a/instat/Model/Output/clsOutputElement.vb b/instat/Model/Output/clsOutputElement.vb index f228b9c59fc..c182d21128a 100644 --- a/instat/Model/Output/clsOutputElement.vb +++ b/instat/Model/Output/clsOutputElement.vb @@ -102,6 +102,8 @@ Public Class clsOutputElement End Get End Property + 'this does a shallow clone + 'todo. add a deep clone implementation Public Function Clone() As clsOutputElement Return Me.MemberwiseClone End Function diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index a5612707b24..ae8a393323e 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -279,7 +279,7 @@ Public Class RCodeStructure If Not strTempSurv = "" Then strNewRObjectTypeToAssignTo = strTempSurv - strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.Structure_label + strNewRObjectTypeLabelToAssignTo = RObjectTypeLabel.StructureLabel 'assumption is, by default a survival is in text format strNewRObjectFormatToAssignTo = RObjectFormat.Text End If diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 39995170f9f..655ac24d4bf 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -746,10 +746,10 @@ Public Class RLink '''-------------------------------------------------------------------------------------------- ''' ''' This method executes the R script and displays the output. The - ''' output may be displayed as text, graph or in a web browser (see ). + ''' output may be displayed as text, graph or html (see ). ''' ''' is the R script to execute. - ''' defines how to display the R output. + ''' defines how to display the R output. todo deprecate this. ''' ''' ''' 0 Executes and ignores the result. @@ -787,8 +787,18 @@ Public Class RLink ''' . ''' if false and an exception is raised then open a message box that ''' displays the exception message. + ''' if true and the script produces and output, the output will be added + ''' in the output viewer, if false, the output will be displayed in a different viewer. + ''' displays the exception message. '''-------------------------------------------------------------------------------------------- - Public Sub RunScript(strScript As String, Optional iCallType As Integer = 0, Optional bAddOutputInLog As Boolean = True, Optional strComment As String = "", Optional bSeparateThread As Boolean = True, Optional bShowWaitDialogOverride As Nullable(Of Boolean) = Nothing, Optional bUpdateGrids As Boolean = True, Optional bSilent As Boolean = False) + Public Sub RunScript(strScript As String, + Optional iCallType As Integer = 0, + Optional strComment As String = "", + Optional bSeparateThread As Boolean = True, + Optional bShowWaitDialogOverride As Nullable(Of Boolean) = Nothing, + Optional bUpdateGrids As Boolean = True, + Optional bSilent As Boolean = False, + Optional bAddOutputInViewer As Boolean = True) Dim strCapturedScript As String Dim expTemp As RDotNet.SymbolicExpression Dim strTemp As String = "" @@ -808,8 +818,6 @@ Public Class RLink Directory.CreateDirectory(strTempGraphsDirectory) End If - - ' if comment provided If strComment <> "" Then ' Prefix comment to script, e.g. "# Code generated by the dialog, Import Dataset" & vbCrLf & "new_RDS <- readRDS(file=""C:/Users/myName ... @@ -843,7 +851,7 @@ Public Class RLink 'get the file path name strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) If File.Exists(strTemp) Then - If bAddOutputInLog Then + If bAddOutputInViewer Then clsOutputLogger.AddFileOutput(strTemp) Else Dim frmMaximiseOutput As New frmMaximiseOutput @@ -1100,15 +1108,14 @@ Public Class RLink clsViewObjectFunction.AddParameter(strParameterName:="object_format", strParameterValue:=Chr(34) & RObjectFormat.Html & Chr(34)) - 'Need to set iCallType = 2 to obtain a graph in an interactive viewer. - RunScript(clsViewObjectFunction.ToScript(), bAddOutputInLog:=False, strComment:="View last graph as Plotly", bSeparateThread:=False) + RunScript(clsViewObjectFunction.ToScript(), bAddOutputInViewer:=False, strComment:="View last graph as Plotly", bSeparateThread:=False) ElseIf bInRViewer Then Dim strGlobalGraphDisplayOption As String 'store the current set graph display option, to restore after display strGlobalGraphDisplayOption = Me.strGraphDisplayOption Me.strGraphDisplayOption = "view_R_viewer" clsLastGraph.AddParameter("print_graph", "TRUE", iPosition:=0) - RunScript(clsLastGraph.ToScript(), iCallType:=3, bAddOutputInLog:=False, strComment:="View last graph", bSeparateThread:=False) + RunScript(clsLastGraph.ToScript(), iCallType:=3, bAddOutputInViewer:=False, strComment:="View last graph", bSeparateThread:=False) 'restore the graph display option Me.strGraphDisplayOption = strGlobalGraphDisplayOption Else @@ -1117,7 +1124,7 @@ Public Class RLink clsViewObjectFunction.AddParameter(strParameterName:="object", clsRFunctionParameter:=clsLastGraph) clsViewObjectFunction.AddParameter(strParameterName:="object_format", strParameterValue:=Chr(34) & RObjectFormat.Image & Chr(34)) - RunScript(clsViewObjectFunction.ToScript(), bAddOutputInLog:=False, strComment:="View last graph", bSeparateThread:=False) + RunScript(clsViewObjectFunction.ToScript(), bAddOutputInViewer:=False, strComment:="View last graph", bSeparateThread:=False) End If End Sub diff --git a/instat/ucrInput.vb b/instat/ucrInput.vb index 306bd715112..6cffb298841 100644 --- a/instat/ucrInput.vb +++ b/instat/ucrInput.vb @@ -156,7 +156,7 @@ Public Class ucrInput Case RObjectTypeLabel.Graph, RObjectTypeLabel.Table, RObjectTypeLabel.Model, - RObjectTypeLabel.Structure_label, + RObjectTypeLabel.StructureLabel, RObjectTypeLabel.Summary 'for objects that are shown in the output viewer. do the following If ucrDataFrameSelector IsNot Nothing AndAlso ucrDataFrameSelector.strCurrDataFrame <> "" Then diff --git a/instat/ucrInputComboBox.vb b/instat/ucrInputComboBox.vb index 14e880c2a27..2bebec68f59 100644 --- a/instat/ucrInputComboBox.vb +++ b/instat/ucrInputComboBox.vb @@ -107,7 +107,7 @@ Public Class ucrInputComboBox Case RObjectTypeLabel.Graph, RObjectTypeLabel.Table, RObjectTypeLabel.Model, - RObjectTypeLabel.Structure_label, + RObjectTypeLabel.StructureLabel, RObjectTypeLabel.Summary 'for objects that are shown in the output viewer. do the following cboInput.Items.Clear() diff --git a/instat/ucrSave.vb b/instat/ucrSave.vb index 1c2e1712b33..1ebea03bdf8 100644 --- a/instat/ucrSave.vb +++ b/instat/ucrSave.vb @@ -402,7 +402,7 @@ Public Class ucrSave Case RObjectTypeLabel.Graph, RObjectTypeLabel.Table, RObjectTypeLabel.Model, - RObjectTypeLabel.Structure_label, + RObjectTypeLabel.StructureLabel, RObjectTypeLabel.Summary 'for objects that are shown in the output viewer. do the following ucrInputComboSave.SetDefaultRObjectTypeLabel(_strRObjectLabel) @@ -453,7 +453,7 @@ Public Class ucrSave ''' Public Sub SetSaveTypeAsSurv() 'assumption is by default a survival is in text format - SetSaveType(strRObjectType:=RObjectTypeLabel.Structure_label, strRObjectFormat:=RObjectFormat.Text) + SetSaveType(strRObjectType:=RObjectTypeLabel.StructureLabel, strRObjectFormat:=RObjectFormat.Text) End Sub ''' ''' Sets save type as table. From 9d41aa5585e59837bb7bb317b565da7d583a7084 Mon Sep 17 00:00:00 2001 From: patowhiz Date: Wed, 23 Nov 2022 16:02:12 +0300 Subject: [PATCH 119/122] fixed error produced by clsRLink --- instat/clsRLink.vb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 655ac24d4bf..63f60c48dfb 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -841,9 +841,10 @@ Public Class RLink Try 'get the last R script command - Dim strLastScript As String = GetRunnableCommandLines(strScript).Last - If strLastScript.Contains("get_object") OrElse strLastScript.Contains("view_object") Then 'if output should be returned as a file + Dim strLastScript As String = GetRunnableCommandLines(strScript).LastOrDefault + If strLastScript IsNot Nothing AndAlso strLastScript.Contains("get_object") Then Try + 'if object output should be returned as a file do the following. Dim strNewAssignedToScript As String = ConstructAssignTo(strTempAssignTo, strScript) Evaluate(strNewAssignedToScript, bSilent:=bSilent, bSeparateThread:=bSeparateThread, bShowWaitDialogOverride:=bShowWaitDialogOverride) expTemp = GetSymbol(strTempAssignTo) From b573b4c17f3f87b796350bb127d4247d6868678e Mon Sep 17 00:00:00 2001 From: anastasia-mbithe Date: Fri, 25 Nov 2022 11:52:34 +0300 Subject: [PATCH 120/122] Minor change --- instat/ucrCalculator.vb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/instat/ucrCalculator.vb b/instat/ucrCalculator.vb index 347460a53d8..de9e18e1130 100644 --- a/instat/ucrCalculator.vb +++ b/instat/ucrCalculator.vb @@ -1660,17 +1660,17 @@ Public Class ucrCalculator Private Sub cmdCor_Click(sender As Object, e As EventArgs) Handles cmdCor.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cor(x= , y= , use = ""everything"", method = c(""pearson"", ""kendall"", ""spearman""))", 73) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cor(x= , y= , use = ""na"", method = c(""pearson"", ""kendall"", ""spearman""))", 65) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cor(x = , y = )", 8) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cor(x = , y = , use = ""na"")", 19) End If End Sub Private Sub cmdCov_Click(sender As Object, e As EventArgs) Handles cmdCov.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cov(x= , y= , use = ""everything"", method = c(""pearson"", ""kendall"", ""spearman""))", 73) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cov(x= , y= , use = ""na"", method = c(""pearson"", ""kendall"", ""spearman""))", 65) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cov(x = , y = )", 8) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("cov(x = , y = , use = ""na"")", 19) End If End Sub @@ -3633,7 +3633,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1(x = , na.rm = TRUE)", 16) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1( , na.rm = TRUE)", 16) End If End Sub @@ -3641,7 +3641,7 @@ Public Class ucrCalculator If chkShowParameters.Checked Then ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::kurtosis(x = , na.rm = TRUE, type = 3)", 26) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::kurtosis()", 1) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("e1071::kurtosis( , na.rm = TRUE)", 16) End If End Sub @@ -4409,9 +4409,9 @@ Public Class ucrCalculator Private Sub cmdFreqMode1_Click(sender As Object, e As EventArgs) Handles cmdFreqMode1.Click If chkShowParameters.Checked Then - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1(x = , na.rm = TRUE)", 15) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1(rep(x = , times= ), na.rm = TRUE)", 25) Else - ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1( , na.rm=TRUE)", 14) + ucrReceiverForCalculation.AddToReceiverAtCursorPosition("statip::mfv1(rep( , ), na.rm = TRUE)", 19) End If End Sub From c2e36e33b4b8363d061134b1f4039c6a4c20e2d1 Mon Sep 17 00:00:00 2001 From: Barbra2020 Date: Sat, 26 Nov 2022 14:10:21 +0300 Subject: [PATCH 121/122] a change --- instat/ucrFactor.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/ucrFactor.vb b/instat/ucrFactor.vb index a420ae9ff46..5c82f57a346 100644 --- a/instat/ucrFactor.vb +++ b/instat/ucrFactor.vb @@ -612,7 +612,7 @@ Public Class ucrFactor End Function Private Function GetColumnIndex(grdSheet As unvell.ReoGrid.Worksheet, strColName As String) As Integer - If _grdSheet IsNot Nothing Then + If grdSheet IsNot Nothing Then For i As Integer = 0 To grdSheet.Columns - 1 If grdSheet.ColumnHeaders(i).Text = strColName Then Return i From 8fc83765997b34f34be14d6427b71c3049940a51 Mon Sep 17 00:00:00 2001 From: lloyddewit Date: Sun, 27 Nov 2022 13:57:18 +0100 Subject: [PATCH 122/122] Ensured that script window is not corrupted when auto-save triggered --- instat/dlgFind.vb | 5 +- instat/frmScript.Designer.vb | 83 -------------- instat/frmScript.resx | 120 --------------------- instat/frmScript.sw-KE.resx | 15 --- instat/frmScript.vb | 47 -------- instat/instat.vbproj | 16 +-- instat/translations/rInstatTranslations.db | Bin 6496256 -> 6500352 bytes 7 files changed, 3 insertions(+), 283 deletions(-) delete mode 100644 instat/frmScript.Designer.vb delete mode 100644 instat/frmScript.resx delete mode 100644 instat/frmScript.sw-KE.resx delete mode 100644 instat/frmScript.vb diff --git a/instat/dlgFind.vb b/instat/dlgFind.vb index 5f6ce05790e..bf09f7f211e 100644 --- a/instat/dlgFind.vb +++ b/instat/dlgFind.vb @@ -31,9 +31,6 @@ Public Class dlgFind Case "frmCommand" searchTextBox(frmCommand.txtCommand, targetPos) - Case "frmScript" - searchTextBox(frmScript.txtScript, targetPos) - Case "frmEditor" searchDataView(targetPos) @@ -106,7 +103,7 @@ Public Class dlgFind cmdFindNext.Enabled = True Me.AcceptButton = cmdFindNext cmdFindAll.Enabled = False - ElseIf currWindow.Name = "frmCommand" Or currWindow.Name = "frmLog" Or currWindow.Name = "frmScript" Then + ElseIf currWindow.Name = "frmCommand" Or currWindow.Name = "frmLog" Then cmdFindNext.Enabled = True Me.AcceptButton = cmdFindNext cmdFindAll.Enabled = False diff --git a/instat/frmScript.Designer.vb b/instat/frmScript.Designer.vb deleted file mode 100644 index 7dd623c34c5..00000000000 --- a/instat/frmScript.Designer.vb +++ /dev/null @@ -1,83 +0,0 @@ -' R- Instat -' Copyright (C) 2015-2017 -' -' This program is free software: you can redistribute it and/or modify -' it under the terms of the GNU General Public License as published by -' the Free Software Foundation, either version 3 of the License, or -' (at your option) any later version. -' -' This program is distributed in the hope that it will be useful, -' but WITHOUT ANY WARRANTY; without even the implied warranty of -' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -' GNU General Public License for more details. -' -' You should have received a copy of the GNU General Public License -' along with this program. If not, see . - - -Partial Class frmScript - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - - Private Sub InitializeComponent() - Me.txtScript = New System.Windows.Forms.TextBox() - Me.cmdClear = New System.Windows.Forms.Button() - Me.SuspendLayout() - ' - 'txtScript - ' - Me.txtScript.Dock = System.Windows.Forms.DockStyle.Bottom - Me.txtScript.Location = New System.Drawing.Point(0, 55) - Me.txtScript.Multiline = True - Me.txtScript.Name = "txtScript" - Me.txtScript.ReadOnly = True - Me.txtScript.Size = New System.Drawing.Size(548, 290) - Me.txtScript.TabIndex = 0 - ' - 'cmdClear - ' - Me.cmdClear.Dock = System.Windows.Forms.DockStyle.Right - Me.cmdClear.Location = New System.Drawing.Point(444, 0) - Me.cmdClear.Name = "cmdClear" - Me.cmdClear.Size = New System.Drawing.Size(104, 55) - Me.cmdClear.TabIndex = 1 - Me.cmdClear.Text = "Clear contents" - Me.cmdClear.UseVisualStyleBackColor = True - ' - 'frmScript - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi - Me.ClientSize = New System.Drawing.Size(548, 345) - Me.Controls.Add(Me.cmdClear) - Me.Controls.Add(Me.txtScript) - Me.Name = "frmScript" - Me.ShowIcon = False - Me.Tag = "Script_Window" - Me.Text = "Script Window" - Me.ResumeLayout(False) - Me.PerformLayout() - - End Sub - - Friend WithEvents txtScript As TextBox - Friend WithEvents cmdClear As Button -End Class diff --git a/instat/frmScript.resx b/instat/frmScript.resx deleted file mode 100644 index 29dcb1b3a35..00000000000 --- a/instat/frmScript.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/instat/frmScript.sw-KE.resx b/instat/frmScript.sw-KE.resx deleted file mode 100644 index 9c9f69d752c..00000000000 --- a/instat/frmScript.sw-KE.resx +++ /dev/null @@ -1,15 +0,0 @@ - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/instat/frmScript.vb b/instat/frmScript.vb deleted file mode 100644 index c4452e10cb0..00000000000 --- a/instat/frmScript.vb +++ /dev/null @@ -1,47 +0,0 @@ -' R- Instat -' Copyright (C) 2015-2017 -' -' This program is free software: you can redistribute it and/or modify -' it under the terms of the GNU General Public License as published by -' the Free Software Foundation, either version 3 of the License, or -' (at your option) any later version. -' -' This program is distributed in the hope that it will be useful, -' but WITHOUT ANY WARRANTY; without even the implied warranty of -' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -' GNU General Public License for more details. -' -' You should have received a copy of the GNU General Public License -' along with this program. If not, see . - -Public Class frmScript - Protected Overrides Sub OnFormClosing(ByVal e As FormClosingEventArgs) - MyBase.OnFormClosing(e) - If Not e.Cancel AndAlso e.CloseReason = CloseReason.UserClosing Then - e.Cancel = True - Me.Close() - End If - End Sub - - Public Sub copyText() - txtScript.Copy() - End Sub - - Public Sub selectAllText() - txtScript.SelectAll() - End Sub - - Private Sub frmScript_VisibleChanged(sender As Object, e As EventArgs) Handles Me.VisibleChanged - frmMain.mnuViewScriptWindow.Checked = Me.Visible - End Sub - - Private Sub cmdClear_Click(sender As Object, e As EventArgs) Handles cmdClear.Click - Dim dlgResponse As DialogResult - If txtScript.Text <> "" Then - dlgResponse = MessageBox.Show("Are you sure you want to clear the " & Me.Text, "Clear " & Me.Text, MessageBoxButtons.YesNo) - If dlgResponse = DialogResult.Yes Then - txtScript.Clear() - End If - End If - End Sub -End Class diff --git a/instat/instat.vbproj b/instat/instat.vbproj index 3fa6514465b..f5070882585 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -243,8 +243,8 @@ frmMaximiseOutput.vb - Form - + Form + dlgSearch.vb @@ -2591,12 +2591,6 @@ Form - - frmScript.vb - - - Form - frmVariables.vb @@ -4793,12 +4787,6 @@ frmMetaData.vb - - frmScript.vb - - - frmScript.vb - frmVariables.vb diff --git a/instat/translations/rInstatTranslations.db b/instat/translations/rInstatTranslations.db index fef21885f6e89ba07a1ea8be9fb8a163123e43b8..7d7154a5ff1ebc8b8b24b29cb7815cbe1943e84d 100644 GIT binary patch delta 1501 zcmY+^TWl0n7zgl~-7~Yh-5aH)g`RD9TZDGGwOe-VcBSo>7KUpn9Y6#NU6yTZT(%ds zkYE!#8mAAIr6z_G#h5CImWxqJ$oOC)iD1MB6nOv=gClCv_#%yOMx+0k%B8#c?M%-1 z%{h~^-*-l@j@w6#ar*=nu5+BY_N`D0Zq~?Cmkv+XI)5Z*Idk-~r;ZT^#|h19KJfba z=-Bxv4>qs^0RcpCfD>F$0B-Pr7kuD{1yBeJp$Lj$5tKkFEQTde1{4BN4iylD5L7}H zEQM!a87zltsDUu7fR(TcR>K;og*u2pJ*wiXPr}0fFAvY9Vyc$|{+c)tbr3m5!6;GqgYgT46o3K|5@K zjUdA&*bG}>D{O=9&;dK36LvzEeymq{v+q?b*T7A4{;U2Gf0y6koA$lrTkQSDd&1k~ zx$7D9_}r)58wzF%P8T#4NUq;pqplX0+j-4-(z)MR>-gL8t>azCR`E~q1979s373R! zfg_)i-S&U%@7dqBkJ}Y{q3vtipsn5J;cxP<@iO-pmV5kRwAEAZY{vmWXew;|DJAXw z9sRjoL&@yXOfr|=tmY|N;i>C$+jJ=xif@bW~jQyJNqGoh!#sSSZs2M$)k^IOwlqmLM zQPG#+{FnU){Q=({-zi^0j|?=YoO8rGOv+Pt=N@HG}BxS z2j``tj{h&`Ry7|&Czo3D1)d~XMP>c8sQDn8Ymt>v_9VkR7)+gNz5=I%wZUP*inCTK SRyeWq<(RtKdhqcnQS={N5B<0R delta 1270 zcmYMzX-u3&7zgn8nD^M5OQ9^=-Gx?MD96%$+btCqSUHP8c`IsbD_af&EJv56sfkur zF??uUsRt87W1uy1wAvtPUNntu(rRo>REiO8qk&dyZH&QBMn8!ErHxMVo9D@7GS8FA z%;55Ie(=(9e#9zVVHmOCgu{m~2AN?PMkt;$=2Id`gNzi3CcHf38J_X5 zzyS{g1Q0<28FZir0~o;sX0SjU#6tokLJ~Xx4?;4ezy?SKE2M!9Hi8`-;DmI@fK9L& z9)e7G7+jDA*{}t2AQ$o=AKXv?Tfw8vc$B?e><%i7EA9%zFNS%;O9sC|FFz+Y$eH?| z^=I@$`aOD^?v`#+*QLvo@5*NBH|eVUsXR(*ND6<4pXcA^yZI_Uh5LbfldBDM(C5dM zFWHaj%5_gA;Z4jgI{Uq+Sm*Bz)&}~+74wumrEJnL9S{UlKhx=_m)=#%>FNhw3+=0DzRz@`@CPVl4X?r z&>FGOmDAp8dS|50ro9vLo@b@PwRqIF(#VA3O1xJb^&O?bpt=@EtSyvXP+jz5*qbR; zuUXK1=K9wA-4A#Z`RX+@{pV}7Mp!e&`o#X^;jsa)Ha4)M{Vu^%EvG_rVVfw1#8Q!= zoy~>m+Uw1QJ%U^m8RCe2YbE_+$(=^8hP^g9Co;qmyW2&7UvgU${K2+B$kEc<6K?AX z_h&?gnBl|ig|HJIfg&gdACy2Tlz|@}g>tBXN~nTrsDWKj3y(n^)I$U8hDPmhyLznS zMd=O3!%Q=#EaPqC1>+%On&BEAV1fQ8{iME3cSCnX{!2b5?~@s6QaUE>6u%YU5(8qY za7&mKUJ)7v2U#T(q?-SeKgl=o5;w;+aRPgW^)olw)9e^CZTZB~Z`o*GF;APj%ywMV zy+QAXBdhMz|#6_ae>>n*Q?c6tNR7f&)GD(6nBIW#lW~)|oUA-*G7Bh36*t#~;{E7T6 zH2qXvM5>BJHxQ>v7xdd4bb3MkJPv2C7eJI_h3KJc>dn!Sd~sM@R$&i34o&a`JPA+1 XUf2gu!+tmb&p