From e1e3e53877548080e359e330f7f2d77982db2055 Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 10 Feb 2017 19:22:27 +0000 Subject: [PATCH 001/201] Code changes --- instat/dlgOneVarCompareModels.vb | 113 +++++++++++++++++-------------- 1 file changed, 64 insertions(+), 49 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 43addcfb0fe..d619f2e18a0 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -16,39 +16,55 @@ Imports instat.Translations -Public Class dlgOneVarCompareModels - Public bfirstload As Boolean = True +Public Class dlgOneVarCompareModels + Private bFirstLoad As Boolean = True + Private bReset As Boolean = True + 'Private bResetSubdialog As Boolean = False Private Sub dlgOneVarCompareModels_Load(sender As Object, e As EventArgs) Handles MyBase.Load - If bfirstload Then - InitialiseDialog() - SetDefaults() - bfirstload = False - Else - ReopenDialog() - End If - autoTranslate(Me) + autoTranslate(Me) + If bFirstLoad Then + InitialiseDialog() + bFirstLoad = False + End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False + ReopenDialog() + TestOKEnabled() End Sub - Private Sub InitialiseDialog() - sdgOneVarCompareModels.InitialiseDialog() - ucrBase.iHelpTopicID = 174 - ucrBase.clsRsyntax.iCallType = 2 + ' want: gofstat(f=InstatDataObject$get_models(model_name="dist1hjhj", data_name="Damango")) + Private Sub InitialiseDialog() + ucrBase.iHelpTopicID = 174 + ucrBase.clsRsyntax.iCallType = 2 + + 'ucrSelector + ucrSelectorOneVarCompModels.SetItemType("model") + + 'ucrReceiver + UcrReceiver.SetParameter(New RParameter("f", 0)) + UcrReceiver.SetParameterIsRFunction() UcrReceiver.Selector = ucrSelectorOneVarCompModels - UcrReceiver.SetMeAsReceiver() - ucrBase.clsRsyntax.SetFunction("gofstat") - ucrSelectorOneVarCompModels.SetItemType("model") - sdgOneVarCompareModels.SetModelFunction(ucrBase.clsRsyntax.clsBaseFunction) - sdgOneVarCompareModels.SetReceiver(UcrReceiver) - sdgOneVarCompareModels.DisplayChiSquare() - sdgOneVarCompareModels.DisplayChiBreaks() + UcrReceiver.SetMeAsReceiver() + + + 'sdgOneVarCompareModels.InitialiseDialog() + ' sdgOneVarCompareModels.SetModelFunction(ucrBase.clsRsyntax.clsBaseFunction) + ' sdgOneVarCompareModels.SetReceiver(UcrReceiver) + ' sdgOneVarCompareModels.DisplayChiSquare() + ' sdgOneVarCompareModels.DisplayChiBreaks() End Sub - Private Sub SetDefaults() - ucrSelectorOneVarCompModels.Reset() - ucrSelectorOneVarCompModels.Focus() - sdgOneVarCompareModels.SetDefaults() - TestOKEnabled() + Private Sub SetDefaults() + Dim clsDefaultFunction As New RFunction + ucrSelectorOneVarCompModels.Reset() + + clsDefaultFunction.SetRCommand("gofstat") + ucrBase.clsRsyntax.SetBaseRFunction(clsDefaultFunction.Clone()) + ' bResetSubdialog = True End Sub 'Only distributions that can be accepted into the receiver have to be from the same variable @@ -60,47 +76,46 @@ Public Class dlgOneVarCompareModels End Sub Public Sub TestOKEnabled() - If sdgOneVarCompareModels.TestOkEnabled() AndAlso Not UcrReceiver.IsEmpty Then + If Not UcrReceiver.IsEmpty Then 'sdgOneVarCompareModels.TestOkEnabled() AndAlso Not Then ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) End If End Sub - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() + Public Sub SetRCodeForControls(bReset As Boolean) + SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) End Sub - Private Sub ucrSelectorOneVarCompModels_DataFrameChanged() Handles ucrSelectorOneVarCompModels.DataFrameChanged - sdgOneVarCompareModels.DisplayChiSquare() + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset + SetDefaults() + SetRCodeForControls(True) + TestOKEnabled() End Sub - Private Sub UcrReceiver_SelectionChanged(sender As Object, e As EventArgs) Handles UcrReceiver.SelectionChanged + Private Sub ucrSelectorOneVarCompModels_DataFrameChanged() Handles ucrSelectorOneVarCompModels.DataFrameChanged + ' sdgOneVarCompareModels.DisplayChiSquare() + End Sub + + Private Sub UcrReceiver_SelectionChanged(ucrChangedControl As ucrCore) Handles UcrReceiver.ControlContentsChanged If UcrReceiver.IsEmpty Then cmdDisplayObjects.Enabled = False Else cmdDisplayObjects.Enabled = True - End If - ucrBase.clsRsyntax.AddParameter("f", clsRFunctionParameter:=UcrReceiver.GetVariables()) - sdgOneVarCompareModels.SetModelFunction(ucrBase.clsRsyntax.clsBaseFunction) - TestOKEnabled() + End If + TestOKEnabled() + ' sdgOneVarCompareModels.SetModelFunction(ucrBase.clsRsyntax.clsBaseFunction) End Sub - Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click - sdgOneVarCompareModels.ShowDialog() - EnableOptions() - TestOKEnabled() - End Sub + Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click + ' sdgOneVarCompareModels.SetRFunction(ucrBase.clsRsyntax.clsBaseFunction, bResetSubdialog) + 'bResetSubdialog = False + 'sdgOneVarCompareModels.ShowDialog() - Private Sub EnableOptions() - If Not UcrReceiver.IsEmpty Then - cmdDisplayObjects.Enabled = True - Else - cmdDisplayObjects.Enabled = False - End If + ''TestOKEnabled() End Sub - Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk - sdgOneVarCompareModels.CreateGraphs() + Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk + ' sdgOneVarCompareModels.CreateGraphs() End Sub End Class \ No newline at end of file From c175997f07f4839547133a218452e95f4ad0c523 Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 10 Feb 2017 19:30:57 +0000 Subject: [PATCH 002/201] Update to code --- instat/dlgOneVarCompareModels.vb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index d619f2e18a0..8146c22fd12 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -35,8 +35,7 @@ Public Class dlgOneVarCompareModels ReopenDialog() TestOKEnabled() End Sub - - ' want: gofstat(f=InstatDataObject$get_models(model_name="dist1hjhj", data_name="Damango")) + Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 174 ucrBase.clsRsyntax.iCallType = 2 @@ -51,7 +50,7 @@ Public Class dlgOneVarCompareModels UcrReceiver.SetMeAsReceiver() - 'sdgOneVarCompareModels.InitialiseDialog() + ' sdgOneVarCompareModels.InitialiseDialog() ' sdgOneVarCompareModels.SetModelFunction(ucrBase.clsRsyntax.clsBaseFunction) ' sdgOneVarCompareModels.SetReceiver(UcrReceiver) ' sdgOneVarCompareModels.DisplayChiSquare() From d434113729460f51bb03b7cfe265ee1bedf24a9e Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 13 Feb 2017 10:08:14 +0000 Subject: [PATCH 003/201] Changed ucrReceiver name --- instat/dlgOneVarCompareModels.Designer.vb | 23 ++++++++++++----------- instat/dlgOneVarCompareModels.vb | 14 +++++++------- instat/sdgOneVarCompareModels.vb | 8 ++++---- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/instat/dlgOneVarCompareModels.Designer.vb b/instat/dlgOneVarCompareModels.Designer.vb index 504d63bafd9..da02bbb6906 100644 --- a/instat/dlgOneVarCompareModels.Designer.vb +++ b/instat/dlgOneVarCompareModels.Designer.vb @@ -23,7 +23,7 @@ Partial Class dlgOneVarCompareModels _ Private Sub InitializeComponent() Me.ucrBase = New instat.ucrButtons() - Me.UcrReceiver = New instat.ucrReceiverMultiple() + Me.UcrReceiverCompareModels = New instat.ucrReceiverMultiple() Me.ucrSelectorOneVarCompModels = New instat.ucrSelectorByDataFrameAddRemove() Me.cmdDisplayObjects = New System.Windows.Forms.Button() Me.lblReceiver = New System.Windows.Forms.Label() @@ -36,14 +36,15 @@ Partial Class dlgOneVarCompareModels Me.ucrBase.Size = New System.Drawing.Size(410, 52) Me.ucrBase.TabIndex = 4 ' - 'UcrReceiver + 'UcrReceiverCompareModels ' - Me.UcrReceiver.Location = New System.Drawing.Point(251, 60) - Me.UcrReceiver.Margin = New System.Windows.Forms.Padding(0) - Me.UcrReceiver.Name = "UcrReceiver" - Me.UcrReceiver.Selector = Nothing - Me.UcrReceiver.Size = New System.Drawing.Size(120, 100) - Me.UcrReceiver.TabIndex = 2 + Me.UcrReceiverCompareModels.frmParent = Me + Me.UcrReceiverCompareModels.Location = New System.Drawing.Point(251, 60) + Me.UcrReceiverCompareModels.Margin = New System.Windows.Forms.Padding(0) + Me.UcrReceiverCompareModels.Name = "UcrReceiverCompareModels" + Me.UcrReceiverCompareModels.Selector = Nothing + Me.UcrReceiverCompareModels.Size = New System.Drawing.Size(120, 100) + Me.UcrReceiverCompareModels.TabIndex = 2 ' 'ucrSelectorOneVarCompModels ' @@ -67,7 +68,7 @@ Partial Class dlgOneVarCompareModels 'lblReceiver ' Me.lblReceiver.AutoSize = True - Me.lblReceiver.Location = New System.Drawing.Point(250, 44) + Me.lblReceiver.Location = New System.Drawing.Point(250, 45) Me.lblReceiver.Name = "lblReceiver" Me.lblReceiver.Size = New System.Drawing.Size(97, 13) Me.lblReceiver.TabIndex = 1 @@ -81,7 +82,7 @@ Partial Class dlgOneVarCompareModels Me.Controls.Add(Me.lblReceiver) Me.Controls.Add(Me.cmdDisplayObjects) Me.Controls.Add(Me.ucrSelectorOneVarCompModels) - Me.Controls.Add(Me.UcrReceiver) + Me.Controls.Add(Me.UcrReceiverCompareModels) Me.Controls.Add(Me.ucrBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False @@ -95,7 +96,7 @@ Partial Class dlgOneVarCompareModels End Sub Friend WithEvents ucrBase As ucrButtons - Friend WithEvents UcrReceiver As ucrReceiverMultiple + Friend WithEvents UcrReceiverCompareModels As ucrReceiverMultiple Friend WithEvents ucrSelectorOneVarCompModels As ucrSelectorByDataFrameAddRemove Friend WithEvents cmdDisplayObjects As Button Friend WithEvents lblReceiver As Label diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 8146c22fd12..7b578823184 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -44,10 +44,10 @@ Public Class dlgOneVarCompareModels ucrSelectorOneVarCompModels.SetItemType("model") 'ucrReceiver - UcrReceiver.SetParameter(New RParameter("f", 0)) - UcrReceiver.SetParameterIsRFunction() - UcrReceiver.Selector = ucrSelectorOneVarCompModels - UcrReceiver.SetMeAsReceiver() + UcrReceiverCompareModels.SetParameter(New RParameter("f", 0)) + UcrReceiverCompareModels.SetParameterIsRFunction() + UcrReceiverCompareModels.Selector = ucrSelectorOneVarCompModels + UcrReceiverCompareModels.SetMeAsReceiver() ' sdgOneVarCompareModels.InitialiseDialog() @@ -75,7 +75,7 @@ Public Class dlgOneVarCompareModels End Sub Public Sub TestOKEnabled() - If Not UcrReceiver.IsEmpty Then 'sdgOneVarCompareModels.TestOkEnabled() AndAlso Not Then + If Not UcrReceiverCompareModels.IsEmpty Then 'sdgOneVarCompareModels.TestOkEnabled() AndAlso Not Then ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) @@ -96,8 +96,8 @@ Public Class dlgOneVarCompareModels ' sdgOneVarCompareModels.DisplayChiSquare() End Sub - Private Sub UcrReceiver_SelectionChanged(ucrChangedControl As ucrCore) Handles UcrReceiver.ControlContentsChanged - If UcrReceiver.IsEmpty Then + Private Sub UcrReceiver_SelectionChanged(ucrChangedControl As ucrCore) Handles UcrReceiverCompareModels.ControlContentsChanged + If UcrReceiverCompareModels.IsEmpty Then cmdDisplayObjects.Enabled = False Else cmdDisplayObjects.Enabled = True diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index b49a14e8d09..72338af4b2a 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -101,19 +101,19 @@ Public Class sdgOneVarCompareModels Dim strTemp As String = "" If chkCDF.Checked Then - clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiver.GetVariables()) + clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 2) End If If chkPP.Checked Then - clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiver.GetVariables()) + clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 2) End If If chkQQ.Checked Then - clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiver.GetVariables()) + clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 2) End If If chkDensity.Checked Then - clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiver.GetVariables()) + clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 2) End If If chkSaveChi.Checked Then From 7f6a9ebae6b274d0fe9ffbff042160a9879c5e5b Mon Sep 17 00:00:00 2001 From: lilyclements Date: Wed, 15 Feb 2017 09:24:59 +0000 Subject: [PATCH 004/201] Update dlgOneVarCompareModels.vb --- instat/dlgOneVarCompareModels.vb | 124 +++++++++++++++---------------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 7b578823184..3208dac0a81 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -1,27 +1,27 @@ -' Instat-R -' Copyright (C) 2015 -' -' 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 k -' along with this program. If not, see . - -Imports instat.Translations - +' Instat-R +' Copyright (C) 2015 +' +' 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 k +' along with this program. If not, see . + +Imports instat.Translations + Public Class dlgOneVarCompareModels Private bFirstLoad As Boolean = True Private bReset As Boolean = True 'Private bResetSubdialog As Boolean = False - - Private Sub dlgOneVarCompareModels_Load(sender As Object, e As EventArgs) Handles MyBase.Load + + Private Sub dlgOneVarCompareModels_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) If bFirstLoad Then InitialiseDialog() @@ -34,7 +34,7 @@ Public Class dlgOneVarCompareModels bReset = False ReopenDialog() TestOKEnabled() - End Sub + End Sub Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 174 @@ -46,7 +46,7 @@ Public Class dlgOneVarCompareModels 'ucrReceiver UcrReceiverCompareModels.SetParameter(New RParameter("f", 0)) UcrReceiverCompareModels.SetParameterIsRFunction() - UcrReceiverCompareModels.Selector = ucrSelectorOneVarCompModels + UcrReceiverCompareModels.Selector = ucrSelectorOneVarCompModels UcrReceiverCompareModels.SetMeAsReceiver() @@ -55,8 +55,8 @@ Public Class dlgOneVarCompareModels ' sdgOneVarCompareModels.SetReceiver(UcrReceiver) ' sdgOneVarCompareModels.DisplayChiSquare() ' sdgOneVarCompareModels.DisplayChiBreaks() - End Sub - + End Sub + Private Sub SetDefaults() Dim clsDefaultFunction As New RFunction ucrSelectorOneVarCompModels.Reset() @@ -64,57 +64,57 @@ Public Class dlgOneVarCompareModels clsDefaultFunction.SetRCommand("gofstat") ucrBase.clsRsyntax.SetBaseRFunction(clsDefaultFunction.Clone()) ' bResetSubdialog = True - End Sub - - 'Only distributions that can be accepted into the receiver have to be from the same variable - ' If variable from variablex is selected then - ' variables not fromvariablex cannot be in dataframe - - Private Sub ReopenDialog() - sdgOneVarCompareModels.Reopen() - End Sub - - Public Sub TestOKEnabled() + End Sub + + 'Only distributions that can be accepted into the receiver have to be from the same variable + ' If variable from variablex is selected then + ' variables not fromvariablex cannot be in dataframe + + Private Sub ReopenDialog() + sdgOneVarCompareModels.Reopen() + End Sub + + Public Sub TestOKEnabled() If Not UcrReceiverCompareModels.IsEmpty Then 'sdgOneVarCompareModels.TestOkEnabled() AndAlso Not Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If - End Sub - - Public Sub SetRCodeForControls(bReset As Boolean) + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If + End Sub + + Private Sub SetRCodeForControls(bReset As Boolean) SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) - End Sub - + End Sub + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() SetRCodeForControls(True) TestOKEnabled() - End Sub - + End Sub + Private Sub ucrSelectorOneVarCompModels_DataFrameChanged() Handles ucrSelectorOneVarCompModels.DataFrameChanged ' sdgOneVarCompareModels.DisplayChiSquare() - End Sub - - Private Sub UcrReceiver_SelectionChanged(ucrChangedControl As ucrCore) Handles UcrReceiverCompareModels.ControlContentsChanged - If UcrReceiverCompareModels.IsEmpty Then - cmdDisplayObjects.Enabled = False - Else - cmdDisplayObjects.Enabled = True + End Sub + + Private Sub UcrReceiver_SelectionChanged(ucrChangedControl As ucrCore) Handles UcrReceiverCompareModels.ControlContentsChanged + If UcrReceiverCompareModels.IsEmpty Then + cmdDisplayObjects.Enabled = False + Else + cmdDisplayObjects.Enabled = True End If TestOKEnabled() ' sdgOneVarCompareModels.SetModelFunction(ucrBase.clsRsyntax.clsBaseFunction) - End Sub - + End Sub + Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click ' sdgOneVarCompareModels.SetRFunction(ucrBase.clsRsyntax.clsBaseFunction, bResetSubdialog) 'bResetSubdialog = False - 'sdgOneVarCompareModels.ShowDialog() - - ''TestOKEnabled() - End Sub - + 'sdgOneVarCompareModels.ShowDialog() + + ''TestOKEnabled() + End Sub + Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk ' sdgOneVarCompareModels.CreateGraphs() - End Sub -End Class \ No newline at end of file + End Sub +End Class From 2edadd736de01f1d7ab02549f1b72a7302f5c426 Mon Sep 17 00:00:00 2001 From: Lily Date: Wed, 12 Apr 2017 15:07:37 +0100 Subject: [PATCH 005/201] Moving sdg options in --- instat/sdgOneVarCompareModels.Designer.vb | 413 ++++++++++------------ instat/sdgOneVarCompareModels.vb | 359 ++++++++++--------- 2 files changed, 381 insertions(+), 391 deletions(-) diff --git a/instat/sdgOneVarCompareModels.Designer.vb b/instat/sdgOneVarCompareModels.Designer.vb index f5228afd451..ab8a08a336d 100644 --- a/instat/sdgOneVarCompareModels.Designer.vb +++ b/instat/sdgOneVarCompareModels.Designer.vb @@ -1,232 +1,181 @@ - -Partial Class sdgOneVarCompareModels - 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.ucrSubBase = New instat.ucrButtonsSubdialogue() - Me.chkSaveObjects = New System.Windows.Forms.CheckBox() - Me.chkSaveChi = New System.Windows.Forms.CheckBox() - Me.chkInputBreakpoints = New System.Windows.Forms.CheckBox() - Me.lblGoF = New System.Windows.Forms.Label() - Me.TabControl1 = New System.Windows.Forms.TabControl() - Me.TabPage1 = New System.Windows.Forms.TabPage() - Me.ucrDisplayChiData = New instat.ucrInputTextBox() - Me.ucrObjectName = New instat.ucrInputTextBox() - Me.TabPage2 = New System.Windows.Forms.TabPage() - Me.ucrSavePlots = New instat.ucrSaveGraph() - Me.chkQQ = New System.Windows.Forms.CheckBox() - Me.chkCDF = New System.Windows.Forms.CheckBox() - Me.chkPP = New System.Windows.Forms.CheckBox() - Me.chkDensity = New System.Windows.Forms.CheckBox() - Me.TabControl1.SuspendLayout() - Me.TabPage1.SuspendLayout() - Me.TabPage2.SuspendLayout() - Me.SuspendLayout() - ' - 'ucrSubBase - ' - Me.ucrSubBase.Location = New System.Drawing.Point(14, 168) - Me.ucrSubBase.Name = "ucrSubBase" - Me.ucrSubBase.Size = New System.Drawing.Size(142, 30) - Me.ucrSubBase.TabIndex = 1 - ' - 'chkSaveObjects - ' - Me.chkSaveObjects.AutoSize = True - Me.chkSaveObjects.Location = New System.Drawing.Point(6, 29) - Me.chkSaveObjects.Name = "chkSaveObjects" - Me.chkSaveObjects.Size = New System.Drawing.Size(85, 17) - Me.chkSaveObjects.TabIndex = 1 - Me.chkSaveObjects.Text = "Save Object" - Me.chkSaveObjects.UseVisualStyleBackColor = True - ' - 'chkSaveChi - ' - Me.chkSaveChi.AutoSize = True - Me.chkSaveChi.Location = New System.Drawing.Point(6, 52) - Me.chkSaveChi.Name = "chkSaveChi" - Me.chkSaveChi.Size = New System.Drawing.Size(115, 17) - Me.chkSaveChi.TabIndex = 3 - Me.chkSaveChi.Text = "Display Chi-Square" - Me.chkSaveChi.UseVisualStyleBackColor = True - ' - 'chkInputBreakpoints - ' - Me.chkInputBreakpoints.AutoSize = True - Me.chkInputBreakpoints.Location = New System.Drawing.Point(6, 75) - Me.chkInputBreakpoints.Name = "chkInputBreakpoints" - Me.chkInputBreakpoints.Size = New System.Drawing.Size(164, 17) - Me.chkInputBreakpoints.TabIndex = 5 - Me.chkInputBreakpoints.Text = "Input Chi-Square Breakpoints" - Me.chkInputBreakpoints.UseVisualStyleBackColor = True - ' - 'lblGoF - ' - Me.lblGoF.AutoSize = True - Me.lblGoF.Location = New System.Drawing.Point(6, 10) - Me.lblGoF.Name = "lblGoF" - Me.lblGoF.Size = New System.Drawing.Size(126, 13) - Me.lblGoF.TabIndex = 0 - Me.lblGoF.Text = "Goodness of Fit Statistics" - ' - 'TabControl1 - ' - Me.TabControl1.Controls.Add(Me.TabPage1) - Me.TabControl1.Controls.Add(Me.TabPage2) - Me.TabControl1.Location = New System.Drawing.Point(10, 10) - Me.TabControl1.Name = "TabControl1" - Me.TabControl1.SelectedIndex = 0 - Me.TabControl1.Size = New System.Drawing.Size(299, 152) - Me.TabControl1.TabIndex = 0 - ' - 'TabPage1 - ' - Me.TabPage1.Controls.Add(Me.ucrDisplayChiData) - Me.TabPage1.Controls.Add(Me.ucrObjectName) - Me.TabPage1.Controls.Add(Me.chkSaveObjects) - Me.TabPage1.Controls.Add(Me.lblGoF) - Me.TabPage1.Controls.Add(Me.chkSaveChi) - Me.TabPage1.Controls.Add(Me.chkInputBreakpoints) - Me.TabPage1.Location = New System.Drawing.Point(4, 22) - Me.TabPage1.Name = "TabPage1" - Me.TabPage1.Padding = New System.Windows.Forms.Padding(3) - Me.TabPage1.Size = New System.Drawing.Size(291, 126) - Me.TabPage1.TabIndex = 0 - Me.TabPage1.Text = "Fit" - Me.TabPage1.UseVisualStyleBackColor = True - ' - 'ucrDisplayChiData - ' - Me.ucrDisplayChiData.IsReadOnly = False - Me.ucrDisplayChiData.Location = New System.Drawing.Point(129, 51) - Me.ucrDisplayChiData.Name = "ucrDisplayChiData" - Me.ucrDisplayChiData.Size = New System.Drawing.Size(139, 21) - Me.ucrDisplayChiData.TabIndex = 4 - ' - 'ucrObjectName - ' - Me.ucrObjectName.IsReadOnly = False - Me.ucrObjectName.Location = New System.Drawing.Point(129, 27) - Me.ucrObjectName.Name = "ucrObjectName" - Me.ucrObjectName.Size = New System.Drawing.Size(139, 21) - Me.ucrObjectName.TabIndex = 2 - ' - 'TabPage2 - ' - Me.TabPage2.Controls.Add(Me.ucrSavePlots) - Me.TabPage2.Controls.Add(Me.chkQQ) - Me.TabPage2.Controls.Add(Me.chkCDF) - Me.TabPage2.Controls.Add(Me.chkPP) - Me.TabPage2.Controls.Add(Me.chkDensity) - Me.TabPage2.Location = New System.Drawing.Point(4, 22) - Me.TabPage2.Name = "TabPage2" - Me.TabPage2.Padding = New System.Windows.Forms.Padding(3) - Me.TabPage2.Size = New System.Drawing.Size(291, 126) - Me.TabPage2.TabIndex = 1 - Me.TabPage2.Text = "Plot" - Me.TabPage2.UseVisualStyleBackColor = True - ' - 'ucrSavePlots - ' - Me.ucrSavePlots.Location = New System.Drawing.Point(6, 95) - Me.ucrSavePlots.Name = "ucrSavePlots" - Me.ucrSavePlots.Size = New System.Drawing.Size(265, 22) - Me.ucrSavePlots.TabIndex = 4 - ' - 'chkQQ - ' - Me.chkQQ.AutoSize = True - Me.chkQQ.Location = New System.Drawing.Point(6, 75) - Me.chkQQ.Name = "chkQQ" - Me.chkQQ.Size = New System.Drawing.Size(42, 17) - Me.chkQQ.TabIndex = 3 - Me.chkQQ.Text = "QQ" - Me.chkQQ.UseVisualStyleBackColor = True - ' - 'chkCDF - ' - Me.chkCDF.AutoSize = True - Me.chkCDF.Location = New System.Drawing.Point(6, 6) - Me.chkCDF.Name = "chkCDF" - Me.chkCDF.Size = New System.Drawing.Size(47, 17) - Me.chkCDF.TabIndex = 0 - Me.chkCDF.Text = "CDF" - Me.chkCDF.UseVisualStyleBackColor = True - ' - 'chkPP - ' - Me.chkPP.AutoSize = True - Me.chkPP.Location = New System.Drawing.Point(6, 52) - Me.chkPP.Name = "chkPP" - Me.chkPP.Size = New System.Drawing.Size(40, 17) - Me.chkPP.TabIndex = 2 - Me.chkPP.Text = "PP" - Me.chkPP.UseVisualStyleBackColor = True - ' - 'chkDensity - ' - Me.chkDensity.AutoSize = True - Me.chkDensity.Location = New System.Drawing.Point(6, 29) - Me.chkDensity.Name = "chkDensity" - Me.chkDensity.Size = New System.Drawing.Size(61, 17) - Me.chkDensity.TabIndex = 1 - Me.chkDensity.Text = "Density" - Me.chkDensity.UseVisualStyleBackColor = True - ' - 'sdgOneVarCompareModels - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(321, 200) - Me.Controls.Add(Me.ucrSubBase) - Me.Controls.Add(Me.TabControl1) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "sdgOneVarCompareModels" - Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent - Me.Text = "Display Options" - Me.TabControl1.ResumeLayout(False) - Me.TabPage1.ResumeLayout(False) - Me.TabPage1.PerformLayout() - Me.TabPage2.ResumeLayout(False) - Me.TabPage2.PerformLayout() - Me.ResumeLayout(False) - - End Sub - - Friend WithEvents ucrSubBase As ucrButtonsSubdialogue - Friend WithEvents chkSaveObjects As CheckBox - Friend WithEvents chkSaveChi As CheckBox - Friend WithEvents chkInputBreakpoints As CheckBox - Friend WithEvents lblGoF As Label - Friend WithEvents TabControl1 As TabControl - Friend WithEvents TabPage1 As TabPage - Friend WithEvents TabPage2 As TabPage - Friend WithEvents chkCDF As CheckBox - Friend WithEvents chkDensity As CheckBox - Friend WithEvents chkPP As CheckBox - Friend WithEvents chkQQ As CheckBox - Friend WithEvents ucrObjectName As ucrInputTextBox - Friend WithEvents ucrSavePlots As ucrSaveGraph - Friend WithEvents ucrDisplayChiData As ucrInputTextBox -End Class + +Partial Class sdgOneVarCompareModels + 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.ucrSubBase = New instat.ucrButtonsSubdialogue() + Me.chkSaveChi = New System.Windows.Forms.CheckBox() + Me.ucrDisplayChiData = New instat.ucrInputTextBox() + Me.grpFitModel = New System.Windows.Forms.GroupBox() + Me.ucrSaveGOF = New instat.ucrSave() + Me.ucrChkInputChiSquareBreakpoints = New instat.ucrCheck() + Me.grpPlot = New System.Windows.Forms.GroupBox() + Me.ucrChkCDF = New instat.ucrCheck() + Me.ucrChkDensity = New instat.ucrCheck() + Me.ucrChkPP = New instat.ucrCheck() + Me.ucrChkQQ = New instat.ucrCheck() + Me.ucrSavePlots = New instat.ucrSave() + Me.grpFitModel.SuspendLayout() + Me.grpPlot.SuspendLayout() + Me.SuspendLayout() + ' + 'ucrSubBase + ' + Me.ucrSubBase.Location = New System.Drawing.Point(89, 276) + Me.ucrSubBase.Name = "ucrSubBase" + Me.ucrSubBase.Size = New System.Drawing.Size(142, 30) + Me.ucrSubBase.TabIndex = 2 + ' + 'chkSaveChi + ' + Me.chkSaveChi.AutoSize = True + Me.chkSaveChi.Location = New System.Drawing.Point(6, 44) + Me.chkSaveChi.Name = "chkSaveChi" + Me.chkSaveChi.Size = New System.Drawing.Size(115, 17) + Me.chkSaveChi.TabIndex = 1 + Me.chkSaveChi.Text = "Display Chi-Square" + Me.chkSaveChi.UseVisualStyleBackColor = True + ' + 'ucrDisplayChiData + ' + Me.ucrDisplayChiData.IsMultiline = False + Me.ucrDisplayChiData.IsReadOnly = False + Me.ucrDisplayChiData.Location = New System.Drawing.Point(127, 42) + Me.ucrDisplayChiData.Name = "ucrDisplayChiData" + Me.ucrDisplayChiData.Size = New System.Drawing.Size(139, 21) + Me.ucrDisplayChiData.TabIndex = 2 + ' + 'grpFitModel + ' + Me.grpFitModel.Controls.Add(Me.ucrDisplayChiData) + Me.grpFitModel.Controls.Add(Me.ucrSaveGOF) + Me.grpFitModel.Controls.Add(Me.chkSaveChi) + Me.grpFitModel.Controls.Add(Me.ucrChkInputChiSquareBreakpoints) + Me.grpFitModel.Location = New System.Drawing.Point(12, 12) + Me.grpFitModel.Name = "grpFitModel" + Me.grpFitModel.Size = New System.Drawing.Size(273, 100) + Me.grpFitModel.TabIndex = 0 + Me.grpFitModel.TabStop = False + Me.grpFitModel.Text = "Goodness of Fit" + ' + 'ucrSaveGOF + ' + Me.ucrSaveGOF.Location = New System.Drawing.Point(6, 19) + Me.ucrSaveGOF.Name = "ucrSaveGOF" + Me.ucrSaveGOF.Size = New System.Drawing.Size(260, 24) + Me.ucrSaveGOF.TabIndex = 0 + ' + 'ucrChkInputChiSquareBreakpoints + ' + Me.ucrChkInputChiSquareBreakpoints.Checked = False + Me.ucrChkInputChiSquareBreakpoints.Location = New System.Drawing.Point(6, 69) + Me.ucrChkInputChiSquareBreakpoints.Name = "ucrChkInputChiSquareBreakpoints" + Me.ucrChkInputChiSquareBreakpoints.Size = New System.Drawing.Size(229, 20) + Me.ucrChkInputChiSquareBreakpoints.TabIndex = 3 + ' + 'grpPlot + ' + Me.grpPlot.Controls.Add(Me.ucrSavePlots) + Me.grpPlot.Controls.Add(Me.ucrChkQQ) + Me.grpPlot.Controls.Add(Me.ucrChkPP) + Me.grpPlot.Controls.Add(Me.ucrChkDensity) + Me.grpPlot.Controls.Add(Me.ucrChkCDF) + Me.grpPlot.Location = New System.Drawing.Point(12, 118) + Me.grpPlot.Name = "grpPlot" + Me.grpPlot.Size = New System.Drawing.Size(273, 152) + Me.grpPlot.TabIndex = 1 + Me.grpPlot.TabStop = False + Me.grpPlot.Text = "Plot" + ' + 'ucrChkCDF + ' + Me.ucrChkCDF.Checked = False + Me.ucrChkCDF.Location = New System.Drawing.Point(6, 20) + Me.ucrChkCDF.Name = "ucrChkCDF" + Me.ucrChkCDF.Size = New System.Drawing.Size(100, 20) + Me.ucrChkCDF.TabIndex = 0 + ' + 'ucrChkDensity + ' + Me.ucrChkDensity.Checked = False + Me.ucrChkDensity.Location = New System.Drawing.Point(6, 46) + Me.ucrChkDensity.Name = "ucrChkDensity" + Me.ucrChkDensity.Size = New System.Drawing.Size(100, 20) + Me.ucrChkDensity.TabIndex = 1 + ' + 'ucrChkPP + ' + Me.ucrChkPP.Checked = False + Me.ucrChkPP.Location = New System.Drawing.Point(6, 72) + Me.ucrChkPP.Name = "ucrChkPP" + Me.ucrChkPP.Size = New System.Drawing.Size(100, 20) + Me.ucrChkPP.TabIndex = 2 + ' + 'ucrChkQQ + ' + Me.ucrChkQQ.Checked = False + Me.ucrChkQQ.Location = New System.Drawing.Point(6, 98) + Me.ucrChkQQ.Name = "ucrChkQQ" + Me.ucrChkQQ.Size = New System.Drawing.Size(100, 20) + Me.ucrChkQQ.TabIndex = 3 + ' + 'ucrSavePlots + ' + Me.ucrSavePlots.Location = New System.Drawing.Point(6, 122) + Me.ucrSavePlots.Name = "ucrSavePlots" + Me.ucrSavePlots.Size = New System.Drawing.Size(260, 24) + Me.ucrSavePlots.TabIndex = 4 + ' + 'sdgOneVarCompareModels + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(296, 318) + Me.Controls.Add(Me.grpPlot) + Me.Controls.Add(Me.grpFitModel) + Me.Controls.Add(Me.ucrSubBase) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "sdgOneVarCompareModels" + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent + Me.Text = "Display Options" + Me.grpFitModel.ResumeLayout(False) + Me.grpFitModel.PerformLayout() + Me.grpPlot.ResumeLayout(False) + Me.ResumeLayout(False) + + End Sub + + Friend WithEvents ucrSubBase As ucrButtonsSubdialogue + Friend WithEvents chkSaveChi As CheckBox + Friend WithEvents ucrDisplayChiData As ucrInputTextBox + Friend WithEvents grpFitModel As GroupBox + Friend WithEvents grpPlot As GroupBox + Friend WithEvents ucrChkInputChiSquareBreakpoints As ucrCheck + Friend WithEvents ucrChkCDF As ucrCheck + Friend WithEvents ucrChkDensity As ucrCheck + Friend WithEvents ucrChkPP As ucrCheck + Friend WithEvents ucrChkQQ As ucrCheck + Friend WithEvents ucrSaveGOF As ucrSave + Friend WithEvents ucrSavePlots As ucrSave +End Class \ No newline at end of file diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index 72338af4b2a..296d63ec92b 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -1,159 +1,200 @@ -' Instat-R -' Copyright (C) 2015 -' -' 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 k -' along with this program. If not, see . -Imports instat.Translations - -Public Class sdgOneVarCompareModels - Private clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRsyntax, clsOperation As New RFunction - Private clsOperatorforTable, clsOperatorForBreaks As New ROperator - Private WithEvents ucrRecs As ucrReceiver - Public bfirstload As Boolean = True - - Private Sub sdgOneVarCompareModels(sender As Object, e As EventArgs) Handles MyBase.Load - autoTranslate(Me) - End Sub - - Public Sub InitialiseDialog() - clsRcdfcompFunction.SetRCommand("cdfcomp") - clsRdenscompFunction.SetRCommand("denscomp") - clsRqqcompFunction.SetRCommand("qqcomp") - clsRppcompFunction.SetRCommand("ppcomp") - ucrDisplayChiData.SetValidationTypeAsRVariable() - End Sub - - Public Sub SetDefaults() - chkCDF.Checked = True - chkDensity.Checked = False - chkPP.Checked = False - chkQQ.Checked = False - chkSaveChi.Checked = True - chkSaveObjects.Checked = True - ucrSavePlots.chkSaveGraph.Checked = False - ucrSavePlots.Enabled = False ' disabled for now - ucrSavePlots.ucrInputGraphName.SetPrefix("plots") - ucrObjectName.SetValidationTypeAsRVariable() - ucrObjectName.SetName("gof") - ucrDisplayChiData.Reset() - If dlgOneVarCompareModels.ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text <> "" Then - ucrDisplayChiData.SetName(dlgOneVarCompareModels.ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_ChiSquare") - End If - DisplayChiSquare() - DisplayChiBreaks() - 'ucrBase.ihelptopicID = - End Sub - - Public Sub Reopen() - DisplayChiSquare() - End Sub - - Public Sub SetModelFunction(clsNewModel As RFunction) - clsModel = clsNewModel - End Sub - - Public Sub DisplayChiSquare() - If chkSaveChi.Checked Then - ucrDisplayChiData.Visible = True - clsOperatorforTable.SetOperation("$") - clsOperatorforTable.AddParameter(iPosition:=0, clsRFunctionParameter:=clsModel) - clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") - clsRAsDataFrame.SetRCommand("as.data.frame") - clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) - Else - ucrDisplayChiData.Visible = False - End If - If Not ucrDisplayChiData.IsEmpty Then - clsRAsDataFrame.SetAssignTo(ucrDisplayChiData.GetText(), strTempDataframe:=ucrDisplayChiData.GetText()) - Else - clsRAsDataFrame.RemoveAssignTo() - End If - End Sub - - Private Sub ucrDisplayChiData_NameChanged() Handles ucrDisplayChiData.NameChanged - DisplayChiSquare() - End Sub - - Public Sub SetReceiver(ucrNewReceiver As ucrReceiver) - ucrRecs = ucrNewReceiver - End Sub - - Private Sub chkSaveObjects_CheckedChanged(sender As Object, e As EventArgs) Handles chkSaveObjects.CheckedChanged - If Not chkSaveObjects.Checked Then - ucrObjectName.Visible = False - Else - ucrObjectName.Visible = True - End If - End Sub - - - Public Sub CreateGraphs() - Dim strTemp As String = "" - - If chkCDF.Checked Then - clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) - frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 2) - End If - If chkPP.Checked Then - clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) - frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 2) - End If - If chkQQ.Checked Then - clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) - frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 2) - End If - If chkDensity.Checked Then - clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) - frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 2) - End If - If chkSaveChi.Checked Then - frmMain.clsRLink.RunScript(clsOperatorforTable.ToScript(), 0) - clsRAsDataFrame.ToScript(strTemp) - frmMain.clsRLink.RunScript(strTemp, 0) - End If - If chkInputBreakpoints.Checked Then - frmMain.clsRLink.RunScript(clsOperatorForBreaks.ToScript(), 2) - End If - End Sub - - Private Sub chkInputBreakpoints_Checked_Changed(sender As Object, e As EventArgs) Handles chkInputBreakpoints.CheckedChanged - DisplayChiBreaks() - End Sub - - Public Sub DisplayChiBreaks() - If chkInputBreakpoints.Checked Then - clsOperatorForBreaks.SetOperation("$") - clsOperatorForBreaks.AddParameter(iPosition:=0, clsRFunctionParameter:=clsModel) - clsOperatorForBreaks.AddParameter(strParameterValue:="chisqbreaks") - End If - End Sub - - Private Sub chkSaveChi_CheckedChanged(sender As Object, e As EventArgs) Handles chkSaveChi.CheckedChanged - DisplayChiSquare() - End Sub - - ' Private Sub ucrSavePlots_NameChanged() Handles ucrSavePlots.Click - 'TODO Graph Names assigned go up in increments for any of the graphs selected (e.g. 3 plots are selected and it is named "plots", then automatically we get "plots1", ... , "plots3" - 'End Sub - - Public Function TestOkEnabled() As Boolean - Dim bOkEnabled As Boolean - If (chkSaveObjects.Checked AndAlso Not ucrObjectName.IsEmpty OrElse Not chkSaveObjects.Checked) AndAlso (chkSaveChi.Checked AndAlso Not ucrDisplayChiData.IsEmpty OrElse Not chkSaveChi.Checked) Then - bOkEnabled = True - Else - bOkEnabled = False - End If - Return bOkEnabled - End Function - -End Class \ No newline at end of file +' Instat-R +' Copyright (C) 2015 +' +' 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 k +' along with this program. If not, see . +Imports instat.Translations + +Public Class sdgOneVarCompareModels + Private clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRsyntax, clsOperation As New RFunction + Private clsOperatorforTable, clsOperatorForBreaks As New ROperator + Private WithEvents ucrRecs As ucrReceiver + Public bfirstload As Boolean = True + + Private Sub sdgOneVarCompareModels(sender As Object, e As EventArgs) Handles MyBase.Load + autoTranslate(Me) + End Sub + + Public Sub InitialiseControls() + 'ucrSaveGOF + ucrSaveGOF.SetName("GOF") + ucrSaveGOF.SetSaveTypeAsModel() ' or graph? + ucrSaveGOF.SetCheckBoxText("Save Fit") + ucrSaveGOF.SetIsComboBox() + ucrSaveGOF.SetAssignToIfUncheckedValue("last_model") + + 'ucrInputChiSquareBreaks + ucrChkInputChiSquareBreakpoints.SetText("Input Chi-Square Breakpoints") + + 'ucrChkPlots + ucrChkCDF.SetText("CDF") + ucrChkDensity.SetText("Density") + ucrChkPP.SetText("PP") + ucrChkQQ.SetText("QQ") + + 'ucrSavePlot + ucrSavePlots.SetPrefix("plots") + ucrSavePlots.SetSaveTypeAsModel() + ucrSavePlots.SetCheckBoxText("Save Plot") + ucrSavePlots.SetIsComboBox() + ucrSavePlots.SetAssignToIfUncheckedValue("last_model") + End Sub + + + + Public Sub InitialiseDialog() + clsRcdfcompFunction.SetRCommand("cdfcomp") + clsRdenscompFunction.SetRCommand("denscomp") + clsRqqcompFunction.SetRCommand("qqcomp") + clsRppcompFunction.SetRCommand("ppcomp") + ucrDisplayChiData.SetValidationTypeAsRVariable() + End Sub + + Public Sub SetDefaults() + ucrChkCDF.Checked = True + ucrChkDensity.Checked = False + ucrChkPP.Checked = False + ucrChkQQ.Checked = False + chkSaveChi.Checked = True + ucrSavePlots.Enabled = False ' disabled for now + ucrDisplayChiData.Reset() + If dlgOneVarCompareModels.ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text <> "" Then + ucrDisplayChiData.SetName(dlgOneVarCompareModels.ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_ChiSquare") + End If + DisplayChiSquare() + DisplayChiBreaks() + 'ucrBase.ihelptopicID = + End Sub + + Public Sub Reopen() + DisplayChiSquare() + End Sub + + Public Sub SetModelFunction(clsNewModel As RFunction) + clsModel = clsNewModel + End Sub + + Public Sub DisplayChiSquare() + If chkSaveChi.Checked Then + ucrDisplayChiData.Visible = True + clsOperatorforTable.SetOperation("$") + clsOperatorforTable.AddParameter(iPosition:=0, clsRFunctionParameter:=clsModel) + clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") + clsRAsDataFrame.SetRCommand("as.data.frame") + clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) + Else + ucrDisplayChiData.Visible = False + End If + If Not ucrDisplayChiData.IsEmpty Then + clsRAsDataFrame.SetAssignTo(ucrDisplayChiData.GetText(), strTempDataframe:=ucrDisplayChiData.GetText()) + Else + clsRAsDataFrame.RemoveAssignTo() + End If + End Sub + + Private Sub ucrDisplayChiData_NameChanged() Handles ucrDisplayChiData.NameChanged + DisplayChiSquare() + End Sub + + Public Sub SetReceiver(ucrNewReceiver As ucrReceiver) + ucrRecs = ucrNewReceiver + End Sub + + Public Sub CreateGraphs() + Dim strTemp As String = "" + + If ucrChkCDF.Checked Then + clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) + frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 2) + End If + If ucrChkPP.Checked Then + clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) + frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 2) + End If + If ucrChkQQ.Checked Then + clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) + frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 2) + End If + If ucrChkDensity.Checked Then + clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) + frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 2) + End If + If chkSaveChi.Checked Then + frmMain.clsRLink.RunScript(clsOperatorforTable.ToScript(), 0) + clsRAsDataFrame.ToScript(strTemp) + frmMain.clsRLink.RunScript(strTemp, 0) + End If + If ucrChkInputChiSquareBreakpoints.Checked Then + frmMain.clsRLink.RunScript(clsOperatorForBreaks.ToScript(), 2) + End If + End Sub + + Private Sub chkInputBreakpoints_Checked_Changed(sender As Object, e As EventArgs) + DisplayChiBreaks() + End Sub + + Public Sub DisplayChiBreaks() + If ucrChkInputChiSquareBreakpoints.Checked Then + clsOperatorForBreaks.SetOperation("$") + clsOperatorForBreaks.AddParameter(iPosition:=0, clsRFunctionParameter:=clsModel) + clsOperatorForBreaks.AddParameter(strParameterValue:="chisqbreaks") + End If + End Sub + + Private Sub chkSaveChi_CheckedChanged(sender As Object, e As EventArgs) Handles chkSaveChi.CheckedChanged + DisplayChiSquare() + End Sub + + ' Private Sub ucrSavePlots_NameChanged() Handles ucrSavePlots.Click + 'TODO Graph Names assigned go up in increments for any of the graphs selected (e.g. 3 plots are selected and it is named "plots", then automatically we get "plots1", ... , "plots3" + 'End Sub + + Public Function TestOkEnabled() As Boolean + Dim bOkEnabled As Boolean + If (ucrSaveGOF.IsComplete()) AndAlso (chkSaveChi.Checked AndAlso Not ucrDisplayChiData.IsEmpty OrElse Not chkSaveChi.Checked) Then + bOkEnabled = True + Else + bOkEnabled = False + End If + Return bOkEnabled + End Function + +End Class + + +' if in main dialog: +' How does this change here? + +'Private clsCDF As New RFunction + +'Public Sub SetRCodeForControls(bReset As Boolean) +' ucrreceiverinDLG.SetRCode(clsCDF, bReset) +'End Sub + +'Private Sub SetDefaults() +'Dim clsCDFDefault As New RFunction +'ucrChkSetSeed.Checked = False +'clsCDFDefault.SetRCommand("cdfcomp") + +'clsCDF = clsCDFDefault.Clone +'End Sub + +' Private Sub InitialiseDialog() +'ucrReceiverinDLG.SetParameter(New RParameter ("ft")) +' End Sub + +'Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk' +'If ucrChkCDF.Checked Then +'frmMain.clsRLink.RunScript(clsCDF.ToScript, strComment:="") +'End If +'End Sub \ No newline at end of file From cff575dbdce95bd0c5419fe8a32208be6a6ad7ce Mon Sep 17 00:00:00 2001 From: Lily Date: Tue, 30 May 2017 16:45:52 +0100 Subject: [PATCH 006/201] edits --- instat/dlgOneVarCompareModels.Designer.vb | 32 ++++++------ instat/dlgOneVarCompareModels.vb | 27 +++++----- instat/sdgOneVarCompareModels.Designer.vb | 63 ++++++++++++----------- instat/sdgOneVarCompareModels.vb | 8 +-- 4 files changed, 66 insertions(+), 64 deletions(-) diff --git a/instat/dlgOneVarCompareModels.Designer.vb b/instat/dlgOneVarCompareModels.Designer.vb index da02bbb6906..23ad6fb4882 100644 --- a/instat/dlgOneVarCompareModels.Designer.vb +++ b/instat/dlgOneVarCompareModels.Designer.vb @@ -23,7 +23,7 @@ Partial Class dlgOneVarCompareModels _ Private Sub InitializeComponent() Me.ucrBase = New instat.ucrButtons() - Me.UcrReceiverCompareModels = New instat.ucrReceiverMultiple() + Me.ucrReceiverCompareModels = New instat.ucrReceiverMultiple() Me.ucrSelectorOneVarCompModels = New instat.ucrSelectorByDataFrameAddRemove() Me.cmdDisplayObjects = New System.Windows.Forms.Button() Me.lblReceiver = New System.Windows.Forms.Label() @@ -36,15 +36,17 @@ Partial Class dlgOneVarCompareModels Me.ucrBase.Size = New System.Drawing.Size(410, 52) Me.ucrBase.TabIndex = 4 ' - 'UcrReceiverCompareModels + 'ucrReceiverCompareModels ' - Me.UcrReceiverCompareModels.frmParent = Me - Me.UcrReceiverCompareModels.Location = New System.Drawing.Point(251, 60) - Me.UcrReceiverCompareModels.Margin = New System.Windows.Forms.Padding(0) - Me.UcrReceiverCompareModels.Name = "UcrReceiverCompareModels" - Me.UcrReceiverCompareModels.Selector = Nothing - Me.UcrReceiverCompareModels.Size = New System.Drawing.Size(120, 100) - Me.UcrReceiverCompareModels.TabIndex = 2 + Me.ucrReceiverCompareModels.frmParent = Me + Me.ucrReceiverCompareModels.Location = New System.Drawing.Point(250, 60) + Me.ucrReceiverCompareModels.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverCompareModels.Name = "ucrReceiverCompareModels" + Me.ucrReceiverCompareModels.Selector = Nothing + Me.ucrReceiverCompareModels.Size = New System.Drawing.Size(120, 100) + Me.ucrReceiverCompareModels.strNcFilePath = "" + Me.ucrReceiverCompareModels.TabIndex = 2 + Me.ucrReceiverCompareModels.ucrSelector = Nothing ' 'ucrSelectorOneVarCompModels ' @@ -58,11 +60,11 @@ Partial Class dlgOneVarCompareModels ' 'cmdDisplayObjects ' - Me.cmdDisplayObjects.Location = New System.Drawing.Point(280, 167) + Me.cmdDisplayObjects.Location = New System.Drawing.Point(307, 176) Me.cmdDisplayObjects.Name = "cmdDisplayObjects" - Me.cmdDisplayObjects.Size = New System.Drawing.Size(91, 23) + Me.cmdDisplayObjects.Size = New System.Drawing.Size(101, 23) Me.cmdDisplayObjects.TabIndex = 3 - Me.cmdDisplayObjects.Text = "Display Objects" + Me.cmdDisplayObjects.Text = "Display Objects..." Me.cmdDisplayObjects.UseVisualStyleBackColor = True ' 'lblReceiver @@ -78,11 +80,11 @@ Partial Class dlgOneVarCompareModels ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(426, 262) + Me.ClientSize = New System.Drawing.Size(417, 262) Me.Controls.Add(Me.lblReceiver) Me.Controls.Add(Me.cmdDisplayObjects) Me.Controls.Add(Me.ucrSelectorOneVarCompModels) - Me.Controls.Add(Me.UcrReceiverCompareModels) + Me.Controls.Add(Me.ucrReceiverCompareModels) Me.Controls.Add(Me.ucrBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False @@ -96,7 +98,7 @@ Partial Class dlgOneVarCompareModels End Sub Friend WithEvents ucrBase As ucrButtons - Friend WithEvents UcrReceiverCompareModels As ucrReceiverMultiple + Friend WithEvents ucrReceiverCompareModels As ucrReceiverMultiple Friend WithEvents ucrSelectorOneVarCompModels As ucrSelectorByDataFrameAddRemove Friend WithEvents cmdDisplayObjects As Button Friend WithEvents lblReceiver As Label diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 3208dac0a81..0710eb6b67b 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -44,11 +44,10 @@ Public Class dlgOneVarCompareModels ucrSelectorOneVarCompModels.SetItemType("model") 'ucrReceiver - UcrReceiverCompareModels.SetParameter(New RParameter("f", 0)) - UcrReceiverCompareModels.SetParameterIsRFunction() - UcrReceiverCompareModels.Selector = ucrSelectorOneVarCompModels - UcrReceiverCompareModels.SetMeAsReceiver() - + ucrReceiverCompareModels.SetParameter(New RParameter("f", 0)) + ucrReceiverCompareModels.SetParameterIsRFunction() + ucrReceiverCompareModels.Selector = ucrSelectorOneVarCompModels + ucrReceiverCompareModels.SetMeAsReceiver() ' sdgOneVarCompareModels.InitialiseDialog() ' sdgOneVarCompareModels.SetModelFunction(ucrBase.clsRsyntax.clsBaseFunction) @@ -70,34 +69,34 @@ Public Class dlgOneVarCompareModels ' If variable from variablex is selected then ' variables not fromvariablex cannot be in dataframe - Private Sub ReopenDialog() - sdgOneVarCompareModels.Reopen() + Private Sub SetRCodeForControls(bReset As Boolean) + SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) End Sub Public Sub TestOKEnabled() - If Not UcrReceiverCompareModels.IsEmpty Then 'sdgOneVarCompareModels.TestOkEnabled() AndAlso Not Then + If Not ucrReceiverCompareModels.IsEmpty Then 'sdgOneVarCompareModels.TestOkEnabled() AndAlso Not Then ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) End If End Sub - Private Sub SetRCodeForControls(bReset As Boolean) - SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) - End Sub - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() SetRCodeForControls(True) TestOKEnabled() End Sub + Private Sub ReopenDialog() + sdgOneVarCompareModels.Reopen() + End Sub + Private Sub ucrSelectorOneVarCompModels_DataFrameChanged() Handles ucrSelectorOneVarCompModels.DataFrameChanged ' sdgOneVarCompareModels.DisplayChiSquare() End Sub - Private Sub UcrReceiver_SelectionChanged(ucrChangedControl As ucrCore) Handles UcrReceiverCompareModels.ControlContentsChanged - If UcrReceiverCompareModels.IsEmpty Then + Private Sub ucrReceiver_SelectionChanged(ucrChangedControl As ucrCore) Handles ucrReceiverCompareModels.ControlContentsChanged + If ucrReceiverCompareModels.IsEmpty Then cmdDisplayObjects.Enabled = False Else cmdDisplayObjects.Enabled = True diff --git a/instat/sdgOneVarCompareModels.Designer.vb b/instat/sdgOneVarCompareModels.Designer.vb index ab8a08a336d..20e09b1e5a4 100644 --- a/instat/sdgOneVarCompareModels.Designer.vb +++ b/instat/sdgOneVarCompareModels.Designer.vb @@ -29,18 +29,18 @@ Partial Class sdgOneVarCompareModels Me.ucrSaveGOF = New instat.ucrSave() Me.ucrChkInputChiSquareBreakpoints = New instat.ucrCheck() Me.grpPlot = New System.Windows.Forms.GroupBox() - Me.ucrChkCDF = New instat.ucrCheck() - Me.ucrChkDensity = New instat.ucrCheck() - Me.ucrChkPP = New instat.ucrCheck() - Me.ucrChkQQ = New instat.ucrCheck() Me.ucrSavePlots = New instat.ucrSave() + Me.ucrChkQQ = New instat.ucrCheck() + Me.ucrChkPP = New instat.ucrCheck() + Me.ucrChkDensity = New instat.ucrCheck() + Me.ucrChkCDF = New instat.ucrCheck() Me.grpFitModel.SuspendLayout() Me.grpPlot.SuspendLayout() Me.SuspendLayout() ' 'ucrSubBase ' - Me.ucrSubBase.Location = New System.Drawing.Point(89, 276) + Me.ucrSubBase.Location = New System.Drawing.Point(73, 274) Me.ucrSubBase.Name = "ucrSubBase" Me.ucrSubBase.Size = New System.Drawing.Size(142, 30) Me.ucrSubBase.TabIndex = 2 @@ -57,6 +57,7 @@ Partial Class sdgOneVarCompareModels ' 'ucrDisplayChiData ' + Me.ucrDisplayChiData.AddQuotesIfUnrecognised = True Me.ucrDisplayChiData.IsMultiline = False Me.ucrDisplayChiData.IsReadOnly = False Me.ucrDisplayChiData.Location = New System.Drawing.Point(127, 42) @@ -70,7 +71,7 @@ Partial Class sdgOneVarCompareModels Me.grpFitModel.Controls.Add(Me.ucrSaveGOF) Me.grpFitModel.Controls.Add(Me.chkSaveChi) Me.grpFitModel.Controls.Add(Me.ucrChkInputChiSquareBreakpoints) - Me.grpFitModel.Location = New System.Drawing.Point(12, 12) + Me.grpFitModel.Location = New System.Drawing.Point(10, 10) Me.grpFitModel.Name = "grpFitModel" Me.grpFitModel.Size = New System.Drawing.Size(273, 100) Me.grpFitModel.TabIndex = 0 @@ -99,28 +100,27 @@ Partial Class sdgOneVarCompareModels Me.grpPlot.Controls.Add(Me.ucrChkPP) Me.grpPlot.Controls.Add(Me.ucrChkDensity) Me.grpPlot.Controls.Add(Me.ucrChkCDF) - Me.grpPlot.Location = New System.Drawing.Point(12, 118) + Me.grpPlot.Location = New System.Drawing.Point(10, 116) Me.grpPlot.Name = "grpPlot" Me.grpPlot.Size = New System.Drawing.Size(273, 152) Me.grpPlot.TabIndex = 1 Me.grpPlot.TabStop = False Me.grpPlot.Text = "Plot" ' - 'ucrChkCDF + 'ucrSavePlots ' - Me.ucrChkCDF.Checked = False - Me.ucrChkCDF.Location = New System.Drawing.Point(6, 20) - Me.ucrChkCDF.Name = "ucrChkCDF" - Me.ucrChkCDF.Size = New System.Drawing.Size(100, 20) - Me.ucrChkCDF.TabIndex = 0 + Me.ucrSavePlots.Location = New System.Drawing.Point(6, 122) + Me.ucrSavePlots.Name = "ucrSavePlots" + Me.ucrSavePlots.Size = New System.Drawing.Size(260, 24) + Me.ucrSavePlots.TabIndex = 4 ' - 'ucrChkDensity + 'ucrChkQQ ' - Me.ucrChkDensity.Checked = False - Me.ucrChkDensity.Location = New System.Drawing.Point(6, 46) - Me.ucrChkDensity.Name = "ucrChkDensity" - Me.ucrChkDensity.Size = New System.Drawing.Size(100, 20) - Me.ucrChkDensity.TabIndex = 1 + Me.ucrChkQQ.Checked = False + Me.ucrChkQQ.Location = New System.Drawing.Point(6, 98) + Me.ucrChkQQ.Name = "ucrChkQQ" + Me.ucrChkQQ.Size = New System.Drawing.Size(100, 20) + Me.ucrChkQQ.TabIndex = 3 ' 'ucrChkPP ' @@ -130,26 +130,27 @@ Partial Class sdgOneVarCompareModels Me.ucrChkPP.Size = New System.Drawing.Size(100, 20) Me.ucrChkPP.TabIndex = 2 ' - 'ucrChkQQ + 'ucrChkDensity ' - Me.ucrChkQQ.Checked = False - Me.ucrChkQQ.Location = New System.Drawing.Point(6, 98) - Me.ucrChkQQ.Name = "ucrChkQQ" - Me.ucrChkQQ.Size = New System.Drawing.Size(100, 20) - Me.ucrChkQQ.TabIndex = 3 + Me.ucrChkDensity.Checked = False + Me.ucrChkDensity.Location = New System.Drawing.Point(6, 46) + Me.ucrChkDensity.Name = "ucrChkDensity" + Me.ucrChkDensity.Size = New System.Drawing.Size(100, 20) + Me.ucrChkDensity.TabIndex = 1 ' - 'ucrSavePlots + 'ucrChkCDF ' - Me.ucrSavePlots.Location = New System.Drawing.Point(6, 122) - Me.ucrSavePlots.Name = "ucrSavePlots" - Me.ucrSavePlots.Size = New System.Drawing.Size(260, 24) - Me.ucrSavePlots.TabIndex = 4 + Me.ucrChkCDF.Checked = False + Me.ucrChkCDF.Location = New System.Drawing.Point(6, 20) + Me.ucrChkCDF.Name = "ucrChkCDF" + Me.ucrChkCDF.Size = New System.Drawing.Size(100, 20) + Me.ucrChkCDF.TabIndex = 0 ' 'sdgOneVarCompareModels ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(296, 318) + Me.ClientSize = New System.Drawing.Size(294, 312) Me.Controls.Add(Me.grpPlot) Me.Controls.Add(Me.grpFitModel) Me.Controls.Add(Me.ucrSubBase) diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index 296d63ec92b..cc60d723676 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -114,19 +114,19 @@ Public Class sdgOneVarCompareModels Dim strTemp As String = "" If ucrChkCDF.Checked Then - clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) + clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.ucrReceiverCompareModels.GetVariables()) frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 2) End If If ucrChkPP.Checked Then - clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) + clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.ucrReceiverCompareModels.GetVariables()) frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 2) End If If ucrChkQQ.Checked Then - clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) + clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.ucrReceiverCompareModels.GetVariables()) frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 2) End If If ucrChkDensity.Checked Then - clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiverCompareModels.GetVariables()) + clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.ucrReceiverCompareModels.GetVariables()) frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 2) End If If chkSaveChi.Checked Then From 524bd8b5ff5b93a23cf03ac699cbe7503be27351 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Wed, 7 Jun 2017 18:08:26 +0300 Subject: [PATCH 007/201] adding package name --- instat/dlgOneVarCompareModels.vb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 0710eb6b67b..09255ae9783 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -60,8 +60,8 @@ Public Class dlgOneVarCompareModels Dim clsDefaultFunction As New RFunction ucrSelectorOneVarCompModels.Reset() - clsDefaultFunction.SetRCommand("gofstat") - ucrBase.clsRsyntax.SetBaseRFunction(clsDefaultFunction.Clone()) + clsDefaultFunction.SetRCommand("fitdistrplus::gofstat") + ucrBase.clsRsyntax.SetBaseRFunction(clsDefaultFunction) ' bResetSubdialog = True End Sub @@ -106,7 +106,7 @@ Public Class dlgOneVarCompareModels End Sub Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click - ' sdgOneVarCompareModels.SetRFunction(ucrBase.clsRsyntax.clsBaseFunction, bResetSubdialog) + ' sdgOneVarCompareModels.SetRFunction(ucrBase.clsRsyntax.clsBaseFunction, bResetSubdialog) 'bResetSubdialog = False 'sdgOneVarCompareModels.ShowDialog() From 1a610d5744b3a4fe3ac4c51474d2e057aad94cba Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Thu, 8 Jun 2017 11:41:37 +0300 Subject: [PATCH 008/201] sdgUpdate and more additions --- instat/dlgOneVarCompareModels.vb | 40 ++-- instat/sdgOneVarCompareModels.Designer.vb | 151 +++++++++----- instat/sdgOneVarCompareModels.resx | 238 +++++++++++----------- instat/sdgOneVarCompareModels.vb | 66 ++++-- 4 files changed, 294 insertions(+), 201 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 09255ae9783..2119d555eda 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -19,8 +19,9 @@ Imports instat.Translations Public Class dlgOneVarCompareModels Private bFirstLoad As Boolean = True Private bReset As Boolean = True - 'Private bResetSubdialog As Boolean = False - + Private bResetSubdialog As Boolean = False + Private clsGofStat, clsReceiver, clsRcdfcompFunction, clsRAsDataFrame As New RFunction + Private clsOperatorforTable As New ROperator Private Sub dlgOneVarCompareModels_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) If bFirstLoad Then @@ -57,12 +58,25 @@ Public Class dlgOneVarCompareModels End Sub Private Sub SetDefaults() - Dim clsDefaultFunction As New RFunction + clsGofStat = New RFunction + clsRcdfcompFunction = New RFunction + clsReceiver = New RFunction + ucrSelectorOneVarCompModels.Reset() - clsDefaultFunction.SetRCommand("fitdistrplus::gofstat") - ucrBase.clsRsyntax.SetBaseRFunction(clsDefaultFunction) - ' bResetSubdialog = True + clsGofStat.SetRCommand("fitdistrplus::gofstat") + clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") + + clsOperatorforTable.SetOperation("$") + clsOperatorforTable.AddParameter(iPosition:=0, clsRFunctionParameter:=clsReceiver) + clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") + clsRAsDataFrame.SetRCommand("as.data.frame") + clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) + + clsRAsDataFrame.SetAssignTo(sdgOneVarCompareModels.ucrDisplayChiData.GetText(), strTempDataframe:=sdgOneVarCompareModels.ucrDisplayChiData.GetText()) + + ucrBase.clsRsyntax.SetBaseRFunction(clsGofStat) + bResetSubdialog = True End Sub 'Only distributions that can be accepted into the receiver have to be from the same variable @@ -106,14 +120,16 @@ Public Class dlgOneVarCompareModels End Sub Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click - ' sdgOneVarCompareModels.SetRFunction(ucrBase.clsRsyntax.clsBaseFunction, bResetSubdialog) - 'bResetSubdialog = False - 'sdgOneVarCompareModels.ShowDialog() - - ''TestOKEnabled() + sdgOneVarCompareModels.SetRFunction(clsGofStat, clsReceiver, clsRcdfcompFunction, bResetSubdialog) + bResetSubdialog = False + sdgOneVarCompareModels.ShowDialog() End Sub Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk - ' sdgOneVarCompareModels.CreateGraphs() + sdgOneVarCompareModels.CreateGraphs() + End Sub + + Private Sub ucrReceiverCompare_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverCompareModels.ControlValueChanged + clsReceiver = ucrReceiverCompareModels.GetVariables() End Sub End Class diff --git a/instat/sdgOneVarCompareModels.Designer.vb b/instat/sdgOneVarCompareModels.Designer.vb index 20e09b1e5a4..3b62fc47fee 100644 --- a/instat/sdgOneVarCompareModels.Designer.vb +++ b/instat/sdgOneVarCompareModels.Designer.vb @@ -23,67 +23,105 @@ Partial Class sdgOneVarCompareModels Private Sub InitializeComponent() Me.ucrSubBase = New instat.ucrButtonsSubdialogue() - Me.chkSaveChi = New System.Windows.Forms.CheckBox() - Me.ucrDisplayChiData = New instat.ucrInputTextBox() + Me.tbpOneVarCompareModels = New System.Windows.Forms.TabControl() + Me.tbpFit = New System.Windows.Forms.TabPage() + Me.tbpPlot = New System.Windows.Forms.TabPage() Me.grpFitModel = New System.Windows.Forms.GroupBox() Me.ucrSaveGOF = New instat.ucrSave() + Me.ucrDisplayChiData = New instat.ucrInputTextBox() + Me.chkSaveChi = New System.Windows.Forms.CheckBox() Me.ucrChkInputChiSquareBreakpoints = New instat.ucrCheck() - Me.grpPlot = New System.Windows.Forms.GroupBox() + Me.grpPlotOptions = New System.Windows.Forms.GroupBox() Me.ucrSavePlots = New instat.ucrSave() Me.ucrChkQQ = New instat.ucrCheck() Me.ucrChkPP = New instat.ucrCheck() Me.ucrChkDensity = New instat.ucrCheck() Me.ucrChkCDF = New instat.ucrCheck() + Me.tbpOneVarCompareModels.SuspendLayout() + Me.tbpFit.SuspendLayout() + Me.tbpPlot.SuspendLayout() Me.grpFitModel.SuspendLayout() - Me.grpPlot.SuspendLayout() + Me.grpPlotOptions.SuspendLayout() Me.SuspendLayout() ' 'ucrSubBase ' - Me.ucrSubBase.Location = New System.Drawing.Point(73, 274) + Me.ucrSubBase.Location = New System.Drawing.Point(51, 206) Me.ucrSubBase.Name = "ucrSubBase" Me.ucrSubBase.Size = New System.Drawing.Size(142, 30) Me.ucrSubBase.TabIndex = 2 ' - 'chkSaveChi - ' - Me.chkSaveChi.AutoSize = True - Me.chkSaveChi.Location = New System.Drawing.Point(6, 44) - Me.chkSaveChi.Name = "chkSaveChi" - Me.chkSaveChi.Size = New System.Drawing.Size(115, 17) - Me.chkSaveChi.TabIndex = 1 - Me.chkSaveChi.Text = "Display Chi-Square" - Me.chkSaveChi.UseVisualStyleBackColor = True - ' - 'ucrDisplayChiData - ' - Me.ucrDisplayChiData.AddQuotesIfUnrecognised = True - Me.ucrDisplayChiData.IsMultiline = False - Me.ucrDisplayChiData.IsReadOnly = False - Me.ucrDisplayChiData.Location = New System.Drawing.Point(127, 42) - Me.ucrDisplayChiData.Name = "ucrDisplayChiData" - Me.ucrDisplayChiData.Size = New System.Drawing.Size(139, 21) - Me.ucrDisplayChiData.TabIndex = 2 + 'tbpOneVarCompareModels + ' + Me.tbpOneVarCompareModels.Controls.Add(Me.tbpFit) + Me.tbpOneVarCompareModels.Controls.Add(Me.tbpPlot) + Me.tbpOneVarCompareModels.Location = New System.Drawing.Point(2, 12) + Me.tbpOneVarCompareModels.Name = "tbpOneVarCompareModels" + Me.tbpOneVarCompareModels.SelectedIndex = 0 + Me.tbpOneVarCompareModels.Size = New System.Drawing.Size(300, 188) + Me.tbpOneVarCompareModels.TabIndex = 3 + ' + 'tbpFit + ' + Me.tbpFit.Controls.Add(Me.grpFitModel) + Me.tbpFit.Location = New System.Drawing.Point(4, 22) + Me.tbpFit.Name = "tbpFit" + Me.tbpFit.Padding = New System.Windows.Forms.Padding(3) + Me.tbpFit.Size = New System.Drawing.Size(292, 162) + Me.tbpFit.TabIndex = 0 + Me.tbpFit.Text = "Fit" + Me.tbpFit.UseVisualStyleBackColor = True + ' + 'tbpPlot + ' + Me.tbpPlot.Controls.Add(Me.grpPlotOptions) + Me.tbpPlot.Location = New System.Drawing.Point(4, 22) + Me.tbpPlot.Name = "tbpPlot" + Me.tbpPlot.Padding = New System.Windows.Forms.Padding(3) + Me.tbpPlot.Size = New System.Drawing.Size(292, 162) + Me.tbpPlot.TabIndex = 1 + Me.tbpPlot.Text = "Plot" + Me.tbpPlot.UseVisualStyleBackColor = True ' 'grpFitModel ' - Me.grpFitModel.Controls.Add(Me.ucrDisplayChiData) Me.grpFitModel.Controls.Add(Me.ucrSaveGOF) + Me.grpFitModel.Controls.Add(Me.ucrDisplayChiData) Me.grpFitModel.Controls.Add(Me.chkSaveChi) Me.grpFitModel.Controls.Add(Me.ucrChkInputChiSquareBreakpoints) - Me.grpFitModel.Location = New System.Drawing.Point(10, 10) + Me.grpFitModel.Location = New System.Drawing.Point(6, 15) Me.grpFitModel.Name = "grpFitModel" Me.grpFitModel.Size = New System.Drawing.Size(273, 100) - Me.grpFitModel.TabIndex = 0 + Me.grpFitModel.TabIndex = 1 Me.grpFitModel.TabStop = False Me.grpFitModel.Text = "Goodness of Fit" ' 'ucrSaveGOF ' - Me.ucrSaveGOF.Location = New System.Drawing.Point(6, 19) + Me.ucrSaveGOF.Location = New System.Drawing.Point(6, 14) Me.ucrSaveGOF.Name = "ucrSaveGOF" - Me.ucrSaveGOF.Size = New System.Drawing.Size(260, 24) - Me.ucrSaveGOF.TabIndex = 0 + Me.ucrSaveGOF.Size = New System.Drawing.Size(255, 24) + Me.ucrSaveGOF.TabIndex = 15 + ' + 'ucrDisplayChiData + ' + Me.ucrDisplayChiData.AddQuotesIfUnrecognised = True + Me.ucrDisplayChiData.IsMultiline = False + Me.ucrDisplayChiData.IsReadOnly = False + Me.ucrDisplayChiData.Location = New System.Drawing.Point(127, 42) + Me.ucrDisplayChiData.Name = "ucrDisplayChiData" + Me.ucrDisplayChiData.Size = New System.Drawing.Size(139, 21) + Me.ucrDisplayChiData.TabIndex = 2 + ' + 'chkSaveChi + ' + Me.chkSaveChi.AutoSize = True + Me.chkSaveChi.Location = New System.Drawing.Point(6, 44) + Me.chkSaveChi.Name = "chkSaveChi" + Me.chkSaveChi.Size = New System.Drawing.Size(115, 17) + Me.chkSaveChi.TabIndex = 1 + Me.chkSaveChi.Text = "Display Chi-Square" + Me.chkSaveChi.UseVisualStyleBackColor = True ' 'ucrChkInputChiSquareBreakpoints ' @@ -93,19 +131,19 @@ Partial Class sdgOneVarCompareModels Me.ucrChkInputChiSquareBreakpoints.Size = New System.Drawing.Size(229, 20) Me.ucrChkInputChiSquareBreakpoints.TabIndex = 3 ' - 'grpPlot + 'grpPlotOptions ' - Me.grpPlot.Controls.Add(Me.ucrSavePlots) - Me.grpPlot.Controls.Add(Me.ucrChkQQ) - Me.grpPlot.Controls.Add(Me.ucrChkPP) - Me.grpPlot.Controls.Add(Me.ucrChkDensity) - Me.grpPlot.Controls.Add(Me.ucrChkCDF) - Me.grpPlot.Location = New System.Drawing.Point(10, 116) - Me.grpPlot.Name = "grpPlot" - Me.grpPlot.Size = New System.Drawing.Size(273, 152) - Me.grpPlot.TabIndex = 1 - Me.grpPlot.TabStop = False - Me.grpPlot.Text = "Plot" + Me.grpPlotOptions.Controls.Add(Me.ucrSavePlots) + Me.grpPlotOptions.Controls.Add(Me.ucrChkQQ) + Me.grpPlotOptions.Controls.Add(Me.ucrChkPP) + Me.grpPlotOptions.Controls.Add(Me.ucrChkDensity) + Me.grpPlotOptions.Controls.Add(Me.ucrChkCDF) + Me.grpPlotOptions.Location = New System.Drawing.Point(3, 3) + Me.grpPlotOptions.Name = "grpPlotOptions" + Me.grpPlotOptions.Size = New System.Drawing.Size(273, 152) + Me.grpPlotOptions.TabIndex = 2 + Me.grpPlotOptions.TabStop = False + Me.grpPlotOptions.Text = "Plot Options" ' 'ucrSavePlots ' @@ -150,9 +188,8 @@ Partial Class sdgOneVarCompareModels ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(294, 312) - Me.Controls.Add(Me.grpPlot) - Me.Controls.Add(Me.grpFitModel) + Me.ClientSize = New System.Drawing.Size(303, 251) + Me.Controls.Add(Me.tbpOneVarCompareModels) Me.Controls.Add(Me.ucrSubBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False @@ -160,23 +197,29 @@ Partial Class sdgOneVarCompareModels Me.Name = "sdgOneVarCompareModels" Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent Me.Text = "Display Options" + Me.tbpOneVarCompareModels.ResumeLayout(False) + Me.tbpFit.ResumeLayout(False) + Me.tbpPlot.ResumeLayout(False) Me.grpFitModel.ResumeLayout(False) Me.grpFitModel.PerformLayout() - Me.grpPlot.ResumeLayout(False) + Me.grpPlotOptions.ResumeLayout(False) Me.ResumeLayout(False) End Sub Friend WithEvents ucrSubBase As ucrButtonsSubdialogue - Friend WithEvents chkSaveChi As CheckBox - Friend WithEvents ucrDisplayChiData As ucrInputTextBox + Friend WithEvents tbpOneVarCompareModels As TabControl + Friend WithEvents tbpFit As TabPage Friend WithEvents grpFitModel As GroupBox - Friend WithEvents grpPlot As GroupBox - Friend WithEvents ucrChkInputChiSquareBreakpoints As ucrCheck - Friend WithEvents ucrChkCDF As ucrCheck - Friend WithEvents ucrChkDensity As ucrCheck - Friend WithEvents ucrChkPP As ucrCheck - Friend WithEvents ucrChkQQ As ucrCheck Friend WithEvents ucrSaveGOF As ucrSave + Friend WithEvents ucrDisplayChiData As ucrInputTextBox + Friend WithEvents chkSaveChi As CheckBox + Friend WithEvents ucrChkInputChiSquareBreakpoints As ucrCheck + Friend WithEvents tbpPlot As TabPage + Friend WithEvents grpPlotOptions As GroupBox Friend WithEvents ucrSavePlots As ucrSave + Friend WithEvents ucrChkQQ As ucrCheck + Friend WithEvents ucrChkPP As ucrCheck + Friend WithEvents ucrChkDensity As ucrCheck + Friend WithEvents ucrChkCDF As ucrCheck End Class \ No newline at end of file diff --git a/instat/sdgOneVarCompareModels.resx b/instat/sdgOneVarCompareModels.resx index 1af7de150c9..29dcb1b3a35 100644 --- a/instat/sdgOneVarCompareModels.resx +++ b/instat/sdgOneVarCompareModels.resx @@ -1,120 +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 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index cc60d723676..f1d84b7fed6 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -16,7 +16,8 @@ Imports instat.Translations Public Class sdgOneVarCompareModels - Private clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRsyntax, clsOperation As New RFunction + Private bControlsInitialised As Boolean = False + Private clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRGofStat, clsRReceiver, clsRsyntax, clsOperation As New RFunction Private clsOperatorforTable, clsOperatorForBreaks As New ROperator Private WithEvents ucrRecs As ucrReceiver Public bfirstload As Boolean = True @@ -37,10 +38,22 @@ Public Class sdgOneVarCompareModels ucrChkInputChiSquareBreakpoints.SetText("Input Chi-Square Breakpoints") 'ucrChkPlots + ucrChkCDF.SetParameter(New RParameter("ft", 1), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkCDF.SetRDefault("TRUE") ucrChkCDF.SetText("CDF") + + ucrChkDensity.SetParameter(New RParameter("ft", 1), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") ucrChkDensity.SetText("Density") + ucrChkDensity.SetRDefault("FALSE") + + ucrChkPP.SetParameter(New RParameter("ft", 1), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkPP.SetRDefault("FALSE") ucrChkPP.SetText("PP") + + ucrChkQQ.SetParameter(New RParameter("ft", 1), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkQQ.SetRDefault("FALSE") ucrChkQQ.SetText("QQ") + InitialiseTabs() 'ucrSavePlot ucrSavePlots.SetPrefix("plots") @@ -50,22 +63,32 @@ Public Class sdgOneVarCompareModels ucrSavePlots.SetAssignToIfUncheckedValue("last_model") End Sub + Public Sub SetRFunction(clsNewRGofStat As RFunction, clsNewReceiver As RFunction, clsNewRcdfcompFunction As RFunction, Optional bReset As Boolean = False) + If Not bControlsInitialised Then + InitialiseControls() + End If + + clsRGofStat = clsNewRGofStat + clsRcdfcompFunction = clsNewRcdfcompFunction + clsRReceiver = clsNewReceiver + 'Setting Rcode for the sub dialog + ucrSaveGOF.SetRCode(clsRGofStat, bReset) + ucrChkCDF.SetRCode(clsRcdfcompFunction, bReset) + ucrChkDensity.SetRCode(clsRdenscompFunction, bReset) + ucrChkInputChiSquareBreakpoints.SetRCode(clsOperatorForBreaks, bReset) + ucrChkPP.SetRCode(clsRppcompFunction, bReset) + ucrChkQQ.SetRCode(clsRqqcompFunction, bReset) + If bReset Then + tbpOneVarCompareModels.SelectedIndex = 0 + End If + End Sub Public Sub InitialiseDialog() - clsRcdfcompFunction.SetRCommand("cdfcomp") - clsRdenscompFunction.SetRCommand("denscomp") - clsRqqcompFunction.SetRCommand("qqcomp") - clsRppcompFunction.SetRCommand("ppcomp") ucrDisplayChiData.SetValidationTypeAsRVariable() End Sub Public Sub SetDefaults() - ucrChkCDF.Checked = True - ucrChkDensity.Checked = False - ucrChkPP.Checked = False - ucrChkQQ.Checked = False - chkSaveChi.Checked = True ucrSavePlots.Enabled = False ' disabled for now ucrDisplayChiData.Reset() If dlgOneVarCompareModels.ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text <> "" Then @@ -102,7 +125,7 @@ Public Class sdgOneVarCompareModels End If End Sub - Private Sub ucrDisplayChiData_NameChanged() Handles ucrDisplayChiData.NameChanged + Private Sub ucrDisplayChiData_NameChanged() DisplayChiSquare() End Sub @@ -114,19 +137,23 @@ Public Class sdgOneVarCompareModels Dim strTemp As String = "" If ucrChkCDF.Checked Then - clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.ucrReceiverCompareModels.GetVariables()) + clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") + clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 2) End If If ucrChkPP.Checked Then - clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.ucrReceiverCompareModels.GetVariables()) + clsRppcompFunction.SetRCommand("fitdistrplus::denscomp") + clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 2) End If If ucrChkQQ.Checked Then - clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.ucrReceiverCompareModels.GetVariables()) + clsRqqcompFunction.SetRCommand("fitdistrplus::qqcomp") + clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 2) End If If ucrChkDensity.Checked Then - clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.ucrReceiverCompareModels.GetVariables()) + clsRdenscompFunction.SetRCommand("fitdistrplus::ppcomp") + clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 2) End If If chkSaveChi.Checked Then @@ -151,7 +178,7 @@ Public Class sdgOneVarCompareModels End If End Sub - Private Sub chkSaveChi_CheckedChanged(sender As Object, e As EventArgs) Handles chkSaveChi.CheckedChanged + Private Sub chkSaveChi_CheckedChanged(sender As Object, e As EventArgs) DisplayChiSquare() End Sub @@ -169,6 +196,13 @@ Public Class sdgOneVarCompareModels Return bOkEnabled End Function + Private Sub InitialiseTabs() + For i = 0 To tbpOneVarCompareModels.TabCount - 1 + tbpOneVarCompareModels.SelectedIndex = i + Next + tbpOneVarCompareModels.SelectedIndex = 0 + End Sub + End Class From 2dae8a5876140e51fb8d2175f56046fd738727df Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Thu, 8 Jun 2017 17:08:54 +0300 Subject: [PATCH 009/201] more edits --- instat/dlgOneVarCompareModels.vb | 15 +-- instat/sdgOneVarCompareModels.Designer.vb | 67 +++++-------- instat/sdgOneVarCompareModels.vb | 109 +++++++++------------- 3 files changed, 78 insertions(+), 113 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 2119d555eda..3a9b652381a 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -20,7 +20,7 @@ Public Class dlgOneVarCompareModels Private bFirstLoad As Boolean = True Private bReset As Boolean = True Private bResetSubdialog As Boolean = False - Private clsGofStat, clsReceiver, clsRcdfcompFunction, clsRAsDataFrame As New RFunction + Private clsGofStat, clsReceiver, clsRcdfcompFunction, clsRAsDataFrame, clsRdenscompFunction, clsRppcompFunction, clsRqqcompFunction As New RFunction Private clsOperatorforTable As New ROperator Private Sub dlgOneVarCompareModels_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) @@ -68,12 +68,14 @@ Public Class dlgOneVarCompareModels clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") clsOperatorforTable.SetOperation("$") - clsOperatorforTable.AddParameter(iPosition:=0, clsRFunctionParameter:=clsReceiver) - clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") + clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) + clsOperatorforTable.AddParameter(strParameterValue:="chisqbreaks") + + ' clsOperatorforTable.AddParameter("chisqtable", clsRFunctionParameter:=clsReceiver, iPosition:=0) clsRAsDataFrame.SetRCommand("as.data.frame") clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) - clsRAsDataFrame.SetAssignTo(sdgOneVarCompareModels.ucrDisplayChiData.GetText(), strTempDataframe:=sdgOneVarCompareModels.ucrDisplayChiData.GetText()) + clsRAsDataFrame.SetAssignTo(ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempDataframe:=ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text) ucrBase.clsRsyntax.SetBaseRFunction(clsGofStat) bResetSubdialog = True @@ -84,7 +86,8 @@ Public Class dlgOneVarCompareModels ' variables not fromvariablex cannot be in dataframe Private Sub SetRCodeForControls(bReset As Boolean) - SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) + ucrReceiverCompareModels.SetRCode(clsGofStat, bReset) + 'SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) End Sub Public Sub TestOKEnabled() @@ -120,7 +123,7 @@ Public Class dlgOneVarCompareModels End Sub Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click - sdgOneVarCompareModels.SetRFunction(clsGofStat, clsReceiver, clsRcdfcompFunction, bResetSubdialog) + sdgOneVarCompareModels.SetRCode(clsGofStat, clsReceiver, clsRcdfcompFunction, clsRdenscompFunction, clsRppcompFunction, clsRqqcompFunction, clsRAsDataFrame, clsOperatorforTable, bResetSubdialog) bResetSubdialog = False sdgOneVarCompareModels.ShowDialog() End Sub diff --git a/instat/sdgOneVarCompareModels.Designer.vb b/instat/sdgOneVarCompareModels.Designer.vb index 3b62fc47fee..08dcd22b4b8 100644 --- a/instat/sdgOneVarCompareModels.Designer.vb +++ b/instat/sdgOneVarCompareModels.Designer.vb @@ -25,12 +25,11 @@ Partial Class sdgOneVarCompareModels Me.ucrSubBase = New instat.ucrButtonsSubdialogue() Me.tbpOneVarCompareModels = New System.Windows.Forms.TabControl() Me.tbpFit = New System.Windows.Forms.TabPage() - Me.tbpPlot = New System.Windows.Forms.TabPage() Me.grpFitModel = New System.Windows.Forms.GroupBox() + Me.ucrSaveDisplayChi = New instat.ucrSave() Me.ucrSaveGOF = New instat.ucrSave() - Me.ucrDisplayChiData = New instat.ucrInputTextBox() - Me.chkSaveChi = New System.Windows.Forms.CheckBox() Me.ucrChkInputChiSquareBreakpoints = New instat.ucrCheck() + Me.tbpPlot = New System.Windows.Forms.TabPage() Me.grpPlotOptions = New System.Windows.Forms.GroupBox() Me.ucrSavePlots = New instat.ucrSave() Me.ucrChkQQ = New instat.ucrCheck() @@ -39,8 +38,8 @@ Partial Class sdgOneVarCompareModels Me.ucrChkCDF = New instat.ucrCheck() Me.tbpOneVarCompareModels.SuspendLayout() Me.tbpFit.SuspendLayout() - Me.tbpPlot.SuspendLayout() Me.grpFitModel.SuspendLayout() + Me.tbpPlot.SuspendLayout() Me.grpPlotOptions.SuspendLayout() Me.SuspendLayout() ' @@ -72,30 +71,25 @@ Partial Class sdgOneVarCompareModels Me.tbpFit.Text = "Fit" Me.tbpFit.UseVisualStyleBackColor = True ' - 'tbpPlot - ' - Me.tbpPlot.Controls.Add(Me.grpPlotOptions) - Me.tbpPlot.Location = New System.Drawing.Point(4, 22) - Me.tbpPlot.Name = "tbpPlot" - Me.tbpPlot.Padding = New System.Windows.Forms.Padding(3) - Me.tbpPlot.Size = New System.Drawing.Size(292, 162) - Me.tbpPlot.TabIndex = 1 - Me.tbpPlot.Text = "Plot" - Me.tbpPlot.UseVisualStyleBackColor = True - ' 'grpFitModel ' + Me.grpFitModel.Controls.Add(Me.ucrSaveDisplayChi) Me.grpFitModel.Controls.Add(Me.ucrSaveGOF) - Me.grpFitModel.Controls.Add(Me.ucrDisplayChiData) - Me.grpFitModel.Controls.Add(Me.chkSaveChi) Me.grpFitModel.Controls.Add(Me.ucrChkInputChiSquareBreakpoints) - Me.grpFitModel.Location = New System.Drawing.Point(6, 15) + Me.grpFitModel.Location = New System.Drawing.Point(4, 5) Me.grpFitModel.Name = "grpFitModel" Me.grpFitModel.Size = New System.Drawing.Size(273, 100) Me.grpFitModel.TabIndex = 1 Me.grpFitModel.TabStop = False Me.grpFitModel.Text = "Goodness of Fit" ' + 'ucrSaveDisplayChi + ' + Me.ucrSaveDisplayChi.Location = New System.Drawing.Point(6, 38) + Me.ucrSaveDisplayChi.Name = "ucrSaveDisplayChi" + Me.ucrSaveDisplayChi.Size = New System.Drawing.Size(260, 24) + Me.ucrSaveDisplayChi.TabIndex = 16 + ' 'ucrSaveGOF ' Me.ucrSaveGOF.Location = New System.Drawing.Point(6, 14) @@ -103,26 +97,6 @@ Partial Class sdgOneVarCompareModels Me.ucrSaveGOF.Size = New System.Drawing.Size(255, 24) Me.ucrSaveGOF.TabIndex = 15 ' - 'ucrDisplayChiData - ' - Me.ucrDisplayChiData.AddQuotesIfUnrecognised = True - Me.ucrDisplayChiData.IsMultiline = False - Me.ucrDisplayChiData.IsReadOnly = False - Me.ucrDisplayChiData.Location = New System.Drawing.Point(127, 42) - Me.ucrDisplayChiData.Name = "ucrDisplayChiData" - Me.ucrDisplayChiData.Size = New System.Drawing.Size(139, 21) - Me.ucrDisplayChiData.TabIndex = 2 - ' - 'chkSaveChi - ' - Me.chkSaveChi.AutoSize = True - Me.chkSaveChi.Location = New System.Drawing.Point(6, 44) - Me.chkSaveChi.Name = "chkSaveChi" - Me.chkSaveChi.Size = New System.Drawing.Size(115, 17) - Me.chkSaveChi.TabIndex = 1 - Me.chkSaveChi.Text = "Display Chi-Square" - Me.chkSaveChi.UseVisualStyleBackColor = True - ' 'ucrChkInputChiSquareBreakpoints ' Me.ucrChkInputChiSquareBreakpoints.Checked = False @@ -131,6 +105,17 @@ Partial Class sdgOneVarCompareModels Me.ucrChkInputChiSquareBreakpoints.Size = New System.Drawing.Size(229, 20) Me.ucrChkInputChiSquareBreakpoints.TabIndex = 3 ' + 'tbpPlot + ' + Me.tbpPlot.Controls.Add(Me.grpPlotOptions) + Me.tbpPlot.Location = New System.Drawing.Point(4, 22) + Me.tbpPlot.Name = "tbpPlot" + Me.tbpPlot.Padding = New System.Windows.Forms.Padding(3) + Me.tbpPlot.Size = New System.Drawing.Size(292, 162) + Me.tbpPlot.TabIndex = 1 + Me.tbpPlot.Text = "Plot" + Me.tbpPlot.UseVisualStyleBackColor = True + ' 'grpPlotOptions ' Me.grpPlotOptions.Controls.Add(Me.ucrSavePlots) @@ -199,9 +184,8 @@ Partial Class sdgOneVarCompareModels Me.Text = "Display Options" Me.tbpOneVarCompareModels.ResumeLayout(False) Me.tbpFit.ResumeLayout(False) - Me.tbpPlot.ResumeLayout(False) Me.grpFitModel.ResumeLayout(False) - Me.grpFitModel.PerformLayout() + Me.tbpPlot.ResumeLayout(False) Me.grpPlotOptions.ResumeLayout(False) Me.ResumeLayout(False) @@ -212,8 +196,6 @@ Partial Class sdgOneVarCompareModels Friend WithEvents tbpFit As TabPage Friend WithEvents grpFitModel As GroupBox Friend WithEvents ucrSaveGOF As ucrSave - Friend WithEvents ucrDisplayChiData As ucrInputTextBox - Friend WithEvents chkSaveChi As CheckBox Friend WithEvents ucrChkInputChiSquareBreakpoints As ucrCheck Friend WithEvents tbpPlot As TabPage Friend WithEvents grpPlotOptions As GroupBox @@ -222,4 +204,5 @@ Partial Class sdgOneVarCompareModels Friend WithEvents ucrChkPP As ucrCheck Friend WithEvents ucrChkDensity As ucrCheck Friend WithEvents ucrChkCDF As ucrCheck + Friend WithEvents ucrSaveDisplayChi As ucrSave End Class \ No newline at end of file diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index f1d84b7fed6..a39b321ddcb 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -27,12 +27,6 @@ Public Class sdgOneVarCompareModels End Sub Public Sub InitialiseControls() - 'ucrSaveGOF - ucrSaveGOF.SetName("GOF") - ucrSaveGOF.SetSaveTypeAsModel() ' or graph? - ucrSaveGOF.SetCheckBoxText("Save Fit") - ucrSaveGOF.SetIsComboBox() - ucrSaveGOF.SetAssignToIfUncheckedValue("last_model") 'ucrInputChiSquareBreaks ucrChkInputChiSquareBreakpoints.SetText("Input Chi-Square Breakpoints") @@ -54,6 +48,19 @@ Public Class sdgOneVarCompareModels ucrChkQQ.SetRDefault("FALSE") ucrChkQQ.SetText("QQ") InitialiseTabs() + 'ucrSaveGOF + ucrSaveGOF.SetPrefix("GOF") + ucrSaveGOF.SetSaveTypeAsModel() ' or graph? + ucrSaveGOF.SetCheckBoxText("Save Fit") + ucrSaveGOF.SetIsComboBox() + ucrSaveGOF.SetAssignToIfUncheckedValue("last_model") + + 'ucrSaveDisplayChi + ucrSaveDisplayChi.SetPrefix("ChiSquare") + ucrSaveDisplayChi.SetSaveTypeAsDataFrame() + ucrSaveDisplayChi.SetCheckBoxText("Save DisplayChi") + ucrSaveDisplayChi.SetIsComboBox() + ucrSaveDisplayChi.SetAssignToIfUncheckedValue("last_model") 'ucrSavePlot ucrSavePlots.SetPrefix("plots") @@ -63,7 +70,7 @@ Public Class sdgOneVarCompareModels ucrSavePlots.SetAssignToIfUncheckedValue("last_model") End Sub - Public Sub SetRFunction(clsNewRGofStat As RFunction, clsNewReceiver As RFunction, clsNewRcdfcompFunction As RFunction, Optional bReset As Boolean = False) + Public Sub SetRCode(clsNewRGofStat As RFunction, clsNewReceiver As RFunction, clsNewRcdfcompFunction As RFunction, clsNewclsRdenscompFunction As RFunction, clsNewclsRppcompFunction As RFunction, clsNewclsRqqcompFunction As RFunction, clsNewclsRAsDataFrame As RFunction, Optional clsNewOperatorForBreaks As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If @@ -71,6 +78,12 @@ Public Class sdgOneVarCompareModels clsRGofStat = clsNewRGofStat clsRcdfcompFunction = clsNewRcdfcompFunction clsRReceiver = clsNewReceiver + clsRdenscompFunction = clsNewclsRdenscompFunction + clsOperatorForBreaks = clsNewOperatorForBreaks + clsRppcompFunction = clsNewclsRppcompFunction + clsRqqcompFunction = clsNewclsRqqcompFunction + clsRAsDataFrame = clsNewclsRAsDataFrame + 'Setting Rcode for the sub dialog ucrSaveGOF.SetRCode(clsRGofStat, bReset) ucrChkCDF.SetRCode(clsRcdfcompFunction, bReset) @@ -78,59 +91,37 @@ Public Class sdgOneVarCompareModels ucrChkInputChiSquareBreakpoints.SetRCode(clsOperatorForBreaks, bReset) ucrChkPP.SetRCode(clsRppcompFunction, bReset) ucrChkQQ.SetRCode(clsRqqcompFunction, bReset) - + ucrSaveDisplayChi.SetRCode(clsRAsDataFrame, bReset) If bReset Then tbpOneVarCompareModels.SelectedIndex = 0 End If End Sub - Public Sub InitialiseDialog() - ucrDisplayChiData.SetValidationTypeAsRVariable() - End Sub - - Public Sub SetDefaults() - ucrSavePlots.Enabled = False ' disabled for now - ucrDisplayChiData.Reset() - If dlgOneVarCompareModels.ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text <> "" Then - ucrDisplayChiData.SetName(dlgOneVarCompareModels.ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_ChiSquare") - End If - DisplayChiSquare() - DisplayChiBreaks() - 'ucrBase.ihelptopicID = - End Sub Public Sub Reopen() - DisplayChiSquare() - End Sub - - Public Sub SetModelFunction(clsNewModel As RFunction) - clsModel = clsNewModel + ' DisplayChiSquare() End Sub - Public Sub DisplayChiSquare() - If chkSaveChi.Checked Then - ucrDisplayChiData.Visible = True - clsOperatorforTable.SetOperation("$") - clsOperatorforTable.AddParameter(iPosition:=0, clsRFunctionParameter:=clsModel) - clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") - clsRAsDataFrame.SetRCommand("as.data.frame") - clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) - Else - ucrDisplayChiData.Visible = False - End If - If Not ucrDisplayChiData.IsEmpty Then - clsRAsDataFrame.SetAssignTo(ucrDisplayChiData.GetText(), strTempDataframe:=ucrDisplayChiData.GetText()) - Else - clsRAsDataFrame.RemoveAssignTo() - End If - End Sub + 'Public Sub DisplayChiSquare() + ' If chkSaveChi.Checked Then + ' ucrDisplayChiData.Visible = True + ' clsOperatorforTable.SetOperation("$") + ' clsOperatorforTable.AddParameter(iPosition:=0, clsRFunctionParameter:=clsModel) + ' clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") + ' clsRAsDataFrame.SetRCommand("as.data.frame") + ' clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) + ' Else + ' ucrDisplayChiData.Visible = False + ' End If + ' If Not ucrDisplayChiData.IsEmpty Then + ' clsRAsDataFrame.SetAssignTo(ucrDisplayChiData.GetText(), strTempDataframe:=ucrDisplayChiData.GetText()) + ' Else + ' clsRAsDataFrame.RemoveAssignTo() + ' End If + 'End Sub Private Sub ucrDisplayChiData_NameChanged() - DisplayChiSquare() - End Sub - - Public Sub SetReceiver(ucrNewReceiver As ucrReceiver) - ucrRecs = ucrNewReceiver + ' DisplayChiSquare() End Sub Public Sub CreateGraphs() @@ -156,7 +147,8 @@ Public Class sdgOneVarCompareModels clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 2) End If - If chkSaveChi.Checked Then + + If ucrSaveDisplayChi.IsComplete Then frmMain.clsRLink.RunScript(clsOperatorforTable.ToScript(), 0) clsRAsDataFrame.ToScript(strTemp) frmMain.clsRLink.RunScript(strTemp, 0) @@ -164,6 +156,7 @@ Public Class sdgOneVarCompareModels If ucrChkInputChiSquareBreakpoints.Checked Then frmMain.clsRLink.RunScript(clsOperatorForBreaks.ToScript(), 2) End If + End Sub Private Sub chkInputBreakpoints_Checked_Changed(sender As Object, e As EventArgs) @@ -179,23 +172,9 @@ Public Class sdgOneVarCompareModels End Sub Private Sub chkSaveChi_CheckedChanged(sender As Object, e As EventArgs) - DisplayChiSquare() + ' DisplayChiSquare() End Sub - ' Private Sub ucrSavePlots_NameChanged() Handles ucrSavePlots.Click - 'TODO Graph Names assigned go up in increments for any of the graphs selected (e.g. 3 plots are selected and it is named "plots", then automatically we get "plots1", ... , "plots3" - 'End Sub - - Public Function TestOkEnabled() As Boolean - Dim bOkEnabled As Boolean - If (ucrSaveGOF.IsComplete()) AndAlso (chkSaveChi.Checked AndAlso Not ucrDisplayChiData.IsEmpty OrElse Not chkSaveChi.Checked) Then - bOkEnabled = True - Else - bOkEnabled = False - End If - Return bOkEnabled - End Function - Private Sub InitialiseTabs() For i = 0 To tbpOneVarCompareModels.TabCount - 1 tbpOneVarCompareModels.SelectedIndex = i From 3db605c65c067d38c52bde99909cc1089edb8b37 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Fri, 9 Jun 2017 12:46:12 +0300 Subject: [PATCH 010/201] More additions --- instat/dlgOneVarCompareModels.vb | 16 ++--- instat/sdgOneVarCompareModels.vb | 109 +++++++------------------------ 2 files changed, 32 insertions(+), 93 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 3a9b652381a..773155acf7d 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -20,7 +20,7 @@ Public Class dlgOneVarCompareModels Private bFirstLoad As Boolean = True Private bReset As Boolean = True Private bResetSubdialog As Boolean = False - Private clsGofStat, clsReceiver, clsRcdfcompFunction, clsRAsDataFrame, clsRdenscompFunction, clsRppcompFunction, clsRqqcompFunction As New RFunction + Private clsGofStat, clsReceiver, clsRAsDataFrame, clsRBootFunction As New RFunction Private clsOperatorforTable As New ROperator Private Sub dlgOneVarCompareModels_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) @@ -33,7 +33,7 @@ Public Class dlgOneVarCompareModels End If SetRCodeForControls(bReset) bReset = False - ReopenDialog() + ' ReopenDialog() TestOKEnabled() End Sub @@ -59,13 +59,13 @@ Public Class dlgOneVarCompareModels Private Sub SetDefaults() clsGofStat = New RFunction - clsRcdfcompFunction = New RFunction + clsRBootFunction = New RFunction clsReceiver = New RFunction ucrSelectorOneVarCompModels.Reset() clsGofStat.SetRCommand("fitdistrplus::gofstat") - clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") + clsRBootFunction.SetRCommand("fitdistrplus::cdfcomp") clsOperatorforTable.SetOperation("$") clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) @@ -104,9 +104,9 @@ Public Class dlgOneVarCompareModels TestOKEnabled() End Sub - Private Sub ReopenDialog() - sdgOneVarCompareModels.Reopen() - End Sub + 'Private Sub ReopenDialog() + ' sdgOneVarCompareModels.Reopen() + 'End Sub Private Sub ucrSelectorOneVarCompModels_DataFrameChanged() Handles ucrSelectorOneVarCompModels.DataFrameChanged ' sdgOneVarCompareModels.DisplayChiSquare() @@ -123,7 +123,7 @@ Public Class dlgOneVarCompareModels End Sub Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click - sdgOneVarCompareModels.SetRCode(clsGofStat, clsReceiver, clsRcdfcompFunction, clsRdenscompFunction, clsRppcompFunction, clsRqqcompFunction, clsRAsDataFrame, clsOperatorforTable, bResetSubdialog) + sdgOneVarCompareModels.SetRCode(clsGofStat, clsReceiver, clsRBootFunction, clsRAsDataFrame, clsOperatorforTable, bResetSubdialog) bResetSubdialog = False sdgOneVarCompareModels.ShowDialog() End Sub diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index a39b321ddcb..75298dc20fc 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -17,7 +17,7 @@ Imports instat.Translations Public Class sdgOneVarCompareModels Private bControlsInitialised As Boolean = False - Private clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRGofStat, clsRReceiver, clsRsyntax, clsOperation As New RFunction + Private clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRGofStat, clsRReceiver, clsRsyntax, clsRPlotFunction, clsOperation As New RFunction Private clsOperatorforTable, clsOperatorForBreaks As New ROperator Private WithEvents ucrRecs As ucrReceiver Public bfirstload As Boolean = True @@ -50,7 +50,7 @@ Public Class sdgOneVarCompareModels InitialiseTabs() 'ucrSaveGOF ucrSaveGOF.SetPrefix("GOF") - ucrSaveGOF.SetSaveTypeAsModel() ' or graph? + ' ucrSaveGOF.SetSaveTypeAsModel() ' or graph? ucrSaveGOF.SetCheckBoxText("Save Fit") ucrSaveGOF.SetIsComboBox() ucrSaveGOF.SetAssignToIfUncheckedValue("last_model") @@ -70,27 +70,24 @@ Public Class sdgOneVarCompareModels ucrSavePlots.SetAssignToIfUncheckedValue("last_model") End Sub - Public Sub SetRCode(clsNewRGofStat As RFunction, clsNewReceiver As RFunction, clsNewRcdfcompFunction As RFunction, clsNewclsRdenscompFunction As RFunction, clsNewclsRppcompFunction As RFunction, clsNewclsRqqcompFunction As RFunction, clsNewclsRAsDataFrame As RFunction, Optional clsNewOperatorForBreaks As ROperator = Nothing, Optional bReset As Boolean = False) + Public Sub SetRCode(clsNewRGofStat As RFunction, clsNewReceiver As RFunction, clsNewRPlotFunction As RFunction, clsNewclsRAsDataFrame As RFunction, Optional clsNewOperatorforTable As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If clsRGofStat = clsNewRGofStat - clsRcdfcompFunction = clsNewRcdfcompFunction clsRReceiver = clsNewReceiver - clsRdenscompFunction = clsNewclsRdenscompFunction - clsOperatorForBreaks = clsNewOperatorForBreaks - clsRppcompFunction = clsNewclsRppcompFunction - clsRqqcompFunction = clsNewclsRqqcompFunction + clsOperatorforTable = clsNewOperatorforTable clsRAsDataFrame = clsNewclsRAsDataFrame + clsRPlotFunction = clsNewRPlotFunction 'Setting Rcode for the sub dialog ucrSaveGOF.SetRCode(clsRGofStat, bReset) - ucrChkCDF.SetRCode(clsRcdfcompFunction, bReset) - ucrChkDensity.SetRCode(clsRdenscompFunction, bReset) + ucrChkCDF.SetRCode(clsRPlotFunction, bReset) + ucrChkDensity.SetRCode(clsRPlotFunction, bReset) ucrChkInputChiSquareBreakpoints.SetRCode(clsOperatorForBreaks, bReset) - ucrChkPP.SetRCode(clsRppcompFunction, bReset) - ucrChkQQ.SetRCode(clsRqqcompFunction, bReset) + ucrChkPP.SetRCode(clsRPlotFunction, bReset) + ucrChkQQ.SetRCode(clsRPlotFunction, bReset) ucrSaveDisplayChi.SetRCode(clsRAsDataFrame, bReset) If bReset Then @@ -98,54 +95,31 @@ Public Class sdgOneVarCompareModels End If End Sub - Public Sub Reopen() - ' DisplayChiSquare() - End Sub - - 'Public Sub DisplayChiSquare() - ' If chkSaveChi.Checked Then - ' ucrDisplayChiData.Visible = True - ' clsOperatorforTable.SetOperation("$") - ' clsOperatorforTable.AddParameter(iPosition:=0, clsRFunctionParameter:=clsModel) - ' clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") - ' clsRAsDataFrame.SetRCommand("as.data.frame") - ' clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) - ' Else - ' ucrDisplayChiData.Visible = False - ' End If - ' If Not ucrDisplayChiData.IsEmpty Then - ' clsRAsDataFrame.SetAssignTo(ucrDisplayChiData.GetText(), strTempDataframe:=ucrDisplayChiData.GetText()) - ' Else - ' clsRAsDataFrame.RemoveAssignTo() - ' End If - 'End Sub - - Private Sub ucrDisplayChiData_NameChanged() - ' DisplayChiSquare() - End Sub - Public Sub CreateGraphs() Dim strTemp As String = "" If ucrChkCDF.Checked Then - clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") - clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 2) + clsRPlotFunction.SetRCommand("fitdistrplus::cdfcomp") + clsRPlotFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRPlotFunction.ToScript(), 3) End If If ucrChkPP.Checked Then - clsRppcompFunction.SetRCommand("fitdistrplus::denscomp") - clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 2) + 'clsRPlotFunction.ClearParameters() + clsRPlotFunction.SetRCommand("fitdistrplus::denscomp") + clsRPlotFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRPlotFunction.ToScript(), 3) End If If ucrChkQQ.Checked Then - clsRqqcompFunction.SetRCommand("fitdistrplus::qqcomp") - clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 2) + 'clsRPlotFunction.ClearParameters() + clsRPlotFunction.SetRCommand("fitdistrplus::qqcomp") + clsRPlotFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRPlotFunction.ToScript(), 3) End If If ucrChkDensity.Checked Then - clsRdenscompFunction.SetRCommand("fitdistrplus::ppcomp") - clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 2) + ' clsRPlotFunction.ClearParameters() + clsRPlotFunction.SetRCommand("fitdistrplus::ppcomp") + clsRPlotFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRPlotFunction.ToScript(), 3) End If If ucrSaveDisplayChi.IsComplete Then @@ -159,10 +133,6 @@ Public Class sdgOneVarCompareModels End Sub - Private Sub chkInputBreakpoints_Checked_Changed(sender As Object, e As EventArgs) - DisplayChiBreaks() - End Sub - Public Sub DisplayChiBreaks() If ucrChkInputChiSquareBreakpoints.Checked Then clsOperatorForBreaks.SetOperation("$") @@ -171,10 +141,6 @@ Public Class sdgOneVarCompareModels End If End Sub - Private Sub chkSaveChi_CheckedChanged(sender As Object, e As EventArgs) - ' DisplayChiSquare() - End Sub - Private Sub InitialiseTabs() For i = 0 To tbpOneVarCompareModels.TabCount - 1 tbpOneVarCompareModels.SelectedIndex = i @@ -184,30 +150,3 @@ Public Class sdgOneVarCompareModels End Class - -' if in main dialog: -' How does this change here? - -'Private clsCDF As New RFunction - -'Public Sub SetRCodeForControls(bReset As Boolean) -' ucrreceiverinDLG.SetRCode(clsCDF, bReset) -'End Sub - -'Private Sub SetDefaults() -'Dim clsCDFDefault As New RFunction -'ucrChkSetSeed.Checked = False -'clsCDFDefault.SetRCommand("cdfcomp") - -'clsCDF = clsCDFDefault.Clone -'End Sub - -' Private Sub InitialiseDialog() -'ucrReceiverinDLG.SetParameter(New RParameter ("ft")) -' End Sub - -'Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk' -'If ucrChkCDF.Checked Then -'frmMain.clsRLink.RunScript(clsCDF.ToScript, strComment:="") -'End If -'End Sub \ No newline at end of file From 02b08a1262e17fc33f04e055134bd692bc8f1ea9 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Fri, 9 Jun 2017 16:57:37 +0300 Subject: [PATCH 011/201] More fix on reseting --- instat/dlgOneVarCompareModels.vb | 19 ++++++++----- instat/sdgOneVarCompareModels.vb | 46 ++++++++++++++++++-------------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 773155acf7d..16e7527e6f9 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -20,8 +20,8 @@ Public Class dlgOneVarCompareModels Private bFirstLoad As Boolean = True Private bReset As Boolean = True Private bResetSubdialog As Boolean = False - Private clsGofStat, clsReceiver, clsRAsDataFrame, clsRBootFunction As New RFunction - Private clsOperatorforTable As New ROperator + Private clsGofStat, clsReceiver, clsRAsDataFrame, clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction As New RFunction + Private clsOperatorforTable, clsOperatorForBreaks As New ROperator Private Sub dlgOneVarCompareModels_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) If bFirstLoad Then @@ -59,13 +59,18 @@ Public Class dlgOneVarCompareModels Private Sub SetDefaults() clsGofStat = New RFunction - clsRBootFunction = New RFunction + clsRppcompFunction = New RFunction clsReceiver = New RFunction + clsRdenscompFunction = New RFunction + clsRqqcompFunction = New RFunction + clsRqqcompFunction = New RFunction + clsOperatorForBreaks = New ROperator + clsOperatorforTable = New ROperator ucrSelectorOneVarCompModels.Reset() clsGofStat.SetRCommand("fitdistrplus::gofstat") - clsRBootFunction.SetRCommand("fitdistrplus::cdfcomp") + clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") clsOperatorforTable.SetOperation("$") clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) @@ -75,7 +80,9 @@ Public Class dlgOneVarCompareModels clsRAsDataFrame.SetRCommand("as.data.frame") clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) - clsRAsDataFrame.SetAssignTo(ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempDataframe:=ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text) + clsRAsDataFrame.SetAssignTo(ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_ChiSquare", strTempDataframe:=ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text) + + clsGofStat.SetAssignTo(sdgOneVarCompareModels.ucrSaveGOF.GetText, strTempDataframe:=ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text) ucrBase.clsRsyntax.SetBaseRFunction(clsGofStat) bResetSubdialog = True @@ -123,7 +130,7 @@ Public Class dlgOneVarCompareModels End Sub Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click - sdgOneVarCompareModels.SetRCode(clsGofStat, clsReceiver, clsRBootFunction, clsRAsDataFrame, clsOperatorforTable, bResetSubdialog) + sdgOneVarCompareModels.SetRCode(clsGofStat, clsReceiver, clsRdenscompFunction, clsRcdfcompFunction, clsRqqcompFunction, clsRppcompFunction, clsRAsDataFrame, clsOperatorforTable,clsOperatorForBreaks, bResetSubdialog) bResetSubdialog = False sdgOneVarCompareModels.ShowDialog() End Sub diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index 75298dc20fc..70e0f8928d1 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -56,13 +56,14 @@ Public Class sdgOneVarCompareModels ucrSaveGOF.SetAssignToIfUncheckedValue("last_model") 'ucrSaveDisplayChi - ucrSaveDisplayChi.SetPrefix("ChiSquare") + ' ucrSaveDisplayChi.SetPrefix("ChiSquare") ucrSaveDisplayChi.SetSaveTypeAsDataFrame() ucrSaveDisplayChi.SetCheckBoxText("Save DisplayChi") ucrSaveDisplayChi.SetIsComboBox() ucrSaveDisplayChi.SetAssignToIfUncheckedValue("last_model") 'ucrSavePlot + ucrSavePlots.Enabled = False 'for now ucrSavePlots.SetPrefix("plots") ucrSavePlots.SetSaveTypeAsModel() ucrSavePlots.SetCheckBoxText("Save Plot") @@ -70,7 +71,7 @@ Public Class sdgOneVarCompareModels ucrSavePlots.SetAssignToIfUncheckedValue("last_model") End Sub - Public Sub SetRCode(clsNewRGofStat As RFunction, clsNewReceiver As RFunction, clsNewRPlotFunction As RFunction, clsNewclsRAsDataFrame As RFunction, Optional clsNewOperatorforTable As ROperator = Nothing, Optional bReset As Boolean = False) + Public Sub SetRCode(clsNewRGofStat As RFunction, clsNewReceiver As RFunction, clsNewRdenscompFunction As RFunction, clsNewRcdfcompFunction As RFunction, clsNewRqqcompFunction As RFunction, clsNewRppcompFunction As RFunction, clsNewclsRAsDataFrame As RFunction, Optional clsNewOperatorforTable As ROperator = Nothing, Optional clsNewOperatorForBreaks As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If @@ -79,15 +80,20 @@ Public Class sdgOneVarCompareModels clsRReceiver = clsNewReceiver clsOperatorforTable = clsNewOperatorforTable clsRAsDataFrame = clsNewclsRAsDataFrame - clsRPlotFunction = clsNewRPlotFunction + ' clsRPlotFunction = clsNewRPlotFunction + clsRdenscompFunction = clsNewRdenscompFunction + clsRcdfcompFunction = clsNewRcdfcompFunction + clsRqqcompFunction = clsNewRqqcompFunction + clsRppcompFunction = clsNewRppcompFunction + clsOperatorForBreaks = clsNewOperatorForBreaks 'Setting Rcode for the sub dialog ucrSaveGOF.SetRCode(clsRGofStat, bReset) - ucrChkCDF.SetRCode(clsRPlotFunction, bReset) - ucrChkDensity.SetRCode(clsRPlotFunction, bReset) + ucrChkCDF.SetRCode(clsRcdfcompFunction, bReset) + ucrChkDensity.SetRCode(clsRdenscompFunction, bReset) ucrChkInputChiSquareBreakpoints.SetRCode(clsOperatorForBreaks, bReset) - ucrChkPP.SetRCode(clsRPlotFunction, bReset) - ucrChkQQ.SetRCode(clsRPlotFunction, bReset) + ucrChkPP.SetRCode(clsRppcompFunction, bReset) + ucrChkQQ.SetRCode(clsRqqcompFunction, bReset) ucrSaveDisplayChi.SetRCode(clsRAsDataFrame, bReset) If bReset Then @@ -99,27 +105,27 @@ Public Class sdgOneVarCompareModels Dim strTemp As String = "" If ucrChkCDF.Checked Then - clsRPlotFunction.SetRCommand("fitdistrplus::cdfcomp") - clsRPlotFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRPlotFunction.ToScript(), 3) + clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") + clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 3) End If If ucrChkPP.Checked Then 'clsRPlotFunction.ClearParameters() - clsRPlotFunction.SetRCommand("fitdistrplus::denscomp") - clsRPlotFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRPlotFunction.ToScript(), 3) + clsRdenscompFunction.SetRCommand("fitdistrplus::denscomp") + clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 3) End If If ucrChkQQ.Checked Then 'clsRPlotFunction.ClearParameters() - clsRPlotFunction.SetRCommand("fitdistrplus::qqcomp") - clsRPlotFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRPlotFunction.ToScript(), 3) + clsRqqcompFunction.SetRCommand("fitdistrplus::qqcomp") + clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 3) End If If ucrChkDensity.Checked Then ' clsRPlotFunction.ClearParameters() - clsRPlotFunction.SetRCommand("fitdistrplus::ppcomp") - clsRPlotFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRPlotFunction.ToScript(), 3) + clsRppcompFunction.SetRCommand("fitdistrplus::ppcomp") + clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 3) End If If ucrSaveDisplayChi.IsComplete Then @@ -136,7 +142,7 @@ Public Class sdgOneVarCompareModels Public Sub DisplayChiBreaks() If ucrChkInputChiSquareBreakpoints.Checked Then clsOperatorForBreaks.SetOperation("$") - clsOperatorForBreaks.AddParameter(iPosition:=0, clsRFunctionParameter:=clsModel) + clsOperatorForBreaks.AddParameter(iPosition:=0, clsRFunctionParameter:=clsRGofStat) clsOperatorForBreaks.AddParameter(strParameterValue:="chisqbreaks") End If End Sub From e10394f4ebde899eddc1f34e8b625b5eb4bf23a6 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Fri, 9 Jun 2017 17:49:26 +0300 Subject: [PATCH 012/201] More edits --- instat/dlgOneVarCompareModels.vb | 13 ++----------- instat/sdgOneVarCompareModels.Designer.vb | 4 ++-- instat/sdgOneVarCompareModels.vb | 15 +++------------ 3 files changed, 7 insertions(+), 25 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 16e7527e6f9..6750f3e554b 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -33,7 +33,6 @@ Public Class dlgOneVarCompareModels End If SetRCodeForControls(bReset) bReset = False - ' ReopenDialog() TestOKEnabled() End Sub @@ -50,11 +49,6 @@ Public Class dlgOneVarCompareModels ucrReceiverCompareModels.Selector = ucrSelectorOneVarCompModels ucrReceiverCompareModels.SetMeAsReceiver() - ' sdgOneVarCompareModels.InitialiseDialog() - ' sdgOneVarCompareModels.SetModelFunction(ucrBase.clsRsyntax.clsBaseFunction) - ' sdgOneVarCompareModels.SetReceiver(UcrReceiver) - ' sdgOneVarCompareModels.DisplayChiSquare() - ' sdgOneVarCompareModels.DisplayChiBreaks() End Sub Private Sub SetDefaults() @@ -70,20 +64,17 @@ Public Class dlgOneVarCompareModels ucrSelectorOneVarCompModels.Reset() clsGofStat.SetRCommand("fitdistrplus::gofstat") - clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") + ' clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") clsOperatorforTable.SetOperation("$") clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) clsOperatorforTable.AddParameter(strParameterValue:="chisqbreaks") - ' clsOperatorforTable.AddParameter("chisqtable", clsRFunctionParameter:=clsReceiver, iPosition:=0) clsRAsDataFrame.SetRCommand("as.data.frame") clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) clsRAsDataFrame.SetAssignTo(ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_ChiSquare", strTempDataframe:=ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text) - clsGofStat.SetAssignTo(sdgOneVarCompareModels.ucrSaveGOF.GetText, strTempDataframe:=ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text) - ucrBase.clsRsyntax.SetBaseRFunction(clsGofStat) bResetSubdialog = True End Sub @@ -98,7 +89,7 @@ Public Class dlgOneVarCompareModels End Sub Public Sub TestOKEnabled() - If Not ucrReceiverCompareModels.IsEmpty Then 'sdgOneVarCompareModels.TestOkEnabled() AndAlso Not Then + If Not ucrReceiverCompareModels.IsEmpty Then ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) diff --git a/instat/sdgOneVarCompareModels.Designer.vb b/instat/sdgOneVarCompareModels.Designer.vb index 08dcd22b4b8..ac017c72c74 100644 --- a/instat/sdgOneVarCompareModels.Designer.vb +++ b/instat/sdgOneVarCompareModels.Designer.vb @@ -158,7 +158,7 @@ Partial Class sdgOneVarCompareModels Me.ucrChkDensity.Checked = False Me.ucrChkDensity.Location = New System.Drawing.Point(6, 46) Me.ucrChkDensity.Name = "ucrChkDensity" - Me.ucrChkDensity.Size = New System.Drawing.Size(100, 20) + Me.ucrChkDensity.Size = New System.Drawing.Size(260, 20) Me.ucrChkDensity.TabIndex = 1 ' 'ucrChkCDF @@ -166,7 +166,7 @@ Partial Class sdgOneVarCompareModels Me.ucrChkCDF.Checked = False Me.ucrChkCDF.Location = New System.Drawing.Point(6, 20) Me.ucrChkCDF.Name = "ucrChkCDF" - Me.ucrChkCDF.Size = New System.Drawing.Size(100, 20) + Me.ucrChkCDF.Size = New System.Drawing.Size(260, 20) Me.ucrChkCDF.TabIndex = 0 ' 'sdgOneVarCompareModels diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index 70e0f8928d1..5b72a1d566f 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -33,19 +33,10 @@ Public Class sdgOneVarCompareModels 'ucrChkPlots ucrChkCDF.SetParameter(New RParameter("ft", 1), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkCDF.SetRDefault("TRUE") ucrChkCDF.SetText("CDF") - - ucrChkDensity.SetParameter(New RParameter("ft", 1), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkCDF.SetRDefault("TRUE") ucrChkDensity.SetText("Density") - ucrChkDensity.SetRDefault("FALSE") - - ucrChkPP.SetParameter(New RParameter("ft", 1), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkPP.SetRDefault("FALSE") ucrChkPP.SetText("PP") - - ucrChkQQ.SetParameter(New RParameter("ft", 1), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkQQ.SetRDefault("FALSE") ucrChkQQ.SetText("QQ") InitialiseTabs() 'ucrSaveGOF @@ -58,9 +49,9 @@ Public Class sdgOneVarCompareModels 'ucrSaveDisplayChi ' ucrSaveDisplayChi.SetPrefix("ChiSquare") ucrSaveDisplayChi.SetSaveTypeAsDataFrame() - ucrSaveDisplayChi.SetCheckBoxText("Save DisplayChi") + ucrSaveDisplayChi.SetCheckBoxText("DisplayChi") ucrSaveDisplayChi.SetIsComboBox() - ucrSaveDisplayChi.SetAssignToIfUncheckedValue("last_model") + ucrSaveDisplayChi.SetAssignToIfUncheckedValue("last_DataFrame") 'ucrSavePlot ucrSavePlots.Enabled = False 'for now From 18053a546a933352c7951275cd1b31984797bf67 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Fri, 9 Jun 2017 19:13:13 +0300 Subject: [PATCH 013/201] inputQuantiles fix --- instat/dlgOneVarCompareModels.vb | 2 +- instat/sdgOneVarCompareModels.vb | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 6750f3e554b..0b4cdd736ed 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -64,7 +64,7 @@ Public Class dlgOneVarCompareModels ucrSelectorOneVarCompModels.Reset() clsGofStat.SetRCommand("fitdistrplus::gofstat") - ' clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") + clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") clsOperatorforTable.SetOperation("$") clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index 5b72a1d566f..cb13690c560 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -101,41 +101,34 @@ Public Class sdgOneVarCompareModels frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 3) End If If ucrChkPP.Checked Then - 'clsRPlotFunction.ClearParameters() clsRdenscompFunction.SetRCommand("fitdistrplus::denscomp") clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 3) End If If ucrChkQQ.Checked Then - 'clsRPlotFunction.ClearParameters() clsRqqcompFunction.SetRCommand("fitdistrplus::qqcomp") clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 3) End If If ucrChkDensity.Checked Then - ' clsRPlotFunction.ClearParameters() clsRppcompFunction.SetRCommand("fitdistrplus::ppcomp") clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 3) End If + If ucrSaveDisplayChi.IsComplete Then frmMain.clsRLink.RunScript(clsOperatorforTable.ToScript(), 0) clsRAsDataFrame.ToScript(strTemp) frmMain.clsRLink.RunScript(strTemp, 0) End If - If ucrChkInputChiSquareBreakpoints.Checked Then - frmMain.clsRLink.RunScript(clsOperatorForBreaks.ToScript(), 2) - End If - - End Sub - - Public Sub DisplayChiBreaks() If ucrChkInputChiSquareBreakpoints.Checked Then clsOperatorForBreaks.SetOperation("$") clsOperatorForBreaks.AddParameter(iPosition:=0, clsRFunctionParameter:=clsRGofStat) clsOperatorForBreaks.AddParameter(strParameterValue:="chisqbreaks") + frmMain.clsRLink.RunScript(clsOperatorForBreaks.ToScript(), 2) End If + End Sub Private Sub InitialiseTabs() From 587ab076157edbf519f5f9acd07442cae461ab75 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Fri, 9 Jun 2017 23:17:40 +0300 Subject: [PATCH 014/201] edits --- instat/sdgOneVarCompareModels.vb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index cb13690c560..8a755cade44 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -101,9 +101,10 @@ Public Class sdgOneVarCompareModels frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 3) End If If ucrChkPP.Checked Then - clsRdenscompFunction.SetRCommand("fitdistrplus::denscomp") - clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 3) + clsRppcompFunction.SetRCommand("fitdistrplus::ppcomp") + clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 3) + End If If ucrChkQQ.Checked Then clsRqqcompFunction.SetRCommand("fitdistrplus::qqcomp") @@ -111,12 +112,11 @@ Public Class sdgOneVarCompareModels frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 3) End If If ucrChkDensity.Checked Then - clsRppcompFunction.SetRCommand("fitdistrplus::ppcomp") - clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 3) + clsRdenscompFunction.SetRCommand("fitdistrplus::denscomp") + clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 3) End If - If ucrSaveDisplayChi.IsComplete Then frmMain.clsRLink.RunScript(clsOperatorforTable.ToScript(), 0) clsRAsDataFrame.ToScript(strTemp) From 5c6377461f33fc45c309dac7372ac8d4394d1f10 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Mon, 12 Jun 2017 13:15:22 +0300 Subject: [PATCH 015/201] adding package names correctly --- instat/dlgOneVarCompareModels.vb | 12 ++++++------ instat/sdgOneVarCompareModels.vb | 12 ++++++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index e46fd139288..0e2669fd5c2 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -1,5 +1,4 @@ - -' Instat-R +' R-Instat ' Copyright (C) 2015 ' ' This program is free software: you can redistribute it and/or modify @@ -16,7 +15,6 @@ ' along with this program. If not, see . Imports instat.Translations - Public Class dlgOneVarCompareModels Private bFirstLoad As Boolean = True Private bReset As Boolean = True @@ -64,12 +62,14 @@ Public Class dlgOneVarCompareModels ucrSelectorOneVarCompModels.Reset() - clsGofStat.SetRCommand("fitdistrplus::gofstat") - clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") + clsGofStat.SetPackageName("fitdistrplus") + clsGofStat.SetRCommand("gofstat") + clsRcdfcompFunction.SetPackageName("fitdistrplus") + clsRcdfcompFunction.SetRCommand("cdfcomp") clsOperatorforTable.SetOperation("$") clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) - clsOperatorforTable.AddParameter(strParameterValue:="chisqbreaks") + clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") clsRAsDataFrame.SetRCommand("as.data.frame") clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index 8a755cade44..7b80360b636 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -96,23 +96,27 @@ Public Class sdgOneVarCompareModels Dim strTemp As String = "" If ucrChkCDF.Checked Then - clsRcdfcompFunction.SetRCommand("fitdistrplus::cdfcomp") + clsRcdfcompFunction.SetPackageName("fitdistrplus") + clsRcdfcompFunction.SetRCommand("cdfcomp") clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 3) End If If ucrChkPP.Checked Then - clsRppcompFunction.SetRCommand("fitdistrplus::ppcomp") + clsRppcompFunction.SetPackageName("fitdistrplus") + clsRppcompFunction.SetRCommand("ppcomp") clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 3) End If If ucrChkQQ.Checked Then - clsRqqcompFunction.SetRCommand("fitdistrplus::qqcomp") + clsRqqcompFunction.SetPackageName("fitdistrplus") + clsRqqcompFunction.SetRCommand("qqcomp") clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 3) End If If ucrChkDensity.Checked Then - clsRdenscompFunction.SetRCommand("fitdistrplus::denscomp") + clsRdenscompFunction.SetPackageName("fitdistrplus") + clsRdenscompFunction.SetRCommand("denscomp") clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 3) End If From 55ee87a5db866ed5abb98ca3ebdbef2c9b9b785f Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Tue, 13 Jun 2017 12:17:17 +0300 Subject: [PATCH 016/201] More changes --- instat/dlgOneVarCompareModels.vb | 2 +- instat/sdgOneVarCompareModels.vb | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 0e2669fd5c2..07b7b41ff65 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -122,7 +122,7 @@ Public Class dlgOneVarCompareModels End Sub Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click - sdgOneVarCompareModels.SetRCode(clsGofStat, clsReceiver, clsRdenscompFunction, clsRcdfcompFunction, clsRqqcompFunction, clsRppcompFunction, clsRAsDataFrame, clsOperatorforTable,clsOperatorForBreaks, bResetSubdialog) + sdgOneVarCompareModels.SetRCode(clsGofStat, clsReceiver, clsRdenscompFunction, clsRcdfcompFunction, clsRqqcompFunction, clsRppcompFunction, clsRAsDataFrame, clsOperatorforTable, clsOperatorForBreaks, bResetSubdialog) bResetSubdialog = False sdgOneVarCompareModels.ShowDialog() End Sub diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index 7b80360b636..f5def039534 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -17,7 +17,7 @@ Imports instat.Translations Public Class sdgOneVarCompareModels Private bControlsInitialised As Boolean = False - Private clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRGofStat, clsRReceiver, clsRsyntax, clsRPlotFunction, clsOperation As New RFunction + Private clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRGofStat, clsRGofStat2, clsRReceiver, clsRsyntax, clsRPlotFunction, clsOperation As New RFunction Private clsOperatorforTable, clsOperatorForBreaks As New ROperator Private WithEvents ucrRecs As ucrReceiver Public bfirstload As Boolean = True @@ -32,9 +32,9 @@ Public Class sdgOneVarCompareModels ucrChkInputChiSquareBreakpoints.SetText("Input Chi-Square Breakpoints") 'ucrChkPlots - ucrChkCDF.SetParameter(New RParameter("ft", 1), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkCDF.AddFunctionNamesCondition(True, "cdfcomp") ucrChkCDF.SetText("CDF") - ucrChkCDF.SetRDefault("TRUE") + ucrChkDensity.SetText("Density") ucrChkPP.SetText("PP") ucrChkQQ.SetText("QQ") @@ -67,7 +67,8 @@ Public Class sdgOneVarCompareModels InitialiseControls() End If - clsRGofStat = clsNewRGofStat + clsRGofStat = clsNewRGofStat.Clone + clsRGofStat2 = clsNewRGofStat.Clone clsRReceiver = clsNewReceiver clsOperatorforTable = clsNewOperatorforTable clsRAsDataFrame = clsNewclsRAsDataFrame @@ -122,6 +123,10 @@ Public Class sdgOneVarCompareModels End If If ucrSaveDisplayChi.IsComplete Then + clsOperatorforTable.SetOperation("$") + clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsRGofStat2, iPosition:=0) + clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") + frmMain.clsRLink.RunScript(clsOperatorforTable.ToScript(), 0) clsRAsDataFrame.ToScript(strTemp) frmMain.clsRLink.RunScript(strTemp, 0) From 7fe9aba0bd1fde133afd11083d215a2c29204afe Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Wed, 14 Jun 2017 09:26:58 +0300 Subject: [PATCH 017/201] FIxing combine graph dialog --- instat/dlgCombineforGraphics.Designer.vb | 1 - instat/dlgCombineforGraphics.vb | 4 ++++ instat/sdgCombineGraphOptions.Designer.vb | 5 ++++ instat/sdgCombineGraphOptions.vb | 29 ++++++++++------------- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/instat/dlgCombineforGraphics.Designer.vb b/instat/dlgCombineforGraphics.Designer.vb index 447ae1b05e1..884c4496805 100644 --- a/instat/dlgCombineforGraphics.Designer.vb +++ b/instat/dlgCombineforGraphics.Designer.vb @@ -41,7 +41,6 @@ Partial Class dlgCombineforGraphics ' 'cmdOptions ' - Me.cmdOptions.Enabled = False Me.cmdOptions.Location = New System.Drawing.Point(10, 199) Me.cmdOptions.Name = "cmdOptions" Me.cmdOptions.Size = New System.Drawing.Size(75, 23) diff --git a/instat/dlgCombineforGraphics.vb b/instat/dlgCombineforGraphics.vb index 9dbda5cd8a1..3ffa8e10820 100644 --- a/instat/dlgCombineforGraphics.vb +++ b/instat/dlgCombineforGraphics.vb @@ -96,4 +96,8 @@ Public Class dlgCombineforGraphics Private Sub AllControls_ControlContentsChanged() Handles ucrCombineGraphReceiver.ControlContentsChanged, ucrSave.ControlContentsChanged TestOkEnabled() End Sub + + Private Sub AllControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSave.ControlContentsChanged, ucrCombineGraphReceiver.ControlContentsChanged + + End Sub End Class \ No newline at end of file diff --git a/instat/sdgCombineGraphOptions.Designer.vb b/instat/sdgCombineGraphOptions.Designer.vb index a2f91574a07..ecd149316b1 100644 --- a/instat/sdgCombineGraphOptions.Designer.vb +++ b/instat/sdgCombineGraphOptions.Designer.vb @@ -98,6 +98,7 @@ Partial Class sdgCombineGraphOptions Me.grdLayout.SheetTabNewButtonVisible = True Me.grdLayout.SheetTabVisible = True Me.grdLayout.SheetTabWidth = 60 + Me.grdLayout.ShowScrollEndSpacing = True Me.grdLayout.Size = New System.Drawing.Size(343, 179) Me.grdLayout.TabIndex = 5 Me.grdLayout.Text = "ReoGridControl1" @@ -232,6 +233,7 @@ Partial Class sdgCombineGraphOptions ' 'ucrInputLeft ' + Me.ucrInputLeft.AddQuotesIfUnrecognised = True Me.ucrInputLeft.IsMultiline = False Me.ucrInputLeft.IsReadOnly = False Me.ucrInputLeft.Location = New System.Drawing.Point(60, 100) @@ -241,6 +243,7 @@ Partial Class sdgCombineGraphOptions ' 'ucrInputRight ' + Me.ucrInputRight.AddQuotesIfUnrecognised = True Me.ucrInputRight.IsMultiline = False Me.ucrInputRight.IsReadOnly = False Me.ucrInputRight.Location = New System.Drawing.Point(60, 70) @@ -250,6 +253,7 @@ Partial Class sdgCombineGraphOptions ' 'ucrInputBottom ' + Me.ucrInputBottom.AddQuotesIfUnrecognised = True Me.ucrInputBottom.IsMultiline = False Me.ucrInputBottom.IsReadOnly = False Me.ucrInputBottom.Location = New System.Drawing.Point(60, 42) @@ -259,6 +263,7 @@ Partial Class sdgCombineGraphOptions ' 'ucrInputTop ' + Me.ucrInputTop.AddQuotesIfUnrecognised = True Me.ucrInputTop.IsMultiline = False Me.ucrInputTop.IsReadOnly = False Me.ucrInputTop.Location = New System.Drawing.Point(60, 15) diff --git a/instat/sdgCombineGraphOptions.vb b/instat/sdgCombineGraphOptions.vb index da4bd80e54f..82f35f4cc86 100644 --- a/instat/sdgCombineGraphOptions.vb +++ b/instat/sdgCombineGraphOptions.vb @@ -19,8 +19,6 @@ Public Class sdgCombineGraphOptions Private bFirstLoad As Boolean = True Private bInitialiseControls As Boolean = False Public clsCombineGraph As New RFunction - - Public clsRsyntax As New RSyntax Public WithEvents grdCurrSheet As Worksheet Public clsMatrixFunction As New RFunction @@ -39,12 +37,6 @@ Public Class sdgCombineGraphOptions grdCurrSheet.SetSettings(WorksheetSettings.Edit_DragSelectionToMoveCells, False) End Sub - Private Sub sdgLayout_Load(sender As Object, e As EventArgs) Handles MyBase.Load - Me.BringToFront() - LoadGraphs() - SetDefaultRowAndColumns() - End Sub - Private Sub InitialiseControls() grdCurrSheet.Rows = ucrNudRows.Value grdCurrSheet.Columns = ucrNudColumns.Value @@ -58,7 +50,7 @@ Public Class sdgCombineGraphOptions ucrInputTop.SetParameter(New RParameter("top")) ucrChkSpecifyOrder.SetText("Specify Order") - ucrChkSpecifyOrder.AddToLinkedControls({ucrInputTop, ucrInputRight}, objValues:={True}) + ucrChkSpecifyOrder.Checked = False bInitialiseControls = True End Sub @@ -139,10 +131,9 @@ Public Class sdgCombineGraphOptions End If End Sub - Private Sub chkSpecifyOrder_CheckedChanged() Handles ucrChkSpecifyOrder.ControlValueChanged + Private Sub chkSpecifyOrder_ControlValueChanged() Handles ucrChkSpecifyOrder.ControlValueChanged If ucrChkSpecifyOrder.Checked = True Then grdLayout.Visible = True - 'SetMatrixFunction() SwitchNcolToMatrixFunc() Else grdLayout.Visible = False @@ -151,8 +142,8 @@ Public Class sdgCombineGraphOptions End Sub Public Sub SwitchNcolToMatrixFunc() - clsRsyntax.RemoveParameter("ncol") - clsRsyntax.RemoveParameter("nrow") + clsCombineGraph.RemoveParameterByName("ncol") + clsCombineGraph.RemoveParameterByName("nrow") clsMatrixFunction.AddParameter("ncol", ucrNudColumns.Value) clsMatrixFunction.AddParameter("nrow", ucrNudRows.Value) End Sub @@ -160,9 +151,9 @@ Public Class sdgCombineGraphOptions Public Sub RemoveNcolFromMatrixfunc() clsMatrixFunction.RemoveParameterByName("ncol") clsMatrixFunction.RemoveParameterByName("nrow") - clsRsyntax.RemoveParameter("layout_matrix") - clsRsyntax.AddParameter("nrow", ucrNudRows.Value) - clsRsyntax.AddParameter("ncol", ucrNudColumns.Value) + clsCombineGraph.RemoveParameterByName("layout_matrix") + clsCombineGraph.AddParameter("nrow", ucrNudRows.Value) + clsCombineGraph.AddParameter("ncol", ucrNudColumns.Value) End Sub Private Sub grdLayout_Leave(sender As Object, e As EventArgs) Handles grdLayout.Leave @@ -179,4 +170,10 @@ Public Class sdgCombineGraphOptions clsCombineGraph = clsNewRFunction SetRCode(Me, clsCombineGraph, bReset) End Sub + + Private Sub sdgCombineGraphOptions_Load(sender As Object, e As EventArgs) Handles Me.Load + Me.BringToFront() + LoadGraphs() + SetDefaultRowAndColumns() + End Sub End Class From 3025c298990c67d0f754c7f460be9e80060039c2 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Wed, 14 Jun 2017 16:57:12 +0300 Subject: [PATCH 018/201] Combine graph --- instat/dlgCombineforGraphics.vb | 6 +- instat/sdgCombineGraphOptions.Designer.vb | 158 +++++++++++----------- instat/sdgCombineGraphOptions.vb | 33 ++--- 3 files changed, 97 insertions(+), 100 deletions(-) diff --git a/instat/dlgCombineforGraphics.vb b/instat/dlgCombineforGraphics.vb index 3ffa8e10820..65e7ec6e271 100644 --- a/instat/dlgCombineforGraphics.vb +++ b/instat/dlgCombineforGraphics.vb @@ -89,15 +89,11 @@ Public Class dlgCombineforGraphics Private Sub cmdLayout_Click(sender As Object, e As EventArgs) Handles cmdOptions.Click 'this SetRFunction is still empty in subdialog but will be fixed soon. sdgCombineGraphOptions.SetRFunction(ucrBase.clsRsyntax.clsBaseFunction, bResetSubDialog) - bResetSubDialog = False sdgCombineGraphOptions.ShowDialog() + bResetSubDialog = False End Sub Private Sub AllControls_ControlContentsChanged() Handles ucrCombineGraphReceiver.ControlContentsChanged, ucrSave.ControlContentsChanged TestOkEnabled() End Sub - - Private Sub AllControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSave.ControlContentsChanged, ucrCombineGraphReceiver.ControlContentsChanged - - End Sub End Class \ No newline at end of file diff --git a/instat/sdgCombineGraphOptions.Designer.vb b/instat/sdgCombineGraphOptions.Designer.vb index ecd149316b1..360ddbb1ea0 100644 --- a/instat/sdgCombineGraphOptions.Designer.vb +++ b/instat/sdgCombineGraphOptions.Designer.vb @@ -24,6 +24,9 @@ Partial Class sdgCombineGraphOptions Private Sub InitializeComponent() Me.tbcLayout = New System.Windows.Forms.TabControl() Me.tbpLayout = New System.Windows.Forms.TabPage() + Me.ucrChkSpecifyOrder = New instat.ucrCheck() + Me.ucrNudColumns = New instat.ucrNud() + Me.ucrNudRows = New instat.ucrNud() Me.txtLayoutMessage = New System.Windows.Forms.TextBox() Me.grdLayout = New unvell.ReoGrid.ReoGridControl() Me.lblSelectedgrpahs = New System.Windows.Forms.Label() @@ -31,18 +34,15 @@ Partial Class sdgCombineGraphOptions Me.lblNumberofColumns = New System.Windows.Forms.Label() Me.lblNumberofRows = New System.Windows.Forms.Label() Me.tbpLabels = New System.Windows.Forms.TabPage() + Me.ucrInputLeft = New instat.ucrInputTextBox() + Me.ucrInputRight = New instat.ucrInputTextBox() + Me.ucrInputBottom = New instat.ucrInputTextBox() + Me.ucrInputTop = New instat.ucrInputTextBox() Me.lblLeft = New System.Windows.Forms.Label() Me.LblRight = New System.Windows.Forms.Label() Me.lblBottom = New System.Windows.Forms.Label() Me.lblTop = New System.Windows.Forms.Label() Me.ucrsdgLayoutBase = New instat.ucrButtonsSubdialogue() - Me.ucrChkSpecifyOrder = New instat.ucrCheck() - Me.ucrNudColumns = New instat.ucrNud() - Me.ucrNudRows = New instat.ucrNud() - Me.ucrInputLeft = New instat.ucrInputTextBox() - Me.ucrInputRight = New instat.ucrInputTextBox() - Me.ucrInputBottom = New instat.ucrInputTextBox() - Me.ucrInputTop = New instat.ucrInputTextBox() Me.tbcLayout.SuspendLayout() Me.tbpLayout.SuspendLayout() Me.tbpLabels.SuspendLayout() @@ -77,6 +77,38 @@ Partial Class sdgCombineGraphOptions Me.tbpLayout.Text = "Layout" Me.tbpLayout.UseVisualStyleBackColor = True ' + 'ucrChkSpecifyOrder + ' + Me.ucrChkSpecifyOrder.Checked = False + Me.ucrChkSpecifyOrder.Location = New System.Drawing.Point(11, 147) + Me.ucrChkSpecifyOrder.Name = "ucrChkSpecifyOrder" + Me.ucrChkSpecifyOrder.Size = New System.Drawing.Size(100, 20) + Me.ucrChkSpecifyOrder.TabIndex = 8 + ' + 'ucrNudColumns + ' + Me.ucrNudColumns.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudColumns.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudColumns.Location = New System.Drawing.Point(111, 47) + Me.ucrNudColumns.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudColumns.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudColumns.Name = "ucrNudColumns" + Me.ucrNudColumns.Size = New System.Drawing.Size(50, 20) + Me.ucrNudColumns.TabIndex = 7 + Me.ucrNudColumns.Value = New Decimal(New Integer() {2, 0, 0, 0}) + ' + 'ucrNudRows + ' + Me.ucrNudRows.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudRows.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudRows.Location = New System.Drawing.Point(111, 20) + Me.ucrNudRows.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudRows.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudRows.Name = "ucrNudRows" + Me.ucrNudRows.Size = New System.Drawing.Size(50, 20) + Me.ucrNudRows.TabIndex = 7 + Me.ucrNudRows.Value = New Decimal(New Integer() {2, 0, 0, 0}) + ' 'txtLayoutMessage ' Me.txtLayoutMessage.Location = New System.Drawing.Point(11, 367) @@ -156,6 +188,46 @@ Partial Class sdgCombineGraphOptions Me.tbpLabels.Text = "Labels" Me.tbpLabels.UseVisualStyleBackColor = True ' + 'ucrInputLeft + ' + Me.ucrInputLeft.AddQuotesIfUnrecognised = True + Me.ucrInputLeft.IsMultiline = False + Me.ucrInputLeft.IsReadOnly = False + Me.ucrInputLeft.Location = New System.Drawing.Point(60, 100) + Me.ucrInputLeft.Name = "ucrInputLeft" + Me.ucrInputLeft.Size = New System.Drawing.Size(137, 21) + Me.ucrInputLeft.TabIndex = 7 + ' + 'ucrInputRight + ' + Me.ucrInputRight.AddQuotesIfUnrecognised = True + Me.ucrInputRight.IsMultiline = False + Me.ucrInputRight.IsReadOnly = False + Me.ucrInputRight.Location = New System.Drawing.Point(60, 70) + Me.ucrInputRight.Name = "ucrInputRight" + Me.ucrInputRight.Size = New System.Drawing.Size(137, 21) + Me.ucrInputRight.TabIndex = 5 + ' + 'ucrInputBottom + ' + Me.ucrInputBottom.AddQuotesIfUnrecognised = True + Me.ucrInputBottom.IsMultiline = False + Me.ucrInputBottom.IsReadOnly = False + Me.ucrInputBottom.Location = New System.Drawing.Point(60, 42) + Me.ucrInputBottom.Name = "ucrInputBottom" + Me.ucrInputBottom.Size = New System.Drawing.Size(137, 21) + Me.ucrInputBottom.TabIndex = 3 + ' + 'ucrInputTop + ' + Me.ucrInputTop.AddQuotesIfUnrecognised = True + Me.ucrInputTop.IsMultiline = False + Me.ucrInputTop.IsReadOnly = False + Me.ucrInputTop.Location = New System.Drawing.Point(60, 15) + Me.ucrInputTop.Name = "ucrInputTop" + Me.ucrInputTop.Size = New System.Drawing.Size(137, 21) + Me.ucrInputTop.TabIndex = 1 + ' 'lblLeft ' Me.lblLeft.AutoSize = True @@ -199,78 +271,6 @@ Partial Class sdgCombineGraphOptions Me.ucrsdgLayoutBase.Size = New System.Drawing.Size(142, 30) Me.ucrsdgLayoutBase.TabIndex = 3 ' - 'ucrChkSpecifyOrder - ' - Me.ucrChkSpecifyOrder.Checked = False - Me.ucrChkSpecifyOrder.Location = New System.Drawing.Point(11, 148) - Me.ucrChkSpecifyOrder.Name = "ucrChkSpecifyOrder" - Me.ucrChkSpecifyOrder.Size = New System.Drawing.Size(100, 20) - Me.ucrChkSpecifyOrder.TabIndex = 8 - ' - 'ucrNudColumns - ' - Me.ucrNudColumns.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudColumns.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudColumns.Location = New System.Drawing.Point(111, 47) - Me.ucrNudColumns.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudColumns.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudColumns.Name = "ucrNudColumns" - Me.ucrNudColumns.Size = New System.Drawing.Size(50, 20) - Me.ucrNudColumns.TabIndex = 7 - Me.ucrNudColumns.Value = New Decimal(New Integer() {2, 0, 0, 0}) - ' - 'ucrNudRows - ' - Me.ucrNudRows.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudRows.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudRows.Location = New System.Drawing.Point(111, 20) - Me.ucrNudRows.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudRows.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudRows.Name = "ucrNudRows" - Me.ucrNudRows.Size = New System.Drawing.Size(50, 20) - Me.ucrNudRows.TabIndex = 7 - Me.ucrNudRows.Value = New Decimal(New Integer() {2, 0, 0, 0}) - ' - 'ucrInputLeft - ' - Me.ucrInputLeft.AddQuotesIfUnrecognised = True - Me.ucrInputLeft.IsMultiline = False - Me.ucrInputLeft.IsReadOnly = False - Me.ucrInputLeft.Location = New System.Drawing.Point(60, 100) - Me.ucrInputLeft.Name = "ucrInputLeft" - Me.ucrInputLeft.Size = New System.Drawing.Size(137, 21) - Me.ucrInputLeft.TabIndex = 7 - ' - 'ucrInputRight - ' - Me.ucrInputRight.AddQuotesIfUnrecognised = True - Me.ucrInputRight.IsMultiline = False - Me.ucrInputRight.IsReadOnly = False - Me.ucrInputRight.Location = New System.Drawing.Point(60, 70) - Me.ucrInputRight.Name = "ucrInputRight" - Me.ucrInputRight.Size = New System.Drawing.Size(137, 21) - Me.ucrInputRight.TabIndex = 5 - ' - 'ucrInputBottom - ' - Me.ucrInputBottom.AddQuotesIfUnrecognised = True - Me.ucrInputBottom.IsMultiline = False - Me.ucrInputBottom.IsReadOnly = False - Me.ucrInputBottom.Location = New System.Drawing.Point(60, 42) - Me.ucrInputBottom.Name = "ucrInputBottom" - Me.ucrInputBottom.Size = New System.Drawing.Size(137, 21) - Me.ucrInputBottom.TabIndex = 3 - ' - 'ucrInputTop - ' - Me.ucrInputTop.AddQuotesIfUnrecognised = True - Me.ucrInputTop.IsMultiline = False - Me.ucrInputTop.IsReadOnly = False - Me.ucrInputTop.Location = New System.Drawing.Point(60, 15) - Me.ucrInputTop.Name = "ucrInputTop" - Me.ucrInputTop.Size = New System.Drawing.Size(137, 21) - Me.ucrInputTop.TabIndex = 1 - ' 'sdgCombineGraphOptions ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) diff --git a/instat/sdgCombineGraphOptions.vb b/instat/sdgCombineGraphOptions.vb index 82f35f4cc86..74a025a1c9f 100644 --- a/instat/sdgCombineGraphOptions.vb +++ b/instat/sdgCombineGraphOptions.vb @@ -48,9 +48,10 @@ Public Class sdgCombineGraphOptions ucrInputLeft.SetParameter(New RParameter("left")) ucrInputRight.SetParameter(New RParameter("right")) ucrInputTop.SetParameter(New RParameter("top")) - + grdLayout.Visible = False + ucrChkSpecifyOrder.AddParameterPresentCondition(True, "ncol") + ucrChkSpecifyOrder.AddParameterPresentCondition(True, "nrow") ucrChkSpecifyOrder.SetText("Specify Order") - ucrChkSpecifyOrder.Checked = False bInitialiseControls = True End Sub @@ -131,16 +132,6 @@ Public Class sdgCombineGraphOptions End If End Sub - Private Sub chkSpecifyOrder_ControlValueChanged() Handles ucrChkSpecifyOrder.ControlValueChanged - If ucrChkSpecifyOrder.Checked = True Then - grdLayout.Visible = True - SwitchNcolToMatrixFunc() - Else - grdLayout.Visible = False - RemoveNcolFromMatrixfunc() - End If - End Sub - Public Sub SwitchNcolToMatrixFunc() clsCombineGraph.RemoveParameterByName("ncol") clsCombineGraph.RemoveParameterByName("nrow") @@ -166,14 +157,24 @@ Public Class sdgCombineGraphOptions If Not bInitialiseControls Then InitialiseControls() End If - clsCombineGraph = clsNewRFunction SetRCode(Me, clsCombineGraph, bReset) + SetDefaultRowAndColumns() End Sub - Private Sub sdgCombineGraphOptions_Load(sender As Object, e As EventArgs) Handles Me.Load - Me.BringToFront() + Private Sub chkrdoSpecifyOrder_CheckedChanged() Handles ucrChkSpecifyOrder.ControlValueChanged + If ucrChkSpecifyOrder.Checked Then + grdLayout.Visible = True + SwitchNcolToMatrixFunc() + Else + grdLayout.Visible = False + RemoveNcolFromMatrixfunc() + End If + End Sub + + Private Sub sdgCombineGraphOptions_Load(sender As Object, e As EventArgs) Handles MyBase.Load LoadGraphs() - SetDefaultRowAndColumns() End Sub End Class + + From fba06628a9f147dfc570432d0a0b19b847494645 Mon Sep 17 00:00:00 2001 From: Lily Date: Wed, 14 Jun 2017 15:36:50 +0100 Subject: [PATCH 019/201] Layout edits --- instat/dlgCombineforGraphics.vb | 2 - instat/sdgCombineGraphOptions.Designer.vb | 52 +++++++++++------------ instat/sdgCombineGraphOptions.vb | 25 +++++------ 3 files changed, 39 insertions(+), 40 deletions(-) diff --git a/instat/dlgCombineforGraphics.vb b/instat/dlgCombineforGraphics.vb index 65e7ec6e271..bd8ad7c42d0 100644 --- a/instat/dlgCombineforGraphics.vb +++ b/instat/dlgCombineforGraphics.vb @@ -23,9 +23,7 @@ Public Class dlgCombineforGraphics If bFirstLoad Then InitialiseDialog() bFirstLoad = False - End If - If bReset Then SetDefaults() End If diff --git a/instat/sdgCombineGraphOptions.Designer.vb b/instat/sdgCombineGraphOptions.Designer.vb index 360ddbb1ea0..6a32816649d 100644 --- a/instat/sdgCombineGraphOptions.Designer.vb +++ b/instat/sdgCombineGraphOptions.Designer.vb @@ -52,7 +52,7 @@ Partial Class sdgCombineGraphOptions ' Me.tbcLayout.Controls.Add(Me.tbpLayout) Me.tbcLayout.Controls.Add(Me.tbpLabels) - Me.tbcLayout.Location = New System.Drawing.Point(13, 13) + Me.tbcLayout.Location = New System.Drawing.Point(3, 5) Me.tbcLayout.Name = "tbcLayout" Me.tbcLayout.SelectedIndex = 0 Me.tbcLayout.Size = New System.Drawing.Size(379, 419) @@ -80,33 +80,33 @@ Partial Class sdgCombineGraphOptions 'ucrChkSpecifyOrder ' Me.ucrChkSpecifyOrder.Checked = False - Me.ucrChkSpecifyOrder.Location = New System.Drawing.Point(11, 147) + Me.ucrChkSpecifyOrder.Location = New System.Drawing.Point(10, 153) Me.ucrChkSpecifyOrder.Name = "ucrChkSpecifyOrder" Me.ucrChkSpecifyOrder.Size = New System.Drawing.Size(100, 20) - Me.ucrChkSpecifyOrder.TabIndex = 8 + Me.ucrChkSpecifyOrder.TabIndex = 6 ' 'ucrNudColumns ' Me.ucrNudColumns.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudColumns.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudColumns.Location = New System.Drawing.Point(111, 47) + Me.ucrNudColumns.Location = New System.Drawing.Point(113, 46) Me.ucrNudColumns.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudColumns.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudColumns.Name = "ucrNudColumns" Me.ucrNudColumns.Size = New System.Drawing.Size(50, 20) - Me.ucrNudColumns.TabIndex = 7 + Me.ucrNudColumns.TabIndex = 3 Me.ucrNudColumns.Value = New Decimal(New Integer() {2, 0, 0, 0}) ' 'ucrNudRows ' Me.ucrNudRows.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudRows.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudRows.Location = New System.Drawing.Point(111, 20) + Me.ucrNudRows.Location = New System.Drawing.Point(113, 20) Me.ucrNudRows.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudRows.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudRows.Name = "ucrNudRows" Me.ucrNudRows.Size = New System.Drawing.Size(50, 20) - Me.ucrNudRows.TabIndex = 7 + Me.ucrNudRows.TabIndex = 1 Me.ucrNudRows.Value = New Decimal(New Integer() {2, 0, 0, 0}) ' 'txtLayoutMessage @@ -115,7 +115,7 @@ Partial Class sdgCombineGraphOptions Me.txtLayoutMessage.Name = "txtLayoutMessage" Me.txtLayoutMessage.ReadOnly = True Me.txtLayoutMessage.Size = New System.Drawing.Size(342, 20) - Me.txtLayoutMessage.TabIndex = 6 + Me.txtLayoutMessage.TabIndex = 8 ' 'grdLayout ' @@ -132,7 +132,7 @@ Partial Class sdgCombineGraphOptions Me.grdLayout.SheetTabWidth = 60 Me.grdLayout.ShowScrollEndSpacing = True Me.grdLayout.Size = New System.Drawing.Size(343, 179) - Me.grdLayout.TabIndex = 5 + Me.grdLayout.TabIndex = 7 Me.grdLayout.Text = "ReoGridControl1" ' 'lblSelectedgrpahs @@ -141,7 +141,7 @@ Partial Class sdgCombineGraphOptions Me.lblSelectedgrpahs.Location = New System.Drawing.Point(232, 19) Me.lblSelectedgrpahs.Name = "lblSelectedgrpahs" Me.lblSelectedgrpahs.Size = New System.Drawing.Size(89, 13) - Me.lblSelectedgrpahs.TabIndex = 2 + Me.lblSelectedgrpahs.TabIndex = 4 Me.lblSelectedgrpahs.Text = "Selected Graphs:" ' 'lstGraphs @@ -150,24 +150,24 @@ Partial Class sdgCombineGraphOptions Me.lstGraphs.Location = New System.Drawing.Point(233, 34) Me.lstGraphs.Name = "lstGraphs" Me.lstGraphs.Size = New System.Drawing.Size(120, 134) - Me.lstGraphs.TabIndex = 3 + Me.lstGraphs.TabIndex = 5 ' 'lblNumberofColumns ' Me.lblNumberofColumns.AutoSize = True - Me.lblNumberofColumns.Location = New System.Drawing.Point(8, 50) + Me.lblNumberofColumns.Location = New System.Drawing.Point(10, 49) Me.lblNumberofColumns.Name = "lblNumberofColumns" Me.lblNumberofColumns.Size = New System.Drawing.Size(102, 13) - Me.lblNumberofColumns.TabIndex = 1 + Me.lblNumberofColumns.TabIndex = 2 Me.lblNumberofColumns.Text = "Number of Columns:" ' 'lblNumberofRows ' Me.lblNumberofRows.AutoSize = True - Me.lblNumberofRows.Location = New System.Drawing.Point(8, 24) + Me.lblNumberofRows.Location = New System.Drawing.Point(10, 23) Me.lblNumberofRows.Name = "lblNumberofRows" Me.lblNumberofRows.Size = New System.Drawing.Size(89, 13) - Me.lblNumberofRows.TabIndex = 1 + Me.lblNumberofRows.TabIndex = 0 Me.lblNumberofRows.Text = "Number of Rows:" ' 'tbpLabels @@ -193,7 +193,7 @@ Partial Class sdgCombineGraphOptions Me.ucrInputLeft.AddQuotesIfUnrecognised = True Me.ucrInputLeft.IsMultiline = False Me.ucrInputLeft.IsReadOnly = False - Me.ucrInputLeft.Location = New System.Drawing.Point(60, 100) + Me.ucrInputLeft.Location = New System.Drawing.Point(59, 105) Me.ucrInputLeft.Name = "ucrInputLeft" Me.ucrInputLeft.Size = New System.Drawing.Size(137, 21) Me.ucrInputLeft.TabIndex = 7 @@ -203,7 +203,7 @@ Partial Class sdgCombineGraphOptions Me.ucrInputRight.AddQuotesIfUnrecognised = True Me.ucrInputRight.IsMultiline = False Me.ucrInputRight.IsReadOnly = False - Me.ucrInputRight.Location = New System.Drawing.Point(60, 70) + Me.ucrInputRight.Location = New System.Drawing.Point(59, 75) Me.ucrInputRight.Name = "ucrInputRight" Me.ucrInputRight.Size = New System.Drawing.Size(137, 21) Me.ucrInputRight.TabIndex = 5 @@ -213,7 +213,7 @@ Partial Class sdgCombineGraphOptions Me.ucrInputBottom.AddQuotesIfUnrecognised = True Me.ucrInputBottom.IsMultiline = False Me.ucrInputBottom.IsReadOnly = False - Me.ucrInputBottom.Location = New System.Drawing.Point(60, 42) + Me.ucrInputBottom.Location = New System.Drawing.Point(59, 47) Me.ucrInputBottom.Name = "ucrInputBottom" Me.ucrInputBottom.Size = New System.Drawing.Size(137, 21) Me.ucrInputBottom.TabIndex = 3 @@ -223,7 +223,7 @@ Partial Class sdgCombineGraphOptions Me.ucrInputTop.AddQuotesIfUnrecognised = True Me.ucrInputTop.IsMultiline = False Me.ucrInputTop.IsReadOnly = False - Me.ucrInputTop.Location = New System.Drawing.Point(60, 15) + Me.ucrInputTop.Location = New System.Drawing.Point(59, 20) Me.ucrInputTop.Name = "ucrInputTop" Me.ucrInputTop.Size = New System.Drawing.Size(137, 21) Me.ucrInputTop.TabIndex = 1 @@ -231,7 +231,7 @@ Partial Class sdgCombineGraphOptions 'lblLeft ' Me.lblLeft.AutoSize = True - Me.lblLeft.Location = New System.Drawing.Point(15, 104) + Me.lblLeft.Location = New System.Drawing.Point(10, 109) Me.lblLeft.Name = "lblLeft" Me.lblLeft.Size = New System.Drawing.Size(28, 13) Me.lblLeft.TabIndex = 6 @@ -240,7 +240,7 @@ Partial Class sdgCombineGraphOptions 'LblRight ' Me.LblRight.AutoSize = True - Me.LblRight.Location = New System.Drawing.Point(15, 73) + Me.LblRight.Location = New System.Drawing.Point(10, 79) Me.LblRight.Name = "LblRight" Me.LblRight.Size = New System.Drawing.Size(35, 13) Me.LblRight.TabIndex = 4 @@ -249,7 +249,7 @@ Partial Class sdgCombineGraphOptions 'lblBottom ' Me.lblBottom.AutoSize = True - Me.lblBottom.Location = New System.Drawing.Point(15, 46) + Me.lblBottom.Location = New System.Drawing.Point(10, 50) Me.lblBottom.Name = "lblBottom" Me.lblBottom.Size = New System.Drawing.Size(43, 13) Me.lblBottom.TabIndex = 2 @@ -258,7 +258,7 @@ Partial Class sdgCombineGraphOptions 'lblTop ' Me.lblTop.AutoSize = True - Me.lblTop.Location = New System.Drawing.Point(15, 18) + Me.lblTop.Location = New System.Drawing.Point(10, 23) Me.lblTop.Name = "lblTop" Me.lblTop.Size = New System.Drawing.Size(29, 13) Me.lblTop.TabIndex = 0 @@ -266,16 +266,16 @@ Partial Class sdgCombineGraphOptions ' 'ucrsdgLayoutBase ' - Me.ucrsdgLayoutBase.Location = New System.Drawing.Point(121, 438) + Me.ucrsdgLayoutBase.Location = New System.Drawing.Point(117, 427) Me.ucrsdgLayoutBase.Name = "ucrsdgLayoutBase" Me.ucrsdgLayoutBase.Size = New System.Drawing.Size(142, 30) - Me.ucrsdgLayoutBase.TabIndex = 3 + Me.ucrsdgLayoutBase.TabIndex = 0 ' 'sdgCombineGraphOptions ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(404, 469) + Me.ClientSize = New System.Drawing.Size(385, 460) Me.Controls.Add(Me.ucrsdgLayoutBase) Me.Controls.Add(Me.tbcLayout) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow diff --git a/instat/sdgCombineGraphOptions.vb b/instat/sdgCombineGraphOptions.vb index 74a025a1c9f..b57ee2ed82c 100644 --- a/instat/sdgCombineGraphOptions.vb +++ b/instat/sdgCombineGraphOptions.vb @@ -23,7 +23,6 @@ Public Class sdgCombineGraphOptions Public clsMatrixFunction As New RFunction Public Sub New() - ' This call is required by the designer. InitializeComponent() @@ -41,13 +40,14 @@ Public Class sdgCombineGraphOptions grdCurrSheet.Rows = ucrNudRows.Value grdCurrSheet.Columns = ucrNudColumns.Value - ucrNudColumns.SetParameter(New RParameter("ncol")) - ucrNudRows.SetParameter(New RParameter("nrow")) + ucrNudColumns.SetParameter(New RParameter("ncol", 1)) + ucrNudRows.SetParameter(New RParameter("nrow", 2)) + + ucrInputTop.SetParameter(New RParameter("top", 2)) + ucrInputBottom.SetParameter(New RParameter("bottom", 4)) + ucrInputLeft.SetParameter(New RParameter("left", 5)) + ucrInputRight.SetParameter(New RParameter("right", 6)) - ucrInputBottom.SetParameter(New RParameter("bottom")) - ucrInputLeft.SetParameter(New RParameter("left")) - ucrInputRight.SetParameter(New RParameter("right")) - ucrInputTop.SetParameter(New RParameter("top")) grdLayout.Visible = False ucrChkSpecifyOrder.AddParameterPresentCondition(True, "ncol") ucrChkSpecifyOrder.AddParameterPresentCondition(True, "nrow") @@ -132,14 +132,14 @@ Public Class sdgCombineGraphOptions End If End Sub - Public Sub SwitchNcolToMatrixFunc() + Public Sub SwitchNColToMatrixFunc() clsCombineGraph.RemoveParameterByName("ncol") clsCombineGraph.RemoveParameterByName("nrow") clsMatrixFunction.AddParameter("ncol", ucrNudColumns.Value) clsMatrixFunction.AddParameter("nrow", ucrNudRows.Value) End Sub - Public Sub RemoveNcolFromMatrixfunc() + Public Sub RemoveNColFromMatrixfunc() clsMatrixFunction.RemoveParameterByName("ncol") clsMatrixFunction.RemoveParameterByName("nrow") clsCombineGraph.RemoveParameterByName("layout_matrix") @@ -153,6 +153,7 @@ Public Class sdgCombineGraphOptions SetMatrixFunction() End If End Sub + Public Sub SetRFunction(clsNewRFunction As RFunction, Optional bReset As Boolean = False) If Not bInitialiseControls Then InitialiseControls() @@ -162,13 +163,13 @@ Public Class sdgCombineGraphOptions SetDefaultRowAndColumns() End Sub - Private Sub chkrdoSpecifyOrder_CheckedChanged() Handles ucrChkSpecifyOrder.ControlValueChanged + Private Sub ucrChkSpecifyOrder_ControlValueChanged() Handles ucrChkSpecifyOrder.ControlValueChanged If ucrChkSpecifyOrder.Checked Then grdLayout.Visible = True - SwitchNcolToMatrixFunc() + SwitchNColToMatrixFunc() Else grdLayout.Visible = False - RemoveNcolFromMatrixfunc() + RemoveNColFromMatrixfunc() End If End Sub From 7c44a8ec155757ad945c4116250f23f79d7de1ce Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 14 Jun 2017 21:49:08 +0300 Subject: [PATCH 020/201] Bug curb on second run of the dlg --- instat/dlgOneVarUseModel.vb | 2 ++ instat/dlgTwoVariableUseModel.vb | 2 ++ 2 files changed, 4 insertions(+) diff --git a/instat/dlgOneVarUseModel.vb b/instat/dlgOneVarUseModel.vb index 9a6452704ad..027a42dd843 100644 --- a/instat/dlgOneVarUseModel.vb +++ b/instat/dlgOneVarUseModel.vb @@ -40,6 +40,8 @@ Public Class dlgOneVarUseModel End Sub Private Sub InitialiseDialog() + 'Temp fix: Bugs on second running- an inifinite loop is created + sdgOneVarUseModFit.rdoCIcdf.Enabled = False ucrBase.iHelpTopicID = 375 ucrBase.clsRsyntax.iCallType = 2 ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False diff --git a/instat/dlgTwoVariableUseModel.vb b/instat/dlgTwoVariableUseModel.vb index d87b2559b3e..5f76f6430ae 100644 --- a/instat/dlgTwoVariableUseModel.vb +++ b/instat/dlgTwoVariableUseModel.vb @@ -42,6 +42,8 @@ Public Class dlgTwoVariableUseModel End Sub Private Sub InitialiseDialog() + 'Temporary fix: Bugs if you run the dialogue the second time + sdgSimpleRegOptions.chkFittedModel.Enabled = False 'ucrBase.iHelpTopicID = ucrBaseUseModel.clsRsyntax.SetOperation("+") ucrReceiverUseModel.SetItemType("model") From e80f72359fb1e751cf489d1219ee3951c1489f6a Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 14 Jun 2017 21:51:24 +0300 Subject: [PATCH 021/201] changed icall type --- instat/sdgOneVarCompareModels.vb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index 2d2d5ef0204..fc67bfa4b19 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -105,19 +105,19 @@ Public Class sdgOneVarCompareModels If chkCDF.Checked Then clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiver.GetVariables()) - frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 2) + frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 3) End If If chkPP.Checked Then clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiver.GetVariables()) - frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 2) + frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 3) End If If chkQQ.Checked Then clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiver.GetVariables()) - frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 2) + frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 3) End If If chkDensity.Checked Then clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=dlgOneVarCompareModels.UcrReceiver.GetVariables()) - frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 2) + frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 3) End If If chkSaveChi.Checked Then frmMain.clsRLink.RunScript(clsOperatorforTable.ToScript(), 0) From 40cc9d62543c8bbb5219c55090400e9073b45433 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 14 Jun 2017 21:55:32 +0300 Subject: [PATCH 022/201] edits --- instat/sdgPlots.vb | 11 ++++++++--- instat/sdgThemes.vb | 29 ++++++++++++++++++----------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/instat/sdgPlots.vb b/instat/sdgPlots.vb index 90d0cf6233b..2067079feb5 100644 --- a/instat/sdgPlots.vb +++ b/instat/sdgPlots.vb @@ -169,7 +169,11 @@ Public Class sdgPlots ucrYAxis.InitialiseControl() 'themes tab - ucrInputThemes.SetParameter(New RParameter("theme_name")) + urChkSelectTheme.SetText("Select Theme:") + ucrInputThemes.SetParameter(New RParameter("theme")) + urChkSelectTheme.AddToLinkedControls(ucrInputThemes, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="theme_grey") + urChkSelectTheme.AddParameterPresentCondition(True, "theme") + urChkSelectTheme.AddParameterPresentCondition(False, "theme", False) strThemes = GgplotDefaults.strThemes 'Would prefer to do this through functions but auto updating function name not currently supported through combo box control For Each strTemp As String In strThemes @@ -180,7 +184,7 @@ Public Class sdgPlots End If Next ucrInputThemes.SetItems(dctThemes) - ucrInputThemes.SetRDefault("theme_grey()") + ' ucrInputThemes.SetRDefault("theme_grey()") ucrInputThemes.SetDropDownStyleAsNonEditable() InitialiseTabs() @@ -244,7 +248,8 @@ Public Class sdgPlots ucrInputGraphTitle.SetRCode(clsLabsFunction, bReset) ucrInputGraphSubTitle.SetRCode(clsLabsFunction, bReset) ucrInputGraphCaption.SetRCode(clsLabsFunction, bReset) - ucrInputThemes.SetRCode(clsBaseOperator) + urChkSelectTheme.SetRCode(clsBaseOperator, bReset) + ucrInputThemes.SetRCode(clsBaseOperator, bReset) 'ucrInputLegend.SetRCode(clsNewLabsFunction, bReset) ucrPnlHorizonatalVertical.SetRCode(clsFacetFunction, bReset) diff --git a/instat/sdgThemes.vb b/instat/sdgThemes.vb index 2d2be0730e9..413ed22f825 100644 --- a/instat/sdgThemes.vb +++ b/instat/sdgThemes.vb @@ -107,14 +107,16 @@ Public Class sdgThemes dctLegendPosition.Add("Top", Chr(34) & "top" & Chr(34)) dctLegendPosition.Add("Bottom", Chr(34) & "bottom" & Chr(34)) ucrInputLegendPosition.SetItems(dctLegendPosition) - ucrInputLegendPosition.SetRDefault(Chr(34) & "none" & Chr(34)) + urChkLegendPosition.AddParameterPresentCondition(True, "legend.position") + urChkLegendPosition.AddParameterPresentCondition(False, "legend.position", False) ucrChkLegendBox.SetText("Legend Layout") ucrInputLegendBox.SetParameter(New RParameter("legend.box")) dctLegendBox.Add("Vertical", Chr(34) & "vertical" & Chr(34)) dctLegendBox.Add("Horizontal", Chr(34) & "horizontal" & Chr(34)) ucrInputLegendBox.SetItems(dctLegendBox) - ucrInputLegendBox.SetRDefault(Chr(34) & "vertical" & Chr(34)) + ucrChkLegendBox.AddParameterPresentCondition(True, "legend.box") + ucrChkLegendBox.AddParameterPresentCondition(False, "legend.box", False) urChkLegendBoxJust.SetText("Justify Legend Box") ucrInputLegendBoxJust.SetParameter(New RParameter("legend.box.just")) @@ -123,14 +125,17 @@ Public Class sdgThemes dctLegendBoxJust.Add("Right", Chr(34) & "right" & Chr(34)) dctLegendBoxJust.Add("Left", Chr(34) & "left" & Chr(34)) ucrInputLegendBoxJust.SetItems(dctLegendBoxJust) - ucrInputLegendBoxJust.SetRDefault(Chr(34) & "top" & Chr(34)) + urChkLegendBoxJust.AddParameterPresentCondition(True, "legend.box.just") + urChkLegendBoxJust.AddParameterPresentCondition(False, "legend.box.just", False) ucrChkLegendDirection.SetText("Legend Direction") ucrInputLegendDirection.SetParameter(New RParameter("legend.direction")) dctLegendDirection.Add("Vertical", Chr(34) & "vertical" & Chr(34)) dctLegendDirection.Add("Horizontal", Chr(34) & "horizontal" & Chr(34)) ucrInputLegendDirection.SetItems(dctLegendDirection) - ucrInputLegendDirection.SetRDefault(Chr(34) & "vertical" & Chr(34)) + ucrChkLegendDirection.AddParameterPresentCondition(True, "legend.direction") + ucrChkLegendDirection.AddParameterPresentCondition(False, "legend.direction", False) + ucrChkLegendJustification.SetText("Legend Justification") ucrInputLegendJustification.SetParameter(New RParameter("legend.justification")) @@ -140,13 +145,15 @@ Public Class sdgThemes dctLegendJustification.Add("Left", Chr(34) & "left" & Chr(34)) dctLegendJustification.Add("Center", Chr(34) & "centre" & Chr(34)) ucrInputLegendJustification.SetItems(dctLegendJustification) - ucrInputLegendJustification.SetRDefault(Chr(34) & "top" & Chr(34)) + ucrChkLegendJustification.AddParameterPresentCondition(True, "legend.justification") + ucrChkLegendJustification.AddParameterPresentCondition(False, "legend.justification", False) + - urChkLegendPosition.AddToLinkedControls(ucrInputLegendPosition, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkLegendBox.AddToLinkedControls(ucrInputLegendBox, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - urChkLegendBoxJust.AddToLinkedControls(ucrInputLegendBoxJust, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkLegendDirection.AddToLinkedControls(ucrInputLegendDirection, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkLegendJustification.AddToLinkedControls(ucrInputLegendJustification, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + urChkLegendPosition.AddToLinkedControls(ucrInputLegendPosition, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="None") + ucrChkLegendBox.AddToLinkedControls(ucrInputLegendBox, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Vertical") + urChkLegendBoxJust.AddToLinkedControls(ucrInputLegendBoxJust, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Top") + ucrChkLegendDirection.AddToLinkedControls(ucrInputLegendDirection, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Vertical") + ucrChkLegendJustification.AddToLinkedControls(ucrInputLegendJustification, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Top") End Sub @@ -326,7 +333,7 @@ Public Class sdgThemes ucrPanelBackGround.SetRCodeForControl("panel.background", clsElementPanelBackGround, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPanelBorder.SetRCodeForControl("panel.border", clsElementBorder, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) - ucrPlotBackGround.SetRCodeForControl("plot.background", clsElementPlotBackground, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) + ucrPlotBackground.SetRCodeForControl("plot.background", clsElementPlotBackground, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPlotCaption.SetRCodeForControl("plot.caption", clsElementPlotCaption, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPlotSubTitle.SetRCodeForControl("plot.subtitle", clsElementPlotSubtitle, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPlotTitle.SetRCodeForControl("plot.title", clsElementPlotTitle, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) From 3fabf02179f10c4bc97dc3d5cc95ec96f00c0b99 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 14 Jun 2017 21:57:44 +0300 Subject: [PATCH 023/201] edits --- instat/sdgPlots.Designer.vb | 49 ++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/instat/sdgPlots.Designer.vb b/instat/sdgPlots.Designer.vb index 875f003b92f..6343d80f124 100644 --- a/instat/sdgPlots.Designer.vb +++ b/instat/sdgPlots.Designer.vb @@ -63,11 +63,11 @@ Partial Class sdgPlots Me.GroupBox1 = New System.Windows.Forms.GroupBox() Me.lblFont = New System.Windows.Forms.Label() Me.cmdAllOptions = New System.Windows.Forms.Button() - Me.lblTheme = New System.Windows.Forms.Label() - Me.ucrInputThemes = New instat.ucrInputComboBox() Me.tbpCoordinates = New System.Windows.Forms.TabPage() Me.lblWarning = New System.Windows.Forms.Label() Me.ucrBaseSubdialog = New instat.ucrButtonsSubdialogue() + Me.urChkSelectTheme = New instat.ucrCheck() + Me.ucrInputThemes = New instat.ucrInputComboBox() Me.tbpPlotsOptions.SuspendLayout() Me.tbpFacet.SuspendLayout() Me.tbpLayers.SuspendLayout() @@ -467,11 +467,11 @@ Partial Class sdgPlots ' 'tbpThemes ' + Me.tbpThemes.Controls.Add(Me.urChkSelectTheme) + Me.tbpThemes.Controls.Add(Me.ucrInputThemes) Me.tbpThemes.Controls.Add(Me.GroupBox1) Me.tbpThemes.Controls.Add(Me.lblFont) Me.tbpThemes.Controls.Add(Me.cmdAllOptions) - Me.tbpThemes.Controls.Add(Me.lblTheme) - Me.tbpThemes.Controls.Add(Me.ucrInputThemes) Me.tbpThemes.Location = New System.Drawing.Point(4, 22) Me.tbpThemes.Name = "tbpThemes" Me.tbpThemes.Padding = New System.Windows.Forms.Padding(3) @@ -500,31 +500,13 @@ Partial Class sdgPlots ' 'cmdAllOptions ' - Me.cmdAllOptions.Location = New System.Drawing.Point(275, 18) + Me.cmdAllOptions.Location = New System.Drawing.Point(295, 17) Me.cmdAllOptions.Name = "cmdAllOptions" Me.cmdAllOptions.Size = New System.Drawing.Size(78, 23) Me.cmdAllOptions.TabIndex = 2 Me.cmdAllOptions.Text = "All Options" Me.cmdAllOptions.UseVisualStyleBackColor = True ' - 'lblTheme - ' - Me.lblTheme.AutoSize = True - Me.lblTheme.Location = New System.Drawing.Point(8, 22) - Me.lblTheme.Name = "lblTheme" - Me.lblTheme.Size = New System.Drawing.Size(76, 13) - Me.lblTheme.TabIndex = 0 - Me.lblTheme.Text = "Select Theme:" - ' - 'ucrInputThemes - ' - Me.ucrInputThemes.AddQuotesIfUnrecognised = True - Me.ucrInputThemes.IsReadOnly = False - Me.ucrInputThemes.Location = New System.Drawing.Point(87, 19) - Me.ucrInputThemes.Name = "ucrInputThemes" - Me.ucrInputThemes.Size = New System.Drawing.Size(171, 21) - Me.ucrInputThemes.TabIndex = 1 - ' 'tbpCoordinates ' Me.tbpCoordinates.Controls.Add(Me.lblWarning) @@ -553,6 +535,23 @@ Partial Class sdgPlots Me.ucrBaseSubdialog.Size = New System.Drawing.Size(160, 41) Me.ucrBaseSubdialog.TabIndex = 1 ' + 'urChkSelectTheme + ' + Me.urChkSelectTheme.Checked = False + Me.urChkSelectTheme.Location = New System.Drawing.Point(6, 18) + Me.urChkSelectTheme.Name = "urChkSelectTheme" + Me.urChkSelectTheme.Size = New System.Drawing.Size(97, 20) + Me.urChkSelectTheme.TabIndex = 108 + ' + 'ucrInputThemes + ' + Me.ucrInputThemes.AddQuotesIfUnrecognised = True + Me.ucrInputThemes.IsReadOnly = False + Me.ucrInputThemes.Location = New System.Drawing.Point(109, 18) + Me.ucrInputThemes.Name = "ucrInputThemes" + Me.ucrInputThemes.Size = New System.Drawing.Size(171, 21) + Me.ucrInputThemes.TabIndex = 107 + ' 'sdgPlots ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -600,8 +599,6 @@ Partial Class sdgPlots Friend WithEvents ucr1stFactorReceiver As ucrReceiverSingle Friend WithEvents tbpXAxis As TabPage Friend WithEvents tbpYAxis As TabPage - Friend WithEvents ucrInputThemes As ucrInputComboBox - Friend WithEvents lblTheme As Label Friend WithEvents cmdAllOptions As Button Friend WithEvents lblFont As Label Friend WithEvents ucrPlotsAdditionalLayers As ucrAdditionalLayers @@ -632,6 +629,8 @@ Partial Class sdgPlots Friend WithEvents lblSubTitle As Label Friend WithEvents ucrInputGraphCaption As ucrInputTextBox Friend WithEvents ucrInputGraphSubTitle As ucrInputTextBox + Friend WithEvents urChkSelectTheme As ucrCheck + Friend WithEvents ucrInputThemes As ucrInputComboBox End Class From 251cedb8d6bcd4abd2be9a673d9a2173dc1ed381 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 14 Jun 2017 22:09:01 +0300 Subject: [PATCH 024/201] disabling chkFittedModel and chkFittedModel like iin one var models --- instat/dlgTwoVariableUseModel.vb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/instat/dlgTwoVariableUseModel.vb b/instat/dlgTwoVariableUseModel.vb index 5f76f6430ae..51ba28e5b14 100644 --- a/instat/dlgTwoVariableUseModel.vb +++ b/instat/dlgTwoVariableUseModel.vb @@ -44,6 +44,8 @@ Public Class dlgTwoVariableUseModel Private Sub InitialiseDialog() 'Temporary fix: Bugs if you run the dialogue the second time sdgSimpleRegOptions.chkFittedModel.Enabled = False + 'autoplot function does not support glm/lm models + sdgSimpleRegOptions.chkFittedModel.Enabled = False 'ucrBase.iHelpTopicID = ucrBaseUseModel.clsRsyntax.SetOperation("+") ucrReceiverUseModel.SetItemType("model") From a31105b3f05629f1b34f51f0f8ddc57279ec59ea Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 14 Jun 2017 22:18:35 +0300 Subject: [PATCH 025/201] edits --- instat/sdgPlots.Designer.vb | 70 ++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/instat/sdgPlots.Designer.vb b/instat/sdgPlots.Designer.vb index 6343d80f124..8c30e6565ec 100644 --- a/instat/sdgPlots.Designer.vb +++ b/instat/sdgPlots.Designer.vb @@ -59,15 +59,15 @@ Partial Class sdgPlots Me.ucrXAxis = New instat.ucrAxes() Me.tbpYAxis = New System.Windows.Forms.TabPage() Me.ucrYAxis = New instat.ucrAxes() - Me.tbpThemes = New System.Windows.Forms.TabPage() + Me.tbpTheme = New System.Windows.Forms.TabPage() Me.GroupBox1 = New System.Windows.Forms.GroupBox() Me.lblFont = New System.Windows.Forms.Label() Me.cmdAllOptions = New System.Windows.Forms.Button() + Me.ucrInputThemes = New instat.ucrInputComboBox() Me.tbpCoordinates = New System.Windows.Forms.TabPage() Me.lblWarning = New System.Windows.Forms.Label() Me.ucrBaseSubdialog = New instat.ucrButtonsSubdialogue() Me.urChkSelectTheme = New instat.ucrCheck() - Me.ucrInputThemes = New instat.ucrInputComboBox() Me.tbpPlotsOptions.SuspendLayout() Me.tbpFacet.SuspendLayout() Me.tbpLayers.SuspendLayout() @@ -75,7 +75,7 @@ Partial Class sdgPlots Me.grpLegendTitle.SuspendLayout() Me.tbpXAxis.SuspendLayout() Me.tbpYAxis.SuspendLayout() - Me.tbpThemes.SuspendLayout() + Me.tbpTheme.SuspendLayout() Me.tbpCoordinates.SuspendLayout() Me.SuspendLayout() ' @@ -86,7 +86,7 @@ Partial Class sdgPlots Me.tbpPlotsOptions.Controls.Add(Me.tbpTitles) Me.tbpPlotsOptions.Controls.Add(Me.tbpXAxis) Me.tbpPlotsOptions.Controls.Add(Me.tbpYAxis) - Me.tbpPlotsOptions.Controls.Add(Me.tbpThemes) + Me.tbpPlotsOptions.Controls.Add(Me.tbpTheme) Me.tbpPlotsOptions.Controls.Add(Me.tbpCoordinates) Me.tbpPlotsOptions.Location = New System.Drawing.Point(1, 3) Me.tbpPlotsOptions.Name = "tbpPlotsOptions" @@ -465,21 +465,21 @@ Partial Class sdgPlots Me.ucrYAxis.Size = New System.Drawing.Size(496, 329) Me.ucrYAxis.TabIndex = 0 ' - 'tbpThemes - ' - Me.tbpThemes.Controls.Add(Me.urChkSelectTheme) - Me.tbpThemes.Controls.Add(Me.ucrInputThemes) - Me.tbpThemes.Controls.Add(Me.GroupBox1) - Me.tbpThemes.Controls.Add(Me.lblFont) - Me.tbpThemes.Controls.Add(Me.cmdAllOptions) - Me.tbpThemes.Location = New System.Drawing.Point(4, 22) - Me.tbpThemes.Name = "tbpThemes" - Me.tbpThemes.Padding = New System.Windows.Forms.Padding(3) - Me.tbpThemes.Size = New System.Drawing.Size(499, 330) - Me.tbpThemes.TabIndex = 1 - Me.tbpThemes.Tag = "Themes" - Me.tbpThemes.Text = "Themes" - Me.tbpThemes.UseVisualStyleBackColor = True + 'tbpTheme + ' + Me.tbpTheme.Controls.Add(Me.urChkSelectTheme) + Me.tbpTheme.Controls.Add(Me.GroupBox1) + Me.tbpTheme.Controls.Add(Me.lblFont) + Me.tbpTheme.Controls.Add(Me.cmdAllOptions) + Me.tbpTheme.Controls.Add(Me.ucrInputThemes) + Me.tbpTheme.Location = New System.Drawing.Point(4, 22) + Me.tbpTheme.Name = "tbpTheme" + Me.tbpTheme.Padding = New System.Windows.Forms.Padding(3) + Me.tbpTheme.Size = New System.Drawing.Size(499, 330) + Me.tbpTheme.TabIndex = 1 + Me.tbpTheme.Tag = "Theme" + Me.tbpTheme.Text = "Theme" + Me.tbpTheme.UseVisualStyleBackColor = True ' 'GroupBox1 ' @@ -500,13 +500,22 @@ Partial Class sdgPlots ' 'cmdAllOptions ' - Me.cmdAllOptions.Location = New System.Drawing.Point(295, 17) + Me.cmdAllOptions.Location = New System.Drawing.Point(297, 18) Me.cmdAllOptions.Name = "cmdAllOptions" Me.cmdAllOptions.Size = New System.Drawing.Size(78, 23) Me.cmdAllOptions.TabIndex = 2 Me.cmdAllOptions.Text = "All Options" Me.cmdAllOptions.UseVisualStyleBackColor = True ' + 'ucrInputThemes + ' + Me.ucrInputThemes.AddQuotesIfUnrecognised = True + Me.ucrInputThemes.IsReadOnly = False + Me.ucrInputThemes.Location = New System.Drawing.Point(109, 19) + Me.ucrInputThemes.Name = "ucrInputThemes" + Me.ucrInputThemes.Size = New System.Drawing.Size(171, 21) + Me.ucrInputThemes.TabIndex = 1 + ' 'tbpCoordinates ' Me.tbpCoordinates.Controls.Add(Me.lblWarning) @@ -538,19 +547,10 @@ Partial Class sdgPlots 'urChkSelectTheme ' Me.urChkSelectTheme.Checked = False - Me.urChkSelectTheme.Location = New System.Drawing.Point(6, 18) + Me.urChkSelectTheme.Location = New System.Drawing.Point(6, 19) Me.urChkSelectTheme.Name = "urChkSelectTheme" Me.urChkSelectTheme.Size = New System.Drawing.Size(97, 20) - Me.urChkSelectTheme.TabIndex = 108 - ' - 'ucrInputThemes - ' - Me.ucrInputThemes.AddQuotesIfUnrecognised = True - Me.ucrInputThemes.IsReadOnly = False - Me.ucrInputThemes.Location = New System.Drawing.Point(109, 18) - Me.ucrInputThemes.Name = "ucrInputThemes" - Me.ucrInputThemes.Size = New System.Drawing.Size(171, 21) - Me.ucrInputThemes.TabIndex = 107 + Me.urChkSelectTheme.TabIndex = 106 ' 'sdgPlots ' @@ -577,8 +577,8 @@ Partial Class sdgPlots Me.grpLegendTitle.PerformLayout() Me.tbpXAxis.ResumeLayout(False) Me.tbpYAxis.ResumeLayout(False) - Me.tbpThemes.ResumeLayout(False) - Me.tbpThemes.PerformLayout() + Me.tbpTheme.ResumeLayout(False) + Me.tbpTheme.PerformLayout() Me.tbpCoordinates.ResumeLayout(False) Me.tbpCoordinates.PerformLayout() Me.ResumeLayout(False) @@ -586,7 +586,7 @@ Partial Class sdgPlots End Sub Friend WithEvents tbpPlotsOptions As TabControl - Friend WithEvents tbpThemes As TabPage + Friend WithEvents tbpTheme As TabPage Friend WithEvents ucrBaseSubdialog As ucrButtonsSubdialogue Friend WithEvents tbpTitles As TabPage Friend WithEvents tbpFacet As TabPage @@ -599,6 +599,7 @@ Partial Class sdgPlots Friend WithEvents ucr1stFactorReceiver As ucrReceiverSingle Friend WithEvents tbpXAxis As TabPage Friend WithEvents tbpYAxis As TabPage + Friend WithEvents ucrInputThemes As ucrInputComboBox Friend WithEvents cmdAllOptions As Button Friend WithEvents lblFont As Label Friend WithEvents ucrPlotsAdditionalLayers As ucrAdditionalLayers @@ -630,7 +631,6 @@ Partial Class sdgPlots Friend WithEvents ucrInputGraphCaption As ucrInputTextBox Friend WithEvents ucrInputGraphSubTitle As ucrInputTextBox Friend WithEvents urChkSelectTheme As ucrCheck - Friend WithEvents ucrInputThemes As ucrInputComboBox End Class From 542ac41287c9c18611637cb7c04f47a6dec59c47 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 14 Jun 2017 22:19:37 +0300 Subject: [PATCH 026/201] sdgthemes minor edits --- instat/sdgThemes.vb | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/instat/sdgThemes.vb b/instat/sdgThemes.vb index 2d2be0730e9..413ed22f825 100644 --- a/instat/sdgThemes.vb +++ b/instat/sdgThemes.vb @@ -107,14 +107,16 @@ Public Class sdgThemes dctLegendPosition.Add("Top", Chr(34) & "top" & Chr(34)) dctLegendPosition.Add("Bottom", Chr(34) & "bottom" & Chr(34)) ucrInputLegendPosition.SetItems(dctLegendPosition) - ucrInputLegendPosition.SetRDefault(Chr(34) & "none" & Chr(34)) + urChkLegendPosition.AddParameterPresentCondition(True, "legend.position") + urChkLegendPosition.AddParameterPresentCondition(False, "legend.position", False) ucrChkLegendBox.SetText("Legend Layout") ucrInputLegendBox.SetParameter(New RParameter("legend.box")) dctLegendBox.Add("Vertical", Chr(34) & "vertical" & Chr(34)) dctLegendBox.Add("Horizontal", Chr(34) & "horizontal" & Chr(34)) ucrInputLegendBox.SetItems(dctLegendBox) - ucrInputLegendBox.SetRDefault(Chr(34) & "vertical" & Chr(34)) + ucrChkLegendBox.AddParameterPresentCondition(True, "legend.box") + ucrChkLegendBox.AddParameterPresentCondition(False, "legend.box", False) urChkLegendBoxJust.SetText("Justify Legend Box") ucrInputLegendBoxJust.SetParameter(New RParameter("legend.box.just")) @@ -123,14 +125,17 @@ Public Class sdgThemes dctLegendBoxJust.Add("Right", Chr(34) & "right" & Chr(34)) dctLegendBoxJust.Add("Left", Chr(34) & "left" & Chr(34)) ucrInputLegendBoxJust.SetItems(dctLegendBoxJust) - ucrInputLegendBoxJust.SetRDefault(Chr(34) & "top" & Chr(34)) + urChkLegendBoxJust.AddParameterPresentCondition(True, "legend.box.just") + urChkLegendBoxJust.AddParameterPresentCondition(False, "legend.box.just", False) ucrChkLegendDirection.SetText("Legend Direction") ucrInputLegendDirection.SetParameter(New RParameter("legend.direction")) dctLegendDirection.Add("Vertical", Chr(34) & "vertical" & Chr(34)) dctLegendDirection.Add("Horizontal", Chr(34) & "horizontal" & Chr(34)) ucrInputLegendDirection.SetItems(dctLegendDirection) - ucrInputLegendDirection.SetRDefault(Chr(34) & "vertical" & Chr(34)) + ucrChkLegendDirection.AddParameterPresentCondition(True, "legend.direction") + ucrChkLegendDirection.AddParameterPresentCondition(False, "legend.direction", False) + ucrChkLegendJustification.SetText("Legend Justification") ucrInputLegendJustification.SetParameter(New RParameter("legend.justification")) @@ -140,13 +145,15 @@ Public Class sdgThemes dctLegendJustification.Add("Left", Chr(34) & "left" & Chr(34)) dctLegendJustification.Add("Center", Chr(34) & "centre" & Chr(34)) ucrInputLegendJustification.SetItems(dctLegendJustification) - ucrInputLegendJustification.SetRDefault(Chr(34) & "top" & Chr(34)) + ucrChkLegendJustification.AddParameterPresentCondition(True, "legend.justification") + ucrChkLegendJustification.AddParameterPresentCondition(False, "legend.justification", False) + - urChkLegendPosition.AddToLinkedControls(ucrInputLegendPosition, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkLegendBox.AddToLinkedControls(ucrInputLegendBox, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - urChkLegendBoxJust.AddToLinkedControls(ucrInputLegendBoxJust, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkLegendDirection.AddToLinkedControls(ucrInputLegendDirection, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkLegendJustification.AddToLinkedControls(ucrInputLegendJustification, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + urChkLegendPosition.AddToLinkedControls(ucrInputLegendPosition, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="None") + ucrChkLegendBox.AddToLinkedControls(ucrInputLegendBox, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Vertical") + urChkLegendBoxJust.AddToLinkedControls(ucrInputLegendBoxJust, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Top") + ucrChkLegendDirection.AddToLinkedControls(ucrInputLegendDirection, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Vertical") + ucrChkLegendJustification.AddToLinkedControls(ucrInputLegendJustification, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Top") End Sub @@ -326,7 +333,7 @@ Public Class sdgThemes ucrPanelBackGround.SetRCodeForControl("panel.background", clsElementPanelBackGround, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPanelBorder.SetRCodeForControl("panel.border", clsElementBorder, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) - ucrPlotBackGround.SetRCodeForControl("plot.background", clsElementPlotBackground, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) + ucrPlotBackground.SetRCodeForControl("plot.background", clsElementPlotBackground, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPlotCaption.SetRCodeForControl("plot.caption", clsElementPlotCaption, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPlotSubTitle.SetRCodeForControl("plot.subtitle", clsElementPlotSubtitle, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPlotTitle.SetRCodeForControl("plot.title", clsElementPlotTitle, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) From fb9d1433a73252f2f26ecf42f34e062e91c79d04 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 14 Jun 2017 22:21:18 +0300 Subject: [PATCH 027/201] Revert "edits" This reverts commit 40cc9d62543c8bbb5219c55090400e9073b45433. --- instat/sdgPlots.vb | 11 +++-------- instat/sdgThemes.vb | 29 +++++++++++------------------ 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/instat/sdgPlots.vb b/instat/sdgPlots.vb index 2067079feb5..90d0cf6233b 100644 --- a/instat/sdgPlots.vb +++ b/instat/sdgPlots.vb @@ -169,11 +169,7 @@ Public Class sdgPlots ucrYAxis.InitialiseControl() 'themes tab - urChkSelectTheme.SetText("Select Theme:") - ucrInputThemes.SetParameter(New RParameter("theme")) - urChkSelectTheme.AddToLinkedControls(ucrInputThemes, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="theme_grey") - urChkSelectTheme.AddParameterPresentCondition(True, "theme") - urChkSelectTheme.AddParameterPresentCondition(False, "theme", False) + ucrInputThemes.SetParameter(New RParameter("theme_name")) strThemes = GgplotDefaults.strThemes 'Would prefer to do this through functions but auto updating function name not currently supported through combo box control For Each strTemp As String In strThemes @@ -184,7 +180,7 @@ Public Class sdgPlots End If Next ucrInputThemes.SetItems(dctThemes) - ' ucrInputThemes.SetRDefault("theme_grey()") + ucrInputThemes.SetRDefault("theme_grey()") ucrInputThemes.SetDropDownStyleAsNonEditable() InitialiseTabs() @@ -248,8 +244,7 @@ Public Class sdgPlots ucrInputGraphTitle.SetRCode(clsLabsFunction, bReset) ucrInputGraphSubTitle.SetRCode(clsLabsFunction, bReset) ucrInputGraphCaption.SetRCode(clsLabsFunction, bReset) - urChkSelectTheme.SetRCode(clsBaseOperator, bReset) - ucrInputThemes.SetRCode(clsBaseOperator, bReset) + ucrInputThemes.SetRCode(clsBaseOperator) 'ucrInputLegend.SetRCode(clsNewLabsFunction, bReset) ucrPnlHorizonatalVertical.SetRCode(clsFacetFunction, bReset) diff --git a/instat/sdgThemes.vb b/instat/sdgThemes.vb index 413ed22f825..2d2be0730e9 100644 --- a/instat/sdgThemes.vb +++ b/instat/sdgThemes.vb @@ -107,16 +107,14 @@ Public Class sdgThemes dctLegendPosition.Add("Top", Chr(34) & "top" & Chr(34)) dctLegendPosition.Add("Bottom", Chr(34) & "bottom" & Chr(34)) ucrInputLegendPosition.SetItems(dctLegendPosition) - urChkLegendPosition.AddParameterPresentCondition(True, "legend.position") - urChkLegendPosition.AddParameterPresentCondition(False, "legend.position", False) + ucrInputLegendPosition.SetRDefault(Chr(34) & "none" & Chr(34)) ucrChkLegendBox.SetText("Legend Layout") ucrInputLegendBox.SetParameter(New RParameter("legend.box")) dctLegendBox.Add("Vertical", Chr(34) & "vertical" & Chr(34)) dctLegendBox.Add("Horizontal", Chr(34) & "horizontal" & Chr(34)) ucrInputLegendBox.SetItems(dctLegendBox) - ucrChkLegendBox.AddParameterPresentCondition(True, "legend.box") - ucrChkLegendBox.AddParameterPresentCondition(False, "legend.box", False) + ucrInputLegendBox.SetRDefault(Chr(34) & "vertical" & Chr(34)) urChkLegendBoxJust.SetText("Justify Legend Box") ucrInputLegendBoxJust.SetParameter(New RParameter("legend.box.just")) @@ -125,17 +123,14 @@ Public Class sdgThemes dctLegendBoxJust.Add("Right", Chr(34) & "right" & Chr(34)) dctLegendBoxJust.Add("Left", Chr(34) & "left" & Chr(34)) ucrInputLegendBoxJust.SetItems(dctLegendBoxJust) - urChkLegendBoxJust.AddParameterPresentCondition(True, "legend.box.just") - urChkLegendBoxJust.AddParameterPresentCondition(False, "legend.box.just", False) + ucrInputLegendBoxJust.SetRDefault(Chr(34) & "top" & Chr(34)) ucrChkLegendDirection.SetText("Legend Direction") ucrInputLegendDirection.SetParameter(New RParameter("legend.direction")) dctLegendDirection.Add("Vertical", Chr(34) & "vertical" & Chr(34)) dctLegendDirection.Add("Horizontal", Chr(34) & "horizontal" & Chr(34)) ucrInputLegendDirection.SetItems(dctLegendDirection) - ucrChkLegendDirection.AddParameterPresentCondition(True, "legend.direction") - ucrChkLegendDirection.AddParameterPresentCondition(False, "legend.direction", False) - + ucrInputLegendDirection.SetRDefault(Chr(34) & "vertical" & Chr(34)) ucrChkLegendJustification.SetText("Legend Justification") ucrInputLegendJustification.SetParameter(New RParameter("legend.justification")) @@ -145,15 +140,13 @@ Public Class sdgThemes dctLegendJustification.Add("Left", Chr(34) & "left" & Chr(34)) dctLegendJustification.Add("Center", Chr(34) & "centre" & Chr(34)) ucrInputLegendJustification.SetItems(dctLegendJustification) - ucrChkLegendJustification.AddParameterPresentCondition(True, "legend.justification") - ucrChkLegendJustification.AddParameterPresentCondition(False, "legend.justification", False) - + ucrInputLegendJustification.SetRDefault(Chr(34) & "top" & Chr(34)) - urChkLegendPosition.AddToLinkedControls(ucrInputLegendPosition, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="None") - ucrChkLegendBox.AddToLinkedControls(ucrInputLegendBox, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Vertical") - urChkLegendBoxJust.AddToLinkedControls(ucrInputLegendBoxJust, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Top") - ucrChkLegendDirection.AddToLinkedControls(ucrInputLegendDirection, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Vertical") - ucrChkLegendJustification.AddToLinkedControls(ucrInputLegendJustification, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="Top") + urChkLegendPosition.AddToLinkedControls(ucrInputLegendPosition, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkLegendBox.AddToLinkedControls(ucrInputLegendBox, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + urChkLegendBoxJust.AddToLinkedControls(ucrInputLegendBoxJust, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkLegendDirection.AddToLinkedControls(ucrInputLegendDirection, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkLegendJustification.AddToLinkedControls(ucrInputLegendJustification, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) End Sub @@ -333,7 +326,7 @@ Public Class sdgThemes ucrPanelBackGround.SetRCodeForControl("panel.background", clsElementPanelBackGround, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPanelBorder.SetRCodeForControl("panel.border", clsElementBorder, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) - ucrPlotBackground.SetRCodeForControl("plot.background", clsElementPlotBackground, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) + ucrPlotBackGround.SetRCodeForControl("plot.background", clsElementPlotBackground, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPlotCaption.SetRCodeForControl("plot.caption", clsElementPlotCaption, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPlotSubTitle.SetRCodeForControl("plot.subtitle", clsElementPlotSubtitle, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) ucrPlotTitle.SetRCodeForControl("plot.title", clsElementPlotTitle, clsNewThemeFunction:=clsThemeFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) From b9098cf22dc5b3bf1b9a9c7bc13629cf79392e3f Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 14 Jun 2017 22:37:10 +0300 Subject: [PATCH 028/201] edit --- instat/clsGgplotDefaults.vb | 2 +- instat/sdgPlots.vb | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/instat/clsGgplotDefaults.vb b/instat/clsGgplotDefaults.vb index 8bdc7a18355..cb6fae975b1 100644 --- a/instat/clsGgplotDefaults.vb +++ b/instat/clsGgplotDefaults.vb @@ -16,7 +16,7 @@ Get Dim clsTempParam As New RParameter - clsTempParam.SetArgumentName("theme_name") + clsTempParam.SetArgumentName("theme") clsTempParam.SetArgumentValue("theme_grey()") Return clsTempParam End Get diff --git a/instat/sdgPlots.vb b/instat/sdgPlots.vb index 90d0cf6233b..82e220dfc67 100644 --- a/instat/sdgPlots.vb +++ b/instat/sdgPlots.vb @@ -169,7 +169,11 @@ Public Class sdgPlots ucrYAxis.InitialiseControl() 'themes tab - ucrInputThemes.SetParameter(New RParameter("theme_name")) + urChkSelectTheme.SetText("Select Theme:") + ucrInputThemes.SetParameter(New RParameter("theme")) + urChkSelectTheme.AddToLinkedControls(ucrInputThemes, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="theme_grey") + urChkSelectTheme.AddParameterPresentCondition(True, "theme") + urChkSelectTheme.AddParameterPresentCondition(False, "theme", False) strThemes = GgplotDefaults.strThemes 'Would prefer to do this through functions but auto updating function name not currently supported through combo box control For Each strTemp As String In strThemes @@ -244,7 +248,8 @@ Public Class sdgPlots ucrInputGraphTitle.SetRCode(clsLabsFunction, bReset) ucrInputGraphSubTitle.SetRCode(clsLabsFunction, bReset) ucrInputGraphCaption.SetRCode(clsLabsFunction, bReset) - ucrInputThemes.SetRCode(clsBaseOperator) + urChkSelectTheme.SetRCode(clsBaseOperator, bReset) + ucrInputThemes.SetRCode(clsBaseOperator, bReset) 'ucrInputLegend.SetRCode(clsNewLabsFunction, bReset) ucrPnlHorizonatalVertical.SetRCode(clsFacetFunction, bReset) From efd7e9db5c4e0ac989304ed2cc09559eb2c87cdd Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Wed, 14 Jun 2017 22:57:38 +0300 Subject: [PATCH 029/201] Fixing reset for the subdialog --- instat/dlgCombineforGraphics.vb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/instat/dlgCombineforGraphics.vb b/instat/dlgCombineforGraphics.vb index bd8ad7c42d0..18ab94b1b9c 100644 --- a/instat/dlgCombineforGraphics.vb +++ b/instat/dlgCombineforGraphics.vb @@ -94,4 +94,7 @@ Public Class dlgCombineforGraphics Private Sub AllControls_ControlContentsChanged() Handles ucrCombineGraphReceiver.ControlContentsChanged, ucrSave.ControlContentsChanged TestOkEnabled() End Sub + Private Sub AllControl_ControlContentsChanged() Handles ucrCombineGraphReceiver.ControlContentsChanged + sdgCombineGraphOptions.SetDefaultRowAndColumns() + End Sub End Class \ No newline at end of file From f74b9332071678c7281dfe494baffb247fd44a6d Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Wed, 14 Jun 2017 21:53:41 +0100 Subject: [PATCH 030/201] fixed theme checkbox issues --- instat/clsGgplotDefaults.vb | 3 ++- instat/sdgPlots.vb | 6 +++--- instat/static/InstatObject/R/Rsetup.R | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/instat/clsGgplotDefaults.vb b/instat/clsGgplotDefaults.vb index cb6fae975b1..8c3f8177105 100644 --- a/instat/clsGgplotDefaults.vb +++ b/instat/clsGgplotDefaults.vb @@ -16,7 +16,7 @@ Get Dim clsTempParam As New RParameter - clsTempParam.SetArgumentName("theme") + clsTempParam.SetArgumentName("theme_name") clsTempParam.SetArgumentValue("theme_grey()") Return clsTempParam End Get @@ -25,6 +25,7 @@ Public Shared ReadOnly Property strThemes As String() Get Dim strTemp As String() + 'TODO need to make proper functions and set package names strTemp = {"theme_bw", "theme_linedraw", "theme_light", "theme_minimal", "theme_classic", "theme_dark", "theme_void", "theme_base", "theme_calc", "theme_economist", "theme_few", "theme_fivethirtyeight", "theme_foundation", "theme_grey", "theme_gdocs", "theme_igray", "theme_map", "theme_par", "theme_solarized", "theme_hc", "theme_pander", "theme_solid", "theme_stata", "theme_tufte", "theme_wsj"} System.Array.Sort(Of String)(strTemp) Return strTemp diff --git a/instat/sdgPlots.vb b/instat/sdgPlots.vb index 82e220dfc67..5afd2a29854 100644 --- a/instat/sdgPlots.vb +++ b/instat/sdgPlots.vb @@ -170,10 +170,10 @@ Public Class sdgPlots 'themes tab urChkSelectTheme.SetText("Select Theme:") - ucrInputThemes.SetParameter(New RParameter("theme")) + ucrInputThemes.SetParameter(New RParameter("theme_name")) urChkSelectTheme.AddToLinkedControls(ucrInputThemes, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="theme_grey") - urChkSelectTheme.AddParameterPresentCondition(True, "theme") - urChkSelectTheme.AddParameterPresentCondition(False, "theme", False) + urChkSelectTheme.AddParameterPresentCondition(True, "theme_name") + urChkSelectTheme.AddParameterPresentCondition(False, "theme_name", False) strThemes = GgplotDefaults.strThemes 'Would prefer to do this through functions but auto updating function name not currently supported through combo box control For Each strTemp As String In strThemes diff --git a/instat/static/InstatObject/R/Rsetup.R b/instat/static/InstatObject/R/Rsetup.R index e6dd2b112cc..b1839b7d7fb 100644 --- a/instat/static/InstatObject/R/Rsetup.R +++ b/instat/static/InstatObject/R/Rsetup.R @@ -69,7 +69,8 @@ versions <- c("1.4-5", "1.12", "1.9-3", "0.2.0", "1.1.0", "0.1-3", success <- invisible(mapply(function(p, v) length(find.package(p, quiet = TRUE)) > 0 && compareVersion(as.character(packageVersion(p)), v) >= 0, packs, versions)) if(!all(success)) install.packages(names(success)[!success], repos = paste0("file:///", getwd(), "/extras"), type = "win.binary") -for(pack in c("plyr", "dplyr", "ggplot2", "svglite")) { +# ggthemes temp added because themes list doesn't contain package names +for(pack in c("plyr", "dplyr", "ggplot2", "ggthemes", "svglite")) { library(pack, character.only = TRUE) } From 8540d1b452bf4f2d38bb8551e8e810b621a52e21 Mon Sep 17 00:00:00 2001 From: John Lunalo Date: Thu, 15 Jun 2017 12:51:32 +0300 Subject: [PATCH 031/201] updating show model dialog --- instat/dlgShowModel.Designer.vb | 187 +++++++++++++-------------- instat/dlgShowModel.vb | 216 +++++++++++++++++--------------- 2 files changed, 206 insertions(+), 197 deletions(-) diff --git a/instat/dlgShowModel.Designer.vb b/instat/dlgShowModel.Designer.vb index 6c5e86344a0..34f7514a1f4 100644 --- a/instat/dlgShowModel.Designer.vb +++ b/instat/dlgShowModel.Designer.vb @@ -22,112 +22,51 @@ Partial Class dlgShowModel 'Do not modify it using the code editor. Private Sub InitializeComponent() - Me.rdoProbabilities = New System.Windows.Forms.RadioButton() - Me.rdoQuantiles = New System.Windows.Forms.RadioButton() - Me.chkGraphResults = New System.Windows.Forms.CheckBox() - Me.chkSaveResults = New System.Windows.Forms.CheckBox() Me.lblQuantValues = New System.Windows.Forms.Label() Me.lblProbValues = New System.Windows.Forms.Label() - Me.chkSingleValues = New System.Windows.Forms.CheckBox() Me.ucrDistributionsFOrTablePlus = New instat.ucrDistributionsWithParameters() - Me.ucrInputNewColNameforTablePlus = New instat.ucrInputComboBox() Me.ucrSelectorForDataFrame = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrReceiverExpressionForTablePlus = New instat.ucrReceiverSingle() Me.ucrBase = New instat.ucrButtons() Me.ucrInputProbabilities = New instat.ucrInputComboBox() + Me.rdoProbabilities = New System.Windows.Forms.RadioButton() + Me.rdoQuantiles = New System.Windows.Forms.RadioButton() + Me.ucrPnlDistTypes = New instat.UcrPanel() + Me.ucrChkDisplayGraphResults = New instat.ucrCheck() + Me.ucrChkEnterValues = New instat.ucrCheck() + Me.ucrSaveGraphResults = New instat.ucrSave() Me.SuspendLayout() ' - 'rdoProbabilities - ' - Me.rdoProbabilities.AutoSize = True - Me.rdoProbabilities.Location = New System.Drawing.Point(12, 12) - Me.rdoProbabilities.Name = "rdoProbabilities" - Me.rdoProbabilities.Size = New System.Drawing.Size(79, 17) - Me.rdoProbabilities.TabIndex = 1 - Me.rdoProbabilities.TabStop = True - Me.rdoProbabilities.Text = "Probablities" - Me.rdoProbabilities.UseVisualStyleBackColor = True - ' - 'rdoQuantiles - ' - Me.rdoQuantiles.AutoSize = True - Me.rdoQuantiles.Location = New System.Drawing.Point(243, 12) - Me.rdoQuantiles.Name = "rdoQuantiles" - Me.rdoQuantiles.Size = New System.Drawing.Size(69, 17) - Me.rdoQuantiles.TabIndex = 1 - Me.rdoQuantiles.TabStop = True - Me.rdoQuantiles.Text = "Quantiles" - Me.rdoQuantiles.UseVisualStyleBackColor = True - ' - 'chkGraphResults - ' - Me.chkGraphResults.AutoSize = True - Me.chkGraphResults.Location = New System.Drawing.Point(9, 224) - Me.chkGraphResults.Name = "chkGraphResults" - Me.chkGraphResults.Size = New System.Drawing.Size(130, 17) - Me.chkGraphResults.TabIndex = 4 - Me.chkGraphResults.Text = "Display Graph Results" - Me.chkGraphResults.UseVisualStyleBackColor = True - ' - 'chkSaveResults - ' - Me.chkSaveResults.AutoSize = True - Me.chkSaveResults.Location = New System.Drawing.Point(9, 270) - Me.chkSaveResults.Name = "chkSaveResults" - Me.chkSaveResults.Size = New System.Drawing.Size(89, 17) - Me.chkSaveResults.TabIndex = 5 - Me.chkSaveResults.Text = "Save Results" - Me.chkSaveResults.UseVisualStyleBackColor = True - ' 'lblQuantValues ' Me.lblQuantValues.AutoSize = True - Me.lblQuantValues.Location = New System.Drawing.Point(243, 51) + Me.lblQuantValues.Location = New System.Drawing.Point(243, 49) Me.lblQuantValues.Name = "lblQuantValues" - Me.lblQuantValues.Size = New System.Drawing.Size(42, 13) + Me.lblQuantValues.Size = New System.Drawing.Size(39, 13) Me.lblQuantValues.TabIndex = 8 - Me.lblQuantValues.Text = "Values:" + Me.lblQuantValues.Text = "Values" ' 'lblProbValues ' Me.lblProbValues.AutoSize = True - Me.lblProbValues.Location = New System.Drawing.Point(243, 51) + Me.lblProbValues.Location = New System.Drawing.Point(243, 49) Me.lblProbValues.Name = "lblProbValues" - Me.lblProbValues.Size = New System.Drawing.Size(66, 13) + Me.lblProbValues.Size = New System.Drawing.Size(63, 13) Me.lblProbValues.TabIndex = 9 - Me.lblProbValues.Text = "Probabilities:" - ' - 'chkSingleValues - ' - Me.chkSingleValues.AutoSize = True - Me.chkSingleValues.Location = New System.Drawing.Point(9, 247) - Me.chkSingleValues.Name = "chkSingleValues" - Me.chkSingleValues.Size = New System.Drawing.Size(92, 17) - Me.chkSingleValues.TabIndex = 12 - Me.chkSingleValues.Text = "Enter Value(s)" - Me.chkSingleValues.UseVisualStyleBackColor = True + Me.lblProbValues.Text = "Probabilities" ' 'ucrDistributionsFOrTablePlus ' - Me.ucrDistributionsFOrTablePlus.Location = New System.Drawing.Point(255, 102) + Me.ucrDistributionsFOrTablePlus.Location = New System.Drawing.Point(246, 97) Me.ucrDistributionsFOrTablePlus.Name = "ucrDistributionsFOrTablePlus" - Me.ucrDistributionsFOrTablePlus.Size = New System.Drawing.Size(254, 185) + Me.ucrDistributionsFOrTablePlus.Size = New System.Drawing.Size(247, 185) Me.ucrDistributionsFOrTablePlus.TabIndex = 11 ' - 'ucrInputNewColNameforTablePlus - ' - Me.ucrInputNewColNameforTablePlus.AddQuotesIfUnrecognised = True - Me.ucrInputNewColNameforTablePlus.IsReadOnly = False - Me.ucrInputNewColNameforTablePlus.Location = New System.Drawing.Point(99, 268) - Me.ucrInputNewColNameforTablePlus.Name = "ucrInputNewColNameforTablePlus" - Me.ucrInputNewColNameforTablePlus.Size = New System.Drawing.Size(135, 21) - Me.ucrInputNewColNameforTablePlus.TabIndex = 6 - ' 'ucrSelectorForDataFrame ' Me.ucrSelectorForDataFrame.bShowHiddenColumns = False Me.ucrSelectorForDataFrame.bUseCurrentFilter = True - Me.ucrSelectorForDataFrame.Location = New System.Drawing.Point(9, 32) + Me.ucrSelectorForDataFrame.Location = New System.Drawing.Point(9, 49) Me.ucrSelectorForDataFrame.Margin = New System.Windows.Forms.Padding(0) Me.ucrSelectorForDataFrame.Name = "ucrSelectorForDataFrame" Me.ucrSelectorForDataFrame.Size = New System.Drawing.Size(210, 180) @@ -136,7 +75,7 @@ Partial Class dlgShowModel 'ucrReceiverExpressionForTablePlus ' Me.ucrReceiverExpressionForTablePlus.frmParent = Me - Me.ucrReceiverExpressionForTablePlus.Location = New System.Drawing.Point(243, 66) + Me.ucrReceiverExpressionForTablePlus.Location = New System.Drawing.Point(246, 74) Me.ucrReceiverExpressionForTablePlus.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverExpressionForTablePlus.Name = "ucrReceiverExpressionForTablePlus" Me.ucrReceiverExpressionForTablePlus.Selector = Nothing @@ -147,7 +86,7 @@ Partial Class dlgShowModel ' 'ucrBase ' - Me.ucrBase.Location = New System.Drawing.Point(9, 293) + Me.ucrBase.Location = New System.Drawing.Point(9, 311) Me.ucrBase.Name = "ucrBase" Me.ucrBase.Size = New System.Drawing.Size(410, 52) Me.ucrBase.TabIndex = 0 @@ -156,28 +95,90 @@ Partial Class dlgShowModel ' Me.ucrInputProbabilities.AddQuotesIfUnrecognised = True Me.ucrInputProbabilities.IsReadOnly = False - Me.ucrInputProbabilities.Location = New System.Drawing.Point(243, 66) + Me.ucrInputProbabilities.Location = New System.Drawing.Point(246, 72) Me.ucrInputProbabilities.Name = "ucrInputProbabilities" Me.ucrInputProbabilities.Size = New System.Drawing.Size(137, 21) Me.ucrInputProbabilities.TabIndex = 13 ' + 'rdoProbabilities + ' + Me.rdoProbabilities.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoProbabilities.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoProbabilities.FlatAppearance.BorderSize = 2 + Me.rdoProbabilities.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoProbabilities.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoProbabilities.Location = New System.Drawing.Point(114, 14) + Me.rdoProbabilities.Name = "rdoProbabilities" + Me.rdoProbabilities.Size = New System.Drawing.Size(118, 27) + Me.rdoProbabilities.TabIndex = 15 + Me.rdoProbabilities.TabStop = True + Me.rdoProbabilities.Text = "Probabilities" + Me.rdoProbabilities.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoProbabilities.UseVisualStyleBackColor = True + ' + 'rdoQuantiles + ' + Me.rdoQuantiles.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoQuantiles.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoQuantiles.FlatAppearance.BorderSize = 2 + Me.rdoQuantiles.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoQuantiles.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoQuantiles.Location = New System.Drawing.Point(231, 14) + Me.rdoQuantiles.Name = "rdoQuantiles" + Me.rdoQuantiles.Size = New System.Drawing.Size(128, 27) + Me.rdoQuantiles.TabIndex = 16 + Me.rdoQuantiles.TabStop = True + Me.rdoQuantiles.Text = "Quantiles" + Me.rdoQuantiles.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoQuantiles.UseVisualStyleBackColor = True + ' + 'ucrPnlDistTypes + ' + Me.ucrPnlDistTypes.Location = New System.Drawing.Point(114, 10) + Me.ucrPnlDistTypes.Name = "ucrPnlDistTypes" + Me.ucrPnlDistTypes.Size = New System.Drawing.Size(254, 36) + Me.ucrPnlDistTypes.TabIndex = 14 + ' + 'ucrChkDisplayGraphResults + ' + Me.ucrChkDisplayGraphResults.Checked = False + Me.ucrChkDisplayGraphResults.Location = New System.Drawing.Point(12, 242) + Me.ucrChkDisplayGraphResults.Name = "ucrChkDisplayGraphResults" + Me.ucrChkDisplayGraphResults.Size = New System.Drawing.Size(100, 20) + Me.ucrChkDisplayGraphResults.TabIndex = 18 + ' + 'ucrChkEnterValues + ' + Me.ucrChkEnterValues.Checked = False + Me.ucrChkEnterValues.Location = New System.Drawing.Point(12, 262) + Me.ucrChkEnterValues.Name = "ucrChkEnterValues" + Me.ucrChkEnterValues.Size = New System.Drawing.Size(100, 20) + Me.ucrChkEnterValues.TabIndex = 18 + ' + 'ucrSaveGraphResults + ' + Me.ucrSaveGraphResults.Location = New System.Drawing.Point(12, 281) + Me.ucrSaveGraphResults.Name = "ucrSaveGraphResults" + Me.ucrSaveGraphResults.Size = New System.Drawing.Size(423, 24) + Me.ucrSaveGraphResults.TabIndex = 19 + ' 'dlgShowModel ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(515, 350) + Me.ClientSize = New System.Drawing.Size(500, 372) + Me.Controls.Add(Me.ucrSaveGraphResults) + Me.Controls.Add(Me.ucrChkEnterValues) + Me.Controls.Add(Me.ucrChkDisplayGraphResults) + Me.Controls.Add(Me.rdoProbabilities) + Me.Controls.Add(Me.rdoQuantiles) + Me.Controls.Add(Me.ucrPnlDistTypes) Me.Controls.Add(Me.ucrInputProbabilities) - Me.Controls.Add(Me.chkSingleValues) Me.Controls.Add(Me.ucrDistributionsFOrTablePlus) Me.Controls.Add(Me.lblProbValues) Me.Controls.Add(Me.lblQuantValues) - Me.Controls.Add(Me.ucrInputNewColNameforTablePlus) - Me.Controls.Add(Me.chkSaveResults) - Me.Controls.Add(Me.chkGraphResults) Me.Controls.Add(Me.ucrSelectorForDataFrame) Me.Controls.Add(Me.ucrReceiverExpressionForTablePlus) - Me.Controls.Add(Me.rdoQuantiles) - Me.Controls.Add(Me.rdoProbabilities) Me.Controls.Add(Me.ucrBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False @@ -191,16 +192,16 @@ Partial Class dlgShowModel End Sub Friend WithEvents ucrBase As ucrButtons - Friend WithEvents rdoProbabilities As RadioButton - Friend WithEvents rdoQuantiles As RadioButton Friend WithEvents ucrReceiverExpressionForTablePlus As ucrReceiverSingle Friend WithEvents ucrSelectorForDataFrame As ucrSelectorByDataFrameAddRemove - Friend WithEvents chkGraphResults As CheckBox - Friend WithEvents chkSaveResults As CheckBox - Friend WithEvents ucrInputNewColNameforTablePlus As ucrInputComboBox Friend WithEvents lblQuantValues As Label Friend WithEvents lblProbValues As Label Friend WithEvents ucrDistributionsFOrTablePlus As ucrDistributionsWithParameters - Friend WithEvents chkSingleValues As CheckBox Friend WithEvents ucrInputProbabilities As ucrInputComboBox -End Class \ No newline at end of file + Friend WithEvents ucrSaveGraphResults As ucrSave + Friend WithEvents ucrChkEnterValues As ucrCheck + Friend WithEvents ucrChkDisplayGraphResults As ucrCheck + Friend WithEvents rdoProbabilities As RadioButton + Friend WithEvents rdoQuantiles As RadioButton + Friend WithEvents ucrPnlDistTypes As UcrPanel +End Class diff --git a/instat/dlgShowModel.vb b/instat/dlgShowModel.vb index c0a7de2baeb..1b460aa6285 100644 --- a/instat/dlgShowModel.vb +++ b/instat/dlgShowModel.vb @@ -15,94 +15,114 @@ ' along with this program. If not, see . Imports instat.Translations Public Class dlgShowModel - Public bFirstLoad As Boolean = True + Private bReset As Boolean = True + Private bFirstLoad As Boolean = True + Private clsProbabilities, clsQuantiles As New RFunction Private Sub dlgTablePlus_Load(sender As Object, e As EventArgs) Handles MyBase.Load - autoTranslate(Me) If bFirstLoad Then InitialiseDialog() - SetDefaults() bFirstLoad = False End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False + autoTranslate(Me) TestOKEnabled() End Sub + Private Sub SetRCodeForControls(bReset As Boolean) + SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) + End Sub + Private Sub TestOKEnabled() - If ucrDistributionsFOrTablePlus.bParametersFilled Then - If ((Not ucrReceiverExpressionForTablePlus.IsEmpty) OrElse (Not ucrInputProbabilities.IsEmpty)) Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If + If (Not ucrReceiverExpressionForTablePlus.IsEmpty) OrElse (Not ucrInputProbabilities.IsEmpty) Then + ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) End If End Sub Private Sub InitialiseDialog() + ' ucrBase.clsRsyntax.iCallType = 2 + + ucrBase.iHelpTopicID = 157 ucrReceiverExpressionForTablePlus.Selector = ucrSelectorForDataFrame ucrReceiverExpressionForTablePlus.SetMeAsReceiver() ucrReceiverExpressionForTablePlus.SetIncludedDataTypes({"numeric"}) - ucrInputNewColNameforTablePlus.SetItemsTypeAsColumns() - ucrInputNewColNameforTablePlus.SetDefaultTypeAsColumn() - ucrBase.clsRsyntax.iCallType = 2 - ucrInputNewColNameforTablePlus.SetDataFrameSelector(ucrSelectorForDataFrame.ucrAvailableDataFrames) - ucrInputNewColNameforTablePlus.SetValidationTypeAsRVariable() - ucrInputProbabilities.SetValidationTypeAsNumericList() + + ucrPnlDistTypes.AddRadioButton(rdoProbabilities) + ucrPnlDistTypes.AddRadioButton(rdoQuantiles) + + ucrPnlDistTypes.AddFunctionNamesCondition(rdoQuantiles, "qdist") + ucrPnlDistTypes.AddFunctionNamesCondition(rdoQuantiles, "pdist") + + ucrSaveGraphResults.SetDataFrameSelector(ucrSelectorForDataFrame.ucrAvailableDataFrames) + ucrSaveGraphResults.SetSaveTypeAsColumn() + ucrSaveGraphResults.SetIsComboBox() + ucrSaveGraphResults.SetLabelText("Save Graph Result:") + + + ucrChkEnterValues.SetText("Enter value(s)") + + ucrChkDisplayGraphResults.SetParameter(New RParameter("plot")) + ucrChkDisplayGraphResults.SetValuesCheckedAndUnchecked("TRUE", "FALSE") + ucrChkDisplayGraphResults.SetText("Display Graph Results") End Sub + Private Sub SetDefaults() + + clsQuantiles = New RFunction + clsProbabilities = New RFunction + ucrSelectorForDataFrame.Reset() ucrInputProbabilities.Reset() - ucrInputNewColNameforTablePlus.Reset() - ucrDistributionsFOrTablePlus.SetRDistributions() - ucrDistributionsFOrTablePlus.SetParameters() - rdoQuantiles.Checked = True - SetName() - chkSingleValues.Checked = True - chkGraphResults.Checked = True - ReceiverLabels() - Results() + ucrSaveGraphResults.Reset() + + clsProbabilities.SetPackageName("mosaic") + clsQuantiles.SetPackageName("mosaic") + + clsProbabilities.SetRCommand("pdist") + clsQuantiles.SetRCommand("qdist") + + ucrBase.clsRsyntax.SetBaseRFunction(clsQuantiles) + + + + receiverlabels() SaveResults() SetItems() + TestOKEnabled() End Sub Private Sub SetItems() If rdoProbabilities.Checked Then ucrInputProbabilities.SetItems({"1", "0.1, 1, 3, 5, 10 ", "-2, -1, 0, 1, 2"}) + ucrInputProbabilities.SetName("1") Else ucrInputProbabilities.SetItems({"0.5", "0.1, 0.2, 0.4, 0.6, 0.8, 0.9 ", "0.2, 0.5, 0.8", " 0.5, 0.8, 0.9, 0.95, 0.99"}) + ucrInputProbabilities.SetName("0.5") 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 SetName() - If rdoProbabilities.Checked Then - ucrInputProbabilities.SetName("1") - Else - ucrInputProbabilities.SetName("0.5") - End If - End Sub - - Private Sub chkSaveResults_CheckedChanged(sender As Object, e As EventArgs) Handles chkGraphResults.CheckedChanged, chkSaveResults.CheckedChanged - ucrInputProbabilities.Reset() - ReceiverLabels() - SaveResults() - End Sub - Private Sub PqParameters() If rdoProbabilities.Checked Then - If chkSingleValues.Checked Then + If ucrChkEnterValues.Checked Then If Not ucrInputProbabilities.IsEmpty Then ucrBase.clsRsyntax.AddParameter("q", "c(" & ucrInputProbabilities.GetText & ")") Else ucrBase.clsRsyntax.RemoveParameter("q") End If - ElseIf Not chkSingleValues.Checked Then + ElseIf Not ucrChkEnterValues.Checked Then If Not ucrReceiverExpressionForTablePlus.IsEmpty Then ucrBase.clsRsyntax.AddParameter("q", clsRFunctionParameter:=ucrReceiverExpressionForTablePlus.GetVariables) Else @@ -110,13 +130,13 @@ Public Class dlgShowModel End If End If Else - If chkSingleValues.Checked Then + If ucrChkEnterValues.Checked Then If ucrInputProbabilities.IsEmpty = False Then ucrBase.clsRsyntax.AddParameter("p", "c(" & ucrInputProbabilities.GetText & ")") Else ucrBase.clsRsyntax.RemoveParameter("p") End If - ElseIf Not chkSingleValues.Checked Then + ElseIf Not ucrChkEnterValues.Checked Then If Not ucrReceiverExpressionForTablePlus.IsEmpty Then ucrBase.clsRsyntax.AddParameter("p", clsRFunctionParameter:=ucrReceiverExpressionForTablePlus.GetVariables) Else @@ -127,47 +147,36 @@ Public Class dlgShowModel End Sub Private Sub SaveResults() - If chkSaveResults.Checked AndAlso Not chkSingleValues.Checked Then - ucrInputNewColNameforTablePlus.Visible = True - ucrBase.clsRsyntax.SetAssignTo(ucrInputNewColNameforTablePlus.GetText(), strTempColumn:=ucrInputNewColNameforTablePlus.GetText(), strTempDataframe:=ucrSelectorForDataFrame.ucrAvailableDataFrames.cboAvailableDataFrames.Text, bAssignToIsPrefix:=False) - ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = True - Else - ucrBase.clsRsyntax.RemoveAssignTo() - ucrInputNewColNameforTablePlus.Visible = False - ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False - End If - End Sub - - Private Sub DisplayGraphResults() - If chkGraphResults.Checked Then - ucrBase.clsRsyntax.AddParameter("plot", "TRUE") - ucrBase.clsRsyntax.iCallType = 3 - Else - ucrBase.clsRsyntax.AddParameter("plot", "FALSE") - ucrBase.clsRsyntax.iCallType = 2 - End If - End Sub - Private Sub rdoProbabilitiesandQuantiles_CheckedChanged(sender As Object, e As EventArgs) Handles rdoProbabilities.CheckedChanged, rdoQuantiles.CheckedChanged - SetName() + 'If ucrSaveGraphResults.ucrChkSave.Checked AndAlso Not ucrChkEnterValues.Checked Then + ' ' ucrInputNewColNameforTablePlus.Visible = True + ' ucrBase.clsRsyntax.SetAssignTo(ucrInputNewColNameforTablePlus.GetText(), strTempColumn:=ucrInputNewColNameforTablePlus.GetText(), strTempDataframe:=ucrSelectorForDataFrame.ucrAvailableDataFrames.cboAvailableDataFrames.Text, bAssignToIsPrefix:=False) + ' ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = True + 'Else + ' ucrBase.clsRsyntax.RemoveAssignTo() + ' ucrInputNewColNameforTablePlus.Visible = False + ' ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False + 'End If + End Sub + + Private Sub rdoProbabilitiesandQuantiles_CheckedChanged(sender As Object, e As EventArgs) SetItems() - ReceiverLabels() + receiverlabels() End Sub - Private Sub ReceiverLabels() + Private Sub receiverlabels() ucrBase.clsRsyntax.ClearParameters() ucrBase.clsRsyntax.AddParameter("dist", Chr(34) & ucrDistributionsFOrTablePlus.clsCurrDistribution.strRName & Chr(34)) PqParameters() - DisplayGraphResults() If rdoProbabilities.Checked Then - If Not ucrInputNewColNameforTablePlus.bUserTyped Then - ucrInputNewColNameforTablePlus.SetPrefix("Prob") + If Not ucrSaveGraphResults.bUserTyped Then + ucrSaveGraphResults.SetPrefix("prob") End If lblQuantValues.Visible = True lblProbValues.Visible = False ucrBase.clsRsyntax.SetFunction("mosaic:: pdist") Else - If Not ucrInputNewColNameforTablePlus.bUserTyped Then - ucrInputNewColNameforTablePlus.SetPrefix("Quant") + If Not ucrSaveGraphResults.bUserTyped Then + ucrSaveGraphResults.SetPrefix("quant") End If lblQuantValues.Visible = False lblProbValues.Visible = True @@ -178,51 +187,50 @@ Public Class dlgShowModel Next End Sub - Private Sub ucrInputProbabilities_ContentsChanged() Handles ucrInputProbabilities.ContentsChanged - ReceiverLabels() + Private Sub ucrReceiverExpressionForTablePlus_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverExpressionForTablePlus.SelectionChanged + receiverlabels() TestOKEnabled() End Sub - Private Sub ucrDistributionsFOrTablePlus_ParameterChanged() Handles ucrDistributionsFOrTablePlus.ControlContentsChanged - ReceiverLabels() + Private Sub ucrInputProbabilities_ContentsChanged() Handles ucrInputProbabilities.ContentsChanged + receiverlabels() TestOKEnabled() End Sub - Private Sub chkSingleValues_CheckedChanged(sender As Object, e As EventArgs) Handles chkSingleValues.CheckedChanged - Results() - ReceiverLabels() - End Sub + Private Sub ucrDistributionsFOrTablePlus_ParameterChanged(ucrChangedControl As ucrCore) Handles ucrDistributionsFOrTablePlus.ControlContentsChanged - Private Sub Results() - If chkSingleValues.Checked Then - chkSaveResults.Visible = False - SetName() - ucrInputNewColNameforTablePlus.Visible = False - ucrReceiverExpressionForTablePlus.Visible = False - ucrSelectorForDataFrame.Reset() - ucrInputProbabilities.Visible = True - ucrSelectorForDataFrame.SetVariablesVisible(False) - Else - chkSaveResults.Visible = True - ucrInputProbabilities.SetName("") - ucrInputProbabilities.Reset() - ucrReceiverExpressionForTablePlus.Visible = True - ucrInputNewColNameforTablePlus.Visible = False - ucrInputProbabilities.Visible = False - ucrSelectorForDataFrame.SetVariablesVisible(True) - End If End Sub - Private Sub ucrInputNewColNameforTablePlus_NameChanged() Handles ucrInputNewColNameforTablePlus.NameChanged - SaveResults() + Private Sub ucrInputNewColNameforTablePlus_NameChanged() + End Sub - Private Sub ucrReceiverExpressionForTablePlus_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverExpressionForTablePlus.ControlValueChanged - ReceiverLabels() - DisplayGraphResults() + Private Sub ucrInputNewColNameforTablePlus_ControlContentsChanged(ucrChangedControl As ucrCore) + End Sub - Private Sub ucrInputNewColNameforTablePlus_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrInputNewColNameforTablePlus.ControlContentsChanged - TestOKEnabled() + Private Sub ucrReceiverExpressionForTablePlus_ControlValueChanged(ucrChangedControl As ucrCore) + End Sub + + Private Sub ucrDistributionsFOrTablePlus_ParameterChanged() Handles ucrDistributionsFOrTablePlus.ControlContentsChanged + receiverlabels() + End Sub + + 'Private Sub Results() + ' If chkSingleValues.Checked Then + ' chkSaveResults.Visible = False + ' ucrInputNewColNameforTablePlus.Visible = False + ' ucrReceiverExpressionForTablePlus.Visible = False + ' ucrSelectorForDataFrame.Reset() + ' ucrInputProbabilities.Visible = True + ' Else + ' chkSaveResults.Visible = True + ' ucrInputProbabilities.Reset() + ' ucrReceiverExpressionForTablePlus.Visible = True + ' ucrInputNewColNameforTablePlus.Visible = False + ' ucrInputProbabilities.Visible = False + ' ucrReceiverExpressionForTablePlus.Visible = True + ' End If + 'End Sub End Class \ No newline at end of file From d696ebead26b753ff69f8f41c6e2bf37e191b753 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Thu, 15 Jun 2017 13:57:27 +0100 Subject: [PATCH 032/201] fixes #3374 --- instat/static/InstatObject/R/Backend_Components/link.R | 2 +- .../R/Backend_Components/summary_functions.R | 10 ++++++---- instat/static/InstatObject/R/data_object_R6.R | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/instat/static/InstatObject/R/Backend_Components/link.R b/instat/static/InstatObject/R/Backend_Components/link.R index e5759f41220..3b12b2a34b7 100644 --- a/instat/static/InstatObject/R/Backend_Components/link.R +++ b/instat/static/InstatObject/R/Backend_Components/link.R @@ -165,7 +165,7 @@ instat_object$set("public", "get_linked_to_definition", function(from_data_frame for(curr_link in private$.links) { for(curr_link_pairs in curr_link$link_columns) { if(length(link_pairs) == length(curr_link_pairs) && setequal(link_pairs, names(curr_link_pairs))) { - return(list(to_data_name, as.vector(curr_link_pairs))) + return(list(to_data_name, as.vector(curr_link_pairs[link_pairs]))) } } } diff --git a/instat/static/InstatObject/R/Backend_Components/summary_functions.R b/instat/static/InstatObject/R/Backend_Components/summary_functions.R index 74d238661c6..67a45fda6f1 100644 --- a/instat/static/InstatObject/R/Backend_Components/summary_functions.R +++ b/instat/static/InstatObject/R/Backend_Components/summary_functions.R @@ -157,13 +157,13 @@ instat_object$set("public", "calculate_summary", function(data_name, columns_to_ else { values_calculation <- instat_calculation$new(type = "summary", result_name = result_name, function_exp = paste0(summary_type, "(", column_names, function_exp), - calculated_from = calculated_from, save = 0) + calculated_from = calculated_from, save = save) if(percentage_type == "columns") { if(length(perc_total_columns) == 1) perc_col_name <- perc_total_columns else perc_col_name <- perc_total_columns[i] totals_calculation <- instat_calculation$new(type = "summary", result_name = paste0(summaries_display[j], "_", perc_total_columns, "_totals"), function_exp = paste0(summary_type, "(", perc_col_name, function_exp), - calculated_from = calculated_from, save = 0) + calculated_from = calculated_from, save = save) } else if(percentage_type == "filter") { #TODO @@ -172,7 +172,7 @@ instat_object$set("public", "calculate_summary", function(data_name, columns_to_ values_calculation$manipulations <- value_manipulations totals_calculation <- instat_calculation$new(type = "summary", result_name = paste0(result_name, "_totals"), function_exp = paste0(summary_type, "(", column_names, function_exp), - calculated_from = calculated_from, save = 0) + calculated_from = calculated_from, save = save) } function_exp <- paste0(values_calculation$result_name, "/", totals_calculation$result_name) if(!perc_decimal) { @@ -603,7 +603,9 @@ instat_object$set("public", "summary_table", function(data_name, columns_to_summ } if(as_html) { if(length(column_factors) == 0) { - return(htmlTable::htmlTable(shaped_cell_values, caption = caption, total = include_margins, align = align, tfoot = notes, ... = ...)) + tab <- htmlTable::htmlTable(shaped_cell_values, caption = caption, total = include_margins, align = align, tfoot = notes, ... = ...) + class(tab) <- class(tab)[!class(tab) == "html"] + return(tab) } else { spanner_data <- unique(cell_values[column_factors]) diff --git a/instat/static/InstatObject/R/data_object_R6.R b/instat/static/InstatObject/R/data_object_R6.R index 1a9c6c5a8f4..72b523af9d2 100644 --- a/instat/static/InstatObject/R/data_object_R6.R +++ b/instat/static/InstatObject/R/data_object_R6.R @@ -242,7 +242,7 @@ data_object$set("public", "get_data_frame", function(convert_to_character = FALS if(!include_hidden_columns && self$is_variables_metadata(is_hidden_label)) { hidden <- self$get_variables_metadata(property = is_hidden_label) hidden[is.na(hidden)] <- FALSE - out <- private$data[!self$get_variables_metadata(property = is_hidden_label)] + out <- private$data[!hidden] } else out <- private$data if(use_current_filter && self$filter_applied()) { From 0087b2015d5c37f115c7b0f1cce1519e99c49f2b Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 16 Jun 2017 09:29:10 +0300 Subject: [PATCH 033/201] one way freq --- instat/dlgOneWayFrequencies.vb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/instat/dlgOneWayFrequencies.vb b/instat/dlgOneWayFrequencies.vb index f1c3b1740a5..b9e3e8d6f52 100644 --- a/instat/dlgOneWayFrequencies.vb +++ b/instat/dlgOneWayFrequencies.vb @@ -109,6 +109,8 @@ Public Class dlgOneWayFrequencies ucrSelectorOneWayFreq.Reset() ucrReceiverOneWayFreq.SetMeAsReceiver() ucrSaveGraph.Reset() + 'To fix the problem of rdo both which does not satisfy the condition of having both functions present, line 75 &76 + rdoTable.Checked = True clsPlotGrid.SetPackageName("sjPlot") clsPlotGrid.SetRCommand("plot_grid") @@ -140,7 +142,10 @@ Public Class dlgOneWayFrequencies ucrReceiverWeights.SetRCode(clsSjTab, bReset) ucrReceiverOneWayFreq.SetRCode(clsSjTab, bReset) - ucrPnlFrequencies.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + If rdoGraph.Checked OrElse rdoTable.Checked Then + ucrPnlFrequencies.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + End If + ucrChkWeights.SetRCode(clsSjTab, bReset) ucrPnlSort.SetRCode(clsSjTab, bReset) ucrChkFlip.SetRCode(clsSjPlot, bReset) From edf0dd6c65da3c2a13262e4de29a408986e01004 Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 16 Jun 2017 09:33:46 +0300 Subject: [PATCH 034/201] two way freq --- instat/dlgOneWayFrequencies.vb | 4 ++-- instat/dlgTwoWayFrequencies.vb | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/instat/dlgOneWayFrequencies.vb b/instat/dlgOneWayFrequencies.vb index b9e3e8d6f52..ce61bbd273c 100644 --- a/instat/dlgOneWayFrequencies.vb +++ b/instat/dlgOneWayFrequencies.vb @@ -72,8 +72,8 @@ Public Class dlgOneWayFrequencies ucrPnlFrequencies.AddFunctionNamesCondition(rdoGraph, "plot_grid") 'setting rdoBoth 'This is incorrect but we can't currently do what's needed - ucrPnlFrequencies.AddFunctionNamesCondition(rdoBoth, "plot_grid") - ucrPnlFrequencies.AddFunctionNamesCondition(rdoBoth, "sjtab") + 'ucrPnlFrequencies.AddFunctionNamesCondition(rdoBoth, "plot_grid") + 'ucrPnlFrequencies.AddFunctionNamesCondition(rdoBoth, "sjtab") ucrPnlFrequencies.AddToLinkedControls(ucrChkFlip, {rdoGraph, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) ucrPnlFrequencies.AddToLinkedControls(ucrSaveGraph, {rdoGraph, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) diff --git a/instat/dlgTwoWayFrequencies.vb b/instat/dlgTwoWayFrequencies.vb index 5c40f06540a..f30147093e2 100644 --- a/instat/dlgTwoWayFrequencies.vb +++ b/instat/dlgTwoWayFrequencies.vb @@ -148,6 +148,8 @@ Public Class dlgTwoWayFrequencies ucrSelectorTwoWayFrequencies.Reset() ucrReceiverRowFactor.SetMeAsReceiver() ucrSaveGraph.Reset() + 'To fix the problem of rdo both which does not satisfy the condition of having both functions present, line 75 &76 + rdoTable.Checked = True 'Defining Table functions and default functions clsSjTab.SetPackageName("sjPlot") @@ -194,7 +196,9 @@ Public Class dlgTwoWayFrequencies ucrChkWeights.SetRCode(clsSjTab, bReset) ucrChkFlip.SetRCode(clsSjPlot, bReset) ucrPnlFreqType.SetRCode(clsSjPlot, bReset) - ucrPnlFreqDisplay.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + If rdoGraph.Checked OrElse rdoTable.Checked Then + ucrPnlFreqDisplay.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + End If ucrSelectorTwoWayFrequencies.SetRCode(clsSjTab, bReset) ucrChkCell.SetRCode(clsSjTab, bReset) ucrChkColumn.SetRCode(clsSjTab, bReset) From da6ffb218fc16d3ae8a11c453f05cb4447b432d5 Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 16 Jun 2017 09:36:29 +0300 Subject: [PATCH 035/201] three way freq --- instat/dlgThreeVariableFrequencies.vb | 8 ++++++-- instat/dlgTwoWayFrequencies.vb | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/instat/dlgThreeVariableFrequencies.vb b/instat/dlgThreeVariableFrequencies.vb index ac3e276e423..8d553c97587 100644 --- a/instat/dlgThreeVariableFrequencies.vb +++ b/instat/dlgThreeVariableFrequencies.vb @@ -109,7 +109,7 @@ Public Class dlgThreeVariableFrequencies ucrPnlFrequencyDisplay.AddRadioButton(rdoBoth) ucrPnlFrequencyDisplay.AddParameterPresentCondition(rdoTable, "sjtab") - ucrPnlFrequencyDisplay.AddParameterPresentCondition(rdoGraph, "sjplot") + ucrPnlFrequencyDisplay.AddParameterPresentCondition(rdoGraph, "gridExtra") ucrPnlFrequencyDisplay.AddToLinkedControls(ucrChkCount, {rdoTable, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) ucrPnlFrequencyDisplay.AddToLinkedControls(ucrSaveGraph, {rdoGraph, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) @@ -153,6 +153,8 @@ Public Class dlgThreeVariableFrequencies ucrSelectorThreeVariableFrequencies.Reset() ucrReceiverRowFactor.SetMeAsReceiver() ucrSaveGraph.Reset() + 'To fix the problem of rdo both which does not satisfy the condition of having both functions present, line 111 & 112 + rdoTable.Checked = True clsTableBaseOperator.SetOperation("%>%") clsTableBaseOperator.AddParameter("group_by", clsRFunctionParameter:=clsGroupBy, iPosition:=1) @@ -216,7 +218,9 @@ Public Class dlgThreeVariableFrequencies ucrChkWeights.SetRCode(clsSjTab, bReset) ucrChkFlip.SetRCode(clsSjPlot, bReset) ucrPnlFreqType.SetRCode(clsSjPlot, bReset) - ucrPnlFrequencyDisplay.SetRCode(clsCurrBaseCode, bReset) + If rdoGraph.Checked OrElse rdoTable.Checked Then + ucrPnlFrequencyDisplay.SetRCode(clsCurrBaseCode, bReset) + End If ucrSelectorThreeVariableFrequencies.SetRCode(clsTableBaseOperator, bReset) ucrChkCell.SetRCode(clsSjTab, bReset) ucrChkColumn.SetRCode(clsSjTab, bReset) diff --git a/instat/dlgTwoWayFrequencies.vb b/instat/dlgTwoWayFrequencies.vb index f30147093e2..05d16ffc0fc 100644 --- a/instat/dlgTwoWayFrequencies.vb +++ b/instat/dlgTwoWayFrequencies.vb @@ -148,7 +148,7 @@ Public Class dlgTwoWayFrequencies ucrSelectorTwoWayFrequencies.Reset() ucrReceiverRowFactor.SetMeAsReceiver() ucrSaveGraph.Reset() - 'To fix the problem of rdo both which does not satisfy the condition of having both functions present, line 75 &76 + 'To fix the problem of rdo both which does not satisfy the condition of having both functions present, line 121 & 122 rdoTable.Checked = True 'Defining Table functions and default functions From 5fe92f466a9629013bc417768d84c7cfac26dbe9 Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 16 Jun 2017 09:43:56 +0300 Subject: [PATCH 036/201] changing the function --- instat/dlgThreeVariableFrequencies.vb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instat/dlgThreeVariableFrequencies.vb b/instat/dlgThreeVariableFrequencies.vb index 8d553c97587..a9477ed82a6 100644 --- a/instat/dlgThreeVariableFrequencies.vb +++ b/instat/dlgThreeVariableFrequencies.vb @@ -109,7 +109,7 @@ Public Class dlgThreeVariableFrequencies ucrPnlFrequencyDisplay.AddRadioButton(rdoBoth) ucrPnlFrequencyDisplay.AddParameterPresentCondition(rdoTable, "sjtab") - ucrPnlFrequencyDisplay.AddParameterPresentCondition(rdoGraph, "gridExtra") + ucrPnlFrequencyDisplay.AddParameterPresentCondition(rdoGraph, "sjplot") ucrPnlFrequencyDisplay.AddToLinkedControls(ucrChkCount, {rdoTable, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) ucrPnlFrequencyDisplay.AddToLinkedControls(ucrSaveGraph, {rdoGraph, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) @@ -221,6 +221,7 @@ Public Class dlgThreeVariableFrequencies If rdoGraph.Checked OrElse rdoTable.Checked Then ucrPnlFrequencyDisplay.SetRCode(clsCurrBaseCode, bReset) End If + ucrSelectorThreeVariableFrequencies.SetRCode(clsTableBaseOperator, bReset) ucrChkCell.SetRCode(clsSjTab, bReset) ucrChkColumn.SetRCode(clsSjTab, bReset) From f0ee9d1f774757a64999eb4116f77f60b011022d Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Fri, 16 Jun 2017 09:39:27 +0100 Subject: [PATCH 037/201] added option to change data fame from dialog for #1985 --- instat/clsInstatOptions.vb | 12 ++++++++++++ instat/frmMain.vb | 4 ++++ instat/ucrDataFrame.vb | 6 ++++++ instat/ucrDataView.vb | 11 +++++++++++ 4 files changed, 33 insertions(+) diff --git a/instat/clsInstatOptions.vb b/instat/clsInstatOptions.vb index 8eb6730f258..1212f121624 100644 --- a/instat/clsInstatOptions.vb +++ b/instat/clsInstatOptions.vb @@ -20,6 +20,7 @@ Imports RDotNet Public bIncludeCommentDefault As Nullable(Of Boolean) 'sets the default for comments on the dialog Public iDigits As Nullable(Of Integer) Public bShowSignifStars As Nullable(Of Boolean) + Public bChangeDataFrame As Nullable(Of Boolean) 'Factory defaults Private DEFAULTbIncludeRDefaultParameters As Boolean = False @@ -37,6 +38,7 @@ Imports RDotNet Private DEFAULTiMaxRows As Integer = 1000 Private DEFAULTstrComment As String = "code generated by the dialog" Private DEFAULTstrGraphDisplayOption As String = "view_output_window" + Private DEFAULTbChangeDataFrame As Boolean = False 'TODO is this sensible? Private DEFAULTstrLanguageCultureCode As String = Thread.CurrentThread.CurrentCulture.Name Private DEFAULTstrWorkingDirectory As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) @@ -150,6 +152,12 @@ Imports RDotNet Else SetSignifStars(DEFAULTbShowSignifStars) End If + + If bChangeDataFrame.HasValue Then + SetChangeDataFrame(bChangeDataFrame) + Else + SetChangeDataFrame(DEFAULTbChangeDataFrame) + End If End Sub Public Sub SetMaxRows(iRows As Integer) @@ -278,4 +286,8 @@ Imports RDotNet frmMain.clsRLink.RunScript(clsOptionsFunction.ToScript(), strComment:="Option: Show stars on summary tables of coefficients") End If End Sub + + Public Sub SetChangeDataFrame(bNewChange As Boolean) + bChangeDataFrame = bNewChange + End Sub End Class \ No newline at end of file diff --git a/instat/frmMain.vb b/instat/frmMain.vb index e53c5606645..3e860e7b5a0 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -1405,6 +1405,10 @@ Public Class frmMain dlgClimaticSummary.ShowDialog() End Sub + Public Sub SetCurrentDataFrame(strDataName As String) + ucrDataViewer.SetCurrentDataFrame(strDataName) + End Sub + 'Private Sub TESTToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles TESTToolStripMenuItem.Click ' 'TEST temporary ' 'TESTING TO BE ERASED !!!!!!! diff --git a/instat/ucrDataFrame.vb b/instat/ucrDataFrame.vb index 96b69a61b19..04fcf8915b3 100644 --- a/instat/ucrDataFrame.vb +++ b/instat/ucrDataFrame.vb @@ -214,4 +214,10 @@ Public Class ucrDataFrame Public Overrides Function IsRDefault() As Boolean Return GetParameter() IsNot Nothing AndAlso objRDefault IsNot Nothing AndAlso objRDefault.Equals(cboAvailableDataFrames.Text) End Function + + Private Sub ucrDataFrame_DataFrameChanged(sender As Object, e As EventArgs, strPrevDataFrame As String) Handles Me.DataFrameChanged + If frmMain.clsInstatOptions.bChangeDataFrame Then + frmMain.SetCurrentDataFrame(cboAvailableDataFrames.Text) + End If + End Sub End Class \ No newline at end of file diff --git a/instat/ucrDataView.vb b/instat/ucrDataView.vb index 453540a1747..af3100a1cac 100644 --- a/instat/ucrDataView.vb +++ b/instat/ucrDataView.vb @@ -680,4 +680,15 @@ Public Class ucrDataView dlgAddComment.SetCurrentColumn(SelectedColumnsAsArray()(0), grdCurrSheet.Name) dlgAddComment.ShowDialog() End Sub + + Public Sub SetCurrentDataFrame(strDataName As String) + Dim grdWorksheet As unvell.ReoGrid.Worksheet + + If grdData IsNot Nothing Then + grdWorksheet = grdData.GetWorksheetByName(strDataName) + If grdWorksheet IsNot Nothing Then + grdData.CurrentWorksheet = grdWorksheet + End If + End If + End Sub End Class From 09f5de8822bf5009df9ce61eef2b837b320dea90 Mon Sep 17 00:00:00 2001 From: John Lunalo Date: Fri, 16 Jun 2017 11:42:07 +0300 Subject: [PATCH 038/201] updating controls --- instat/dlgRegressionSimple.Designer.vb | 270 +++++++--------- instat/dlgRegressionSimple.vb | 428 ++++++++++++++----------- 2 files changed, 361 insertions(+), 337 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 2b0236fac1f..047d78f473c 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -30,38 +30,31 @@ Partial Class dlgRegressionSimple Me.lblResponse = New System.Windows.Forms.Label() Me.lblExplanatory = New System.Windows.Forms.Label() Me.cmdDisplayOptions = New System.Windows.Forms.Button() - Me.chkSaveModel = New System.Windows.Forms.CheckBox() Me.cmdModelOptions = New System.Windows.Forms.Button() - Me.chkFunction = New System.Windows.Forms.CheckBox() - Me.chkConvertToVariate = New System.Windows.Forms.CheckBox() Me.lblModelPreview = New System.Windows.Forms.Label() - Me.chkPaired = New System.Windows.Forms.CheckBox() - Me.rdoGeneral = New System.Windows.Forms.RadioButton() - Me.rdoSpecific = New System.Windows.Forms.RadioButton() Me.lblNumeric = New System.Windows.Forms.Label() Me.lblFactor = New System.Windows.Forms.Label() - Me.nudCI = New System.Windows.Forms.NumericUpDown() - Me.nudHypothesis = New System.Windows.Forms.NumericUpDown() - Me.lblCI = New System.Windows.Forms.Label() Me.lblHyp1 = New System.Windows.Forms.Label() Me.grpParameters = New System.Windows.Forms.GroupBox() - Me.ucrNud = New instat.ucrNud() - Me.lblSuccessIf = New System.Windows.Forms.Label() - Me.ucrLevel2 = New instat.ucrInputComboBox() - Me.ucrLevel1 = New instat.ucrInputComboBox() - Me.lblLevel2 = New System.Windows.Forms.Label() - Me.rdoCompareVar = New System.Windows.Forms.RadioButton() - Me.lblLevel1 = New System.Windows.Forms.Label() + Me.ucrNudHypothesis = New instat.ucrNud() + Me.ucrChkPairedTest = New instat.ucrCheck() + Me.ucrNudCI = New instat.ucrNud() + Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() + Me.ucrPnlMeansAndVariance = New instat.UcrPanel() + Me.lblConfidenceInterval = New System.Windows.Forms.Label() + Me.lblDifferenceInMeans = New System.Windows.Forms.Label() Me.ucrModelPreview = New instat.ucrInputTextBox() Me.ucrExplanatory = New instat.ucrReceiverSingle() Me.ucrResponse = New instat.ucrReceiverSingle() - Me.ucrModelName = New instat.ucrInputComboBox() Me.ucrSelectorSimpleReg = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrFamily = New instat.ucrDistributions() Me.ucrBase = New instat.ucrButtons() - CType(Me.nudCI, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudHypothesis, System.ComponentModel.ISupportInitialize).BeginInit() + Me.rdoGeneralCase = New System.Windows.Forms.RadioButton() + Me.rdoTwoSample = New System.Windows.Forms.RadioButton() + Me.ucrPnlModelType = New instat.UcrPanel() + Me.ucrChkConvertToVariate = New instat.ucrCheck() + Me.ucrSaveModels = New instat.ucrSave() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -106,13 +99,6 @@ Partial Class dlgRegressionSimple Me.cmdDisplayOptions.Tag = "Display_Options..." Me.cmdDisplayOptions.UseVisualStyleBackColor = True ' - 'chkSaveModel - ' - resources.ApplyResources(Me.chkSaveModel, "chkSaveModel") - Me.chkSaveModel.Name = "chkSaveModel" - Me.chkSaveModel.Tag = "Save_Model" - Me.chkSaveModel.UseVisualStyleBackColor = True - ' 'cmdModelOptions ' resources.ApplyResources(Me.cmdModelOptions, "cmdModelOptions") @@ -120,44 +106,11 @@ Partial Class dlgRegressionSimple Me.cmdModelOptions.Tag = "Model_Options..." Me.cmdModelOptions.UseVisualStyleBackColor = True ' - 'chkFunction - ' - resources.ApplyResources(Me.chkFunction, "chkFunction") - Me.chkFunction.Name = "chkFunction" - Me.chkFunction.Tag = "Function" - Me.chkFunction.UseVisualStyleBackColor = True - ' - 'chkConvertToVariate - ' - resources.ApplyResources(Me.chkConvertToVariate, "chkConvertToVariate") - Me.chkConvertToVariate.Name = "chkConvertToVariate" - Me.chkConvertToVariate.UseVisualStyleBackColor = True - ' 'lblModelPreview ' resources.ApplyResources(Me.lblModelPreview, "lblModelPreview") Me.lblModelPreview.Name = "lblModelPreview" ' - 'chkPaired - ' - resources.ApplyResources(Me.chkPaired, "chkPaired") - Me.chkPaired.Name = "chkPaired" - Me.chkPaired.UseVisualStyleBackColor = True - ' - 'rdoGeneral - ' - resources.ApplyResources(Me.rdoGeneral, "rdoGeneral") - Me.rdoGeneral.Name = "rdoGeneral" - Me.rdoGeneral.TabStop = True - Me.rdoGeneral.UseVisualStyleBackColor = True - ' - 'rdoSpecific - ' - resources.ApplyResources(Me.rdoSpecific, "rdoSpecific") - Me.rdoSpecific.Name = "rdoSpecific" - Me.rdoSpecific.TabStop = True - Me.rdoSpecific.UseVisualStyleBackColor = True - ' 'lblNumeric ' resources.ApplyResources(Me.lblNumeric, "lblNumeric") @@ -168,21 +121,6 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.lblFactor, "lblFactor") Me.lblFactor.Name = "lblFactor" ' - 'nudCI - ' - resources.ApplyResources(Me.nudCI, "nudCI") - Me.nudCI.Name = "nudCI" - ' - 'nudHypothesis - ' - resources.ApplyResources(Me.nudHypothesis, "nudHypothesis") - Me.nudHypothesis.Name = "nudHypothesis" - ' - 'lblCI - ' - resources.ApplyResources(Me.lblCI, "lblCI") - Me.lblCI.Name = "lblCI" - ' 'lblHyp1 ' resources.ApplyResources(Me.lblHyp1, "lblHyp1") @@ -190,95 +128,99 @@ Partial Class dlgRegressionSimple ' 'grpParameters ' - Me.grpParameters.Controls.Add(Me.ucrNud) - Me.grpParameters.Controls.Add(Me.lblSuccessIf) - Me.grpParameters.Controls.Add(Me.ucrLevel2) - Me.grpParameters.Controls.Add(Me.ucrLevel1) - Me.grpParameters.Controls.Add(Me.lblLevel2) - Me.grpParameters.Controls.Add(Me.rdoCompareVar) - Me.grpParameters.Controls.Add(Me.lblCI) - Me.grpParameters.Controls.Add(Me.lblLevel1) - Me.grpParameters.Controls.Add(Me.nudCI) - Me.grpParameters.Controls.Add(Me.nudHypothesis) - Me.grpParameters.Controls.Add(Me.chkPaired) - Me.grpParameters.Controls.Add(Me.lblHyp1) + Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) + Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) + Me.grpParameters.Controls.Add(Me.ucrNudCI) + Me.grpParameters.Controls.Add(Me.rdoCompareVariance) Me.grpParameters.Controls.Add(Me.rdoCompareMeans) + Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) + Me.grpParameters.Controls.Add(Me.lblHyp1) + Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) + Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) resources.ApplyResources(Me.grpParameters, "grpParameters") Me.grpParameters.Name = "grpParameters" Me.grpParameters.TabStop = False ' - 'ucrNud + 'ucrNudHypothesis ' - resources.ApplyResources(Me.ucrNud, "ucrNud") - Me.ucrNud.Maximum = 100 - Me.ucrNud.Minimum = 0 - Me.ucrNud.Name = "ucrNud" - Me.ucrNud.Value = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudHypothesis.DecimalPlaces = New Decimal(New Integer() {2, 0, 0, 0}) + Me.ucrNudHypothesis.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + resources.ApplyResources(Me.ucrNudHypothesis, "ucrNudHypothesis") + Me.ucrNudHypothesis.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudHypothesis.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudHypothesis.Name = "ucrNudHypothesis" + Me.ucrNudHypothesis.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'lblSuccessIf + 'ucrChkPairedTest ' - resources.ApplyResources(Me.lblSuccessIf, "lblSuccessIf") - Me.lblSuccessIf.Name = "lblSuccessIf" + Me.ucrChkPairedTest.Checked = False + resources.ApplyResources(Me.ucrChkPairedTest, "ucrChkPairedTest") + Me.ucrChkPairedTest.Name = "ucrChkPairedTest" ' - 'ucrLevel2 + 'ucrNudCI ' - Me.ucrLevel2.IsReadOnly = False - resources.ApplyResources(Me.ucrLevel2, "ucrLevel2") - Me.ucrLevel2.Name = "ucrLevel2" + Me.ucrNudCI.DecimalPlaces = New Decimal(New Integer() {2, 0, 0, 0}) + Me.ucrNudCI.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + resources.ApplyResources(Me.ucrNudCI, "ucrNudCI") + Me.ucrNudCI.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudCI.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudCI.Name = "ucrNudCI" + Me.ucrNudCI.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'ucrLevel1 + 'rdoCompareVariance ' - Me.ucrLevel1.IsReadOnly = False - resources.ApplyResources(Me.ucrLevel1, "ucrLevel1") - Me.ucrLevel1.Name = "ucrLevel1" + resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") + Me.rdoCompareVariance.Name = "rdoCompareVariance" + Me.rdoCompareVariance.TabStop = True + Me.rdoCompareVariance.UseVisualStyleBackColor = True ' - 'lblLevel2 + 'rdoCompareMeans ' - resources.ApplyResources(Me.lblLevel2, "lblLevel2") - Me.lblLevel2.Name = "lblLevel2" + resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") + Me.rdoCompareMeans.Name = "rdoCompareMeans" + Me.rdoCompareMeans.TabStop = True + Me.rdoCompareMeans.UseVisualStyleBackColor = True ' - 'rdoCompareVar + 'ucrPnlMeansAndVariance ' - resources.ApplyResources(Me.rdoCompareVar, "rdoCompareVar") - Me.rdoCompareVar.Name = "rdoCompareVar" - Me.rdoCompareVar.TabStop = True - Me.rdoCompareVar.UseVisualStyleBackColor = True + resources.ApplyResources(Me.ucrPnlMeansAndVariance, "ucrPnlMeansAndVariance") + Me.ucrPnlMeansAndVariance.Name = "ucrPnlMeansAndVariance" ' - 'lblLevel1 + 'lblConfidenceInterval ' - resources.ApplyResources(Me.lblLevel1, "lblLevel1") - Me.lblLevel1.Name = "lblLevel1" + resources.ApplyResources(Me.lblConfidenceInterval, "lblConfidenceInterval") + Me.lblConfidenceInterval.Name = "lblConfidenceInterval" ' - 'rdoCompareMeans + 'lblDifferenceInMeans ' - resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") - Me.rdoCompareMeans.Name = "rdoCompareMeans" - Me.rdoCompareMeans.TabStop = True - Me.rdoCompareMeans.UseVisualStyleBackColor = True + resources.ApplyResources(Me.lblDifferenceInMeans, "lblDifferenceInMeans") + Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" ' 'ucrModelPreview ' + Me.ucrModelPreview.AddQuotesIfUnrecognised = True + Me.ucrModelPreview.IsMultiline = False Me.ucrModelPreview.IsReadOnly = False resources.ApplyResources(Me.ucrModelPreview, "ucrModelPreview") Me.ucrModelPreview.Name = "ucrModelPreview" ' 'ucrExplanatory ' + Me.ucrExplanatory.frmParent = Me resources.ApplyResources(Me.ucrExplanatory, "ucrExplanatory") Me.ucrExplanatory.Name = "ucrExplanatory" Me.ucrExplanatory.Selector = Nothing + Me.ucrExplanatory.strNcFilePath = "" + Me.ucrExplanatory.ucrSelector = Nothing ' 'ucrResponse ' + Me.ucrResponse.frmParent = Me resources.ApplyResources(Me.ucrResponse, "ucrResponse") Me.ucrResponse.Name = "ucrResponse" Me.ucrResponse.Selector = Nothing - ' - 'ucrModelName - ' - Me.ucrModelName.IsReadOnly = False - resources.ApplyResources(Me.ucrModelName, "ucrModelName") - Me.ucrModelName.Name = "ucrModelName" + Me.ucrResponse.strNcFilePath = "" + Me.ucrResponse.ucrSelector = Nothing ' 'ucrSelectorSimpleReg ' @@ -297,26 +239,61 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrBase, "ucrBase") Me.ucrBase.Name = "ucrBase" ' + 'rdoGeneralCase + ' + resources.ApplyResources(Me.rdoGeneralCase, "rdoGeneralCase") + Me.rdoGeneralCase.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoGeneralCase.FlatAppearance.BorderSize = 2 + Me.rdoGeneralCase.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoGeneralCase.ForeColor = System.Drawing.SystemColors.ControlText + Me.rdoGeneralCase.Name = "rdoGeneralCase" + Me.rdoGeneralCase.UseVisualStyleBackColor = True + ' + 'rdoTwoSample + ' + resources.ApplyResources(Me.rdoTwoSample, "rdoTwoSample") + Me.rdoTwoSample.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoTwoSample.FlatAppearance.BorderSize = 2 + Me.rdoTwoSample.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoTwoSample.ForeColor = System.Drawing.SystemColors.ActiveCaptionText + Me.rdoTwoSample.Name = "rdoTwoSample" + Me.rdoTwoSample.UseVisualStyleBackColor = True + ' + 'ucrPnlModelType + ' + resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") + Me.ucrPnlModelType.Name = "ucrPnlModelType" + ' + 'ucrChkConvertToVariate + ' + Me.ucrChkConvertToVariate.Checked = False + resources.ApplyResources(Me.ucrChkConvertToVariate, "ucrChkConvertToVariate") + Me.ucrChkConvertToVariate.Name = "ucrChkConvertToVariate" + ' + 'ucrSaveModels + ' + resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") + Me.ucrSaveModels.Name = "ucrSaveModels" + ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.Controls.Add(Me.ucrSaveModels) + Me.Controls.Add(Me.ucrChkConvertToVariate) + Me.Controls.Add(Me.rdoGeneralCase) + Me.Controls.Add(Me.rdoTwoSample) + Me.Controls.Add(Me.ucrPnlModelType) Me.Controls.Add(Me.grpParameters) Me.Controls.Add(Me.lblFactor) Me.Controls.Add(Me.lblNumeric) - Me.Controls.Add(Me.rdoSpecific) - Me.Controls.Add(Me.rdoGeneral) Me.Controls.Add(Me.ucrModelPreview) Me.Controls.Add(Me.ucrExplanatory) Me.Controls.Add(Me.ucrResponse) Me.Controls.Add(Me.lblModelPreview) - Me.Controls.Add(Me.chkConvertToVariate) - Me.Controls.Add(Me.ucrModelName) Me.Controls.Add(Me.ucrSelectorSimpleReg) Me.Controls.Add(Me.ucrFamily) - Me.Controls.Add(Me.chkFunction) Me.Controls.Add(Me.cmdModelOptions) - Me.Controls.Add(Me.chkSaveModel) Me.Controls.Add(Me.cmdDisplayOptions) Me.Controls.Add(Me.lblExplanatory) Me.Controls.Add(Me.lblResponse) @@ -329,8 +306,6 @@ Partial Class dlgRegressionSimple Me.ShowIcon = False Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide Me.Tag = "Simple_Regression" - CType(Me.nudCI, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudHypothesis, System.ComponentModel.ISupportInitialize).EndInit() Me.grpParameters.ResumeLayout(False) Me.grpParameters.PerformLayout() Me.ResumeLayout(False) @@ -346,33 +321,28 @@ Partial Class dlgRegressionSimple Friend WithEvents lblResponse As Label Friend WithEvents lblExplanatory As Label Friend WithEvents cmdDisplayOptions As Button - Friend WithEvents chkSaveModel As CheckBox Friend WithEvents cmdModelOptions As Button - Friend WithEvents chkFunction As CheckBox Friend WithEvents ucrFamily As ucrDistributions Friend WithEvents ucrSelectorSimpleReg As ucrSelectorByDataFrameAddRemove - Friend WithEvents ucrModelName As ucrInputComboBox - Friend WithEvents chkConvertToVariate As CheckBox Friend WithEvents lblModelPreview As Label Friend WithEvents ucrResponse As ucrReceiverSingle Friend WithEvents ucrExplanatory As ucrReceiverSingle Friend WithEvents ucrModelPreview As ucrInputTextBox - Friend WithEvents chkPaired As CheckBox - Friend WithEvents rdoGeneral As RadioButton - Friend WithEvents rdoSpecific As RadioButton Friend WithEvents lblNumeric As Label Friend WithEvents lblFactor As Label - Friend WithEvents nudCI As NumericUpDown - Friend WithEvents nudHypothesis As NumericUpDown - Friend WithEvents lblCI As Label Friend WithEvents lblHyp1 As Label Friend WithEvents grpParameters As GroupBox + Friend WithEvents lblConfidenceInterval As Label + Friend WithEvents lblDifferenceInMeans As Label + Friend WithEvents ucrChkConvertToVariate As ucrCheck + Friend WithEvents rdoGeneralCase As RadioButton + Friend WithEvents rdoTwoSample As RadioButton + Friend WithEvents ucrPnlModelType As UcrPanel + Friend WithEvents ucrChkPairedTest As ucrCheck + Friend WithEvents rdoCompareVariance As RadioButton Friend WithEvents rdoCompareMeans As RadioButton - Friend WithEvents rdoCompareVar As RadioButton - Friend WithEvents lblLevel1 As Label - Friend WithEvents lblLevel2 As Label - Friend WithEvents ucrLevel1 As ucrInputComboBox - Friend WithEvents ucrLevel2 As ucrInputComboBox - Friend WithEvents lblSuccessIf As Label - Friend WithEvents ucrNud As ucrNud + Friend WithEvents ucrPnlMeansAndVariance As UcrPanel + Friend WithEvents ucrSaveModels As ucrSave + Friend WithEvents ucrNudCI As ucrNud + Friend WithEvents ucrNudHypothesis As ucrNud End Class \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 37d3960887f..84e8feaaceb 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -20,30 +20,78 @@ Public Class dlgRegressionSimple Public clsModel, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator Public clsRPoisson, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest As New RFunction Public clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric As New RFunction - Public clsRLength, clsRLength2, clsRLengthGrouped, clsRLengthGrouped2, clsRLength3, clsRLengthGrouped3, clsRLength4, clsRLengthGrouped4, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLength5, clsRLengthGrouped5, clsRLength6, clsRLengthGrouped6 As New RFunction - Public clsRLmOrGLM As New RFunction + Public clsRLength, clsRLength2, clsRLengthGrouped, clsRLengthGrouped2, clsRLength3, clsRLengthGrouped3, clsRLength4, clsRLengthGrouped4, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLength5, clsRLengthGrouped5, clsRLength6, clsRLengthGrouped6, clsRLmOrGLM As New RFunction + Private clsFormulaOperator As New ROperator + Private bReset As Boolean = True Private Sub dlgRegressionSimple_Load(sender As Object, e As EventArgs) Handles Me.Load + autoTranslate(Me) If bFirstLoad Then InitialiseDialog() - SetDefaults() bFirstLoad = False - Else - ReopenDialog() End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False autoTranslate(Me) End Sub + Private Sub SetRCodeForControls(bReset) + + End Sub + Private Sub InitialiseDialog() ucrBase.clsRsyntax.iCallType = 2 - clsModel.SetOperation("~") + + ucrResponse.Selector = ucrSelectorSimpleReg ucrExplanatory.Selector = ucrSelectorSimpleReg ucrBase.iHelpTopicID = 366 - ucrModelName.SetDataFrameSelector(ucrSelectorSimpleReg.ucrAvailableDataFrames) - ucrModelName.SetItemsTypeAsModels() - ucrModelName.SetDefaultTypeAsModel() - ucrModelName.SetValidationTypeAsRVariable() + + ucrSaveModels.SetPrefix("reg") + ucrSaveModels.SetText("Save Models") + ucrSaveModels.SetDataFrameSelector(ucrSelectorSimpleReg.ucrAvailableDataFrames) + ucrSaveModels.SetSaveTypeAsModel() + ucrModelPreview.IsReadOnly = True + + ucrPnlModelType.AddRadioButton(rdoGeneralCase) + ucrPnlModelType.AddRadioButton(rdoTwoSample) + + ucrPnlModelType.AddToLinkedControls(ucrModelPreview, {rdoGeneralCase}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True) + ucrModelPreview.SetLinkedDisplayControl(lblModelPreview) + ucrModelPreview.SetLinkedDisplayControl(cmdDisplayOptions) + ucrModelPreview.SetLinkedDisplayControl(cmdModelOptions) + + + ucrPnlModelType.AddToLinkedControls(ucrNudCI, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=0.95) + ucrNudCI.SetLinkedDisplayControl(lblConfidenceInterval) + ucrNudCI.SetLinkedDisplayControl(grpParameters) + + ucrPnlModelType.AddToLinkedControls(ucrNudHypothesis, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=0) + ucrNudHypothesis.SetLinkedDisplayControl(lblDifferenceInMeans) + ucrNudHypothesis.SetLinkedDisplayControl(grpParameters) + + + ucrPnlModelType.AddToLinkedControls(ucrPnlMeansAndVariance, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=rdoCompareMeans) + ucrPnlMeansAndVariance.SetLinkedDisplayControl(grpParameters) + + ucrPnlModelType.AddToLinkedControls(ucrChkPairedTest, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=False) + ucrChkPairedTest.SetText("Paired Text") + ucrChkPairedTest.Enabled = False 'for the time being + + ucrResponse.SetParameter(New RParameter("y", 0)) + ucrResponse.SetParameterIsRFunction() + + ucrExplanatory.SetParameter(New RParameter("x", 2)) + ucrExplanatory.SetParameterIsRFunction() + + ucrSelectorSimpleReg.SetParameter(New RParameter("data", 0)) + ucrSelectorSimpleReg.SetParameterIsrfunction() + + + sdgSimpleRegOptions.SetRModelFunction(clsRLmOrGLM) sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) sdgSimpleRegOptions.SetRYVariable(ucrResponse) @@ -53,34 +101,40 @@ Public Class dlgRegressionSimple sdgVariableTransformations.SetRModelOperator(clsModel) sdgModelOptions.SetRCIFunction(clsRCIFunction) sdgVariableTransformations.SetRCIFunction(clsRCIFunction) - AssignModelName() - nudCI.Increment = 0.05 - nudCI.Minimum = 0 - nudCI.Maximum = 1 - nudCI.DecimalPlaces = 2 - nudHypothesis.DecimalPlaces = 2 - chkPaired.Enabled = False 'for the time being - End Sub - Private Sub ReopenDialog() + + + End Sub Private Sub SetDefaults() - ucrModelName.SetPrefix("reg") + clsFormulaOperator = New ROperator + clsRLmOrGLM = New RFunction ucrSelectorSimpleReg.Reset() ucrResponse.SetMeAsReceiver() ucrSelectorSimpleReg.Focus() - chkSaveModel.Checked = True - chkConvertToVariate.Checked = False - chkConvertToVariate.Visible = False - chkFunction.Checked = False - chkFunction.Visible = False - rdoGeneral.Checked = True - nudCI.Value = 0.95 + ucrModelPreview.Reset() + + + clsFormulaOperator.SetOperation("~") + clsFormulaOperator.AddParameter("y", 1, iPosition:=0) + clsFormulaOperator.AddParameter("x", 1, iPosition:=1) + + clsRLmOrGLM.SetRCommand("lm") + clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator) + + clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=ucrSaveModels.GetText, bAssignToIsPrefix:=True) + + AssignModelName() + 'nudCI.Increment = 0.05 + 'nudCI.Minimum = 0 + 'nudCI.Maximum = 1 + 'nudCI.DecimalPlaces = 2 + 'nudHypothesis.DecimalPlaces = 2 + sdgSimpleRegOptions.SetDefaults() sdgModelOptions.SetDefaults() - ucrModelName.Reset() ucrModelPreview.SetName("") SetRCode() ucrFamily.SetGLMDistributions() @@ -114,9 +168,9 @@ Public Class dlgRegressionSimple clsRTTest.SetPackageName("mosaic") clsRTTest.SetRCommand("t.test") ucrBase.clsRsyntax.SetBaseRFunction(clsRTTest) - clsRTTest.AddParameter("conf.level", nudCI.Value.ToString()) + ' clsRTTest.AddParameter("conf.level", nudCI.Value.ToString()) clsRTTest.AddParameter("data", clsRFunctionParameter:=ucrSelectorSimpleReg.ucrAvailableDataFrames.clsCurrDataFrame) - clsRTTest.AddParameter("mu", nudHypothesis.Value.ToString()) + ' clsRTTest.AddParameter("mu", nudHypothesis.Value.ToString()) ' If ucrExplanatory.strCurrDataType = "numeric" OrElse ucrExplanatory.strCurrDataType = "integer" Then ' clsRTTest.AddParameter("x", clsRFunctionParameter:=ucrResponse.GetVariables()) ' clsRTTest.AddParameter("y", clsRFunctionParameter:=ucrExplanatory.GetVariables()) @@ -126,7 +180,7 @@ Public Class dlgRegressionSimple clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) clsRTTest.AddParameter("x", clsROperatorParameter:=clsModel) ' End If - If chkPaired.Checked Then + If ucrChkPairedTest.Checked Then clsRTTest.AddParameter("paired", "TRUE") Else clsRTTest.RemoveParameterByName("paired") @@ -137,9 +191,9 @@ Public Class dlgRegressionSimple clsRFTest.SetPackageName("stats") clsRFTest.SetRCommand("var.test") ucrBase.clsRsyntax.SetBaseRFunction(clsRFTest) - clsRFTest.AddParameter("conf.level", nudCI.Value.ToString()) + ' clsRFTest.AddParameter("conf.level", nudCI.Value.ToString()) clsRFTest.AddParameter("data", clsRFunctionParameter:=ucrSelectorSimpleReg.ucrAvailableDataFrames.clsCurrDataFrame) - clsRFTest.AddParameter("mu", nudHypothesis.Value.ToString()) + ' clsRFTest.AddParameter("mu", nudHypothesis.Value.ToString()) clsModel.SetOperation("~") clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) @@ -150,8 +204,8 @@ Public Class dlgRegressionSimple clsRWilcoxTest.SetPackageName("stats") clsRWilcoxTest.SetRCommand("wilcox.test") ucrBase.clsRsyntax.SetBaseRFunction(clsRWilcoxTest) - clsRWilcoxTest.AddParameter("conf.level", nudCI.Value.ToString()) - clsRWilcoxTest.AddParameter("mu", nudHypothesis.Value.ToString()) + ' clsRWilcoxTest.AddParameter("conf.level", nudCI.Value.ToString()) + ' clsRWilcoxTest.AddParameter("mu", nudHypothesis.Value.ToString()) clsModel.SetOperation("~") clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) @@ -169,7 +223,7 @@ Public Class dlgRegressionSimple End Sub Public Sub DataTypeAccepted() - If rdoSpecific.Checked Then + If rdoTwoSample.Checked Then ucrResponse.SetIncludedDataTypes({"integer", "numeric"}) ucrExplanatory.SetIncludedDataTypes({"character", "factor"}) If ucrResponse.strCurrDataType = "factor" OrElse ucrResponse.strCurrDataType = "character" Then @@ -178,7 +232,7 @@ Public Class dlgRegressionSimple If ucrExplanatory.strCurrDataType = "integer" OrElse ucrExplanatory.strCurrDataType = "numeric" OrElse ucrResponse.strCurrDataType = "positive integer" Then ucrExplanatory.Clear() End If - ElseIf rdoGeneral.Checked Then + ElseIf rdoGeneralCase.Checked Then ucrResponse.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) ucrExplanatory.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) End If @@ -189,7 +243,7 @@ Public Class dlgRegressionSimple clsRBinomial.SetRCommand("mosaic") clsRBinomial.SetRCommand("prop.test") ucrBase.clsRsyntax.SetBaseRFunction(clsRBinomial) - clsRBinomial.AddParameter("conf.level", nudCI.Value.ToString()) + ' clsRBinomial.AddParameter("conf.level", nudCI.Value.ToString()) clsRBinomial.AddParameter("data", ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text) clsRBinomial.AddParameter("x", clsRFunctionParameter:=clsyFunc) clsRBinomial.AddParameter("n", clsRFunctionParameter:=clsnFunc) @@ -236,19 +290,19 @@ Public Class dlgRegressionSimple clsRFactor.AddParameter("x", clsROperatorParameter:=clsRBinomialOperation) clsRBinomialOperation.SetOperation("==") clsRBinomialOperation.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) - clsRBinomialOperation.AddParameter(strParameterValue:=ucrLevel1.GetText()) + ' clsRBinomialOperation.AddParameter(strParameterValue:=ucrLevel1.GetText()) '' x=ucrExplanatory == Level2 clsRFactor2.AddParameter("x", clsROperatorParameter:=clsRBinomialOperation2) clsRBinomialOperation2.SetOperation("==") clsRBinomialOperation2.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) - clsRBinomialOperation2.AddParameter(strParameterValue:=ucrLevel2.GetText()) + ' clsRBinomialOperation2.AddParameter(strParameterValue:=ucrLevel2.GetText()) '' x=ucrResponse == SuccessIf clsRNumeric.AddParameter("x", clsROperatorParameter:=clsRBinomialOperation3) clsRBinomialOperation3.SetOperation("==") clsRBinomialOperation3.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) - clsRBinomialOperation3.AddParameter(strParameterValue:=ucrNud.Value) + ' clsRBinomialOperation3.AddParameter(strParameterValue:=ucrNud.Value) ' If two factors: ' clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) @@ -263,8 +317,8 @@ Public Class dlgRegressionSimple clsRPoisson.SetPackageName("stats") clsRPoisson.SetRCommand("poisson.test") ucrBase.clsRsyntax.SetBaseRFunction(clsRPoisson) - clsRPoisson.AddParameter("conf.level", nudCI.Value.ToString()) - clsRPoisson.AddParameter("r", nudHypothesis.Value.ToString()) + 'clsRPoisson.AddParameter("conf.level", nudCI.Value.ToString()) + 'clsRPoisson.AddParameter("r", nudHypothesis.Value.ToString()) ' x = ... @@ -281,7 +335,7 @@ Public Class dlgRegressionSimple clsRGroup.AddParameter("x", clsROperatorParameter:=clsPoissonOperation) clsPoissonOperation.SetOperation("==") clsPoissonOperation.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) - clsPoissonOperation.AddParameter(strParameterValue:=ucrLevel1.GetText()) + ' clsPoissonOperation.AddParameter(strParameterValue:=ucrLevel1.GetText()) clsRLength6.SetRCommand("length") clsRLength6.AddParameter("x", clsRFunctionParameter:=clsRLengthGrouped6) @@ -289,7 +343,7 @@ Public Class dlgRegressionSimple clsRGroup2.AddParameter("x", clsROperatorParameter:=clsPoissonOperation2) clsPoissonOperation2.SetOperation("==") clsPoissonOperation2.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) - clsPoissonOperation2.AddParameter(strParameterValue:=ucrLevel2.GetText()) + ' clsPoissonOperation2.AddParameter(strParameterValue:=ucrLevel2.GetText()) ' T = ... ' T =c(mean(Calls[Group == 1]), mean(Calls[Group == 2]))) @@ -326,17 +380,17 @@ Public Class dlgRegressionSimple clsRBinomial.ClearParameters() clsRTTest.ClearParameters() clsRLmOrGLM.ClearParameters() - If rdoGeneral.Checked Then + If rdoGeneralCase.Checked Then If (ucrFamily.clsCurrDistribution.strNameTag = "Normal") Then LM() Else GLM() End If - ElseIf rdoSpecific.Checked Then + ElseIf rdoTwoSample.Checked Then If ucrFamily.clsCurrDistribution.strNameTag = "Normal" Then If rdoCompareMeans.Checked Then SetTTest() - ElseIf rdoCompareVar.Checked Then + ElseIf rdoCompareVariance.Checked Then SetFTest() End If ElseIf ucrFamily.clsCurrDistribution.strNameTag = "Poisson" Then @@ -346,7 +400,7 @@ Public Class dlgRegressionSimple Else If rdoCompareMeans.Checked Then SetWilcoxTest() - ElseIf rdoCompareVar.Checked Then + ElseIf rdoCompareVariance.Checked Then SetKruskalTest() End If End If @@ -355,14 +409,14 @@ Public Class dlgRegressionSimple End Sub Private Sub TestOKEnabled() - If Not ucrResponse.IsEmpty() AndAlso Not ucrExplanatory.IsEmpty() AndAlso ucrFamily.Enabled AndAlso Not ucrFamily.ucrInputDistributions.IsEmpty() AndAlso (chkSaveModel.Checked AndAlso Not ucrModelName.IsEmpty() OrElse Not chkSaveModel.Checked) Then + If Not ucrResponse.IsEmpty() AndAlso Not ucrExplanatory.IsEmpty() AndAlso ucrFamily.Enabled AndAlso Not ucrFamily.ucrInputDistributions.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then ucrModelPreview.SetName(clsModel.ToScript) ' If rdoSpecific.Checked AndAlso (ucrFamily.clsCurrDistribution.strNameTag = "Poisson" OrElse ucrFamily.clsCurrDistribution.strNameTag = "Binomial") AndAlso Not (ucrLevel1.IsEmpty OrElse ucrLevel2.IsEmpty) Then ucrBase.OKEnabled(True) ' Else ' ucrBase.OKEnabled(False) ' End If - If rdoGeneral.Checked Then + If rdoGeneralCase.Checked Then ucrBase.clsRsyntax.AddParameter("formula", clsROperatorParameter:=clsModel) End If Else @@ -381,17 +435,17 @@ Public Class dlgRegressionSimple End Sub Public Sub ConvertToVariate() - If rdoGeneral.Checked Then + If rdoGeneralCase.Checked Then If Not ucrResponse.IsEmpty Then ucrFamily.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrResponse.GetVariableNames(bWithQuotes:=False)) If ucrFamily.strDataType = "numeric" Then - chkConvertToVariate.Checked = False - chkConvertToVariate.Visible = False + ucrChkConvertToVariate.Checked = False + ucrChkConvertToVariate.Visible = False Else - chkConvertToVariate.Visible = True + ucrChkConvertToVariate.Visible = True End If sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) - If chkConvertToVariate.Checked Then + If ucrChkConvertToVariate.Checked Then clsRConvert.SetRCommand("as.numeric") clsRConvert.AddParameter("x", ucrResponse.GetVariableNames(bWithQuotes:=False)) clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=clsRConvert) @@ -437,7 +491,7 @@ Public Class dlgRegressionSimple End If End Sub - Private Sub chkConvertToVariate_CheckedChanged(sender As Object, e As EventArgs) Handles chkConvertToVariate.CheckedChanged, chkConvertToVariate.VisibleChanged + Private Sub chkConvertToVariate_CheckedChanged(sender As Object, e As EventArgs) SetRCode() ConvertToVariate() TestOKEnabled() @@ -446,20 +500,20 @@ Public Class dlgRegressionSimple Private Sub ExplanatoryFunctionSelect() Dim strExplanatoryType As String - If Not ucrExplanatory.IsEmpty AndAlso rdoGeneral.Checked Then + If Not ucrExplanatory.IsEmpty AndAlso rdoGeneralCase.Checked Then strExplanatoryType = frmMain.clsRLink.GetDataType(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrExplanatory.GetVariableNames(bWithQuotes:=False)) - If rdoGeneral.Checked AndAlso (strExplanatoryType = "numeric" OrElse strExplanatoryType = "positive integer" OrElse strExplanatoryType = "integer") Then - chkFunction.Visible = True + If rdoGeneralCase.Checked AndAlso (strExplanatoryType = "numeric" OrElse strExplanatoryType = "positive integer" OrElse strExplanatoryType = "integer") Then + ' chkFunction.Visible = True Else - chkFunction.Checked = False - chkFunction.Visible = False - End If - If chkFunction.Checked Then - sdgVariableTransformations.ModelFunction(False) - Else - sdgVariableTransformations.rdoIdentity.Checked = True - clsModel.AddParameter(strParameterValue:=ucrExplanatory.GetVariableNames(bWithQuotes:=False)) + ' chkFunction.Checked = False + ' chkFunction.Visible = False End If + 'If chkFunction.Checked Then + ' sdgVariableTransformations.ModelFunction(False) + 'Else + ' sdgVariableTransformations.rdoIdentity.Checked = True + ' clsModel.AddParameter(strParameterValue:=ucrExplanatory.GetVariableNames(bWithQuotes:=False)) + 'End If End If End Sub @@ -474,39 +528,39 @@ Public Class dlgRegressionSimple SetDefaults() End Sub - Private Sub ucrModelName_NameChanged() Handles ucrModelName.NameChanged + Private Sub ucrModelName_NameChanged() AssignModelName() TestOKEnabled() End Sub Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk - If rdoGeneral.Checked Then - sdgSimpleRegOptions.RegOptions() - End If + 'If rdoGeneral.Checked Then + ' sdgSimpleRegOptions.RegOptions() + 'End If End Sub - Private Sub chkModelName_CheckedChanged(sender As Object, e As EventArgs) Handles chkSaveModel.CheckedChanged - If chkSaveModel.Checked Then - ucrModelName.Visible = True - Else - ucrModelName.Visible = False - End If + Private Sub chkModelName_CheckedChanged(sender As Object, e As EventArgs) + 'If chkSaveModel.Checked Then + ' ucrModelName.Visible = True + 'Else + ' ucrModelName.Visible = False + 'End If AssignModelName() TestOKEnabled() End Sub Private Sub AssignModelName() - If chkSaveModel.Checked AndAlso Not ucrModelName.IsEmpty Then - ucrBase.clsRsyntax.SetAssignTo(ucrModelName.GetText, strTempModel:=ucrModelName.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text) - If rdoGeneral.Checked Then - ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = True - Else - ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False - End If - Else - ucrBase.clsRsyntax.SetAssignTo("last_model", strTempModel:="last_model", strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text) - ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False - End If + 'If chkSaveModel.Checked AndAlso Not ucrModelName.IsEmpty Then + ' ucrBase.clsRsyntax.SetAssignTo(ucrModelName.GetText, strTempModel:=ucrModelName.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text) + ' If rdoGeneral.Checked Then + ' ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = True + ' Else + ' ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False + ' End If + 'Else + ' ucrBase.clsRsyntax.SetAssignTo("last_model", strTempModel:="last_model", strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text) + ' ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False + 'End If End Sub Private Sub ucrDistWithParameters_ucrInputDistributionsIndexChanged() Handles ucrFamily.DistributionsIndexChanged @@ -525,115 +579,115 @@ Public Class dlgRegressionSimple Display() End Sub - Private Sub chkFunction_CheckedChanged(sender As Object, e As EventArgs) Handles chkFunction.CheckedChanged - If chkFunction.Checked Then - sdgVariableTransformations.ShowDialog() - End If - ExplanatoryFunctionSelect() - TestOKEnabled() - Display() + Private Sub chkFunction_CheckedChanged(sender As Object, e As EventArgs) + 'If chkFunction.Checked Then + ' sdgVariableTransformations.ShowDialog() + 'End If + 'ExplanatoryFunctionSelect() + 'TestOKEnabled() + 'Display() End Sub Private Sub Display() - If rdoGeneral.Checked Then - lblFactor.Visible = False - lblNumeric.Visible = False - ucrModelPreview.Visible = True - lblModelPreview.Visible = True - lblResponse.Visible = True - lblExplanatory.Visible = True - cmdDisplayOptions.Visible = True - cmdModelOptions.Visible = True - grpParameters.Visible = False - ElseIf rdoSpecific.Checked Then - ucrModelPreview.Visible = False - lblModelPreview.Visible = False - lblResponse.Visible = False - lblExplanatory.Visible = False - cmdDisplayOptions.Visible = False - cmdModelOptions.Visible = False - lblFactor.Visible = True - lblNumeric.Visible = True - chkConvertToVariate.Visible = False - chkFunction.Visible = False - grpParameters.Visible = True - If ucrFamily.clsCurrDistribution.bIsExact = True Then - lblHyp1.Text = ucrFamily.clsCurrDistribution.lstExact(1) - nudHypothesis.Value = ucrFamily.clsCurrDistribution.lstExact(2) - nudHypothesis.Increment = ucrFamily.clsCurrDistribution.lstExact(3) - nudHypothesis.DecimalPlaces = ucrFamily.clsCurrDistribution.lstExact(4) - nudHypothesis.Minimum = ucrFamily.clsCurrDistribution.lstExact(5) - nudHypothesis.Maximum = ucrFamily.clsCurrDistribution.lstExact(6) - If ucrFamily.clsCurrDistribution.strNameTag = "Normal" OrElse ucrFamily.clsCurrDistribution.strNameTag = "No_Distribution" Then - rdoCompareMeans.Visible = True - rdoCompareVar.Visible = True - lblLevel1.Visible = False - lblLevel2.Visible = False - ucrLevel1.Visible = False - ucrLevel2.Visible = False - If rdoCompareMeans.Checked Then - chkPaired.Visible = True - nudHypothesis.Enabled = True - nudCI.Enabled = True - ElseIf rdoCompareVar.Checked Then - chkPaired.Visible = False - nudHypothesis.Enabled = False - nudCI.Enabled = True ' poss want this false for No_Dist here - End If - Else - chkPaired.Visible = False - rdoCompareMeans.Visible = False - rdoCompareVar.Visible = False - nudHypothesis.Enabled = True - nudCI.Enabled = True - lblLevel1.Visible = True - lblLevel2.Visible = True - ucrLevel1.Visible = True - ucrLevel2.Visible = True - End If - If ucrFamily.clsCurrDistribution.strNameTag = "Normal" Then - rdoCompareMeans.Text = "Compare Means" - rdoCompareVar.Text = "Compare Variances" - End If - If ucrFamily.clsCurrDistribution.strNameTag = "No_Distribution" Then - rdoCompareMeans.Text = "Wilcoxon Test" - rdoCompareVar.Text = "Kruskal Test" - End If - If ucrFamily.clsCurrDistribution.strNameTag = "Bernouli" Then - lblSuccessIf.Visible = True - ucrNud.Visible = True - Else - lblSuccessIf.Visible = False - ucrNud.Visible = False - End If - End If - End If + 'If rdoGeneral.Checked Then + ' lblFactor.Visible = False + ' lblNumeric.Visible = False + ' ucrModelPreview.Visible = True + ' lblModelPreview.Visible = True + ' lblResponse.Visible = True + ' lblExplanatory.Visible = True + ' cmdDisplayOptions.Visible = True + ' cmdModelOptions.Visible = True + ' grpParameters.Visible = False + 'ElseIf rdoSpecific.Checked Then + ' ucrModelPreview.Visible = False + ' lblModelPreview.Visible = False + ' lblResponse.Visible = False + ' lblExplanatory.Visible = False + ' cmdDisplayOptions.Visible = False + ' cmdModelOptions.Visible = False + ' lblFactor.Visible = True + ' lblNumeric.Visible = True + ' chkConvertToVariate.Visible = False + ' chkFunction.Visible = False + ' grpParameters.Visible = True + ' If ucrFamily.clsCurrDistribution.bIsExact = True Then + ' lblHyp1.Text = ucrFamily.clsCurrDistribution.lstExact(1) + ' nudHypothesis.Value = ucrFamily.clsCurrDistribution.lstExact(2) + ' nudHypothesis.Increment = ucrFamily.clsCurrDistribution.lstExact(3) + ' nudHypothesis.DecimalPlaces = ucrFamily.clsCurrDistribution.lstExact(4) + ' nudHypothesis.Minimum = ucrFamily.clsCurrDistribution.lstExact(5) + ' nudHypothesis.Maximum = ucrFamily.clsCurrDistribution.lstExact(6) + ' If ucrFamily.clsCurrDistribution.strNameTag = "Normal" OrElse ucrFamily.clsCurrDistribution.strNameTag = "No_Distribution" Then + ' rdoCompareMeans.Visible = True + ' rdoCompareVar.Visible = True + ' lblConfidenceInterval.Visible = False + ' lblDifferenceInMeans.Visible = False + ' ucrLevel1.Visible = False + ' ucrLevel2.Visible = False + ' If rdoCompareMeans.Checked Then + ' chkPaired.Visible = True + ' nudHypothesis.Enabled = True + ' nudCI.Enabled = True + ' ElseIf rdoCompareVar.Checked Then + ' chkPaired.Visible = False + ' nudHypothesis.Enabled = False + ' nudCI.Enabled = True ' poss want this false for No_Dist here + ' End If + ' Else + ' chkPaired.Visible = False + ' rdoCompareMeans.Visible = False + ' rdoCompareVar.Visible = False + ' nudHypothesis.Enabled = True + ' nudCI.Enabled = True + ' lblConfidenceInterval.Visible = True + ' lblDifferenceInMeans.Visible = True + ' ucrLevel1.Visible = True + ' ucrLevel2.Visible = True + ' End If + ' If ucrFamily.clsCurrDistribution.strNameTag = "Normal" Then + ' rdoCompareMeans.Text = "Compare Means" + ' rdoCompareVar.Text = "Compare Variances" + ' End If + ' If ucrFamily.clsCurrDistribution.strNameTag = "No_Distribution" Then + ' rdoCompareMeans.Text = "Wilcoxon Test" + ' rdoCompareVar.Text = "Kruskal Test" + ' End If + ' If ucrFamily.clsCurrDistribution.strNameTag = "Bernouli" Then + ' lblSuccessIf.Visible = True + ' ucrNud.Visible = True + ' Else + ' lblSuccessIf.Visible = False + ' ucrNud.Visible = False + ' End If + 'End If + ' End If End Sub - Private Sub nuds_TextChanged(sender As Object, e As EventArgs) Handles nudCI.TextChanged, nudHypothesis.TextChanged + Private Sub nuds_TextChanged(sender As Object, e As EventArgs) SetRCode() End Sub - Private Sub chkboxes_VisibleChanged(sender As Object, e As EventArgs) Handles chkFunction.VisibleChanged + Private Sub chkboxes_VisibleChanged(sender As Object, e As EventArgs) Display() ExplanatoryFunctionSelect() ConvertToVariate() TestOKEnabled() End Sub - Private Sub rdoTop_CheckedChanged(sender As Object, e As EventArgs) Handles rdoGeneral.CheckedChanged, rdoSpecific.CheckedChanged - If rdoGeneral.Checked Then - ucrFamily.SetGLMDistributions() - Else - ucrFamily.SetExactDistributions() - End If - ucrFamily.ucrInputDistributions.SetName("") - Display() - SetRCode() - TestOKEnabled() - DataTypeAccepted() - AssignModelName() - ConvertToVariate() + Private Sub rdoTop_CheckedChanged(sender As Object, e As EventArgs) + 'If rdoGeneral.Checked Then + ' ucrFamily.SetGLMDistributions() + 'Else + ' ucrFamily.SetExactDistributions() + 'End If + 'ucrFamily.ucrInputDistributions.SetName("") + 'Display() + 'SetRCode() + 'TestOKEnabled() + 'DataTypeAccepted() + 'AssignModelName() + 'ConvertToVariate() End Sub Private Sub ucrFamily_EnabledChanged(sender As Object, e As EventArgs) Handles ucrFamily.EnabledChanged @@ -642,16 +696,16 @@ Public Class dlgRegressionSimple SetEnableDists() End Sub - Private Sub rdoCompareMeans_VisibleChanged(sender As Object, e As EventArgs) Handles rdoCompareMeans.VisibleChanged, rdoCompareVar.VisibleChanged, chkPaired.VisibleChanged, rdoCompareMeans.CheckedChanged, rdoCompareVar.CheckedChanged, chkPaired.CheckedChanged + Private Sub rdoCompareMeans_VisibleChanged(sender As Object, e As EventArgs) Display() SetRCode() End Sub - Private Sub ucrLevel1_NameChanged() Handles ucrLevel1.NameChanged, ucrLevel2.NameChanged + Private Sub ucrLevel1_NameChanged() SetRCode() End Sub - Private Sub ucrNud_TextChanged(sender As Object, e As EventArgs) Handles ucrNud.TextChanged + Private Sub ucrNud_TextChanged(sender As Object, e As EventArgs) SetRCode() End Sub End Class \ No newline at end of file From a1cbb7156ed000990e8709d8a1e85b6e6ebe43b4 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Fri, 16 Jun 2017 10:04:48 +0100 Subject: [PATCH 039/201] corrected setting R code for ferq dialogs --- instat/dlgOneWayFrequencies.vb | 11 ++--------- instat/dlgThreeVariableFrequencies.vb | 5 ++--- instat/dlgTwoWayFrequencies.vb | 15 ++------------- 3 files changed, 6 insertions(+), 25 deletions(-) diff --git a/instat/dlgOneWayFrequencies.vb b/instat/dlgOneWayFrequencies.vb index ce61bbd273c..a8145f2b222 100644 --- a/instat/dlgOneWayFrequencies.vb +++ b/instat/dlgOneWayFrequencies.vb @@ -70,10 +70,7 @@ Public Class dlgOneWayFrequencies 'setting rdoGraph and rdoTable ucrPnlFrequencies.AddFunctionNamesCondition(rdoTable, "sjtab") ucrPnlFrequencies.AddFunctionNamesCondition(rdoGraph, "plot_grid") - 'setting rdoBoth - 'This is incorrect but we can't currently do what's needed - 'ucrPnlFrequencies.AddFunctionNamesCondition(rdoBoth, "plot_grid") - 'ucrPnlFrequencies.AddFunctionNamesCondition(rdoBoth, "sjtab") + 'TODO be able to have conditions across multiple functions ucrPnlFrequencies.AddToLinkedControls(ucrChkFlip, {rdoGraph, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) ucrPnlFrequencies.AddToLinkedControls(ucrSaveGraph, {rdoGraph, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) @@ -109,8 +106,6 @@ Public Class dlgOneWayFrequencies ucrSelectorOneWayFreq.Reset() ucrReceiverOneWayFreq.SetMeAsReceiver() ucrSaveGraph.Reset() - 'To fix the problem of rdo both which does not satisfy the condition of having both functions present, line 75 &76 - rdoTable.Checked = True clsPlotGrid.SetPackageName("sjPlot") clsPlotGrid.SetRCommand("plot_grid") @@ -142,7 +137,7 @@ Public Class dlgOneWayFrequencies ucrReceiverWeights.SetRCode(clsSjTab, bReset) ucrReceiverOneWayFreq.SetRCode(clsSjTab, bReset) - If rdoGraph.Checked OrElse rdoTable.Checked Then + If bReset OrElse Not rdoBoth.Checked Then ucrPnlFrequencies.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) End If @@ -223,11 +218,9 @@ Public Class dlgOneWayFrequencies Private Sub SetBaseFunction() If rdoTable.Checked OrElse rdoBoth.Checked Then ucrBase.clsRsyntax.SetBaseRFunction(clsSjTab) - 'ucrBase.clsRsyntax.bHTMLOutput = True ucrBase.clsRsyntax.iCallType = 0 ElseIf rdoGraph.Checked Then ucrBase.clsRsyntax.SetBaseRFunction(clsPlotGrid) - ' ucrBase.clsRsyntax.bHTMLOutput = False ucrBase.clsRsyntax.iCallType = 3 End If End Sub diff --git a/instat/dlgThreeVariableFrequencies.vb b/instat/dlgThreeVariableFrequencies.vb index a9477ed82a6..8d5cbeaa87e 100644 --- a/instat/dlgThreeVariableFrequencies.vb +++ b/instat/dlgThreeVariableFrequencies.vb @@ -110,6 +110,7 @@ Public Class dlgThreeVariableFrequencies ucrPnlFrequencyDisplay.AddParameterPresentCondition(rdoTable, "sjtab") ucrPnlFrequencyDisplay.AddParameterPresentCondition(rdoGraph, "sjplot") + 'TODO have conditions on multiple functions for both option ucrPnlFrequencyDisplay.AddToLinkedControls(ucrChkCount, {rdoTable, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) ucrPnlFrequencyDisplay.AddToLinkedControls(ucrSaveGraph, {rdoGraph, rdoBoth}, bNewLinkedHideIfParameterMissing:=True) @@ -153,8 +154,6 @@ Public Class dlgThreeVariableFrequencies ucrSelectorThreeVariableFrequencies.Reset() ucrReceiverRowFactor.SetMeAsReceiver() ucrSaveGraph.Reset() - 'To fix the problem of rdo both which does not satisfy the condition of having both functions present, line 111 & 112 - rdoTable.Checked = True clsTableBaseOperator.SetOperation("%>%") clsTableBaseOperator.AddParameter("group_by", clsRFunctionParameter:=clsGroupBy, iPosition:=1) @@ -218,7 +217,7 @@ Public Class dlgThreeVariableFrequencies ucrChkWeights.SetRCode(clsSjTab, bReset) ucrChkFlip.SetRCode(clsSjPlot, bReset) ucrPnlFreqType.SetRCode(clsSjPlot, bReset) - If rdoGraph.Checked OrElse rdoTable.Checked Then + If bReset OrElse Not rdoBoth.Checked Then ucrPnlFrequencyDisplay.SetRCode(clsCurrBaseCode, bReset) End If diff --git a/instat/dlgTwoWayFrequencies.vb b/instat/dlgTwoWayFrequencies.vb index 05d16ffc0fc..c5d5677f3c3 100644 --- a/instat/dlgTwoWayFrequencies.vb +++ b/instat/dlgTwoWayFrequencies.vb @@ -114,12 +114,7 @@ Public Class dlgTwoWayFrequencies ucrPnlFreqDisplay.AddFunctionNamesCondition(rdoTable, "sjtab") ucrPnlFreqDisplay.AddFunctionNamesCondition(rdoGraph, "sjplot") - - 'Conditions for both requires checks on multiple functions - 'Not yet implemented so this can cause a bug - - 'ucrPnlFreqDisplay.AddFunctionNamesCondition(rdoBoth, "sjtab") - 'ucrPnlFreqDisplay.AddFunctionNamesCondition(rdoBoth, "sjplot") + 'TODO conditions for both requires checks on multiple functions 'Setting Display of the group boxes in the dialog ucrPnlFreqDisplay.AddToLinkedControls(ucrChkCount, {rdoTable, rdoBoth}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -148,8 +143,6 @@ Public Class dlgTwoWayFrequencies ucrSelectorTwoWayFrequencies.Reset() ucrReceiverRowFactor.SetMeAsReceiver() ucrSaveGraph.Reset() - 'To fix the problem of rdo both which does not satisfy the condition of having both functions present, line 121 & 122 - rdoTable.Checked = True 'Defining Table functions and default functions clsSjTab.SetPackageName("sjPlot") @@ -196,7 +189,7 @@ Public Class dlgTwoWayFrequencies ucrChkWeights.SetRCode(clsSjTab, bReset) ucrChkFlip.SetRCode(clsSjPlot, bReset) ucrPnlFreqType.SetRCode(clsSjPlot, bReset) - If rdoGraph.Checked OrElse rdoTable.Checked Then + If bReset OrElse Not rdoBoth.Checked Then ucrPnlFreqDisplay.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) End If ucrSelectorTwoWayFrequencies.SetRCode(clsSjTab, bReset) @@ -208,10 +201,6 @@ Public Class dlgTwoWayFrequencies End Sub - Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk - - End Sub - Private Sub TestOkEnabled() If Not ucrReceiverColumnFactor.IsEmpty() AndAlso Not ucrReceiverRowFactor.IsEmpty() AndAlso ucrSaveGraph.IsComplete Then If Not ucrChkWeights.Checked Then From c4e02d6a441017293d15812cc4c235e3139afbad Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Fri, 16 Jun 2017 12:39:33 +0300 Subject: [PATCH 040/201] setting defaults for ucrInputQuantiles --- instat/sdgOneVarUseModFit.vb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/instat/sdgOneVarUseModFit.vb b/instat/sdgOneVarUseModFit.vb index bd23f6fea3b..c8996c1596e 100644 --- a/instat/sdgOneVarUseModFit.vb +++ b/instat/sdgOneVarUseModFit.vb @@ -56,23 +56,22 @@ Public Class sdgOneVarUseModFit ucrNudTo.SetParameter(New RParameter("to", 2)) ucrNudTo.SetMinMax(0, 1) ucrNudTo.Increment = 0.05 - ucrNudFrom.SetRDefault(1) + ucrNudTo.SetRDefault(1) ucrNudBy.SetParameter(New RParameter("by", 3)) ucrNudBy.SetMinMax(0.01, 1) ucrNudBy.Increment = 0.05 - ucrNudFrom.SetRDefault(0.25) + ucrNudBy.SetRDefault(0.25) 'function ran here is probs = c(VALUES) - dctQuantileValues.Add("0.25, 0.5, 0.75", "0.25, 0.5, 0.75") - dctQuantileValues.Add("0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9", "0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9") ucrInputQuantiles.SetParameter(New RParameter("x")) + dctQuantileValues.Add("0.25,0.5,0.75", Chr(34) & "0.25,0.5,0.75" & Chr(34)) + dctQuantileValues.Add("0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9", Chr(34) & "0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9" & Chr(34)) ucrInputQuantiles.SetItems(dctQuantileValues) - ucrInputQuantiles.SetDefaultState("0.25, 0.5, 0.75") ucrInputQuantiles.bAllowNonConditionValues = True ucrInputQuantiles.SetValidationTypeAsNumericList(dcmMin:=0, dcmMax:=1) - ucrPnlQuantiles.AddToLinkedControls(ucrInputQuantiles, {rdoInsertValues}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrPnlQuantiles.AddToLinkedControls(ucrInputQuantiles, {rdoInsertValues}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="0.25,0.5,0.75") ucrPnlQuantiles.AddToLinkedControls(ucrNudTo, {rdoSequence}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrPnlQuantiles.AddToLinkedControls(ucrNudFrom, {rdoSequence}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrPnlQuantiles.AddToLinkedControls(ucrNudBy, {rdoSequence}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) @@ -122,14 +121,15 @@ Public Class sdgOneVarUseModFit ucrNudCI.SetRCode(clsOneVarQuantileFunction, bReset) ucrPnlPlots.SetRCode(clsRPlotFunction, bReset) ucrPnlQuantiles.SetRCode(clsRSeqFunction, bReset) + ucrInputQuantiles.SetRCode(clsOneVarQuantileFunction, bReset) If bReset Then tbpOneVarUseModFit.SelectedIndex = 0 End If - End Sub + End Sub - Public Sub CreateGraphs() - If rdoPlotAll.Checked Then + Public Sub CreateGraphs() + If rdoPlotAll.Checked Then clsRPlotFunction.ClearParameters() clsRPlotFunction.SetPackageName("graphics") clsRPlotFunction.SetRCommand("plot") @@ -140,7 +140,7 @@ Public Class sdgOneVarUseModFit clsRPlotFunction.SetPackageName("fitdistrplus") clsRPlotFunction.SetRCommand("ppcomp") clsRPlotFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - ElseIf rdoCDFPlot.Checked Then + ElseIf rdoCDFPlot.Checked Then clsRPlotFunction.ClearParameters() clsRPlotFunction.RemoveParameterByName("x") clsRPlotFunction.SetPackageName("fitdistrplus") @@ -191,7 +191,7 @@ Public Class sdgOneVarUseModFit Public Sub QuantileCommand() If rdoSequence.Checked Then clsOneVarQuantileFunction.AddParameter("probs", clsRFunctionParameter:=clsRSeqFunction) - Else + Else clsOneVarQuantileFunction.AddParameter("probs", strParameterValue:="c(" & ucrInputQuantiles.GetText & ")") End If End Sub From 1bf6353d32e5ac677f40b25178129065c4399930 Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 16 Jun 2017 12:02:10 +0100 Subject: [PATCH 041/201] updating spells --- instat/dlgSpells.Designer.vb | 138 +++++--- instat/dlgSpells.vb | 620 +++++++++++++++++++++++------------ 2 files changed, 492 insertions(+), 266 deletions(-) diff --git a/instat/dlgSpells.Designer.vb b/instat/dlgSpells.Designer.vb index 33f7a858e27..554a9d86f94 100644 --- a/instat/dlgSpells.Designer.vb +++ b/instat/dlgSpells.Designer.vb @@ -26,7 +26,7 @@ Partial Class dlgSpells Me.lblDate = New System.Windows.Forms.Label() Me.lblYear = New System.Windows.Forms.Label() Me.lblDOY = New System.Windows.Forms.Label() - Me.ucrReceiverDayOfYear = New instat.ucrReceiverSingle() + Me.ucrReceiverDOY = New instat.ucrReceiverSingle() Me.ucrReceiverYear = New instat.ucrReceiverSingle() Me.ucrReceiverDate = New instat.ucrReceiverSingle() Me.ucrReceiverRainfall = New instat.ucrReceiverSingle() @@ -38,22 +38,22 @@ Partial Class dlgSpells Me.lblThreshold = New System.Windows.Forms.Label() Me.nudTo = New System.Windows.Forms.NumericUpDown() Me.nudFrom = New System.Windows.Forms.NumericUpDown() - Me.nudConditionLeft = New System.Windows.Forms.NumericUpDown() - Me.NudConditionRight = New System.Windows.Forms.NumericUpDown() Me.ucrInputCondition = New instat.ucrInputComboBox() Me.grpRainParameters = New System.Windows.Forms.GroupBox() + Me.ucrInputSpellLower = New instat.ucrInputTextBox() + Me.ucrInputSpellUpper = New instat.ucrInputTextBox() Me.ucrSaveSpells = New instat.ucrSave() + Me.lblStation = New System.Windows.Forms.Label() + Me.ucrReceiverStation = New instat.ucrReceiverSingle() CType(Me.nudTo, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.nudFrom, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudConditionLeft, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.NudConditionRight, System.ComponentModel.ISupportInitialize).BeginInit() Me.grpRainParameters.SuspendLayout() Me.SuspendLayout() ' 'lblRainfall ' Me.lblRainfall.AutoSize = True - Me.lblRainfall.Location = New System.Drawing.Point(246, 70) + Me.lblRainfall.Location = New System.Drawing.Point(246, 112) Me.lblRainfall.Name = "lblRainfall" Me.lblRainfall.Size = New System.Drawing.Size(70, 13) Me.lblRainfall.TabIndex = 3 @@ -62,7 +62,7 @@ Partial Class dlgSpells 'lblDate ' Me.lblDate.AutoSize = True - Me.lblDate.Location = New System.Drawing.Point(247, 28) + Me.lblDate.Location = New System.Drawing.Point(247, 70) Me.lblDate.Name = "lblDate" Me.lblDate.Size = New System.Drawing.Size(33, 13) Me.lblDate.TabIndex = 1 @@ -71,7 +71,7 @@ Partial Class dlgSpells 'lblYear ' Me.lblYear.AutoSize = True - Me.lblYear.Location = New System.Drawing.Point(248, 113) + Me.lblYear.Location = New System.Drawing.Point(248, 155) Me.lblYear.Name = "lblYear" Me.lblYear.Size = New System.Drawing.Size(32, 13) Me.lblYear.TabIndex = 5 @@ -80,51 +80,59 @@ Partial Class dlgSpells 'lblDOY ' Me.lblDOY.AutoSize = True - Me.lblDOY.Location = New System.Drawing.Point(247, 154) + Me.lblDOY.Location = New System.Drawing.Point(247, 196) Me.lblDOY.Name = "lblDOY" Me.lblDOY.Size = New System.Drawing.Size(66, 13) Me.lblDOY.TabIndex = 7 Me.lblDOY.Text = "Day of Year:" ' - 'ucrReceiverDayOfYear + 'ucrReceiverDOY ' - Me.ucrReceiverDayOfYear.frmParent = Me - Me.ucrReceiverDayOfYear.Location = New System.Drawing.Point(246, 169) - Me.ucrReceiverDayOfYear.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverDayOfYear.Name = "ucrReceiverDayOfYear" - Me.ucrReceiverDayOfYear.Selector = Nothing - Me.ucrReceiverDayOfYear.Size = New System.Drawing.Size(143, 20) - Me.ucrReceiverDayOfYear.TabIndex = 12 + Me.ucrReceiverDOY.frmParent = Me + Me.ucrReceiverDOY.Location = New System.Drawing.Point(246, 211) + Me.ucrReceiverDOY.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverDOY.Name = "ucrReceiverDOY" + Me.ucrReceiverDOY.Selector = Nothing + Me.ucrReceiverDOY.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverDOY.strNcFilePath = "" + Me.ucrReceiverDOY.TabIndex = 12 + Me.ucrReceiverDOY.ucrSelector = Nothing ' 'ucrReceiverYear ' Me.ucrReceiverYear.frmParent = Me - Me.ucrReceiverYear.Location = New System.Drawing.Point(246, 127) + Me.ucrReceiverYear.Location = New System.Drawing.Point(246, 169) Me.ucrReceiverYear.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverYear.Name = "ucrReceiverYear" Me.ucrReceiverYear.Selector = Nothing Me.ucrReceiverYear.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverYear.strNcFilePath = "" Me.ucrReceiverYear.TabIndex = 6 + Me.ucrReceiverYear.ucrSelector = Nothing ' 'ucrReceiverDate ' Me.ucrReceiverDate.frmParent = Me - Me.ucrReceiverDate.Location = New System.Drawing.Point(246, 43) + Me.ucrReceiverDate.Location = New System.Drawing.Point(246, 85) Me.ucrReceiverDate.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverDate.Name = "ucrReceiverDate" Me.ucrReceiverDate.Selector = Nothing Me.ucrReceiverDate.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverDate.strNcFilePath = "" Me.ucrReceiverDate.TabIndex = 2 + Me.ucrReceiverDate.ucrSelector = Nothing ' 'ucrReceiverRainfall ' Me.ucrReceiverRainfall.frmParent = Me - Me.ucrReceiverRainfall.Location = New System.Drawing.Point(246, 85) + Me.ucrReceiverRainfall.Location = New System.Drawing.Point(246, 127) Me.ucrReceiverRainfall.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverRainfall.Name = "ucrReceiverRainfall" Me.ucrReceiverRainfall.Selector = Nothing Me.ucrReceiverRainfall.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverRainfall.strNcFilePath = "" Me.ucrReceiverRainfall.TabIndex = 4 + Me.ucrReceiverRainfall.ucrSelector = Nothing ' 'ucrSelectorForSpells ' @@ -138,7 +146,7 @@ Partial Class dlgSpells ' 'ucrBase ' - Me.ucrBase.Location = New System.Drawing.Point(9, 318) + Me.ucrBase.Location = New System.Drawing.Point(9, 410) Me.ucrBase.Name = "ucrBase" Me.ucrBase.Size = New System.Drawing.Size(405, 52) Me.ucrBase.TabIndex = 11 @@ -146,7 +154,7 @@ Partial Class dlgSpells 'chkConditionRain ' Me.chkConditionRain.AutoSize = True - Me.chkConditionRain.Location = New System.Drawing.Point(9, 272) + Me.chkConditionRain.Location = New System.Drawing.Point(9, 364) Me.chkConditionRain.Name = "chkConditionRain" Me.chkConditionRain.Size = New System.Drawing.Size(193, 17) Me.chkConditionRain.TabIndex = 13 @@ -205,65 +213,89 @@ Partial Class dlgSpells Me.nudFrom.UpDownAlign = System.Windows.Forms.LeftRightAlignment.Left Me.nudFrom.Value = New Decimal(New Integer() {1, 0, 0, 0}) ' - 'nudConditionLeft - ' - Me.nudConditionLeft.DecimalPlaces = 2 - Me.nudConditionLeft.Increment = New Decimal(New Integer() {1, 0, 0, 65536}) - Me.nudConditionLeft.Location = New System.Drawing.Point(67, 45) - Me.nudConditionLeft.Name = "nudConditionLeft" - Me.nudConditionLeft.Size = New System.Drawing.Size(53, 20) - Me.nudConditionLeft.TabIndex = 6 - ' - 'NudConditionRight - ' - Me.NudConditionRight.DecimalPlaces = 2 - Me.NudConditionRight.Increment = New Decimal(New Integer() {1, 0, 0, 65536}) - Me.NudConditionRight.Location = New System.Drawing.Point(237, 45) - Me.NudConditionRight.Name = "NudConditionRight" - Me.NudConditionRight.Size = New System.Drawing.Size(53, 20) - Me.NudConditionRight.TabIndex = 9 - Me.NudConditionRight.Value = New Decimal(New Integer() {85, 0, 0, 131072}) - ' 'ucrInputCondition ' Me.ucrInputCondition.AddQuotesIfUnrecognised = True Me.ucrInputCondition.IsReadOnly = False - Me.ucrInputCondition.Location = New System.Drawing.Point(131, 44) + Me.ucrInputCondition.Location = New System.Drawing.Point(134, 44) Me.ucrInputCondition.Name = "ucrInputCondition" Me.ucrInputCondition.Size = New System.Drawing.Size(97, 21) Me.ucrInputCondition.TabIndex = 10 ' 'grpRainParameters ' + Me.grpRainParameters.Controls.Add(Me.ucrInputSpellLower) Me.grpRainParameters.Controls.Add(Me.ucrInputCondition) - Me.grpRainParameters.Controls.Add(Me.NudConditionRight) - Me.grpRainParameters.Controls.Add(Me.nudConditionLeft) + Me.grpRainParameters.Controls.Add(Me.ucrInputSpellUpper) Me.grpRainParameters.Controls.Add(Me.nudFrom) Me.grpRainParameters.Controls.Add(Me.nudTo) Me.grpRainParameters.Controls.Add(Me.lblThreshold) Me.grpRainParameters.Controls.Add(Me.lblFrom) Me.grpRainParameters.Controls.Add(Me.lblTo) - Me.grpRainParameters.Location = New System.Drawing.Point(9, 192) + Me.grpRainParameters.Location = New System.Drawing.Point(9, 284) Me.grpRainParameters.Name = "grpRainParameters" Me.grpRainParameters.Size = New System.Drawing.Size(380, 74) Me.grpRainParameters.TabIndex = 9 Me.grpRainParameters.TabStop = False ' + 'ucrInputSpellLower + ' + Me.ucrInputSpellLower.AddQuotesIfUnrecognised = True + Me.ucrInputSpellLower.IsMultiline = False + Me.ucrInputSpellLower.IsReadOnly = False + Me.ucrInputSpellLower.Location = New System.Drawing.Point(63, 44) + Me.ucrInputSpellLower.Name = "ucrInputSpellLower" + Me.ucrInputSpellLower.Size = New System.Drawing.Size(63, 21) + Me.ucrInputSpellLower.TabIndex = 17 + ' + 'ucrInputSpellUpper + ' + Me.ucrInputSpellUpper.AddQuotesIfUnrecognised = True + Me.ucrInputSpellUpper.IsMultiline = False + Me.ucrInputSpellUpper.IsReadOnly = False + Me.ucrInputSpellUpper.Location = New System.Drawing.Point(237, 44) + Me.ucrInputSpellUpper.Name = "ucrInputSpellUpper" + Me.ucrInputSpellUpper.Size = New System.Drawing.Size(63, 21) + Me.ucrInputSpellUpper.TabIndex = 18 + ' 'ucrSaveSpells ' - Me.ucrSaveSpells.Location = New System.Drawing.Point(9, 295) + Me.ucrSaveSpells.Location = New System.Drawing.Point(9, 387) Me.ucrSaveSpells.Name = "ucrSaveSpells" Me.ucrSaveSpells.Size = New System.Drawing.Size(290, 24) Me.ucrSaveSpells.TabIndex = 14 ' + 'lblStation + ' + Me.lblStation.AutoSize = True + Me.lblStation.Location = New System.Drawing.Point(247, 30) + Me.lblStation.Name = "lblStation" + Me.lblStation.Size = New System.Drawing.Size(43, 13) + Me.lblStation.TabIndex = 15 + Me.lblStation.Text = "Station:" + ' + 'ucrReceiverStation + ' + Me.ucrReceiverStation.frmParent = Me + Me.ucrReceiverStation.Location = New System.Drawing.Point(246, 45) + Me.ucrReceiverStation.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverStation.Name = "ucrReceiverStation" + Me.ucrReceiverStation.Selector = Nothing + Me.ucrReceiverStation.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverStation.strNcFilePath = "" + Me.ucrReceiverStation.TabIndex = 16 + Me.ucrReceiverStation.ucrSelector = Nothing + ' 'dlgSpells ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(421, 375) + Me.ClientSize = New System.Drawing.Size(462, 473) + Me.Controls.Add(Me.lblStation) + Me.Controls.Add(Me.ucrReceiverStation) Me.Controls.Add(Me.ucrSaveSpells) Me.Controls.Add(Me.chkConditionRain) - Me.Controls.Add(Me.ucrReceiverDayOfYear) + Me.Controls.Add(Me.ucrReceiverDOY) Me.Controls.Add(Me.ucrReceiverYear) Me.Controls.Add(Me.lblYear) Me.Controls.Add(Me.lblDate) @@ -283,8 +315,6 @@ Partial Class dlgSpells Me.Text = "Spells" CType(Me.nudTo, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.nudFrom, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudConditionLeft, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.NudConditionRight, System.ComponentModel.ISupportInitialize).EndInit() Me.grpRainParameters.ResumeLayout(False) Me.grpRainParameters.PerformLayout() Me.ResumeLayout(False) @@ -301,16 +331,18 @@ Partial Class dlgSpells Friend WithEvents ucrReceiverYear As ucrReceiverSingle Friend WithEvents lblYear As Label Friend WithEvents lblDOY As Label - Friend WithEvents ucrReceiverDayOfYear As ucrReceiverSingle + Friend WithEvents ucrReceiverDOY As ucrReceiverSingle Friend WithEvents chkConditionRain As CheckBox Friend WithEvents grpRainParameters As GroupBox Friend WithEvents ucrInputCondition As ucrInputComboBox - Friend WithEvents NudConditionRight As NumericUpDown - Friend WithEvents nudConditionLeft As NumericUpDown Friend WithEvents nudFrom As NumericUpDown Friend WithEvents nudTo As NumericUpDown Friend WithEvents lblThreshold As Label Friend WithEvents lblFrom As Label Friend WithEvents lblTo As Label Friend WithEvents ucrSaveSpells As ucrSave + Friend WithEvents lblStation As Label + Friend WithEvents ucrReceiverStation As ucrReceiverSingle + Friend WithEvents ucrInputSpellLower As ucrInputTextBox + Friend WithEvents ucrInputSpellUpper As ucrInputTextBox End Class diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index ad0b9abdb0c..751052aae06 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -1,4 +1,5 @@ -' Copyright (C) 2015 +'' Instat-R +' Copyright (C) 2015 ' ' 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 @@ -14,122 +15,189 @@ ' along with this program. If not, see . Imports instat.Translations - Public Class dlgSpells - Private clsAddKey, clsDayFromAndTo, clsAdditionalCondition, clsRainyDays, clsMaxValue, clsYearGroupDaily, clsMaxValueManipulation As New RFunction - Private clsMaxValueList, clsSpellLength, clsSubSpellLength1, clsSubSpellLength2, clsAdditionalConditionList As New RFunction + Private bFirstload As Boolean = True + Private bReset As Boolean = True + Private clsRTransform, clsRRollFuncExpr, clsMatchFun, clsTransformManipulationsFunc, clsTransformGroupByFunc, clsWaterBalance60, clsSubCalcList As New RFunction + Private clsRollFunction, clsRRainday As New RFunction Private strCurrDataName As String = "" - Private bFirstLoad As Boolean = True + Private strValuesUnder As String = ">=" Private Sub dlgSpells_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) - If bFirstLoad Then + If bFirstload Then InitialiseDialog() SetDefaults() - bFirstLoad = False - Else - ReopenDialog() + bFirstload = False + ' Else + ' ReopenDialog() End If TestOKEnabled() End Sub - Private Sub ucrSelectorForStartofRains_DataFrameChanged() Handles ucrSelectorForSpells.DataFrameChanged - strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - clsAddKey.AddParameter("data_name", strCurrDataName) - firstDayofTheYear() - End Sub - Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 200 - clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") - clsDayFromAndTo.SetRCommand("instat_calculation$new") - clsDayFromAndTo.SetAssignTo("Day_From_and_To") - clsYearGroupDaily.SetRCommand("instat_calculation$new") - clsYearGroupDaily.SetAssignTo("Year_Group_Daily") - clsRainyDays.SetRCommand("instat_calculation$new") - clsMaxValue.SetRCommand("instat_calculation$new") - clsMaxValue.SetAssignTo("Max_Rain_Per_Year") - clsSpellLength.SetRCommand("instat_calculation$new") - clsSpellLength.SetAssignTo("Dry_Spell") - ucrBase.clsRsyntax.SetFunction(frmMain.clsRLink.strInstatDataObject & "$apply_instat_calculation") - clsSubSpellLength1.SetRCommand("list") - clsSubSpellLength2.SetRCommand("list") - clsMaxValueManipulation.SetRCommand("list") - clsAdditionalCondition.SetRCommand("instat_calculation$new") - clsAdditionalCondition.SetAssignTo("Additional_Condition") - - clsMaxValueList.SetRCommand("list") + Dim dctInputSumPairs As New Dictionary(Of String, String) + + ' Setting receivers + ucrReceiverRainfall.SetParameter(New RParameter("data", 0)) + ucrReceiverRainfall.SetParameterIsString() + ucrReceiverRainfall.bWithQuotes = False + ucrReceiverRainfall.SetParameterIncludeArgumentName(False) ucrReceiverRainfall.Selector = ucrSelectorForSpells + + ucrReceiverStation.Selector = ucrSelectorForSpells + ucrReceiverStation.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "station" & Chr(34)}) + ucrReceiverStation.bAutoFill = True + ucrReceiverYear.Selector = ucrSelectorForSpells - ucrReceiverDate.Selector = ucrSelectorForSpells - ucrReceiverDayOfYear.Selector = ucrSelectorForSpells - ucrReceiverDate.SetMeAsReceiver() + ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) + ucrReceiverYear.bAutoFill = True + ucrReceiverDate.Selector = ucrSelectorForSpells ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) - ucrReceiverDayOfYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "doy" & Chr(34)}) - ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) - ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) ucrReceiverDate.bAutoFill = True - ucrReceiverDayOfYear.bAutoFill = True - ucrReceiverRainfall.bAutoFill = True - ucrReceiverYear.bAutoFill = True - nudConditionLeft.DecimalPlaces = 2 - NudConditionRight.DecimalPlaces = 2 - - 'Dim dctCondition As New Dictionary(Of String, String) - 'dctCondition.Add("Between", "between") - 'dctCondition.Add("Less than", Chr(34) & "<" & Chr(34)) - 'dctCondition.Add("Greater than", Chr(34) & ">" & Chr(34)) - 'ucrInputCondition.SetItems(dctCondition) - - ucrInputCondition.SetItems({"<= Amount of Rain", "Between", ">= Amount of Rain"}) - nudFrom.Minimum = 1 - nudFrom.Maximum = 366 - nudTo.Minimum = 1 - nudTo.Maximum = 366 - - 'save - ucrSaveSpells.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) - ucrSaveSpells.SetLabelText("New Column Name:") - ucrSaveSpells.SetIsTextBox() - ucrSaveSpells.SetPrefix("Spells") - ucrSaveSpells.SetSaveTypeAsColumn() + ucrReceiverDOY.Selector = ucrSelectorForSpells + ucrReceiverDOY.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "doy" & Chr(34)}) + ucrReceiverDOY.bAutoFill = True + + 'clsRTransform.SetRCommand("instat_calculation$new") + 'clsRTransform.SetAssignTo("transform_calculation") + + clsSubCalcList.SetRCommand("list") End Sub - Private Sub SetDefaults() - ucrSelectorForSpells.Reset() - ucrSaveSpells.Reset() - TestOKEnabled() + ' Private Sub InitialiseDialog() + ' ucrBase.iHelpTopicID = 200 + ' clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") + ' clsDayFromAndTo.SetRCommand("instat_calculation$new") + ' clsDayFromAndTo.SetAssignTo("Day_From_and_To") + ' clsYearGroupDaily.SetRCommand("instat_calculation$new") + ' clsYearGroupDaily.SetAssignTo("Year_Group_Daily") + ' clsRainyDays.SetRCommand("instat_calculation$new") + ' clsMaxValue.SetRCommand("instat_calculation$new") + ' clsMaxValue.SetAssignTo("Max_Rain_Per_Year") + ' clsSpellLength.SetRCommand("instat_calculation$new") + ' clsSpellLength.SetAssignTo("Dry_Spell") + ' ucrBase.clsRsyntax.SetFunction(frmMain.clsRLink.strInstatDataObject & "$apply_instat_calculation") + ' clsSubSpellLength1.SetRCommand("list") + ' clsSubSpellLength2.SetRCommand("list") + ' clsMaxValueManipulation.SetRCommand("list") + ' clsAdditionalCondition.SetRCommand("instat_calculation$new") + ' clsAdditionalCondition.SetAssignTo("Additional_Condition") + + ' clsMaxValueList.SetRCommand("list") + ' ucrReceiverRainfall.Selector = ucrSelectorForSpells + ' ucrReceiverYear.Selector = ucrSelectorForSpells + ' ucrReceiverDate.Selector = ucrSelectorForSpells + ' ucrReceiverDayOfYear.Selector = ucrSelectorForSpells + ' ucrReceiverDate.SetMeAsReceiver() + + ' ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) + ' ucrReceiverDayOfYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "doy" & Chr(34)}) + ' ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) + ' ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) + ' ucrReceiverDate.bAutoFill = True + ' ucrReceiverDayOfYear.bAutoFill = True + ' ucrReceiverRainfall.bAutoFill = True + ' ucrReceiverYear.bAutoFill = True + + ' nudConditionLeft.DecimalPlaces = 2 + ' NudConditionRight.DecimalPlaces = 2 + + ' 'Dim dctCondition As New Dictionary(Of String, String) + ' 'dctCondition.Add("Between", "between") + ' 'dctCondition.Add("Less than", Chr(34) & "<" & Chr(34)) + ' 'dctCondition.Add("Greater than", Chr(34) & ">" & Chr(34)) + ' 'ucrInputCondition.SetItems(dctCondition) + + ' ucrInputCondition.SetItems({"<= Amount of Rain", "Between", ">= Amount of Rain"}) + ' nudFrom.Minimum = 1 + ' nudFrom.Maximum = 366 + ' nudTo.Minimum = 1 + ' nudTo.Maximum = 366 + + ' 'save + ' ucrSaveSpells.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) + ' ucrSaveSpells.SetLabelText("New Column Name:") + ' ucrSaveSpells.SetIsTextBox() + ' ucrSaveSpells.SetPrefix("Spells") + ' ucrSaveSpells.SetSaveTypeAsColumn() + ' End Sub - chkConditionRain.Checked = False - nudFrom.Value = 1 - nudTo.Value = 366 - nudConditionLeft.Value = 0 - nudConditionLeft.Maximum = Integer.MaxValue - NudConditionRight.Maximum = Integer.MaxValue - NudConditionRight.Value = 0.85 - ucrInputCondition.SetName("Between") - End Sub + Private Sub SetDefaults() + clsRRollFuncExpr = New RFunction + clsRTransform = New RFunction + clsMatchFun = New RFunction + clsRollFunction = New RFunction + clsTransformManipulationsFunc = New RFunction + clsTransformGroupByFunc = New RFunction - Private Sub ReopenDialog() + ucrSelectorForSpells.Reset() + ucrReceiverDate.SetMeAsReceiver() + ' RDO1 + clsTransformGroupByFunc.SetRCommand("instat_calculation$new") + clsTransformGroupByFunc.AddParameter("type", Chr(34) & "by" & Chr(34), iPosition:=2) + clsTransformGroupByFunc.SetAssignTo("grouping") + + ' RDO2 + clsMatchFun.SetRCommand("match.fun") + clsMatchFun.AddParameter("FUN", Chr(39) & "sum" & Chr(39), iPosition:=0) + + clsRRollFuncExpr.SetPackageName("zoo") + clsRRollFuncExpr.SetRCommand("rollapply") + clsRRollFuncExpr.AddParameter("data", ucrReceiverRainfall.GetVariableNames(bWithQuotes:=False), iPosition:=0) + clsRRollFuncExpr.AddParameter("fill", "NA", iPosition:=3) + clsRRollFuncExpr.AddParameter("width", 1, iPosition:=2) + clsRRollFuncExpr.AddParameter("FUN", clsRFunctionParameter:=clsMatchFun, iPosition:=1) + clsRRollFuncExpr.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) + + clsWaterBalance60.SetRCommand("instat_calculation$new") + clsWaterBalance60.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=1) + clsWaterBalance60.AddParameter("result_name", Chr(34) & "Water_Balance_60" & Chr(34), iPosition:=3) + clsWaterBalance60.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubCalcList, iPosition:=5) + clsWaterBalance60.AddParameter("save", "2", iPosition:=4) + clsWaterBalance60.SetAssignTo("Water_Balance_60") + + ' RDO4 + clsRRainday.SetRCommand("instat_calculation$new") + clsRRainday.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=1) + + clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrReceiverRainfall.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0,1)" & Chr(34), iPosition:=2) + clsRRainday.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=3) + clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) + clsRRainday.AddParameter("save", "0", iPosition:=4) + clsRRainday.SetAssignTo("rain_day") + + ' Base + clsTransformManipulationsFunc.SetRCommand("list") + clsTransformManipulationsFunc.AddParameter("group_by", clsRFunctionParameter:=clsTransformGroupByFunc, bIncludeArgumentName:=False, iPosition:=0) + + clsRTransform.SetRCommand("instat_calculation$new") + clsRTransform.SetAssignTo("transform_calculation") + clsRTransform.AddParameter("function_exp", Chr(34) & clsRRollFuncExpr.ToScript.ToString & Chr(34), iPosition:=2) + clsRTransform.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=1) + clsRTransform.AddParameter("result_name", Chr(34) & "moving_sum" & Chr(34), iPosition:=3) + clsRTransform.AddParameter("manipulations", clsRFunctionParameter:=clsTransformManipulationsFunc, iPosition:=4) + clsRTransform.AddParameter("save", 2, iPosition:=4) + + clsRollFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") + clsRollFunction.AddParameter("display", "FALSE", iPosition:=1) + clsRollFunction.AddParameter("calc", clsRFunctionParameter:=clsRTransform, iPosition:=0) + + 'Base Function + ucrBase.clsRsyntax.SetBaseRFunction(clsRollFunction) End Sub - Private Sub DisplayForConditions() - Select Case ucrInputCondition.GetText - Case "Between" - nudConditionLeft.Visible = True - NudConditionRight.Visible = True - Case Else - nudConditionLeft.Visible = True - NudConditionRight.Visible = False - End Select + Private Sub SetRCodeForControls(bReset As Boolean) + End Sub Private Sub TestOKEnabled() - If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDayOfYear.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso nudConditionLeft.Text <> "" AndAlso nudFrom.Text <> "" AndAlso nudTo.Text <> "" AndAlso NudConditionRight.Text <> "" Then ' and ucrInput is empty + If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso nudFrom.Text <> "" AndAlso nudTo.Text <> "" AndAlso ucrInputSpellUpper.Text <> "" Then ' and ucrInput is empty ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) @@ -138,153 +206,279 @@ Public Class dlgSpells Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() + SetRCodeForControls(True) + TestOKEnabled() End Sub - ' nud max and mins. - Private Sub nudValues() - ' nudFrom.Maximum = ucrNudTo.Value - 1 - ' ucrNudTo.Minimum = nudFrom.Value + 1 - 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 - 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 - End Sub - - Private Sub DayFromAndToMethod() - clsDayFromAndTo.AddParameter("function_exp", Chr(34) & ucrReceiverDayOfYear.GetVariableNames(False) & ">=" & nudFrom.Value & " & " & ucrReceiverDayOfYear.GetVariableNames(False) & "<=" & nudTo.Value & Chr(34)) - clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDayOfYear.GetVariableNames() & ")") - clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34)) + Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk + clsRTransform.SetAssignTo("transform_calculation") + clsWaterBalance60.SetAssignTo("water_balance_60") + clsRRainday.SetAssignTo("rain_day") + SetGroupByFuncCalcFrom() + clsRTransform.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34), iPosition:=2) + clsRollFunction.AddParameter("calc", clsRFunctionParameter:=clsRTransform, iPosition:=1) + ucrBase.clsRsyntax.SetBaseRFunction(clsRollFunction) End Sub - Private Sub RainyDaysMethod() - - clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - Select Case ucrInputCondition.GetText - Case "<= Amount of Rain" - clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudConditionLeft.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) - Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) - clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudConditionLeft.Value & "&" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & NudConditionRight.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) - Case Else - clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & nudConditionLeft.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) - End Select - clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34)) - clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")") - clsRainyDays.AddParameter("save", 0) - - If chkConditionRain.Checked Then - clsSpellLength.RemoveParameterByName("function_exp") - clsSpellLength.RemoveParameterByName("sub_calculations") - clsSubSpellLength1.RemoveParameterByName("sub1") - - clsAdditionalCondition.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsAdditionalCondition.AddParameter("function_exp", Chr(34) & "replace(rain_day, " & (nudFrom.Value - 1) & ", 0)" & Chr(34)) - clsAdditionalCondition.AddParameter("result_name", Chr(34) & "rain_day2" & Chr(34)) - clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) - clsAdditionalConditionList.SetRCommand("list") - clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays) - clsAdditionalCondition.AddParameter("save", 0) - - clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day2)-cummax((rain_day2==0)*cumsum(rain_day2))" & Chr(34)) - clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength2) - clsSubSpellLength2.AddParameter("sub1", clsRFunctionParameter:=clsAdditionalCondition, bIncludeArgumentName:=False) - Else - clsAdditionalCondition.RemoveParameterByName("type") - clsAdditionalCondition.RemoveParameterByName("function_exp") - clsAdditionalCondition.RemoveParameterByName("result_name") - clsAdditionalCondition.RemoveParameterByName("sub_calculation") - clsAdditionalCondition.RemoveParameterByName("save") - clsAdditionalConditionList.RemoveParameterByName("sub1") - clsSpellLength.RemoveParameterByName("function_exp") - clsSpellLength.RemoveParameterByName("sub_calculations") - clsSubSpellLength2.RemoveParameterByName("sub1") - - clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34)) - clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) - clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) + Private Sub SumOver() + If Not ucrReceiverRainfall.IsEmpty Then + clsRTransform.AddParameter("function_exp", Chr(34) & clsRRollFuncExpr.ToScript.ToString & Chr(34), iPosition:=2) End If - clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsSpellLength.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) - clsSpellLength.AddParameter("save", 0) - End Sub - - Private Sub ucrInputCondition_NameChanged() Handles ucrInputCondition.NameChanged - DisplayForConditions() - RainyDaysMethod() - End Sub - - Private Sub MaxValue() - clsMaxValueManipulation.SetRCommand("list") - clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) - clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - - clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34)) - clsMaxValue.AddParameter("function_exp", Chr(34) & "max(Dry_Spell)" & Chr(34)) - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation) - clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList) - clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False) - clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34)) - clsMaxValue.AddParameter("save", 2) - End Sub - - Private Sub firstDayofTheYear() - ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsMaxValue) End Sub - Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk - frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining Date column as key") - - DayFromAndToMethod() - RainyDaysMethod() - MaxValue() - End Sub - - Private Sub nudToAndFrom_ControlValueChanged(sender As Object, e As EventArgs) Handles nudTo.TextChanged, nudFrom.TextChanged - nudValues() - DayFromAndToMethod() - RainyDaysMethod() - TestOKEnabled() - End Sub + 'Private Sub ucrPnlTransform_ControlContentsChanged(ucrChangedControl As ucrCore) Handles + ' Dim bRain As Boolean = False + ' clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrreceiverrain.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0, 1)" & Chr(34)) + ' clsSubCalcList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) + ' clsRTransform.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubCalcList, iPosition:=6) + ' SetAssignName() + 'End Sub - Private Sub ucrReceiverDOY(sender As Object, e As EventArgs) Handles ucrReceiverDayOfYear.SelectionChanged - DayFromAndToMethod() - MaxValue() - firstDayofTheYear() - TestOKEnabled() + Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForSpells.ControlContentsChanged + strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) + clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrReceiverRainfall.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0, 1)" & Chr(34), iPosition:=2) + clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) + clsRTransform.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) End Sub - Private Sub ucrReceiverRainfall_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverRainfall.SelectionChanged - RainyDaysMethod() - TestOKEnabled() - End Sub + Private Sub SetGroupByFuncCalcFrom() + Dim strCurrDataName As String = "" + Dim strGroupByCalcFrom As String = "" + strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) + If Not ucrReceiverStation.IsEmpty Then + clsTransformGroupByFunc.SetAssignTo("grouping") + clsRTransform.AddParameter("manipulations", clsRFunctionParameter:=clsTransformManipulationsFunc, iPosition:=4) - Private Sub ucrReceiverYear_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverYear.SelectionChanged - clsYearGroupDaily.AddParameter("type", Chr(34) & "by" & Chr(34)) - clsYearGroupDaily.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") - TestOKEnabled() - End Sub + strGroupByCalcFrom = "list(" & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames() & ")" + Else + clsRTransform.RemoveParameterByName("manipulations") - Private Sub ucrReceiverDate_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDate.SelectionChanged - If Not ucrReceiverDate.IsEmpty Then - clsAddKey.AddParameter("col_name", ucrReceiverDate.GetVariableNames) + End If + If strGroupByCalcFrom <> "" Then + clsTransformGroupByFunc.AddParameter("calculated_from", strGroupByCalcFrom, iPosition:=0) Else - clsAddKey.RemoveParameterByName("col_name") + clsTransformGroupByFunc.RemoveParameterByName("calculated_from") End If - TestOKEnabled() End Sub - Private Sub ConditionalRainNuds_valuechanged(sender As Object, e As EventArgs) Handles NudConditionRight.TextChanged, nudConditionLeft.TextChanged - RainyDaysMethod() - TestOKEnabled() + Private Sub ucrReceiverStation_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverStation.ControlValueChanged + SetGroupByFuncCalcFrom() End Sub - Private Sub chkConditionRain_CheckedChanged(sender As Object, e As EventArgs) Handles chkConditionRain.CheckedChanged - RainyDaysMethod() + Private Sub ucrControls_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged + SumOver() + TestOKEnabled() End Sub - Private Sub ucrSaveSpells_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveSpells.ControlContentsChanged + Private Sub ucrSpellBetween_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrInputSpellUpper.ControlContentsChanged, ucrInputSpellLower.ControlContentsChanged + clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrReceiverRainfall.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0, 1)" & Chr(34), iPosition:=2) + clsSubCalcList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, iPosition:=0) + clsRTransform.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubCalcList, iPosition:=7) + clsRTransform.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34), iPosition:=2) TestOKEnabled() End Sub - Private Sub ucrSaveSpells_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveSpells.ControlValueChanged - clsMaxValue.SetAssignTo(ucrSaveSpells.ucrInputTextSave.GetText) - MaxValue() + Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged + TestOKEnabled() End Sub -End Class \ No newline at end of file +End Class + + +'Public Class dlgSpells +' Private clsAddKey, clsDayFromAndTo, clsAdditionalCondition, clsRainyDays, clsMaxValue, clsYearGroupDaily, clsMaxValueManipulation As New RFunction +' Private clsMaxValueList, clsSpellLength, clsSubSpellLength1, clsSubSpellLength2, clsAdditionalConditionList As New RFunction +' Private strCurrDataName As String = "" +' Private bFirstLoad As Boolean = True + + +' Private Sub ucrSelectorForStartofRains_DataFrameChanged() Handles ucrSelectorForSpells.DataFrameChanged +' strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) +' clsAddKey.AddParameter("data_name", strCurrDataName) +' firstDayofTheYear() +' End Sub + + + +' Private Sub SetDefaults() +' ucrSelectorForSpells.Reset() +' ucrSaveSpells.Reset() + +' TestOKEnabled() + +' chkConditionRain.Checked = False +' nudFrom.Value = 1 +' nudTo.Value = 366 +' nudConditionLeft.Value = 0 +' nudConditionLeft.Maximum = Integer.MaxValue +' NudConditionRight.Maximum = Integer.MaxValue +' NudConditionRight.Value = 0.85 +' ucrInputCondition.SetName("Between") +' End Sub + +' Private Sub ReopenDialog() + +' End Sub + +' Private Sub DisplayForConditions() +' Select Case ucrInputCondition.GetText +' Case "Between" +' nudConditionLeft.Visible = True +' NudConditionRight.Visible = True +' Case Else +' nudConditionLeft.Visible = True +' NudConditionRight.Visible = False +' End Select +' End Sub + +' Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset +' SetDefaults() +' End Sub + +' ' nud max and mins. +' Private Sub nudValues() +' ' nudFrom.Maximum = ucrNudTo.Value - 1 +' ' ucrNudTo.Minimum = nudFrom.Value + 1 +' 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 +' 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 +' End Sub + +' Private Sub DayFromAndToMethod() +' clsDayFromAndTo.AddParameter("function_exp", Chr(34) & ucrReceiverDayOfYear.GetVariableNames(False) & ">=" & nudFrom.Value & " & " & ucrReceiverDayOfYear.GetVariableNames(False) & "<=" & nudTo.Value & Chr(34)) +' clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDayOfYear.GetVariableNames() & ")") +' clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34)) +' End Sub + +' Private Sub RainyDaysMethod() + +' clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) +' Select Case ucrInputCondition.GetText +' Case "<= Amount of Rain" +' clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudConditionLeft.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) +' Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) +' clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudConditionLeft.Value & "&" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & NudConditionRight.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) +' Case Else +' clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & nudConditionLeft.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) +' End Select +' clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34)) +' clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")") +' clsRainyDays.AddParameter("save", 0) + +' If chkConditionRain.Checked Then +' clsSpellLength.RemoveParameterByName("function_exp") +' clsSpellLength.RemoveParameterByName("sub_calculations") +' clsSubSpellLength1.RemoveParameterByName("sub1") + +' clsAdditionalCondition.AddParameter("type", Chr(34) & "calculation" & Chr(34)) +' clsAdditionalCondition.AddParameter("function_exp", Chr(34) & "replace(rain_day, " & (nudFrom.Value - 1) & ", 0)" & Chr(34)) +' clsAdditionalCondition.AddParameter("result_name", Chr(34) & "rain_day2" & Chr(34)) +' clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) +' clsAdditionalConditionList.SetRCommand("list") +' clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays) +' clsAdditionalCondition.AddParameter("save", 0) + +' clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day2)-cummax((rain_day2==0)*cumsum(rain_day2))" & Chr(34)) +' clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength2) +' clsSubSpellLength2.AddParameter("sub1", clsRFunctionParameter:=clsAdditionalCondition, bIncludeArgumentName:=False) +' Else +' clsAdditionalCondition.RemoveParameterByName("type") +' clsAdditionalCondition.RemoveParameterByName("function_exp") +' clsAdditionalCondition.RemoveParameterByName("result_name") +' clsAdditionalCondition.RemoveParameterByName("sub_calculation") +' clsAdditionalCondition.RemoveParameterByName("save") +' clsAdditionalConditionList.RemoveParameterByName("sub1") +' clsSpellLength.RemoveParameterByName("function_exp") +' clsSpellLength.RemoveParameterByName("sub_calculations") +' clsSubSpellLength2.RemoveParameterByName("sub1") + +' clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34)) +' clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) +' clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) +' End If +' clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34)) +' clsSpellLength.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) +' clsSpellLength.AddParameter("save", 0) +' End Sub + +' Private Sub ucrInputCondition_NameChanged() Handles ucrInputCondition.NameChanged +' DisplayForConditions() +' RainyDaysMethod() +' End Sub + +' Private Sub MaxValue() +' clsMaxValueManipulation.SetRCommand("list") +' clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) +' clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + +' clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34)) +' clsMaxValue.AddParameter("function_exp", Chr(34) & "max(Dry_Spell)" & Chr(34)) +' clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation) +' clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList) +' clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False) +' clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34)) +' clsMaxValue.AddParameter("save", 2) +' End Sub + +' Private Sub firstDayofTheYear() +' ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsMaxValue) +' End Sub + +' Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk +' frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining Date column as key") + +' DayFromAndToMethod() +' RainyDaysMethod() +' MaxValue() +' End Sub + +' Private Sub nudToAndFrom_ControlValueChanged(sender As Object, e As EventArgs) Handles nudTo.TextChanged, nudFrom.TextChanged +' nudValues() +' DayFromAndToMethod() +' RainyDaysMethod() +' TestOKEnabled() +' End Sub + +' Private Sub ucrReceiverDOY(sender As Object, e As EventArgs) Handles ucrReceiverDayOfYear.SelectionChanged +' DayFromAndToMethod() +' MaxValue() +' firstDayofTheYear() +' TestOKEnabled() +' End Sub + +' Private Sub ucrReceiverRainfall_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverRainfall.SelectionChanged +' RainyDaysMethod() +' TestOKEnabled() +' End Sub + +' Private Sub ucrReceiverYear_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverYear.SelectionChanged +' clsYearGroupDaily.AddParameter("type", Chr(34) & "by" & Chr(34)) +' clsYearGroupDaily.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") +' TestOKEnabled() +' End Sub + +' Private Sub ucrReceiverDate_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDate.SelectionChanged +' If Not ucrReceiverDate.IsEmpty Then +' clsAddKey.AddParameter("col_name", ucrReceiverDate.GetVariableNames) +' Else +' clsAddKey.RemoveParameterByName("col_name") +' End If +' TestOKEnabled() +' End Sub + +' Private Sub ConditionalRainNuds_valuechanged(sender As Object, e As EventArgs) Handles NudConditionRight.TextChanged, nudConditionLeft.TextChanged +' RainyDaysMethod() +' TestOKEnabled() +' End Sub + +' Private Sub chkConditionRain_CheckedChanged(sender As Object, e As EventArgs) Handles chkConditionRain.CheckedChanged +' RainyDaysMethod() +' End Sub + +' Private Sub ucrSaveSpells_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveSpells.ControlContentsChanged +' TestOKEnabled() +' End Sub + +' Private Sub ucrSaveSpells_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveSpells.ControlValueChanged +' clsMaxValue.SetAssignTo(ucrSaveSpells.ucrInputTextSave.GetText) +' MaxValue() +' End Sub +'End Class \ No newline at end of file From 450e3995af83b8b28126479de66e965e4ad98707 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Fri, 16 Jun 2017 14:53:42 +0300 Subject: [PATCH 042/201] Updating climatic and describe menu --- instat/frmMain.Designer.vb | 170 +++++++++++++------------------------ instat/frmMain.vb | 27 +++--- 2 files changed, 76 insertions(+), 121 deletions(-) diff --git a/instat/frmMain.Designer.vb b/instat/frmMain.Designer.vb index 1e19550bd3a..32aa0c2a486 100644 --- a/instat/frmMain.Designer.vb +++ b/instat/frmMain.Designer.vb @@ -63,11 +63,6 @@ Partial Class frmMain Me.mnuDescribeMultivariateCorrelations = New System.Windows.Forms.ToolStripMenuItem() Me.mnuDescribeMultivariateprincipalComponents = New System.Windows.Forms.ToolStripMenuItem() Me.mnuDescribeMultivariateCanonicalCorrelations = New System.Windows.Forms.ToolStripMenuItem() - Me.mnuDescribeMoreGraphs = New System.Windows.Forms.ToolStripMenuItem() - Me.mnuDescribeOtherGraphicsDialogsWindRose = New System.Windows.Forms.ToolStripMenuItem() - Me.mnuDescribeOtherGraphicsDialogsCumulativeDistribution = New System.Windows.Forms.ToolStripMenuItem() - Me.mnuDescribeOtherGraphicsDialogsInventoryPlot = New System.Windows.Forms.ToolStripMenuItem() - Me.mnuDescribeOtherGraphicsDialogsPopulationPyramid = New System.Windows.Forms.ToolStripMenuItem() Me.ToolStripSeparator13 = New System.Windows.Forms.ToolStripSeparator() Me.mnuDescribeUseGraph = New System.Windows.Forms.ToolStripMenuItem() Me.mnuDescribeCombineGraph = New System.Windows.Forms.ToolStripMenuItem() @@ -202,13 +197,12 @@ Partial Class frmMain Me.mnuClimaticDescribeRainfall = New System.Windows.Forms.ToolStripMenuItem() Me.mnuClimaticDescribeTemperatures = New System.Windows.Forms.ToolStripMenuItem() Me.mnuClimaticDescribeWindSpeedDirection = New System.Windows.Forms.ToolStripMenuItem() + Me.WindroseToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.WindrosePlotToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.mnuClimaticDescribeSunshineRadiation = New System.Windows.Forms.ToolStripMenuItem() Me.ToolStripSeparator17 = New System.Windows.Forms.ToolStripSeparator() Me.mnuClimaticDescribeGeneral = New System.Windows.Forms.ToolStripMenuItem() Me.ToolStripSeparator31 = New System.Windows.Forms.ToolStripSeparator() - Me.mnuClimaticMoreGraphs = New System.Windows.Forms.ToolStripMenuItem() - Me.mnuClimaticDescribeMoreGraphsWindoRose = New System.Windows.Forms.ToolStripMenuItem() - Me.mnuClimaticDescribeMoreGraphsCummulaiveDistribution = New System.Windows.Forms.ToolStripMenuItem() Me.mnuClimaticPICSA = New System.Windows.Forms.ToolStripMenuItem() Me.mnuClimaticPICSARainfall = New System.Windows.Forms.ToolStripMenuItem() Me.mnuClimaticPICSATemperature = New System.Windows.Forms.ToolStripMenuItem() @@ -469,6 +463,7 @@ Partial Class frmMain Me.splDataOutput = New System.Windows.Forms.SplitContainer() Me.ucrDataViewer = New instat.ucrDataView() Me.ucrOutput = New instat.ucrOutputWindow() + Me.CummulativeDistributionToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.stsStrip.SuspendLayout() Me.Tool_strip.SuspendLayout() Me.mnuBar.SuspendLayout() @@ -496,7 +491,7 @@ Partial Class frmMain ' 'mnuDescribe ' - Me.mnuDescribe.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuDescribeOneVariable, Me.mnuDescribeTwoVariables, Me.mnuDescribeThreeVariable, Me.mnuDescribeSpecific, Me.mnuDescribeGeneral, Me.ToolStripSeparator9, Me.mnuDescribeMultivariate, Me.mnuDescribeMoreGraphs, Me.ToolStripSeparator13, Me.mnuDescribeUseGraph, Me.mnuDescribeCombineGraph, Me.mnuDescribeThemes, Me.mnuDescribeViewGraph}) + Me.mnuDescribe.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuDescribeOneVariable, Me.mnuDescribeTwoVariables, Me.mnuDescribeThreeVariable, Me.mnuDescribeSpecific, 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.Tag = "Describe" @@ -610,7 +605,7 @@ Partial Class frmMain ' 'mnuDescribeSpecific ' - Me.mnuDescribeSpecific.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuDescribeSpecificFrequency, Me.mnuDescribeSpecificSummary, Me.mnuDescribeSpecificMultipleResponse, Me.ToolStripSeparator26, Me.mnuDescribeSpecificScatterPlot, Me.mnuDescribeSpecificLinePlot, Me.mnuDescribeSpecificHistogram, Me.mnuDescribeSpecificBoxplot, Me.mnuDescribeSpecificDotPlot, Me.mnuDescribeSpecificRugPlot, Me.mnuDescribeSpecificBarChart}) + Me.mnuDescribeSpecific.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuDescribeSpecificFrequency, Me.mnuDescribeSpecificSummary, Me.mnuDescribeSpecificMultipleResponse, Me.ToolStripSeparator26, Me.mnuDescribeSpecificScatterPlot, Me.mnuDescribeSpecificLinePlot, Me.mnuDescribeSpecificHistogram, Me.mnuDescribeSpecificBoxplot, Me.mnuDescribeSpecificDotPlot, Me.mnuDescribeSpecificRugPlot, Me.mnuDescribeSpecificBarChart, Me.CummulativeDistributionToolStripMenuItem}) Me.mnuDescribeSpecific.Name = "mnuDescribeSpecific" Me.mnuDescribeSpecific.Size = New System.Drawing.Size(172, 22) Me.mnuDescribeSpecific.Tag = "Table_Dialogs" @@ -619,14 +614,14 @@ Partial Class frmMain 'mnuDescribeSpecificFrequency ' Me.mnuDescribeSpecificFrequency.Name = "mnuDescribeSpecificFrequency" - Me.mnuDescribeSpecificFrequency.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificFrequency.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificFrequency.Tag = "Frequency..." Me.mnuDescribeSpecificFrequency.Text = "Frequency..." ' 'mnuDescribeSpecificSummary ' Me.mnuDescribeSpecificSummary.Name = "mnuDescribeSpecificSummary" - Me.mnuDescribeSpecificSummary.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificSummary.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificSummary.Tag = "Summary..." Me.mnuDescribeSpecificSummary.Text = "Summary..." ' @@ -634,60 +629,60 @@ Partial Class frmMain ' Me.mnuDescribeSpecificMultipleResponse.Enabled = False Me.mnuDescribeSpecificMultipleResponse.Name = "mnuDescribeSpecificMultipleResponse" - Me.mnuDescribeSpecificMultipleResponse.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificMultipleResponse.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificMultipleResponse.Tag = "Multiple_Response..." Me.mnuDescribeSpecificMultipleResponse.Text = "Multiple Response..." ' 'ToolStripSeparator26 ' Me.ToolStripSeparator26.Name = "ToolStripSeparator26" - Me.ToolStripSeparator26.Size = New System.Drawing.Size(177, 6) + Me.ToolStripSeparator26.Size = New System.Drawing.Size(217, 6) ' 'mnuDescribeSpecificScatterPlot ' Me.mnuDescribeSpecificScatterPlot.Name = "mnuDescribeSpecificScatterPlot" - Me.mnuDescribeSpecificScatterPlot.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificScatterPlot.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificScatterPlot.Tag = "Scatter_Plot..." Me.mnuDescribeSpecificScatterPlot.Text = "Scatter Plot..." ' 'mnuDescribeSpecificLinePlot ' Me.mnuDescribeSpecificLinePlot.Name = "mnuDescribeSpecificLinePlot" - Me.mnuDescribeSpecificLinePlot.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificLinePlot.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificLinePlot.Tag = "Line_Plot..." Me.mnuDescribeSpecificLinePlot.Text = "Line Plot..." ' 'mnuDescribeSpecificHistogram ' Me.mnuDescribeSpecificHistogram.Name = "mnuDescribeSpecificHistogram" - Me.mnuDescribeSpecificHistogram.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificHistogram.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificHistogram.Tag = "Histogram..." Me.mnuDescribeSpecificHistogram.Text = "Histogram..." ' 'mnuDescribeSpecificBoxplot ' Me.mnuDescribeSpecificBoxplot.Name = "mnuDescribeSpecificBoxplot" - Me.mnuDescribeSpecificBoxplot.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificBoxplot.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificBoxplot.Tag = "Boxplot..." Me.mnuDescribeSpecificBoxplot.Text = "Boxplot..." ' 'mnuDescribeSpecificDotPlot ' Me.mnuDescribeSpecificDotPlot.Name = "mnuDescribeSpecificDotPlot" - Me.mnuDescribeSpecificDotPlot.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificDotPlot.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificDotPlot.Tag = "Dotplot..." Me.mnuDescribeSpecificDotPlot.Text = "Dot Plot..." ' 'mnuDescribeSpecificRugPlot ' Me.mnuDescribeSpecificRugPlot.Name = "mnuDescribeSpecificRugPlot" - Me.mnuDescribeSpecificRugPlot.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificRugPlot.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificRugPlot.Text = "Rug Plot..." ' 'mnuDescribeSpecificBarChart ' Me.mnuDescribeSpecificBarChart.Name = "mnuDescribeSpecificBarChart" - Me.mnuDescribeSpecificBarChart.Size = New System.Drawing.Size(180, 22) + Me.mnuDescribeSpecificBarChart.Size = New System.Drawing.Size(220, 22) Me.mnuDescribeSpecificBarChart.Tag = "Bar_Chart" Me.mnuDescribeSpecificBarChart.Text = "Bar Chart..." ' @@ -762,42 +757,6 @@ Partial Class frmMain Me.mnuDescribeMultivariateCanonicalCorrelations.Size = New System.Drawing.Size(203, 22) Me.mnuDescribeMultivariateCanonicalCorrelations.Text = "Canonical Correlations..." ' - 'mnuDescribeMoreGraphs - ' - Me.mnuDescribeMoreGraphs.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuDescribeOtherGraphicsDialogsWindRose, Me.mnuDescribeOtherGraphicsDialogsCumulativeDistribution, Me.mnuDescribeOtherGraphicsDialogsInventoryPlot, Me.mnuDescribeOtherGraphicsDialogsPopulationPyramid}) - Me.mnuDescribeMoreGraphs.Name = "mnuDescribeMoreGraphs" - Me.mnuDescribeMoreGraphs.Size = New System.Drawing.Size(172, 22) - Me.mnuDescribeMoreGraphs.Text = "Graphs" - ' - 'mnuDescribeOtherGraphicsDialogsWindRose - ' - Me.mnuDescribeOtherGraphicsDialogsWindRose.Name = "mnuDescribeOtherGraphicsDialogsWindRose" - Me.mnuDescribeOtherGraphicsDialogsWindRose.Size = New System.Drawing.Size(209, 22) - Me.mnuDescribeOtherGraphicsDialogsWindRose.Tag = "WindRose..." - Me.mnuDescribeOtherGraphicsDialogsWindRose.Text = "Wind Rose..." - ' - 'mnuDescribeOtherGraphicsDialogsCumulativeDistribution - ' - Me.mnuDescribeOtherGraphicsDialogsCumulativeDistribution.Name = "mnuDescribeOtherGraphicsDialogsCumulativeDistribution" - Me.mnuDescribeOtherGraphicsDialogsCumulativeDistribution.Size = New System.Drawing.Size(209, 22) - Me.mnuDescribeOtherGraphicsDialogsCumulativeDistribution.Tag = "Cumulative_Distribution..." - Me.mnuDescribeOtherGraphicsDialogsCumulativeDistribution.Text = "Cumulative Distribution..." - ' - 'mnuDescribeOtherGraphicsDialogsInventoryPlot - ' - Me.mnuDescribeOtherGraphicsDialogsInventoryPlot.Name = "mnuDescribeOtherGraphicsDialogsInventoryPlot" - Me.mnuDescribeOtherGraphicsDialogsInventoryPlot.Size = New System.Drawing.Size(209, 22) - Me.mnuDescribeOtherGraphicsDialogsInventoryPlot.Tag = "Inventory_Plot..." - Me.mnuDescribeOtherGraphicsDialogsInventoryPlot.Text = "Inventory Plot..." - ' - 'mnuDescribeOtherGraphicsDialogsPopulationPyramid - ' - Me.mnuDescribeOtherGraphicsDialogsPopulationPyramid.Enabled = False - Me.mnuDescribeOtherGraphicsDialogsPopulationPyramid.Name = "mnuDescribeOtherGraphicsDialogsPopulationPyramid" - Me.mnuDescribeOtherGraphicsDialogsPopulationPyramid.Size = New System.Drawing.Size(209, 22) - Me.mnuDescribeOtherGraphicsDialogsPopulationPyramid.Tag = "Population_Pyramid..." - Me.mnuDescribeOtherGraphicsDialogsPopulationPyramid.Text = "Population Pyramid..." - ' 'ToolStripSeparator13 ' Me.ToolStripSeparator13.Name = "ToolStripSeparator13" @@ -1189,7 +1148,7 @@ Partial Class frmMain ' Me.mnuClimaticExamine.Enabled = False Me.mnuClimaticExamine.Name = "mnuClimaticExamine" - Me.mnuClimaticExamine.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticExamine.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticExamine.Tag = "Examine" Me.mnuClimaticExamine.Text = "Examine..." Me.mnuClimaticExamine.Visible = False @@ -1198,7 +1157,7 @@ Partial Class frmMain ' Me.mnuClimaticProcess.Enabled = False Me.mnuClimaticProcess.Name = "mnuClimaticProcess" - Me.mnuClimaticProcess.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticProcess.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticProcess.Tag = "Process" Me.mnuClimaticProcess.Text = "Process..." Me.mnuClimaticProcess.Visible = False @@ -1207,7 +1166,7 @@ Partial Class frmMain ' Me.mnuClimaticEvaporation.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticEvaporationSite, Me.mnuClimaticEvaporationPenman}) Me.mnuClimaticEvaporation.Name = "mnuClimaticEvaporation" - Me.mnuClimaticEvaporation.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticEvaporation.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticEvaporation.Tag = "Evaporation" Me.mnuClimaticEvaporation.Text = "Evaporation" Me.mnuClimaticEvaporation.Visible = False @@ -1232,7 +1191,7 @@ Partial Class frmMain ' Me.mnuClimaticCrop.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.CropCoefficientsToolStripMenuItem, Me.WaterSatisfactionIndexToolStripMenuItem}) Me.mnuClimaticCrop.Name = "mnuClimaticCrop" - Me.mnuClimaticCrop.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticCrop.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticCrop.Tag = "Crop" Me.mnuClimaticCrop.Text = "Crop" Me.mnuClimaticCrop.Visible = False @@ -1255,7 +1214,7 @@ Partial Class frmMain ' Me.mnuClimaticHeatSum.Enabled = False Me.mnuClimaticHeatSum.Name = "mnuClimaticHeatSum" - Me.mnuClimaticHeatSum.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticHeatSum.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticHeatSum.Tag = "Heat_Sum" Me.mnuClimaticHeatSum.Text = "Heat Sum..." Me.mnuClimaticHeatSum.Visible = False @@ -1430,7 +1389,7 @@ Partial Class frmMain 'ToolStripSeparator16 ' Me.ToolStripSeparator16.Name = "ToolStripSeparator16" - Me.ToolStripSeparator16.Size = New System.Drawing.Size(188, 6) + Me.ToolStripSeparator16.Size = New System.Drawing.Size(209, 6) ' 'mnuClimatic ' @@ -1444,7 +1403,7 @@ Partial Class frmMain ' Me.mnuClimaticFile.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticFileOpensst, Me.mnuClimaticFileImportGriddedData, Me.OpenNetCDFToolStripMenuItem, Me.mnuClimateFileClimSoft, Me.mnuClimaticFileCliData, Me.ToolStripSeparator15, Me.mnuClimaticFileExportToCPT}) Me.mnuClimaticFile.Name = "mnuClimaticFile" - Me.mnuClimaticFile.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticFile.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticFile.Text = "File" ' 'mnuClimaticFileOpensst @@ -1493,13 +1452,13 @@ Partial Class frmMain 'ToolStripSeparator18 ' Me.ToolStripSeparator18.Name = "ToolStripSeparator18" - Me.ToolStripSeparator18.Size = New System.Drawing.Size(188, 6) + Me.ToolStripSeparator18.Size = New System.Drawing.Size(209, 6) ' 'mnuClimaticDates ' Me.mnuClimaticDates.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticDatesGenerateDates, Me.mnuClimaticDatesMakeDate, Me.mnuClimaticDatesUseDate, Me.mnuClimaticDatesInfillMissingDates, Me.mnuClimaticDatesMakeTime, Me.mnuClimaticDatesUseTime}) Me.mnuClimaticDates.Name = "mnuClimaticDates" - Me.mnuClimaticDates.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticDates.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticDates.Text = "Dates" ' 'mnuClimaticDatesGenerateDates @@ -1544,14 +1503,14 @@ Partial Class frmMain 'mnuCliDefineClimaticData ' Me.mnuCliDefineClimaticData.Name = "mnuCliDefineClimaticData" - Me.mnuCliDefineClimaticData.Size = New System.Drawing.Size(191, 22) + Me.mnuCliDefineClimaticData.Size = New System.Drawing.Size(212, 22) Me.mnuCliDefineClimaticData.Text = "Define Climatic Data..." ' 'mnuClimaticPrepare ' Me.mnuClimaticPrepare.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.DispalyClimaticDataToolStripMenuItem, Me.mnuCimaticPrepareTransform, Me.mnuClimaticPrepareClimaticSummaries, Me.ToolStripSeparator37, Me.mnuClimaticPrepareStartoftheRains, Me.mnuClimaticPrepareSpells, Me.mnuClimaticPrepareExtremes, Me.mnuClimaticPrepareEndOfRains, Me.mnuClimaticPrepareSummary, Me.mnuClimaticPrepareNewWorksheet, Me.mnuClimaticPrepareImportDailyData, Me.mnuClimaticPrepareMakeFactor, Me.mnuClimaticPrepareShiftDailyData, Me.mnuClimaticPrepareUnstackDailyData, Me.mnuClimaticPrepareStackDailyData}) Me.mnuClimaticPrepare.Name = "mnuClimaticPrepare" - Me.mnuClimaticPrepare.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticPrepare.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticPrepare.Tag = "Prepare" Me.mnuClimaticPrepare.Text = "Prepare" ' @@ -1670,7 +1629,7 @@ Partial Class frmMain ' Me.mnuClimaticQualityControl.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.InventoryToolStripMenuItem, Me.DisplayDailyToolStripMenuItem, Me.QCProceduresToolStripMenuItem}) Me.mnuClimaticQualityControl.Name = "mnuClimaticQualityControl" - Me.mnuClimaticQualityControl.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticQualityControl.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticQualityControl.Text = "Quality Control" ' 'InventoryToolStripMenuItem @@ -1695,20 +1654,20 @@ Partial Class frmMain 'ToolStripSeparator30 ' Me.ToolStripSeparator30.Name = "ToolStripSeparator30" - Me.ToolStripSeparator30.Size = New System.Drawing.Size(188, 6) + Me.ToolStripSeparator30.Size = New System.Drawing.Size(209, 6) ' 'mnuClimdex ' Me.mnuClimdex.Name = "mnuClimdex" - Me.mnuClimdex.Size = New System.Drawing.Size(191, 22) + Me.mnuClimdex.Size = New System.Drawing.Size(212, 22) Me.mnuClimdex.Tag = "Climdex" Me.mnuClimdex.Text = "Climdex..." ' 'mnuClimaticDescribe ' - Me.mnuClimaticDescribe.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticDescribeRainfall, Me.mnuClimaticDescribeTemperatures, Me.mnuClimaticDescribeWindSpeedDirection, Me.mnuClimaticDescribeSunshineRadiation, Me.ToolStripSeparator17, Me.mnuClimaticDescribeGeneral, Me.ToolStripSeparator31, Me.mnuClimaticMoreGraphs}) + Me.mnuClimaticDescribe.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticDescribeRainfall, Me.mnuClimaticDescribeTemperatures, Me.mnuClimaticDescribeWindSpeedDirection, Me.mnuClimaticDescribeSunshineRadiation, Me.ToolStripSeparator17, Me.mnuClimaticDescribeGeneral, Me.ToolStripSeparator31}) Me.mnuClimaticDescribe.Name = "mnuClimaticDescribe" - Me.mnuClimaticDescribe.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticDescribe.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticDescribe.Text = "Describe" ' 'mnuClimaticDescribeRainfall @@ -1727,11 +1686,23 @@ Partial Class frmMain ' 'mnuClimaticDescribeWindSpeedDirection ' - Me.mnuClimaticDescribeWindSpeedDirection.Enabled = False + Me.mnuClimaticDescribeWindSpeedDirection.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.WindroseToolStripMenuItem, Me.WindrosePlotToolStripMenuItem}) Me.mnuClimaticDescribeWindSpeedDirection.Name = "mnuClimaticDescribeWindSpeedDirection" Me.mnuClimaticDescribeWindSpeedDirection.Size = New System.Drawing.Size(199, 22) Me.mnuClimaticDescribeWindSpeedDirection.Text = "Wind Speed/Direction..." ' + 'WindroseToolStripMenuItem + ' + Me.WindroseToolStripMenuItem.Name = "WindroseToolStripMenuItem" + Me.WindroseToolStripMenuItem.Size = New System.Drawing.Size(163, 22) + Me.WindroseToolStripMenuItem.Text = "Wind Rose..." + ' + 'WindrosePlotToolStripMenuItem + ' + Me.WindrosePlotToolStripMenuItem.Name = "WindrosePlotToolStripMenuItem" + Me.WindrosePlotToolStripMenuItem.Size = New System.Drawing.Size(163, 22) + Me.WindrosePlotToolStripMenuItem.Text = "Wind Rose Plot..." + ' 'mnuClimaticDescribeSunshineRadiation ' Me.mnuClimaticDescribeSunshineRadiation.Enabled = False @@ -1756,34 +1727,12 @@ Partial Class frmMain Me.ToolStripSeparator31.Name = "ToolStripSeparator31" Me.ToolStripSeparator31.Size = New System.Drawing.Size(196, 6) ' - 'mnuClimaticMoreGraphs - ' - Me.mnuClimaticMoreGraphs.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticDescribeMoreGraphsWindoRose, Me.mnuClimaticDescribeMoreGraphsCummulaiveDistribution}) - Me.mnuClimaticMoreGraphs.Name = "mnuClimaticMoreGraphs" - Me.mnuClimaticMoreGraphs.Size = New System.Drawing.Size(199, 22) - Me.mnuClimaticMoreGraphs.Text = "Climatic Graphs" - ' - 'mnuClimaticDescribeMoreGraphsWindoRose - ' - Me.mnuClimaticDescribeMoreGraphsWindoRose.AccessibleDescription = "mnuClimaticDescribeCummulativeDistribution" - Me.mnuClimaticDescribeMoreGraphsWindoRose.Name = "mnuClimaticDescribeMoreGraphsWindoRose" - Me.mnuClimaticDescribeMoreGraphsWindoRose.Size = New System.Drawing.Size(209, 22) - Me.mnuClimaticDescribeMoreGraphsWindoRose.Tag = "WindRose..." - Me.mnuClimaticDescribeMoreGraphsWindoRose.Text = "WindRose..." - ' - 'mnuClimaticDescribeMoreGraphsCummulaiveDistribution - ' - Me.mnuClimaticDescribeMoreGraphsCummulaiveDistribution.Name = "mnuClimaticDescribeMoreGraphsCummulaiveDistribution" - Me.mnuClimaticDescribeMoreGraphsCummulaiveDistribution.Size = New System.Drawing.Size(209, 22) - Me.mnuClimaticDescribeMoreGraphsCummulaiveDistribution.Tag = "Cumulative_Distribution..." - Me.mnuClimaticDescribeMoreGraphsCummulaiveDistribution.Text = "Cumulative Distribution..." - ' 'mnuClimaticPICSA ' Me.mnuClimaticPICSA.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticPICSARainfall, Me.mnuClimaticPICSATemperature, Me.mnuClimaticPICSACrops}) Me.mnuClimaticPICSA.Enabled = False Me.mnuClimaticPICSA.Name = "mnuClimaticPICSA" - Me.mnuClimaticPICSA.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticPICSA.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticPICSA.Text = "PICSA" ' 'mnuClimaticPICSARainfall @@ -1808,7 +1757,7 @@ Partial Class frmMain ' Me.mnuClimaticModels.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticModelsExtremes, Me.mnuClimaticModelsCircular, Me.mnuClimaticModelsMarkovModelling}) Me.mnuClimaticModels.Name = "mnuClimaticModels" - Me.mnuClimaticModels.Size = New System.Drawing.Size(191, 22) + Me.mnuClimaticModels.Size = New System.Drawing.Size(212, 22) Me.mnuClimaticModels.Text = "Model" ' 'mnuClimaticModelsExtremes @@ -1834,14 +1783,14 @@ Partial Class frmMain 'ToolStripSeparator23 ' Me.ToolStripSeparator23.Name = "ToolStripSeparator23" - Me.ToolStripSeparator23.Size = New System.Drawing.Size(188, 6) + Me.ToolStripSeparator23.Size = New System.Drawing.Size(209, 6) ' 'mnuClimaticSCF ' Me.mnuClimaticSCF.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimaticSCFSupportOpenSST, Me.mnuClimaticSCFSupportExporttoCPT, Me.ToolStripSeparator32, Me.mnuClimaticSCFSupportCorrelations, Me.mnuClimaticSCFSupportPrincipalComponents, Me.mnuClimaticSCFSupportCanonicalCorrelations, Me.mnuClimaticSCFSupportCumulativeExceedanceGraphs}) Me.mnuClimaticSCF.Name = "mnuClimaticSCF" - Me.mnuClimaticSCF.Size = New System.Drawing.Size(191, 22) - Me.mnuClimaticSCF.Text = "SCF Support" + Me.mnuClimaticSCF.Size = New System.Drawing.Size(212, 22) + Me.mnuClimaticSCF.Text = "Seasonal Forecast Support" ' 'mnuClimaticSCFSupportOpenSST ' @@ -1889,7 +1838,7 @@ Partial Class frmMain ' Me.mnuClimateMethods.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuClimateMethodsDataManipulation, Me.mnuClimateMethodsGraphics, Me.mnuClimateMethodsModel, Me.mnuClimateMethodsAdditional, Me.mnuClimateMethodsCreateClimateObject}) Me.mnuClimateMethods.Name = "mnuClimateMethods" - Me.mnuClimateMethods.Size = New System.Drawing.Size(191, 22) + Me.mnuClimateMethods.Size = New System.Drawing.Size(212, 22) Me.mnuClimateMethods.Tag = "Climatic_Methods" Me.mnuClimateMethods.Text = "Climate Methods" Me.mnuClimateMethods.Visible = False @@ -3702,6 +3651,12 @@ Partial Class frmMain Me.ucrOutput.Size = New System.Drawing.Size(295, 113) Me.ucrOutput.TabIndex = 0 ' + 'CummulativeDistributionToolStripMenuItem + ' + Me.CummulativeDistributionToolStripMenuItem.Name = "CummulativeDistributionToolStripMenuItem" + Me.CummulativeDistributionToolStripMenuItem.Size = New System.Drawing.Size(209, 22) + Me.CummulativeDistributionToolStripMenuItem.Text = "Cumulative Distribution..." + ' 'frmMain ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -4052,11 +4007,6 @@ Partial Class frmMain Friend WithEvents mnuDescribeSpecificDotPlot As ToolStripMenuItem Friend WithEvents mnuDescribeSpecificRugPlot As ToolStripMenuItem Friend WithEvents mnuDescribeSpecificBarChart As ToolStripMenuItem - Friend WithEvents mnuDescribeMoreGraphs As ToolStripMenuItem - Friend WithEvents mnuDescribeOtherGraphicsDialogsWindRose As ToolStripMenuItem - Friend WithEvents mnuDescribeOtherGraphicsDialogsCumulativeDistribution As ToolStripMenuItem - Friend WithEvents mnuDescribeOtherGraphicsDialogsInventoryPlot As ToolStripMenuItem - Friend WithEvents mnuDescribeOtherGraphicsDialogsPopulationPyramid As ToolStripMenuItem Friend WithEvents mnuPrepareColumnMakeDate As ToolStripMenuItem Friend WithEvents mnuPrepareColumnMakeTime As ToolStripMenuItem Friend WithEvents mnuPrepareColumnUseTime As ToolStripMenuItem @@ -4097,9 +4047,6 @@ Partial Class frmMain Friend WithEvents mnuClimaticModelsMarkovModelling As ToolStripMenuItem Friend WithEvents mnuClimaticDescribeSunshineRadiation As ToolStripMenuItem Friend WithEvents mnuClimaticDescribeGeneral As ToolStripMenuItem - Friend WithEvents mnuClimaticMoreGraphs As ToolStripMenuItem - Friend WithEvents mnuClimaticDescribeMoreGraphsWindoRose As ToolStripMenuItem - Friend WithEvents mnuClimaticDescribeMoreGraphsCummulaiveDistribution As ToolStripMenuItem Friend WithEvents mnuClimaticSCFSupportExporttoCPT As ToolStripMenuItem Friend WithEvents mnuClimaticSCFSupportOpenSST As ToolStripMenuItem Friend WithEvents ToolStripSeparator17 As ToolStripSeparator @@ -4195,4 +4142,7 @@ Partial Class frmMain Friend WithEvents FrequencyTablesToolStripMenuItem As ToolStripMenuItem Friend WithEvents DispalyClimaticDataToolStripMenuItem As ToolStripMenuItem Friend WithEvents ToolStripSeparator38 As ToolStripSeparator + Friend WithEvents WindroseToolStripMenuItem As ToolStripMenuItem + Friend WithEvents WindrosePlotToolStripMenuItem As ToolStripMenuItem + Friend WithEvents CummulativeDistributionToolStripMenuItem As ToolStripMenuItem End Class diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 3e860e7b5a0..91731fe7d92 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -952,10 +952,6 @@ Public Class frmMain dlgBarAndPieChart.ShowDialog() End Sub - Private Sub mnuDescribeOtherGraphicsDialogsCumulativeDistribution_Click(sender As Object, e As EventArgs) Handles mnuDescribeOtherGraphicsDialogsCumulativeDistribution.Click - dlgCumulativeDistribution.ShowDialog() - End Sub - Private Sub mnuOrganiseColumnMakeDate_Click(sender As Object, e As EventArgs) Handles mnuPrepareColumnMakeDate.Click dlgMakeDate.ShowDialog() End Sub @@ -964,7 +960,7 @@ Public Class frmMain dlgClimdex.ShowDialog() End Sub - Private Sub mnuDescribeOtherGraphicsDialogsWindRose_Click(sender As Object, e As EventArgs) Handles mnuDescribeOtherGraphicsDialogsWindRose.Click + Private Sub mnuDescribeOtherGraphicsDialogsWindRose_Click(sender As Object, e As EventArgs) dlgWindrose.ShowDialog() End Sub @@ -1048,11 +1044,7 @@ Public Class frmMain dlgExportToCPT.ShowDialog() End Sub - Private Sub mnuClimaticDescribeMoreGraphsWindoRose_Click(sender As Object, e As EventArgs) Handles mnuClimaticDescribeMoreGraphsWindoRose.Click - dlgWindrose.ShowDialog() - End Sub - - Private Sub mnuClimaticDescribeMoreGraphsCummulaiveDistribution_Click(sender As Object, e As EventArgs) Handles mnuClimaticDescribeMoreGraphsCummulaiveDistribution.Click + Private Sub mnuClimaticDescribeMoreGraphsCummulaiveDistribution_Click(sender As Object, e As EventArgs) dlgCumulativeDistribution.ShowDialog() End Sub @@ -1349,7 +1341,7 @@ Public Class frmMain dlgStringDistance.ShowDialog() End Sub - Private Sub mnuDescribeOtherGraphicsDialogsInventoryPlot_Click(sender As Object, e As EventArgs) Handles mnuDescribeOtherGraphicsDialogsInventoryPlot.Click + Private Sub mnuDescribeOtherGraphicsDialogsInventoryPlot_Click(sender As Object, e As EventArgs) dlgInventoryPlot.ShowDialog() End Sub @@ -1409,6 +1401,19 @@ Public Class frmMain ucrDataViewer.SetCurrentDataFrame(strDataName) End Sub + Private Sub WindroseToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles WindroseToolStripMenuItem.Click + dlgWindrose.ShowDialog() + End Sub + + Private Sub WindrosePlotToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles WindrosePlotToolStripMenuItem.Click + dlgWindrosePlot.ShowDialog() + End Sub + + Private Sub CummulativeDistributionToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CummulativeDistributionToolStripMenuItem.Click + dlgCumulativeDistribution.ShowDialog() + End Sub + + 'Private Sub TESTToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles TESTToolStripMenuItem.Click ' 'TEST temporary ' 'TESTING TO BE ERASED !!!!!!! From 322e79e98992a2bba185fcb5ccf16d3867d849de Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 16 Jun 2017 13:40:18 +0100 Subject: [PATCH 043/201] update of dialog --- instat/dlgSpells.Designer.vb | 281 +++++++++++++------------- instat/dlgSpells.vb | 372 +++++++++++++++-------------------- 2 files changed, 303 insertions(+), 350 deletions(-) diff --git a/instat/dlgSpells.Designer.vb b/instat/dlgSpells.Designer.vb index 554a9d86f94..9c3a7138382 100644 --- a/instat/dlgSpells.Designer.vb +++ b/instat/dlgSpells.Designer.vb @@ -26,27 +26,25 @@ Partial Class dlgSpells Me.lblDate = New System.Windows.Forms.Label() Me.lblYear = New System.Windows.Forms.Label() Me.lblDOY = New System.Windows.Forms.Label() - Me.ucrReceiverDOY = New instat.ucrReceiverSingle() - Me.ucrReceiverYear = New instat.ucrReceiverSingle() - Me.ucrReceiverDate = New instat.ucrReceiverSingle() - Me.ucrReceiverRainfall = New instat.ucrReceiverSingle() - Me.ucrSelectorForSpells = New instat.ucrSelectorByDataFrameAddRemove() - Me.ucrBase = New instat.ucrButtons() Me.chkConditionRain = New System.Windows.Forms.CheckBox() Me.lblTo = New System.Windows.Forms.Label() Me.lblFrom = New System.Windows.Forms.Label() Me.lblThreshold = New System.Windows.Forms.Label() - Me.nudTo = New System.Windows.Forms.NumericUpDown() - Me.nudFrom = New System.Windows.Forms.NumericUpDown() - Me.ucrInputCondition = New instat.ucrInputComboBox() Me.grpRainParameters = New System.Windows.Forms.GroupBox() - Me.ucrInputSpellLower = New instat.ucrInputTextBox() - Me.ucrInputSpellUpper = New instat.ucrInputTextBox() - Me.ucrSaveSpells = New instat.ucrSave() Me.lblStation = New System.Windows.Forms.Label() Me.ucrReceiverStation = New instat.ucrReceiverSingle() - CType(Me.nudTo, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudFrom, System.ComponentModel.ISupportInitialize).BeginInit() + Me.ucrSaveSpells = New instat.ucrSave() + Me.ucrReceiverDOY = New instat.ucrReceiverSingle() + Me.ucrReceiverYear = New instat.ucrReceiverSingle() + Me.ucrReceiverDate = New instat.ucrReceiverSingle() + Me.ucrNudTo = New instat.ucrNud() + Me.ucrNudFrom = New instat.ucrNud() + Me.ucrInputSpellLower = New instat.ucrInputTextBox() + Me.ucrInputCondition = New instat.ucrInputComboBox() + Me.ucrInputSpellUpper = New instat.ucrInputTextBox() + Me.ucrReceiverRainfall = New instat.ucrReceiverSingle() + Me.ucrSelectorForSpells = New instat.ucrSelectorByDataFrameAddRemove() + Me.ucrBase = New instat.ucrButtons() Me.grpRainParameters.SuspendLayout() Me.SuspendLayout() ' @@ -86,75 +84,10 @@ Partial Class dlgSpells Me.lblDOY.TabIndex = 7 Me.lblDOY.Text = "Day of Year:" ' - 'ucrReceiverDOY - ' - Me.ucrReceiverDOY.frmParent = Me - Me.ucrReceiverDOY.Location = New System.Drawing.Point(246, 211) - Me.ucrReceiverDOY.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverDOY.Name = "ucrReceiverDOY" - Me.ucrReceiverDOY.Selector = Nothing - Me.ucrReceiverDOY.Size = New System.Drawing.Size(143, 20) - Me.ucrReceiverDOY.strNcFilePath = "" - Me.ucrReceiverDOY.TabIndex = 12 - Me.ucrReceiverDOY.ucrSelector = Nothing - ' - 'ucrReceiverYear - ' - Me.ucrReceiverYear.frmParent = Me - Me.ucrReceiverYear.Location = New System.Drawing.Point(246, 169) - Me.ucrReceiverYear.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverYear.Name = "ucrReceiverYear" - Me.ucrReceiverYear.Selector = Nothing - Me.ucrReceiverYear.Size = New System.Drawing.Size(143, 20) - Me.ucrReceiverYear.strNcFilePath = "" - Me.ucrReceiverYear.TabIndex = 6 - Me.ucrReceiverYear.ucrSelector = Nothing - ' - 'ucrReceiverDate - ' - Me.ucrReceiverDate.frmParent = Me - Me.ucrReceiverDate.Location = New System.Drawing.Point(246, 85) - Me.ucrReceiverDate.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverDate.Name = "ucrReceiverDate" - Me.ucrReceiverDate.Selector = Nothing - Me.ucrReceiverDate.Size = New System.Drawing.Size(143, 20) - Me.ucrReceiverDate.strNcFilePath = "" - Me.ucrReceiverDate.TabIndex = 2 - Me.ucrReceiverDate.ucrSelector = Nothing - ' - 'ucrReceiverRainfall - ' - Me.ucrReceiverRainfall.frmParent = Me - Me.ucrReceiverRainfall.Location = New System.Drawing.Point(246, 127) - Me.ucrReceiverRainfall.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverRainfall.Name = "ucrReceiverRainfall" - Me.ucrReceiverRainfall.Selector = Nothing - Me.ucrReceiverRainfall.Size = New System.Drawing.Size(143, 20) - Me.ucrReceiverRainfall.strNcFilePath = "" - Me.ucrReceiverRainfall.TabIndex = 4 - Me.ucrReceiverRainfall.ucrSelector = Nothing - ' - 'ucrSelectorForSpells - ' - Me.ucrSelectorForSpells.bShowHiddenColumns = False - Me.ucrSelectorForSpells.bUseCurrentFilter = True - Me.ucrSelectorForSpells.Location = New System.Drawing.Point(9, 9) - Me.ucrSelectorForSpells.Margin = New System.Windows.Forms.Padding(0) - Me.ucrSelectorForSpells.Name = "ucrSelectorForSpells" - Me.ucrSelectorForSpells.Size = New System.Drawing.Size(210, 180) - Me.ucrSelectorForSpells.TabIndex = 0 - ' - 'ucrBase - ' - Me.ucrBase.Location = New System.Drawing.Point(9, 410) - Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(405, 52) - Me.ucrBase.TabIndex = 11 - ' 'chkConditionRain ' Me.chkConditionRain.AutoSize = True - Me.chkConditionRain.Location = New System.Drawing.Point(9, 364) + Me.chkConditionRain.Location = New System.Drawing.Point(9, 326) Me.chkConditionRain.Name = "chkConditionRain" Me.chkConditionRain.Size = New System.Drawing.Size(193, 17) Me.chkConditionRain.TabIndex = 13 @@ -190,54 +123,110 @@ Partial Class dlgSpells Me.lblThreshold.Tag = "Threshold" Me.lblThreshold.Text = "Condition:" ' - 'nudTo - ' - Me.nudTo.Location = New System.Drawing.Point(237, 14) - Me.nudTo.Maximum = New Decimal(New Integer() {366, 0, 0, 0}) - Me.nudTo.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudTo.Name = "nudTo" - Me.nudTo.Size = New System.Drawing.Size(53, 20) - Me.nudTo.TabIndex = 8 - Me.nudTo.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' - 'nudFrom - ' - Me.nudFrom.Location = New System.Drawing.Point(67, 14) - Me.nudFrom.Maximum = New Decimal(New Integer() {366, 0, 0, 0}) - Me.nudFrom.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudFrom.Name = "nudFrom" - Me.nudFrom.RightToLeft = System.Windows.Forms.RightToLeft.Yes - Me.nudFrom.Size = New System.Drawing.Size(53, 20) - Me.nudFrom.TabIndex = 7 - Me.nudFrom.TextAlign = System.Windows.Forms.HorizontalAlignment.Right - Me.nudFrom.UpDownAlign = System.Windows.Forms.LeftRightAlignment.Left - Me.nudFrom.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' - 'ucrInputCondition - ' - Me.ucrInputCondition.AddQuotesIfUnrecognised = True - Me.ucrInputCondition.IsReadOnly = False - Me.ucrInputCondition.Location = New System.Drawing.Point(134, 44) - Me.ucrInputCondition.Name = "ucrInputCondition" - Me.ucrInputCondition.Size = New System.Drawing.Size(97, 21) - Me.ucrInputCondition.TabIndex = 10 - ' 'grpRainParameters ' + Me.grpRainParameters.Controls.Add(Me.ucrNudTo) + Me.grpRainParameters.Controls.Add(Me.ucrNudFrom) Me.grpRainParameters.Controls.Add(Me.ucrInputSpellLower) Me.grpRainParameters.Controls.Add(Me.ucrInputCondition) Me.grpRainParameters.Controls.Add(Me.ucrInputSpellUpper) - Me.grpRainParameters.Controls.Add(Me.nudFrom) - Me.grpRainParameters.Controls.Add(Me.nudTo) Me.grpRainParameters.Controls.Add(Me.lblThreshold) Me.grpRainParameters.Controls.Add(Me.lblFrom) Me.grpRainParameters.Controls.Add(Me.lblTo) - Me.grpRainParameters.Location = New System.Drawing.Point(9, 284) + Me.grpRainParameters.Location = New System.Drawing.Point(9, 244) Me.grpRainParameters.Name = "grpRainParameters" Me.grpRainParameters.Size = New System.Drawing.Size(380, 74) Me.grpRainParameters.TabIndex = 9 Me.grpRainParameters.TabStop = False ' + 'lblStation + ' + Me.lblStation.AutoSize = True + Me.lblStation.Location = New System.Drawing.Point(247, 30) + Me.lblStation.Name = "lblStation" + Me.lblStation.Size = New System.Drawing.Size(43, 13) + Me.lblStation.TabIndex = 15 + Me.lblStation.Text = "Station:" + ' + 'ucrReceiverStation + ' + Me.ucrReceiverStation.frmParent = Me + Me.ucrReceiverStation.Location = New System.Drawing.Point(246, 45) + Me.ucrReceiverStation.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverStation.Name = "ucrReceiverStation" + Me.ucrReceiverStation.Selector = Nothing + Me.ucrReceiverStation.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverStation.strNcFilePath = "" + Me.ucrReceiverStation.TabIndex = 16 + Me.ucrReceiverStation.ucrSelector = Nothing + ' + 'ucrSaveSpells + ' + Me.ucrSaveSpells.Location = New System.Drawing.Point(9, 349) + Me.ucrSaveSpells.Name = "ucrSaveSpells" + Me.ucrSaveSpells.Size = New System.Drawing.Size(290, 24) + Me.ucrSaveSpells.TabIndex = 14 + ' + 'ucrReceiverDOY + ' + Me.ucrReceiverDOY.frmParent = Me + Me.ucrReceiverDOY.Location = New System.Drawing.Point(246, 211) + Me.ucrReceiverDOY.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverDOY.Name = "ucrReceiverDOY" + Me.ucrReceiverDOY.Selector = Nothing + Me.ucrReceiverDOY.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverDOY.strNcFilePath = "" + Me.ucrReceiverDOY.TabIndex = 12 + Me.ucrReceiverDOY.ucrSelector = Nothing + ' + 'ucrReceiverYear + ' + Me.ucrReceiverYear.frmParent = Me + Me.ucrReceiverYear.Location = New System.Drawing.Point(246, 169) + Me.ucrReceiverYear.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverYear.Name = "ucrReceiverYear" + Me.ucrReceiverYear.Selector = Nothing + Me.ucrReceiverYear.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverYear.strNcFilePath = "" + Me.ucrReceiverYear.TabIndex = 6 + Me.ucrReceiverYear.ucrSelector = Nothing + ' + 'ucrReceiverDate + ' + Me.ucrReceiverDate.frmParent = Me + Me.ucrReceiverDate.Location = New System.Drawing.Point(246, 85) + Me.ucrReceiverDate.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverDate.Name = "ucrReceiverDate" + Me.ucrReceiverDate.Selector = Nothing + Me.ucrReceiverDate.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverDate.strNcFilePath = "" + Me.ucrReceiverDate.TabIndex = 2 + Me.ucrReceiverDate.ucrSelector = Nothing + ' + 'ucrNudTo + ' + Me.ucrNudTo.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTo.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudTo.Location = New System.Drawing.Point(237, 14) + Me.ucrNudTo.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudTo.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTo.Name = "ucrNudTo" + Me.ucrNudTo.Size = New System.Drawing.Size(50, 20) + Me.ucrNudTo.TabIndex = 20 + Me.ucrNudTo.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudFrom + ' + Me.ucrNudFrom.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudFrom.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudFrom.Location = New System.Drawing.Point(63, 14) + Me.ucrNudFrom.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudFrom.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudFrom.Name = "ucrNudFrom" + Me.ucrNudFrom.Size = New System.Drawing.Size(50, 20) + Me.ucrNudFrom.TabIndex = 19 + Me.ucrNudFrom.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'ucrInputSpellLower ' Me.ucrInputSpellLower.AddQuotesIfUnrecognised = True @@ -248,6 +237,15 @@ Partial Class dlgSpells Me.ucrInputSpellLower.Size = New System.Drawing.Size(63, 21) Me.ucrInputSpellLower.TabIndex = 17 ' + 'ucrInputCondition + ' + Me.ucrInputCondition.AddQuotesIfUnrecognised = True + Me.ucrInputCondition.IsReadOnly = False + Me.ucrInputCondition.Location = New System.Drawing.Point(132, 44) + Me.ucrInputCondition.Name = "ucrInputCondition" + Me.ucrInputCondition.Size = New System.Drawing.Size(97, 21) + Me.ucrInputCondition.TabIndex = 10 + ' 'ucrInputSpellUpper ' Me.ucrInputSpellUpper.AddQuotesIfUnrecognised = True @@ -258,39 +256,40 @@ Partial Class dlgSpells Me.ucrInputSpellUpper.Size = New System.Drawing.Size(63, 21) Me.ucrInputSpellUpper.TabIndex = 18 ' - 'ucrSaveSpells + 'ucrReceiverRainfall ' - Me.ucrSaveSpells.Location = New System.Drawing.Point(9, 387) - Me.ucrSaveSpells.Name = "ucrSaveSpells" - Me.ucrSaveSpells.Size = New System.Drawing.Size(290, 24) - Me.ucrSaveSpells.TabIndex = 14 + Me.ucrReceiverRainfall.frmParent = Me + Me.ucrReceiverRainfall.Location = New System.Drawing.Point(246, 127) + Me.ucrReceiverRainfall.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverRainfall.Name = "ucrReceiverRainfall" + Me.ucrReceiverRainfall.Selector = Nothing + Me.ucrReceiverRainfall.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverRainfall.strNcFilePath = "" + Me.ucrReceiverRainfall.TabIndex = 4 + Me.ucrReceiverRainfall.ucrSelector = Nothing ' - 'lblStation + 'ucrSelectorForSpells ' - Me.lblStation.AutoSize = True - Me.lblStation.Location = New System.Drawing.Point(247, 30) - Me.lblStation.Name = "lblStation" - Me.lblStation.Size = New System.Drawing.Size(43, 13) - Me.lblStation.TabIndex = 15 - Me.lblStation.Text = "Station:" + Me.ucrSelectorForSpells.bShowHiddenColumns = False + Me.ucrSelectorForSpells.bUseCurrentFilter = True + Me.ucrSelectorForSpells.Location = New System.Drawing.Point(9, 9) + Me.ucrSelectorForSpells.Margin = New System.Windows.Forms.Padding(0) + Me.ucrSelectorForSpells.Name = "ucrSelectorForSpells" + Me.ucrSelectorForSpells.Size = New System.Drawing.Size(210, 180) + Me.ucrSelectorForSpells.TabIndex = 0 ' - 'ucrReceiverStation + 'ucrBase ' - Me.ucrReceiverStation.frmParent = Me - Me.ucrReceiverStation.Location = New System.Drawing.Point(246, 45) - Me.ucrReceiverStation.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverStation.Name = "ucrReceiverStation" - Me.ucrReceiverStation.Selector = Nothing - Me.ucrReceiverStation.Size = New System.Drawing.Size(143, 20) - Me.ucrReceiverStation.strNcFilePath = "" - Me.ucrReceiverStation.TabIndex = 16 - Me.ucrReceiverStation.ucrSelector = Nothing + Me.ucrBase.Location = New System.Drawing.Point(9, 372) + Me.ucrBase.Name = "ucrBase" + Me.ucrBase.Size = New System.Drawing.Size(405, 52) + Me.ucrBase.TabIndex = 11 ' 'dlgSpells ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(462, 473) + Me.ClientSize = New System.Drawing.Size(414, 431) Me.Controls.Add(Me.lblStation) Me.Controls.Add(Me.ucrReceiverStation) Me.Controls.Add(Me.ucrSaveSpells) @@ -313,8 +312,6 @@ Partial Class dlgSpells Me.ShowIcon = False Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Text = "Spells" - CType(Me.nudTo, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudFrom, System.ComponentModel.ISupportInitialize).EndInit() Me.grpRainParameters.ResumeLayout(False) Me.grpRainParameters.PerformLayout() Me.ResumeLayout(False) @@ -335,8 +332,6 @@ Partial Class dlgSpells Friend WithEvents chkConditionRain As CheckBox Friend WithEvents grpRainParameters As GroupBox Friend WithEvents ucrInputCondition As ucrInputComboBox - Friend WithEvents nudFrom As NumericUpDown - Friend WithEvents nudTo As NumericUpDown Friend WithEvents lblThreshold As Label Friend WithEvents lblFrom As Label Friend WithEvents lblTo As Label @@ -345,4 +340,6 @@ Partial Class dlgSpells Friend WithEvents ucrReceiverStation As ucrReceiverSingle Friend WithEvents ucrInputSpellLower As ucrInputTextBox Friend WithEvents ucrInputSpellUpper As ucrInputTextBox + Friend WithEvents ucrNudTo As ucrNud + Friend WithEvents ucrNudFrom As ucrNud End Class diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 751052aae06..ddd8886d762 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -18,8 +18,10 @@ Imports instat.Translations Public Class dlgSpells Private bFirstload As Boolean = True Private bReset As Boolean = True - Private clsRTransform, clsRRollFuncExpr, clsMatchFun, clsTransformManipulationsFunc, clsTransformGroupByFunc, clsWaterBalance60, clsSubCalcList As New RFunction - Private clsRollFunction, clsRRainday As New RFunction + Private clsAddKey, clsSpellLength, clsMaxValueManipulation, clsSubSpellLength1 As New RFunction + Private clsMaxValue, clsMaxValueList As New RFunction + Private clsDayFromAndTo, clsYearGroupDaily As New RFunction + Private clsApplyInstatFunction, clsRRainday As New RFunction Private strCurrDataName As String = "" Private strValuesUnder As String = ">=" @@ -32,6 +34,7 @@ Public Class dlgSpells ' Else ' ReopenDialog() End If + SetRCodeForControls(bReset) TestOKEnabled() End Sub @@ -39,12 +42,17 @@ Public Class dlgSpells ucrBase.iHelpTopicID = 200 Dim dctInputSumPairs As New Dictionary(Of String, String) + ucrSelectorForSpells.SetParameter(New RParameter("data_name", 0)) + ucrSelectorForSpells.SetParameterIsString() + ' Setting receivers ucrReceiverRainfall.SetParameter(New RParameter("data", 0)) ucrReceiverRainfall.SetParameterIsString() ucrReceiverRainfall.bWithQuotes = False ucrReceiverRainfall.SetParameterIncludeArgumentName(False) ucrReceiverRainfall.Selector = ucrSelectorForSpells + ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) + ucrReceiverRainfall.bAutoFill = True ucrReceiverStation.Selector = ucrSelectorForSpells ucrReceiverStation.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "station" & Chr(34)}) @@ -54,6 +62,8 @@ Public Class dlgSpells ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) ucrReceiverYear.bAutoFill = True + ucrReceiverDate.SetParameter(New RParameter("col_name", 0)) + ucrReceiverDate.SetParameterIsString() ucrReceiverDate.Selector = ucrSelectorForSpells ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) ucrReceiverDate.bAutoFill = True @@ -65,143 +75,101 @@ Public Class dlgSpells 'clsRTransform.SetRCommand("instat_calculation$new") 'clsRTransform.SetAssignTo("transform_calculation") - clsSubCalcList.SetRCommand("list") - End Sub + clsSubSpellLength1.SetRCommand("list") + clsMaxValueList.SetRCommand("list") + 'ucrInputCondition.SetParameter(New RParameter("")) + 'Dim dctCondition As New Dictionary(Of String, String) + 'dctCondition.Add("Between", "between") + 'dctCondition.Add("Less than", Chr(34) & "<" & Chr(34)) + 'dctCondition.Add("Greater than", Chr(34) & ">" & Chr(34)) + 'ucrInputCondition.SetItems(dctCondition) + + ucrInputCondition.SetItems({"<= Amount of Rain", "Between", ">= Amount of Rain"}) + + ucrSaveSpells.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) + ucrSaveSpells.SetLabelText("New Column Name:") + ucrSaveSpells.SetIsTextBox() + ucrSaveSpells.SetPrefix("Spells") + ucrSaveSpells.SetSaveTypeAsColumn() + End Sub - ' Private Sub InitialiseDialog() - ' ucrBase.iHelpTopicID = 200 - ' clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") - ' clsDayFromAndTo.SetRCommand("instat_calculation$new") - ' clsDayFromAndTo.SetAssignTo("Day_From_and_To") - ' clsYearGroupDaily.SetRCommand("instat_calculation$new") - ' clsYearGroupDaily.SetAssignTo("Year_Group_Daily") - ' clsRainyDays.SetRCommand("instat_calculation$new") - ' clsMaxValue.SetRCommand("instat_calculation$new") - ' clsMaxValue.SetAssignTo("Max_Rain_Per_Year") - ' clsSpellLength.SetRCommand("instat_calculation$new") - ' clsSpellLength.SetAssignTo("Dry_Spell") - ' ucrBase.clsRsyntax.SetFunction(frmMain.clsRLink.strInstatDataObject & "$apply_instat_calculation") - ' clsSubSpellLength1.SetRCommand("list") ' clsSubSpellLength2.SetRCommand("list") - ' clsMaxValueManipulation.SetRCommand("list") ' clsAdditionalCondition.SetRCommand("instat_calculation$new") ' clsAdditionalCondition.SetAssignTo("Additional_Condition") - ' clsMaxValueList.SetRCommand("list") - ' ucrReceiverRainfall.Selector = ucrSelectorForSpells - ' ucrReceiverYear.Selector = ucrSelectorForSpells - ' ucrReceiverDate.Selector = ucrSelectorForSpells - ' ucrReceiverDayOfYear.Selector = ucrSelectorForSpells - ' ucrReceiverDate.SetMeAsReceiver() - - ' ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) - ' ucrReceiverDayOfYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "doy" & Chr(34)}) - ' ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) - ' ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) - ' ucrReceiverDate.bAutoFill = True - ' ucrReceiverDayOfYear.bAutoFill = True - ' ucrReceiverRainfall.bAutoFill = True - ' ucrReceiverYear.bAutoFill = True - - ' nudConditionLeft.DecimalPlaces = 2 - ' NudConditionRight.DecimalPlaces = 2 - - ' 'Dim dctCondition As New Dictionary(Of String, String) - ' 'dctCondition.Add("Between", "between") - ' 'dctCondition.Add("Less than", Chr(34) & "<" & Chr(34)) - ' 'dctCondition.Add("Greater than", Chr(34) & ">" & Chr(34)) - ' 'ucrInputCondition.SetItems(dctCondition) - - ' ucrInputCondition.SetItems({"<= Amount of Rain", "Between", ">= Amount of Rain"}) - ' nudFrom.Minimum = 1 - ' nudFrom.Maximum = 366 - ' nudTo.Minimum = 1 - ' nudTo.Maximum = 366 - - ' 'save - ' ucrSaveSpells.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) - ' ucrSaveSpells.SetLabelText("New Column Name:") - ' ucrSaveSpells.SetIsTextBox() - ' ucrSaveSpells.SetPrefix("Spells") - ' ucrSaveSpells.SetSaveTypeAsColumn() - ' End Sub - Private Sub SetDefaults() - clsRRollFuncExpr = New RFunction - clsRTransform = New RFunction - clsMatchFun = New RFunction - clsRollFunction = New RFunction - clsTransformManipulationsFunc = New RFunction - clsTransformGroupByFunc = New RFunction + clsApplyInstatFunction = New RFunction + clsMaxValueManipulation = New RFunction + clsDayFromAndTo = New RFunction + clsYearGroupDaily = New RFunction + clsRRainday = New RFunction + clsSpellLength = New RFunction + clsMaxValue = New RFunction ucrSelectorForSpells.Reset() ucrReceiverDate.SetMeAsReceiver() - ' RDO1 - clsTransformGroupByFunc.SetRCommand("instat_calculation$new") - clsTransformGroupByFunc.AddParameter("type", Chr(34) & "by" & Chr(34), iPosition:=2) - clsTransformGroupByFunc.SetAssignTo("grouping") - - ' RDO2 - clsMatchFun.SetRCommand("match.fun") - clsMatchFun.AddParameter("FUN", Chr(39) & "sum" & Chr(39), iPosition:=0) - - clsRRollFuncExpr.SetPackageName("zoo") - clsRRollFuncExpr.SetRCommand("rollapply") - clsRRollFuncExpr.AddParameter("data", ucrReceiverRainfall.GetVariableNames(bWithQuotes:=False), iPosition:=0) - clsRRollFuncExpr.AddParameter("fill", "NA", iPosition:=3) - clsRRollFuncExpr.AddParameter("width", 1, iPosition:=2) - clsRRollFuncExpr.AddParameter("FUN", clsRFunctionParameter:=clsMatchFun, iPosition:=1) - clsRRollFuncExpr.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) - - clsWaterBalance60.SetRCommand("instat_calculation$new") - clsWaterBalance60.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=1) - clsWaterBalance60.AddParameter("result_name", Chr(34) & "Water_Balance_60" & Chr(34), iPosition:=3) - clsWaterBalance60.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubCalcList, iPosition:=5) - clsWaterBalance60.AddParameter("save", "2", iPosition:=4) - clsWaterBalance60.SetAssignTo("Water_Balance_60") - - ' RDO4 + ' key + clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") + + 'DayFromandTo + clsDayFromAndTo.SetRCommand("instat_calculation$new") + clsDayFromAndTo.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & ">=" & ucrNudFrom.Value & " & " & ucrReceiverDOY.GetVariableNames(False) & "<=" & ucrNudTo.Value & Chr(34)) + clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34)) + + ' Year group + clsYearGroupDaily.SetRCommand("instat_calculation$new") + clsYearGroupDaily.AddParameter("type", Chr(34) & "by" & Chr(34)) + + ' rain_day option clsRRainday.SetRCommand("instat_calculation$new") clsRRainday.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=1) - clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrReceiverRainfall.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0,1)" & Chr(34), iPosition:=2) clsRRainday.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=3) clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) clsRRainday.AddParameter("save", "0", iPosition:=4) - clsRRainday.SetAssignTo("rain_day") - ' Base - clsTransformManipulationsFunc.SetRCommand("list") - clsTransformManipulationsFunc.AddParameter("group_by", clsRFunctionParameter:=clsTransformGroupByFunc, bIncludeArgumentName:=False, iPosition:=0) + ' Spell Length + clsSpellLength.SetRCommand("instat_calculation$new") + clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + clsSpellLength.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) + clsSpellLength.AddParameter("save", 0) + clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34)) - clsRTransform.SetRCommand("instat_calculation$new") - clsRTransform.SetAssignTo("transform_calculation") - clsRTransform.AddParameter("function_exp", Chr(34) & clsRRollFuncExpr.ToScript.ToString & Chr(34), iPosition:=2) - clsRTransform.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=1) - clsRTransform.AddParameter("result_name", Chr(34) & "moving_sum" & Chr(34), iPosition:=3) - clsRTransform.AddParameter("manipulations", clsRFunctionParameter:=clsTransformManipulationsFunc, iPosition:=4) - clsRTransform.AddParameter("save", 2, iPosition:=4) - - clsRollFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") - clsRollFunction.AddParameter("display", "FALSE", iPosition:=1) - clsRollFunction.AddParameter("calc", clsRFunctionParameter:=clsRTransform, iPosition:=0) + ' Base + clsMaxValueManipulation.SetRCommand("list") + clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) + clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + + 'Max Value + clsMaxValue.SetRCommand("instat_calculation$new") + clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=1) + clsMaxValue.AddParameter("function_exp", Chr(34) & "max(Dry_Spell)" & Chr(34), iPosition:=2) + clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34), iPosition:=3) + clsMaxValue.AddParameter("save", 2, iPosition:=4) + clsMaxValue.SetAssignTo(ucrSaveSpells.ucrInputTextSave.GetText) + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=4) + + clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") + clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) + clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=0) 'Base Function - ucrBase.clsRsyntax.SetBaseRFunction(clsRollFunction) + ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) End Sub Private Sub SetRCodeForControls(bReset As Boolean) - + ucrReceiverDate.SetRCode(clsAddKey, bReset) + ucrSelectorForSpells.SetRCode(clsAddKey, bReset) End Sub Private Sub TestOKEnabled() - If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso nudFrom.Text <> "" AndAlso nudTo.Text <> "" AndAlso ucrInputSpellUpper.Text <> "" Then ' and ucrInput is empty - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If + 'If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso nudFrom.Text <> "" AndAlso nudTo.Text <> "" AndAlso ucrInputSpellUpper.Text <> "" Then ' and ucrInput is empty + ucrBase.OKEnabled(True) + 'Else + ' ucrBase.OKEnabled(False) + 'End If End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -211,19 +179,15 @@ Public Class dlgSpells End Sub Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk - clsRTransform.SetAssignTo("transform_calculation") - clsWaterBalance60.SetAssignTo("water_balance_60") - clsRRainday.SetAssignTo("rain_day") + frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining Date column as key") + clsMaxValue.SetAssignTo("Spells_Rain") + clsSpellLength.SetAssignTo("Dry_Spell") + clsDayFromAndTo.SetAssignTo("Day_From_and_To") + clsYearGroupDaily.SetAssignTo("grouping") + SubCalcForDrySpell() SetGroupByFuncCalcFrom() - clsRTransform.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34), iPosition:=2) - clsRollFunction.AddParameter("calc", clsRFunctionParameter:=clsRTransform, iPosition:=1) - ucrBase.clsRsyntax.SetBaseRFunction(clsRollFunction) - End Sub - - Private Sub SumOver() - If Not ucrReceiverRainfall.IsEmpty Then - clsRTransform.AddParameter("function_exp", Chr(34) & clsRRollFuncExpr.ToScript.ToString & Chr(34), iPosition:=2) - End If + clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=1) + ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) End Sub 'Private Sub ucrPnlTransform_ControlContentsChanged(ucrChangedControl As ucrCore) Handles @@ -238,7 +202,6 @@ Public Class dlgSpells strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrReceiverRainfall.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0, 1)" & Chr(34), iPosition:=2) clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) - clsRTransform.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) End Sub Private Sub SetGroupByFuncCalcFrom() @@ -246,19 +209,20 @@ Public Class dlgSpells Dim strGroupByCalcFrom As String = "" strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) If Not ucrReceiverStation.IsEmpty Then - clsTransformGroupByFunc.SetAssignTo("grouping") - clsRTransform.AddParameter("manipulations", clsRFunctionParameter:=clsTransformManipulationsFunc, iPosition:=4) + clsYearGroupDaily.SetAssignTo("grouping") + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=4) - strGroupByCalcFrom = "list(" & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames() & ")" + ' strGroupByCalcFrom = "list(" & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames() & ")" Else - clsRTransform.RemoveParameterByName("manipulations") + clsMaxValue.RemoveParameterByName("manipulations") End If - If strGroupByCalcFrom <> "" Then - clsTransformGroupByFunc.AddParameter("calculated_from", strGroupByCalcFrom, iPosition:=0) - Else - clsTransformGroupByFunc.RemoveParameterByName("calculated_from") - End If + ' If strGroupByCalcFrom <> "" Then + ' clsYearGroupDaily.AddParameter("calculated_from", strGroupByCalcFrom, iPosition:=0) + ' Else + ' clsYearGroupDaily.RemoveParameterByName("calculated_from") + ' End If + MaxValue() End Sub Private Sub ucrReceiverStation_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverStation.ControlValueChanged @@ -266,38 +230,65 @@ Public Class dlgSpells End Sub Private Sub ucrControls_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged - SumOver() TestOKEnabled() End Sub Private Sub ucrSpellBetween_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrInputSpellUpper.ControlContentsChanged, ucrInputSpellLower.ControlContentsChanged - clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrReceiverRainfall.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0, 1)" & Chr(34), iPosition:=2) - clsSubCalcList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, iPosition:=0) - clsRTransform.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubCalcList, iPosition:=7) - clsRTransform.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34), iPosition:=2) + clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False, iPosition:=0) + clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=7) TestOKEnabled() + RainyDaysMethod() End Sub - Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged - TestOKEnabled() + Private Sub ucrSelectorForStartofRains_DataFrameChanged() + + End Sub + + Private Sub MaxValue() + clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) + clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False) + + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation) + clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList) End Sub -End Class + Private Sub SubCalcForDrySpell() + clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) + clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) + End Sub -'Public Class dlgSpells -' Private clsAddKey, clsDayFromAndTo, clsAdditionalCondition, clsRainyDays, clsMaxValue, clsYearGroupDaily, clsMaxValueManipulation As New RFunction -' Private clsMaxValueList, clsSpellLength, clsSubSpellLength1, clsSubSpellLength2, clsAdditionalConditionList As New RFunction -' Private strCurrDataName As String = "" -' Private bFirstLoad As Boolean = True + Private Sub RainyDaysMethod() + Select Case ucrInputCondition.GetText + Case "<= Amount of Rain" + clsRRainday.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrInputSpellLower.GetText & "," & "1, nomatch = 0" & ")" & Chr(34)) + Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) + clsRRainday.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrInputSpellLower.GetText & "&" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & ucrInputSpellUpper.GetText & "," & "1, nomatch = 0" & ")" & Chr(34)) + Case Else + clsRRainday.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & ucrInputSpellLower.GetText & "," & "1, nomatch = 0" & ")" & Chr(34)) + End Select + End Sub + Private Sub Ifthenudschange() ' and if the receiver changes + clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + clsDayFromAndTo.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & ">=" & ucrNudFrom.Value & " & " & ucrReceiverDOY.GetVariableNames(False) & "<=" & ucrNudTo.Value & Chr(34)) + End Sub -' Private Sub ucrSelectorForStartofRains_DataFrameChanged() Handles ucrSelectorForSpells.DataFrameChanged -' strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) -' clsAddKey.AddParameter("data_name", strCurrDataName) -' firstDayofTheYear() -' End Sub + Private Sub ucrReceiverYear_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverYear.SelectionChanged + clsYearGroupDaily.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + End Sub + Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged + TestOKEnabled() + End Sub + Private Sub nudTo_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlValueChanged, ucrNudFrom.ControlValueChanged + Ifthenudschange() + End Sub +End Class + +'TODO: Make by Year and Station +'TODO: Add functionality for chkbox ' Private Sub SetDefaults() ' ucrSelectorForSpells.Reset() @@ -309,8 +300,6 @@ End Class ' nudFrom.Value = 1 ' nudTo.Value = 366 ' nudConditionLeft.Value = 0 -' nudConditionLeft.Maximum = Integer.MaxValue -' NudConditionRight.Maximum = Integer.MaxValue ' NudConditionRight.Value = 0.85 ' ucrInputCondition.SetName("Between") ' End Sub @@ -343,26 +332,12 @@ End Class ' End Sub ' Private Sub DayFromAndToMethod() -' clsDayFromAndTo.AddParameter("function_exp", Chr(34) & ucrReceiverDayOfYear.GetVariableNames(False) & ">=" & nudFrom.Value & " & " & ucrReceiverDayOfYear.GetVariableNames(False) & "<=" & nudTo.Value & Chr(34)) -' clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDayOfYear.GetVariableNames() & ")") -' clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34)) + ' End Sub -' Private Sub RainyDaysMethod() -' clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) -' Select Case ucrInputCondition.GetText -' Case "<= Amount of Rain" -' clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudConditionLeft.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) -' Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) -' clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudConditionLeft.Value & "&" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & NudConditionRight.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) -' Case Else -' clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & nudConditionLeft.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) -' End Select -' clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34)) -' clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")") -' clsRainyDays.AddParameter("save", 0) +' Private Sub RainyDaysMethod() ' If chkConditionRain.Checked Then ' clsSpellLength.RemoveParameterByName("function_exp") ' clsSpellLength.RemoveParameterByName("sub_calculations") @@ -373,7 +348,7 @@ End Class ' clsAdditionalCondition.AddParameter("result_name", Chr(34) & "rain_day2" & Chr(34)) ' clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) ' clsAdditionalConditionList.SetRCommand("list") -' clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays) +' clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) ' clsAdditionalCondition.AddParameter("save", 0) ' clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day2)-cummax((rain_day2==0)*cumsum(rain_day2))" & Chr(34)) @@ -392,11 +367,8 @@ End Class ' clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34)) ' clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) -' clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) +' clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) ' End If -' clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34)) -' clsSpellLength.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) -' clsSpellLength.AddParameter("save", 0) ' End Sub ' Private Sub ucrInputCondition_NameChanged() Handles ucrInputCondition.NameChanged @@ -404,27 +376,25 @@ End Class ' RainyDaysMethod() ' End Sub -' Private Sub MaxValue() -' clsMaxValueManipulation.SetRCommand("list") -' clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) -' clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - -' clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34)) -' clsMaxValue.AddParameter("function_exp", Chr(34) & "max(Dry_Spell)" & Chr(34)) -' clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation) -' clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList) -' clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False) -' clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34)) -' clsMaxValue.AddParameter("save", 2) -' End Sub +'''''''''''''Private Sub MaxValue() +''''''''''''' clsMaxValueManipulation.SetRCommand("list") +''''''''''''' clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) +''''''''''''' clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) -' Private Sub firstDayofTheYear() -' ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsMaxValue) -' End Sub +''''''''''''' clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34)) +''''''''''''' clsMaxValue.AddParameter("function_exp", Chr(34) & "max(Dry_Spell)" & Chr(34)) +''''''''''''' clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation) +''''''''''''' clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList) +''''''''''''' clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False) +''''''''''''' clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34)) +''''''''''''' clsMaxValue.AddParameter("save", 2) +'''''''''''''End Sub -' Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk -' frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining Date column as key") +''''''''''''' Private Sub firstDayofTheYear() +''''''''''''' ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsMaxValue) +''''''''''''' End Sub +' Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk ' DayFromAndToMethod() ' RainyDaysMethod() ' MaxValue() @@ -449,20 +419,6 @@ End Class ' TestOKEnabled() ' End Sub -' Private Sub ucrReceiverYear_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverYear.SelectionChanged -' clsYearGroupDaily.AddParameter("type", Chr(34) & "by" & Chr(34)) -' clsYearGroupDaily.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") -' TestOKEnabled() -' End Sub - -' Private Sub ucrReceiverDate_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDate.SelectionChanged -' If Not ucrReceiverDate.IsEmpty Then -' clsAddKey.AddParameter("col_name", ucrReceiverDate.GetVariableNames) -' Else -' clsAddKey.RemoveParameterByName("col_name") -' End If -' TestOKEnabled() -' End Sub ' Private Sub ConditionalRainNuds_valuechanged(sender As Object, e As EventArgs) Handles NudConditionRight.TextChanged, nudConditionLeft.TextChanged ' RainyDaysMethod() @@ -478,7 +434,7 @@ End Class ' End Sub ' Private Sub ucrSaveSpells_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveSpells.ControlValueChanged -' clsMaxValue.SetAssignTo(ucrSaveSpells.ucrInputTextSave.GetText) +''''''''''''' clsMaxValue.SetAssignTo(ucrSaveSpells.ucrInputTextSave.GetText) ' MaxValue() ' End Sub 'End Class \ No newline at end of file From 2622a01e53cffcdcdd5019dc0570f0474f07b2e7 Mon Sep 17 00:00:00 2001 From: John Lunalo Date: Fri, 16 Jun 2017 17:30:30 +0300 Subject: [PATCH 044/201] more changes on regression simple --- instat/dlgRegressionSimple.Designer.vb | 94 ++++++++++ instat/dlgRegressionSimple.vb | 160 ++++++++++-------- instat/sdgVariableTransformations.Designer.vb | 79 +++++---- instat/sdgVariableTransformations.vb | 50 +++--- 4 files changed, 250 insertions(+), 133 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 047d78f473c..a8ea4a21ec3 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -55,6 +55,16 @@ Partial Class dlgRegressionSimple Me.ucrPnlModelType = New instat.UcrPanel() Me.ucrChkConvertToVariate = New instat.ucrCheck() Me.ucrSaveModels = New instat.ucrSave() + Me.ucrChkFunction = New instat.ucrCheck() + Me.ucrpnlKruskalWilcoxonTest = New instat.UcrPanel() + Me.rdoWilcoxonTest = New System.Windows.Forms.RadioButton() + Me.rdoKruskalTest = New System.Windows.Forms.RadioButton() + Me.lblLevel1 = New System.Windows.Forms.Label() + Me.Label1 = New System.Windows.Forms.Label() + Me.ucrInputLevel1 = New instat.ucrInputComboBox() + Me.ucrInputLevel2 = New instat.ucrInputComboBox() + Me.lblSuccess = New System.Windows.Forms.Label() + Me.ucrNudSuccess = New instat.ucrNud() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -128,6 +138,15 @@ Partial Class dlgRegressionSimple ' 'grpParameters ' + Me.grpParameters.Controls.Add(Me.ucrNudSuccess) + Me.grpParameters.Controls.Add(Me.lblSuccess) + Me.grpParameters.Controls.Add(Me.ucrInputLevel2) + Me.grpParameters.Controls.Add(Me.ucrInputLevel1) + Me.grpParameters.Controls.Add(Me.Label1) + Me.grpParameters.Controls.Add(Me.lblLevel1) + Me.grpParameters.Controls.Add(Me.rdoKruskalTest) + Me.grpParameters.Controls.Add(Me.rdoWilcoxonTest) + Me.grpParameters.Controls.Add(Me.ucrpnlKruskalWilcoxonTest) Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) Me.grpParameters.Controls.Add(Me.ucrNudCI) @@ -275,10 +294,75 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") Me.ucrSaveModels.Name = "ucrSaveModels" ' + 'ucrChkFunction + ' + Me.ucrChkFunction.Checked = False + resources.ApplyResources(Me.ucrChkFunction, "ucrChkFunction") + Me.ucrChkFunction.Name = "ucrChkFunction" + ' + 'ucrpnlKruskalWilcoxonTest + ' + resources.ApplyResources(Me.ucrpnlKruskalWilcoxonTest, "ucrpnlKruskalWilcoxonTest") + Me.ucrpnlKruskalWilcoxonTest.Name = "ucrpnlKruskalWilcoxonTest" + ' + 'rdoWilcoxonTest + ' + resources.ApplyResources(Me.rdoWilcoxonTest, "rdoWilcoxonTest") + Me.rdoWilcoxonTest.Name = "rdoWilcoxonTest" + Me.rdoWilcoxonTest.TabStop = True + Me.rdoWilcoxonTest.UseVisualStyleBackColor = True + ' + 'rdoKruskalTest + ' + resources.ApplyResources(Me.rdoKruskalTest, "rdoKruskalTest") + Me.rdoKruskalTest.Name = "rdoKruskalTest" + Me.rdoKruskalTest.TabStop = True + Me.rdoKruskalTest.UseVisualStyleBackColor = True + ' + 'lblLevel1 + ' + resources.ApplyResources(Me.lblLevel1, "lblLevel1") + Me.lblLevel1.Name = "lblLevel1" + ' + 'Label1 + ' + resources.ApplyResources(Me.Label1, "Label1") + Me.Label1.Name = "Label1" + ' + 'ucrInputLevel1 + ' + Me.ucrInputLevel1.AddQuotesIfUnrecognised = True + Me.ucrInputLevel1.IsReadOnly = False + resources.ApplyResources(Me.ucrInputLevel1, "ucrInputLevel1") + Me.ucrInputLevel1.Name = "ucrInputLevel1" + ' + 'ucrInputLevel2 + ' + Me.ucrInputLevel2.AddQuotesIfUnrecognised = True + Me.ucrInputLevel2.IsReadOnly = False + resources.ApplyResources(Me.ucrInputLevel2, "ucrInputLevel2") + Me.ucrInputLevel2.Name = "ucrInputLevel2" + ' + 'lblSuccess + ' + resources.ApplyResources(Me.lblSuccess, "lblSuccess") + Me.lblSuccess.Name = "lblSuccess" + ' + 'ucrNudSuccess + ' + Me.ucrNudSuccess.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSuccess.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + resources.ApplyResources(Me.ucrNudSuccess, "ucrNudSuccess") + Me.ucrNudSuccess.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudSuccess.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSuccess.Name = "ucrNudSuccess" + Me.ucrNudSuccess.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.Controls.Add(Me.ucrChkFunction) Me.Controls.Add(Me.ucrSaveModels) Me.Controls.Add(Me.ucrChkConvertToVariate) Me.Controls.Add(Me.rdoGeneralCase) @@ -345,4 +429,14 @@ Partial Class dlgRegressionSimple Friend WithEvents ucrSaveModels As ucrSave Friend WithEvents ucrNudCI As ucrNud Friend WithEvents ucrNudHypothesis As ucrNud + Friend WithEvents ucrChkFunction As ucrCheck + Friend WithEvents rdoKruskalTest As RadioButton + Friend WithEvents rdoWilcoxonTest As RadioButton + Friend WithEvents ucrpnlKruskalWilcoxonTest As UcrPanel + Friend WithEvents ucrNudSuccess As ucrNud + Friend WithEvents lblSuccess As Label + Friend WithEvents ucrInputLevel2 As ucrInputComboBox + Friend WithEvents ucrInputLevel1 As ucrInputComboBox + Friend WithEvents Label1 As Label + Friend WithEvents lblLevel1 As Label End Class \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 84e8feaaceb..6cf7ae6fecd 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -14,15 +14,17 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True Public clsModel, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator Public clsRPoisson, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest As New RFunction - Public clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric As New RFunction - Public clsRLength, clsRLength2, clsRLengthGrouped, clsRLengthGrouped2, clsRLength3, clsRLengthGrouped3, clsRLength4, clsRLengthGrouped4, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLength5, clsRLengthGrouped5, clsRLength6, clsRLengthGrouped6, clsRLmOrGLM As New RFunction + Public clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM As New RFunction + Public clsRLength, clsRLength2, clsRLengthGrouped, clsRLengthGrouped2, clsRLength3, clsRLengthGrouped3, clsRLength4, clsRLengthGrouped4, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLength5, clsRLengthGrouped5, clsRLength6, clsRLengthGrouped6, clsRLmOrGLM, clsRYVariable, clsRXVariable As New RFunction Private clsFormulaOperator As New ROperator Private bReset As Boolean = True + Private bResetSubDialog As Boolean = False Private Sub dlgRegressionSimple_Load(sender As Object, e As EventArgs) Handles Me.Load autoTranslate(Me) If bFirstLoad Then @@ -38,7 +40,9 @@ Public Class dlgRegressionSimple End Sub Private Sub SetRCodeForControls(bReset) - + ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) + ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) + ucrResponse.AddAdditionalCodeParameterPair(clsRConvert, New RParameter("x", 1)) End Sub Private Sub InitialiseDialog() @@ -68,11 +72,13 @@ Public Class dlgRegressionSimple ucrPnlModelType.AddToLinkedControls(ucrNudCI, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=0.95) ucrNudCI.SetLinkedDisplayControl(lblConfidenceInterval) ucrNudCI.SetLinkedDisplayControl(grpParameters) + ucrNudCI.DecimalPlaces = 2 + ucrPnlModelType.AddToLinkedControls(ucrNudHypothesis, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=0) ucrNudHypothesis.SetLinkedDisplayControl(lblDifferenceInMeans) ucrNudHypothesis.SetLinkedDisplayControl(grpParameters) - + ucrNudHypothesis.DecimalPlaces = 2 ucrPnlModelType.AddToLinkedControls(ucrPnlMeansAndVariance, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=rdoCompareMeans) ucrPnlMeansAndVariance.SetLinkedDisplayControl(grpParameters) @@ -90,20 +96,20 @@ Public Class dlgRegressionSimple ucrSelectorSimpleReg.SetParameter(New RParameter("data", 0)) ucrSelectorSimpleReg.SetParameterIsrfunction() + ucrPnlModelType.AddToLinkedControls(ucrChkFunction, {rdoCompareMeans}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=True) + ucrChkFunction.SetText("Function") + + ucrNudCI.SetParameter(New RParameter("conf.level")) + ucrNudHypothesis.SetParameter(New RParameter("r")) + + ucrPnlMeansAndVariance.AddToLinkedControls(ucrNudHypothesis, {rdoCompareVariance}, bNewLinkedDisabledIfParameterMissing:=True) sdgSimpleRegOptions.SetRModelFunction(clsRLmOrGLM) sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) sdgSimpleRegOptions.SetRYVariable(ucrResponse) sdgSimpleRegOptions.SetRXVariable(ucrExplanatory) - sdgVariableTransformations.SetRYVariable(ucrResponse) - sdgVariableTransformations.SetRXVariable(ucrExplanatory) - sdgVariableTransformations.SetRModelOperator(clsModel) sdgModelOptions.SetRCIFunction(clsRCIFunction) - sdgVariableTransformations.SetRCIFunction(clsRCIFunction) - - - End Sub @@ -111,6 +117,11 @@ Public Class dlgRegressionSimple Private Sub SetDefaults() clsFormulaOperator = New ROperator clsRLmOrGLM = New RFunction + clsGLM = New RFunction + clsRConvert = New RFunction + clsRCIFunction = New RFunction + clsRTTest = New RFunction + ucrSelectorSimpleReg.Reset() ucrResponse.SetMeAsReceiver() ucrSelectorSimpleReg.Focus() @@ -121,17 +132,27 @@ Public Class dlgRegressionSimple clsFormulaOperator.AddParameter("y", 1, iPosition:=0) clsFormulaOperator.AddParameter("x", 1, iPosition:=1) + clsRConvert.SetRCommand("as.numeric") + + clsRCIFunction.SetRCommand(ucrFamily.clsCurrDistribution.strGLMFunctionName) + clsGLM.AddParameter("family", clsRFunctionParameter:=clsRCIFunction) + clsRLmOrGLM.SetRCommand("lm") clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator) + clsRTTest.SetPackageName("mosaic") + clsRTTest.SetRCommand("t.test") + + clsGLM.SetRCommand("glm") + clsGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator) + + + clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=ucrSaveModels.GetText, bAssignToIsPrefix:=True) - AssignModelName() - 'nudCI.Increment = 0.05 - 'nudCI.Minimum = 0 - 'nudCI.Maximum = 1 - 'nudCI.DecimalPlaces = 2 - 'nudHypothesis.DecimalPlaces = 2 + + + sdgSimpleRegOptions.SetDefaults() sdgModelOptions.SetDefaults() @@ -146,22 +167,61 @@ Public Class dlgRegressionSimple TestOKEnabled() End Sub - Private Sub LM() - clsRLmOrGLM.SetRCommand("lm") - clsRLmOrGLM.AddParameter("data", clsRFunctionParameter:=ucrSelectorSimpleReg.ucrAvailableDataFrames.clsCurrDataFrame) - ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) - clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsModel) - clsModel.SetOperation("~") + Private Sub ucrDistWithParameters_ucrInputDistributionsIndexChanged() Handles ucrFamily.DistributionsIndexChanged + sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) + sdgModelOptions.ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrFamily.clsCurrDistribution.strNameTag) + sdgModelOptions.RestrictLink() + ExplanatoryFunctionSelect() + SetRCode() + Display() + DataTypeAccepted() + End Sub + + Public Sub DataTypeAccepted() + If rdoTwoSample.Checked Then + ucrResponse.SetIncludedDataTypes({"integer", "numeric"}) + ucrExplanatory.SetIncludedDataTypes({"character", "factor"}) + If ucrResponse.strCurrDataType = "factor" OrElse ucrResponse.strCurrDataType = "character" Then + ucrResponse.Clear() + End If + If ucrExplanatory.strCurrDataType = "integer" OrElse ucrExplanatory.strCurrDataType = "numeric" OrElse ucrResponse.strCurrDataType = "positive integer" Then + ucrExplanatory.Clear() + End If + ElseIf rdoGeneralCase.Checked Then + ucrResponse.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) + ucrExplanatory.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) + End If + End Sub + + Private Sub ucrChkFunction_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkFunction.ControlValueChanged + If ucrChkFunction.Checked Then + sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsRLmOrGLM, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel, clsNewFunction:=clsRCIFunction) + sdgVariableTransformations.Show() + bResetSubDialog = False + End If End Sub + Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged + clsRYVariable = ucrResponse.GetVariables + End Sub + + Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged + clsRXVariable = ucrExplanatory.GetVariables + End Sub + + Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click + sdgModelOptions.ShowDialog() + ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) + Display() + End Sub + + Private Sub GLM() clsRLmOrGLM.SetRCommand("glm") clsRLmOrGLM.AddParameter("data", clsRFunctionParameter:=ucrSelectorSimpleReg.ucrAvailableDataFrames.clsCurrDataFrame) ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsModel) clsModel.SetOperation("~") - clsRCIFunction.SetRCommand(ucrFamily.clsCurrDistribution.strGLMFunctionName) - clsRLmOrGLM.AddParameter("family", clsRFunctionParameter:=clsRCIFunction) End Sub Private Sub SetTTest() @@ -222,21 +282,6 @@ Public Class dlgRegressionSimple clsRKruskalTest.AddParameter("", clsROperatorParameter:=clsModel) End Sub - Public Sub DataTypeAccepted() - If rdoTwoSample.Checked Then - ucrResponse.SetIncludedDataTypes({"integer", "numeric"}) - ucrExplanatory.SetIncludedDataTypes({"character", "factor"}) - If ucrResponse.strCurrDataType = "factor" OrElse ucrResponse.strCurrDataType = "character" Then - ucrResponse.Clear() - End If - If ucrExplanatory.strCurrDataType = "integer" OrElse ucrExplanatory.strCurrDataType = "numeric" OrElse ucrResponse.strCurrDataType = "positive integer" Then - ucrExplanatory.Clear() - End If - ElseIf rdoGeneralCase.Checked Then - ucrResponse.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) - ucrExplanatory.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) - End If - End Sub Private Sub SetBinomTest() Dim clsyFunc, clsnFunc As New RFunction @@ -382,9 +427,9 @@ Public Class dlgRegressionSimple clsRLmOrGLM.ClearParameters() If rdoGeneralCase.Checked Then If (ucrFamily.clsCurrDistribution.strNameTag = "Normal") Then - LM() + ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) Else - GLM() + ucrBase.clsRsyntax.SetBaseRFunction(clsGLM) End If ElseIf rdoTwoSample.Checked Then If ucrFamily.clsCurrDistribution.strNameTag = "Normal" Then @@ -503,7 +548,7 @@ Public Class dlgRegressionSimple If Not ucrExplanatory.IsEmpty AndAlso rdoGeneralCase.Checked Then strExplanatoryType = frmMain.clsRLink.GetDataType(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrExplanatory.GetVariableNames(bWithQuotes:=False)) If rdoGeneralCase.Checked AndAlso (strExplanatoryType = "numeric" OrElse strExplanatoryType = "positive integer" OrElse strExplanatoryType = "integer") Then - ' chkFunction.Visible = True + 'chkFunction.Visible = True Else ' chkFunction.Checked = False ' chkFunction.Visible = False @@ -563,22 +608,6 @@ Public Class dlgRegressionSimple 'End If End Sub - Private Sub ucrDistWithParameters_ucrInputDistributionsIndexChanged() Handles ucrFamily.DistributionsIndexChanged - sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) - sdgModelOptions.ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrFamily.clsCurrDistribution.strNameTag) - sdgModelOptions.RestrictLink() - ExplanatoryFunctionSelect() - SetRCode() - Display() - DataTypeAccepted() - End Sub - - Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click - sdgModelOptions.ShowDialog() - ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) - Display() - End Sub - Private Sub chkFunction_CheckedChanged(sender As Object, e As EventArgs) 'If chkFunction.Checked Then ' sdgVariableTransformations.ShowDialog() @@ -695,17 +724,4 @@ Public Class dlgRegressionSimple TestOKEnabled() SetEnableDists() End Sub - - Private Sub rdoCompareMeans_VisibleChanged(sender As Object, e As EventArgs) - Display() - SetRCode() - End Sub - - Private Sub ucrLevel1_NameChanged() - SetRCode() - End Sub - - Private Sub ucrNud_TextChanged(sender As Object, e As EventArgs) - SetRCode() - End Sub End Class \ No newline at end of file diff --git a/instat/sdgVariableTransformations.Designer.vb b/instat/sdgVariableTransformations.Designer.vb index 466524d4e2c..abb9336c201 100644 --- a/instat/sdgVariableTransformations.Designer.vb +++ b/instat/sdgVariableTransformations.Designer.vb @@ -23,40 +23,55 @@ Partial Class sdgVariableTransformations _ Private Sub InitializeComponent() Me.grpGeneralFunctions = New System.Windows.Forms.GroupBox() + Me.ucrButtonsSDGVarTransform = New instat.ucrButtonsSubdialogue() + Me.ucrPnlGenerateFunctions = New instat.UcrPanel() Me.rdoIdentity = New System.Windows.Forms.RadioButton() Me.rdoNaturallog = New System.Windows.Forms.RadioButton() - Me.nudPower = New System.Windows.Forms.NumericUpDown() Me.rdoPower = New System.Windows.Forms.RadioButton() Me.rdoSquareroot = New System.Windows.Forms.RadioButton() Me.rdoLogBase10 = New System.Windows.Forms.RadioButton() - Me.ucrButtonsSDGVarTransform = New instat.ucrButtonsSubdialogue() + Me.ucrNudPower = New instat.ucrNud() Me.grpGeneralFunctions.SuspendLayout() - CType(Me.nudPower, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() ' 'grpGeneralFunctions ' + Me.grpGeneralFunctions.Controls.Add(Me.ucrNudPower) Me.grpGeneralFunctions.Controls.Add(Me.rdoIdentity) Me.grpGeneralFunctions.Controls.Add(Me.rdoNaturallog) - Me.grpGeneralFunctions.Controls.Add(Me.nudPower) Me.grpGeneralFunctions.Controls.Add(Me.rdoPower) Me.grpGeneralFunctions.Controls.Add(Me.rdoSquareroot) Me.grpGeneralFunctions.Controls.Add(Me.rdoLogBase10) + Me.grpGeneralFunctions.Controls.Add(Me.ucrPnlGenerateFunctions) Me.grpGeneralFunctions.Location = New System.Drawing.Point(10, 10) Me.grpGeneralFunctions.Name = "grpGeneralFunctions" - Me.grpGeneralFunctions.Size = New System.Drawing.Size(151, 134) + Me.grpGeneralFunctions.Size = New System.Drawing.Size(151, 146) Me.grpGeneralFunctions.TabIndex = 1 Me.grpGeneralFunctions.TabStop = False Me.grpGeneralFunctions.Tag = "General_Functions" Me.grpGeneralFunctions.Text = "General Functions" ' + 'ucrButtonsSDGVarTransform + ' + Me.ucrButtonsSDGVarTransform.Location = New System.Drawing.Point(10, 162) + Me.ucrButtonsSDGVarTransform.Name = "ucrButtonsSDGVarTransform" + Me.ucrButtonsSDGVarTransform.Size = New System.Drawing.Size(142, 30) + Me.ucrButtonsSDGVarTransform.TabIndex = 2 + ' + 'ucrPnlGenerateFunctions + ' + Me.ucrPnlGenerateFunctions.Location = New System.Drawing.Point(6, 19) + Me.ucrPnlGenerateFunctions.Name = "ucrPnlGenerateFunctions" + Me.ucrPnlGenerateFunctions.Size = New System.Drawing.Size(136, 121) + Me.ucrPnlGenerateFunctions.TabIndex = 3 + ' 'rdoIdentity ' Me.rdoIdentity.AutoSize = True - Me.rdoIdentity.Location = New System.Drawing.Point(9, 19) + Me.rdoIdentity.Location = New System.Drawing.Point(22, 23) Me.rdoIdentity.Name = "rdoIdentity" Me.rdoIdentity.Size = New System.Drawing.Size(59, 17) - Me.rdoIdentity.TabIndex = 5 + Me.rdoIdentity.TabIndex = 17 Me.rdoIdentity.TabStop = True Me.rdoIdentity.Tag = "Identity" Me.rdoIdentity.Text = "Identity" @@ -65,31 +80,22 @@ Partial Class sdgVariableTransformations 'rdoNaturallog ' Me.rdoNaturallog.AutoSize = True - Me.rdoNaturallog.Location = New System.Drawing.Point(9, 41) + Me.rdoNaturallog.Location = New System.Drawing.Point(22, 48) Me.rdoNaturallog.Name = "rdoNaturallog" Me.rdoNaturallog.Size = New System.Drawing.Size(76, 17) - Me.rdoNaturallog.TabIndex = 0 + Me.rdoNaturallog.TabIndex = 12 Me.rdoNaturallog.TabStop = True Me.rdoNaturallog.Tag = "Natural_log" Me.rdoNaturallog.Text = "Natural log" Me.rdoNaturallog.UseVisualStyleBackColor = True ' - 'nudPower - ' - Me.nudPower.Location = New System.Drawing.Point(74, 108) - Me.nudPower.Maximum = New Decimal(New Integer() {1000, 0, 0, 0}) - Me.nudPower.Name = "nudPower" - Me.nudPower.Size = New System.Drawing.Size(41, 20) - Me.nudPower.TabIndex = 4 - Me.nudPower.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' 'rdoPower ' Me.rdoPower.AutoSize = True - Me.rdoPower.Location = New System.Drawing.Point(10, 110) + Me.rdoPower.Location = New System.Drawing.Point(22, 118) Me.rdoPower.Name = "rdoPower" Me.rdoPower.Size = New System.Drawing.Size(55, 17) - Me.rdoPower.TabIndex = 3 + Me.rdoPower.TabIndex = 15 Me.rdoPower.TabStop = True Me.rdoPower.Tag = "Power" Me.rdoPower.Text = "Power" @@ -98,10 +104,10 @@ Partial Class sdgVariableTransformations 'rdoSquareroot ' Me.rdoSquareroot.AutoSize = True - Me.rdoSquareroot.Location = New System.Drawing.Point(9, 87) + Me.rdoSquareroot.Location = New System.Drawing.Point(22, 95) Me.rdoSquareroot.Name = "rdoSquareroot" Me.rdoSquareroot.Size = New System.Drawing.Size(80, 17) - Me.rdoSquareroot.TabIndex = 2 + Me.rdoSquareroot.TabIndex = 14 Me.rdoSquareroot.TabStop = True Me.rdoSquareroot.Tag = "Square_root" Me.rdoSquareroot.Text = "Square root" @@ -110,27 +116,32 @@ Partial Class sdgVariableTransformations 'rdoLogBase10 ' Me.rdoLogBase10.AutoSize = True - Me.rdoLogBase10.Location = New System.Drawing.Point(9, 64) + Me.rdoLogBase10.Location = New System.Drawing.Point(22, 70) Me.rdoLogBase10.Name = "rdoLogBase10" Me.rdoLogBase10.Size = New System.Drawing.Size(85, 17) - Me.rdoLogBase10.TabIndex = 1 + Me.rdoLogBase10.TabIndex = 13 Me.rdoLogBase10.TabStop = True Me.rdoLogBase10.Tag = "Log_Base_10" Me.rdoLogBase10.Text = "Log Base 10" Me.rdoLogBase10.UseVisualStyleBackColor = True ' - 'ucrButtonsSDGVarTransform + 'ucrNudPower ' - Me.ucrButtonsSDGVarTransform.Location = New System.Drawing.Point(10, 150) - Me.ucrButtonsSDGVarTransform.Name = "ucrButtonsSDGVarTransform" - Me.ucrButtonsSDGVarTransform.Size = New System.Drawing.Size(142, 30) - Me.ucrButtonsSDGVarTransform.TabIndex = 2 + Me.ucrNudPower.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudPower.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudPower.Location = New System.Drawing.Point(83, 118) + Me.ucrNudPower.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudPower.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudPower.Name = "ucrNudPower" + Me.ucrNudPower.Size = New System.Drawing.Size(50, 20) + Me.ucrNudPower.TabIndex = 17 + Me.ucrNudPower.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'sdgVariableTransformations ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(173, 186) + Me.ClientSize = New System.Drawing.Size(171, 199) Me.Controls.Add(Me.ucrButtonsSDGVarTransform) Me.Controls.Add(Me.grpGeneralFunctions) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow @@ -142,17 +153,17 @@ Partial Class sdgVariableTransformations Me.Text = "Variable Transformations" Me.grpGeneralFunctions.ResumeLayout(False) Me.grpGeneralFunctions.PerformLayout() - CType(Me.nudPower, System.ComponentModel.ISupportInitialize).EndInit() Me.ResumeLayout(False) End Sub Friend WithEvents grpGeneralFunctions As GroupBox + Friend WithEvents ucrButtonsSDGVarTransform As ucrButtonsSubdialogue + Friend WithEvents ucrNudPower As ucrNud + Friend WithEvents rdoIdentity As RadioButton Friend WithEvents rdoNaturallog As RadioButton - Friend WithEvents nudPower As NumericUpDown Friend WithEvents rdoPower As RadioButton Friend WithEvents rdoSquareroot As RadioButton Friend WithEvents rdoLogBase10 As RadioButton - Friend WithEvents ucrButtonsSDGVarTransform As ucrButtonsSubdialogue - Friend WithEvents rdoIdentity As RadioButton + Friend WithEvents ucrPnlGenerateFunctions As UcrPanel End Class diff --git a/instat/sdgVariableTransformations.vb b/instat/sdgVariableTransformations.vb index 353b3567627..ef18821dabf 100644 --- a/instat/sdgVariableTransformations.vb +++ b/instat/sdgVariableTransformations.vb @@ -16,41 +16,39 @@ Imports instat.Translations Public Class sdgVariableTransformations Public clsRCIFunction As RFunction - Public clsRToFunction As New RFunction + Public clsRToFunction, clsLMorGLM As New RFunction Public clsRYVariable, clsRXVariable As ucrReceiverSingle Public clsRModel, clsRModel1 As ROperator Public clsModel0 As New ROperator - Public bFirstLoad As Boolean = True + Public bControlsInitialised As Boolean = True Private Sub sdgVariableTransformations_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) - - If bFirstLoad Then - SetDefaults() - bFirstLoad = False - End If End Sub - Public Sub SetDefaults() - rdoNaturallog.Checked = False - rdoLogBase10.Checked = False - rdoSquareroot.Checked = False - rdoPower.Checked = False - End Sub + Public Sub InitialiseControls() + ucrPnlGenerateFunctions.AddRadioButton(rdoIdentity) + ucrPnlGenerateFunctions.AddRadioButton(rdoLogBase10) + ucrPnlGenerateFunctions.AddRadioButton(rdoNaturallog) + ucrPnlGenerateFunctions.AddRadioButton(rdoPower) + ucrPnlGenerateFunctions.AddRadioButton(rdoSquareroot) - Public Sub SetRCIFunction(clsNewFunction As RFunction) - clsRCIFunction = clsNewFunction - End Sub + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoLogBase10, "log10") + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoSquareroot, "sqrt") + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoNaturallog, "log") + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoIdentity, {"log10", "power", "log", "sqrt"}, False) + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoPower, "power") - Public Sub SetRModelOperator(clsRModelNew As ROperator) - clsRModel = clsRModelNew + bControlsInitialised = True End Sub - Public Sub SetRYVariable(clsRYVariableNew As ucrReceiverSingle) - clsRYVariable = clsRYVariableNew - End Sub - - Public Sub SetRXVariable(clsRXVariableNew As ucrReceiverSingle) - clsRXVariable = clsRXVariableNew + Public Sub SetRCodeForControls(clsNewLMorGLM As RFunction, clsNewFunction As RFunction, clsRModelNew As ROperator, clsRYVariableNew As RFunction, clsRXVariableNew As RFunction, Optional bReset As Boolean = False) + If bControlsInitialised Then + InitialiseControls() + End If + clsLMorGLM = clsNewLMorGLM + clsRModel = clsRModelNew + clsRCIFunction = clsNewFunction + ucrPnlGenerateFunctions.SetRCode(clsLMorGLM, bReset) End Sub Private Sub ExplanatoryFunction(strFunctionName As String, strPower As String, Optional choice As Boolean = False) @@ -68,8 +66,6 @@ Public Class sdgVariableTransformations clsModel0.AddParameter(iPosition:=0, strParameterValue:=clsRXVariable.GetVariableNames(bWithQuotes:=False)) clsModel0.AddParameter(strParameterValue:=strPower) clsRModel.AddParameter(iPosition:=i, clsROperatorParameter:=clsModel0.Clone()) - - End If Else clsRToFunction.SetRCommand(strFunctionName) @@ -89,7 +85,7 @@ Public Class sdgVariableTransformations ExplanatoryFunction("sqrt", 1, choice) End If If rdoPower.Checked Then - ExplanatoryFunction("power", nudPower.Value, choice) + ExplanatoryFunction("power", ucrNudPower.Value, choice) End If End Sub End Class \ No newline at end of file From 68a571388540887d7d8d39190d15b80511dcddb1 Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 16 Jun 2017 16:49:33 +0100 Subject: [PATCH 045/201] Spells update --- instat/dlgSpells.vb | 227 ++++++++++++++++++++++++++++---------------- 1 file changed, 143 insertions(+), 84 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index ddd8886d762..5a7b128b8e4 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -14,28 +14,31 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class dlgSpells Private bFirstload As Boolean = True Private bReset As Boolean = True Private clsAddKey, clsSpellLength, clsMaxValueManipulation, clsSubSpellLength1 As New RFunction - Private clsMaxValue, clsMaxValueList As New RFunction + Private clsMaxValue, clsMaxValueList, clsMaxValueFunction As New RFunction Private clsDayFromAndTo, clsYearGroupDaily As New RFunction + Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator As New ROperator Private clsApplyInstatFunction, clsRRainday As New RFunction + Private clsRRaindayOperator, clsRRaindayAndOperator, clsRRaindayLowerOperator, clsRRaindayUpperOperator As New ROperator Private strCurrDataName As String = "" - Private strValuesUnder As String = ">=" Private Sub dlgSpells_Load(sender As Object, e As EventArgs) Handles MyBase.Load - autoTranslate(Me) - If bFirstload Then - InitialiseDialog() - SetDefaults() - bFirstload = False - ' Else - ' ReopenDialog() - End If - SetRCodeForControls(bReset) - TestOKEnabled() + autoTranslate(Me) + If bFirstload Then + InitialiseDialog() + bFirstload = False + End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False + TestOKEnabled() End Sub Private Sub InitialiseDialog() @@ -46,10 +49,10 @@ Public Class dlgSpells ucrSelectorForSpells.SetParameterIsString() ' Setting receivers - ucrReceiverRainfall.SetParameter(New RParameter("data", 0)) + ucrReceiverRainfall.SetParameter(New RParameter("rain", 0)) ucrReceiverRainfall.SetParameterIsString() ucrReceiverRainfall.bWithQuotes = False - ucrReceiverRainfall.SetParameterIncludeArgumentName(False) + ' ucrReceiverRainfall.SetParameterIncludeArgumentName(False) ucrReceiverRainfall.Selector = ucrSelectorForSpells ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) ucrReceiverRainfall.bAutoFill = True @@ -68,16 +71,30 @@ Public Class dlgSpells ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) ucrReceiverDate.bAutoFill = True + ucrReceiverDOY.SetParameter(New RParameter("day", 0)) + ucrReceiverDOY.SetParameterIsString() + ucrReceiverDOY.bWithQuotes = False ucrReceiverDOY.Selector = ucrSelectorForSpells ucrReceiverDOY.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "doy" & Chr(34)}) ucrReceiverDOY.bAutoFill = True - 'clsRTransform.SetRCommand("instat_calculation$new") - 'clsRTransform.SetAssignTo("transform_calculation") - clsSubSpellLength1.SetRCommand("list") clsMaxValueList.SetRCommand("list") + ucrNudFrom.SetParameter(New RParameter("from", 1)) + ucrNudFrom.SetMinMax(1, 365) + + ucrNudTo.SetParameter(New RParameter("to", 1)) + ucrNudTo.SetMinMax(2, 366) + + ucrInputSpellLower.SetParameter(New RParameter("min", 1)) + ucrInputSpellLower.SetValidationTypeAsNumeric() + ucrInputSpellLower.AddQuotesIfUnrecognised = False + + ucrInputSpellUpper.SetParameter(New RParameter("max", 1)) + ucrInputSpellUpper.SetValidationTypeAsNumeric() + ucrInputSpellUpper.AddQuotesIfUnrecognised = False + 'ucrInputCondition.SetParameter(New RParameter("")) 'Dim dctCondition As New Dictionary(Of String, String) 'dctCondition.Add("Between", "between") @@ -106,6 +123,14 @@ Public Class dlgSpells clsRRainday = New RFunction clsSpellLength = New RFunction clsMaxValue = New RFunction + clsDayFromAndToOperator = New ROperator + clsDayFromOperator = New ROperator + clsDayToOperator = New ROperator + clsRRaindayOperator = New ROperator + clsRRaindayAndOperator = New ROperator + clsRRaindayLowerOperator = New ROperator + clsRRaindayUpperOperator = New ROperator + clsMaxValueFunction = New RFunction ucrSelectorForSpells.Reset() ucrReceiverDate.SetMeAsReceiver() @@ -115,20 +140,38 @@ Public Class dlgSpells 'DayFromandTo clsDayFromAndTo.SetRCommand("instat_calculation$new") - clsDayFromAndTo.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & ">=" & ucrNudFrom.Value & " & " & ucrReceiverDOY.GetVariableNames(False) & "<=" & ucrNudTo.Value & Chr(34)) - clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34)) + clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) + ' clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) + clsDayFromAndToOperator.SetOperation("&") + clsDayFromAndToOperator.AddParameter("from", clsROperatorParameter:=clsDayFromOperator, iPosition:=0) + clsDayFromOperator.SetOperation(">=") + clsDayFromOperator.AddParameter("from", 1) + clsDayFromAndToOperator.AddParameter("to", clsROperatorParameter:=clsDayToOperator, iPosition:=1) + clsDayToOperator.SetOperation("<=") + clsDayToOperator.AddParameter("to", 366) ' Year group clsYearGroupDaily.SetRCommand("instat_calculation$new") clsYearGroupDaily.AddParameter("type", Chr(34) & "by" & Chr(34)) - ' rain_day option + ' rain_day clsRRainday.SetRCommand("instat_calculation$new") - clsRRainday.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=1) - clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrReceiverRainfall.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0,1)" & Chr(34), iPosition:=2) - clsRRainday.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=3) - clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) - clsRRainday.AddParameter("save", "0", iPosition:=4) + clsRRainday.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsRRainday.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=2) + clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=3) + clsRRainday.AddParameter("save", "0", iPosition:=6) + ' clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayOperator.ToScript & Chr(34), iPosition:=1) + ' We have: match(Rain >= LOWER & Rain <= UPPER, 1, nomatch = 0) + clsRRaindayOperator.SetOperation(",") + clsRRaindayOperator.AddParameter("lower_upper_operators", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) + clsRRaindayOperator.AddParameter("right_side", "1, nomatch = 0", iPosition:=1) + clsRRaindayAndOperator.SetOperation("&") + clsRRaindayAndOperator.AddParameter("lower", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) + clsRRaindayLowerOperator.SetOperation(">=") + clsRRaindayLowerOperator.AddParameter("min", 0, iPosition:=1) + clsRRaindayAndOperator.AddParameter("upper", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) + clsRRaindayUpperOperator.SetOperation("<=") + clsRRaindayUpperOperator.AddParameter("max", 0.85, iPosition:=1) ' Spell Length clsSpellLength.SetRCommand("instat_calculation$new") @@ -144,12 +187,14 @@ Public Class dlgSpells 'Max Value clsMaxValue.SetRCommand("instat_calculation$new") - clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=1) - clsMaxValue.AddParameter("function_exp", Chr(34) & "max(Dry_Spell)" & Chr(34), iPosition:=2) + clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) + clsMaxValue.AddParameter("function_exp", clsRFunctionParameter:=clsMaxValueFunction, iPosition:=1) + clsMaxValueFunction.SetRCommand("max") + clsMaxValueFunction.AddParameter("x", "Dry_Spell") clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34), iPosition:=3) - clsMaxValue.AddParameter("save", 2, iPosition:=4) + clsMaxValue.AddParameter("save", 2, iPosition:=6) + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) clsMaxValue.SetAssignTo(ucrSaveSpells.ucrInputTextSave.GetText) - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=4) clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) @@ -160,6 +205,17 @@ Public Class dlgSpells End Sub Private Sub SetRCodeForControls(bReset As Boolean) + 'For day: + ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("day", 0), iAdditionalPairNo:=1) + ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) + ucrNudFrom.SetRCode(clsDayFromOperator, bReset) + ucrNudTo.SetRCode(clsDayToOperator, bReset) + + ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRRaindayLowerOperator, New RParameter("rain", 0), iAdditionalPairNo:=1) + ucrReceiverRainfall.SetRCode(clsRRaindayUpperOperator, bReset) + ucrInputSpellLower.SetRCode(clsRRaindayLowerOperator, bReset) + ucrInputSpellUpper.SetRCode(clsRRaindayUpperOperator, bReset) + ucrReceiverDate.SetRCode(clsAddKey, bReset) ucrSelectorForSpells.SetRCode(clsAddKey, bReset) End Sub @@ -172,36 +228,46 @@ Public Class dlgSpells 'End If End Sub - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeForControls(True) - TestOKEnabled() + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset + SetDefaults() + SetRCodeForControls(True) + TestOKEnabled() End Sub Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk - frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining Date column as key") + frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining Date column as key") clsMaxValue.SetAssignTo("Spells_Rain") clsSpellLength.SetAssignTo("Dry_Spell") clsDayFromAndTo.SetAssignTo("Day_From_and_To") clsYearGroupDaily.SetAssignTo("grouping") - SubCalcForDrySpell() - SetGroupByFuncCalcFrom() + ' SetGroupByFuncCalcFrom() + clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) + clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayOperator.ToScript & Chr(34), iPosition:=1) + clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=1) ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) End Sub - 'Private Sub ucrPnlTransform_ControlContentsChanged(ucrChangedControl As ucrCore) Handles - ' Dim bRain As Boolean = False - ' clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrreceiverrain.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0, 1)" & Chr(34)) - ' clsSubCalcList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) - ' clsRTransform.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubCalcList, iPosition:=6) - ' SetAssignName() - 'End Sub + 'Setting up the days + Private Sub DayBoundaries() + clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + End Sub - Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForSpells.ControlContentsChanged - strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - clsRRainday.AddParameter("function_exp", Chr(34) & "ifelse(" & ucrReceiverRainfall.GetVariableNames(False) & " >= " & ucrInputSpellLower.GetText() & " & " & ucrReceiverRainfall.GetVariableNames(False) & " <= " & ucrInputSpellUpper.GetText() & ", 0, 1)" & Chr(34), iPosition:=2) - clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) + 'Rainfall set up + Private Sub RainDayCalculation() + clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) + clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) + End Sub + + Private Sub RainyDaysMethod() ' run when ucrInputcondition changes + Select Case ucrInputCondition.GetText + Case "<= Amount of Rain" + clsRRaindayOperator.AddParameter("lower_operators", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) + Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) + clsRRaindayOperator.AddParameter("lower_upper_operators", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) + Case Else + clsRRaindayOperator.AddParameter("upper_operators", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) + End Select End Sub Private Sub SetGroupByFuncCalcFrom() @@ -209,7 +275,6 @@ Public Class dlgSpells Dim strGroupByCalcFrom As String = "" strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) If Not ucrReceiverStation.IsEmpty Then - clsYearGroupDaily.SetAssignTo("grouping") clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=4) ' strGroupByCalcFrom = "list(" & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames() & ")" @@ -225,66 +290,60 @@ Public Class dlgSpells MaxValue() End Sub + Private Sub MaxValue() ' would this class need to update when the days update? ' and when the year receiver changes + clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False) + + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation) + clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList) + End Sub + Private Sub ucrReceiverStation_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverStation.ControlValueChanged SetGroupByFuncCalcFrom() End Sub - Private Sub ucrControls_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged - TestOKEnabled() + Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged + ' do I need to update this for when the data frame changes? + clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) + RainyDaysMethod() + RainDayCalculation() + + ' when rain_day changes, then clsSpellLength changes. So do I need to run everything again when rain_day changes?! + ' No, not if I do Assigns as it's just = the sub? End Sub - Private Sub ucrSpellBetween_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrInputSpellUpper.ControlContentsChanged, ucrInputSpellLower.ControlContentsChanged + Private Sub ucrReceivers_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged + ' when rain_day changes, then clsSpellLength changes. So do I need to run everything again when rain_day changes?! clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False, iPosition:=0) + End Sub + + Private Sub ucrSpellBetween_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrInputSpellUpper.ControlContentsChanged, ucrInputSpellLower.ControlContentsChanged clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=7) TestOKEnabled() RainyDaysMethod() End Sub - Private Sub ucrSelectorForStartofRains_DataFrameChanged() - - End Sub - - Private Sub MaxValue() - clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) - clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False) - - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation) - clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList) - End Sub - - Private Sub SubCalcForDrySpell() - clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) - clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) + Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForSpells.ControlContentsChanged + strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) End Sub - Private Sub RainyDaysMethod() - Select Case ucrInputCondition.GetText - Case "<= Amount of Rain" - clsRRainday.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrInputSpellLower.GetText & "," & "1, nomatch = 0" & ")" & Chr(34)) - Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) - clsRRainday.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrInputSpellLower.GetText & "&" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & ucrInputSpellUpper.GetText & "," & "1, nomatch = 0" & ")" & Chr(34)) - Case Else - clsRRainday.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & "<=" & ucrInputSpellLower.GetText & "," & "1, nomatch = 0" & ")" & Chr(34)) - End Select + Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged + DayBoundaries() End Sub - Private Sub Ifthenudschange() ' and if the receiver changes - clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - clsDayFromAndTo.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & ">=" & ucrNudFrom.Value & " & " & ucrReceiverDOY.GetVariableNames(False) & "<=" & ucrNudTo.Value & Chr(34)) + Private Sub nudTo_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlValueChanged, ucrNudFrom.ControlValueChanged + DayBoundaries() End Sub - Private Sub ucrReceiverYear_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverYear.SelectionChanged + Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged + ' does this update if I change the data name? clsYearGroupDaily.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) End Sub Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged TestOKEnabled() End Sub - - Private Sub nudTo_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlValueChanged, ucrNudFrom.ControlValueChanged - Ifthenudschange() - End Sub End Class 'TODO: Make by Year and Station From ea23e7dda06e3ad5ea20bc4eb231f5907285bb3a Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 16 Jun 2017 17:27:17 +0100 Subject: [PATCH 046/201] Spells pre-checkbox --- instat/dlgSpells.vb | 95 +++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 56 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 5a7b128b8e4..50d7a0caede 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -23,7 +23,7 @@ Public Class dlgSpells Private clsMaxValue, clsMaxValueList, clsMaxValueFunction As New RFunction Private clsDayFromAndTo, clsYearGroupDaily As New RFunction Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator As New ROperator - Private clsApplyInstatFunction, clsRRainday As New RFunction + Private clsApplyInstatFunction, clsRRainday, clsRRaindayMatch As New RFunction Private clsRRaindayOperator, clsRRaindayAndOperator, clsRRaindayLowerOperator, clsRRaindayUpperOperator As New ROperator Private strCurrDataName As String = "" @@ -50,7 +50,7 @@ Public Class dlgSpells ' Setting receivers ucrReceiverRainfall.SetParameter(New RParameter("rain", 0)) - ucrReceiverRainfall.SetParameterIsString() + ucrReceiverRainfall.SetParameterIsRFunction() ucrReceiverRainfall.bWithQuotes = False ' ucrReceiverRainfall.SetParameterIncludeArgumentName(False) ucrReceiverRainfall.Selector = ucrSelectorForSpells @@ -160,7 +160,9 @@ Public Class dlgSpells clsRRainday.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=2) clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=3) clsRRainday.AddParameter("save", "0", iPosition:=6) - ' clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayOperator.ToScript & Chr(34), iPosition:=1) + ' clsRRainday.AddParameter("function_exp", chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) + clsRRaindayMatch.SetRCommand("match") + clsRRaindayMatch.AddParameter("", clsROperatorParameter:=clsRRaindayOperator) ' We have: match(Rain >= LOWER & Rain <= UPPER, 1, nomatch = 0) clsRRaindayOperator.SetOperation(",") clsRRaindayOperator.AddParameter("lower_upper_operators", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) @@ -175,25 +177,21 @@ Public Class dlgSpells ' Spell Length clsSpellLength.SetRCommand("instat_calculation$new") - clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsSpellLength.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) - clsSpellLength.AddParameter("save", 0) - clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34)) + clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34), iPosition:=1) + clsSpellLength.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) + clsSpellLength.AddParameter("save", 0, iPosition:=6) - ' Base clsMaxValueManipulation.SetRCommand("list") - clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) - clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) 'Max Value clsMaxValue.SetRCommand("instat_calculation$new") clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) - clsMaxValue.AddParameter("function_exp", clsRFunctionParameter:=clsMaxValueFunction, iPosition:=1) + ' clsMaxValue.AddParameter("function_exp", Chr(34) & clsMaxValueFunction.ToScript & Chr(34), iPosition:=1) clsMaxValueFunction.SetRCommand("max") clsMaxValueFunction.AddParameter("x", "Dry_Spell") clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34), iPosition:=3) clsMaxValue.AddParameter("save", 2, iPosition:=6) - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) clsMaxValue.SetAssignTo(ucrSaveSpells.ucrInputTextSave.GetText) clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") @@ -236,13 +234,14 @@ Public Class dlgSpells Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining Date column as key") + clsDayFromAndTo.SetAssignTo("Day_From_and_To") + clsYearGroupDaily.SetAssignTo("Grouping") clsMaxValue.SetAssignTo("Spells_Rain") clsSpellLength.SetAssignTo("Dry_Spell") - clsDayFromAndTo.SetAssignTo("Day_From_and_To") - clsYearGroupDaily.SetAssignTo("grouping") - ' SetGroupByFuncCalcFrom() + clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) - clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayOperator.ToScript & Chr(34), iPosition:=1) + clsMaxValue.AddParameter("function_exp", Chr(34) & clsMaxValueFunction.ToScript & Chr(34), iPosition:=1) + clsRRainday.AddParameter("function_exp", chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=1) ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) @@ -254,93 +253,77 @@ Public Class dlgSpells End Sub 'Rainfall set up - Private Sub RainDayCalculation() + Private Sub RainyDaysMethod() ' run when ucrInputcondition changes + 'Select Case ucrInputCondition.GetText + ' Case "<= Amount of Rain" + ' clsRRaindayOperator.RemoveParameterByName("upper_operators") + ' clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") + ' clsRRaindayOperator.AddParameter("lower_operators", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) + ' Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) + ' clsRRaindayOperator.RemoveParameterByName("upper_operators") + ' clsRRaindayOperator.RemoveParameterByName("lower_operators") + ' clsRRaindayOperator.AddParameter("lower_upper_operators", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) + ' Case Else + ' clsRRaindayOperator.RemoveParameterByName("lower_operators") + ' clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") + ' clsRRaindayOperator.AddParameter("upper_operators", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) + 'End Select clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) End Sub - Private Sub RainyDaysMethod() ' run when ucrInputcondition changes - Select Case ucrInputCondition.GetText - Case "<= Amount of Rain" - clsRRaindayOperator.AddParameter("lower_operators", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) - Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) - clsRRaindayOperator.AddParameter("lower_upper_operators", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) - Case Else - clsRRaindayOperator.AddParameter("upper_operators", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) - End Select - End Sub - Private Sub SetGroupByFuncCalcFrom() Dim strCurrDataName As String = "" Dim strGroupByCalcFrom As String = "" strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) If Not ucrReceiverStation.IsEmpty Then - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=4) - + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) ' strGroupByCalcFrom = "list(" & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames() & ")" Else clsMaxValue.RemoveParameterByName("manipulations") - End If ' If strGroupByCalcFrom <> "" Then ' clsYearGroupDaily.AddParameter("calculated_from", strGroupByCalcFrom, iPosition:=0) ' Else ' clsYearGroupDaily.RemoveParameterByName("calculated_from") ' End If - MaxValue() - End Sub - - Private Sub MaxValue() ' would this class need to update when the days update? ' and when the year receiver changes - clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False) - - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation) - clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList) - End Sub - - Private Sub ucrReceiverStation_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverStation.ControlValueChanged - SetGroupByFuncCalcFrom() End Sub Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged ' do I need to update this for when the data frame changes? clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) RainyDaysMethod() - RainDayCalculation() - ' when rain_day changes, then clsSpellLength changes. So do I need to run everything again when rain_day changes?! ' No, not if I do Assigns as it's just = the sub? End Sub Private Sub ucrReceivers_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged ' when rain_day changes, then clsSpellLength changes. So do I need to run everything again when rain_day changes?! + clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=4) clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False, iPosition:=0) End Sub - Private Sub ucrSpellBetween_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrInputSpellUpper.ControlContentsChanged, ucrInputSpellLower.ControlContentsChanged - clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=7) - TestOKEnabled() - RainyDaysMethod() - End Sub - Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForSpells.ControlContentsChanged strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) End Sub Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged DayBoundaries() - End Sub - - Private Sub nudTo_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlValueChanged, ucrNudFrom.ControlValueChanged - DayBoundaries() + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) + clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged ' does this update if I change the data name? clsYearGroupDaily.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) End Sub + Private Sub ucrReceiverStation_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverStation.ControlValueChanged + SetGroupByFuncCalcFrom() + End Sub + Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged TestOKEnabled() End Sub From a897b94c1784b5d437aa34662238ea26533c0355 Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 16 Jun 2017 18:24:22 +0100 Subject: [PATCH 047/201] Added check --- instat/dlgSpells.Designer.vb | 140 ++++++++++++------------- instat/dlgSpells.vb | 196 +++++++++++------------------------ 2 files changed, 128 insertions(+), 208 deletions(-) diff --git a/instat/dlgSpells.Designer.vb b/instat/dlgSpells.Designer.vb index 9c3a7138382..dbf0bf28b04 100644 --- a/instat/dlgSpells.Designer.vb +++ b/instat/dlgSpells.Designer.vb @@ -26,25 +26,25 @@ Partial Class dlgSpells Me.lblDate = New System.Windows.Forms.Label() Me.lblYear = New System.Windows.Forms.Label() Me.lblDOY = New System.Windows.Forms.Label() - Me.chkConditionRain = New System.Windows.Forms.CheckBox() Me.lblTo = New System.Windows.Forms.Label() Me.lblFrom = New System.Windows.Forms.Label() Me.lblThreshold = New System.Windows.Forms.Label() Me.grpRainParameters = New System.Windows.Forms.GroupBox() + Me.ucrNudTo = New instat.ucrNud() + Me.ucrNudFrom = New instat.ucrNud() + Me.ucrInputSpellLower = New instat.ucrInputTextBox() + Me.ucrInputCondition = New instat.ucrInputComboBox() + Me.ucrInputSpellUpper = New instat.ucrInputTextBox() Me.lblStation = New System.Windows.Forms.Label() Me.ucrReceiverStation = New instat.ucrReceiverSingle() Me.ucrSaveSpells = New instat.ucrSave() Me.ucrReceiverDOY = New instat.ucrReceiverSingle() Me.ucrReceiverYear = New instat.ucrReceiverSingle() Me.ucrReceiverDate = New instat.ucrReceiverSingle() - Me.ucrNudTo = New instat.ucrNud() - Me.ucrNudFrom = New instat.ucrNud() - Me.ucrInputSpellLower = New instat.ucrInputTextBox() - Me.ucrInputCondition = New instat.ucrInputComboBox() - Me.ucrInputSpellUpper = New instat.ucrInputTextBox() Me.ucrReceiverRainfall = New instat.ucrReceiverSingle() Me.ucrSelectorForSpells = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrBase = New instat.ucrButtons() + Me.ucrChkConditional = New instat.ucrCheck() Me.grpRainParameters.SuspendLayout() Me.SuspendLayout() ' @@ -84,16 +84,6 @@ Partial Class dlgSpells Me.lblDOY.TabIndex = 7 Me.lblDOY.Text = "Day of Year:" ' - 'chkConditionRain - ' - Me.chkConditionRain.AutoSize = True - Me.chkConditionRain.Location = New System.Drawing.Point(9, 326) - Me.chkConditionRain.Name = "chkConditionRain" - Me.chkConditionRain.Size = New System.Drawing.Size(193, 17) - Me.chkConditionRain.TabIndex = 13 - Me.chkConditionRain.Text = "Conditional on Rain at Start of Spell" - Me.chkConditionRain.UseVisualStyleBackColor = True - ' 'lblTo ' Me.lblTo.AutoSize = True @@ -139,6 +129,59 @@ Partial Class dlgSpells Me.grpRainParameters.TabIndex = 9 Me.grpRainParameters.TabStop = False ' + 'ucrNudTo + ' + Me.ucrNudTo.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTo.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudTo.Location = New System.Drawing.Point(237, 14) + Me.ucrNudTo.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudTo.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTo.Name = "ucrNudTo" + Me.ucrNudTo.Size = New System.Drawing.Size(50, 20) + Me.ucrNudTo.TabIndex = 20 + Me.ucrNudTo.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudFrom + ' + Me.ucrNudFrom.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudFrom.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudFrom.Location = New System.Drawing.Point(63, 14) + Me.ucrNudFrom.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudFrom.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudFrom.Name = "ucrNudFrom" + Me.ucrNudFrom.Size = New System.Drawing.Size(50, 20) + Me.ucrNudFrom.TabIndex = 19 + Me.ucrNudFrom.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrInputSpellLower + ' + Me.ucrInputSpellLower.AddQuotesIfUnrecognised = True + Me.ucrInputSpellLower.IsMultiline = False + Me.ucrInputSpellLower.IsReadOnly = False + Me.ucrInputSpellLower.Location = New System.Drawing.Point(63, 44) + Me.ucrInputSpellLower.Name = "ucrInputSpellLower" + Me.ucrInputSpellLower.Size = New System.Drawing.Size(63, 21) + Me.ucrInputSpellLower.TabIndex = 17 + ' + 'ucrInputCondition + ' + Me.ucrInputCondition.AddQuotesIfUnrecognised = True + Me.ucrInputCondition.IsReadOnly = False + Me.ucrInputCondition.Location = New System.Drawing.Point(132, 44) + Me.ucrInputCondition.Name = "ucrInputCondition" + Me.ucrInputCondition.Size = New System.Drawing.Size(97, 21) + Me.ucrInputCondition.TabIndex = 10 + ' + 'ucrInputSpellUpper + ' + Me.ucrInputSpellUpper.AddQuotesIfUnrecognised = True + Me.ucrInputSpellUpper.IsMultiline = False + Me.ucrInputSpellUpper.IsReadOnly = False + Me.ucrInputSpellUpper.Location = New System.Drawing.Point(237, 44) + Me.ucrInputSpellUpper.Name = "ucrInputSpellUpper" + Me.ucrInputSpellUpper.Size = New System.Drawing.Size(63, 21) + Me.ucrInputSpellUpper.TabIndex = 18 + ' 'lblStation ' Me.lblStation.AutoSize = True @@ -203,59 +246,6 @@ Partial Class dlgSpells Me.ucrReceiverDate.TabIndex = 2 Me.ucrReceiverDate.ucrSelector = Nothing ' - 'ucrNudTo - ' - Me.ucrNudTo.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudTo.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudTo.Location = New System.Drawing.Point(237, 14) - Me.ucrNudTo.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudTo.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudTo.Name = "ucrNudTo" - Me.ucrNudTo.Size = New System.Drawing.Size(50, 20) - Me.ucrNudTo.TabIndex = 20 - Me.ucrNudTo.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudFrom - ' - Me.ucrNudFrom.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudFrom.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudFrom.Location = New System.Drawing.Point(63, 14) - Me.ucrNudFrom.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudFrom.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudFrom.Name = "ucrNudFrom" - Me.ucrNudFrom.Size = New System.Drawing.Size(50, 20) - Me.ucrNudFrom.TabIndex = 19 - Me.ucrNudFrom.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrInputSpellLower - ' - Me.ucrInputSpellLower.AddQuotesIfUnrecognised = True - Me.ucrInputSpellLower.IsMultiline = False - Me.ucrInputSpellLower.IsReadOnly = False - Me.ucrInputSpellLower.Location = New System.Drawing.Point(63, 44) - Me.ucrInputSpellLower.Name = "ucrInputSpellLower" - Me.ucrInputSpellLower.Size = New System.Drawing.Size(63, 21) - Me.ucrInputSpellLower.TabIndex = 17 - ' - 'ucrInputCondition - ' - Me.ucrInputCondition.AddQuotesIfUnrecognised = True - Me.ucrInputCondition.IsReadOnly = False - Me.ucrInputCondition.Location = New System.Drawing.Point(132, 44) - Me.ucrInputCondition.Name = "ucrInputCondition" - Me.ucrInputCondition.Size = New System.Drawing.Size(97, 21) - Me.ucrInputCondition.TabIndex = 10 - ' - 'ucrInputSpellUpper - ' - Me.ucrInputSpellUpper.AddQuotesIfUnrecognised = True - Me.ucrInputSpellUpper.IsMultiline = False - Me.ucrInputSpellUpper.IsReadOnly = False - Me.ucrInputSpellUpper.Location = New System.Drawing.Point(237, 44) - Me.ucrInputSpellUpper.Name = "ucrInputSpellUpper" - Me.ucrInputSpellUpper.Size = New System.Drawing.Size(63, 21) - Me.ucrInputSpellUpper.TabIndex = 18 - ' 'ucrReceiverRainfall ' Me.ucrReceiverRainfall.frmParent = Me @@ -285,15 +275,23 @@ Partial Class dlgSpells Me.ucrBase.Size = New System.Drawing.Size(405, 52) Me.ucrBase.TabIndex = 11 ' + 'ucrChkConditional + ' + Me.ucrChkConditional.Checked = False + Me.ucrChkConditional.Location = New System.Drawing.Point(9, 323) + Me.ucrChkConditional.Name = "ucrChkConditional" + Me.ucrChkConditional.Size = New System.Drawing.Size(193, 20) + Me.ucrChkConditional.TabIndex = 17 + ' 'dlgSpells ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(414, 431) + Me.Controls.Add(Me.ucrChkConditional) Me.Controls.Add(Me.lblStation) Me.Controls.Add(Me.ucrReceiverStation) Me.Controls.Add(Me.ucrSaveSpells) - Me.Controls.Add(Me.chkConditionRain) Me.Controls.Add(Me.ucrReceiverDOY) Me.Controls.Add(Me.ucrReceiverYear) Me.Controls.Add(Me.lblYear) @@ -329,7 +327,6 @@ Partial Class dlgSpells Friend WithEvents lblYear As Label Friend WithEvents lblDOY As Label Friend WithEvents ucrReceiverDOY As ucrReceiverSingle - Friend WithEvents chkConditionRain As CheckBox Friend WithEvents grpRainParameters As GroupBox Friend WithEvents ucrInputCondition As ucrInputComboBox Friend WithEvents lblThreshold As Label @@ -342,4 +339,5 @@ Partial Class dlgSpells Friend WithEvents ucrInputSpellUpper As ucrInputTextBox Friend WithEvents ucrNudTo As ucrNud Friend WithEvents ucrNudFrom As ucrNud + Friend WithEvents ucrChkConditional As ucrCheck End Class diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 50d7a0caede..060fa3d69a0 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -24,7 +24,8 @@ Public Class dlgSpells Private clsDayFromAndTo, clsYearGroupDaily As New RFunction Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator As New ROperator Private clsApplyInstatFunction, clsRRainday, clsRRaindayMatch As New RFunction - Private clsRRaindayOperator, clsRRaindayAndOperator, clsRRaindayLowerOperator, clsRRaindayUpperOperator As New ROperator + Private clsRRaindayOperator, clsRRaindayAndOperator, clsRRaindayLowerOperator, clsRRaindayUpperOperator, clsAdditionalConditionReplaceOperator, clsAdditionalConditionReplaceOperator2 As New ROperator + Private clsAdditionalCondition, clsAdditionalConditionList, clsSubSpellLength2, clsAdditionalConditionReplaceFunction As New RFunction Private strCurrDataName As String = "" Private Sub dlgSpells_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -104,6 +105,8 @@ Public Class dlgSpells ucrInputCondition.SetItems({"<= Amount of Rain", "Between", ">= Amount of Rain"}) + ucrChkConditional.SetText("Conditional on Rain at Start of Spell") + ucrSaveSpells.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) ucrSaveSpells.SetLabelText("New Column Name:") ucrSaveSpells.SetIsTextBox() @@ -131,6 +134,12 @@ Public Class dlgSpells clsRRaindayLowerOperator = New ROperator clsRRaindayUpperOperator = New ROperator clsMaxValueFunction = New RFunction + clsAdditionalCondition = New RFunction + clsAdditionalConditionList = New RFunction + clsSubSpellLength2 = New RFunction + clsAdditionalConditionReplaceFunction = New RFunction + clsAdditionalConditionReplaceOperator2 = New ROperator + clsAdditionalConditionReplaceOperator = New ROperator ucrSelectorForSpells.Reset() ucrReceiverDate.SetMeAsReceiver() @@ -162,11 +171,7 @@ Public Class dlgSpells clsRRainday.AddParameter("save", "0", iPosition:=6) ' clsRRainday.AddParameter("function_exp", chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) clsRRaindayMatch.SetRCommand("match") - clsRRaindayMatch.AddParameter("", clsROperatorParameter:=clsRRaindayOperator) - ' We have: match(Rain >= LOWER & Rain <= UPPER, 1, nomatch = 0) - clsRRaindayOperator.SetOperation(",") - clsRRaindayOperator.AddParameter("lower_upper_operators", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) - clsRRaindayOperator.AddParameter("right_side", "1, nomatch = 0", iPosition:=1) + clsRRaindayMatch.AddParameter("x", clsROperatorParameter:=clsRRaindayAndOperator) clsRRaindayAndOperator.SetOperation("&") clsRRaindayAndOperator.AddParameter("lower", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) clsRRaindayLowerOperator.SetOperation(">=") @@ -174,16 +179,29 @@ Public Class dlgSpells clsRRaindayAndOperator.AddParameter("upper", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) clsRRaindayUpperOperator.SetOperation("<=") clsRRaindayUpperOperator.AddParameter("max", 0.85, iPosition:=1) + clsRRaindayMatch.AddParameter("table", "1", iPosition:=1) + clsRRaindayMatch.AddParameter("nomatch", "0", iPosition:=2) + ' We have: match(Rain >= LOWER & Rain <= UPPER, 1, nomatch = 0) ' Spell Length clsSpellLength.SetRCommand("instat_calculation$new") clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34), iPosition:=1) clsSpellLength.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) clsSpellLength.AddParameter("save", 0, iPosition:=6) clsMaxValueManipulation.SetRCommand("list") + ' Additional Checkbox + clsAdditionalCondition.SetRCommand("instat_calculation$new") + clsAdditionalCondition.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsAdditionalCondition.AddParameter("result_name", Chr(34) & "rain_day2" & Chr(34), iPosition:=2) + clsAdditionalCondition.AddParameter("save", 0, iPosition:=6) + clsAdditionalConditionReplaceFunction.SetRCommand("replace") + clsAdditionalConditionReplaceFunction.AddParameter("x", "rain_day", iPosition:=0) + clsAdditionalConditionReplaceFunction.AddParameter("list", ucrNudFrom.Value - 1, iPosition:=1) + clsAdditionalConditionReplaceFunction.AddParameter("values", "0", iPosition:=2) + clsAdditionalConditionList.SetRCommand("list") + 'Max Value clsMaxValue.SetRCommand("instat_calculation$new") clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) @@ -203,6 +221,7 @@ Public Class dlgSpells End Sub Private Sub SetRCodeForControls(bReset As Boolean) + ucrNudFrom.AddAdditionalCodeParameterPair(clsAdditionalConditionReplaceOperator2, New RParameter("list", 0), iAdditionalPairNo:=1) 'For day: ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("day", 0), iAdditionalPairNo:=1) ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) @@ -243,6 +262,32 @@ Public Class dlgSpells clsMaxValue.AddParameter("function_exp", Chr(34) & clsMaxValueFunction.ToScript & Chr(34), iPosition:=1) clsRRainday.AddParameter("function_exp", chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) + If ucrChkConditional.Checked Then + 'clsSpellLength.RemoveParameterByName("function_exp") + 'clsSpellLength.RemoveParameterByName("sub_calculations") + 'clsSubSpellLength1.RemoveParameterByName("sub1") + + clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) + clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) + + clsAdditionalCondition.AddParameter("function_exp", Chr(34) & clsAdditionalConditionReplaceFunction.ToScript & Chr(34)) + clsAdditionalCondition.SetAssignTo("Additional_Condition") + clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day2)-cummax((rain_day2==0)*cumsum(rain_day2))" & Chr(34)) + clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) + clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsAdditionalCondition, bIncludeArgumentName:=False) + Else + clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34), iPosition:=1) + clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) + clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) + + 'clsAdditionalCondition.RemoveParameterByName("function_exp") + 'clsAdditionalCondition.RemoveParameterByName("sub_calculation") + 'clsAdditionalConditionList.RemoveParameterByName("sub1") + 'clsSpellLength.RemoveParameterByName("function_exp") + 'clsSpellLength.RemoveParameterByName("sub_calculations") + '' clsSubSpellLength2.RemoveParameterByName("sub1") + End If + clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=1) ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) End Sub @@ -258,15 +303,15 @@ Public Class dlgSpells ' Case "<= Amount of Rain" ' clsRRaindayOperator.RemoveParameterByName("upper_operators") ' clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") - ' clsRRaindayOperator.AddParameter("lower_operators", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) + ' clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) ' Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) ' clsRRaindayOperator.RemoveParameterByName("upper_operators") ' clsRRaindayOperator.RemoveParameterByName("lower_operators") - ' clsRRaindayOperator.AddParameter("lower_upper_operators", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) + ' clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) ' Case Else ' clsRRaindayOperator.RemoveParameterByName("lower_operators") ' clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") - ' clsRRaindayOperator.AddParameter("upper_operators", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) + ' clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) 'End Select clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) @@ -327,29 +372,15 @@ Public Class dlgSpells Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged TestOKEnabled() End Sub + + Private Sub ucrNudFrom_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudFrom.ControlValueChanged + clsAdditionalConditionReplaceFunction.AddParameter("list", ucrNudFrom.Value - 1, iPosition:=1) + End Sub End Class 'TODO: Make by Year and Station 'TODO: Add functionality for chkbox -' Private Sub SetDefaults() -' ucrSelectorForSpells.Reset() -' ucrSaveSpells.Reset() - -' TestOKEnabled() - -' chkConditionRain.Checked = False -' nudFrom.Value = 1 -' nudTo.Value = 366 -' nudConditionLeft.Value = 0 -' NudConditionRight.Value = 0.85 -' ucrInputCondition.SetName("Between") -' End Sub - -' Private Sub ReopenDialog() - -' End Sub - ' Private Sub DisplayForConditions() ' Select Case ucrInputCondition.GetText ' Case "Between" @@ -361,10 +392,6 @@ End Class ' End Select ' End Sub -' Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset -' SetDefaults() -' End Sub - ' ' nud max and mins. ' Private Sub nudValues() ' ' nudFrom.Maximum = ucrNudTo.Value - 1 @@ -373,110 +400,5 @@ End Class ' 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 ' End Sub -' Private Sub DayFromAndToMethod() - -' End Sub - - - -' Private Sub RainyDaysMethod() -' If chkConditionRain.Checked Then -' clsSpellLength.RemoveParameterByName("function_exp") -' clsSpellLength.RemoveParameterByName("sub_calculations") -' clsSubSpellLength1.RemoveParameterByName("sub1") - -' clsAdditionalCondition.AddParameter("type", Chr(34) & "calculation" & Chr(34)) -' clsAdditionalCondition.AddParameter("function_exp", Chr(34) & "replace(rain_day, " & (nudFrom.Value - 1) & ", 0)" & Chr(34)) -' clsAdditionalCondition.AddParameter("result_name", Chr(34) & "rain_day2" & Chr(34)) -' clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) -' clsAdditionalConditionList.SetRCommand("list") -' clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) -' clsAdditionalCondition.AddParameter("save", 0) - -' clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day2)-cummax((rain_day2==0)*cumsum(rain_day2))" & Chr(34)) -' clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength2) -' clsSubSpellLength2.AddParameter("sub1", clsRFunctionParameter:=clsAdditionalCondition, bIncludeArgumentName:=False) -' Else -' clsAdditionalCondition.RemoveParameterByName("type") -' clsAdditionalCondition.RemoveParameterByName("function_exp") -' clsAdditionalCondition.RemoveParameterByName("result_name") -' clsAdditionalCondition.RemoveParameterByName("sub_calculation") -' clsAdditionalCondition.RemoveParameterByName("save") -' clsAdditionalConditionList.RemoveParameterByName("sub1") -' clsSpellLength.RemoveParameterByName("function_exp") -' clsSpellLength.RemoveParameterByName("sub_calculations") -' clsSubSpellLength2.RemoveParameterByName("sub1") - -' clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34)) -' clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) -' clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) -' End If -' End Sub - -' Private Sub ucrInputCondition_NameChanged() Handles ucrInputCondition.NameChanged -' DisplayForConditions() -' RainyDaysMethod() -' End Sub - -'''''''''''''Private Sub MaxValue() -''''''''''''' clsMaxValueManipulation.SetRCommand("list") -''''''''''''' clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) -''''''''''''' clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - -''''''''''''' clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34)) -''''''''''''' clsMaxValue.AddParameter("function_exp", Chr(34) & "max(Dry_Spell)" & Chr(34)) -''''''''''''' clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation) -''''''''''''' clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList) -''''''''''''' clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False) -''''''''''''' clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34)) -''''''''''''' clsMaxValue.AddParameter("save", 2) -'''''''''''''End Sub - -''''''''''''' Private Sub firstDayofTheYear() -''''''''''''' ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsMaxValue) -''''''''''''' End Sub - -' Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk -' DayFromAndToMethod() -' RainyDaysMethod() -' MaxValue() -' End Sub - -' Private Sub nudToAndFrom_ControlValueChanged(sender As Object, e As EventArgs) Handles nudTo.TextChanged, nudFrom.TextChanged -' nudValues() -' DayFromAndToMethod() -' RainyDaysMethod() -' TestOKEnabled() -' End Sub - -' Private Sub ucrReceiverDOY(sender As Object, e As EventArgs) Handles ucrReceiverDayOfYear.SelectionChanged -' DayFromAndToMethod() -' MaxValue() -' firstDayofTheYear() -' TestOKEnabled() -' End Sub - -' Private Sub ucrReceiverRainfall_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverRainfall.SelectionChanged -' RainyDaysMethod() -' TestOKEnabled() -' End Sub - - -' Private Sub ConditionalRainNuds_valuechanged(sender As Object, e As EventArgs) Handles NudConditionRight.TextChanged, nudConditionLeft.TextChanged -' RainyDaysMethod() -' TestOKEnabled() -' End Sub -' Private Sub chkConditionRain_CheckedChanged(sender As Object, e As EventArgs) Handles chkConditionRain.CheckedChanged -' RainyDaysMethod() -' End Sub - -' Private Sub ucrSaveSpells_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveSpells.ControlContentsChanged -' TestOKEnabled() -' End Sub - -' Private Sub ucrSaveSpells_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveSpells.ControlValueChanged -''''''''''''' clsMaxValue.SetAssignTo(ucrSaveSpells.ucrInputTextSave.GetText) -' MaxValue() -' End Sub 'End Class \ No newline at end of file From b5590efa11e7148c0862c6e93c50e1ff05f1c258 Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 16 Jun 2017 18:24:49 +0100 Subject: [PATCH 048/201] edits --- instat/dlgSpells.vb | 3 --- 1 file changed, 3 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 060fa3d69a0..500f9b1a6fc 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -335,11 +335,8 @@ Public Class dlgSpells End Sub Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged - ' do I need to update this for when the data frame changes? clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) RainyDaysMethod() - ' when rain_day changes, then clsSpellLength changes. So do I need to run everything again when rain_day changes?! - ' No, not if I do Assigns as it's just = the sub? End Sub Private Sub ucrReceivers_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged From e192a311b635b4f1afe7d43f9b57f4edbb4eb1cd Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 16 Jun 2017 19:06:36 +0100 Subject: [PATCH 049/201] Fixes and edits --- instat/dlgSpells.vb | 158 +++++++++++++++++--------------------------- 1 file changed, 60 insertions(+), 98 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 500f9b1a6fc..eb0879fa8aa 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -21,7 +21,7 @@ Public Class dlgSpells Private bReset As Boolean = True Private clsAddKey, clsSpellLength, clsMaxValueManipulation, clsSubSpellLength1 As New RFunction Private clsMaxValue, clsMaxValueList, clsMaxValueFunction As New RFunction - Private clsDayFromAndTo, clsYearGroupDaily As New RFunction + Private clsDayFromAndTo, clsGroupBy, clsAddKeyColName As New RFunction Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator As New ROperator Private clsApplyInstatFunction, clsRRainday, clsRRaindayMatch As New RFunction Private clsRRaindayOperator, clsRRaindayAndOperator, clsRRaindayLowerOperator, clsRRaindayUpperOperator, clsAdditionalConditionReplaceOperator, clsAdditionalConditionReplaceOperator2 As New ROperator @@ -58,6 +58,8 @@ Public Class dlgSpells ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) ucrReceiverRainfall.bAutoFill = True + ucrReceiverStation.SetParameter(New RParameter("station", 1)) + ucrReceiverStation.SetParameterIsString() ucrReceiverStation.Selector = ucrSelectorForSpells ucrReceiverStation.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "station" & Chr(34)}) ucrReceiverStation.bAutoFill = True @@ -66,7 +68,7 @@ Public Class dlgSpells ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) ucrReceiverYear.bAutoFill = True - ucrReceiverDate.SetParameter(New RParameter("col_name", 0)) + ucrReceiverDate.SetParameter(New RParameter("date", 0)) ucrReceiverDate.SetParameterIsString() ucrReceiverDate.Selector = ucrSelectorForSpells ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) @@ -104,8 +106,9 @@ Public Class dlgSpells 'ucrInputCondition.SetItems(dctCondition) ucrInputCondition.SetItems({"<= Amount of Rain", "Between", ">= Amount of Rain"}) + ucrInputCondition.SetDropDownStyleAsNonEditable() - ucrChkConditional.SetText("Conditional on Rain at Start of Spell") + ucrChkConditional.SetText("Conditional on Rain at Start of Spell") ' todo: set default ucrSaveSpells.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) ucrSaveSpells.SetLabelText("New Column Name:") @@ -114,15 +117,12 @@ Public Class dlgSpells ucrSaveSpells.SetSaveTypeAsColumn() End Sub - ' clsSubSpellLength2.SetRCommand("list") - ' clsAdditionalCondition.SetRCommand("instat_calculation$new") - ' clsAdditionalCondition.SetAssignTo("Additional_Condition") - Private Sub SetDefaults() clsApplyInstatFunction = New RFunction clsMaxValueManipulation = New RFunction clsDayFromAndTo = New RFunction - clsYearGroupDaily = New RFunction + clsGroupBy = New RFunction + clsAddKeyColName = New RFunction clsRRainday = New RFunction clsSpellLength = New RFunction clsMaxValue = New RFunction @@ -143,9 +143,12 @@ Public Class dlgSpells ucrSelectorForSpells.Reset() ucrReceiverDate.SetMeAsReceiver() + ucrInputCondition.SetName("<= Amount of Rain") 'TODO set item/name as this ' key clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") + clsAddKey.AddParameter("col_name", clsRFunctionParameter:=clsAddKeyColName) + clsAddKeyColName.SetRCommand("c") 'DayFromandTo clsDayFromAndTo.SetRCommand("instat_calculation$new") @@ -160,8 +163,8 @@ Public Class dlgSpells clsDayToOperator.AddParameter("to", 366) ' Year group - clsYearGroupDaily.SetRCommand("instat_calculation$new") - clsYearGroupDaily.AddParameter("type", Chr(34) & "by" & Chr(34)) + clsGroupBy.SetRCommand("instat_calculation$new") + clsGroupBy.AddParameter("type", Chr(34) & "by" & Chr(34)) ' rain_day clsRRainday.SetRCommand("instat_calculation$new") @@ -210,7 +213,7 @@ Public Class dlgSpells clsMaxValueFunction.AddParameter("x", "Dry_Spell") clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34), iPosition:=3) clsMaxValue.AddParameter("save", 2, iPosition:=6) - clsMaxValue.SetAssignTo(ucrSaveSpells.ucrInputTextSave.GetText) + clsMaxValue.SetAssignTo(ucrSaveSpells.GetText) clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) @@ -233,16 +236,17 @@ Public Class dlgSpells ucrInputSpellLower.SetRCode(clsRRaindayLowerOperator, bReset) ucrInputSpellUpper.SetRCode(clsRRaindayUpperOperator, bReset) - ucrReceiverDate.SetRCode(clsAddKey, bReset) + ucrReceiverStation.SetRCode(clsAddKeyColName, bReset) + ucrReceiverDate.SetRCode(clsAddKeyColName, bReset) ucrSelectorForSpells.SetRCode(clsAddKey, bReset) End Sub Private Sub TestOKEnabled() - 'If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso nudFrom.Text <> "" AndAlso nudTo.Text <> "" AndAlso ucrInputSpellUpper.Text <> "" Then ' and ucrInput is empty - ucrBase.OKEnabled(True) - 'Else - ' ucrBase.OKEnabled(False) - 'End If + If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso ucrNudFrom.GetText = "" AndAlso ucrNudTo.GetText = "" AndAlso ucrInputSpellUpper.Text <> "" Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -254,19 +258,15 @@ Public Class dlgSpells Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining Date column as key") clsDayFromAndTo.SetAssignTo("Day_From_and_To") - clsYearGroupDaily.SetAssignTo("Grouping") + clsGroupBy.SetAssignTo("Grouping") clsMaxValue.SetAssignTo("Spells_Rain") clsSpellLength.SetAssignTo("Dry_Spell") clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) clsMaxValue.AddParameter("function_exp", Chr(34) & clsMaxValueFunction.ToScript & Chr(34), iPosition:=1) - clsRRainday.AddParameter("function_exp", chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) + clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) If ucrChkConditional.Checked Then - 'clsSpellLength.RemoveParameterByName("function_exp") - 'clsSpellLength.RemoveParameterByName("sub_calculations") - 'clsSubSpellLength1.RemoveParameterByName("sub1") - clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) @@ -279,59 +279,46 @@ Public Class dlgSpells clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34), iPosition:=1) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) - - 'clsAdditionalCondition.RemoveParameterByName("function_exp") - 'clsAdditionalCondition.RemoveParameterByName("sub_calculation") - 'clsAdditionalConditionList.RemoveParameterByName("sub1") - 'clsSpellLength.RemoveParameterByName("function_exp") - 'clsSpellLength.RemoveParameterByName("sub_calculations") - '' clsSubSpellLength2.RemoveParameterByName("sub1") End If clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=1) ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) End Sub - 'Setting up the days Private Sub DayBoundaries() clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") End Sub - 'Rainfall set up - Private Sub RainyDaysMethod() ' run when ucrInputcondition changes - 'Select Case ucrInputCondition.GetText - ' Case "<= Amount of Rain" - ' clsRRaindayOperator.RemoveParameterByName("upper_operators") - ' clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") - ' clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) - ' Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) - ' clsRRaindayOperator.RemoveParameterByName("upper_operators") - ' clsRRaindayOperator.RemoveParameterByName("lower_operators") - ' clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) - ' Case Else - ' clsRRaindayOperator.RemoveParameterByName("lower_operators") - ' clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") - ' clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) - 'End Select + Private Sub RainyDaysMethod() clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) End Sub - Private Sub SetGroupByFuncCalcFrom() - Dim strCurrDataName As String = "" - Dim strGroupByCalcFrom As String = "" - strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - If Not ucrReceiverStation.IsEmpty Then - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) - ' strGroupByCalcFrom = "list(" & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames() & ")" - Else - clsMaxValue.RemoveParameterByName("manipulations") - End If - ' If strGroupByCalcFrom <> "" Then - ' clsYearGroupDaily.AddParameter("calculated_from", strGroupByCalcFrom, iPosition:=0) - ' Else - ' clsYearGroupDaily.RemoveParameterByName("calculated_from") - ' End If + Private Sub nudValues() + ' nudFrom.Maximum = ucrNudTo.Value - 1 + ' ucrNudTo.Minimum = nudFrom.Value + 1 + 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 + 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 + End Sub + + Private Sub ucrInputSpellLower_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputSpellLower.ControlValueChanged, ucrInputSpellUpper.ControlValueChanged + Select Case ucrInputCondition.GetText + Case "<= Amount of Rain" + ucrInputSpellUpper.Visible = False + clsRRaindayOperator.RemoveParameterByName("upper_operators") + clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") + clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) + Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) + ucrInputSpellUpper.Visible = True + clsRRaindayOperator.RemoveParameterByName("upper_operators") + clsRRaindayOperator.RemoveParameterByName("lower_operators") + clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) + Case Else + ucrInputSpellUpper.Visible = False + clsRRaindayOperator.RemoveParameterByName("lower_operators") + clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") + clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) + End Select End Sub Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged @@ -355,47 +342,22 @@ Public Class dlgSpells clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub - Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged + Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged ' does this update if I change the data name? - clsYearGroupDaily.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") + Else + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + End If clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) - clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) + clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) End Sub - Private Sub ucrReceiverStation_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverStation.ControlValueChanged - SetGroupByFuncCalcFrom() + Private Sub ucrNudFrom_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudFrom.ControlValueChanged + clsAdditionalConditionReplaceFunction.AddParameter("list", ucrNudFrom.Value - 1, iPosition:=1) End Sub - Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged + Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveSpells.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrNudTo.ControlContentsChanged, ucrInputSpellLower.ControlContentsChanged, ucrInputSpellUpper.ControlContentsChanged TestOKEnabled() End Sub - - Private Sub ucrNudFrom_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudFrom.ControlValueChanged - clsAdditionalConditionReplaceFunction.AddParameter("list", ucrNudFrom.Value - 1, iPosition:=1) - End Sub -End Class - -'TODO: Make by Year and Station -'TODO: Add functionality for chkbox - -' Private Sub DisplayForConditions() -' Select Case ucrInputCondition.GetText -' Case "Between" -' nudConditionLeft.Visible = True -' NudConditionRight.Visible = True -' Case Else -' nudConditionLeft.Visible = True -' NudConditionRight.Visible = False -' End Select -' End Sub - -' ' nud max and mins. -' Private Sub nudValues() -' ' nudFrom.Maximum = ucrNudTo.Value - 1 -' ' ucrNudTo.Minimum = nudFrom.Value + 1 -' 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 -' 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 -' End Sub - - -'End Class \ No newline at end of file +End Class \ No newline at end of file From 1c4e9ae1256127ec5833220585bde4556f4a9bc3 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Fri, 16 Jun 2017 19:07:25 +0100 Subject: [PATCH 050/201] updated RSyntax to include multiple code structures replaced all new lines with Environment.NewLine Corrected bug in ToScript on buttons control --- instat/clsBlockReader.vb | 4 +- instat/clsRCodeStructure.vb | 41 +- instat/clsRLink.vb | 40 +- instat/clsRParameter.vb | 7 + instat/clsRSyntax.vb | 139 ++++++- instat/clsRecentFiles.vb | 4 +- instat/dlgContrasts.vb | 38 +- instat/dlgHistogram.vb | 1 + instat/dlgImportDataset.vb | 694 +++++++++++++++---------------- instat/frmEditor.vb | 18 +- instat/frmMain.vb | 14 +- instat/sdgCombineGraphOptions.vb | 8 +- instat/ucrButtons.vb | 144 +++++-- instat/ucrDataView.vb | 64 +-- instat/ucrFactor.vb | 382 ++++++++--------- instat/ucrInputComboBox.vb | 214 +++++----- instat/ucrInputTextBox.vb | 26 +- instat/ucrScript.vb | 2 +- instat/ucrWPFRichTextBox.xaml.vb | 2 +- 19 files changed, 1028 insertions(+), 814 deletions(-) diff --git a/instat/clsBlockReader.vb b/instat/clsBlockReader.vb index a3195c463b6..f84ec865508 100644 --- a/instat/clsBlockReader.vb +++ b/instat/clsBlockReader.vb @@ -21,7 +21,7 @@ Public Class BlockReader '[17:09:37] François Renaud: Also for the moment secondary and main R commands generated within a dialogue are in separate blocks, but this needs to be addressed from the point of view of RSyntax, Runscript, Output and BlockSelector before BlockReader get's edited. '[1711:29] Danny Parsons: yes that will all be In RSyntax '[17:11:50] Danny Parsons: although we will Then need a way To remove output from a block As there will be output between commands - '[17:20:11] François Renaud: aiaa, yes, that's true. Ok, I m thinking, maybe the easiest is to have different layers, runscript blocks and dialogue blocks. Output's can be padded with another type of symbol as vbcrlf or we could even imagine to have signatures provided by each dialogue... this would facilitate the repopulation of the dialogue when clicking on a block. + '[17:20:11] François Renaud: aiaa, yes, that's true. Ok, I m thinking, maybe the easiest is to have different layers, runscript blocks and dialogue blocks. Output's can be padded with another type of symbol as Environment.NewLine or we could even imagine to have signatures provided by each dialogue... this would facilitate the repopulation of the dialogue when clicking on a block. Private strComment As String 'The comment that is part of the block. 'Warning: only one comment per bloc for now... will need to go over this when secondary R-commands are taken in the same block. Private lstRCommands As List(Of RParameter) 'The list of RParameters that store the information about the RCommands. @@ -52,7 +52,7 @@ Public Class BlockReader Public Sub ReadBlock(strBlockText As String) 'This sub reads the block of text coming from the output window. 'need more commenting Dim lstLines As String() - lstLines = strBlockText.Split(vbCrLf) + lstLines = strBlockText.Split(Environment.NewLine) If lstRCommands Is Nothing Then lstRCommands = New List(Of RParameter) End If diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index b42a4f22e0e..a40a285dc55 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -39,6 +39,21 @@ Public Class RCodeStructure Public bInsertColumnBefore As Boolean = False Public clsParameters As New List(Of RParameter) Private iNumberOfAddedParameters As Integer = 0 'This might be temporary, it enables to have a default name for parameters... + 'Currently only used when this is in RSyntax as a before/after code to determine position code should be run in the list + 'Similar behaviour to parameter positions + Public iPosition = -1 + + 'Currently only used when this is in RSyntax as a before/after code to determine position code should be run in the list + 'This is because RSyntax has iCallType & bExcludeAssignedFunctionOutput which it uses for the base code + 'Eventually migrate these out of RSyntax + Public iCallType As Integer = 0 + Public bExcludeAssignedFunctionOutput As Boolean = True + + 'The name this code is represented by in the R global environment + 'This is used to clear the global environment of unused variables + 'Will be cleared after running unless bClearFromGlobal = False + Public strGlobalVariableName As String = "" + Public bClearFromGlobal As Boolean = False Public Event ParametersChanged() @@ -108,7 +123,8 @@ Public Class RCodeStructure If Not frmMain.clsRLink.bInstatObjectExists Then frmMain.clsRLink.CreateNewInstatObject() End If - strScript = strScript & strAssignTo & " <- " & strTemp & vbCrLf + strGlobalVariableName = strAssignTo + strScript = strScript & strAssignTo & " <- " & strTemp & Environment.NewLine If Not strAssignToDataFrame = "" AndAlso (Not strAssignToColumn = "" OrElse bAssignToColumnWithoutNames) Then clsAddColumns.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") clsAddColumns.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) @@ -130,7 +146,7 @@ Public Class RCodeStructure clsAddColumns.AddParameter("before", "FALSE") End If End If - strScript = strScript & clsAddColumns.ToScript() & vbCrLf + strScript = strScript & clsAddColumns.ToScript() & Environment.NewLine clsGetColumns.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_columns_from_data") clsGetColumns.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) @@ -145,7 +161,7 @@ Public Class RCodeStructure clsAddModels.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) clsGetModels.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) End If - strScript = strScript & clsAddModels.ToScript() & vbCrLf + strScript = strScript & clsAddModels.ToScript() & Environment.NewLine clsGetModels.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_models") clsGetModels.AddParameter("model_name", Chr(34) & strAssignToModel & Chr(34)) @@ -158,7 +174,7 @@ Public Class RCodeStructure clsAddGraphs.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) clsGetGraphs.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) End If - strScript = strScript & clsAddGraphs.ToScript() & vbCrLf + strScript = strScript & clsAddGraphs.ToScript() & Environment.NewLine clsGetGraphs.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_graphs") clsGetGraphs.AddParameter("graph_name", Chr(34) & strAssignToGraph & Chr(34)) @@ -171,7 +187,7 @@ Public Class RCodeStructure clsAddTables.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) clsGetTables.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) End If - strScript = strScript & clsAddTables.ToScript() & vbCrLf + strScript = strScript & clsAddTables.ToScript() & Environment.NewLine clsGetTables.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_tables") clsGetTables.AddParameter("table_name", Chr(34) & strAssignToTable & Chr(34)) @@ -181,7 +197,7 @@ Public Class RCodeStructure clsDataList.SetRCommand("list") clsDataList.AddParameter(strAssignToDataFrame, strAssignTo) clsAddData.AddParameter("data_tables", clsRFunctionParameter:=clsDataList) - strScript = strScript & clsAddData.ToScript() & vbCrLf + strScript = strScript & clsAddData.ToScript() & Environment.NewLine clsGetData.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_data_frame") clsGetData.AddParameter("data_name", Chr(34) & strAssignToDataFrame & Chr(34)) @@ -367,6 +383,17 @@ Public Class RCodeStructure Public Overridable Function Clone() As RCodeStructure Dim clsTemp As New RCodeStructure Return clsTemp - End Function + End Function + Public Function GetAllAssignTo(lstAssignTo As List(Of String)) As List(Of String) + SortParameters() + If strGlobalVariableName <> "" AndAlso Not lstAssignTo.Contains(strGlobalVariableName) Then + lstAssignTo.Add(strGlobalVariableName) + strGlobalVariableName = "" + End If + For Each clsTempParam As RParameter In clsParameters + clsTempParam.GetAllAssignTo(lstAssignTo) + Next + Return lstAssignTo + End Function End Class diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 5442139bccf..e5e1e9ad49d 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -55,13 +55,13 @@ Public Class RLink Try REngine.SetEnvironmentVariables() Catch ex As Exception - MsgBox(ex.Message & vbNewLine & "Ensure that the correct version of R is installed and restart the program.", MsgBoxStyle.Critical, "Cannot initialise R Link.") + MsgBox(ex.Message & Environment.NewLine & "Ensure that the correct version of R is installed and restart the program.", MsgBoxStyle.Critical, "Cannot initialise R Link.") Application.Exit() End Try Try clsEngine = REngine.GetInstance() Catch ex As Exception - MsgBox(ex.Message & vbNewLine & "Ensure that the correct version of R is installed and restart the program.", MsgBoxStyle.Critical, "Cannot initialise R Link.") + MsgBox(ex.Message & Environment.NewLine & "Ensure that the correct version of R is installed and restart the program.", MsgBoxStyle.Critical, "Cannot initialise R Link.") Application.Exit() End Try clsEngine.Initialize() @@ -255,7 +255,7 @@ Public Class RLink End If If bOutput Then If strComment <> "" AndAlso bShowCommands Then - rtbOutput.AppendText(clrComments, fComments, strComment & Environment.NewLine, clrScript, fScript, strScript & Environment.NewLine) + rtbOutput.AppendText(clrComments, fComments, strComment & Environment.NewLine, clrScript, fScript, strScript.TrimEnd(Environment.NewLine.ToCharArray) & Environment.NewLine) Else If strComment <> "" Then rtbOutput.AppendText(clrComments, fComments, strComment & Environment.NewLine, clrScript) @@ -267,7 +267,7 @@ Public Class RLink End If '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." & vbNewLine & strScript & vbNewLine & vbNewLine & "It may be possible to run the command directly in R.", MsgBoxStyle.Critical, "Cannot run command") + ' 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 iCallType = 0 OrElse iCallType = 3 Then Try If iCallType = 3 Then @@ -298,7 +298,7 @@ Public Class RLink lstTempGraphFiles = FileIO.FileSystem.GetFiles(strTempGraphsDirectory) Catch e As Exception lstTempGraphFiles = Nothing - MsgBox(e.Message & vbNewLine & "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) + 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) @@ -313,14 +313,14 @@ Public Class RLink Try My.Computer.FileSystem.DeleteFile(strFileName) Catch e As Exception - MsgBox(e.Message & vbNewLine & "A problem occured in attempting to delete the temporary file: " & strFileName & " The possible exceptions are described here: https://msdn.microsoft.com/en-us/library/tdx72k4b.aspx", MsgBoxStyle.Critical) + MsgBox(e.Message & Environment.NewLine & "A problem occured in attempting to delete the temporary file: " & strFileName & " The possible exceptions are described here: https://msdn.microsoft.com/en-us/library/tdx72k4b.aspx", MsgBoxStyle.Critical) End Try Next End If End If End If Catch e As Exception - MsgBox(e.Message & vbNewLine & "The error occurred in attempting to run the following R command(s):" & vbNewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + 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 @@ -332,21 +332,21 @@ Public Class RLink End If Catch e As Exception - MsgBox(e.Message & vbNewLine & "The error occurred in attempting to run the following R command(s):" & vbNewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + 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 - If strScript.Trim(Environment.NewLine).LastIndexOf(Environment.NewLine) = -1 Then + If strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray) = -1 Then strCapturedScript = "capture.output(" & strScript & ")" Else - strSplitScript = Left(strScript, strScript.Trim(Environment.NewLine).LastIndexOf(Environment.NewLine)) + strSplitScript = Left(strScript, strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray)) If strSplitScript <> "" Then Try clsEngine.Evaluate(strSplitScript) Catch e As Exception - MsgBox(e.Message & vbNewLine & "The error occurred in attempting to run the following R command(s):" & vbNewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + 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 - strSplitScript = Right(strScript, strScript.Length - strScript.Trim(Environment.NewLine).LastIndexOf(Environment.NewLine) - 2) + strSplitScript = Right(strScript, strScript.Length - strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray) - 2) strCapturedScript = "capture.output(" & strSplitScript & ")" End If Try @@ -354,7 +354,7 @@ Public Class RLink strTemp = String.Join(Environment.NewLine, temp.AsCharacter()) strOutput = strOutput & strTemp & Environment.NewLine Catch e As Exception - MsgBox(e.Message & vbNewLine & "The error occurred in attempting to run the following R command(s):" & vbNewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + 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 If bOutput AndAlso strOutput IsNot Nothing AndAlso strOutput <> "" Then @@ -377,7 +377,7 @@ Public Class RLink expTemp = Nothing strCommand = strVariableName & "<-" & strScript 'If strCommand.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." & vbNewLine & strScript & vbNewLine & vbNewLine & "It may be possible to run the command directly in R.", MsgBoxStyle.Critical, "Cannot run command") + '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 clsEngine IsNot Nothing Then Try 'iRemaining = strScript.Length @@ -385,14 +385,14 @@ Public Class RLink 'While iRemaining > 1000 ' iSplitIndex = strScript.Substring(iStartPoint).IndexOf(",") + iStartPoint ' iRemaining = strScript.Length - iSplitIndex - ' strScript = strScript.Insert(iSplitIndex + 1, vbNewLine) + ' strScript = strScript.Insert(iSplitIndex + 1, Environment.NewLine) ' iStartPoint = iSplitIndex + 1000 'End While clsEngine.Evaluate(strCommand) expTemp = clsEngine.GetSymbol(strVariableName) Catch ex As Exception If Not bSilent Then - MsgBox(ex.Message & vbNewLine & "The error occurred in attempting to run the following R command(s):" & vbNewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + MsgBox(ex.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 If End Try End If @@ -408,7 +408,7 @@ Public Class RLink chrTemp = expTemp.AsCharacter() Catch ex As Exception If Not bSilent Then - MsgBox(ex.Message & vbNewLine & "The error occurred in attempting to run the following R command(s):" & vbNewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + MsgBox(ex.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 If chrTemp = Nothing End Try @@ -422,7 +422,7 @@ Public Class RLink strCommand = strVariableName & "<-" & strScript 'If strCommand.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." & vbNewLine & strScript & vbNewLine & vbNewLine & "It may be possible to run the command directly in R.", MsgBoxStyle.Critical, "Cannot run command") + ' 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") ' Return False If clsEngine IsNot Nothing Then Try @@ -430,7 +430,7 @@ Public Class RLink 'While iRemaining > 1000 ' iSplitIndex = strScript.Substring(1000).IndexOf(",") ' iRemaining = strScript.Length - iSplitIndex - ' strScript = strScript.Insert(iSplitIndex + 1, vbNewLine) + ' strScript = strScript.Insert(iSplitIndex + 1, Environment.NewLine) 'End While If strVariableName <> "" Then clsEngine.Evaluate(strVariableName & "<-" & strScript) @@ -440,7 +440,7 @@ Public Class RLink Return True Catch ex As Exception If Not bSilent Then - MsgBox(ex.Message & vbNewLine & "The error occurred in attempting to run the following R command(s):" & vbNewLine & strScript, MsgBoxStyle.Critical, "Error running R command(s)") + MsgBox(ex.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 If Return False End Try diff --git a/instat/clsRParameter.vb b/instat/clsRParameter.vb index 6b79e97fbce..fbb4d22bdad 100644 --- a/instat/clsRParameter.vb +++ b/instat/clsRParameter.vb @@ -132,4 +132,11 @@ Public Class RParameter End If Return clsTempRParam End Function + + Public Function GetAllAssignTo(lstAssignTo As List(Of String)) As List(Of String) + If bIsFunction OrElse bIsOperator Then + clsArgumentCodeStructure.GetAllAssignTo(lstAssignTo) + End If + Return lstAssignTo + End Function End Class \ No newline at end of file diff --git a/instat/clsRSyntax.vb b/instat/clsRSyntax.vb index 4d746851b4f..71bbcd3be29 100644 --- a/instat/clsRSyntax.vb +++ b/instat/clsRSyntax.vb @@ -14,9 +14,8 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . - Public Class RSyntax - 'RSyntax is intended to store all the R-commands that are raised by the activity of a dialogue. + 'RSyntax is intended to store all the R-commands that are raised by the activity of a dialog. 'So far, it consists in a main R-command (Base), that takes the form of: '- an "RFunction", dealing with R-commands of the form __(__=__, __=__, ...), '- "ROperator", dealing with R-commands of the form: __+__, @@ -28,12 +27,16 @@ Public Class RSyntax Public clsBaseCommandString As New RCodeStructure Public strCommandString As String = "" + 'Lists of code structures which run before/after the the base code + Public lstBeforeCodes As New List(Of RCodeStructure) + Public lstAfterCodes As New List(Of RCodeStructure) + Public bUseBaseFunction As Boolean = False Public bUseBaseOperator As Boolean = False Public bUseCommandString As Boolean = False 'Above, the three types of Base R-commands, and their associated "radio bottons booleans". Public iCallType As Integer = 0 - Public bHTMLOutput As Boolean = False + Public bHTMLOutput As Boolean = False Public strScript As String Public i As Integer Public bExcludeAssignedFunctionOutput As Boolean = True @@ -57,14 +60,17 @@ Public Class RSyntax End If End Sub + 'Both SetFunction and SetBaseRFunction set the Base R-command to the RFunction type, + 'and set the clsBaseFunction by giving respectively the desired RFunction as parameter, or the R-command that characterizes the desired RFunction as parameter. Public Sub SetBaseRFunction(clsFunction As RFunction) clsBaseFunction = clsFunction bUseBaseFunction = True bUseBaseOperator = False bUseCommandString = False End Sub - 'Both SetFunction and SetBaseRFunction set the Base R-command to the RFunction type, - 'and set the clsBaseFunction by giving respectively the desired RFunction as parameter, or the R-command that characterizes the desired RFunction as parameter. + + 'Similarly, both SetBaseROperator and SetOperation set the Base R-command to the ROperator type, + 'and set the clsBaseOperator by giving respectively the desired ROperator itself as parameter, or the desired R-command that characterize the desired ROperator as parameters. Public Sub SetBaseROperator(clsOperator As ROperator) clsBaseOperator = clsOperator bUseBaseFunction = False @@ -78,15 +84,14 @@ Public Class RSyntax bUseBaseOperator = True bUseCommandString = False End Sub - 'Similarly, both SetBaseROperator and SetOperation set the Base R-command to the ROperator type, - 'and set the clsBaseOperator by giving respectively the desired ROperator itself as parameter, or the desired R-command that characterize the desired ROperator as parameters. + + 'In the string case, the class used for the Base R-command is simply a string... Public Sub SetCommandString(strCommand As String) strCommandString = strCommand bUseBaseFunction = False bUseBaseOperator = False bUseCommandString = True End Sub - 'In the string case, the class used for the Base R-command is simply a string... Public Sub SetAssignTo(strAssignToName As String, Optional strTempDataframe As String = "", Optional strTempColumn As String = "", Optional strTempModel As String = "", Optional strTempGraph As String = "", Optional bAssignToIsPrefix As Boolean = False, Optional bAssignToColumnWithoutNames As Boolean = False, Optional bInsertColumnBefore As Boolean = False) If bUseBaseOperator Then @@ -167,14 +172,12 @@ Public Class RSyntax clsFunction.ClearParameters() End Sub - Public Function GetScript() As String - + Public Function GetScript() As String Dim strTemp As String = "" If bUseBaseFunction Then strTemp = clsBaseFunction.ToScript(strScript) - End If - If bUseBaseOperator Then + ElseIf bUseBaseOperator Then strTemp = clsBaseOperator.ToScript(strScript) ElseIf bUseCommandString Then strTemp = clsBaseCommandString.ToScript(strScript, strCommandString) @@ -188,6 +191,86 @@ Public Class RSyntax Return strScript & strTemp End Function + Private Function GetScriptsFromCodeList(lstCodes As List(Of RCodeStructure)) As List(Of String) + Dim strScript As String = "" + Dim strTemp As String = "" + Dim lstScripts As New List(Of String) + + For Each clsTempCode In lstCodes + 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 + lstScripts.Add(strScript) + Else + lstScripts.Add(strScript & strTemp) + End If + Next + Return lstScripts + End Function + + Public Function GetBeforeCodesScripts() As List(Of String) + lstBeforeCodes.Sort(AddressOf CompareCodePositions) + Return GetScriptsFromCodeList(lstBeforeCodes) + End Function + + Public Function GetBeforeCodes() As List(Of RCodeStructure) + lstBeforeCodes.Sort(AddressOf CompareCodePositions) + Return lstBeforeCodes + End Function + + Public Function GetAfterCodesScripts() As List(Of String) + lstAfterCodes.Sort(AddressOf CompareCodePositions) + Return GetScriptsFromCodeList(lstAfterCodes) + End Function + + Public Function GetAfterCodes() As List(Of RCodeStructure) + lstAfterCodes.Sort(AddressOf CompareCodePositions) + Return lstAfterCodes + End Function + + Public Function GetAllAssignTo(lstAssignTo As List(Of String)) As List(Of String) + If bUseBaseFunction Then + If clsBaseFunction.strGlobalVariableName <> "" AndAlso Not lstAssignTo.Contains(clsBaseFunction.strGlobalVariableName) Then + clsBaseFunction.GetAllAssignTo(lstAssignTo) + End If + ElseIf bUseBaseOperator Then + If clsBaseOperator.strGlobalVariableName <> "" AndAlso Not lstAssignTo.Contains(clsBaseOperator.strGlobalVariableName) Then + clsBaseOperator.GetAllAssignTo(lstAssignTo) + End If + ElseIf bUseCommandString Then + If clsBaseCommandString.strGlobalVariableName <> "" AndAlso Not lstAssignTo.Contains(clsBaseCommandString.strGlobalVariableName) Then + clsBaseCommandString.GetAllAssignTo(lstAssignTo) + End If + End If + lstBeforeCodes.Sort(AddressOf CompareCodePositions) + For Each clsTempCode As RCodeStructure In lstBeforeCodes + clsTempCode.GetAllAssignTo(lstAssignTo) + Next + lstAfterCodes.Sort(AddressOf CompareCodePositions) + For Each clsTempCode As RCodeStructure In lstAfterCodes + clsTempCode.GetAllAssignTo(lstAssignTo) + Next + Return lstAssignTo + End Function + + Public Sub SortParameters() + 'This sub is used to reorder the parameters according to their Position property. + 'It will be called only in places where it is necessary ie before ToScript or RemoveAdditionalParameters in ROperator. + End Sub + + Private Function CompareCodePositions(ByVal clsMain As RCodeStructure, ByVal clsRelative As RCodeStructure) As Integer + 'Compares two RParameters according to their Position property. If x is "smaller" than y, then return -1, if they are "equal" return 0 else return 1. + If clsMain.iPosition = clsRelative.iPosition Then + Return 0 + ElseIf clsRelative.iPosition = -1 Then + Return -1 + ElseIf clsMain.iPosition = -1 Then + Return 1 + Else + Return clsMain.iPosition.CompareTo(clsRelative.iPosition) + End If + End Function + Public Function GetbIsAssigned() As Boolean If bUseBaseFunction Then Return clsBaseFunction.bIsAssigned @@ -299,4 +382,36 @@ Public Class RSyntax clsBaseCommandString.strAssignToDataFrame = strNew End If End Sub + + Public Function BeforeCodesContain(clsNewRCode As RCodeStructure) As Boolean + Return lstBeforeCodes.Contains(clsNewRCode) + End Function + + Public Function AfterCodesContain(clsNewRCode As RCodeStructure) As Boolean + Return lstAfterCodes.Contains(clsNewRCode) + End Function + + Public Sub AddToBeforeCodes(clsNewRCode As RCodeStructure, Optional iPos As Integer = -1) + If Not BeforeCodesContain(clsNewRCode) Then + lstBeforeCodes.Add(clsNewRCode) + End If + lstBeforeCodes.Find(Function(x) x.Equals(clsNewRCode)).iPosition = iPos + End Sub + + Public Sub AddToAfterCodes(clsNewRCode As RCodeStructure, Optional iPos As Integer = -1) + If Not AfterCodesContain(clsNewRCode) Then + lstAfterCodes.Add(clsNewRCode) + clsNewRCode.iPosition = iPos + Else + lstAfterCodes.Find(Function(x) x.Equals(clsNewRCode)).iPosition = iPos + End If + End Sub + + Public Sub RemoveFromBeforeCodes(clsNewRCode As RCodeStructure) + lstBeforeCodes.Remove(clsNewRCode) + End Sub + + Public Sub RemoveFromAfterCodes(clsNewRCode As RCodeStructure) + lstAfterCodes.Remove(clsNewRCode) + End Sub End Class \ No newline at end of file diff --git a/instat/clsRecentFiles.vb b/instat/clsRecentFiles.vb index 59de23d9bc9..6ad1b96db76 100644 --- a/instat/clsRecentFiles.vb +++ b/instat/clsRecentFiles.vb @@ -50,7 +50,7 @@ Public Class clsRecentFiles File.WriteAllText(strRecentFilesPath, "") 'Write each item to the file... For Each sPath In strListMRU - File.AppendAllText(strRecentFilesPath, sPath & vbCrLf) + File.AppendAllText(strRecentFilesPath, sPath & Environment.NewLine) Next End Sub @@ -153,7 +153,7 @@ Public Class clsRecentFiles dlgImportDataset.strFilePathToUseOnLoad = DirectCast(sender, ToolStripItem).Tag.ToString().Substring(4) dlgImportDataset.ShowDialog() Else - iResult = MessageBox.Show(frmMain, "Error: File not accessible. It may have been renamed, moved or deleted." & vbNewLine & vbNewLine & "Would you like to remove this file from the list?", "Error accessing file", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) + iResult = MessageBox.Show(frmMain, "Error: File not accessible. It may have been renamed, moved or deleted." & Environment.NewLine & Environment.NewLine & "Would you like to remove this file from the list?", "Error accessing file", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) 'removes the path to the non existent file If iResult = DialogResult.Yes Then strListMRU.RemoveAt(strListMRU.FindLastIndex(Function(value As String) diff --git a/instat/dlgContrasts.vb b/instat/dlgContrasts.vb index 88fc24aaae6..81775161415 100644 --- a/instat/dlgContrasts.vb +++ b/instat/dlgContrasts.vb @@ -15,7 +15,7 @@ ' along with this program. If not, see . Imports instat.Translations Imports RDotNet -Imports unvell.ReoGrid +Imports unvell.ReoGrid Imports unvell.ReoGrid.Events Public Class dlgContrasts @@ -30,9 +30,9 @@ Public Class dlgContrasts InitializeComponent() ' Add any initialization after the InitializeComponent() call. - grdLayoutForContrasts.SetSettings(WorkbookSettings.View_ShowSheetTabControl, False) - grdLayoutForContrasts.SetSettings(WorkbookSettings.View_ShowHorScroll, False) - grdLayoutForContrasts.SheetTabNewButtonVisible = False + grdLayoutForContrasts.SetSettings(WorkbookSettings.View_ShowSheetTabControl, False) + grdLayoutForContrasts.SetSettings(WorkbookSettings.View_ShowHorScroll, False) + grdLayoutForContrasts.SheetTabNewButtonVisible = False grdCurrSheet = grdLayoutForContrasts.CurrentWorksheet grdCurrSheet.SetSettings(WorksheetSettings.Edit_DragSelectionToMoveCells, False) grdCurrSheet.SelectionForwardDirection = SelectionForwardDirection.Down @@ -109,16 +109,16 @@ Public Class dlgContrasts clsSetContrast.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$set_contrasts_of_factor") ucrBase.clsRsyntax.SetBaseRFunction(clsSetContrast) - End Sub - + End Sub + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeforControls(True) + SetDefaults() + SetRCodeforControls(True) TestOKEnabled() End Sub - Public Sub SetMatrixFunction() - Dim i As Integer + Public Sub SetMatrixFunction() + Dim i As Integer Dim j As Integer Dim strMatrix As String = "" If IsEmptyCells() OrElse ucrReceiverForContrasts.IsEmpty OrElse ucrInputContrastName.GetText <> "User Defined" Then @@ -164,14 +164,14 @@ Public Class dlgContrasts End Sub Private Sub grdCurrSheet_AfterCellEdit(sender As Object, e As CellAfterEditEventArgs) Handles grdCurrSheet.AfterCellEdit - If e.NewData.ToString() <> "" Then - If Not IsNumeric(e.NewData) Then - MsgBox("Invalid value: " & e.NewData.ToString() & vbNewLine & "You entered a non numeric value. Please enter a numeric value ", MsgBoxStyle.Exclamation, "Invalid Value") - e.EndReason = EndEditReason.Cancel - ElseIf e.NewData Is Nothing Then - MsgBox("All the cells in the grid must not be empty", MsgBoxStyle.Exclamation) + If e.NewData.ToString() <> "" Then + If Not IsNumeric(e.NewData) Then + MsgBox("Invalid value: " & e.NewData.ToString() & Environment.NewLine & "You entered a non numeric value. Please enter a numeric value ", MsgBoxStyle.Exclamation, "Invalid Value") e.EndReason = EndEditReason.Cancel - End If + ElseIf e.NewData Is Nothing Then + MsgBox("All the cells in the grid must not be empty", MsgBoxStyle.Exclamation) + e.EndReason = EndEditReason.Cancel + End If End If End Sub @@ -191,8 +191,8 @@ Public Class dlgContrasts TestOKEnabled() End Sub - Private Sub grdLayoutForContrasts_Leave(sender As Object, e As EventArgs) Handles grdLayoutForContrasts.Leave - If grdCurrSheet.IsEditing Then + Private Sub grdLayoutForContrasts_Leave(sender As Object, e As EventArgs) Handles grdLayoutForContrasts.Leave + If grdCurrSheet.IsEditing Then grdCurrSheet.EndEdit(EndEditReason.NormalFinish) End If End Sub diff --git a/instat/dlgHistogram.vb b/instat/dlgHistogram.vb index 583df84787f..f4a09c7a87a 100644 --- a/instat/dlgHistogram.vb +++ b/instat/dlgHistogram.vb @@ -215,6 +215,7 @@ Public Class dlgHistogram TempOptionsDisabledInMultipleVariablesCase() End Sub + 'TODO remove vbCr not compatible with other code Private Sub rdoHistogram_KeyPress(sender As Object, e As KeyPressEventArgs) Handles rdoHistogram.KeyPress If e.KeyChar = vbCr Then rdoHistogram.Checked = True diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 5c54144c7be..130b90ed60d 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -1,115 +1,115 @@ -' Instat-R -' Copyright (C) 2015 -' -' 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 k -' along with this program. If not, see . -Imports instat.Translations -Imports System.IO -Imports RDotNet -Imports System.ComponentModel - -Public Class dlgImportDataset - +' Instat-R +' Copyright (C) 2015 +' +' 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 k +' along with this program. If not, see . +Imports instat.Translations +Imports System.IO +Imports RDotNet +Imports System.ComponentModel + +Public Class dlgImportDataset + Private intLines As Integer Private clsReadCSV, clsReadRDS, clsImportRDS, clsReadXL As RFunction - Private strTempWorkbookName As String - Dim bFirstLoad As Boolean - Public bFromLibrary As Boolean - Dim strLibraryPath As String - Dim strFileType As String - Dim bCanImport As Boolean - Dim bComponentsInitialised As Boolean + Private strTempWorkbookName As String + Dim bFirstLoad As Boolean + Public bFromLibrary As Boolean + Dim strLibraryPath As String + Dim strFileType As String + Dim bCanImport As Boolean + Dim bComponentsInitialised As Boolean Public bStartOpenDialog As Boolean Public strFilePathToUseOnLoad As String - Public Sub New() - - ' This call is required by the designer. - InitializeComponent() - - ' Add any initialization after the InitializeComponent() call. - intLines = 10 - clsReadCSV = New RFunction - clsReadRDS = New RFunction - clsImportRDS = New RFunction + Public Sub New() + + ' This call is required by the designer. + InitializeComponent() + + ' Add any initialization after the InitializeComponent() call. + intLines = 10 + clsReadCSV = New RFunction + clsReadRDS = New RFunction + clsImportRDS = New RFunction clsReadXL = New RFunction 'clsTempWorkbookImport = New RFunction 'clsTempExcelPreview = New RFunction - ucrBase.clsRsyntax.SetFunction("import") + ucrBase.clsRsyntax.SetFunction("import") ucrBase.clsRsyntax.SetPackageName("rio") - clsImportRDS.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_RDS") - bFirstLoad = True - bFromLibrary = False - strLibraryPath = frmMain.strStaticPath & "\Library" - bCanImport = True - bComponentsInitialised = True - bStartOpenDialog = True + clsImportRDS.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_RDS") + bFirstLoad = True + bFromLibrary = False + strLibraryPath = frmMain.strStaticPath & "\Library" + bCanImport = True + bComponentsInitialised = True + bStartOpenDialog = True ucrInputName.bAutoChangeOnLeave = True - strFilePathToUseOnLoad = "" - End Sub - - Private Sub dlgImportDataset_Load(sender As Object, e As EventArgs) Handles MyBase.Load - autoTranslate(Me) - Me.Show() - If bFirstLoad Then - InitialiseDialog() - SetDefaults() - bFirstLoad = False - End If + strFilePathToUseOnLoad = "" + End Sub + + Private Sub dlgImportDataset_Load(sender As Object, e As EventArgs) Handles MyBase.Load + autoTranslate(Me) + Me.Show() + If bFirstLoad Then + InitialiseDialog() + SetDefaults() + bFirstLoad = False + End If If strFilePathToUseOnLoad <> "" Then SetDialogWithFile(strFilePathToUseOnLoad) bStartOpenDialog = False - ElseIf bStartOpenDialog Then - GetFileFromOpenDialog() + ElseIf bStartOpenDialog Then + GetFileFromOpenDialog() bStartOpenDialog = False - End If - TestOkEnabled() - End Sub - - Private Sub InitialiseDialog() - ucrBase.iHelpTopicID = 11 - 'Removes the Sheet Tab control - grdDataPreview.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, False) - grdDataPreview.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_AutoFormatCell, False) - ucrInputName.SetValidationTypeAsRVariable() - strTempWorkbookName = "temp_workbook" - - 'temp disabled until can easily switch between fread and read.csv - rdoRowNamesYes.Enabled = False - 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator - ucrInputSeparator.Enabled = False - - 'hide since no longer using openxlsx package - ucrInputNamedRegions.Hide() - lblNamedRegion.Hide() - - ucrInputFilePath.IsReadOnly = True - - 'xl options settings - nudxlRowsToSkip.Maximum = Integer.MaxValue - - 'csv options settings - clsReadCSV.AddParameter("check.names", "TRUE") - ucrInputEncoding.SetItems({"unknown"}) - ucrInputSeparator.SetItems({"Automatic", ",", "Whitespace", ":", ";", "|", "^"}) - ucrInputHeaders.SetItems({"Automatic", "Yes", "No"}) - ucrInputDecimal.SetItems({"Automatic", ".", ","}) - nudSkip.Maximum = Integer.MaxValue - End Sub - - Private Sub SetDefaults() - grpCSV.Hide() - grpRDS.Hide() + End If + TestOkEnabled() + End Sub + + Private Sub InitialiseDialog() + ucrBase.iHelpTopicID = 11 + 'Removes the Sheet Tab control + grdDataPreview.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, False) + grdDataPreview.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_AutoFormatCell, False) + ucrInputName.SetValidationTypeAsRVariable() + strTempWorkbookName = "temp_workbook" + + 'temp disabled until can easily switch between fread and read.csv + rdoRowNamesYes.Enabled = False + 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator + ucrInputSeparator.Enabled = False + + 'hide since no longer using openxlsx package + ucrInputNamedRegions.Hide() + lblNamedRegion.Hide() + + ucrInputFilePath.IsReadOnly = True + + 'xl options settings + nudxlRowsToSkip.Maximum = Integer.MaxValue + + 'csv options settings + clsReadCSV.AddParameter("check.names", "TRUE") + ucrInputEncoding.SetItems({"unknown"}) + ucrInputSeparator.SetItems({"Automatic", ",", "Whitespace", ":", ";", "|", "^"}) + ucrInputHeaders.SetItems({"Automatic", "Yes", "No"}) + ucrInputDecimal.SetItems({"Automatic", ".", ","}) + nudSkip.Maximum = Integer.MaxValue + End Sub + + Private Sub SetDefaults() + grpCSV.Hide() + grpRDS.Hide() grpExcel.Hide() txtPreview.Hide() lblInputFile.Hide() @@ -124,37 +124,37 @@ Public Class dlgImportDataset SetRDSDefaults() End Sub -#Region "Shared options" - Public Sub setLinesToRead(lines As Integer) - intLines = lines - End Sub - - Private Sub ucrInputName_NameChanged() Handles ucrInputName.NameChanged - If Not ucrInputName.IsEmpty AndAlso strFileType <> "RDS" Then +#Region "Shared options" + Public Sub setLinesToRead(lines As Integer) + intLines = lines + End Sub + + Private Sub ucrInputName_NameChanged() Handles ucrInputName.NameChanged + If Not ucrInputName.IsEmpty AndAlso strFileType <> "RDS" Then ucrBase.clsRsyntax.SetAssignTo(ucrInputName.GetText(), strTempDataframe:=ucrInputName.GetText()) Else ucrBase.clsRsyntax.RemoveAssignTo() - End If - TestOkEnabled() + End If + TestOkEnabled() End Sub -#End Region +#End Region -#Region "Dialog options" - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset +#Region "Dialog options" + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() RefreshFrameView() - End Sub - - Private Sub TestOkEnabled() - If (Not ucrInputName.IsEmpty OrElse strFileType = "RDS") AndAlso bCanImport Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If - End Sub -#End Region - -#Region "Import options" + End Sub + + Private Sub TestOkEnabled() + If (Not ucrInputName.IsEmpty OrElse strFileType = "RDS") AndAlso bCanImport Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If + End Sub +#End Region + +#Region "Import options" 'Loads the open dialog on load and click Public Sub GetFileFromOpenDialog() Using dlgOpen As New OpenFileDialog @@ -197,7 +197,7 @@ Public Class dlgImportDataset End If End If TestOkEnabled() - End Using + End Using End Sub Public Sub SetDialogWithFile(strFilePath As String) @@ -290,17 +290,17 @@ Public Class dlgImportDataset RefreshFrameView() End Sub -#End Region +#End Region -#Region "File Preview options" - Public Sub RefreshFilePreview() +#Region "File Preview options" + Public Sub RefreshFilePreview() Dim sReader As StreamReader If strFileType = "csv" AndAlso ucrInputFilePath.GetText() <> "" Then Try sReader = New StreamReader(ucrInputFilePath.GetText()) txtPreview.Text = "" For i = 1 To intLines + nudSkip.Value + 1 - txtPreview.Text = txtPreview.Text & sReader.ReadLine() & vbCrLf + txtPreview.Text = txtPreview.Text & sReader.ReadLine() & Environment.NewLine If sReader.Peek() = -1 Then Exit For End If @@ -312,26 +312,26 @@ Public Class dlgImportDataset Else txtPreview.Text = "Preview only available for text files" End If - End Sub - - Private Sub RefreshFrameView() - Dim dfTemp As DataFrame - Dim expTemp As SymbolicExpression = Nothing - Dim bToBeAssigned As Boolean - Dim strTempDataFrameName As String - Dim bValid As Boolean - Dim clsAsCharacterFunc As New RFunction - 'Dim control As Control - - 'Remove as may have other effects + End Sub + + Private Sub RefreshFrameView() + Dim dfTemp As DataFrame + Dim expTemp As SymbolicExpression = Nothing + Dim bToBeAssigned As Boolean + Dim strTempDataFrameName As String + Dim bValid As Boolean + Dim clsAsCharacterFunc As New RFunction + 'Dim control As Control + + 'Remove as may have other effects 'For Each control In Me.Controls ' control.Enabled = False - 'Next - Cursor = Cursors.WaitCursor - ucrBase.OKEnabled(False) - clsAsCharacterFunc.SetRCommand("convert_to_character_matrix") - strTempDataFrameName = "temp" - bToBeAssigned = ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned + 'Next + Cursor = Cursors.WaitCursor + ucrBase.OKEnabled(False) + clsAsCharacterFunc.SetRCommand("convert_to_character_matrix") + strTempDataFrameName = "temp" + bToBeAssigned = ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned = False If strFileType <> "RDS" Then grdDataPreview.Show() @@ -399,48 +399,48 @@ Public Class dlgImportDataset 'For Each control In Me.Controls ' control.Enabled = True 'Next - Cursor = Cursors.Default - TestOkEnabled() - End Sub -#End Region - -#Region "RDS options" - Private Sub SetRDSDefaults() - chkExistingData.Checked = True - chkImportObjects.Checked = True - chkImportMetadata.Checked = True - chkImportChangesLog.Checked = True - chkImportFilters.Checked = True - chkImportCalculations.Checked = True - chkOverWrite.Checked = False - End Sub - - - Private Sub chkExisting_CheckStateChanged(sender As Object, e As EventArgs) Handles chkExistingData.CheckedChanged - If chkExistingData.Checked Then + Cursor = Cursors.Default + TestOkEnabled() + End Sub +#End Region + +#Region "RDS options" + Private Sub SetRDSDefaults() + chkExistingData.Checked = True + chkImportObjects.Checked = True + chkImportMetadata.Checked = True + chkImportChangesLog.Checked = True + chkImportFilters.Checked = True + chkImportCalculations.Checked = True + chkOverWrite.Checked = False + End Sub + + + Private Sub chkExisting_CheckStateChanged(sender As Object, e As EventArgs) Handles chkExistingData.CheckedChanged + If chkExistingData.Checked Then If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsImportRDS.AddParameter("keep_existing", "TRUE") Else clsImportRDS.RemoveParameterByName("keep_existing") End If - Else - clsImportRDS.AddParameter("keep_existing", "FALSE") - End If - End Sub - - Private Sub chkLogs_CheckStateChanged(sender As Object, e As EventArgs) Handles chkImportChangesLog.CheckedChanged - If chkImportChangesLog.Checked Then + Else + clsImportRDS.AddParameter("keep_existing", "FALSE") + End If + End Sub + + Private Sub chkLogs_CheckStateChanged(sender As Object, e As EventArgs) Handles chkImportChangesLog.CheckedChanged + If chkImportChangesLog.Checked Then If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsImportRDS.AddParameter("include_logs", "TRUE") Else clsImportRDS.RemoveParameterByName("include_logs") End If - Else - clsImportRDS.RemoveParameterByName("include_logs") - End If - End Sub - - Private Sub chkOverWrite_CheckStateChanged(sender As Object, e As EventArgs) Handles chkOverWrite.CheckedChanged + Else + clsImportRDS.RemoveParameterByName("include_logs") + End If + End Sub + + Private Sub chkOverWrite_CheckStateChanged(sender As Object, e As EventArgs) Handles chkOverWrite.CheckedChanged If chkOverWrite.Checked Then clsImportRDS.AddParameter("overwrite_existing", "TRUE") Else @@ -449,47 +449,47 @@ Public Class dlgImportDataset Else clsImportRDS.RemoveParameterByName("overwrite_existing") End If - End If - End Sub - - Private Sub chkMetadata_CheckStateChanged(sender As Object, e As EventArgs) Handles chkImportMetadata.CheckedChanged - If chkImportMetadata.Checked Then + End If + End Sub + + Private Sub chkMetadata_CheckStateChanged(sender As Object, e As EventArgs) Handles chkImportMetadata.CheckedChanged + If chkImportMetadata.Checked Then If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsImportRDS.AddParameter("include_metadata", "TRUE") Else clsImportRDS.RemoveParameterByName("include_metadata") End If - Else - clsImportRDS.AddParameter("include_metadata", "FALSE") - End If + Else + clsImportRDS.AddParameter("include_metadata", "FALSE") + End If End Sub Private Sub chkKeepFilters_CheckedChanged(sender As Object, e As EventArgs) Handles chkImportFilters.CheckedChanged - If chkImportFilters.Checked Then + If chkImportFilters.Checked Then If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsImportRDS.AddParameter("include_filters", "TRUE") Else clsImportRDS.RemoveParameterByName("include_filters") End If Else - clsImportRDS.AddParameter("include_filters", "FALSE") + clsImportRDS.AddParameter("include_filters", "FALSE") End If End Sub Private Sub chkImportCalculations_CheckedChanged(sender As Object, e As EventArgs) Handles chkImportCalculations.CheckedChanged - If chkImportCalculations.Checked Then + If chkImportCalculations.Checked Then If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsImportRDS.AddParameter("include_calculations", "TRUE") Else clsImportRDS.RemoveParameterByName("include_calculations") End If Else - clsImportRDS.AddParameter("include_calculations", "FALSE") + clsImportRDS.AddParameter("include_calculations", "FALSE") End If End Sub - - Private Sub chkKeepObjects_CheckStateChanged(sender As Object, e As EventArgs) Handles chkImportObjects.CheckStateChanged - If chkImportObjects.Checked Then + + Private Sub chkKeepObjects_CheckStateChanged(sender As Object, e As EventArgs) Handles chkImportObjects.CheckStateChanged + If chkImportObjects.Checked Then If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsImportRDS.AddParameter("include_objects", "TRUE") Else @@ -497,23 +497,23 @@ Public Class dlgImportDataset End If Else clsImportRDS.AddParameter("include_objects", "FALSE") - End If + End If End Sub -#End Region +#End Region -#Region "CSV options" - Private Sub SetCSVDefault() - ucrInputEncoding.SetName("unknown") - rdoRowNamesNo.Checked = True +#Region "CSV options" + Private Sub SetCSVDefault() + ucrInputEncoding.SetName("unknown") + rdoRowNamesNo.Checked = True ucrInputSeparator.SetName("Automatic") ucrInputHeaders.SetName("Automatic") - ucrInputDecimal.SetName("Automatic") - ucrInputNAStrings.SetName("NA") - nudSkip.Value = 0 - chkStringsAsFactors.Checked = True - End Sub - + ucrInputDecimal.SetName("Automatic") + ucrInputNAStrings.SetName("NA") + nudSkip.Value = 0 + chkStringsAsFactors.Checked = True + End Sub + Private Sub ucrInputEncoding_NameChanged() Handles ucrInputEncoding.NameChanged If ucrInputEncoding.GetText() <> "" AndAlso (ucrInputEncoding.GetText() <> "unknown" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then @@ -521,8 +521,8 @@ Public Class dlgImportDataset Else clsReadCSV.RemoveParameterByName("encoding") End If - RefreshFrameView() - + RefreshFrameView() + End Sub Private Sub rdoRowNames_CheckedChanged(sender As Object, e As EventArgs) Handles rdoRowNamesYes.CheckedChanged, rdoRowNamesNo.CheckedChanged @@ -539,166 +539,166 @@ Public Class dlgImportDataset End Sub Private Sub ucrInputHeaders_NameChanged() Handles ucrInputHeaders.NameChanged - Select Case ucrInputHeaders.GetText() + Select Case ucrInputHeaders.GetText() Case "Automatic" If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsReadCSV.AddParameter("header", Chr(34) & "auto" & Chr(34)) Else clsReadCSV.RemoveParameterByName("header") End If - clsReadCSV.RemoveParameterByName("header") - Case "Yes" + clsReadCSV.RemoveParameterByName("header") + Case "Yes" clsReadCSV.AddParameter("header", "TRUE") Case "No" clsReadCSV.AddParameter("header", "FALSE") - Case Else + Case Else clsReadCSV.RemoveParameterByName("header") - End Select + End Select RefreshFrameView() End Sub Private Sub ucrInputDecimal_NameChanged() Handles ucrInputDecimal.NameChanged - Select Case ucrInputDecimal.GetText + Select Case ucrInputDecimal.GetText Case "Automatic" clsReadCSV.RemoveParameterByName("dec") - Case Else - clsReadCSV.AddParameter("dec", Chr(34) & ucrInputDecimal.GetText() & Chr(34)) - End Select - RefreshFrameView() - End Sub - + Case Else + clsReadCSV.AddParameter("dec", Chr(34) & ucrInputDecimal.GetText() & Chr(34)) + End Select + RefreshFrameView() + End Sub + Private Sub ucrInputSeparator_NameChanged() Handles ucrInputSeparator.NameChanged - Select Case ucrInputSeparator.GetText + Select Case ucrInputSeparator.GetText Case "Automatic" If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsReadCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) Else clsReadCSV.RemoveParameterByName("sep") End If - clsReadCSV.RemoveParameterByName("sep") - Case "Whitespace" + clsReadCSV.RemoveParameterByName("sep") + Case "Whitespace" clsReadCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) Case "" clsReadCSV.RemoveParameterByName("sep") - Case Else - clsReadCSV.AddParameter("sep", Chr(34) & ucrInputSeparator.GetText() & Chr(34)) - End Select - RefreshFrameView() - End Sub - + Case Else + clsReadCSV.AddParameter("sep", Chr(34) & ucrInputSeparator.GetText() & Chr(34)) + End Select + RefreshFrameView() + End Sub + Private Sub ucrInputDecimal_TextChanged(sender As Object, e As EventArgs) Handles ucrInputDecimal.TextChanged - Select Case ucrInputDecimal.GetText - Case "Period" - clsReadCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) - Case "Comma" - clsReadCSV.AddParameter("dec", Chr(34) & "," & Chr(34)) - End Select - RefreshFrameView() - End Sub - + Select Case ucrInputDecimal.GetText + Case "Period" + clsReadCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) + Case "Comma" + clsReadCSV.AddParameter("dec", Chr(34) & "," & Chr(34)) + End Select + RefreshFrameView() + End Sub + Private Sub ucrInputNAStrings_NameChanged() Handles ucrInputNAStrings.NameChanged - If ucrInputNAStrings.GetText() <> "" AndAlso (ucrInputNAStrings.GetText() <> "NA" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then - clsReadCSV.AddParameter("na.strings", Chr(34) & ucrInputNAStrings.GetText() & Chr(34)) - Else - clsReadCSV.RemoveParameterByName("na.strings") - End If - RefreshFrameView() - End Sub - + If ucrInputNAStrings.GetText() <> "" AndAlso (ucrInputNAStrings.GetText() <> "NA" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then + clsReadCSV.AddParameter("na.strings", Chr(34) & ucrInputNAStrings.GetText() & Chr(34)) + Else + clsReadCSV.RemoveParameterByName("na.strings") + End If + RefreshFrameView() + End Sub + Private Sub nudSkips_TextChanged(sender As Object, e As EventArgs) Handles nudSkip.TextChanged - If bComponentsInitialised Then + If bComponentsInitialised Then If nudSkip.Value = 0 Then clsReadCSV.RemoveParameterByName("skip") Else - clsReadCSV.AddParameter("skip", nudSkip.Value) - End If - 'TODO R gives an error if skip is too large - RefreshFilePreview() - RefreshFrameView() + clsReadCSV.AddParameter("skip", nudSkip.Value) + End If + 'TODO R gives an error if skip is too large + RefreshFilePreview() + RefreshFrameView() End If - End Sub - - Private Sub cmdOpenDataSet_Click(sender As Object, e As EventArgs) Handles cmdOpenDataSet.Click - GetFileFromOpenDialog() End Sub -#End Region + + Private Sub cmdOpenDataSet_Click(sender As Object, e As EventArgs) Handles cmdOpenDataSet.Click + GetFileFromOpenDialog() + End Sub +#End Region -#Region "Excel options" +#Region "Excel options" - Private Sub setExcelDefaults() - nudxlRowsToSkip.Value = 0 + Private Sub setExcelDefaults() + nudxlRowsToSkip.Value = 0 XlSkipRowsParameter() chkColumnNames.Checked = True - XlStringsAsFactorsParameter() - XlColNamesParameter() - ucrInputXlMissingValueString.SetName("") - End Sub - - Private Sub FillExcelSheetsAndRegions(strFilePath As String) - Dim i As Integer - Dim chrSheets As CharacterVector - 'Dim chrRegions As CharacterVector + XlStringsAsFactorsParameter() + XlColNamesParameter() + ucrInputXlMissingValueString.SetName("") + End Sub + + Private Sub FillExcelSheetsAndRegions(strFilePath As String) + Dim i As Integer + Dim chrSheets As CharacterVector + 'Dim chrRegions As CharacterVector Dim clsGetSheetNames As New RFunction 'Dim clsGetNamedRegions As New RFunction - clsGetSheetNames.SetPackageName("readxl") - clsGetSheetNames.SetRCommand("excel_sheets") - clsGetSheetNames.AddParameter("path", Chr(34) & ucrInputFilePath.GetText() & Chr(34)) - 'not needed now since not using openxlsx - ' temporary solutions until issue with getNamedRegions is resolved - ' https://github.com/awalker89/openxlsx/issues/174 - 'clsGetNamedRegions.SetPackageName("openxlsx") - 'clsGetNamedRegions.SetRCommand("getNamedRegions") - 'clsGetNamedRegions.SetRCommand("regmatches") - 'clsGetNamedRegions.AddParameter("xlsxFile", strTempWorkbookName) - 'clsGetNamedRegions.AddParameter("x", strTempWorkbookName & "$workbook$definedNames") - 'clsGetNamedRegions.AddParameter("m", "regexpr('(?<=name=" & Chr(34) & ")[^" & Chr(34) & "]+', " & strTempWorkbookName & "$workbook$definedNames" & ", perl = TRUE)") - chrSheets = frmMain.clsRLink.RunInternalScriptGetValue(clsGetSheetNames.ToScript()).AsCharacter - 'chrRegions = frmMain.clsRLink.RunInternalScriptGetValue(clsGetNamedRegions.ToScript()).AsCharacter - - ucrInputSheets.cboInput.Items.Clear() - If chrSheets IsNot Nothing AndAlso chrSheets.Count > 0 Then - For i = 0 To chrSheets.Count - 1 - ucrInputSheets.cboInput.Items.Add(chrSheets(i)) - Next - ucrInputSheets.SetName(ucrInputSheets.cboInput.Items(0), bSilent:=True) - Else - ucrInputSheets.SetName("") - End If - - 'ucrInputNamedRegions.cboInput.Items.Clear() - 'If chrRegions IsNot Nothing AndAlso chrRegions.Count > 0 Then - ' For i = 0 To chrRegions.Count - 1 - ' ucrInputNamedRegions.cboInput.Items.Add(chrRegions(i)) - ' Next - 'End If - 'ucrInputNamedRegions.SetName("") - End Sub - + clsGetSheetNames.SetPackageName("readxl") + clsGetSheetNames.SetRCommand("excel_sheets") + clsGetSheetNames.AddParameter("path", Chr(34) & ucrInputFilePath.GetText() & Chr(34)) + 'not needed now since not using openxlsx + ' temporary solutions until issue with getNamedRegions is resolved + ' https://github.com/awalker89/openxlsx/issues/174 + 'clsGetNamedRegions.SetPackageName("openxlsx") + 'clsGetNamedRegions.SetRCommand("getNamedRegions") + 'clsGetNamedRegions.SetRCommand("regmatches") + 'clsGetNamedRegions.AddParameter("xlsxFile", strTempWorkbookName) + 'clsGetNamedRegions.AddParameter("x", strTempWorkbookName & "$workbook$definedNames") + 'clsGetNamedRegions.AddParameter("m", "regexpr('(?<=name=" & Chr(34) & ")[^" & Chr(34) & "]+', " & strTempWorkbookName & "$workbook$definedNames" & ", perl = TRUE)") + chrSheets = frmMain.clsRLink.RunInternalScriptGetValue(clsGetSheetNames.ToScript()).AsCharacter + 'chrRegions = frmMain.clsRLink.RunInternalScriptGetValue(clsGetNamedRegions.ToScript()).AsCharacter + + ucrInputSheets.cboInput.Items.Clear() + If chrSheets IsNot Nothing AndAlso chrSheets.Count > 0 Then + For i = 0 To chrSheets.Count - 1 + ucrInputSheets.cboInput.Items.Add(chrSheets(i)) + Next + ucrInputSheets.SetName(ucrInputSheets.cboInput.Items(0), bSilent:=True) + Else + ucrInputSheets.SetName("") + End If + + 'ucrInputNamedRegions.cboInput.Items.Clear() + 'If chrRegions IsNot Nothing AndAlso chrRegions.Count > 0 Then + ' For i = 0 To chrRegions.Count - 1 + ' ucrInputNamedRegions.cboInput.Items.Add(chrRegions(i)) + ' Next + 'End If + 'ucrInputNamedRegions.SetName("") + End Sub + Private Sub nudxlRowsToSkip_TextChanged(sender As Object, e As EventArgs) Handles nudxlRowsToSkip.TextChanged XlSkipRowsParameter() - End Sub - + End Sub + Private Sub XlSkipRowsParameter() - If bComponentsInitialised Then - If nudxlRowsToSkip.Text <> "" Then - If nudxlRowsToSkip.Value = 0 AndAlso Not frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsReadXL.RemoveParameterByName("skip") - Else - clsReadXL.AddParameter("skip", nudxlRowsToSkip.Value) - End If - Else - clsReadXL.RemoveParameterByName("skip") - End If - RefreshFrameView() + If bComponentsInitialised Then + If nudxlRowsToSkip.Text <> "" Then + If nudxlRowsToSkip.Value = 0 AndAlso Not frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + clsReadXL.RemoveParameterByName("skip") + Else + clsReadXL.AddParameter("skip", nudxlRowsToSkip.Value) + End If + Else + clsReadXL.RemoveParameterByName("skip") + End If + RefreshFrameView() End If - End Sub - + End Sub + Private Sub chkColumnNames_CheckedChanged(sender As Object, e As EventArgs) Handles chkColumnNames.CheckedChanged XlColNamesParameter() - End Sub - + End Sub + Private Sub XlColNamesParameter() Dim strColNameParam As String @@ -710,18 +710,18 @@ Public Class dlgImportDataset clsReadXL.RemoveParameterByName("colNames") End If - If chkColumnNames.Checked Then - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsReadXL.AddParameter(strColNameParam, "TRUE") - Else - clsReadXL.RemoveParameterByName(strColNameParam) - End If - Else - clsReadXL.AddParameter(strColNameParam, "FALSE") - End If + If chkColumnNames.Checked Then + If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + clsReadXL.AddParameter(strColNameParam, "TRUE") + Else + clsReadXL.RemoveParameterByName(strColNameParam) + End If + Else + clsReadXL.AddParameter(strColNameParam, "FALSE") + End If RefreshFrameView() - End Sub - + End Sub + Private Sub chkStringsAsFactors_CheckedChanged(sender As Object, e As EventArgs) Handles chkStringsAsFactors.CheckedChanged XlStringsAsFactorsParameter() End Sub @@ -740,25 +740,25 @@ Public Class dlgImportDataset End Sub Private Sub lblRowVector_Click(sender As Object, e As EventArgs) - Me.Hide() - frmMetaData.Show() + Me.Hide() + frmMetaData.Show() End Sub Private Sub ucrInputXlMissingValueString_NameChanged() Handles ucrInputXlMissingValueString.NameChanged - If Not ucrInputXlMissingValueString.IsEmpty() Then - clsReadXL.AddParameter("na", Chr(34) & ucrInputXlMissingValueString.GetText() & Chr(34)) - Else + If Not ucrInputXlMissingValueString.IsEmpty() Then + clsReadXL.AddParameter("na", Chr(34) & ucrInputXlMissingValueString.GetText() & Chr(34)) + Else If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsReadXL.AddParameter("na", Chr(34) & Chr(34)) Else clsReadXL.RemoveParameterByName("na") - End If - End If + End If + End If RefreshFrameView() - End Sub - - Private Sub ucrInputSheets_NameChanged() Handles ucrInputSheets.NameChanged - If Not ucrInputSheets.IsEmpty() Then + End Sub + + Private Sub ucrInputSheets_NameChanged() Handles ucrInputSheets.NameChanged + If Not ucrInputSheets.IsEmpty() Then If strFileType = "xlsx" Then clsReadXL.AddParameter("which", ucrInputSheets.cboInput.SelectedIndex + 1) clsReadXL.RemoveParameterByName("sheet") @@ -779,15 +779,15 @@ Public Class dlgImportDataset End If 'ucrInputNamedRegions.SetName("") Else - clsReadXL.RemoveParameterByName("sheet") - clsReadXL.RemoveParameterByName("which") - End If - RefreshFrameView() + clsReadXL.RemoveParameterByName("sheet") + clsReadXL.RemoveParameterByName("which") + End If + RefreshFrameView() End Sub Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk - ' add the item to the MRU (Most Recently Used) list... - 'Disabled until implemented correctly + ' add the item to the MRU (Most Recently Used) list... + 'Disabled until implemented correctly frmMain.clsRecentItems.addToMenu(Replace(ucrInputFilePath.GetText(), "/", "\")) If strFileType = "RDS" Then frmMain.strSaveFilePath = ucrInputFilePath.GetText() @@ -811,5 +811,5 @@ Public Class dlgImportDataset ' RefreshFrameView() 'End Sub -#End Region +#End Region End Class \ No newline at end of file diff --git a/instat/frmEditor.vb b/instat/frmEditor.vb index b4ccd56be98..e657246c730 100644 --- a/instat/frmEditor.vb +++ b/instat/frmEditor.vb @@ -112,7 +112,7 @@ Public Class frmEditor End Sub Private Sub mnuDeleteCol_Click(sender As Object, e As EventArgs) Handles mnuDeleteCol.Click - Dim deleteCol = MsgBox("Are you sure you want to delete these column(s)?" & vbNewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Column") + Dim deleteCol = MsgBox("Are you sure you want to delete these column(s)?" & Environment.NewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Column") If deleteCol = DialogResult.Yes Then clsDeleteColumns.AddParameter("cols", SelectedColumns()) frmMain.clsRLink.RunScript(clsDeleteColumns.ToScript(), strComment:="Right click menu: Delete Column(s)") @@ -239,7 +239,7 @@ Public Class frmEditor End Sub Private Sub mnuDeleteRows_Click(sender As Object, e As EventArgs) Handles mnuDeleteRows.Click - Dim Delete = MsgBox("Are you sure you want to delete these row(s)?" & vbNewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Row(s)") + Dim Delete = MsgBox("Are you sure you want to delete these row(s)?" & Environment.NewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Row(s)") If Delete = DialogResult.Yes Then clsDeleteRows.AddParameter("row_names", SelectedRows()) frmMain.clsRLink.RunScript(clsDeleteRows.ToScript(), strComment:="Right Click menu: Delete row(s)") @@ -293,7 +293,7 @@ Public Class frmEditor Private Sub deleteSheet_Click(sender As Object, e As EventArgs) Handles deleteSheet.Click Dim strScript As String - Dim Delete = MsgBox("Are you sure you want to delete this dataframe?" & vbNewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Sheet") + Dim Delete = MsgBox("Are you sure you want to delete this dataframe?" & Environment.NewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Sheet") If grdData.Worksheets.Count > 0 Then If Delete = DialogResult.Yes Then strScript = frmMain.clsRLink.strInstatDataObject & "$delete_dataframe(data_name =" & Chr(34) & grdData.CurrentWorksheet.Name & Chr(34) & ")" @@ -385,7 +385,7 @@ Public Class frmEditor Case "factor" chrCurrentFactorLevels = frmMain.clsRLink.RunInternalScriptGetValue(clsGetFactorLevels.ToScript()).AsCharacter If Not chrCurrentFactorLevels.Contains(strNewValue) Then - MsgBox("Invalid value: " & strNewValue & vbNewLine & "This column is: factor. Values must be an existing level of this factor column.", MsgBoxStyle.Exclamation, "Invalid Value") + MsgBox("Invalid value: " & strNewValue & Environment.NewLine & "This column is: factor. Values must be an existing level of this factor column.", MsgBoxStyle.Exclamation, "Invalid Value") Else clsReplaceValue.AddParameter("new_value", Chr(34) & strNewValue & Chr(34)) bValid = True @@ -395,14 +395,14 @@ Public Class frmEditor clsReplaceValue.AddParameter("new_value", strNewValue) bValid = True Else - MsgBox("Invalid value: " & strNewValue & vbNewLine & "This column is: numeric. Values must be numeric.", MsgBoxStyle.Exclamation, "Invalid Value") + MsgBox("Invalid value: " & strNewValue & Environment.NewLine & "This column is: numeric. Values must be numeric.", MsgBoxStyle.Exclamation, "Invalid Value") End If Case "integer" If Integer.TryParse(strNewValue, iValue) Then clsReplaceValue.AddParameter("new_value", strNewValue) bValid = True Else - MsgBox("Invalid value: " & strNewValue & vbNewLine & "This column is: integer. Values must be integer.", MsgBoxStyle.Exclamation, "Invalid Value") + MsgBox("Invalid value: " & strNewValue & Environment.NewLine & "This column is: integer. Values must be integer.", MsgBoxStyle.Exclamation, "Invalid Value") End If 'Currently removed as this is the class for a blank column 'Case "logical" @@ -411,7 +411,7 @@ Public Class frmEditor ' clsReplaceValue.AddParameter("new_value", e.NewData) ' bValid = True ' Else - ' MsgBox("Invalid value: " & e.NewData.ToString() & vbNewLine & "This column is: logical. Values must be logical (either TRUE or FALSE).", MsgBoxStyle.Exclamation, "Invalid Value") + ' MsgBox("Invalid value: " & e.NewData.ToString() & Environment.NewLine & "This column is: logical. Values must be logical (either TRUE or FALSE).", MsgBoxStyle.Exclamation, "Invalid Value") ' e.EndReason = unvell.ReoGrid.EndEditReason.Cancel ' End If 'Case "character" @@ -621,7 +621,7 @@ Public Class frmEditor Private Sub grdCurrSheet_BeforePaste(sender As Object, e As BeforeRangeOperationEventArgs) Handles grdCurrSheet.BeforePaste e.IsCancelled = True If Not e.Range.IsSingleCell Then - MsgBox("Pasting multiple cells is currently disabled. This feature will be included in future versions." & vbNewLine & "Try pasting one cell at a time.", MsgBoxStyle.Information, "Cannot paste multiple cells") + MsgBox("Pasting multiple cells is currently disabled. This feature will be included in future versions." & Environment.NewLine & "Try pasting one cell at a time.", MsgBoxStyle.Information, "Cannot paste multiple cells") Else ReplaceValueInData(Clipboard.GetText(), e.Range.Row, e.Range.Col) End If @@ -635,7 +635,7 @@ Public Class frmEditor Private Sub grdCurrSheet_BeforeCellKeyDown(sender As Object, e As BeforeCellKeyDownEventArgs) Handles grdCurrSheet.BeforeCellKeyDown If e.KeyCode = unvell.ReoGrid.Interaction.KeyCode.Delete OrElse e.KeyCode = unvell.ReoGrid.Interaction.KeyCode.Back Then - MsgBox("Deleting cells is currently disabled. This feature will be included in future versions." & vbNewLine & "To remove a cell's value, replace the value with NA.", MsgBoxStyle.Information, "Cannot delete cells.") + MsgBox("Deleting cells is currently disabled. This feature will be included in future versions." & Environment.NewLine & "To remove a cell's value, replace the value with NA.", MsgBoxStyle.Information, "Cannot delete cells.") e.IsCancelled = True End If End Sub diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 91731fe7d92..d392df5657a 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -125,11 +125,11 @@ Public Class frmMain 'FileStream.Close() End Using Catch ex As Exception - MsgBox("Error attempting to use file:" & strFilePath & vbNewLine & "The file may be in use by another program or the file does not contain an instance of InstatOptions." & vbNewLine & "System error message: " & ex.Message, MsgBoxStyle.Critical, "Error opening file") + MsgBox("Error attempting to use file:" & strFilePath & Environment.NewLine & "The file may be in use by another program or the file does not contain an instance of InstatOptions." & Environment.NewLine & "System error message: " & ex.Message, MsgBoxStyle.Critical, "Error opening file") clsInstatOptions = New InstatOptions End Try Else - MsgBox("File:" & strFilePath & " does not exist." & vbNewLine & "File will not be loaded.", MsgBoxStyle.Critical) + MsgBox("File:" & strFilePath & " does not exist." & Environment.NewLine & "File will not be loaded.", MsgBoxStyle.Critical) clsInstatOptions = New InstatOptions End If End Sub @@ -145,7 +145,7 @@ Public Class frmMain 'FileStream.Close() End Using Catch ex As Exception - MsgBox("Error attempting to save to file:" & strFilePath & vbNewLine & "The file may be in use by another program." & vbNewLine & "System error message: " & ex.Message, MsgBoxStyle.Critical, "Error saving to file") + MsgBox("Error attempting to save to file:" & strFilePath & Environment.NewLine & "The file may be in use by another program." & Environment.NewLine & "System error message: " & ex.Message, MsgBoxStyle.Critical, "Error saving to file") End Try End Sub @@ -763,7 +763,7 @@ Public Class frmMain clsRecentItems.saveOnClose() SaveInstatOptions(Path.Combine(strAppDataPath, strInstatOptionsFile)) Catch ex As Exception - MsgBox("Error attempting to save setting files to App Data folder." & vbNewLine & "System error message: " & ex.Message, MsgBoxStyle.Critical, "Error saving settings") + 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 Else e.Cancel = True @@ -797,7 +797,7 @@ Public Class frmMain 'Send file name string specifying the location to save the rtf in. ucrOutput.ucrRichTextBox.SaveRtf(dlgSaveFile.FileName) Catch - MsgBox("Could not save the output window." & vbNewLine & "The file may be in use by another program or you may not have access to write to the specified location.", MsgBoxStyle.Critical) + MsgBox("Could not save the output window." & Environment.NewLine & "The file may be in use by another program or you may not have access to write to the specified location.", MsgBoxStyle.Critical) End Try End If End Using @@ -812,7 +812,7 @@ Public Class frmMain Try File.WriteAllText(dlgSaveFile.FileName, frmLog.txtLog.Text) Catch - MsgBox("Could not save the log file." & vbNewLine & "The file may be in use by another program or you may not have access to write to the specified location.", MsgBoxStyle.Critical) + MsgBox("Could not save the log file." & Environment.NewLine & "The file may be in use by another program or you may not have access to write to the specified location.", MsgBoxStyle.Critical) End Try End If End Using @@ -827,7 +827,7 @@ Public Class frmMain Try File.WriteAllText(dlgSaveFile.FileName, frmScript.txtScript.Text) Catch - MsgBox("Could not save the script file." & vbNewLine & "The file may be in use by another program or you may not have access to write to the specified location.", MsgBoxStyle.Critical) + MsgBox("Could not save the script file." & Environment.NewLine & "The file may be in use by another program or you may not have access to write to the specified location.", MsgBoxStyle.Critical) End Try End If End Using diff --git a/instat/sdgCombineGraphOptions.vb b/instat/sdgCombineGraphOptions.vb index b57ee2ed82c..991c46a22f7 100644 --- a/instat/sdgCombineGraphOptions.vb +++ b/instat/sdgCombineGraphOptions.vb @@ -41,8 +41,8 @@ Public Class sdgCombineGraphOptions grdCurrSheet.Columns = ucrNudColumns.Value ucrNudColumns.SetParameter(New RParameter("ncol", 1)) - ucrNudRows.SetParameter(New RParameter("nrow", 2)) - + ucrNudRows.SetParameter(New RParameter("nrow", 2)) + ucrInputTop.SetParameter(New RParameter("top", 2)) ucrInputBottom.SetParameter(New RParameter("bottom", 4)) ucrInputLeft.SetParameter(New RParameter("left", 5)) @@ -81,10 +81,10 @@ Public Class sdgCombineGraphOptions If e.NewData.ToString() <> "" Then If Not IsNumeric(e.NewData) Then - MsgBox("Invalid value: " & e.NewData.ToString() & vbNewLine & "You entered a non numeric character. Please enter a numeric character within the range of available graphs", MsgBoxStyle.Exclamation, "Invalid Value") + MsgBox("Invalid value: " & e.NewData.ToString() & Environment.NewLine & "You entered a non numeric character. Please enter a numeric character within the range of available graphs", MsgBoxStyle.Exclamation, "Invalid Value") e.EndReason = EndEditReason.Cancel ElseIf e.NewData > lstGraphs.Items.Count Or e.NewData < 1 Then - MsgBox("Invalid value: " & e.NewData.ToString() & vbNewLine & "This number is greater than the number of available graphs", MsgBoxStyle.Exclamation, "Invalid Value") + MsgBox("Invalid value: " & e.NewData.ToString() & Environment.NewLine & "This number is greater than the number of available graphs", MsgBoxStyle.Exclamation, "Invalid Value") e.EndReason = EndEditReason.Cancel End If End If diff --git a/instat/ucrButtons.vb b/instat/ucrButtons.vb index 48f2f16f3cd..ec43664cbb8 100644 --- a/instat/ucrButtons.vb +++ b/instat/ucrButtons.vb @@ -48,13 +48,9 @@ Public Class ucrButtons Public Event ClickReset(sender As Object, e As EventArgs) Private Sub cmdOk_Click(sender As Object, e As EventArgs) Handles cmdOk.Click - Dim strComments As String = "" - Dim bIsAssigned As Boolean - Dim bToBeAssigned As Boolean - Dim strAssignTo As String Dim lstCurrentEnabled As New List(Of Boolean) Dim ctrTempControl As Control - Dim i As Integer + Dim j As Integer For Each ctrTempControl In ParentForm.Controls lstCurrentEnabled.Add(ctrTempControl.Enabled) @@ -63,39 +59,123 @@ Public Class ucrButtons ParentForm.Cursor = Cursors.WaitCursor RaiseEvent BeforeClickOk(sender, e) + Scripts(bRun:=True) + RaiseEvent ClickOk(sender, e) + + 'Need to be resetting other AssignTo values as well, maybe through single method + + 'Warning: these reinitializing processes of the RSyntax parameters should probably be integrated at the end of GetScript. + 'However, for the moment, RSyntax is not playing it's role of capturing the whole set of R-commands that the user wants to run when OK is Cklicked. + 'Indeed, the events BeforeClickOk and ClickOk enables for the moment to insert R-commands before and after the Base R-command handle. + 'In the process, we want the RSyntax parameters to be set as at the end of GetScript. Hence the reset needs to come after. + 'Eventually, all this should be more neatly incorporated in the RSyntax machinery... + ParentForm.Hide() + j = 0 + For Each ctrTempControl In ParentForm.Controls + ctrTempControl.Enabled = lstCurrentEnabled(j) + j = j + 1 + Next + ParentForm.Cursor = Cursors.Default + End Sub + Private Sub Scripts(bRun As Boolean) + Dim strComments As String + Dim bIsAssigned As Boolean + Dim bToBeAssigned As Boolean + Dim strAssignTo As String + Dim lstBeforeScripts As List(Of String) + Dim lstAfterScripts As List(Of String) + Dim lstBeforeCodes As List(Of RCodeStructure) + Dim lstAfterCodes As List(Of RCodeStructure) + Dim lstAssignToVariables As List(Of String) + Dim bFirstCode As Boolean = True + Dim clsRemoveFunc As New RFunction + Dim clsRemoveListFun As New RFunction + + clsRemoveFunc.SetRCommand("rm") + clsRemoveListFun.SetRCommand("c") If chkComment.Checked Then strComments = txtComment.Text + Else + strComments = "" + End If + If Not bRun AndAlso strComments <> "" Then + frmMain.AddToScriptWindow("# " & strComments & Environment.NewLine) End If + 'Also need to be getting strAssignToColumn, strAssignToDataFrame etc. maybe one method to get all as a list bIsAssigned = clsRsyntax.GetbIsAssigned() bToBeAssigned = clsRsyntax.GetbToBeAssigned() strAssignTo = clsRsyntax.GetstrAssignTo() - 'Also need to be getting strAssignToColumn, strAssignToDataFrame etc. maybe one method to get all as a list - frmMain.clsRLink.RunScript(clsRsyntax.GetScript(), clsRsyntax.iCallType, strComment:=strComments) + + 'Run additional before codes + lstBeforeScripts = clsRsyntax.GetBeforeCodesScripts() + lstBeforeCodes = clsRsyntax.GetBeforeCodes() + For i As Integer = 0 To clsRsyntax.lstBeforeCodes.Count - 1 + If bFirstCode Then + strComment = strComments + bFirstCode = False + Else + strComment = "" + End If + If bRun Then + frmMain.clsRLink.RunScript(lstBeforeScripts(i), iCallType:=lstBeforeCodes(i).iCallType, strComment:=strComment) + Else + frmMain.AddToScriptWindow(lstBeforeScripts(i)) + End If + Next + + 'Run base code from RSyntax + If bRun Then + If bFirstCode Then + frmMain.clsRLink.RunScript(clsRsyntax.GetScript(), clsRsyntax.iCallType, strComment:=strComments) + bFirstCode = False + Else + frmMain.clsRLink.RunScript(clsRsyntax.GetScript(), clsRsyntax.iCallType, strComment:="") + End If + Else + frmMain.AddToScriptWindow(clsRsyntax.GetScript()) + End If 'This clears the script after it has been run, but leave the function and parameters in the base function 'so that it can be run exactly the same when reopened. clsRsyntax.strScript = "" - RaiseEvent ClickOk(sender, e) + 'Run additional after codes + lstAfterScripts = clsRsyntax.GetAfterCodesScripts() + lstAfterCodes = clsRsyntax.GetAfterCodes() + For i As Integer = 0 To lstAfterCodes.Count - 1 + If bRun Then + If bFirstCode Then + strComment = strComments + bFirstCode = False + Else + strComment = "" + End If + frmMain.clsRLink.RunScript(lstAfterScripts(i), iCallType:=lstAfterCodes(i).iCallType, strComment:=strComment) + Else + frmMain.AddToScriptWindow(lstAfterScripts(i)) + End If + Next + + 'Clear variables from global environment + lstAssignToVariables = clsRsyntax.GetAllAssignTo(New List(Of String)) + clsRemoveFunc.ClearParameters() + If lstAssignToVariables.Count = 1 Then + clsRemoveFunc.AddParameter("x1", lstAssignToVariables(0), bIncludeArgumentName:=False) + ElseIf lstAssignToVariables.Count > 1 Then + For i As Integer = 0 To lstAssignToVariables.Count - 1 + clsRemoveListFun.AddParameter(i, Chr(34) & lstAssignToVariables(i) & Chr(34), bIncludeArgumentName:=False) + Next + clsRemoveFunc.AddParameter("list", clsRFunctionParameter:=clsRemoveListFun) + End If + If bRun Then + frmMain.clsRLink.RunScript(clsRemoveFunc.ToScript(), iCallType:=0) + Else + frmMain.AddToScriptWindow(clsRemoveFunc.ToScript()) + End If clsRsyntax.SetbIsAssigned(bIsAssigned) clsRsyntax.SetbToBeAssigned(bToBeAssigned) clsRsyntax.SetstrAssignTo(strAssignTo) - 'Need to be resetting other AssignTo values as well, maybe through single method - - 'Warning: these reinitializing processes of the RSyntax parameters should probably be integrated at the end of GetScript. - 'However, for the moment, RSyntax is not playing it's role of capturing the whole set of R-commands that the user wants to run when OK is Cklicked. - 'Indeed, the events BeforeClickOk and ClickOk enables for the moment to insert R-commands before and after the Base R-command handle. - 'In the process, we want the RSyntax parameters to be set as at the end of GetScript. Hence the reset needs to come after. - 'Eventually, all this should be more neatly incorporated in the RSyntax machinery... - ParentForm.Hide() - i = 0 - For Each ctrTempControl In ParentForm.Controls - ctrTempControl.Enabled = lstCurrentEnabled(i) - i = i + 1 - Next - ParentForm.Cursor = Cursors.Default - End Sub Public Sub OKEnabled(bEnabled As Boolean) @@ -129,8 +209,7 @@ Public Class ucrButtons End Sub Private Sub cmdPaste_Click(sender As Object, e As EventArgs) Handles cmdPaste.Click - 'here we getscript but we don't reinitialise the AssignTo etc. for when pressing OK button ? ... - frmMain.AddToScriptWindow("# " & txtComment.Text & vbCrLf & clsRsyntax.GetScript()) + Scripts(bRun:=False) End Sub Private Sub chkComment_CheckedChanged(sender As Object, e As EventArgs) Handles chkComment.CheckedChanged @@ -146,25 +225,10 @@ Public Class ucrButtons End Sub Private Sub HelpContent() - ' (1) Use HelpNDoc's Help Context number. Not dependent on HelpNDoc. If iHelpTopicID > 0 Then Help.ShowHelp(Me.Parent, frmMain.strStaticPath & "\" & frmMain.strHelpFilePath, HelpNavigator.TopicId, iHelpTopicID.ToString()) Else Help.ShowHelp(Me.Parent, frmMain.strStaticPath & "\" & frmMain.strHelpFilePath, HelpNavigator.TableOfContents) End If - - ' (2) Use HelpNDoc's Help ID. Dependent on how HelpNDoc complies .htm files using the Help ID - 'Help.ShowHelp(Me, strHelpFilePath, HelpNavigator.Topic, "Maths.htm") - - ' (3) Use constants or enums automatically generated by HelpNDoc (but needing manual - ' covertion from .bas) to refer to the Help Context numbers. - 'Help.ShowHelp(Me, strHelpFilePath, HelpNavigator.TopicId, mHelpConstants.HELP_Maths.ToString) - End Sub - Private Sub chkComment_KeyPress(sender As Object, e As KeyPressEventArgs) Handles chkComment.KeyPress - If e.KeyChar = vbCr And chkComment.Checked = True Then - chkComment.Checked = False - ElseIf e.KeyChar = vbCr And chkComment.Checked = False Then - chkComment.Checked = True - End If End Sub End Class \ No newline at end of file diff --git a/instat/ucrDataView.vb b/instat/ucrDataView.vb index af3100a1cac..d28d96bf463 100644 --- a/instat/ucrDataView.vb +++ b/instat/ucrDataView.vb @@ -108,16 +108,16 @@ Public Class ucrDataView frmMain.clsRLink.RunScript(clsInsertColumns.ToScript(), strComment:="Right click menu: Insert Column(s) After") End Sub - Private Sub mnuDeleteCol_Click(sender As Object, e As EventArgs) Handles mnuDeleteCol.Click - If grdData.CurrentWorksheet.SelectionRange.Cols = grdData.CurrentWorksheet.ColumnCount Then - MsgBox("Cannot delete all visible columns." & Environment.NewLine & "Use Prepare > Data Object > Delete Data Frame if you wish to delete the data.", MsgBoxStyle.Information, "Cannot Delete All Columns") - Else - Dim deleteCol = MsgBox("Are you sure you want to delete these column(s)?" & vbNewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Column") - If deleteCol = DialogResult.Yes Then - clsDeleteColumns.AddParameter("cols", SelectedColumns()) - frmMain.clsRLink.RunScript(clsDeleteColumns.ToScript(), strComment:="Right click menu: Delete Column(s)") - End If - End If + Private Sub mnuDeleteCol_Click(sender As Object, e As EventArgs) Handles mnuDeleteCol.Click + If grdData.CurrentWorksheet.SelectionRange.Cols = grdData.CurrentWorksheet.ColumnCount Then + MsgBox("Cannot delete all visible columns." & Environment.NewLine & "Use Prepare > Data Object > Delete Data Frame if you wish to delete the data.", MsgBoxStyle.Information, "Cannot Delete All Columns") + Else + Dim deleteCol = MsgBox("Are you sure you want to delete these column(s)?" & Environment.NewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Column") + If deleteCol = DialogResult.Yes Then + clsDeleteColumns.AddParameter("cols", SelectedColumns()) + frmMain.clsRLink.RunScript(clsDeleteColumns.ToScript(), strComment:="Right click menu: Delete Column(s)") + End If + End If End Sub 'Private Sub resetToDefaultWidthToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles resetToDefaultWidthToolStripMenuItem.Click @@ -240,7 +240,7 @@ Public Class ucrDataView End Sub Private Sub mnuDeleteRows_Click(sender As Object, e As EventArgs) Handles mnuDeleteRows.Click - Dim Delete = MsgBox("Are you sure you want to delete these row(s)?" & vbNewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Row(s)") + Dim Delete = MsgBox("Are you sure you want to delete these row(s)?" & Environment.NewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Row(s)") If Delete = DialogResult.Yes Then clsDeleteRows.AddParameter("row_names", SelectedRows()) frmMain.clsRLink.RunScript(clsDeleteRows.ToScript(), strComment:="Right Click menu: Delete row(s)") @@ -296,7 +296,7 @@ Public Class ucrDataView Private Sub deleteSheet_Click(sender As Object, e As EventArgs) Handles deleteSheet.Click Dim strScript As String - Dim Delete = MsgBox("Are you sure you want to delete this dataframe?" & vbNewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Sheet") + Dim Delete = MsgBox("Are you sure you want to delete this dataframe?" & Environment.NewLine & "This action cannot be undone.", MessageBoxButtons.YesNo, "Delete Sheet") If grdData.Worksheets.Count > 0 Then If Delete = DialogResult.Yes Then strScript = frmMain.clsRLink.strInstatDataObject & "$delete_dataframe(data_name =" & Chr(34) & grdData.CurrentWorksheet.Name & Chr(34) & ")" @@ -388,7 +388,7 @@ Public Class ucrDataView Case "factor" chrCurrentFactorLevels = frmMain.clsRLink.RunInternalScriptGetValue(clsGetFactorLevels.ToScript()).AsCharacter If Not chrCurrentFactorLevels.Contains(strNewValue) Then - MsgBox("Invalid value: " & strNewValue & vbNewLine & "This column is: factor. Values must be an existing level of this factor column.", MsgBoxStyle.Exclamation, "Invalid Value") + MsgBox("Invalid value: " & strNewValue & Environment.NewLine & "This column is: factor. Values must be an existing level of this factor column.", MsgBoxStyle.Exclamation, "Invalid Value") Else clsReplaceValue.AddParameter("new_value", Chr(34) & strNewValue & Chr(34)) bValid = True @@ -398,14 +398,14 @@ Public Class ucrDataView clsReplaceValue.AddParameter("new_value", strNewValue) bValid = True Else - MsgBox("Invalid value: " & strNewValue & vbNewLine & "This column is: numeric. Values must be numeric.", MsgBoxStyle.Exclamation, "Invalid Value") + MsgBox("Invalid value: " & strNewValue & Environment.NewLine & "This column is: numeric. Values must be numeric.", MsgBoxStyle.Exclamation, "Invalid Value") End If Case "integer" If Integer.TryParse(strNewValue, iValue) Then clsReplaceValue.AddParameter("new_value", strNewValue) bValid = True Else - MsgBox("Invalid value: " & strNewValue & vbNewLine & "This column is: integer. Values must be integer.", MsgBoxStyle.Exclamation, "Invalid Value") + MsgBox("Invalid value: " & strNewValue & Environment.NewLine & "This column is: integer. Values must be integer.", MsgBoxStyle.Exclamation, "Invalid Value") End If 'Currently removed as this is the class for a blank column 'Case "logical" @@ -414,7 +414,7 @@ Public Class ucrDataView ' clsReplaceValue.AddParameter("new_value", e.NewData) ' bValid = True ' Else - ' MsgBox("Invalid value: " & e.NewData.ToString() & vbNewLine & "This column is: logical. Values must be logical (either TRUE or FALSE).", MsgBoxStyle.Exclamation, "Invalid Value") + ' MsgBox("Invalid value: " & e.NewData.ToString() & Environment.NewLine & "This column is: logical. Values must be logical (either TRUE or FALSE).", MsgBoxStyle.Exclamation, "Invalid Value") ' e.EndReason = unvell.ReoGrid.EndEditReason.Cancel ' End If 'Case "character" @@ -435,14 +435,14 @@ Public Class ucrDataView End If End Sub - Private Sub renameSheet_Click(sender As Object, e As EventArgs) Handles renameSheet.Click - dlgRenameDataFrame.SetCurrentDataframe(grdCurrSheet.Name) + Private Sub renameSheet_Click(sender As Object, e As EventArgs) Handles renameSheet.Click + dlgRenameDataFrame.SetCurrentDataframe(grdCurrSheet.Name) dlgRenameDataFrame.ShowDialog() End Sub - Private Sub MoveOrCopySheet_Click(sender As Object, e As EventArgs) Handles CopySheet.Click - dlgCopyDataFrame.SetCurrentDataframe(grdCurrSheet.Name) - dlgCopyDataFrame.ShowDialog() + Private Sub MoveOrCopySheet_Click(sender As Object, e As EventArgs) Handles CopySheet.Click + dlgCopyDataFrame.SetCurrentDataframe(grdCurrSheet.Name) + dlgCopyDataFrame.ShowDialog() End Sub Private Sub mnuConvertVariate_Click(sender As Object, e As EventArgs) Handles mnuConvertVariate.Click @@ -622,7 +622,7 @@ Public Class ucrDataView Private Sub grdCurrSheet_BeforePaste(sender As Object, e As BeforeRangeOperationEventArgs) Handles grdCurrSheet.BeforePaste e.IsCancelled = True If Not e.Range.IsSingleCell Then - MsgBox("Pasting multiple cells is currently disabled. This feature will be included in future versions." & vbNewLine & "Try pasting one cell at a time.", MsgBoxStyle.Information, "Cannot paste multiple cells") + MsgBox("Pasting multiple cells is currently disabled. This feature will be included in future versions." & Environment.NewLine & "Try pasting one cell at a time.", MsgBoxStyle.Information, "Cannot paste multiple cells") Else ReplaceValueInData(Clipboard.GetText(), e.Range.Row, e.Range.Col) End If @@ -636,7 +636,7 @@ Public Class ucrDataView Private Sub grdCurrSheet_BeforeCellKeyDown(sender As Object, e As BeforeCellKeyDownEventArgs) Handles grdCurrSheet.BeforeCellKeyDown If e.KeyCode = unvell.ReoGrid.Interaction.KeyCode.Delete OrElse e.KeyCode = unvell.ReoGrid.Interaction.KeyCode.Back Then - MsgBox("Deleting cells is currently disabled. This feature will be included in future versions." & vbNewLine & "To remove a cell's value, replace the value with NA.", MsgBoxStyle.Information, "Cannot delete cells.") + MsgBox("Deleting cells is currently disabled. This feature will be included in future versions." & Environment.NewLine & "To remove a cell's value, replace the value with NA.", MsgBoxStyle.Information, "Cannot delete cells.") e.IsCancelled = True End If End Sub @@ -681,14 +681,14 @@ Public Class ucrDataView dlgAddComment.ShowDialog() End Sub - Public Sub SetCurrentDataFrame(strDataName As String) - Dim grdWorksheet As unvell.ReoGrid.Worksheet - - If grdData IsNot Nothing Then - grdWorksheet = grdData.GetWorksheetByName(strDataName) - If grdWorksheet IsNot Nothing Then - grdData.CurrentWorksheet = grdWorksheet - End If - End If + Public Sub SetCurrentDataFrame(strDataName As String) + Dim grdWorksheet As unvell.ReoGrid.Worksheet + + If grdData IsNot Nothing Then + grdWorksheet = grdData.GetWorksheetByName(strDataName) + If grdWorksheet IsNot Nothing Then + grdData.CurrentWorksheet = grdWorksheet + End If + End If End Sub End Class diff --git a/instat/ucrFactor.vb b/instat/ucrFactor.vb index f0cf9b4d728..83505382a8d 100644 --- a/instat/ucrFactor.vb +++ b/instat/ucrFactor.vb @@ -15,24 +15,24 @@ ' along with this program. If not, see . Imports instat -Imports RDotNet -Imports unvell.ReoGrid.CellTypes -Imports unvell.ReoGrid.Events +Imports RDotNet +Imports unvell.ReoGrid.CellTypes +Imports unvell.ReoGrid.Events Imports unvell.ReoGrid - + Public Class ucrFactor - Public Event SelectedLevelChanged() - Public Event GridContentChanged() - Public Event GridVisibleChanged() - Public WithEvents clsReceiver As ucrReceiverSingle - Public WithEvents shtCurrSheet As unvell.ReoGrid.Worksheet - Public bIsSelector As Boolean - Public bIsMultipleSelector As Boolean - Public bIsGridColumn As Boolean - Public strColumnToGet As String - Public iSelectorColumnIndex As Integer + Public Event SelectedLevelChanged() + Public Event GridContentChanged() + Public Event GridVisibleChanged() + Public WithEvents clsReceiver As ucrReceiverSingle + Public WithEvents shtCurrSheet As unvell.ReoGrid.Worksheet + Public bIsSelector As Boolean + Public bIsMultipleSelector As Boolean + Public bIsGridColumn As Boolean + Public strColumnToGet As String + Public iSelectorColumnIndex As Integer Public strSelectorColumnName As String - Private bIsEditable As Boolean + Private bIsEditable As Boolean Private lstEditableColumns As List(Of String) Public bIncludeCopyOfLevels As Boolean Public strExtraColumn As String = "" @@ -66,81 +66,81 @@ Public Class ucrFactor strFreqName = "Freq" End Sub - Private Sub ucrFactor_Load(sender As Object, e As EventArgs) Handles MyBase.Load + Private Sub ucrFactor_Load(sender As Object, e As EventArgs) Handles MyBase.Load grdFactorData.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, False) RefreshFactorData() - End Sub - - Public Sub SetReceiver(clsNewReceiver As ucrReceiverSingle) + End Sub + + Public Sub SetReceiver(clsNewReceiver As ucrReceiverSingle) clsReceiver = clsNewReceiver If ucrChkLevels IsNot Nothing Then ucrChkLevels.Enabled = Not clsReceiver.IsEmpty - End If - RefreshFactorData() - End Sub - + End If + RefreshFactorData() + End Sub + Public Sub AddEditableColumns(strColumns As String()) lstEditableColumns.AddRange(strColumns) ApplyColumnSettings() - End Sub - - Public Sub SetAsSingleSelector() - bIsSelector = True - bIsMultipleSelector = False - bIsGridColumn = False - RefreshFactorData() - End Sub - - Public Sub SetAsMultipleSelector() - bIsSelector = True - bIsMultipleSelector = True - bIsGridColumn = False - RefreshFactorData() - End Sub + End Sub + + Public Sub SetAsSingleSelector() + bIsSelector = True + bIsMultipleSelector = False + bIsGridColumn = False + RefreshFactorData() + End Sub + + Public Sub SetAsMultipleSelector() + bIsSelector = True + bIsMultipleSelector = True + bIsGridColumn = False + RefreshFactorData() + End Sub Public Sub SetIsGridColumn(strColumnName As String) - bIsSelector = False - bIsMultipleSelector = False - bIsGridColumn = True - strColumnToGet = strColumnName + bIsSelector = False + bIsMultipleSelector = False + bIsGridColumn = True + strColumnToGet = strColumnName RefreshFactorData() - End Sub - - Public Sub SetAsViewerOnly() - bIsSelector = False - bIsMultipleSelector = False - RefreshFactorData() - End Sub - - Public Sub SetEditableStatus(bEditable As Boolean) - bIsEditable = bEditable - If shtCurrSheet IsNot Nothing Then - shtCurrSheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_Readonly, Not bEditable) - End If - End Sub - - Public Sub SetSelectorColumnName(strNewColumnName As String) - strSelectorColumnName = strNewColumnName - If iSelectorColumnIndex <> -1 Then - shtCurrSheet.ColumnHeaders(iSelectorColumnIndex).Text = strSelectorColumnName - Else - RefreshFactorData() - End If - End Sub - - Private Sub RefreshFactorData() - Dim dfTemp As DataFrame - Dim bShowGrid As Boolean = False - Dim clsGetFactorData As New RFunction - Dim clsConvertToCharacter As New RFunction - Dim bHasLevels As Boolean - Dim iLevelsCol As Integer - Dim iLabelsCol As Integer - Dim iFreqCol As Integer - Dim strColType As String - - grdFactorData.Worksheets.Clear() - ' Contains allows ordered factors to be included + End Sub + + Public Sub SetAsViewerOnly() + bIsSelector = False + bIsMultipleSelector = False + RefreshFactorData() + End Sub + + Public Sub SetEditableStatus(bEditable As Boolean) + bIsEditable = bEditable + If shtCurrSheet IsNot Nothing Then + shtCurrSheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_Readonly, Not bEditable) + End If + End Sub + + Public Sub SetSelectorColumnName(strNewColumnName As String) + strSelectorColumnName = strNewColumnName + If iSelectorColumnIndex <> -1 Then + shtCurrSheet.ColumnHeaders(iSelectorColumnIndex).Text = strSelectorColumnName + Else + RefreshFactorData() + End If + End Sub + + Private Sub RefreshFactorData() + Dim dfTemp As DataFrame + Dim bShowGrid As Boolean = False + Dim clsGetFactorData As New RFunction + Dim clsConvertToCharacter As New RFunction + Dim bHasLevels As Boolean + Dim iLevelsCol As Integer + Dim iLabelsCol As Integer + Dim iFreqCol As Integer + Dim strColType As String + + grdFactorData.Worksheets.Clear() + ' Contains allows ordered factors to be included If clsReceiver IsNot Nothing AndAlso Not clsReceiver.IsEmpty() Then strColType = frmMain.clsRLink.GetColumnType(clsReceiver.GetDataName(), clsReceiver.GetVariableNames(False)) If strColType = "" Then @@ -233,8 +233,8 @@ Public Class ucrFactor End If End If End If - End Sub - + End Sub + Private Sub ApplyColumnSettings() Dim lstColNumber As New List(Of Integer) Dim bIsReadOnly As Boolean @@ -248,19 +248,19 @@ Public Class ucrFactor Next Next End If - End Sub - - Private Sub clsReceiver_SelectionChanged(sender As Object, e As EventArgs) Handles clsReceiver.SelectionChanged - RefreshFactorData() - End Sub - - Private Sub InitialiseSelected() - 'sets the default as the reference level (always first level) - 'TODO are there other initial selections needed? - Dim i As Integer - Dim bSelect As Boolean - - If iSelectorColumnIndex <> -1 Then + End Sub + + Private Sub clsReceiver_SelectionChanged(sender As Object, e As EventArgs) Handles clsReceiver.SelectionChanged + RefreshFactorData() + End Sub + + Private Sub InitialiseSelected() + 'sets the default as the reference level (always first level) + 'TODO are there other initial selections needed? + Dim i As Integer + Dim bSelect As Boolean + + If iSelectorColumnIndex <> -1 Then For i = 0 To shtCurrSheet.RowCount - 1 If strSelectedLevels IsNot Nothing AndAlso strSelectedLevels.Count > 0 Then bSelect = strSelectedLevels.Contains(shtCurrSheet(i, 0)) @@ -268,11 +268,11 @@ Public Class ucrFactor bSelect = (i = 0) End If shtCurrSheet(i, iSelectorColumnIndex) = bSelect - Next - End If - strSelectedLevels = Nothing - End Sub - + Next + End If + strSelectedLevels = Nothing + End Sub + Public Sub AddLevel() Dim i As Integer Dim iNewRow As Integer @@ -297,15 +297,15 @@ Public Class ucrFactor Next End If ApplyColumnSettings() - End Sub - - Public Function GetSelectedLevels() As String - Dim strTemp As String = "" - Dim i As Integer - Dim checked As Boolean - Dim iCount As Integer = 0 - Dim iLabelsCol As Integer - + End Sub + + Public Function GetSelectedLevels() As String + Dim strTemp As String = "" + Dim i As Integer + Dim checked As Boolean + Dim iCount As Integer = 0 + Dim iLabelsCol As Integer + If grdFactorData.CurrentWorksheet IsNot Nothing Then iLabelsCol = GetColumnIndex(strLabelsName) For i = 0 To grdFactorData.CurrentWorksheet.RowCount - 1 @@ -326,9 +326,9 @@ Public Class ucrFactor strTemp = strTemp & ")" End If End If - Return strTemp - End Function - + Return strTemp + End Function + Public Function IsAllSelected() As Boolean If grdFactorData.CurrentWorksheet IsNot Nothing Then For i = 0 To grdFactorData.CurrentWorksheet.RowCount - 1 @@ -344,81 +344,81 @@ Public Class ucrFactor Else Return False End If - End Function - + End Function + Private Sub shtcurrsheet_celldatachanged(sender As Object, e As CellEventArgs) Handles shtCurrSheet.CellDataChanged UpdateCells(e.Cell.Column) - End Sub - + End Sub + Private Sub UpdateCells(Optional iColumn As Integer = -2) - Dim i As Integer - Dim iSelected As Boolean - If iColumn = iSelectorColumnIndex Then - For i = 0 To grdFactorData.CurrentWorksheet.RowCount - 1 - If shtCurrSheet(i, iSelectorColumnIndex) IsNot Nothing Then - iSelected = DirectCast(shtCurrSheet(i, iSelectorColumnIndex), Boolean) - If iSelected Then - shtCurrSheet.RowHeaders(i).Style.BackColor = Color.Gold - Else - shtCurrSheet.RowHeaders(i).Style.BackColor = Color.White - End If - End If - Next + Dim i As Integer + Dim iSelected As Boolean + If iColumn = iSelectorColumnIndex Then + For i = 0 To grdFactorData.CurrentWorksheet.RowCount - 1 + If shtCurrSheet(i, iSelectorColumnIndex) IsNot Nothing Then + iSelected = DirectCast(shtCurrSheet(i, iSelectorColumnIndex), Boolean) + If iSelected Then + shtCurrSheet.RowHeaders(i).Style.BackColor = Color.Gold + Else + shtCurrSheet.RowHeaders(i).Style.BackColor = Color.White + End If + End If + Next RaiseEvent SelectedLevelChanged() Else - RaiseEvent GridContentChanged() + RaiseEvent GridContentChanged() + End If + End Sub + + Public Function GetColumnInFactorSheet(iColumn As Integer, Optional bWithQuotes As Boolean = True) As String + Dim strTemp As String = "" + + If shtCurrSheet IsNot Nothing Then + If shtCurrSheet.RowCount = 1 Then + If bWithQuotes Then + strTemp = Chr(34) & shtCurrSheet(0, iColumn).ToString & Chr(34) + Else + strTemp = shtCurrSheet(0, iColumn).ToString + End If + ElseIf shtCurrSheet.RowCount > 1 Then + strTemp = "c(" + For i = 0 To shtCurrSheet.RowCount - 1 + If i > 0 Then + strTemp = strTemp & "," + End If + If shtCurrSheet(i, iColumn) IsNot Nothing Then + If bWithQuotes Then + strTemp = strTemp & Chr(34) & shtCurrSheet(i, iColumn).ToString & Chr(34) + Else + strTemp = strTemp & shtCurrSheet(i, iColumn).ToString + End If + End If + Next + strTemp = strTemp & ")" + End If End If - End Sub - - Public Function GetColumnInFactorSheet(iColumn As Integer, Optional bWithQuotes As Boolean = True) As String - Dim strTemp As String = "" - - If shtCurrSheet IsNot Nothing Then - If shtCurrSheet.RowCount = 1 Then - If bWithQuotes Then - strTemp = Chr(34) & shtCurrSheet(0, iColumn).ToString & Chr(34) - Else - strTemp = shtCurrSheet(0, iColumn).ToString - End If - ElseIf shtCurrSheet.RowCount > 1 Then - strTemp = "c(" - For i = 0 To shtCurrSheet.RowCount - 1 - If i > 0 Then - strTemp = strTemp & "," - End If - If shtCurrSheet(i, iColumn) IsNot Nothing Then - If bWithQuotes Then - strTemp = strTemp & Chr(34) & shtCurrSheet(i, iColumn).ToString & Chr(34) - Else - strTemp = strTemp & shtCurrSheet(i, iColumn).ToString - End If - End If - Next - strTemp = strTemp & ")" - End If - End If - - Return strTemp - End Function - - Public Function GetColumnInFactorSheet(strColumn As String, Optional bWithQuotes As Boolean = True) As String - Dim i As Integer - Dim iCol As Integer = -1 - Dim strTemp As String = "" - - If shtCurrSheet IsNot Nothing Then - For i = 0 To shtCurrSheet.ColumnCount - 1 - If shtCurrSheet.ColumnHeaders(i).Text = strColumn Then - iCol = i - Exit For - End If - Next - If iCol <> -1 Then strTemp = GetColumnInFactorSheet(iCol, bWithQuotes) - End If - Return strTemp + + Return strTemp End Function - Public Function GetColumnAsList(iColumn As Integer, Optional bWithQuotes As Boolean = True) As List(Of String) + Public Function GetColumnInFactorSheet(strColumn As String, Optional bWithQuotes As Boolean = True) As String + Dim i As Integer + Dim iCol As Integer = -1 + Dim strTemp As String = "" + + If shtCurrSheet IsNot Nothing Then + For i = 0 To shtCurrSheet.ColumnCount - 1 + If shtCurrSheet.ColumnHeaders(i).Text = strColumn Then + iCol = i + Exit For + End If + Next + If iCol <> -1 Then strTemp = GetColumnInFactorSheet(iCol, bWithQuotes) + End If + Return strTemp + End Function + + Public Function GetColumnAsList(iColumn As Integer, Optional bWithQuotes As Boolean = True) As List(Of String) Dim strTemp As New List(Of String) If shtCurrSheet IsNot Nothing Then @@ -438,27 +438,27 @@ Public Class ucrFactor Next End If End If - Return strTemp + Return strTemp End Function - Public Function GetColumnAsList(strColumn As String, Optional bWithQuotes As Boolean = True) As List(Of String) - Dim iColumn As Integer - + Public Function GetColumnAsList(strColumn As String, Optional bWithQuotes As Boolean = True) As List(Of String) + Dim iColumn As Integer + iColumn = GetColumnIndex(strColumn) Return GetColumnAsList(iColumn, bWithQuotes) - End Function + End Function - Public Sub SetSelectionAllLevels(bSelect As Boolean) - Dim i As Integer - If iSelectorColumnIndex <> -1 AndAlso bIsMultipleSelector = True Then + Public Sub SetSelectionAllLevels(bSelect As Boolean) + Dim i As Integer + If iSelectorColumnIndex <> -1 AndAlso bIsMultipleSelector = True Then For i = 0 To shtCurrSheet.RowCount - 1 shtCurrSheet(i, iSelectorColumnIndex) = bSelect - Next - End If + Next + End If End Sub Public Sub SetColumn(strValues As String(), iColumnIndex As Integer) - Dim i As Integer + Dim i As Integer If shtCurrSheet IsNot Nothing Then If strValues.Count <> shtCurrSheet.RowCount Then MsgBox("Developer error: Cannot set value of control " & Name & " because the list of values does not match the number of levels.") @@ -509,7 +509,7 @@ Public Class ucrFactor Private Sub shtCurrSheet_BeforeCellKeyDown(sender As Object, e As BeforeCellKeyDownEventArgs) Handles shtCurrSheet.BeforeCellKeyDown If e.KeyCode = unvell.ReoGrid.Interaction.KeyCode.Delete OrElse e.KeyCode = unvell.ReoGrid.Interaction.KeyCode.Back Then - MsgBox("Deleting cells is currently disabled. This feature will be included in future versions." & vbNewLine & "To remove a cell's value, replace the value with NA.", MsgBoxStyle.Information, "Cannot delete cells.") + MsgBox("Deleting cells is currently disabled. This feature will be included in future versions." & Environment.NewLine & "To remove a cell's value, replace the value with NA.", MsgBoxStyle.Information, "Cannot delete cells.") e.IsCancelled = True End If End Sub @@ -554,7 +554,7 @@ Public Class ucrFactor Private Sub shtCurrSheet_AfterCellEdit(sender As Object, e As CellAfterEditEventArgs) Handles shtCurrSheet.AfterCellEdit If shtCurrSheet.ColumnHeaders(e.Cell.Column).Text = strLevelsName AndAlso e.NewData.ToString() <> "" Then If Not IsNumeric(e.NewData) Then - MsgBox("Invalid value: " & e.NewData.ToString() & vbNewLine & "Levels must be numeric values.", MsgBoxStyle.Exclamation, "Invalid Value") + MsgBox("Invalid value: " & e.NewData.ToString() & Environment.NewLine & "Levels must be numeric values.", MsgBoxStyle.Exclamation, "Invalid Value") e.EndReason = EndEditReason.Cancel End If End If diff --git a/instat/ucrInputComboBox.vb b/instat/ucrInputComboBox.vb index 6b8b24f520d..96b93af47eb 100644 --- a/instat/ucrInputComboBox.vb +++ b/instat/ucrInputComboBox.vb @@ -13,9 +13,9 @@ ' ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . -Imports System.ComponentModel +Imports System.ComponentModel -Public Class ucrInputComboBox +Public Class ucrInputComboBox Dim strItemsType As String = "" Public Sub New() @@ -30,7 +30,7 @@ Public Class ucrInputComboBox '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 @@ -38,7 +38,7 @@ Public Class ucrInputComboBox 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." & vbNewLine & "Would you like it to be automatically corrected?", vbYesNo, "Invalid Name") + '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 @@ -50,52 +50,52 @@ Public Class ucrInputComboBox 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 SetItemsTypeAsTables() - strItemsType = "Tables" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsGraphs() - strItemsType = "Graphs" - FillItemTypes() - End Sub - - Public Sub SetItemsTypeAsFilters() - strItemsType = "Filters" - 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 "Data Frames" - 'TODO not yet implemented - Case "Models" + 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 SetItemsTypeAsTables() + strItemsType = "Tables" + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsGraphs() + strItemsType = "Graphs" + FillItemTypes() + End Sub + + Public Sub SetItemsTypeAsFilters() + strItemsType = "Filters" + 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 "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" + Case "Tables" If ucrDataFrameSelector IsNot Nothing Then cboInput.Items.Clear() cboInput.Items.AddRange(frmMain.clsRLink.GetTableNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray) @@ -105,43 +105,43 @@ Public Class ucrInputComboBox cboInput.Items.Clear() cboInput.Items.AddRange(frmMain.clsRLink.GetGraphNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) End If - Case "Filters" - If ucrDataFrameSelector IsNot Nothing Then + Case "Filters" + If ucrDataFrameSelector IsNot Nothing Then cboInput.Items.Clear() - cboInput.Items.AddRange(frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) - End If - End Select - End Sub - - Public Sub ucrDataFrameSelector_DataFrameChanged() Handles ucrDataFrameSelector.DataFrameChanged - FillItemTypes() - End Sub - - Public Overrides Sub SetDataFrameSelector(ucrNewSelector As ucrDataFrame) - MyBase.SetDataFrameSelector(ucrNewSelector) - FillItemTypes() - End Sub - + cboInput.Items.AddRange(frmMain.clsRLink.GetFilterNames(ucrDataFrameSelector.cboAvailableDataFrames.Text).ToArray()) + End If + End Select + End Sub + + Public Sub ucrDataFrameSelector_DataFrameChanged() Handles ucrDataFrameSelector.DataFrameChanged + 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 - + 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 Sub SetItems(Optional strItems As String() = Nothing, Optional bClearExisting As Boolean = True, Optional bAddConditions As Boolean = False) Dim dctValues As New Dictionary(Of String, String) If bAddConditions Then @@ -175,15 +175,15 @@ Public Class ucrInputComboBox dctDisplayParameterValues.Add(kvpTemp.Key, kvpTemp.Value) AddParameterValuesCondition(kvpTemp.Key, GetParameter().strArgumentName, kvpTemp.Value) Next - AdjustComboBoxWidth(cboInput) - End Sub - + 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 + + Private Sub cboInput_KeyPress(sender As Object, e As KeyPressEventArgs) Handles cboInput.KeyPress + bUserTyped = True End Sub 'Public Sub SetEditable(bEditable As Boolean) @@ -193,31 +193,31 @@ Public Class ucrInputComboBox ' 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 - + '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() + FillItemTypes() If bFirstLoad Then bFirstLoad = False - End If - End Sub - - Private Sub cboInput_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboInput.SelectedIndexChanged + 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 + 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 @@ -275,4 +275,4 @@ Public Class ucrInputComboBox End If End Sub -End Class +End Class diff --git a/instat/ucrInputTextBox.vb b/instat/ucrInputTextBox.vb index ab3facb30b3..8edd609dfdf 100644 --- a/instat/ucrInputTextBox.vb +++ b/instat/ucrInputTextBox.vb @@ -42,7 +42,7 @@ Public Class ucrInputTextBox 'TODO This message should contain the same message from ValidateText() 'Temp disabled so that change is done automatically 'TODO Think about more subtle ways to do this without being annoying to the user - 'Select Case MsgBox(Chr(34) & strCurrent & Chr(34) & " is an invalid name." & vbNewLine & "Would you like it to be automatically corrected?", vbYesNo, "Invalid Name") + '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 @@ -70,25 +70,25 @@ Public Class ucrInputTextBox Private Sub txtInput_TextChanged(sender As Object, e As EventArgs) Handles txtInput.TextChanged OnContentsChanged() - End Sub - + End Sub + Public Property IsMultiline As Boolean Get Return txtInput.Multiline - End Get - Set(bMultiline As Boolean) - txtInput.Multiline = bMultiline - End Set - End Property - + End Get + Set(bMultiline As Boolean) + txtInput.Multiline = bMultiline + End Set + End Property + Private Sub mnuRightClickCopy_Click(sender As Object, e As EventArgs) Handles mnuRightClickCopy.Click txtInput.Copy() End Sub - Private Sub ucrInputTextBox_Load(sender As Object, e As EventArgs) Handles Me.Load - If bFirstLoad Then - bFirstLoad = False - End If + Private Sub ucrInputTextBox_Load(sender As Object, e As EventArgs) Handles Me.Load + If bFirstLoad Then + bFirstLoad = False + End If End Sub Public Overrides Property IsReadOnly As Boolean diff --git a/instat/ucrScript.vb b/instat/ucrScript.vb index a354fec2f75..9e60d532f0e 100644 --- a/instat/ucrScript.vb +++ b/instat/ucrScript.vb @@ -34,6 +34,6 @@ Public Class ucrScript End Sub Public Sub AppendText(strText As String) - txtScript.Text = txtScript.Text & vbCrLf & strText + txtScript.Text = txtScript.Text & Environment.NewLine & strText End Sub End Class diff --git a/instat/ucrWPFRichTextBox.xaml.vb b/instat/ucrWPFRichTextBox.xaml.vb index 787ee567ad8..ebcc52701b3 100644 --- a/instat/ucrWPFRichTextBox.xaml.vb +++ b/instat/ucrWPFRichTextBox.xaml.vb @@ -79,7 +79,7 @@ Public Class ucrWPFRichTextBox Catch e As Exception Console.WriteLine("The process failed: {0}", e.Message) 'Temporarily adding a vb message box for debug purposes. - MsgBox(e.Message & vbNewLine & "A problem occured in attempting to create the directory: " & strDirectoryPath, MsgBoxStyle.Critical) + MsgBox(e.Message & Environment.NewLine & "A problem occured in attempting to create the directory: " & strDirectoryPath, MsgBoxStyle.Critical) End Try End Sub From cf614f67b4fd4c3d58f64cc5ea7e977e742907c7 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Fri, 16 Jun 2017 21:20:13 +0300 Subject: [PATCH 051/201] Changes on designer --- instat/dlgOptions.Designer.vb | 246 ++++++++++++++++++---------------- instat/dlgOptions.vb | 89 +++++++----- 2 files changed, 184 insertions(+), 151 deletions(-) diff --git a/instat/dlgOptions.Designer.vb b/instat/dlgOptions.Designer.vb index 79bca92196d..bcbe566391e 100644 --- a/instat/dlgOptions.Designer.vb +++ b/instat/dlgOptions.Designer.vb @@ -34,27 +34,27 @@ Partial Class dlgOptions Me.cmdOk = New System.Windows.Forms.Button() Me.tbcOptions = New System.Windows.Forms.TabControl() Me.tbpLanguages = New System.Windows.Forms.TabPage() - Me.pnLanguages = New System.Windows.Forms.Panel() Me.grpLanguage = New System.Windows.Forms.GroupBox() Me.rdoSpanish = New System.Windows.Forms.RadioButton() Me.rdoEnglish = New System.Windows.Forms.RadioButton() Me.rdoKiswahili = New System.Windows.Forms.RadioButton() Me.rdoFrench = New System.Windows.Forms.RadioButton() + Me.pnLanguages = New System.Windows.Forms.Panel() Me.tbpComments = New System.Windows.Forms.TabPage() Me.pnComments = New System.Windows.Forms.Panel() Me.lblComment = New System.Windows.Forms.Label() Me.txtComment = New System.Windows.Forms.TextBox() Me.tbpImport = New System.Windows.Forms.TabPage() Me.pnImportData = New System.Windows.Forms.Panel() + Me.ucrNudPreviewRows = New instat.ucrNud() Me.lblPreviewRows = New System.Windows.Forms.Label() - Me.nudPreviewRows = New System.Windows.Forms.NumericUpDown() Me.tbpOutputWindow = New System.Windows.Forms.TabPage() + Me.ucrChkShowRCommandsinOutputWindow = New instat.ucrCheck() + Me.ucrChkIncludeCommentsbyDefault = New instat.ucrCheck() Me.grpROptions = New System.Windows.Forms.GroupBox() - Me.chkShowSignifStars = New System.Windows.Forms.CheckBox() + Me.ucrChkShowSignifStars = New instat.ucrCheck() + Me.ucrNudDigits = New instat.ucrNud() Me.lblNoDigits = New System.Windows.Forms.Label() - Me.nudDigits = New System.Windows.Forms.NumericUpDown() - Me.chkShowRCommandsinOutputWindow = New System.Windows.Forms.CheckBox() - Me.chkIncludeCommentsbyDefault = New System.Windows.Forms.CheckBox() Me.pnFormatOptions = New System.Windows.Forms.Panel() Me.rtbCommentPreview = New System.Windows.Forms.RichTextBox() Me.rtbOutputPreview = New System.Windows.Forms.RichTextBox() @@ -71,40 +71,39 @@ Partial Class dlgOptions Me.lblFont = New System.Windows.Forms.Label() Me.tbpCommands = New System.Windows.Forms.TabPage() Me.pnScriptOptions = New System.Windows.Forms.Panel() - Me.chkIncludeDefaultParams = New System.Windows.Forms.CheckBox() + Me.ucrChkIncludeDefaultParams = New instat.ucrCheck() Me.tbpDataView = New System.Windows.Forms.TabPage() + Me.ucrNudMaxRows = New instat.ucrNud() Me.lblMaxRows = New System.Windows.Forms.Label() - Me.nudMaxRows = New System.Windows.Forms.NumericUpDown() Me.tbpWorkingDirectory = New System.Windows.Forms.TabPage() Me.cmdWorkingDirectory = New System.Windows.Forms.Button() Me.lblWorkingDirectory = New System.Windows.Forms.Label() + Me.ucrWorkingDirectory = New instat.ucrInputTextBox() Me.tbpGraphDisplay = New System.Windows.Forms.TabPage() + Me.ucrPnlGraphDisplay = New instat.UcrPanel() Me.rdoDisplayinSeparateWindows = New System.Windows.Forms.RadioButton() Me.rdoDisplayinRViewer = New System.Windows.Forms.RadioButton() Me.rdoDisplayinOutputWindow = New System.Windows.Forms.RadioButton() Me.trOptions = New System.Windows.Forms.TreeView() Me.spltControls = New System.Windows.Forms.SplitContainer() Me.cmdFactoryReset = New System.Windows.Forms.Button() - Me.ucrWorkingDirectory = New instat.ucrInputTextBox() + Me.ucrPnlLanguage = New instat.UcrPanel() Me.tbcOptions.SuspendLayout() Me.tbpLanguages.SuspendLayout() - Me.pnLanguages.SuspendLayout() Me.grpLanguage.SuspendLayout() + Me.pnLanguages.SuspendLayout() Me.tbpComments.SuspendLayout() Me.pnComments.SuspendLayout() Me.tbpImport.SuspendLayout() Me.pnImportData.SuspendLayout() - CType(Me.nudPreviewRows, System.ComponentModel.ISupportInitialize).BeginInit() Me.tbpOutputWindow.SuspendLayout() Me.grpROptions.SuspendLayout() - CType(Me.nudDigits, System.ComponentModel.ISupportInitialize).BeginInit() Me.pnFormatOptions.SuspendLayout() Me.tbpEditor.SuspendLayout() Me.pnFormatEditor.SuspendLayout() Me.tbpCommands.SuspendLayout() Me.pnScriptOptions.SuspendLayout() Me.tbpDataView.SuspendLayout() - CType(Me.nudMaxRows, System.ComponentModel.ISupportInitialize).BeginInit() Me.tbpWorkingDirectory.SuspendLayout() Me.tbpGraphDisplay.SuspendLayout() CType(Me.spltControls, System.ComponentModel.ISupportInitialize).BeginInit() @@ -183,22 +182,13 @@ Partial Class dlgOptions Me.tbpLanguages.Text = "Languages" Me.tbpLanguages.UseVisualStyleBackColor = True ' - 'pnLanguages - ' - Me.pnLanguages.AutoSize = True - Me.pnLanguages.Controls.Add(Me.grpLanguage) - Me.pnLanguages.Location = New System.Drawing.Point(3, 3) - Me.pnLanguages.Name = "pnLanguages" - Me.pnLanguages.Size = New System.Drawing.Size(122, 126) - Me.pnLanguages.TabIndex = 1 - ' 'grpLanguage ' Me.grpLanguage.Controls.Add(Me.rdoSpanish) Me.grpLanguage.Controls.Add(Me.rdoEnglish) Me.grpLanguage.Controls.Add(Me.rdoKiswahili) Me.grpLanguage.Controls.Add(Me.rdoFrench) - Me.grpLanguage.Location = New System.Drawing.Point(10, 10) + Me.grpLanguage.Location = New System.Drawing.Point(4, 3) Me.grpLanguage.Name = "grpLanguage" Me.grpLanguage.Size = New System.Drawing.Size(109, 113) Me.grpLanguage.TabIndex = 2 @@ -249,6 +239,16 @@ Partial Class dlgOptions Me.rdoFrench.Text = "French" Me.rdoFrench.UseVisualStyleBackColor = True ' + 'pnLanguages + ' + Me.pnLanguages.AutoSize = True + Me.pnLanguages.Controls.Add(Me.grpLanguage) + Me.pnLanguages.Controls.Add(Me.ucrPnlLanguage) + Me.pnLanguages.Location = New System.Drawing.Point(3, 3) + Me.pnLanguages.Name = "pnLanguages" + Me.pnLanguages.Size = New System.Drawing.Size(122, 126) + Me.pnLanguages.TabIndex = 1 + ' 'tbpComments ' Me.tbpComments.Controls.Add(Me.pnComments) @@ -303,13 +303,25 @@ Partial Class dlgOptions ' Me.pnImportData.AutoSize = True Me.pnImportData.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.pnImportData.Controls.Add(Me.ucrNudPreviewRows) Me.pnImportData.Controls.Add(Me.lblPreviewRows) - Me.pnImportData.Controls.Add(Me.nudPreviewRows) Me.pnImportData.Location = New System.Drawing.Point(10, 10) Me.pnImportData.Name = "pnImportData" - Me.pnImportData.Size = New System.Drawing.Size(181, 30) + Me.pnImportData.Size = New System.Drawing.Size(186, 28) Me.pnImportData.TabIndex = 2 ' + 'ucrNudPreviewRows + ' + Me.ucrNudPreviewRows.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudPreviewRows.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudPreviewRows.Location = New System.Drawing.Point(133, 5) + Me.ucrNudPreviewRows.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudPreviewRows.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudPreviewRows.Name = "ucrNudPreviewRows" + Me.ucrNudPreviewRows.Size = New System.Drawing.Size(50, 20) + Me.ucrNudPreviewRows.TabIndex = 3 + Me.ucrNudPreviewRows.Value = New Decimal(New Integer() {10, 0, 0, 0}) + ' 'lblPreviewRows ' Me.lblPreviewRows.AutoSize = True @@ -319,20 +331,11 @@ Partial Class dlgOptions Me.lblPreviewRows.TabIndex = 0 Me.lblPreviewRows.Text = "Number of Preview Rows:" ' - 'nudPreviewRows - ' - Me.nudPreviewRows.Location = New System.Drawing.Point(134, 7) - Me.nudPreviewRows.Minimum = New Decimal(New Integer() {10, 0, 0, 0}) - Me.nudPreviewRows.Name = "nudPreviewRows" - Me.nudPreviewRows.Size = New System.Drawing.Size(44, 20) - Me.nudPreviewRows.TabIndex = 1 - Me.nudPreviewRows.Value = New Decimal(New Integer() {10, 0, 0, 0}) - ' 'tbpOutputWindow ' + Me.tbpOutputWindow.Controls.Add(Me.ucrChkShowRCommandsinOutputWindow) + Me.tbpOutputWindow.Controls.Add(Me.ucrChkIncludeCommentsbyDefault) Me.tbpOutputWindow.Controls.Add(Me.grpROptions) - Me.tbpOutputWindow.Controls.Add(Me.chkShowRCommandsinOutputWindow) - Me.tbpOutputWindow.Controls.Add(Me.chkIncludeCommentsbyDefault) Me.tbpOutputWindow.Controls.Add(Me.pnFormatOptions) Me.tbpOutputWindow.Location = New System.Drawing.Point(4, 22) Me.tbpOutputWindow.Name = "tbpOutputWindow" @@ -342,11 +345,27 @@ Partial Class dlgOptions Me.tbpOutputWindow.Text = "Output Window" Me.tbpOutputWindow.UseVisualStyleBackColor = True ' + 'ucrChkShowRCommandsinOutputWindow + ' + Me.ucrChkShowRCommandsinOutputWindow.Checked = False + Me.ucrChkShowRCommandsinOutputWindow.Location = New System.Drawing.Point(10, 168) + Me.ucrChkShowRCommandsinOutputWindow.Name = "ucrChkShowRCommandsinOutputWindow" + Me.ucrChkShowRCommandsinOutputWindow.Size = New System.Drawing.Size(271, 20) + Me.ucrChkShowRCommandsinOutputWindow.TabIndex = 27 + ' + 'ucrChkIncludeCommentsbyDefault + ' + Me.ucrChkIncludeCommentsbyDefault.Checked = False + Me.ucrChkIncludeCommentsbyDefault.Location = New System.Drawing.Point(10, 145) + Me.ucrChkIncludeCommentsbyDefault.Name = "ucrChkIncludeCommentsbyDefault" + Me.ucrChkIncludeCommentsbyDefault.Size = New System.Drawing.Size(271, 20) + Me.ucrChkIncludeCommentsbyDefault.TabIndex = 26 + ' 'grpROptions ' - Me.grpROptions.Controls.Add(Me.chkShowSignifStars) + Me.grpROptions.Controls.Add(Me.ucrChkShowSignifStars) + Me.grpROptions.Controls.Add(Me.ucrNudDigits) Me.grpROptions.Controls.Add(Me.lblNoDigits) - Me.grpROptions.Controls.Add(Me.nudDigits) Me.grpROptions.Location = New System.Drawing.Point(10, 192) Me.grpROptions.Name = "grpROptions" Me.grpROptions.Size = New System.Drawing.Size(271, 93) @@ -354,15 +373,25 @@ Partial Class dlgOptions Me.grpROptions.TabStop = False Me.grpROptions.Text = "R Options" ' - 'chkShowSignifStars + 'ucrChkShowSignifStars + ' + Me.ucrChkShowSignifStars.Checked = False + Me.ucrChkShowSignifStars.Location = New System.Drawing.Point(7, 49) + Me.ucrChkShowSignifStars.Name = "ucrChkShowSignifStars" + Me.ucrChkShowSignifStars.Size = New System.Drawing.Size(255, 20) + Me.ucrChkShowSignifStars.TabIndex = 28 ' - Me.chkShowSignifStars.AutoSize = True - Me.chkShowSignifStars.Location = New System.Drawing.Point(7, 49) - Me.chkShowSignifStars.Name = "chkShowSignifStars" - Me.chkShowSignifStars.Size = New System.Drawing.Size(240, 17) - Me.chkShowSignifStars.TabIndex = 26 - Me.chkShowSignifStars.Text = "Show stars on summary tables for coefficients" - Me.chkShowSignifStars.UseVisualStyleBackColor = True + 'ucrNudDigits + ' + Me.ucrNudDigits.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDigits.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDigits.Location = New System.Drawing.Point(152, 21) + Me.ucrNudDigits.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDigits.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDigits.Name = "ucrNudDigits" + Me.ucrNudDigits.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDigits.TabIndex = 27 + Me.ucrNudDigits.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'lblNoDigits ' @@ -373,33 +402,6 @@ Partial Class dlgOptions Me.lblNoDigits.TabIndex = 1 Me.lblNoDigits.Text = "Number of Digits to Display:" ' - 'nudDigits - ' - Me.nudDigits.Location = New System.Drawing.Point(152, 21) - Me.nudDigits.Name = "nudDigits" - Me.nudDigits.Size = New System.Drawing.Size(39, 20) - Me.nudDigits.TabIndex = 0 - ' - 'chkShowRCommandsinOutputWindow - ' - Me.chkShowRCommandsinOutputWindow.AutoSize = True - Me.chkShowRCommandsinOutputWindow.Location = New System.Drawing.Point(10, 168) - Me.chkShowRCommandsinOutputWindow.Name = "chkShowRCommandsinOutputWindow" - Me.chkShowRCommandsinOutputWindow.Size = New System.Drawing.Size(207, 17) - Me.chkShowRCommandsinOutputWindow.TabIndex = 24 - Me.chkShowRCommandsinOutputWindow.Text = "Show R Commands in Output Window" - Me.chkShowRCommandsinOutputWindow.UseVisualStyleBackColor = True - ' - 'chkIncludeCommentsbyDefault - ' - Me.chkIncludeCommentsbyDefault.AutoSize = True - Me.chkIncludeCommentsbyDefault.Location = New System.Drawing.Point(10, 145) - Me.chkIncludeCommentsbyDefault.Name = "chkIncludeCommentsbyDefault" - Me.chkIncludeCommentsbyDefault.Size = New System.Drawing.Size(164, 17) - Me.chkIncludeCommentsbyDefault.TabIndex = 24 - Me.chkIncludeCommentsbyDefault.Text = "Include Comments by Default" - Me.chkIncludeCommentsbyDefault.UseVisualStyleBackColor = True - ' 'pnFormatOptions ' Me.pnFormatOptions.AutoSize = True @@ -554,29 +556,25 @@ Partial Class dlgOptions ' 'pnScriptOptions ' - Me.pnScriptOptions.AutoSize = True Me.pnScriptOptions.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.pnScriptOptions.Controls.Add(Me.chkIncludeDefaultParams) + Me.pnScriptOptions.Controls.Add(Me.ucrChkIncludeDefaultParams) Me.pnScriptOptions.Location = New System.Drawing.Point(10, 10) Me.pnScriptOptions.Name = "pnScriptOptions" - Me.pnScriptOptions.Size = New System.Drawing.Size(267, 23) + Me.pnScriptOptions.Size = New System.Drawing.Size(267, 28) Me.pnScriptOptions.TabIndex = 1 ' - 'chkIncludeDefaultParams + 'ucrChkIncludeDefaultParams ' - Me.chkIncludeDefaultParams.AutoSize = True - Me.chkIncludeDefaultParams.Location = New System.Drawing.Point(3, 3) - Me.chkIncludeDefaultParams.Name = "chkIncludeDefaultParams" - Me.chkIncludeDefaultParams.Size = New System.Drawing.Size(261, 17) - Me.chkIncludeDefaultParams.TabIndex = 0 - Me.chkIncludeDefaultParams.Tag = "Include_Default_Parameter_Values_in_R_Commands" - Me.chkIncludeDefaultParams.Text = "Include Default Parameter Values in R Commands" - Me.chkIncludeDefaultParams.UseVisualStyleBackColor = True + Me.ucrChkIncludeDefaultParams.Checked = False + Me.ucrChkIncludeDefaultParams.Location = New System.Drawing.Point(2, 2) + Me.ucrChkIncludeDefaultParams.Name = "ucrChkIncludeDefaultParams" + Me.ucrChkIncludeDefaultParams.Size = New System.Drawing.Size(261, 21) + Me.ucrChkIncludeDefaultParams.TabIndex = 3 ' 'tbpDataView ' + Me.tbpDataView.Controls.Add(Me.ucrNudMaxRows) Me.tbpDataView.Controls.Add(Me.lblMaxRows) - Me.tbpDataView.Controls.Add(Me.nudMaxRows) Me.tbpDataView.Location = New System.Drawing.Point(4, 22) Me.tbpDataView.Name = "tbpDataView" Me.tbpDataView.Padding = New System.Windows.Forms.Padding(3) @@ -585,6 +583,18 @@ Partial Class dlgOptions Me.tbpDataView.Text = "Data View" Me.tbpDataView.UseVisualStyleBackColor = True ' + 'ucrNudMaxRows + ' + Me.ucrNudMaxRows.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudMaxRows.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudMaxRows.Location = New System.Drawing.Point(198, 15) + Me.ucrNudMaxRows.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudMaxRows.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudMaxRows.Name = "ucrNudMaxRows" + Me.ucrNudMaxRows.Size = New System.Drawing.Size(50, 20) + Me.ucrNudMaxRows.TabIndex = 2 + Me.ucrNudMaxRows.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'lblMaxRows ' Me.lblMaxRows.AutoSize = True @@ -594,15 +604,6 @@ Partial Class dlgOptions Me.lblMaxRows.TabIndex = 1 Me.lblMaxRows.Text = "Maximum Number of Rows to Display:" ' - 'nudMaxRows - ' - Me.nudMaxRows.Location = New System.Drawing.Point(198, 15) - Me.nudMaxRows.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudMaxRows.Name = "nudMaxRows" - Me.nudMaxRows.Size = New System.Drawing.Size(62, 20) - Me.nudMaxRows.TabIndex = 0 - Me.nudMaxRows.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' 'tbpWorkingDirectory ' Me.tbpWorkingDirectory.Controls.Add(Me.cmdWorkingDirectory) @@ -634,11 +635,22 @@ Partial Class dlgOptions Me.lblWorkingDirectory.TabIndex = 0 Me.lblWorkingDirectory.Text = "Working Directory:" ' + 'ucrWorkingDirectory + ' + Me.ucrWorkingDirectory.AddQuotesIfUnrecognised = True + Me.ucrWorkingDirectory.IsMultiline = False + Me.ucrWorkingDirectory.IsReadOnly = False + Me.ucrWorkingDirectory.Location = New System.Drawing.Point(111, 17) + Me.ucrWorkingDirectory.Name = "ucrWorkingDirectory" + Me.ucrWorkingDirectory.Size = New System.Drawing.Size(282, 21) + Me.ucrWorkingDirectory.TabIndex = 1 + ' 'tbpGraphDisplay ' Me.tbpGraphDisplay.Controls.Add(Me.rdoDisplayinSeparateWindows) Me.tbpGraphDisplay.Controls.Add(Me.rdoDisplayinRViewer) Me.tbpGraphDisplay.Controls.Add(Me.rdoDisplayinOutputWindow) + Me.tbpGraphDisplay.Controls.Add(Me.ucrPnlGraphDisplay) Me.tbpGraphDisplay.Location = New System.Drawing.Point(4, 22) Me.tbpGraphDisplay.Name = "tbpGraphDisplay" Me.tbpGraphDisplay.Padding = New System.Windows.Forms.Padding(3) @@ -647,9 +659,17 @@ Partial Class dlgOptions Me.tbpGraphDisplay.Text = "Graph Display" Me.tbpGraphDisplay.UseVisualStyleBackColor = True ' + 'ucrPnlGraphDisplay + ' + Me.ucrPnlGraphDisplay.Location = New System.Drawing.Point(0, 3) + Me.ucrPnlGraphDisplay.Name = "ucrPnlGraphDisplay" + Me.ucrPnlGraphDisplay.Size = New System.Drawing.Size(169, 66) + Me.ucrPnlGraphDisplay.TabIndex = 3 + ' 'rdoDisplayinSeparateWindows ' Me.rdoDisplayinSeparateWindows.AutoSize = True + Me.rdoDisplayinSeparateWindows.Checked = True Me.rdoDisplayinSeparateWindows.Location = New System.Drawing.Point(6, 52) Me.rdoDisplayinSeparateWindows.Name = "rdoDisplayinSeparateWindows" Me.rdoDisplayinSeparateWindows.Size = New System.Drawing.Size(163, 17) @@ -665,7 +685,6 @@ Partial Class dlgOptions Me.rdoDisplayinRViewer.Name = "rdoDisplayinRViewer" Me.rdoDisplayinRViewer.Size = New System.Drawing.Size(116, 17) Me.rdoDisplayinRViewer.TabIndex = 1 - Me.rdoDisplayinRViewer.TabStop = True Me.rdoDisplayinRViewer.Text = "Display in R Viewer" Me.rdoDisplayinRViewer.UseVisualStyleBackColor = True ' @@ -676,7 +695,6 @@ Partial Class dlgOptions Me.rdoDisplayinOutputWindow.Name = "rdoDisplayinOutputWindow" Me.rdoDisplayinOutputWindow.Size = New System.Drawing.Size(147, 17) Me.rdoDisplayinOutputWindow.TabIndex = 1 - Me.rdoDisplayinOutputWindow.TabStop = True Me.rdoDisplayinOutputWindow.Text = "Display in Output Window" Me.rdoDisplayinOutputWindow.UseVisualStyleBackColor = True ' @@ -738,13 +756,12 @@ Partial Class dlgOptions Me.cmdFactoryReset.Text = "Factory Reset" Me.cmdFactoryReset.UseVisualStyleBackColor = True ' - 'ucrWorkingDirectory + 'ucrPnlLanguage ' - Me.ucrWorkingDirectory.IsReadOnly = False - Me.ucrWorkingDirectory.Location = New System.Drawing.Point(111, 17) - Me.ucrWorkingDirectory.Name = "ucrWorkingDirectory" - Me.ucrWorkingDirectory.Size = New System.Drawing.Size(282, 21) - Me.ucrWorkingDirectory.TabIndex = 1 + Me.ucrPnlLanguage.Location = New System.Drawing.Point(4, 1) + Me.ucrPnlLanguage.Name = "ucrPnlLanguage" + Me.ucrPnlLanguage.Size = New System.Drawing.Size(109, 115) + Me.ucrPnlLanguage.TabIndex = 0 ' 'dlgOptions ' @@ -766,9 +783,9 @@ Partial Class dlgOptions Me.tbcOptions.ResumeLayout(False) Me.tbpLanguages.ResumeLayout(False) Me.tbpLanguages.PerformLayout() - Me.pnLanguages.ResumeLayout(False) Me.grpLanguage.ResumeLayout(False) Me.grpLanguage.PerformLayout() + Me.pnLanguages.ResumeLayout(False) Me.tbpComments.ResumeLayout(False) Me.tbpComments.PerformLayout() Me.pnComments.ResumeLayout(False) @@ -777,12 +794,10 @@ Partial Class dlgOptions Me.tbpImport.PerformLayout() Me.pnImportData.ResumeLayout(False) Me.pnImportData.PerformLayout() - CType(Me.nudPreviewRows, System.ComponentModel.ISupportInitialize).EndInit() Me.tbpOutputWindow.ResumeLayout(False) Me.tbpOutputWindow.PerformLayout() Me.grpROptions.ResumeLayout(False) Me.grpROptions.PerformLayout() - CType(Me.nudDigits, System.ComponentModel.ISupportInitialize).EndInit() Me.pnFormatOptions.ResumeLayout(False) Me.pnFormatOptions.PerformLayout() Me.tbpEditor.ResumeLayout(False) @@ -790,12 +805,9 @@ Partial Class dlgOptions Me.pnFormatEditor.ResumeLayout(False) Me.pnFormatEditor.PerformLayout() Me.tbpCommands.ResumeLayout(False) - Me.tbpCommands.PerformLayout() Me.pnScriptOptions.ResumeLayout(False) - Me.pnScriptOptions.PerformLayout() Me.tbpDataView.ResumeLayout(False) Me.tbpDataView.PerformLayout() - CType(Me.nudMaxRows, System.ComponentModel.ISupportInitialize).EndInit() Me.tbpWorkingDirectory.ResumeLayout(False) Me.tbpWorkingDirectory.PerformLayout() Me.tbpGraphDisplay.ResumeLayout(False) @@ -826,7 +838,6 @@ Partial Class dlgOptions Friend WithEvents tbpImport As TabPage Friend WithEvents pnImportData As Panel Friend WithEvents lblPreviewRows As Label - Friend WithEvents nudPreviewRows As NumericUpDown Friend WithEvents tbpOutputWindow As TabPage Friend WithEvents pnFormatOptions As Panel Friend WithEvents rtbCommentPreview As RichTextBox @@ -844,10 +855,8 @@ Partial Class dlgOptions Friend WithEvents lblFont As Label Friend WithEvents tbpCommands As TabPage Friend WithEvents pnScriptOptions As Panel - Friend WithEvents chkIncludeDefaultParams As CheckBox Friend WithEvents tbpDataView As TabPage Friend WithEvents lblMaxRows As Label - Friend WithEvents nudMaxRows As NumericUpDown Friend WithEvents tbpWorkingDirectory As TabPage Friend WithEvents cmdWorkingDirectory As Button Friend WithEvents ucrWorkingDirectory As ucrInputTextBox @@ -858,11 +867,16 @@ Partial Class dlgOptions Friend WithEvents rdoDisplayinSeparateWindows As RadioButton Friend WithEvents rdoDisplayinRViewer As RadioButton Friend WithEvents rdoDisplayinOutputWindow As RadioButton - Friend WithEvents chkShowRCommandsinOutputWindow As CheckBox - Friend WithEvents chkIncludeCommentsbyDefault As CheckBox Friend WithEvents grpROptions As GroupBox Friend WithEvents lblNoDigits As Label - Friend WithEvents nudDigits As NumericUpDown - Friend WithEvents chkShowSignifStars As CheckBox Friend WithEvents cmdFactoryReset As Button + Friend WithEvents ucrNudPreviewRows As ucrNud + Friend WithEvents ucrNudDigits As ucrNud + Friend WithEvents ucrChkIncludeCommentsbyDefault As ucrCheck + Friend WithEvents ucrChkShowRCommandsinOutputWindow As ucrCheck + Friend WithEvents ucrChkShowSignifStars As ucrCheck + Friend WithEvents ucrChkIncludeDefaultParams As ucrCheck + Friend WithEvents ucrNudMaxRows As ucrNud + Friend WithEvents ucrPnlGraphDisplay As UcrPanel + Friend WithEvents ucrPnlLanguage As UcrPanel End Class diff --git a/instat/dlgOptions.vb b/instat/dlgOptions.vb index 1db2618421a..8fdbe360daf 100644 --- a/instat/dlgOptions.vb +++ b/instat/dlgOptions.vb @@ -45,8 +45,8 @@ Public Class dlgOptions Private Sub InitialiseDialog() 'ucrBase.iHelpTopicID = 336 Dim strPreviewText As String - nudMaxRows.Maximum = Integer.MaxValue - nudMaxRows.Increment = 10 + ucrNudMaxRows.Maximum = Integer.MaxValue + ucrNudMaxRows.Increment = 10 strPreviewText = "R-Instat 2016" rtbCommandPreview.Text = strPreviewText rtbCommentPreview.Text = strPreviewText @@ -56,24 +56,33 @@ Public Class dlgOptions rdoFrench.Enabled = False rdoKiswahili.Enabled = False rdoSpanish.Enabled = False - nudDigits.Minimum = 0 - nudDigits.Maximum = 22 + ucrNudDigits.SetMinMax(0, 22) + ucrChkIncludeCommentsbyDefault.SetText("Include Comments by Default") + ucrChkShowRCommandsinOutputWindow.SetText(" Show R Commands in Output Window") + ucrChkShowSignifStars.SetText("Show stars on summary tables for coefficients") + ucrChkIncludeDefaultParams.SetText("Include Default Parameter Values in R Commands") + ucrPnlGraphDisplay.AddRadioButton(rdoDisplayinOutputWindow) + ucrPnlGraphDisplay.AddRadioButton(rdoDisplayinRViewer) + ucrPnlGraphDisplay.AddRadioButton(rdoDisplayinSeparateWindows) + + 'ucrNudDigits.Minimum = 0 + 'ucrNudDigits.Maximum = 22 End Sub Private Sub LoadInstatOptions() - chkIncludeDefaultParams.Checked = frmMain.clsInstatOptions.bIncludeRDefaultParameters + ucrChkIncludeDefaultParams.Checked = frmMain.clsInstatOptions.bIncludeRDefaultParameters SetOutputFont(frmMain.clsInstatOptions.fntOutput, frmMain.clsInstatOptions.clrOutput) SetCommandFont(frmMain.clsInstatOptions.fntScript, frmMain.clsInstatOptions.clrScript) SetCommentFont(frmMain.clsInstatOptions.fntComment, frmMain.clsInstatOptions.clrComment) SetEditorFont(frmMain.clsInstatOptions.fntEditor, frmMain.clsInstatOptions.clrEditor) - nudMaxRows.Value = frmMain.clsInstatOptions.iMaxRows - nudPreviewRows.Value = frmMain.clsInstatOptions.iPreviewRows + ucrNudMaxRows.Value = frmMain.clsInstatOptions.iMaxRows + ucrNudPreviewRows.Value = frmMain.clsInstatOptions.iPreviewRows txtComment.Text = frmMain.clsInstatOptions.strComment ucrWorkingDirectory.SetName(frmMain.clsInstatOptions.strWorkingDirectory) - chkIncludeCommentsbyDefault.Checked = frmMain.clsInstatOptions.bIncludeCommentDefault - chkShowRCommandsinOutputWindow.Checked = frmMain.clsInstatOptions.bCommandsinOutput - nudDigits.Value = frmMain.clsInstatOptions.iDigits - chkShowSignifStars.Checked = frmMain.clsInstatOptions.bShowSignifStars + ucrChkIncludeCommentsbyDefault.Checked = frmMain.clsInstatOptions.bIncludeCommentDefault + ucrChkShowRCommandsinOutputWindow.Checked = frmMain.clsInstatOptions.bCommandsinOutput + ucrNudDigits.Value = frmMain.clsInstatOptions.iDigits + ucrChkShowSignifStars.Checked = frmMain.clsInstatOptions.bShowSignifStars Select Case frmMain.clsInstatOptions.strLanguageCultureCode Case "en-GB" @@ -99,21 +108,21 @@ Public Class dlgOptions End Sub Private Sub SetInstatOptions() - frmMain.clsInstatOptions.bIncludeRDefaultParameters = chkIncludeDefaultParams.Checked + frmMain.clsInstatOptions.bIncludeRDefaultParameters = ucrChkIncludeDefaultParams.Checked frmMain.clsInstatOptions.SetFormatOutput(fntOutput, clrOutput) frmMain.clsInstatOptions.SetFormatComment(fntComment, clrComment) frmMain.clsInstatOptions.SetFormatScript(fntCommand, clrCommand) frmMain.clsInstatOptions.SetFormatEditor(fntEditor, clrEditor) frmMain.clsInstatOptions.SetComment(txtComment.Text) - frmMain.clsInstatOptions.SetPreviewRows(nudPreviewRows.Value) - frmMain.clsInstatOptions.SetMaxRows(nudMaxRows.Value) + frmMain.clsInstatOptions.SetPreviewRows(ucrNudPreviewRows.Value) + frmMain.clsInstatOptions.SetMaxRows(ucrNudMaxRows.Value) frmMain.clsInstatOptions.SetLanguageCultureCode(strCurrLanguageCulture) frmMain.clsInstatOptions.SetWorkingDirectory(strWorkingDirectory) frmMain.clsInstatOptions.SetGraphDisplayOption(strGraphDisplayOption) - frmMain.clsInstatOptions.bIncludeCommentDefault = chkIncludeCommentsbyDefault.Checked - frmMain.clsInstatOptions.SetCommandInOutpt(chkShowRCommandsinOutputWindow.Checked) - frmMain.clsInstatOptions.SetDigits(nudDigits.Value) - frmMain.clsInstatOptions.SetSignifStars(chkShowSignifStars.Checked) + frmMain.clsInstatOptions.bIncludeCommentDefault = ucrChkIncludeCommentsbyDefault.Checked + frmMain.clsInstatOptions.SetCommandInOutpt(ucrChkShowRCommandsinOutputWindow.Checked) + frmMain.clsInstatOptions.SetDigits(ucrNudDigits.Value) + frmMain.clsInstatOptions.SetSignifStars(ucrChkShowSignifStars.Checked) End Sub Private Sub SetView() @@ -278,35 +287,35 @@ Public Class dlgOptions End Sub - Private Sub nudNoLines_ValueChanged(sender As Object, e As EventArgs) Handles nudPreviewRows.TextChanged + Private Sub ucrNudPreviewRows_ValueChanged() Handles ucrNudPreviewRows.ControlValueChanged ApplyEnabled(True) - End Sub - - Private Sub chkIncludeDefaultParams_CheckedChanged(sender As Object, e As EventArgs) Handles chkIncludeDefaultParams.CheckedChanged + End Sub + + Private Sub ucrChkIncludeCommentsbyDefault_controlvaluechanged() Handles ucrChkIncludeCommentsbyDefault.ControlValueChanged ApplyEnabled(True) End Sub - Private Sub nudMaxRows_TextChanged(sender As Object, e As EventArgs) Handles nudMaxRows.TextChanged + Private Sub nudMaxRows_TextChanged() Handles ucrNudMaxRows.ControlValueChanged ApplyEnabled(True) End Sub Private Sub rdoDisplayinOutputWindow_CheckedChanged(sender As Object, e As EventArgs) Handles rdoDisplayinOutputWindow.CheckedChanged, rdoDisplayinSeparateWindows.CheckedChanged, rdoDisplayinRViewer.CheckedChanged - If rdoDisplayinOutputWindow.Checked Then - strGraphDisplayOption = "view_output_window" - ElseIf rdoDisplayinSeparateWindows.Checked Then - strGraphDisplayOption = "view_separate_window" - ElseIf rdoDisplayinRViewer.Checked Then - strGraphDisplayOption = "view_R_viewer" - End If + 'If rdoDisplayinOutputWindow.Checked Then + ' strGraphDisplayOption = "view_output_window" + 'ElseIf rdoDisplayinSeparateWindows.Checked Then + ' strGraphDisplayOption = "view_separate_window" + 'ElseIf rdoDisplayinRViewer.Checked Then + ' strGraphDisplayOption = "view_R_viewer" + 'End If - ApplyEnabled(True) + 'ApplyEnabled(True) End Sub - Private Sub chkDefault_CheckedChanged(sender As Object, e As EventArgs) Handles chkIncludeCommentsbyDefault.CheckedChanged + Private Sub ucrChkIncludeDefaultParams_ControlValueChanged() Handles ucrChkIncludeDefaultParams.ControlValueChanged ApplyEnabled(True) End Sub - Private Sub chkShowRCommandsinOutputWindow_CheckedChanged(sender As Object, e As EventArgs) Handles chkShowRCommandsinOutputWindow.CheckedChanged + Private Sub chkShowRCommandsinOutputWindow_CheckedChanged() Handles ucrChkShowRCommandsinOutputWindow.ControlValueChanged ApplyEnabled(True) End Sub @@ -333,6 +342,16 @@ Public Class dlgOptions End If End Sub + Private Sub ucrPnlGraphDisplay_ControlValueChanged() Handles ucrPnlGraphDisplay.ControlValueChanged + If rdoDisplayinOutputWindow.Checked Then + strGraphDisplayOption = "view_output_window" + ElseIf rdoDisplayinSeparateWindows.Checked Then + strGraphDisplayOption = "view_separate_window" + ElseIf rdoDisplayinRViewer.Checked Then + strGraphDisplayOption = "view_R_viewer" + End If + ApplyEnabled(True) + End Sub Private Sub SetCommandFont(fntNew As Font, clrNew As Color) fntCommand = fntNew clrCommand = clrNew @@ -365,11 +384,11 @@ Public Class dlgOptions End If End Sub - Private Sub nudDigits_ValueChanged(sender As Object, e As EventArgs) Handles nudDigits.ValueChanged + Private Sub ucrNudDigits_ValueChanged() Handles ucrNudDigits.ControlValueChanged ApplyEnabled(True) End Sub - Private Sub chkShowSignifStars_CheckedChanged(sender As Object, e As EventArgs) Handles chkShowSignifStars.CheckedChanged + Private Sub ucrChkShowSignifStars_CheckedChanged() Handles ucrChkShowSignifStars.ControlValueChanged ApplyEnabled(True) End Sub End Class \ No newline at end of file From 9cb0e277fa9e60e976b5df4c1311a309dc5ac007 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Fri, 16 Jun 2017 21:42:41 +0300 Subject: [PATCH 052/201] More edits --- instat/dlgOptions.Designer.vb | 149 +++++++++++++++++----------------- instat/dlgOptions.vb | 13 +-- 2 files changed, 83 insertions(+), 79 deletions(-) diff --git a/instat/dlgOptions.Designer.vb b/instat/dlgOptions.Designer.vb index bcbe566391e..236de55fff0 100644 --- a/instat/dlgOptions.Designer.vb +++ b/instat/dlgOptions.Designer.vb @@ -22,28 +22,29 @@ Partial Class dlgOptions 'Do not modify it using the code editor. Private Sub InitializeComponent() - 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") + 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") Me.cmdApply = New System.Windows.Forms.Button() Me.cmdHelp = New System.Windows.Forms.Button() Me.cmdCancel = New System.Windows.Forms.Button() Me.cmdOk = New System.Windows.Forms.Button() Me.tbcOptions = New System.Windows.Forms.TabControl() Me.tbpLanguages = New System.Windows.Forms.TabPage() + Me.pnLanguages = New System.Windows.Forms.Panel() Me.grpLanguage = New System.Windows.Forms.GroupBox() Me.rdoSpanish = New System.Windows.Forms.RadioButton() Me.rdoEnglish = New System.Windows.Forms.RadioButton() Me.rdoKiswahili = New System.Windows.Forms.RadioButton() Me.rdoFrench = New System.Windows.Forms.RadioButton() - Me.pnLanguages = New System.Windows.Forms.Panel() + Me.ucrPnlLanguage = New instat.UcrPanel() Me.tbpComments = New System.Windows.Forms.TabPage() Me.pnComments = New System.Windows.Forms.Panel() + Me.ucrInputComment = New instat.ucrInputTextBox() Me.lblComment = New System.Windows.Forms.Label() - Me.txtComment = New System.Windows.Forms.TextBox() Me.tbpImport = New System.Windows.Forms.TabPage() Me.pnImportData = New System.Windows.Forms.Panel() Me.ucrNudPreviewRows = New instat.ucrNud() @@ -80,18 +81,17 @@ Partial Class dlgOptions Me.lblWorkingDirectory = New System.Windows.Forms.Label() Me.ucrWorkingDirectory = New instat.ucrInputTextBox() Me.tbpGraphDisplay = New System.Windows.Forms.TabPage() - Me.ucrPnlGraphDisplay = New instat.UcrPanel() Me.rdoDisplayinSeparateWindows = New System.Windows.Forms.RadioButton() Me.rdoDisplayinRViewer = New System.Windows.Forms.RadioButton() Me.rdoDisplayinOutputWindow = New System.Windows.Forms.RadioButton() + Me.ucrPnlGraphDisplay = New instat.UcrPanel() Me.trOptions = New System.Windows.Forms.TreeView() Me.spltControls = New System.Windows.Forms.SplitContainer() Me.cmdFactoryReset = New System.Windows.Forms.Button() - Me.ucrPnlLanguage = New instat.UcrPanel() Me.tbcOptions.SuspendLayout() Me.tbpLanguages.SuspendLayout() - Me.grpLanguage.SuspendLayout() Me.pnLanguages.SuspendLayout() + Me.grpLanguage.SuspendLayout() Me.tbpComments.SuspendLayout() Me.pnComments.SuspendLayout() Me.tbpImport.SuspendLayout() @@ -182,13 +182,23 @@ Partial Class dlgOptions Me.tbpLanguages.Text = "Languages" Me.tbpLanguages.UseVisualStyleBackColor = True ' + 'pnLanguages + ' + Me.pnLanguages.AutoSize = True + Me.pnLanguages.Controls.Add(Me.grpLanguage) + Me.pnLanguages.Location = New System.Drawing.Point(3, 3) + Me.pnLanguages.Name = "pnLanguages" + Me.pnLanguages.Size = New System.Drawing.Size(122, 126) + Me.pnLanguages.TabIndex = 1 + ' 'grpLanguage ' Me.grpLanguage.Controls.Add(Me.rdoSpanish) Me.grpLanguage.Controls.Add(Me.rdoEnglish) - Me.grpLanguage.Controls.Add(Me.rdoKiswahili) Me.grpLanguage.Controls.Add(Me.rdoFrench) - Me.grpLanguage.Location = New System.Drawing.Point(4, 3) + Me.grpLanguage.Controls.Add(Me.rdoKiswahili) + Me.grpLanguage.Controls.Add(Me.ucrPnlLanguage) + Me.grpLanguage.Location = New System.Drawing.Point(3, 3) Me.grpLanguage.Name = "grpLanguage" Me.grpLanguage.Size = New System.Drawing.Size(109, 113) Me.grpLanguage.TabIndex = 2 @@ -199,7 +209,7 @@ Partial Class dlgOptions ' Me.rdoSpanish.AutoSize = True Me.rdoSpanish.Enabled = False - Me.rdoSpanish.Location = New System.Drawing.Point(7, 88) + Me.rdoSpanish.Location = New System.Drawing.Point(6, 84) Me.rdoSpanish.Name = "rdoSpanish" Me.rdoSpanish.Size = New System.Drawing.Size(63, 17) Me.rdoSpanish.TabIndex = 2 @@ -209,7 +219,7 @@ Partial Class dlgOptions 'rdoEnglish ' Me.rdoEnglish.AutoSize = True - Me.rdoEnglish.Location = New System.Drawing.Point(7, 19) + Me.rdoEnglish.Location = New System.Drawing.Point(6, 19) Me.rdoEnglish.Name = "rdoEnglish" Me.rdoEnglish.Size = New System.Drawing.Size(59, 17) Me.rdoEnglish.TabIndex = 1 @@ -220,7 +230,7 @@ Partial Class dlgOptions 'rdoKiswahili ' Me.rdoKiswahili.AutoSize = True - Me.rdoKiswahili.Location = New System.Drawing.Point(7, 65) + Me.rdoKiswahili.Location = New System.Drawing.Point(6, 65) Me.rdoKiswahili.Name = "rdoKiswahili" Me.rdoKiswahili.Size = New System.Drawing.Size(65, 17) Me.rdoKiswahili.TabIndex = 3 @@ -231,7 +241,7 @@ Partial Class dlgOptions 'rdoFrench ' Me.rdoFrench.AutoSize = True - Me.rdoFrench.Location = New System.Drawing.Point(7, 42) + Me.rdoFrench.Location = New System.Drawing.Point(6, 42) Me.rdoFrench.Name = "rdoFrench" Me.rdoFrench.Size = New System.Drawing.Size(58, 17) Me.rdoFrench.TabIndex = 2 @@ -239,15 +249,12 @@ Partial Class dlgOptions Me.rdoFrench.Text = "French" Me.rdoFrench.UseVisualStyleBackColor = True ' - 'pnLanguages + 'ucrPnlLanguage ' - Me.pnLanguages.AutoSize = True - Me.pnLanguages.Controls.Add(Me.grpLanguage) - Me.pnLanguages.Controls.Add(Me.ucrPnlLanguage) - Me.pnLanguages.Location = New System.Drawing.Point(3, 3) - Me.pnLanguages.Name = "pnLanguages" - Me.pnLanguages.Size = New System.Drawing.Size(122, 126) - Me.pnLanguages.TabIndex = 1 + Me.ucrPnlLanguage.Location = New System.Drawing.Point(0, 17) + Me.ucrPnlLanguage.Name = "ucrPnlLanguage" + Me.ucrPnlLanguage.Size = New System.Drawing.Size(103, 90) + Me.ucrPnlLanguage.TabIndex = 0 ' 'tbpComments ' @@ -263,15 +270,24 @@ Partial Class dlgOptions ' 'pnComments ' - Me.pnComments.AutoSize = True Me.pnComments.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.pnComments.Controls.Add(Me.ucrInputComment) Me.pnComments.Controls.Add(Me.lblComment) - Me.pnComments.Controls.Add(Me.txtComment) Me.pnComments.Location = New System.Drawing.Point(10, 10) Me.pnComments.Name = "pnComments" Me.pnComments.Size = New System.Drawing.Size(338, 29) Me.pnComments.TabIndex = 2 ' + 'ucrInputComment + ' + Me.ucrInputComment.AddQuotesIfUnrecognised = True + Me.ucrInputComment.IsMultiline = False + Me.ucrInputComment.IsReadOnly = False + Me.ucrInputComment.Location = New System.Drawing.Point(58, 5) + Me.ucrInputComment.Name = "ucrInputComment" + Me.ucrInputComment.Size = New System.Drawing.Size(277, 21) + Me.ucrInputComment.TabIndex = 1 + ' 'lblComment ' Me.lblComment.AutoSize = True @@ -282,13 +298,6 @@ Partial Class dlgOptions Me.lblComment.Tag = "Comment:" Me.lblComment.Text = "Comment:" ' - 'txtComment - ' - Me.txtComment.Location = New System.Drawing.Point(59, 6) - Me.txtComment.Name = "txtComment" - Me.txtComment.Size = New System.Drawing.Size(276, 20) - Me.txtComment.TabIndex = 1 - ' 'tbpImport ' Me.tbpImport.Controls.Add(Me.pnImportData) @@ -659,13 +668,6 @@ Partial Class dlgOptions Me.tbpGraphDisplay.Text = "Graph Display" Me.tbpGraphDisplay.UseVisualStyleBackColor = True ' - 'ucrPnlGraphDisplay - ' - Me.ucrPnlGraphDisplay.Location = New System.Drawing.Point(0, 3) - Me.ucrPnlGraphDisplay.Name = "ucrPnlGraphDisplay" - Me.ucrPnlGraphDisplay.Size = New System.Drawing.Size(169, 66) - Me.ucrPnlGraphDisplay.TabIndex = 3 - ' 'rdoDisplayinSeparateWindows ' Me.rdoDisplayinSeparateWindows.AutoSize = True @@ -698,34 +700,41 @@ Partial Class dlgOptions Me.rdoDisplayinOutputWindow.Text = "Display in Output Window" Me.rdoDisplayinOutputWindow.UseVisualStyleBackColor = True ' + 'ucrPnlGraphDisplay + ' + Me.ucrPnlGraphDisplay.Location = New System.Drawing.Point(0, 3) + Me.ucrPnlGraphDisplay.Name = "ucrPnlGraphDisplay" + Me.ucrPnlGraphDisplay.Size = New System.Drawing.Size(169, 66) + Me.ucrPnlGraphDisplay.TabIndex = 3 + ' 'trOptions ' Me.trOptions.Dock = System.Windows.Forms.DockStyle.Fill Me.trOptions.Location = New System.Drawing.Point(0, 0) Me.trOptions.Name = "trOptions" - 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}) + 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}) Me.trOptions.Size = New System.Drawing.Size(184, 317) Me.trOptions.TabIndex = 0 ' @@ -756,13 +765,6 @@ Partial Class dlgOptions Me.cmdFactoryReset.Text = "Factory Reset" Me.cmdFactoryReset.UseVisualStyleBackColor = True ' - 'ucrPnlLanguage - ' - Me.ucrPnlLanguage.Location = New System.Drawing.Point(4, 1) - Me.ucrPnlLanguage.Name = "ucrPnlLanguage" - Me.ucrPnlLanguage.Size = New System.Drawing.Size(109, 115) - Me.ucrPnlLanguage.TabIndex = 0 - ' 'dlgOptions ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -783,11 +785,10 @@ Partial Class dlgOptions Me.tbcOptions.ResumeLayout(False) Me.tbpLanguages.ResumeLayout(False) Me.tbpLanguages.PerformLayout() + Me.pnLanguages.ResumeLayout(False) Me.grpLanguage.ResumeLayout(False) Me.grpLanguage.PerformLayout() - Me.pnLanguages.ResumeLayout(False) Me.tbpComments.ResumeLayout(False) - Me.tbpComments.PerformLayout() Me.pnComments.ResumeLayout(False) Me.pnComments.PerformLayout() Me.tbpImport.ResumeLayout(False) @@ -834,7 +835,6 @@ Partial Class dlgOptions Friend WithEvents tbpComments As TabPage Friend WithEvents pnComments As Panel Friend WithEvents lblComment As Label - Friend WithEvents txtComment As TextBox Friend WithEvents tbpImport As TabPage Friend WithEvents pnImportData As Panel Friend WithEvents lblPreviewRows As Label @@ -879,4 +879,5 @@ Partial Class dlgOptions Friend WithEvents ucrNudMaxRows As ucrNud Friend WithEvents ucrPnlGraphDisplay As UcrPanel Friend WithEvents ucrPnlLanguage As UcrPanel + Friend WithEvents ucrInputComment As ucrInputTextBox End Class diff --git a/instat/dlgOptions.vb b/instat/dlgOptions.vb index 8fdbe360daf..e81509afef1 100644 --- a/instat/dlgOptions.vb +++ b/instat/dlgOptions.vb @@ -64,7 +64,10 @@ Public Class dlgOptions ucrPnlGraphDisplay.AddRadioButton(rdoDisplayinOutputWindow) ucrPnlGraphDisplay.AddRadioButton(rdoDisplayinRViewer) ucrPnlGraphDisplay.AddRadioButton(rdoDisplayinSeparateWindows) - + ucrPnlLanguage.AddRadioButton(rdoKiswahili) + ucrPnlLanguage.AddRadioButton(rdoEnglish) + ucrPnlLanguage.AddRadioButton(rdoSpanish) + ucrPnlLanguage.AddRadioButton(rdoFrench) 'ucrNudDigits.Minimum = 0 'ucrNudDigits.Maximum = 22 End Sub @@ -77,7 +80,7 @@ Public Class dlgOptions SetEditorFont(frmMain.clsInstatOptions.fntEditor, frmMain.clsInstatOptions.clrEditor) ucrNudMaxRows.Value = frmMain.clsInstatOptions.iMaxRows ucrNudPreviewRows.Value = frmMain.clsInstatOptions.iPreviewRows - txtComment.Text = frmMain.clsInstatOptions.strComment + ucrInputComment.SetName(frmMain.clsInstatOptions.strComment) ucrWorkingDirectory.SetName(frmMain.clsInstatOptions.strWorkingDirectory) ucrChkIncludeCommentsbyDefault.Checked = frmMain.clsInstatOptions.bIncludeCommentDefault ucrChkShowRCommandsinOutputWindow.Checked = frmMain.clsInstatOptions.bCommandsinOutput @@ -113,7 +116,7 @@ Public Class dlgOptions frmMain.clsInstatOptions.SetFormatComment(fntComment, clrComment) frmMain.clsInstatOptions.SetFormatScript(fntCommand, clrCommand) frmMain.clsInstatOptions.SetFormatEditor(fntEditor, clrEditor) - frmMain.clsInstatOptions.SetComment(txtComment.Text) + frmMain.clsInstatOptions.SetComment(ucrInputComment.Text) frmMain.clsInstatOptions.SetPreviewRows(ucrNudPreviewRows.Value) frmMain.clsInstatOptions.SetMaxRows(ucrNudMaxRows.Value) frmMain.clsInstatOptions.SetLanguageCultureCode(strCurrLanguageCulture) @@ -216,7 +219,7 @@ Public Class dlgOptions ApplyEnabled(False) End Sub - Private Sub LanguageChanged(sender As Object, e As EventArgs) Handles rdoKiswahili.CheckedChanged, rdoEnglish.CheckedChanged, rdoFrench.CheckedChanged, rdoSpanish.CheckedChanged + Private Sub ucrPnlLanguage_ControlValueChanged() Handles ucrPnlLanguage.ControlValueChanged If rdoKiswahili.Checked Then strCurrLanguageCulture = "sw-KE" ElseIf rdoFrench.Checked Then @@ -229,7 +232,7 @@ Public Class dlgOptions ApplyEnabled(True) End Sub - Private Sub txtComment_TextChanged(sender As Object, e As EventArgs) Handles txtComment.TextChanged + Private Sub ucrInputComment_ControlContentsChanged() Handles ucrInputComment.ControlContentsChanged ApplyEnabled(True) End Sub From ea46873b004f0515e2c9eb74d4a6ceff090ac88e Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Fri, 16 Jun 2017 21:46:45 +0300 Subject: [PATCH 053/201] Handling events together --- instat/dlgOptions.vb | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/instat/dlgOptions.vb b/instat/dlgOptions.vb index e81509afef1..c42029fb9fb 100644 --- a/instat/dlgOptions.vb +++ b/instat/dlgOptions.vb @@ -230,12 +230,8 @@ Public Class dlgOptions strCurrLanguageCulture = "es-ES" End If ApplyEnabled(True) - End Sub - - Private Sub ucrInputComment_ControlContentsChanged() Handles ucrInputComment.ControlContentsChanged - ApplyEnabled(True) - End Sub - + End Sub + Private Sub cmdScriptChange_Click(sender As Object, e As EventArgs) Handles cmdCommandFormat.Click dlgFont.ShowColor = True dlgFont.MaxSize = 50 @@ -290,15 +286,7 @@ Public Class dlgOptions End Sub - Private Sub ucrNudPreviewRows_ValueChanged() Handles ucrNudPreviewRows.ControlValueChanged - ApplyEnabled(True) - End Sub - - Private Sub ucrChkIncludeCommentsbyDefault_controlvaluechanged() Handles ucrChkIncludeCommentsbyDefault.ControlValueChanged - ApplyEnabled(True) - End Sub - - Private Sub nudMaxRows_TextChanged() Handles ucrNudMaxRows.ControlValueChanged + Private Sub ucrNudPreviewRows_ValueChanged() Handles ucrNudPreviewRows.ControlValueChanged, ucrInputComment.ControlContentsChanged, ucrChkIncludeCommentsbyDefault.ControlValueChanged, ucrNudMaxRows.ControlValueChanged, ucrChkIncludeDefaultParams.ControlValueChanged, ucrChkShowRCommandsinOutputWindow.ControlValueChanged, ucrNudDigits.ControlValueChanged, ucrChkShowSignifStars.ControlValueChanged ApplyEnabled(True) End Sub @@ -314,14 +302,6 @@ Public Class dlgOptions 'ApplyEnabled(True) End Sub - Private Sub ucrChkIncludeDefaultParams_ControlValueChanged() Handles ucrChkIncludeDefaultParams.ControlValueChanged - ApplyEnabled(True) - End Sub - - Private Sub chkShowRCommandsinOutputWindow_CheckedChanged() Handles ucrChkShowRCommandsinOutputWindow.ControlValueChanged - ApplyEnabled(True) - End Sub - Private Sub ApplyEnabled(bEnable As Boolean) cmdApply.Enabled = bEnable cmdOk.Enabled = bEnable @@ -387,11 +367,4 @@ Public Class dlgOptions End If End Sub - Private Sub ucrNudDigits_ValueChanged() Handles ucrNudDigits.ControlValueChanged - ApplyEnabled(True) - End Sub - - Private Sub ucrChkShowSignifStars_CheckedChanged() Handles ucrChkShowSignifStars.ControlValueChanged - ApplyEnabled(True) - End Sub End Class \ No newline at end of file From aa988313c356c696c4e4a2bc1d049ad2c343e1d2 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Fri, 16 Jun 2017 21:54:22 +0300 Subject: [PATCH 054/201] Adding help --- instat/dlgOptions.Designer.vb | 24 ++++++++++++------------ instat/dlgOptions.vb | 4 ++++ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/instat/dlgOptions.Designer.vb b/instat/dlgOptions.Designer.vb index 236de55fff0..5d421272c4e 100644 --- a/instat/dlgOptions.Designer.vb +++ b/instat/dlgOptions.Designer.vb @@ -38,8 +38,8 @@ Partial Class dlgOptions Me.grpLanguage = New System.Windows.Forms.GroupBox() Me.rdoSpanish = New System.Windows.Forms.RadioButton() Me.rdoEnglish = New System.Windows.Forms.RadioButton() - Me.rdoKiswahili = New System.Windows.Forms.RadioButton() Me.rdoFrench = New System.Windows.Forms.RadioButton() + Me.rdoKiswahili = New System.Windows.Forms.RadioButton() Me.ucrPnlLanguage = New instat.UcrPanel() Me.tbpComments = New System.Windows.Forms.TabPage() Me.pnComments = New System.Windows.Forms.Panel() @@ -227,17 +227,6 @@ Partial Class dlgOptions Me.rdoEnglish.Text = "English" Me.rdoEnglish.UseVisualStyleBackColor = True ' - 'rdoKiswahili - ' - Me.rdoKiswahili.AutoSize = True - Me.rdoKiswahili.Location = New System.Drawing.Point(6, 65) - Me.rdoKiswahili.Name = "rdoKiswahili" - Me.rdoKiswahili.Size = New System.Drawing.Size(65, 17) - Me.rdoKiswahili.TabIndex = 3 - Me.rdoKiswahili.Tag = "Kiswahili" - Me.rdoKiswahili.Text = "Kiswahili" - Me.rdoKiswahili.UseVisualStyleBackColor = True - ' 'rdoFrench ' Me.rdoFrench.AutoSize = True @@ -249,6 +238,17 @@ Partial Class dlgOptions Me.rdoFrench.Text = "French" Me.rdoFrench.UseVisualStyleBackColor = True ' + 'rdoKiswahili + ' + Me.rdoKiswahili.AutoSize = True + Me.rdoKiswahili.Location = New System.Drawing.Point(6, 65) + Me.rdoKiswahili.Name = "rdoKiswahili" + Me.rdoKiswahili.Size = New System.Drawing.Size(65, 17) + Me.rdoKiswahili.TabIndex = 3 + Me.rdoKiswahili.Tag = "Kiswahili" + Me.rdoKiswahili.Text = "Kiswahili" + Me.rdoKiswahili.UseVisualStyleBackColor = True + ' 'ucrPnlLanguage ' Me.ucrPnlLanguage.Location = New System.Drawing.Point(0, 17) diff --git a/instat/dlgOptions.vb b/instat/dlgOptions.vb index c42029fb9fb..32425879815 100644 --- a/instat/dlgOptions.vb +++ b/instat/dlgOptions.vb @@ -316,6 +316,10 @@ Public Class dlgOptions rtbOutputPreview.SelectionLength = 0 End Sub + Private Sub cmdHelp_Click(sender As Object, e As EventArgs) Handles cmdHelp.Click + Help.ShowHelp(Me.Parent, frmMain.strStaticPath & "\" & frmMain.strHelpFilePath, HelpNavigator.TopicId, "336") + End Sub + Private Sub cmdFactoryReset_Click(sender As Object, e As EventArgs) Handles cmdFactoryReset.Click Dim msgFactoryReset = MsgBox("Are you sure you want to reset to factory defaults?", MessageBoxButtons.YesNo, "Factory Reset") If msgFactoryReset = DialogResult.Yes Then From c8baac3d6247c2e4c61544104a1045b027ac31de Mon Sep 17 00:00:00 2001 From: John Lunalo Date: Sat, 17 Jun 2017 12:29:49 +0300 Subject: [PATCH 055/201] more edits --- instat/dlgFitModel.vb | 8 +- instat/dlgFourVariableModelling.vb | 10 +- instat/dlgRegressionSimple.vb | 164 ++++++++++++++------------- instat/dlgThreeVariablesModelling.vb | 12 +- 4 files changed, 98 insertions(+), 96 deletions(-) diff --git a/instat/dlgFitModel.vb b/instat/dlgFitModel.vb index 3f9c31a4f38..9c95a5e1d67 100644 --- a/instat/dlgFitModel.vb +++ b/instat/dlgFitModel.vb @@ -50,10 +50,10 @@ Public Class dlgFitModel ucrInputModelPreview.IsReadOnly = True sdgSimpleRegOptions.SetRDataFrame(ucrSelectorByDataFrameAddRemoveForFitModel.ucrAvailableDataFrames) sdgSimpleRegOptions.SetRYVariable(ucrReceiverResponseVar) - sdgVariableTransformations.SetRYVariable(ucrReceiverResponseVar) - sdgVariableTransformations.SetRModelOperator(clsModel) - sdgModelOptions.SetRCIFunction(clsRCIFunction) - sdgVariableTransformations.SetRCIFunction(clsRCIFunction) + 'sdgVariableTransformations.SetRYVariable(ucrReceiverResponseVar) + 'sdgVariableTransformations.SetRModelOperator(clsModel) + 'sdgModelOptions.SetRCIFunction(clsRCIFunction) + 'sdgVariableTransformations.SetRCIFunction(clsRCIFunction) AssignModelName() End Sub diff --git a/instat/dlgFourVariableModelling.vb b/instat/dlgFourVariableModelling.vb index fd85ebdd6df..6a89611fa1f 100644 --- a/instat/dlgFourVariableModelling.vb +++ b/instat/dlgFourVariableModelling.vb @@ -55,10 +55,10 @@ Public Class dlgFourVariableModelling sdgSimpleRegOptions.SetRDataFrame(ucrSelectorFourVariableModelling.ucrAvailableDataFrames) sdgSimpleRegOptions.SetRYVariable(ucrResponse) sdgSimpleRegOptions.SetRXVariable(ucrFirstExplanatory) - sdgVariableTransformations.SetRYVariable(ucrResponse) - sdgVariableTransformations.SetRModelOperator(clsModel1) - sdgModelOptions.SetRCIFunction(clsRCIFunction) - sdgVariableTransformations.SetRCIFunction(clsRCIFunction) + 'sdgVariableTransformations.SetRYVariable(ucrResponse) + 'sdgVariableTransformations.SetRModelOperator(clsModel1) + 'sdgModelOptions.SetRCIFunction(clsRCIFunction) + 'sdgVariableTransformations.SetRCIFunction(clsRCIFunction) AssignModelName() End Sub @@ -164,7 +164,7 @@ Public Class dlgFourVariableModelling chkFirstFunction.Visible = False End If If currentReceiver.Name = "ucrFirstExplanatory" Then - sdgVariableTransformations.SetRXVariable(ucrFirstExplanatory) + 'sdgVariableTransformations.SetRXVariable(ucrFirstExplanatory) If chkFirstFunction.Checked Then sdgVariableTransformations.ModelFunction(True) Else diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 6cf7ae6fecd..8173b1fbe63 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -18,11 +18,9 @@ Imports instat Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True - Public clsModel, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator - Public clsRPoisson, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest As New RFunction - Public clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM As New RFunction - Public clsRLength, clsRLength2, clsRLengthGrouped, clsRLengthGrouped2, clsRLength3, clsRLengthGrouped3, clsRLength4, clsRLengthGrouped4, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLength5, clsRLengthGrouped5, clsRLength6, clsRLengthGrouped6, clsRLmOrGLM, clsRYVariable, clsRXVariable As New RFunction - Private clsFormulaOperator As New ROperator + Public clsModel, clsFormulaOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator + Public clsRPoisson, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsRYVariable, clsRXVariable, clsTFunc, clsRLength As New RFunction + Private bReset As Boolean = True Private bResetSubDialog As Boolean = False Private Sub dlgRegressionSimple_Load(sender As Object, e As EventArgs) Handles Me.Load @@ -43,6 +41,8 @@ Public Class dlgRegressionSimple ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) ucrResponse.AddAdditionalCodeParameterPair(clsRConvert, New RParameter("x", 1)) + ucrNudCI.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("conf.int"), 1) + ucrNudHypothesis.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("r"), 1) End Sub Private Sub InitialiseDialog() @@ -116,11 +116,18 @@ Public Class dlgRegressionSimple Private Sub SetDefaults() clsFormulaOperator = New ROperator + clsPoissonOperation = New ROperator + clsRLmOrGLM = New RFunction clsGLM = New RFunction clsRConvert = New RFunction clsRCIFunction = New RFunction clsRTTest = New RFunction + clsRPoisson = New RFunction + clsxFunc = New RFunction + clsRLength = New RFunction + clsRKruskalTest = New RFunction + clsRFTest = New RFunction ucrSelectorSimpleReg.Reset() ucrResponse.SetMeAsReceiver() @@ -128,10 +135,13 @@ Public Class dlgRegressionSimple ucrModelPreview.Reset() + DataTypeAccepted() + clsFormulaOperator.SetOperation("~") clsFormulaOperator.AddParameter("y", 1, iPosition:=0) clsFormulaOperator.AddParameter("x", 1, iPosition:=1) + clsRConvert.SetRCommand("as.numeric") clsRCIFunction.SetRCommand(ucrFamily.clsCurrDistribution.strGLMFunctionName) @@ -143,10 +153,27 @@ Public Class dlgRegressionSimple clsRTTest.SetPackageName("mosaic") clsRTTest.SetRCommand("t.test") + clsRPoisson.SetPackageName("stats") + clsRPoisson.SetRCommand("poisson.test") + clsGLM.SetRCommand("glm") clsGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator) + clsRFTest.SetPackageName("stats") + clsRFTest.SetRCommand("var.test") + + clsxFunc.SetRCommand("c") + clsxFunc.AddParameter("l1", clsRFunctionParameter:=clsRLength, bIncludeArgumentName:=False) + clsxFunc.AddParameter("l2", clsRFunctionParameter:=clsRLength, bIncludeArgumentName:=False) + clsRPoisson.AddParameter("x", clsRFunctionParameter:=clsxFunc) + + + clsRLength.SetRCommand("length") + clsRKruskalTest.SetPackageName("stats") + clsRKruskalTest.SetRCommand("kruskal.test") + + clsTFunc.SetRCommand("c") clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=ucrSaveModels.GetText, bAssignToIsPrefix:=True) @@ -205,6 +232,14 @@ Public Class dlgRegressionSimple clsRYVariable = ucrResponse.GetVariables End Sub + + Private Sub ucrSelectorSimpleReg_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSelectorSimpleReg.ControlContentsChanged + ConvertToVariate() + TestOKEnabled() + DataTypeAccepted() + SetEnableDists() + End Sub + Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged clsRXVariable = ucrExplanatory.GetVariables End Sub @@ -215,18 +250,8 @@ Public Class dlgRegressionSimple Display() End Sub - - Private Sub GLM() - clsRLmOrGLM.SetRCommand("glm") - clsRLmOrGLM.AddParameter("data", clsRFunctionParameter:=ucrSelectorSimpleReg.ucrAvailableDataFrames.clsCurrDataFrame) - ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) - clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsModel) - clsModel.SetOperation("~") - End Sub - Private Sub SetTTest() - clsRTTest.SetPackageName("mosaic") - clsRTTest.SetRCommand("t.test") + ucrBase.clsRsyntax.SetBaseRFunction(clsRTTest) ' clsRTTest.AddParameter("conf.level", nudCI.Value.ToString()) clsRTTest.AddParameter("data", clsRFunctionParameter:=ucrSelectorSimpleReg.ucrAvailableDataFrames.clsCurrDataFrame) @@ -248,8 +273,7 @@ Public Class dlgRegressionSimple End Sub Private Sub SetFTest() - clsRFTest.SetPackageName("stats") - clsRFTest.SetRCommand("var.test") + ucrBase.clsRsyntax.SetBaseRFunction(clsRFTest) ' clsRFTest.AddParameter("conf.level", nudCI.Value.ToString()) clsRFTest.AddParameter("data", clsRFunctionParameter:=ucrSelectorSimpleReg.ucrAvailableDataFrames.clsCurrDataFrame) @@ -273,8 +297,7 @@ Public Class dlgRegressionSimple End Sub Private Sub SetKruskalTest() - clsRKruskalTest.SetPackageName("stats") - clsRKruskalTest.SetRCommand("kruskal.test") + ucrBase.clsRsyntax.SetBaseRFunction(clsRKruskalTest) clsModel.SetOperation("~") clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) @@ -289,6 +312,14 @@ Public Class dlgRegressionSimple clsRBinomial.SetRCommand("prop.test") ucrBase.clsRsyntax.SetBaseRFunction(clsRBinomial) ' clsRBinomial.AddParameter("conf.level", nudCI.Value.ToString()) + + clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) + clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRGroup.ToScript & "]") + clsRGroup.AddParameter("x", clsROperatorParameter:=clsPoissonOperation) + clsPoissonOperation.SetOperation("==") + clsPoissonOperation.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) + + clsRBinomial.AddParameter("data", ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text) clsRBinomial.AddParameter("x", clsRFunctionParameter:=clsyFunc) clsRBinomial.AddParameter("n", clsRFunctionParameter:=clsnFunc) @@ -296,38 +327,38 @@ Public Class dlgRegressionSimple ' y = ... clsyFunc.SetRCommand("c") clsyFunc.AddParameter("l1", clsRFunctionParameter:=clsRLength, bIncludeArgumentName:=False) - clsyFunc.AddParameter("l2", clsRFunctionParameter:=clsRLength2, bIncludeArgumentName:=False) + clsyFunc.AddParameter("l2", clsRFunctionParameter:=clsRLength, bIncludeArgumentName:=False) ' n = ... clsnFunc.SetRCommand("c") - clsnFunc.AddParameter("l3", clsRFunctionParameter:=clsRLength3, bIncludeArgumentName:=False) - clsnFunc.AddParameter("l4", clsRFunctionParameter:=clsRLength4, bIncludeArgumentName:=False) + clsnFunc.AddParameter("l3", clsRFunctionParameter:=clsRLength, bIncludeArgumentName:=False) + clsnFunc.AddParameter("l4", clsRFunctionParameter:=clsRLength, bIncludeArgumentName:=False) ' Success if LABEL = ... 'c(length(x=ucrResponse[LevelOne]&SuccessIf]), length(x=ucrResponse[LevelTwo&SuccessIf])) ' LengthOne clsRLength.SetRCommand("length") - clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLengthGrouped) - clsRLengthGrouped.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor.ToScript & "&" & clsRNumeric.ToScript & "]") + clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) + clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor.ToScript & "&" & clsRNumeric.ToScript & "]") ' LengthTwo ' length(x=ucrResponse[(x=ucrExplanatory == 2)&(x=ucrResponse ==1)])) - clsRLength2.SetRCommand("length") - clsRLength2.AddParameter("x", clsRFunctionParameter:=clsRLengthGrouped2) - clsRLengthGrouped2.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor2.ToScript & "&" & clsRNumeric.ToScript & "]") + clsRLength.SetRCommand("length") + clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) + clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor2.ToScript & "&" & clsRNumeric.ToScript & "]") ' Total counts for each level: ' c(length(x=ucrResponse[LevelOne]), length(ucrResponse[LevelTwo])) - clsRLength3.SetRCommand("length") - clsRLength3.AddParameter("x", clsRFunctionParameter:=clsRLengthGrouped3) - clsRLengthGrouped3.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor.ToScript & "]") + clsRLength.SetRCommand("length") + clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) + clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor.ToScript & "]") - clsRLength4.SetRCommand("length") - clsRLength4.AddParameter("x", clsRFunctionParameter:=clsRLengthGrouped4) - clsRLengthGrouped4.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor2.ToScript & "]") + clsRLength.SetRCommand("length") + clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) + clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor2.ToScript & "]") ' The three groups of interest: @@ -356,35 +387,16 @@ Public Class dlgRegressionSimple End Sub Private Sub SetPoissonTest() - Dim clsxFunc As New RFunction - Dim clsTFunc As New RFunction - clsRPoisson.SetPackageName("stats") - clsRPoisson.SetRCommand("poisson.test") - ucrBase.clsRsyntax.SetBaseRFunction(clsRPoisson) - 'clsRPoisson.AddParameter("conf.level", nudCI.Value.ToString()) - 'clsRPoisson.AddParameter("r", nudHypothesis.Value.ToString()) - ' x = ... - - clsxFunc.SetRCommand("c") - clsxFunc.AddParameter("l1", clsRFunctionParameter:=clsRLength5, bIncludeArgumentName:=False) - clsxFunc.AddParameter("l2", clsRFunctionParameter:=clsRLength6, bIncludeArgumentName:=False) - clsRPoisson.AddParameter("x", clsRFunctionParameter:=clsxFunc) ' poisson.test(x = c(length(x=Calls[Group == 1]), length(x=Calls[Group == 2])), T =c(mean(Calls[Group == 1]), mean(Calls[Group == 2]))) - clsRLength5.SetRCommand("length") - clsRLength5.AddParameter("x", clsRFunctionParameter:=clsRLengthGrouped5) - clsRLengthGrouped5.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRGroup.ToScript & "]") - clsRGroup.AddParameter("x", clsROperatorParameter:=clsPoissonOperation) - clsPoissonOperation.SetOperation("==") - clsPoissonOperation.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) ' clsPoissonOperation.AddParameter(strParameterValue:=ucrLevel1.GetText()) - clsRLength6.SetRCommand("length") - clsRLength6.AddParameter("x", clsRFunctionParameter:=clsRLengthGrouped6) - clsRLengthGrouped6.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRGroup2.ToScript & "]") + clsRLength.SetRCommand("length") + clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) + clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRGroup2.ToScript & "]") clsRGroup2.AddParameter("x", clsROperatorParameter:=clsPoissonOperation2) clsPoissonOperation2.SetOperation("==") clsPoissonOperation2.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) @@ -392,32 +404,29 @@ Public Class dlgRegressionSimple ' T = ... ' T =c(mean(Calls[Group == 1]), mean(Calls[Group == 2]))) - clsTFunc.SetRCommand("c") + clsTFunc.AddParameter("m1", clsRFunctionParameter:=clsRMean, bIncludeArgumentName:=False) clsTFunc.AddParameter("m2", clsRFunctionParameter:=clsRMean2, bIncludeArgumentName:=False) clsRPoisson.AddParameter("T", clsRFunctionParameter:=clsTFunc) - clsRMean.SetRCommand("mean") - clsRMean.AddParameter("x", clsRFunctionParameter:=clsRLengthGrouped5) + clsRMean2.SetRCommand("mean") - clsRMean2.AddParameter("x", clsRFunctionParameter:=clsRLengthGrouped6) + clsRMean2.AddParameter("x", clsRFunctionParameter:=clsRGroup) ' Note this is currently not running adding the dataset but everything else is. ' For two numeric variables: - ' clsRPoisson.SetRCommand("poisson.test") - ' ucrBase.clsRsyntax.SetBaseRFunction(clsRPoisson) - ' clsRPoisson.AddParameter("conf.level", nudCI.Value.ToString()) - ' clsRPoisson.AddParameter("r", nudHypothesis.Value.ToString()) - ' clsRLength.SetRCommand("length") - ' clsRLength.AddParameter("x", clsRFunctionParameter:=ucrResponse.GetVariables()) - ' clsRLength2.SetRCommand("length") - ' clsRLength2.AddParameter("x", clsRFunctionParameter:=ucrExplanatory.GetVariables()) - ' clsRMean.SetRCommand("mean") - ' clsRMean.AddParameter("x", clsRFunctionParameter:=ucrResponse.GetVariables()) - ' clsRMean2.SetRCommand("mean") - ' clsRMean2.AddParameter("x", clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsRPoisson.SetRCommand("poisson.test") + ucrBase.clsRsyntax.SetBaseRFunction(clsRPoisson) + clsRLength.SetRCommand("length") + clsRLength.AddParameter("x", clsRFunctionParameter:=ucrResponse.GetVariables()) + clsRLength.SetRCommand("length") + clsRLength.AddParameter("x", clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsRMean.SetRCommand("mean") + clsRMean.AddParameter("x", clsRFunctionParameter:=ucrResponse.GetVariables()) + clsRMean2.SetRCommand("mean") + clsRMean2.AddParameter("x", clsRFunctionParameter:=ucrExplanatory.GetVariables()) End Sub Private Sub SetRCode() @@ -491,7 +500,7 @@ Public Class dlgRegressionSimple End If sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) If ucrChkConvertToVariate.Checked Then - clsRConvert.SetRCommand("as.numeric") + clsRConvert.AddParameter("x", ucrResponse.GetVariableNames(bWithQuotes:=False)) clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=clsRConvert) clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) @@ -518,14 +527,6 @@ Public Class dlgRegressionSimple TestOKEnabled() End Sub - Private Sub ucrResponse_SelectionChanged() Handles ucrResponse.SelectionChanged - SetRCode() - ConvertToVariate() - TestOKEnabled() - DataTypeAccepted() - SetEnableDists() - End Sub - Public Sub SetEnableDists() ucrFamily.Enabled = Not ucrResponse.IsEmpty End Sub @@ -724,4 +725,5 @@ Public Class dlgRegressionSimple TestOKEnabled() SetEnableDists() End Sub + End Class \ No newline at end of file diff --git a/instat/dlgThreeVariablesModelling.vb b/instat/dlgThreeVariablesModelling.vb index fc4ab17ae99..afd2c5104b5 100644 --- a/instat/dlgThreeVariablesModelling.vb +++ b/instat/dlgThreeVariablesModelling.vb @@ -57,10 +57,10 @@ Public Class dlgThreeVariableModelling sdgSimpleRegOptions.SetRDataFrame(ucrSelectorThreeVariableModelling.ucrAvailableDataFrames) sdgSimpleRegOptions.SetRYVariable(ucrResponse) sdgSimpleRegOptions.SetRXVariable(ucrFirstExplanatory) - sdgVariableTransformations.SetRYVariable(ucrResponse) - sdgVariableTransformations.SetRModelOperator(clsModel1) - sdgModelOptions.SetRCIFunction(clsRCIFunction) - sdgVariableTransformations.SetRCIFunction(clsRCIFunction) + 'sdgVariableTransformations.SetRYVariable(ucrResponse) + 'sdgVariableTransformations.SetRModelOperator(clsModel1) + 'sdgModelOptions.SetRCIFunction(clsRCIFunction) + 'sdgVariableTransformations.SetRCIFunction(clsRCIFunction) AssignModelName() ucrModelName.SetValidationTypeAsRVariable() End Sub @@ -169,7 +169,7 @@ Public Class dlgThreeVariableModelling chkFunction.Visible = False End If If currentReceiver.Name = "ucrFirstExplanatory" Then - sdgVariableTransformations.SetRXVariable(ucrFirstExplanatory) + ' sdgVariableTransformations.SetRXVariable(ucrFirstExplanatory) If chkFirstFunction.Checked Then sdgVariableTransformations.ModelFunction(True) Else @@ -178,7 +178,7 @@ Public Class dlgThreeVariableModelling End If End If If currentReceiver.Name = "ucrSecondExplanatory" Then - sdgVariableTransformations.SetRXVariable(ucrSecondExplanatory) + ' sdgVariableTransformations.SetRXVariable(ucrSecondExplanatory) If chkSecondFunction.Checked Then sdgVariableTransformations.ModelFunction(False) Else From 6e49ae8281d503715c3a633a98938bb78df37eaf Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sat, 17 Jun 2017 13:59:05 +0100 Subject: [PATCH 056/201] removed clearing Insat object assignment --- instat/ucrButtons.vb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/instat/ucrButtons.vb b/instat/ucrButtons.vb index ec43664cbb8..aeda529e12e 100644 --- a/instat/ucrButtons.vb +++ b/instat/ucrButtons.vb @@ -159,6 +159,8 @@ Public Class ucrButtons 'Clear variables from global environment lstAssignToVariables = clsRsyntax.GetAllAssignTo(New List(Of String)) + 'Don't want to remove the Instat Object if it's been assigned + lstAssignToVariables.RemoveAll(Function(x) x = frmMain.clsRLink.strInstatDataObject) clsRemoveFunc.ClearParameters() If lstAssignToVariables.Count = 1 Then clsRemoveFunc.AddParameter("x1", lstAssignToVariables(0), bIncludeArgumentName:=False) From 660cf5fb4767887a3aed3bbf573d9fe390bc5b0a Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sat, 17 Jun 2017 16:52:24 +0100 Subject: [PATCH 057/201] assign to resetting now done correctly in base buttons --- instat/clsRCodeStructure.vb | 13 ++++----- instat/clsRParameter.vb | 6 ++-- instat/clsRSyntax.vb | 20 +++++--------- instat/dlgFromLibrary.vb | 1 + instat/static/InstatObject/R/Rsetup.R | 2 +- instat/ucrButtons.vb | 40 ++++++++++++++------------- 6 files changed, 38 insertions(+), 44 deletions(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index a40a285dc55..bf64aa9e9fa 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -52,7 +52,6 @@ Public Class RCodeStructure 'The name this code is represented by in the R global environment 'This is used to clear the global environment of unused variables 'Will be cleared after running unless bClearFromGlobal = False - Public strGlobalVariableName As String = "" Public bClearFromGlobal As Boolean = False Public Event ParametersChanged() @@ -123,7 +122,6 @@ Public Class RCodeStructure If Not frmMain.clsRLink.bInstatObjectExists Then frmMain.clsRLink.CreateNewInstatObject() End If - strGlobalVariableName = strAssignTo strScript = strScript & strAssignTo & " <- " & strTemp & Environment.NewLine If Not strAssignToDataFrame = "" AndAlso (Not strAssignToColumn = "" OrElse bAssignToColumnWithoutNames) Then clsAddColumns.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") @@ -385,15 +383,14 @@ Public Class RCodeStructure Return clsTemp End Function - Public Function GetAllAssignTo(lstAssignTo As List(Of String)) As List(Of String) + Public Function GetAllAssignTo(dctFunctionAssignToValues As Dictionary(Of RCodeStructure, String)) As Dictionary(Of RCodeStructure, String) SortParameters() - If strGlobalVariableName <> "" AndAlso Not lstAssignTo.Contains(strGlobalVariableName) Then - lstAssignTo.Add(strGlobalVariableName) - strGlobalVariableName = "" + If bToBeAssigned AndAlso Not dctFunctionAssignToValues.ContainsKey(Me) Then + dctFunctionAssignToValues.Add(Me, strAssignTo) End If For Each clsTempParam As RParameter In clsParameters - clsTempParam.GetAllAssignTo(lstAssignTo) + clsTempParam.GetAllAssignTo(dctFunctionAssignToValues) Next - Return lstAssignTo + Return dctFunctionAssignToValues End Function End Class diff --git a/instat/clsRParameter.vb b/instat/clsRParameter.vb index fbb4d22bdad..2e2eb8d5895 100644 --- a/instat/clsRParameter.vb +++ b/instat/clsRParameter.vb @@ -133,10 +133,10 @@ Public Class RParameter Return clsTempRParam End Function - Public Function GetAllAssignTo(lstAssignTo As List(Of String)) As List(Of String) + Public Function GetAllAssignTo(dctAssignToValues As Dictionary(Of RCodeStructure, String)) As Dictionary(Of RCodeStructure, String) If bIsFunction OrElse bIsOperator Then - clsArgumentCodeStructure.GetAllAssignTo(lstAssignTo) + clsArgumentCodeStructure.GetAllAssignTo(dctAssignToValues) End If - Return lstAssignTo + Return dctAssignToValues End Function End Class \ No newline at end of file diff --git a/instat/clsRSyntax.vb b/instat/clsRSyntax.vb index 71bbcd3be29..495d1406d18 100644 --- a/instat/clsRSyntax.vb +++ b/instat/clsRSyntax.vb @@ -228,29 +228,23 @@ Public Class RSyntax Return lstAfterCodes End Function - Public Function GetAllAssignTo(lstAssignTo As List(Of String)) As List(Of String) + Public Function GetAllAssignTo(dctFunctionAssignToValues As Dictionary(Of RCodeStructure, String)) As Dictionary(Of RCodeStructure, String) If bUseBaseFunction Then - If clsBaseFunction.strGlobalVariableName <> "" AndAlso Not lstAssignTo.Contains(clsBaseFunction.strGlobalVariableName) Then - clsBaseFunction.GetAllAssignTo(lstAssignTo) - End If + clsBaseFunction.GetAllAssignTo(dctFunctionAssignToValues) ElseIf bUseBaseOperator Then - If clsBaseOperator.strGlobalVariableName <> "" AndAlso Not lstAssignTo.Contains(clsBaseOperator.strGlobalVariableName) Then - clsBaseOperator.GetAllAssignTo(lstAssignTo) - End If + clsBaseOperator.GetAllAssignTo(dctFunctionAssignToValues) ElseIf bUseCommandString Then - If clsBaseCommandString.strGlobalVariableName <> "" AndAlso Not lstAssignTo.Contains(clsBaseCommandString.strGlobalVariableName) Then - clsBaseCommandString.GetAllAssignTo(lstAssignTo) - End If + clsBaseCommandString.GetAllAssignTo(dctFunctionAssignToValues) End If lstBeforeCodes.Sort(AddressOf CompareCodePositions) For Each clsTempCode As RCodeStructure In lstBeforeCodes - clsTempCode.GetAllAssignTo(lstAssignTo) + clsTempCode.GetAllAssignTo(dctFunctionAssignToValues) Next lstAfterCodes.Sort(AddressOf CompareCodePositions) For Each clsTempCode As RCodeStructure In lstAfterCodes - clsTempCode.GetAllAssignTo(lstAssignTo) + clsTempCode.GetAllAssignTo(dctFunctionAssignToValues) Next - Return lstAssignTo + Return dctFunctionAssignToValues End Function Public Sub SortParameters() diff --git a/instat/dlgFromLibrary.vb b/instat/dlgFromLibrary.vb index e74a58c50b4..b0373974380 100644 --- a/instat/dlgFromLibrary.vb +++ b/instat/dlgFromLibrary.vb @@ -52,6 +52,7 @@ Public Class dlgFromLibrary cboPackages.DropDownStyle = ComboBoxStyle.DropDownList cboPackages.AutoCompleteMode = AutoCompleteMode.None cboPackages.AutoCompleteSource = AutoCompleteSource.None + lstCollection.HideSelection = False End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset diff --git a/instat/static/InstatObject/R/Rsetup.R b/instat/static/InstatObject/R/Rsetup.R index b1839b7d7fb..4b179b7edf2 100644 --- a/instat/static/InstatObject/R/Rsetup.R +++ b/instat/static/InstatObject/R/Rsetup.R @@ -1,5 +1,5 @@ # Necessary packages for the Instat Object -packs_lib <- c("reshape2", "lubridate","plyr", "dplyr", "rtf", "openxlsx", "ggplot2", "extRemes", "GGally", "agridat", "DAAG", "FactoMineR", "plotrix", "candisc", "R6", "openair", "circular", "survival", "Evapotranspiration", "clifro", "devtools", "factoextra", "circlize", "CircStats", "gridExtra", "ggfortify", "rio", "readxl", "lme4", "dummies", "ggthemes", "lazyeval", "stringr", "httr", "jsonlite", "fitdistrplus", "visreg", "climdex.pcic", "mosaic", "ncdf4", "getPass", "RMySQL", "DBI", "EnvStats", "signmedian.test", "sjPlot", "sjmisc", "plotly", "svglite", "htmlTable", "rje") +packs_lib <- c("reshape2", "lubridate","plyr", "dplyr", "rtf", "openxlsx", "ggplot2", "extRemes", "GGally", "agridat", "DAAG", "FactoMineR", "plotrix", "candisc", "R6", "openair", "circular", "survival", "Evapotranspiration", "clifro", "devtools", "factoextra", "circlize", "CircStats", "gridExtra", "ggfortify", "rio", "readxl", "lme4", "dummies", "ggthemes", "lazyeval", "stringr", "httr", "jsonlite", "fitdistrplus", "visreg", "climdex.pcic", "mosaic", "ncdf4", "getPass", "RMySQL", "DBI", "EnvStats", "signmedian.test", "sjPlot", "sjmisc", "plotly", "svglite", "htmlTable", "rje", "tidyr") # Packages including dependencies (generated from miniCRAN package) packs <- c("abind", "agridat", "arm", "assertthat", "backports", "base64enc", "BH", "bindr", "bindrcpp", "bitops", "blme", "boot", diff --git a/instat/ucrButtons.vb b/instat/ucrButtons.vb index aeda529e12e..d00c0177a32 100644 --- a/instat/ucrButtons.vb +++ b/instat/ucrButtons.vb @@ -80,17 +80,17 @@ Public Class ucrButtons Private Sub Scripts(bRun As Boolean) Dim strComments As String - Dim bIsAssigned As Boolean - Dim bToBeAssigned As Boolean - Dim strAssignTo As String Dim lstBeforeScripts As List(Of String) Dim lstAfterScripts As List(Of String) Dim lstBeforeCodes As List(Of RCodeStructure) Dim lstAfterCodes As List(Of RCodeStructure) - Dim lstAssignToVariables As List(Of String) Dim bFirstCode As Boolean = True Dim clsRemoveFunc As New RFunction Dim clsRemoveListFun As New RFunction + Dim lstAssignTo As New List(Of String) + ' list of {RCodeStructure, strAssignTo, bToBeAssigned} + ' these are used to reset them correctly after eunning ToScript for the code + Dim dctFunctionAssignToValues As New Dictionary(Of RCodeStructure, String) clsRemoveFunc.SetRCommand("rm") clsRemoveListFun.SetRCommand("c") @@ -102,10 +102,9 @@ Public Class ucrButtons If Not bRun AndAlso strComments <> "" Then frmMain.AddToScriptWindow("# " & strComments & Environment.NewLine) End If - 'Also need to be getting strAssignToColumn, strAssignToDataFrame etc. maybe one method to get all as a list - bIsAssigned = clsRsyntax.GetbIsAssigned() - bToBeAssigned = clsRsyntax.GetbToBeAssigned() - strAssignTo = clsRsyntax.GetstrAssignTo() + + 'Get this list before doing ToScript then no need for global variable name + dctFunctionAssignToValues = clsRsyntax.GetAllAssignTo(New Dictionary(Of RCodeStructure, String)) 'Run additional before codes lstBeforeScripts = clsRsyntax.GetBeforeCodesScripts() @@ -158,15 +157,16 @@ Public Class ucrButtons Next 'Clear variables from global environment - lstAssignToVariables = clsRsyntax.GetAllAssignTo(New List(Of String)) - 'Don't want to remove the Instat Object if it's been assigned - lstAssignToVariables.RemoveAll(Function(x) x = frmMain.clsRLink.strInstatDataObject) clsRemoveFunc.ClearParameters() - If lstAssignToVariables.Count = 1 Then - clsRemoveFunc.AddParameter("x1", lstAssignToVariables(0), bIncludeArgumentName:=False) - ElseIf lstAssignToVariables.Count > 1 Then - For i As Integer = 0 To lstAssignToVariables.Count - 1 - clsRemoveListFun.AddParameter(i, Chr(34) & lstAssignToVariables(i) & Chr(34), bIncludeArgumentName:=False) + lstAssignTo = dctFunctionAssignToValues.Values.ToList + lstAssignTo.RemoveAll(Function(x) x = frmMain.clsRLink.strInstatDataObject) + If lstAssignTo.Count = 1 Then + 'Don't want to remove the Instat Object if it's been assigned + clsRemoveFunc.AddParameter("x1", lstAssignTo(0), bIncludeArgumentName:=False) + + ElseIf lstAssignTo.Count > 1 Then + For i As Integer = 0 To lstAssignTo.Count - 1 + clsRemoveListFun.AddParameter(i, Chr(34) & lstAssignTo(i) & Chr(34), bIncludeArgumentName:=False) Next clsRemoveFunc.AddParameter("list", clsRFunctionParameter:=clsRemoveListFun) End If @@ -175,9 +175,11 @@ Public Class ucrButtons Else frmMain.AddToScriptWindow(clsRemoveFunc.ToScript()) End If - clsRsyntax.SetbIsAssigned(bIsAssigned) - clsRsyntax.SetbToBeAssigned(bToBeAssigned) - clsRsyntax.SetstrAssignTo(strAssignTo) + For Each clsRCode As RCodeStructure In dctFunctionAssignToValues.Keys + clsRCode.bToBeAssigned = True + clsRCode.strAssignTo = dctFunctionAssignToValues(clsRCode) + clsRCode.bIsAssigned = False + Next End Sub Public Sub OKEnabled(bEnabled As Boolean) From 0c669658412859e65b70e1d5ecd33b4b723cd113 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sat, 17 Jun 2017 18:46:15 +0100 Subject: [PATCH 058/201] implemented conditions for functions within RSyntax and working on random samples dialog --- instat/clsCondition.vb | 60 +++++++++++++++++++++++++++++++++++-- instat/clsRSyntax.vb | 62 +++++++++++++++++++++++++++++++++++---- instat/dlgRandomSample.vb | 18 +++++++----- instat/mdlCoreControl.vb | 4 +-- instat/ucrCore.vb | 31 ++++++++++++++++++-- 5 files changed, 156 insertions(+), 19 deletions(-) diff --git a/instat/clsCondition.vb b/instat/clsCondition.vb index c4d7ad805cd..52ec97011f0 100644 --- a/instat/clsCondition.vb +++ b/instat/clsCondition.vb @@ -4,6 +4,8 @@ Private bIsFunctionNames As Boolean = False Private bIsParameterType As Boolean = False Private bIsParameterValuesRFunctionNames As Boolean = False + Private bIsRSyntaxFunctionNames As Boolean = False + Private bIsRSyntaxContainsCode As Boolean = False Private strParameterType As String = "" Private strParameterName As String = "" Private lstValues As List(Of String) = New List(Of String) @@ -20,6 +22,8 @@ bIsParameterValues = False bIsFunctionNames = False bIsParameterType = False + bIsRSyntaxFunctionNames = False + bIsRSyntaxContainsCode = False strParameterType = "" bIsParameterValuesRFunctionNames = False bIsPositive = bNewIsPositive @@ -32,6 +36,8 @@ bIsParameterPresent = False bIsFunctionNames = False bIsParameterType = False + bIsRSyntaxFunctionNames = False + bIsRSyntaxContainsCode = False strParameterType = "" bIsParameterValuesRFunctionNames = False bIsPositive = bNewIsPositive @@ -47,7 +53,9 @@ bIsParameterValues = False bIsParameterPresent = False bIsFunctionNames = False - bIsParameterType = False + bIsParameterType = False + bIsRSyntaxFunctionNames = False + bIsRSyntaxContainsCode = False strParameterType = "" bIsParameterValuesRFunctionNames = True bIsPositive = bNewIsPositive @@ -67,6 +75,8 @@ bIsParameterValues = False bIsParameterPresent = False bIsParameterType = False + bIsRSyntaxFunctionNames = False + bIsRSyntaxContainsCode = False strParameterType = "" bIsParameterValuesRFunctionNames = False bIsPositive = bNewIsPositive @@ -77,6 +87,8 @@ bIsParameterValues = False bIsParameterPresent = False bIsParameterType = True + bIsRSyntaxFunctionNames = False + bIsRSyntaxContainsCode = False bIsParameterValuesRFunctionNames = False strParameterName = strParamName If Not {"string", "RFunction", "ROperator"}.Contains(strType) Then @@ -85,9 +97,39 @@ Else strParameterType = strType End If + End Sub + + Public Sub SetRSyntaxFunctionNamesMultiple(lstFuncNames As List(Of String), Optional bNewIsPositive As Boolean = True) + lstValues = lstFuncNames + bIsFunctionNames = False + bIsParameterValues = False + bIsParameterPresent = False + bIsParameterType = False + bIsRSyntaxFunctionNames = True + bIsRSyntaxContainsCode = False + strParameterType = "" + bIsParameterValuesRFunctionNames = False + bIsPositive = bNewIsPositive + End Sub + + Public Sub SetRSyntaxFunctionName(strFuncName As String, Optional bNewIsPositive As Boolean = True) + SetRSyntaxFunctionNamesMultiple(New List(Of String)({strFuncName}), bNewIsPositive) + End Sub + + Public Sub SetRSyntaxContainsCode(Optional bNewIsPositive As Boolean = True) + lstValues = New List(Of String) + bIsFunctionNames = False + bIsParameterValues = False + bIsParameterPresent = False + bIsParameterType = False + bIsRSyntaxFunctionNames = False + bIsRSyntaxContainsCode = True + strParameterType = "" + bIsParameterValuesRFunctionNames = False + bIsPositive = bNewIsPositive End Sub - Public Function IsSatisfied(clsRCode As RCodeStructure, Optional clsParameter As RParameter = Nothing) As Boolean + Public Function IsSatisfied(clsRCode As RCodeStructure, Optional clsParameter As RParameter = Nothing, Optional clsRSyntax As RSyntax = Nothing) As Boolean Dim clsTempParam As RParameter Dim clsTempFunc As RFunction @@ -138,8 +180,20 @@ Return Not bIsPositive End If Return ((bIsPositive = lstValues.Contains(DirectCast(clsTempParam.clsArgumentCodeStructure, RFunction).strRCommand))) + ElseIf bIsRSyntaxFunctionNames Then + If clsRSyntax IsNot Nothing Then + Return (bIsPositive = lstValues.Any(Function(x) clsRSyntax.GetFunctionNames().Contains(x))) + Else + Return Not bIsPositive + End If + ElseIf bIsRSyntaxContainsCode Then + If clsRSyntax IsNot Nothing AndAlso clsRCode IsNot Nothing Then + Return (bIsPositive = clsRSyntax.ContainsCode(clsRCode)) + Else + Return Not bIsPositive + End If Else - Return True + Return True End If End Function End Class \ No newline at end of file diff --git a/instat/clsRSyntax.vb b/instat/clsRSyntax.vb index 495d1406d18..b5405dbe2ee 100644 --- a/instat/clsRSyntax.vb +++ b/instat/clsRSyntax.vb @@ -383,21 +383,73 @@ Public Class RSyntax Public Function AfterCodesContain(clsNewRCode As RCodeStructure) As Boolean Return lstAfterCodes.Contains(clsNewRCode) + End Function + + Public Function BeforeCodesContain(strFunctionName As String) As Boolean + Dim clsTempFunc As RFunction + For Each clsRCode As RCodeStructure In lstBeforeCodes + clsTempFunc = TryCast(clsRCode, RFunction) + If clsTempFunc IsNot Nothing AndAlso clsTempFunc.strRCommand = strFunctionName Then + Return True + End If + Next + Return False + End Function + + Public Function AfterCodesContain(strFunctionName As String) As Boolean + Dim clsTempFunc As RFunction + For Each clsRCode As RCodeStructure In lstBeforeCodes + clsTempFunc = TryCast(clsRCode, RFunction) + If clsTempFunc IsNot Nothing AndAlso clsTempFunc.strRCommand = strFunctionName Then + Return True + End If + Next + Return False + End Function + + Public Function ContainsCode(clsRCode As RCodeStructure) As Boolean + Return (clsBaseFunction IsNot Nothing AndAlso clsBaseFunction.Equals(clsRCode)) OrElse (clsBaseOperator.Equals(clsRCode) AndAlso clsBaseOperator.Equals(clsRCode)) OrElse BeforeCodesContain(clsRCode) OrElse AfterCodesContain(clsRCode) + End Function + + Public Function ContainsFunctionName(strFunctionName As String) As Boolean + Return (clsBaseFunction IsNot Nothing AndAlso clsBaseFunction.strRCommand = strFunctionName) OrElse BeforeCodesContain(strFunctionName) OrElse AfterCodesContain(strFunctionName) + End Function + + Public Function GetFunctionNames() As List(Of String) + Dim lstNames As New List(Of String) + Dim clsTempFunc As RFunction + + If clsBaseFunction IsNot Nothing Then + lstNames.Add(clsBaseFunction.strRCommand) + End If + For Each clsRCode As RCodeStructure In lstBeforeCodes + clsTempFunc = TryCast(clsRCode, RFunction) + If clsTempFunc IsNot Nothing Then + lstNames.Add(clsTempFunc.strRCommand) + End If + Next + For Each clsRCode As RCodeStructure In lstAfterCodes + clsTempFunc = TryCast(clsRCode, RFunction) + If clsTempFunc IsNot Nothing Then + lstNames.Add(clsTempFunc.strRCommand) + End If + Next + Return lstNames End Function - Public Sub AddToBeforeCodes(clsNewRCode As RCodeStructure, Optional iPos As Integer = -1) + Public Sub AddToBeforeCodes(clsNewRCode As RCodeStructure, Optional iPosition As Integer = -1) If Not BeforeCodesContain(clsNewRCode) Then lstBeforeCodes.Add(clsNewRCode) End If - lstBeforeCodes.Find(Function(x) x.Equals(clsNewRCode)).iPosition = iPos + lstBeforeCodes.Find(Function(x) x.Equals(clsNewRCode)).iPosition = iPosition End Sub - Public Sub AddToAfterCodes(clsNewRCode As RCodeStructure, Optional iPos As Integer = -1) + Public Sub AddToAfterCodes(clsNewRCode As RCodeStructure, Optional iPosition As Integer = -1) If Not AfterCodesContain(clsNewRCode) Then lstAfterCodes.Add(clsNewRCode) - clsNewRCode.iPosition = iPos + clsNewRCode.iPosition = iPosition Else - lstAfterCodes.Find(Function(x) x.Equals(clsNewRCode)).iPosition = iPos + lstAfterCodes.Find(Function(x) x.Equals(clsNewRCode)).iPosition = iPosition End If End Sub diff --git a/instat/dlgRandomSample.vb b/instat/dlgRandomSample.vb index 72addb7eac4..1abaf4d8c9e 100644 --- a/instat/dlgRandomSample.vb +++ b/instat/dlgRandomSample.vb @@ -46,7 +46,8 @@ Public Class dlgRandomSample ucrNudNumberOfSamples.SetMinMax(1, Integer.MaxValue) ucrSelectorRandomSamples.bUseCurrentFilter = False ucrChkSetSeed.SetText("Set Seed") - ucrChkSetSeed.AddFunctionNamesCondition(False, "set.seed") + ucrChkSetSeed.AddRSyntaxFunctionNamesCondition(True, {"set.seed"}) + ucrChkSetSeed.AddRSyntaxFunctionNamesCondition(False, {"set.seed"}, False) ucrChkSetSeed.AddToLinkedControls(ucrNudSeed, {True}, bNewLinkedHideIfParameterMissing:=True, bNewLinkedAddRemoveParameter:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=5) ucrNudSeed.SetParameter(New RParameter("seed", 0)) @@ -86,6 +87,7 @@ Public Class dlgRandomSample Private Sub SetRCodeforControls(bReset As Boolean) ucrNudSeed.SetRCode(clsSetSeed, bReset) ucrChkSetSeed.SetRCode(clsSetSeed, bReset) + ucrChkSetSeed.SetRSyntax(ucrBase.clsRsyntax, bReset) ucrSaveRandomSamples.SetRCode(clsMultipleSamplesFunction, bReset) ucrNudNumberOfSamples.SetRCode(clsMultipleSamplesFunction, bReset) End Sub @@ -106,12 +108,6 @@ Public Class dlgRandomSample TestOKEnabled() End Sub - Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk - If ucrChkSetSeed.Checked Then - frmMain.clsRLink.RunScript(clsSetSeed.ToScript(), strComment:="dlgRandomSample: Setting the seed for random number generator") - End If - End Sub - Private Sub SetNewColumName() If ucrNudNumberOfSamples.Value = 1 Then ucrSaveRandomSamples.SetAssignToBooleans(bTempAssignToIsPrefix:=False) @@ -158,4 +154,12 @@ Public Class dlgRandomSample Private Sub ucrDistWithParameters_ParameterChanged() Handles ucrDistWithParameters.ControlContentsChanged TestOKEnabled() End Sub + + Private Sub ucrChkSetSeed_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkSetSeed.ControlValueChanged + If ucrChkSetSeed.Checked Then + ucrBase.clsRsyntax.AddToBeforeCodes(clsSetSeed, iPosition:=0) + Else + ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsSetSeed) + End If + End Sub End Class \ No newline at end of file diff --git a/instat/mdlCoreControl.vb b/instat/mdlCoreControl.vb index e96151f7308..6e7772231d4 100644 --- a/instat/mdlCoreControl.vb +++ b/instat/mdlCoreControl.vb @@ -82,11 +82,11 @@ Module mdlCoreControl Next End Sub - Public Function AllConditionsSatisfied(lstConditions As List(Of Condition), clsRCode As RCodeStructure, Optional clsParameter As RParameter = Nothing) + Public Function AllConditionsSatisfied(lstConditions As List(Of Condition), clsRCode As RCodeStructure, Optional clsParameter As RParameter = Nothing, Optional clsRSyntax As RSyntax = Nothing) Dim bTemp As Boolean = True For Each clsTempCond In lstConditions - If Not clsTempCond.IsSatisfied(clsRCode, clsParameter) Then + If Not clsTempCond.IsSatisfied(clsRCode, clsParameter, clsRSyntax) Then bTemp = False Exit For End If diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index da34dac3c4b..c9d57e880bc 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -22,7 +22,8 @@ Public Class ucrCore 'There may be duplicate values in the lists. For example, one parameter being added into multiple functions. Protected lstAllRCodes As List(Of RCodeStructure) = New List(Of RCodeStructure)({Nothing}) Protected lstAllRParameters As List(Of RParameter) = New List(Of RParameter)({Nothing}) - + 'Control may have conditions on RSyntax as a whole i.e. value depends on a function being in the RSyntax + Protected clsRSyntax As RSyntax = Nothing 'Default value of the control 'No specific type since it can be interpreted different by each control type Protected objRDefault As Object = Nothing @@ -146,7 +147,7 @@ Public Class ucrCore If clsRCode IsNot Nothing Then For Each kvpTemp As KeyValuePair(Of Object, List(Of Condition)) In dctConditions If kvpTemp.Value.Count > 0 Then - If AllConditionsSatisfied(kvpTemp.Value, clsRCode, clsParameter) Then + If AllConditionsSatisfied(kvpTemp.Value, clsRCode, clsParameter, clsRSyntax) Then If bConditionsMet Then MsgBox("Developer error: More than one state of control " & Name & " satisfies it's condition. Cannot determine how to set the control from the RCode. Modify conditions so that only one state can satisfy its conditions.") Else @@ -230,6 +231,18 @@ Public Class ucrCore UpdateControl(bReset) End Sub + 'TODO in future may want to set RCode and RSyntax together if both needed for conditions + ' then would need method to add both at the same time + Public Overridable Sub SetRSyntax(clsNewRSyntax As RSyntax, Optional bReset As Boolean = False) + If clsRSyntax Is Nothing OrElse Not clsRSyntax.Equals(clsNewRSyntax) Then + clsRSyntax = clsNewRSyntax + If bUpdateRCodeFromControl AndAlso CanUpdate() Then + UpdateRCode(bReset) + End If + End If + UpdateControl(bReset) + End Sub + Protected Overridable Function CanUpdate() Return (clsParameter IsNot Nothing AndAlso (Not clsRCode.ContainsParameter(clsParameter.strArgumentName)) AndAlso clsParameter.HasValue()) End Function @@ -472,6 +485,20 @@ Public Class ucrCore AddCondition(objControlState, clsTempCond) End Sub + Public Sub AddRSyntaxFunctionNamesCondition(objControlState As Object, strFunctionNames As String(), Optional bNewIsPositive As Boolean = True) + Dim clsTempCond As New Condition + + clsTempCond.SetRSyntaxFunctionNamesMultiple(strFunctionNames.ToList(), bNewIsPositive:=bNewIsPositive) + AddCondition(objControlState, clsTempCond) + End Sub + + Public Sub AddRSyntaxContainCodeCondition(objControlState As Object, Optional bNewIsPositive As Boolean = True) + Dim clsTempCond As New Condition + + clsTempCond.SetRSyntaxContainsCode(bNewIsPositive:=bNewIsPositive) + AddCondition(objControlState, clsTempCond) + End Sub + Public Sub SetVisible(bVisible As Boolean) If ctrLinkedDisaplyControl IsNot Nothing AndAlso TypeOf ctrLinkedDisaplyControl Is GroupBox Then ctrLinkedDisaplyControl.Visible = bVisible From c53db153081145f58e6ad47f2802c253c63a6788 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sat, 17 Jun 2017 18:48:19 +0100 Subject: [PATCH 059/201] changed method name --- instat/dlgRandomSample.vb | 4 ++-- instat/ucrCore.vb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/instat/dlgRandomSample.vb b/instat/dlgRandomSample.vb index 1abaf4d8c9e..17a3e5f0394 100644 --- a/instat/dlgRandomSample.vb +++ b/instat/dlgRandomSample.vb @@ -46,8 +46,8 @@ Public Class dlgRandomSample ucrNudNumberOfSamples.SetMinMax(1, Integer.MaxValue) ucrSelectorRandomSamples.bUseCurrentFilter = False ucrChkSetSeed.SetText("Set Seed") - ucrChkSetSeed.AddRSyntaxFunctionNamesCondition(True, {"set.seed"}) - ucrChkSetSeed.AddRSyntaxFunctionNamesCondition(False, {"set.seed"}, False) + ucrChkSetSeed.AddRSyntaxContainsFunctionNamesCondition(True, {"set.seed"}) + ucrChkSetSeed.AddRSyntaxContainsFunctionNamesCondition(False, {"set.seed"}, False) ucrChkSetSeed.AddToLinkedControls(ucrNudSeed, {True}, bNewLinkedHideIfParameterMissing:=True, bNewLinkedAddRemoveParameter:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=5) ucrNudSeed.SetParameter(New RParameter("seed", 0)) diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index c9d57e880bc..985c5d6869e 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -485,7 +485,7 @@ Public Class ucrCore AddCondition(objControlState, clsTempCond) End Sub - Public Sub AddRSyntaxFunctionNamesCondition(objControlState As Object, strFunctionNames As String(), Optional bNewIsPositive As Boolean = True) + Public Sub AddRSyntaxContainsFunctionNamesCondition(objControlState As Object, strFunctionNames As String(), Optional bNewIsPositive As Boolean = True) Dim clsTempCond As New Condition clsTempCond.SetRSyntaxFunctionNamesMultiple(strFunctionNames.ToList(), bNewIsPositive:=bNewIsPositive) From 73232f179cb92eeaf376ed353f2919c7eb8d5d99 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sat, 17 Jun 2017 21:13:48 +0100 Subject: [PATCH 060/201] updating one var compare model and fixed bug in base buttons resetting assign to --- instat/clsRCodeStructure.vb | 12 +-- instat/clsRParameter.vb | 7 +- instat/clsRSyntax.vb | 15 ++-- instat/dlgOneVarCompareModels.vb | 62 +++++++------ instat/sdgOneVarCompareModels.vb | 144 ++++++++++++++++++++----------- instat/ucrButtons.vb | 36 ++++---- 6 files changed, 163 insertions(+), 113 deletions(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index bf64aa9e9fa..fae1af2f8bc 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -383,14 +383,14 @@ Public Class RCodeStructure Return clsTemp End Function - Public Function GetAllAssignTo(dctFunctionAssignToValues As Dictionary(Of RCodeStructure, String)) As Dictionary(Of RCodeStructure, String) + Public Sub GetAllAssignTo(lstCodes As List(Of RCodeStructure), lstValues As List(Of String)) SortParameters() - If bToBeAssigned AndAlso Not dctFunctionAssignToValues.ContainsKey(Me) Then - dctFunctionAssignToValues.Add(Me, strAssignTo) + If bToBeAssigned AndAlso Not lstCodes.Contains(Me) Then + lstCodes.Add(Me) + lstValues.Add(strAssignTo) End If For Each clsTempParam As RParameter In clsParameters - clsTempParam.GetAllAssignTo(dctFunctionAssignToValues) + clsTempParam.GetAllAssignTo(lstCodes, lstValues) Next - Return dctFunctionAssignToValues - End Function + End Sub End Class diff --git a/instat/clsRParameter.vb b/instat/clsRParameter.vb index 2e2eb8d5895..c60416f84c3 100644 --- a/instat/clsRParameter.vb +++ b/instat/clsRParameter.vb @@ -133,10 +133,9 @@ Public Class RParameter Return clsTempRParam End Function - Public Function GetAllAssignTo(dctAssignToValues As Dictionary(Of RCodeStructure, String)) As Dictionary(Of RCodeStructure, String) + Public Sub GetAllAssignTo(lstCodes As List(Of RCodeStructure), lstValues As List(Of String)) If bIsFunction OrElse bIsOperator Then - clsArgumentCodeStructure.GetAllAssignTo(dctAssignToValues) + clsArgumentCodeStructure.GetAllAssignTo(lstCodes, lstValues) End If - Return dctAssignToValues - End Function + End Sub End Class \ No newline at end of file diff --git a/instat/clsRSyntax.vb b/instat/clsRSyntax.vb index b5405dbe2ee..9f09eaf9249 100644 --- a/instat/clsRSyntax.vb +++ b/instat/clsRSyntax.vb @@ -228,24 +228,23 @@ Public Class RSyntax Return lstAfterCodes End Function - Public Function GetAllAssignTo(dctFunctionAssignToValues As Dictionary(Of RCodeStructure, String)) As Dictionary(Of RCodeStructure, String) + Public Sub GetAllAssignTo(lstCodes As List(Of RCodeStructure), lstValues As List(Of String)) If bUseBaseFunction Then - clsBaseFunction.GetAllAssignTo(dctFunctionAssignToValues) + clsBaseFunction.GetAllAssignTo(lstCodes, lstValues) ElseIf bUseBaseOperator Then - clsBaseOperator.GetAllAssignTo(dctFunctionAssignToValues) + clsBaseOperator.GetAllAssignTo(lstCodes, lstValues) ElseIf bUseCommandString Then - clsBaseCommandString.GetAllAssignTo(dctFunctionAssignToValues) + clsBaseCommandString.GetAllAssignTo(lstCodes, lstValues) End If lstBeforeCodes.Sort(AddressOf CompareCodePositions) For Each clsTempCode As RCodeStructure In lstBeforeCodes - clsTempCode.GetAllAssignTo(dctFunctionAssignToValues) + clsTempCode.GetAllAssignTo(lstCodes, lstValues) Next lstAfterCodes.Sort(AddressOf CompareCodePositions) For Each clsTempCode As RCodeStructure In lstAfterCodes - clsTempCode.GetAllAssignTo(dctFunctionAssignToValues) + clsTempCode.GetAllAssignTo(lstCodes, lstValues) Next - Return dctFunctionAssignToValues - End Function + End Sub Public Sub SortParameters() 'This sub is used to reorder the parameters according to their Position property. diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index 338c45827bf..a708bd7b381 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -16,12 +16,14 @@ ' along with this program. If not, see . Imports instat.Translations + Public Class dlgOneVarCompareModels Private bFirstLoad As Boolean = True Private bReset As Boolean = True Private bResetSubdialog As Boolean = False - Private clsGofStat, clsReceiver, clsRAsDataFrame, clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction As New RFunction - Private clsOperatorforTable, clsOperatorForBreaks As New ROperator + Private clsGofStat, clsReceiver, clsRAsDataFrame, clsCdfcompFunction, clsDenscompFunction, clsQqcompFunction, clsPpcompFunction As New RFunction + Private clsChisqtableOperator, clsChisqbreaksOperator As New ROperator + Private Sub dlgOneVarCompareModels_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) If bFirstLoad Then @@ -48,32 +50,45 @@ Public Class dlgOneVarCompareModels ucrReceiverCompareModels.SetParameterIsRFunction() ucrReceiverCompareModels.Selector = ucrSelectorOneVarCompModels ucrReceiverCompareModels.SetMeAsReceiver() - End Sub Private Sub SetDefaults() clsGofStat = New RFunction - clsRppcompFunction = New RFunction + clsPpcompFunction = New RFunction clsReceiver = New RFunction - clsRdenscompFunction = New RFunction - clsRqqcompFunction = New RFunction - clsRqqcompFunction = New RFunction - clsOperatorForBreaks = New ROperator - clsOperatorforTable = New ROperator + clsDenscompFunction = New RFunction + clsQqcompFunction = New RFunction + clsQqcompFunction = New RFunction + clsChisqbreaksOperator = New ROperator + clsChisqtableOperator = New ROperator ucrSelectorOneVarCompModels.Reset() clsGofStat.SetPackageName("fitdistrplus") clsGofStat.SetRCommand("gofstat") - clsRcdfcompFunction.SetPackageName("fitdistrplus") - clsRcdfcompFunction.SetRCommand("cdfcomp") - clsOperatorforTable.SetOperation("$") - clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) - clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") + clsCdfcompFunction.SetPackageName("fitdistrplus") + clsCdfcompFunction.SetRCommand("cdfcomp") + + clsPpcompFunction.SetPackageName("fitdistrplus") + clsPpcompFunction.SetRCommand("ppcomp") + + clsQqcompFunction.SetPackageName("fitdistrplus") + clsQqcompFunction.SetRCommand("qqcomp") + + clsDenscompFunction.SetPackageName("fitdistrplus") + clsDenscompFunction.SetRCommand("denscomp") + + clsChisqtableOperator.SetOperation("$") + clsChisqtableOperator.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) + clsChisqtableOperator.AddParameter(strParameterValue:="chisqtable", iPosition:=1) + + clsChisqbreaksOperator.SetOperation("$") + clsChisqbreaksOperator.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) + clsChisqbreaksOperator.AddParameter(strParameterValue:="chisqbreaks", iPosition:=1) clsRAsDataFrame.SetRCommand("as.data.frame") - clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsOperatorforTable) + clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsChisqtableOperator) clsRAsDataFrame.SetAssignTo(ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_ChiSquare", strTempDataframe:=ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text) @@ -87,7 +102,10 @@ Public Class dlgOneVarCompareModels Private Sub SetRCodeForControls(bReset As Boolean) ucrReceiverCompareModels.SetRCode(clsGofStat, bReset) - 'SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) + ucrReceiverCompareModels.AddAdditionalCodeParameterPair(clsCdfcompFunction, New RParameter("ft", 0), iAdditionalPairNo:=1) + ucrReceiverCompareModels.AddAdditionalCodeParameterPair(clsPpcompFunction, New RParameter("ft", 0), iAdditionalPairNo:=2) + ucrReceiverCompareModels.AddAdditionalCodeParameterPair(clsQqcompFunction, New RParameter("ft", 0), iAdditionalPairNo:=3) + ucrReceiverCompareModels.AddAdditionalCodeParameterPair(clsDenscompFunction, New RParameter("ft", 0), iAdditionalPairNo:=4) End Sub Public Sub TestOKEnabled() @@ -104,10 +122,6 @@ Public Class dlgOneVarCompareModels TestOKEnabled() End Sub - 'Private Sub ReopenDialog() - ' sdgOneVarCompareModels.Reopen() - 'End Sub - Private Sub ucrSelectorOneVarCompModels_DataFrameChanged() Handles ucrSelectorOneVarCompModels.DataFrameChanged ' sdgOneVarCompareModels.DisplayChiSquare() End Sub @@ -123,17 +137,13 @@ Public Class dlgOneVarCompareModels End Sub Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click - sdgOneVarCompareModels.SetRCode(clsGofStat, clsReceiver, clsRdenscompFunction, clsRcdfcompFunction, clsRqqcompFunction, clsRppcompFunction, clsRAsDataFrame, clsOperatorforTable, clsOperatorForBreaks, bResetSubdialog) + sdgOneVarCompareModels.SetRCode(ucrBase.clsRsyntax, clsGofStat, clsDenscompFunction, clsCdfcompFunction, clsQqcompFunction, clsPpcompFunction, clsRAsDataFrame, clsChisqtableOperator, clsChisqbreaksOperator, bResetSubdialog) bResetSubdialog = False sdgOneVarCompareModels.ShowDialog() End Sub Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk - sdgOneVarCompareModels.CreateGraphs() - End Sub - - Private Sub ucrReceiverCompare_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverCompareModels.ControlValueChanged - clsReceiver = ucrReceiverCompareModels.GetVariables() + 'sdgOneVarCompareModels.CreateGraphs() End Sub End Class diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index f4b19402dde..faefeeb6ff4 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -1,5 +1,4 @@ - -' Instat-R +' Instat-R ' Copyright (C) 2015 ' ' This program is free software: you can redistribute it and/or modify @@ -14,14 +13,15 @@ ' ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . + +Imports instat Imports instat.Translations Public Class sdgOneVarCompareModels Private bControlsInitialised As Boolean = False - Private clsRcdfcompFunction, clsRdenscompFunction, clsRqqcompFunction, clsRppcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRGofStat, clsRGofStat2, clsRReceiver, clsRsyntax, clsRPlotFunction, clsOperation As New RFunction + Private clsCdfcompFunction, clsDenscompFunction, clsQqcompFunction, clsPpcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRGofStat, clsRPlotFunction, clsOperation As New RFunction Private clsOperatorforTable, clsOperatorForBreaks As New ROperator - Private WithEvents ucrRecs As ucrReceiver - Public bfirstload As Boolean = True + Private clsRSyntax As RSyntax Private Sub sdgOneVarCompareModels(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) @@ -29,23 +29,33 @@ Public Class sdgOneVarCompareModels Public Sub InitialiseControls() + InitialiseTabs() + 'ucrInputChiSquareBreaks ucrChkInputChiSquareBreakpoints.SetText("Input Chi-Square Breakpoints") - 'ucrChkPlots - ucrChkCDF.AddFunctionNamesCondition(True, "cdfcomp") + ucrChkCDF.AddRSyntaxContainsFunctionNamesCondition(True, {"cdfcomp"}) + ucrChkCDF.AddRSyntaxContainsFunctionNamesCondition(False, {"cdfcomp"}, False) ucrChkCDF.SetText("CDF") ucrChkDensity.SetText("Density") + ucrChkDensity.AddRSyntaxContainsFunctionNamesCondition(True, {"denscomp"}) + ucrChkDensity.AddRSyntaxContainsFunctionNamesCondition(False, {"denscomp"}, False) + ucrChkPP.SetText("PP") + ucrChkPP.AddRSyntaxContainsFunctionNamesCondition(True, {"ppcomp"}) + ucrChkPP.AddRSyntaxContainsFunctionNamesCondition(False, {"ppcomp"}, False) + ucrChkQQ.SetText("QQ") - InitialiseTabs() + ucrChkQQ.AddRSyntaxContainsFunctionNamesCondition(True, {"qqcomp"}) + ucrChkQQ.AddRSyntaxContainsFunctionNamesCondition(False, {"qqcomp"}, False) + 'ucrSaveGOF ucrSaveGOF.SetPrefix("GOF") - ' ucrSaveGOF.SetSaveTypeAsModel() ' or graph? ucrSaveGOF.SetCheckBoxText("Save Fit") ucrSaveGOF.SetIsComboBox() ucrSaveGOF.SetAssignToIfUncheckedValue("last_model") + ' ucrSaveGOF.SetSaveTypeAsModel() ' or graph? 'ucrSaveDisplayChi ' ucrSaveDisplayChi.SetPrefix("ChiSquare") @@ -55,38 +65,41 @@ Public Class sdgOneVarCompareModels ucrSaveDisplayChi.SetAssignToIfUncheckedValue("last_DataFrame") 'ucrSavePlot - ucrSavePlots.Enabled = False 'for now + ucrSavePlots.Visible = False 'hidden as would need to be able to save up to four graphs ucrSavePlots.SetPrefix("plots") ucrSavePlots.SetSaveTypeAsModel() ucrSavePlots.SetCheckBoxText("Save Plot") ucrSavePlots.SetIsComboBox() ucrSavePlots.SetAssignToIfUncheckedValue("last_model") + + bControlsInitialised = True End Sub - Public Sub SetRCode(clsNewRGofStat As RFunction, clsNewReceiver As RFunction, clsNewRdenscompFunction As RFunction, clsNewRcdfcompFunction As RFunction, clsNewRqqcompFunction As RFunction, clsNewRppcompFunction As RFunction, clsNewclsRAsDataFrame As RFunction, Optional clsNewOperatorforTable As ROperator = Nothing, Optional clsNewOperatorForBreaks As ROperator = Nothing, Optional bReset As Boolean = False) + Public Sub SetRCode(clsNewRSyntax As RSyntax, clsNewRGofStat As RFunction, clsNewDenscompFunction As RFunction, clsNewCdfcompFunction As RFunction, clsNewQqcompFunction As RFunction, clsNewPpcompFunction As RFunction, clsNewclsRAsDataFrame As RFunction, Optional clsNewOperatorforTable As ROperator = Nothing, Optional clsNewOperatorForBreaks As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If - - clsRGofStat = clsNewRGofStat.Clone - clsRGofStat2 = clsNewRGofStat.Clone - clsRReceiver = clsNewReceiver + clsRSyntax = clsNewRSyntax + clsRGofStat = clsNewRGofStat clsOperatorforTable = clsNewOperatorforTable clsRAsDataFrame = clsNewclsRAsDataFrame - ' clsRPlotFunction = clsNewRPlotFunction - clsRdenscompFunction = clsNewRdenscompFunction - clsRcdfcompFunction = clsNewRcdfcompFunction - clsRqqcompFunction = clsNewRqqcompFunction - clsRppcompFunction = clsNewRppcompFunction + clsDenscompFunction = clsNewDenscompFunction + clsCdfcompFunction = clsNewCdfcompFunction + clsQqcompFunction = clsNewQqcompFunction + clsPpcompFunction = clsNewPpcompFunction clsOperatorForBreaks = clsNewOperatorForBreaks 'Setting Rcode for the sub dialog ucrSaveGOF.SetRCode(clsRGofStat, bReset) - ucrChkCDF.SetRCode(clsRcdfcompFunction, bReset) - ucrChkDensity.SetRCode(clsRdenscompFunction, bReset) + ucrChkCDF.SetRSyntax(clsRSyntax, bReset) + + ucrChkDensity.SetRSyntax(clsRSyntax, bReset) + ucrChkPP.SetRSyntax(clsRSyntax, bReset) + ucrChkQQ.SetRSyntax(clsRSyntax, bReset) + ucrChkCDF.SetRSyntax(clsRSyntax, bReset) + ucrChkInputChiSquareBreakpoints.SetRCode(clsOperatorForBreaks, bReset) - ucrChkPP.SetRCode(clsRppcompFunction, bReset) - ucrChkQQ.SetRCode(clsRqqcompFunction, bReset) + ucrSaveDisplayChi.SetRCode(clsRAsDataFrame, bReset) If bReset Then @@ -97,35 +110,35 @@ Public Class sdgOneVarCompareModels Public Sub CreateGraphs() Dim strTemp As String = "" - If ucrChkCDF.Checked Then - clsRcdfcompFunction.SetPackageName("fitdistrplus") - clsRcdfcompFunction.SetRCommand("cdfcomp") - clsRcdfcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRcdfcompFunction.ToScript(), 3) - End If - If ucrChkPP.Checked Then - clsRppcompFunction.SetPackageName("fitdistrplus") - clsRppcompFunction.SetRCommand("ppcomp") - clsRppcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRppcompFunction.ToScript(), 3) - - End If - If ucrChkQQ.Checked Then - clsRqqcompFunction.SetPackageName("fitdistrplus") - clsRqqcompFunction.SetRCommand("qqcomp") - clsRqqcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRqqcompFunction.ToScript(), 3) - End If - If ucrChkDensity.Checked Then - clsRdenscompFunction.SetPackageName("fitdistrplus") - clsRdenscompFunction.SetRCommand("denscomp") - clsRdenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) - frmMain.clsRLink.RunScript(clsRdenscompFunction.ToScript(), 3) - End If + 'If ucrChkCDF.Checked Then + ' clsCdfcompFunction.SetPackageName("fitdistrplus") + ' clsCdfcompFunction.SetRCommand("cdfcomp") + ' clsCdfcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + ' frmMain.clsRLink.RunScript(clsCdfcompFunction.ToScript(), 3) + 'End If + 'If ucrChkPP.Checked Then + ' clsPpcompFunction.SetPackageName("fitdistrplus") + ' clsPpcompFunction.SetRCommand("ppcomp") + ' clsPpcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + ' frmMain.clsRLink.RunScript(clsPpcompFunction.ToScript(), 3) + + 'End If + 'If ucrChkQQ.Checked Then + ' clsQqcompFunction.SetPackageName("fitdistrplus") + ' clsQqcompFunction.SetRCommand("qqcomp") + ' clsQqcompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + ' frmMain.clsRLink.RunScript(clsQqcompFunction.ToScript(), 3) + 'End If + 'If ucrChkDensity.Checked Then + ' clsDenscompFunction.SetPackageName("fitdistrplus") + ' clsDenscompFunction.SetRCommand("denscomp") + ' clsDenscompFunction.AddParameter("ft", clsRFunctionParameter:=clsRReceiver) + ' frmMain.clsRLink.RunScript(clsDenscompFunction.ToScript(), 3) + 'End If If ucrSaveDisplayChi.IsComplete Then clsOperatorforTable.SetOperation("$") - clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsRGofStat2, iPosition:=0) + clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsRGofStat, iPosition:=0) clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") frmMain.clsRLink.RunScript(clsOperatorforTable.ToScript(), 0) @@ -148,6 +161,37 @@ Public Class sdgOneVarCompareModels tbpOneVarCompareModels.SelectedIndex = 0 End Sub + Private Sub ucrChkCDF_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkCDF.ControlValueChanged + If ucrChkCDF.Checked Then + clsRSyntax.AddToAfterCodes(clsCdfcompFunction, iPosition:=0) + Else + clsRSyntax.RemoveFromAfterCodes(clsCdfcompFunction) + End If + End Sub + + Private Sub ucrChkPP_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkPP.ControlValueChanged + If ucrChkPP.Checked Then + clsRSyntax.AddToAfterCodes(clsPpcompFunction, iPosition:=1) + Else + clsRSyntax.RemoveFromAfterCodes(clsPpcompFunction) + End If + End Sub + + Private Sub ucrChkQQ_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkQQ.ControlValueChanged + If ucrChkQQ.Checked Then + clsRSyntax.AddToAfterCodes(clsQqcompFunction, iPosition:=2) + Else + clsRSyntax.RemoveFromAfterCodes(clsQqcompFunction) + End If + End Sub + + Private Sub ucrChkDensity_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDensity.ControlValueChanged + If ucrChkDensity.Checked Then + clsRSyntax.AddToAfterCodes(clsDenscompFunction, iPosition:=3) + Else + clsRSyntax.RemoveFromAfterCodes(clsDenscompFunction) + End If + End Sub End Class diff --git a/instat/ucrButtons.vb b/instat/ucrButtons.vb index d00c0177a32..9805a5b62a7 100644 --- a/instat/ucrButtons.vb +++ b/instat/ucrButtons.vb @@ -22,7 +22,6 @@ Public Class ucrButtons Public bFirstLoad As Boolean Public strComment As String - Public Sub New() ' This call is required by the designer. InitializeComponent() @@ -87,10 +86,8 @@ Public Class ucrButtons Dim bFirstCode As Boolean = True Dim clsRemoveFunc As New RFunction Dim clsRemoveListFun As New RFunction - Dim lstAssignTo As New List(Of String) - ' list of {RCodeStructure, strAssignTo, bToBeAssigned} - ' these are used to reset them correctly after eunning ToScript for the code - Dim dctFunctionAssignToValues As New Dictionary(Of RCodeStructure, String) + Dim lstAssignToCodes As New List(Of RCodeStructure) + Dim lstAssignToStrings As New List(Of String) clsRemoveFunc.SetRCommand("rm") clsRemoveListFun.SetRCommand("c") @@ -104,7 +101,7 @@ Public Class ucrButtons End If 'Get this list before doing ToScript then no need for global variable name - dctFunctionAssignToValues = clsRsyntax.GetAllAssignTo(New Dictionary(Of RCodeStructure, String)) + clsRsyntax.GetAllAssignTo(lstAssignToCodes, lstAssignToStrings) 'Run additional before codes lstBeforeScripts = clsRsyntax.GetBeforeCodesScripts() @@ -158,27 +155,28 @@ Public Class ucrButtons 'Clear variables from global environment clsRemoveFunc.ClearParameters() - lstAssignTo = dctFunctionAssignToValues.Values.ToList - lstAssignTo.RemoveAll(Function(x) x = frmMain.clsRLink.strInstatDataObject) - If lstAssignTo.Count = 1 Then + 'TODO remove assign to instat object + 'lstAssignToStrings.RemoveAll(Function(x) x = frmMain.clsRLink.strInstatDataObject) + If lstAssignToStrings.Count = 1 Then 'Don't want to remove the Instat Object if it's been assigned - clsRemoveFunc.AddParameter("x1", lstAssignTo(0), bIncludeArgumentName:=False) - - ElseIf lstAssignTo.Count > 1 Then - For i As Integer = 0 To lstAssignTo.Count - 1 - clsRemoveListFun.AddParameter(i, Chr(34) & lstAssignTo(i) & Chr(34), bIncludeArgumentName:=False) + clsRemoveFunc.AddParameter("x1", lstAssignToStrings(0), bIncludeArgumentName:=False) + ElseIf lstAssignToStrings.Count > 1 Then + For i As Integer = 0 To lstAssignToStrings.Count - 1 + clsRemoveListFun.AddParameter(i, Chr(34) & lstAssignToStrings(i) & Chr(34), bIncludeArgumentName:=False) Next clsRemoveFunc.AddParameter("list", clsRFunctionParameter:=clsRemoveListFun) End If If bRun Then - frmMain.clsRLink.RunScript(clsRemoveFunc.ToScript(), iCallType:=0) + If clsRemoveFunc.clsParameters.Count > 0 Then + frmMain.clsRLink.RunScript(clsRemoveFunc.ToScript(), iCallType:=0) + End If Else frmMain.AddToScriptWindow(clsRemoveFunc.ToScript()) End If - For Each clsRCode As RCodeStructure In dctFunctionAssignToValues.Keys - clsRCode.bToBeAssigned = True - clsRCode.strAssignTo = dctFunctionAssignToValues(clsRCode) - clsRCode.bIsAssigned = False + 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 From 0c3b297b53b14ac34ddb4abadc50072f58b8c105 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Sun, 18 Jun 2017 18:35:27 +0300 Subject: [PATCH 061/201] Setting defaults correctly,Changing text in the preview box. --- instat/dlgRegularSequence.vb | 44 ++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index a674604631a..614e44d6ceb 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -35,17 +35,6 @@ Public Class dlgRegularSequence bReset = False End Sub - Private Sub SetRCodeForControls(bReset As Boolean) - bUpdateBy = False - ucrNewColumnName.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) - ucrPnlSequenceType.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) - ucrInputFrom.SetRCode(clsSeqFunction, bReset) - ucrInputTo.SetRCode(clsSeqFunction, bReset) - ucrNudRepeatValues.SetRCode(clsRepFunction, bReset) - ucrInputInStepsOf.SetRCode(clsSeqFunction, bReset) - bUpdateBy = True - End Sub - Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 30 @@ -71,13 +60,13 @@ Public Class dlgRegularSequence ucrPnlSequenceType.AddFunctionNamesCondition(rdoNumeric, {"seq", "rep"}) 'ucrPnlSequenceType.AddFunctionNamesCondition(rdoDates, "as.date") - ucrPnlSequenceType.AddToLinkedControls(ucrInputFrom, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=1) + ucrPnlSequenceType.AddToLinkedControls(ucrInputFrom, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) ucrInputFrom.SetLinkedDisplayControl(lblFrom) - ucrPnlSequenceType.AddToLinkedControls(ucrInputTo, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=ucrSelectDataFrameRegularSequence.iDataFrameLength) + ucrPnlSequenceType.AddToLinkedControls(ucrInputTo, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=ucrSelectDataFrameRegularSequence.iDataFrameLength) ucrInputTo.SetLinkedDisplayControl(lblTo) - ucrPnlSequenceType.AddToLinkedControls(ucrInputInStepsOf, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=1) + ucrPnlSequenceType.AddToLinkedControls(ucrInputInStepsOf, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) ucrInputInStepsOf.SetLinkedDisplayControl(lblInStepsOf) - ucrPnlSequenceType.AddToLinkedControls(ucrNudRepeatValues, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=1) + ucrPnlSequenceType.AddToLinkedControls(ucrNudRepeatValues, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) ucrNudRepeatValues.SetLinkedDisplayControl(lblRepeatValues) 'ucrPnlSequenceType.AddToLinkedControls(dtpSelectorA, {rdoDates}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) 'ucrPnlSequenceType.AddToLinkedControls(dtpSelectorB, {rdoDates}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -92,8 +81,6 @@ Public Class dlgRegularSequence dtpSelectorB.Visible = False dtpSelectorA.Visible = False ucrChkDefineAsFactor.SetText("Define As Factor") - 'ucrInputFrom.Visible = False - ' ucrInputTo.Visible = False CheckSequenceLength() 'Temporarily disabled @@ -108,13 +95,13 @@ Public Class dlgRegularSequence ucrNewColumnName.Reset() clsSeqFunction.SetRCommand("seq") - clsSeqFunction.AddParameter("from", 1) + ' clsSeqFunction.AddParameter("from", 1) clsSeqFunction.AddParameter("to", ucrSelectDataFrameRegularSequence.iDataFrameLength) - clsSeqFunction.AddParameter("by", 1) + ' clsSeqFunction.AddParameter("by", 1) clsRepFunction.SetRCommand("rep") clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsSeqFunction) - clsRepFunction.AddParameter("each", 1) + ' clsRepFunction.AddParameter("each", 1) clsRepFunction.AddParameter("length.out", ucrSelectDataFrameRegularSequence.iDataFrameLength, iPosition:=3) 'clsSeqFunction.SetAssignTo(ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) ucrBase.clsRsyntax.SetAssignTo(strAssignToName:=ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) @@ -122,6 +109,17 @@ Public Class dlgRegularSequence CheckSequenceLength() End Sub + Private Sub SetRCodeForControls(bReset As Boolean) + bUpdateBy = False + ucrNewColumnName.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + ucrPnlSequenceType.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + ucrInputFrom.SetRCode(clsSeqFunction, bReset) + ucrInputTo.SetRCode(clsSeqFunction, bReset) + ucrNudRepeatValues.SetRCode(clsRepFunction, bReset) + ucrInputInStepsOf.SetRCode(clsSeqFunction, bReset) + bUpdateBy = True + End Sub + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() SetRCodeForControls(True) @@ -202,9 +200,11 @@ Public Class dlgRegularSequence vecSequence = frmMain.clsRLink.RunInternalScriptGetValue(strRCommand, bSilent:=True).AsNumeric ucrBase.clsRsyntax.SetAssignTo(strAssignToName:=ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) If iLength < ucrSelectDataFrameRegularSequence.iDataFrameLength Then - txtMessage.Text = "Sequence has been extended by repeating to match the length of the data frame." + txtMessage.Text = "Sequence extended to match +the length of the data frame." ElseIf iLength > ucrSelectDataFrameRegularSequence.iDataFrameLength Then - txtMessage.Text = "Sequence has been truncated to match the length of the data frame." + txtMessage.Text = "Sequence truncated to match +the length of the data frame." End If Else clsRepFunction.RemoveParameterByName("length.out") From 3e3476da872470260bffda0da3b4c6e8dc99ddfd Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sun, 18 Jun 2017 16:59:47 +0100 Subject: [PATCH 062/201] fixed bug in updating control with RSyntax and implemented in one var compare models --- instat/dlgOneVarCompareModels.vb | 25 +++++-------- instat/sdgOneVarCompareModels.vb | 64 +++++++++++++++++++------------- instat/ucrCore.vb | 2 +- 3 files changed, 49 insertions(+), 42 deletions(-) diff --git a/instat/dlgOneVarCompareModels.vb b/instat/dlgOneVarCompareModels.vb index a708bd7b381..96118031c84 100644 --- a/instat/dlgOneVarCompareModels.vb +++ b/instat/dlgOneVarCompareModels.vb @@ -1,4 +1,3 @@ - ' R-Instat ' Copyright (C) 2015 ' @@ -42,14 +41,12 @@ Public Class dlgOneVarCompareModels ucrBase.iHelpTopicID = 174 ucrBase.clsRsyntax.iCallType = 2 - 'ucrSelector - ucrSelectorOneVarCompModels.SetItemType("model") - 'ucrReceiver ucrReceiverCompareModels.SetParameter(New RParameter("f", 0)) ucrReceiverCompareModels.SetParameterIsRFunction() ucrReceiverCompareModels.Selector = ucrSelectorOneVarCompModels ucrReceiverCompareModels.SetMeAsReceiver() + ucrReceiverCompareModels.SetItemType("model") End Sub Private Sub SetDefaults() @@ -66,18 +63,23 @@ Public Class dlgOneVarCompareModels clsGofStat.SetPackageName("fitdistrplus") clsGofStat.SetRCommand("gofstat") + clsGofStat.iCallType = 3 clsCdfcompFunction.SetPackageName("fitdistrplus") clsCdfcompFunction.SetRCommand("cdfcomp") + clsCdfcompFunction.iCallType = 3 clsPpcompFunction.SetPackageName("fitdistrplus") clsPpcompFunction.SetRCommand("ppcomp") + clsPpcompFunction.iCallType = 3 clsQqcompFunction.SetPackageName("fitdistrplus") clsQqcompFunction.SetRCommand("qqcomp") + clsQqcompFunction.iCallType = 3 clsDenscompFunction.SetPackageName("fitdistrplus") clsDenscompFunction.SetRCommand("denscomp") + clsDenscompFunction.iCallType = 3 clsChisqtableOperator.SetOperation("$") clsChisqtableOperator.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) @@ -86,6 +88,7 @@ Public Class dlgOneVarCompareModels clsChisqbreaksOperator.SetOperation("$") clsChisqbreaksOperator.AddParameter(clsRFunctionParameter:=clsGofStat, iPosition:=0) clsChisqbreaksOperator.AddParameter(strParameterValue:="chisqbreaks", iPosition:=1) + clsChisqbreaksOperator.iCallType = 2 clsRAsDataFrame.SetRCommand("as.data.frame") clsRAsDataFrame.AddParameter("x", clsROperatorParameter:=clsChisqtableOperator) @@ -93,6 +96,7 @@ Public Class dlgOneVarCompareModels clsRAsDataFrame.SetAssignTo(ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_ChiSquare", strTempDataframe:=ucrSelectorOneVarCompModels.ucrAvailableDataFrames.cboAvailableDataFrames.Text) ucrBase.clsRsyntax.SetBaseRFunction(clsGofStat) + ucrBase.clsRsyntax.AddToAfterCodes(clsCdfcompFunction, iPosition:=0) bResetSubdialog = True End Sub @@ -122,28 +126,19 @@ Public Class dlgOneVarCompareModels TestOKEnabled() End Sub - Private Sub ucrSelectorOneVarCompModels_DataFrameChanged() Handles ucrSelectorOneVarCompModels.DataFrameChanged - ' sdgOneVarCompareModels.DisplayChiSquare() - End Sub - - Private Sub ucrReceiver_SelectionChanged(ucrChangedControl As ucrCore) Handles ucrReceiverCompareModels.ControlContentsChanged + Private Sub ucrReceiver_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverCompareModels.ControlValueChanged If ucrReceiverCompareModels.IsEmpty Then cmdDisplayObjects.Enabled = False Else cmdDisplayObjects.Enabled = True End If TestOKEnabled() - ' sdgOneVarCompareModels.SetModelFunction(ucrBase.clsRsyntax.clsBaseFunction) End Sub Private Sub cmdDisplayObjects_Click(sender As Object, e As EventArgs) Handles cmdDisplayObjects.Click sdgOneVarCompareModels.SetRCode(ucrBase.clsRsyntax, clsGofStat, clsDenscompFunction, clsCdfcompFunction, clsQqcompFunction, clsPpcompFunction, clsRAsDataFrame, clsChisqtableOperator, clsChisqbreaksOperator, bResetSubdialog) - bResetSubdialog = False sdgOneVarCompareModels.ShowDialog() - End Sub - - Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk - 'sdgOneVarCompareModels.CreateGraphs() + bResetSubdialog = False End Sub End Class diff --git a/instat/sdgOneVarCompareModels.vb b/instat/sdgOneVarCompareModels.vb index faefeeb6ff4..8aa76dabe9b 100644 --- a/instat/sdgOneVarCompareModels.vb +++ b/instat/sdgOneVarCompareModels.vb @@ -20,7 +20,7 @@ Imports instat.Translations Public Class sdgOneVarCompareModels Private bControlsInitialised As Boolean = False Private clsCdfcompFunction, clsDenscompFunction, clsQqcompFunction, clsPpcompFunction, clsListFunction, clsRAsDataFrame, clsModel, clsRGofStat, clsRPlotFunction, clsOperation As New RFunction - Private clsOperatorforTable, clsOperatorForBreaks As New ROperator + Private clsChisqtableOperator, clsChisqbreaksOperator As New ROperator Private clsRSyntax As RSyntax Private Sub sdgOneVarCompareModels(sender As Object, e As EventArgs) Handles MyBase.Load @@ -32,7 +32,7 @@ Public Class sdgOneVarCompareModels InitialiseTabs() 'ucrInputChiSquareBreaks - ucrChkInputChiSquareBreakpoints.SetText("Input Chi-Square Breakpoints") + ucrChkInputChiSquareBreakpoints.SetText("Display Chi-Square Breakpoints") ucrChkCDF.AddRSyntaxContainsFunctionNamesCondition(True, {"cdfcomp"}) ucrChkCDF.AddRSyntaxContainsFunctionNamesCondition(False, {"cdfcomp"}, False) @@ -55,7 +55,10 @@ Public Class sdgOneVarCompareModels ucrSaveGOF.SetCheckBoxText("Save Fit") ucrSaveGOF.SetIsComboBox() ucrSaveGOF.SetAssignToIfUncheckedValue("last_model") - ' ucrSaveGOF.SetSaveTypeAsModel() ' or graph? + ucrSaveGOF.SetSaveTypeAsModel() + 'temp disabled until working + ucrSaveGOF.Enabled = False + ucrSaveGOF.ucrChkSave.Checked = False 'ucrSaveDisplayChi ' ucrSaveDisplayChi.SetPrefix("ChiSquare") @@ -63,6 +66,8 @@ Public Class sdgOneVarCompareModels ucrSaveDisplayChi.SetCheckBoxText("DisplayChi") ucrSaveDisplayChi.SetIsComboBox() ucrSaveDisplayChi.SetAssignToIfUncheckedValue("last_DataFrame") + 'temp disabled until working + ucrSaveDisplayChi.Enabled = False 'ucrSavePlot ucrSavePlots.Visible = False 'hidden as would need to be able to save up to four graphs @@ -75,32 +80,31 @@ Public Class sdgOneVarCompareModels bControlsInitialised = True End Sub - Public Sub SetRCode(clsNewRSyntax As RSyntax, clsNewRGofStat As RFunction, clsNewDenscompFunction As RFunction, clsNewCdfcompFunction As RFunction, clsNewQqcompFunction As RFunction, clsNewPpcompFunction As RFunction, clsNewclsRAsDataFrame As RFunction, Optional clsNewOperatorforTable As ROperator = Nothing, Optional clsNewOperatorForBreaks As ROperator = Nothing, Optional bReset As Boolean = False) + Public Sub SetRCode(clsNewRSyntax As RSyntax, clsNewRGofStat As RFunction, clsNewDenscompFunction As RFunction, clsNewCdfcompFunction As RFunction, clsNewQqcompFunction As RFunction, clsNewPpcompFunction As RFunction, clsNewclsRAsDataFrame As RFunction, Optional clsNewChisqtableOperator As ROperator = Nothing, Optional clsNewChisqbreaksOperator As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If + clsRSyntax = clsNewRSyntax clsRGofStat = clsNewRGofStat - clsOperatorforTable = clsNewOperatorforTable + clsChisqtableOperator = clsNewChisqtableOperator + clsChisqbreaksOperator = clsNewChisqbreaksOperator + clsRAsDataFrame = clsNewclsRAsDataFrame clsDenscompFunction = clsNewDenscompFunction clsCdfcompFunction = clsNewCdfcompFunction clsQqcompFunction = clsNewQqcompFunction clsPpcompFunction = clsNewPpcompFunction - clsOperatorForBreaks = clsNewOperatorForBreaks - 'Setting Rcode for the sub dialog - ucrSaveGOF.SetRCode(clsRGofStat, bReset) - ucrChkCDF.SetRSyntax(clsRSyntax, bReset) + 'ucrSaveGOF.SetRCode(clsRGofStat, bReset) + 'ucrSaveDisplayChi.SetRCode(clsRAsDataFrame, bReset) ucrChkDensity.SetRSyntax(clsRSyntax, bReset) ucrChkPP.SetRSyntax(clsRSyntax, bReset) ucrChkQQ.SetRSyntax(clsRSyntax, bReset) ucrChkCDF.SetRSyntax(clsRSyntax, bReset) - ucrChkInputChiSquareBreakpoints.SetRCode(clsOperatorForBreaks, bReset) - - ucrSaveDisplayChi.SetRCode(clsRAsDataFrame, bReset) + ucrChkInputChiSquareBreakpoints.SetRSyntax(clsRSyntax, bReset) If bReset Then tbpOneVarCompareModels.SelectedIndex = 0 @@ -136,21 +140,21 @@ Public Class sdgOneVarCompareModels ' frmMain.clsRLink.RunScript(clsDenscompFunction.ToScript(), 3) 'End If - If ucrSaveDisplayChi.IsComplete Then - clsOperatorforTable.SetOperation("$") - clsOperatorforTable.AddParameter(clsRFunctionParameter:=clsRGofStat, iPosition:=0) - clsOperatorforTable.AddParameter(strParameterValue:="chisqtable") + 'If ucrSaveDisplayChi.IsComplete Then + ' clsChisqtableOperator.SetOperation("$") + ' clsChisqtableOperator.AddParameter(clsRFunctionParameter:=clsRGofStat, iPosition:=0) + ' clsChisqtableOperator.AddParameter(strParameterValue:="chisqtable") - frmMain.clsRLink.RunScript(clsOperatorforTable.ToScript(), 0) - clsRAsDataFrame.ToScript(strTemp) - frmMain.clsRLink.RunScript(strTemp, 0) - End If - If ucrChkInputChiSquareBreakpoints.Checked Then - clsOperatorForBreaks.SetOperation("$") - clsOperatorForBreaks.AddParameter(iPosition:=0, clsRFunctionParameter:=clsRGofStat) - clsOperatorForBreaks.AddParameter(strParameterValue:="chisqbreaks") - frmMain.clsRLink.RunScript(clsOperatorForBreaks.ToScript(), 2) - End If + ' frmMain.clsRLink.RunScript(clsChisqtableOperator.ToScript(), 0) + ' clsRAsDataFrame.ToScript(strTemp) + ' frmMain.clsRLink.RunScript(strTemp, 0) + 'End If + 'If ucrChkInputChiSquareBreakpoints.Checked Then + ' clsChisqbreaksOperator.SetOperation("$") + ' clsChisqbreaksOperator.AddParameter(iPosition:=0, clsRFunctionParameter:=clsRGofStat) + ' clsChisqbreaksOperator.AddParameter(strParameterValue:="chisqbreaks") + ' frmMain.clsRLink.RunScript(clsChisqbreaksOperator.ToScript(), 2) + 'End If End Sub @@ -192,6 +196,14 @@ Public Class sdgOneVarCompareModels clsRSyntax.RemoveFromAfterCodes(clsDenscompFunction) End If End Sub + + Private Sub ucrChkInputChiSquareBreakpoints_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkInputChiSquareBreakpoints.ControlValueChanged + If ucrChkInputChiSquareBreakpoints.Checked Then + clsRSyntax.AddToAfterCodes(clsChisqbreaksOperator, iPosition:=4) + Else + clsRSyntax.RemoveFromAfterCodes(clsChisqbreaksOperator) + End If + End Sub End Class diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index 985c5d6869e..9c073f826c9 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -144,7 +144,7 @@ Public Class ucrCore If bIsActiveRControl Then 'If the default state is set then the linked control will set the value for this control If objDefaultState Is Nothing Then - If clsRCode IsNot Nothing Then + If clsRCode IsNot Nothing OrElse clsRSyntax IsNot Nothing Then For Each kvpTemp As KeyValuePair(Of Object, List(Of Condition)) In dctConditions If kvpTemp.Value.Count > 0 Then If AllConditionsSatisfied(kvpTemp.Value, clsRCode, clsParameter, clsRSyntax) Then From 1a9438c835391b06e88cb592e4c2152116247964 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Sun, 18 Jun 2017 19:48:43 +0300 Subject: [PATCH 063/201] Sorting out reseting of the contros. --- instat/dlgRegularSequence.vb | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index 614e44d6ceb..3b2ee024e90 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -60,13 +60,13 @@ Public Class dlgRegularSequence ucrPnlSequenceType.AddFunctionNamesCondition(rdoNumeric, {"seq", "rep"}) 'ucrPnlSequenceType.AddFunctionNamesCondition(rdoDates, "as.date") - ucrPnlSequenceType.AddToLinkedControls(ucrInputFrom, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) + ucrPnlSequenceType.AddToLinkedControls(ucrInputFrom, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrInputFrom.SetLinkedDisplayControl(lblFrom) - ucrPnlSequenceType.AddToLinkedControls(ucrInputTo, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=ucrSelectDataFrameRegularSequence.iDataFrameLength) + ucrPnlSequenceType.AddToLinkedControls(ucrInputTo, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrInputTo.SetLinkedDisplayControl(lblTo) - ucrPnlSequenceType.AddToLinkedControls(ucrInputInStepsOf, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) + ucrPnlSequenceType.AddToLinkedControls(ucrInputInStepsOf, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrInputInStepsOf.SetLinkedDisplayControl(lblInStepsOf) - ucrPnlSequenceType.AddToLinkedControls(ucrNudRepeatValues, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) + ucrPnlSequenceType.AddToLinkedControls(ucrNudRepeatValues, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudRepeatValues.SetLinkedDisplayControl(lblRepeatValues) 'ucrPnlSequenceType.AddToLinkedControls(dtpSelectorA, {rdoDates}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) 'ucrPnlSequenceType.AddToLinkedControls(dtpSelectorB, {rdoDates}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -95,13 +95,13 @@ Public Class dlgRegularSequence ucrNewColumnName.Reset() clsSeqFunction.SetRCommand("seq") - ' clsSeqFunction.AddParameter("from", 1) + clsSeqFunction.AddParameter("from", 1) clsSeqFunction.AddParameter("to", ucrSelectDataFrameRegularSequence.iDataFrameLength) - ' clsSeqFunction.AddParameter("by", 1) + clsSeqFunction.AddParameter("by", 1) clsRepFunction.SetRCommand("rep") clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsSeqFunction) - ' clsRepFunction.AddParameter("each", 1) + clsRepFunction.AddParameter("each", 1) clsRepFunction.AddParameter("length.out", ucrSelectDataFrameRegularSequence.iDataFrameLength, iPosition:=3) 'clsSeqFunction.SetAssignTo(ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) ucrBase.clsRsyntax.SetAssignTo(strAssignToName:=ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) @@ -200,11 +200,9 @@ Public Class dlgRegularSequence vecSequence = frmMain.clsRLink.RunInternalScriptGetValue(strRCommand, bSilent:=True).AsNumeric ucrBase.clsRsyntax.SetAssignTo(strAssignToName:=ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) If iLength < ucrSelectDataFrameRegularSequence.iDataFrameLength Then - txtMessage.Text = "Sequence extended to match -the length of the data frame." + txtMessage.Text = "Sequence extended to match the length of the data frame." ElseIf iLength > ucrSelectDataFrameRegularSequence.iDataFrameLength Then - txtMessage.Text = "Sequence truncated to match -the length of the data frame." + txtMessage.Text = "Sequence truncated to match the length of the data frame." End If Else clsRepFunction.RemoveParameterByName("length.out") From 4ce630d830ccf0a97c139d1e739042989e6f44e8 Mon Sep 17 00:00:00 2001 From: shadrack kibet Date: Sun, 18 Jun 2017 20:40:33 +0300 Subject: [PATCH 064/201] panel reset on reopen fix --- instat/dlgDeleteRowsOrColums.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/dlgDeleteRowsOrColums.vb b/instat/dlgDeleteRowsOrColums.vb index a36d7d3715d..412e8a55a92 100644 --- a/instat/dlgDeleteRowsOrColums.vb +++ b/instat/dlgDeleteRowsOrColums.vb @@ -89,7 +89,7 @@ Public Class dlgDeleteRowsOrColums Private Sub SetRCodeForControls(bReset As Boolean) ucrSelectorForDeleteColumns.AddAdditionalCodeParameterPair(clsDeleteColumns, ucrSelectorForDeleteColumns.GetParameter, iAdditionalPairNo:=1) - ucrPnlColumnsOrRows.SetRCode(clsDeleteColumns) + ucrPnlColumnsOrRows.SetRCode(ucrBase.clsRsyntax.clsBaseFunction) ucrReceiverForColumnsToDelete.SetRCode(clsDeleteColumns) ucrSelectorForDeleteColumns.SetRCode(clsDeleteRows) ucrNudTo.SetRCode(clsOperatorRowNames, bReset) From d7fe18dbfe75bb08548ad8d565cc960bd7f821d6 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sun, 18 Jun 2017 20:31:18 +0100 Subject: [PATCH 065/201] added column number limit in grid --- instat/clsGridLink.vb | 12 ++++-- instat/static/InstatObject/R/data_object_R6.R | 42 +++++++++++++------ .../static/InstatObject/R/instat_object_R6.R | 19 +++++---- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/instat/clsGridLink.vb b/instat/clsGridLink.vb index 51f83c1e5e1..dbd95dab72f 100644 --- a/instat/clsGridLink.vb +++ b/instat/clsGridLink.vb @@ -78,6 +78,8 @@ Public Class clsGridLink clsGetDataFrame.AddParameter("convert_to_character", "TRUE") clsGetDataFrame.AddParameter("include_hidden_columns", "FALSE") clsGetDataFrame.AddParameter("use_current_filter", "TRUE") + clsGetDataFrame.AddParameter("max_cols", "30") + clsGetDataFrame.AddParameter("max_rows", iMaxRows) clsFilterApplied.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$filter_applied") clsSetDataFramesChanged.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$set_data_frames_changed") clsGetVariablesMetadata.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_variables_metadata") @@ -317,6 +319,7 @@ Public Class clsGridLink clsGetColumnNames.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_column_names") clsGetColumnNames.AddParameter("data_name", Chr(34) & strName & Chr(34)) clsGetColumnNames.AddParameter("include", "list(Is_Hidden = FALSE)") + clsGetColumnNames.AddParameter("max_no", "30") If bInstatObjectDataFrame AndAlso frmMain.clsRLink.bInstatObjectExists Then expColNames = frmMain.clsRLink.RunInternalScriptGetValue(clsGetColumnNames.ToScript()) If expColNames IsNot Nothing AndAlso expColNames.Type <> Internals.SymbolicExpressionType.Null Then @@ -328,10 +331,13 @@ Public Class clsGridLink If bInstatObjectDataFrame AndAlso frmMain.clsRLink.bInstatObjectExists AndAlso bIncludeDataTypes Then If bInstatObjectDataFrame AndAlso frmMain.clsRLink.bInstatObjectExists Then - clsGetVarMetaFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_variables_metadata") + 'clsGetVarMetaFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_variables_metadata") + 'clsGetVarMetaFunc.AddParameter("data_name", Chr(34) & strName & Chr(34)) + 'clsGetVarMetaFunc.AddParameter("property", "data_type_label") + 'clsGetVarMetaFunc.AddParameter("column", strCurrColNames) + clsGetVarMetaFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_column_data_types") clsGetVarMetaFunc.AddParameter("data_name", Chr(34) & strName & Chr(34)) - clsGetVarMetaFunc.AddParameter("property", "data_type_label") - clsGetVarMetaFunc.AddParameter("column", strCurrColNames) + clsGetVarMetaFunc.AddParameter("columns", strCurrColNames) Else clsGetVarMetaFunc.SetRCommand("sapply") clsGetVarMetaFunc.AddParameter("X", strName) diff --git a/instat/static/InstatObject/R/data_object_R6.R b/instat/static/InstatObject/R/data_object_R6.R index 72b523af9d2..24e985796a0 100644 --- a/instat/static/InstatObject/R/data_object_R6.R +++ b/instat/static/InstatObject/R/data_object_R6.R @@ -8,7 +8,6 @@ data_object <- R6::R6Class("data_object", start_point=1, filters = list(), objects = list(), calculations = list(), keys = list(), keep_attributes = TRUE) { - # Set up the data object self$set_data(data, messages) self$set_changes(list()) @@ -237,7 +236,7 @@ data_object$set("public", "set_metadata_changed", function(new_val) { } ) -data_object$set("public", "get_data_frame", function(convert_to_character = FALSE, include_hidden_columns = TRUE, use_current_filter = TRUE, filter_name = "", stack_data = FALSE, remove_attr = FALSE, retain_attr = FALSE, ...) { +data_object$set("public", "get_data_frame", function(convert_to_character = FALSE, include_hidden_columns = TRUE, use_current_filter = TRUE, filter_name = "", stack_data = FALSE, remove_attr = FALSE, retain_attr = FALSE, max_cols, max_rows, ...) { if(!stack_data) { if(!include_hidden_columns && self$is_variables_metadata(is_hidden_label)) { hidden <- self$get_variables_metadata(property = is_hidden_label) @@ -277,7 +276,8 @@ data_object$set("public", "get_data_frame", function(convert_to_character = FALS } } } - + if(!missing(max_cols) && max_cols < ncol(out)) out <- out[1:max_cols] + if(!missing(max_rows) && max_rows < nrow(out)) out <- out[1:max_rows, ] if(convert_to_character) { decimal_places = self$get_variables_metadata(property = signif_figures_label, column = names(out), error_if_no_property = FALSE) decimal_places[is.na(decimal_places)] <- 0 @@ -311,8 +311,15 @@ data_object$set("public", "get_variables_metadata", function(data_type = "all", else { out <- list() #curr_data <- self$get_data_frame(use_current_filter = FALSE) - curr_data <- private$data - for(i in seq_along(names(curr_data))) { + if(missing(column)) { + curr_data <- private$data + cols <- names(curr_data) + } + else { + cols <- column + curr_data <- private$data[ ,column] + } + for(i in seq_along(cols)) { col <- curr_data[[i]] ind <- which(names(attributes(col)) == "levels") if(length(ind) > 0) col_attributes <- attributes(col)[-ind] @@ -345,7 +352,7 @@ data_object$set("public", "get_variables_metadata", function(data_type = "all", if(all(c(name_label, label_label) %in% names(out))) out <- out[ ,c(c(name_label, label_label), setdiff(names(out), c(name_label, label_label)))] else if(name_label %in% names(out)) out <- out[ ,c(name_label, setdiff(names(out), name_label))] #row.names(out) <- self$get_column_names() - row.names(out) <- names(private$data) + row.names(out) <- cols if(data_type != "all") { if(data_type == "numeric") { out <- out[out[[data_type_label]] %in% c("numeric", "integer"), ] @@ -380,6 +387,12 @@ data_object$set("public", "get_variables_metadata", function(data_type = "all", } ) +data_object$set("public", "get_column_data_types", function(columns) { + if(missing(columns)) return(as.vector(sapply(private$data, class))) + else return(as.vector(sapply(private$data[columns], class, USE.NAMES = FALSE))) +} +) + data_object$set("public", "clear_variables_metadata", function() { for(column in self$get_data_frame(use_current_filter = FALSE)) { for(name in names(attributes(column))) { @@ -510,7 +523,8 @@ data_object$set("public", "add_columns_to_data", function(col_name = "", col_dat #A bug in sjPlot requires removing labels when a factor column already has labels, using remove_labels for this if needed. data_object$set("public", "get_columns_from_data", function(col_names, force_as_data_frame = FALSE, use_current_filter = TRUE, remove_labels = FALSE) { if(missing(col_names)) stop("no col_names to return") - if(!all(col_names %in% self$get_column_names())) stop("Not all column names were found in data") + #if(!all(col_names %in% self$get_column_names())) stop("Not all column names were found in data") + if(!all(col_names %in% names(private$data))) stop("Not all column names were found in data") if(length(col_names)==1) { if(force_as_data_frame) { @@ -769,7 +783,6 @@ data_object$set("public", "replace_value_in_data", function(col_names, rows, old ) data_object$set("public", "append_to_metadata", function(property, new_value = "") { - if(missing(property)) stop("property must be specified.") if (!is.character(property)) stop("property must be of type: character") @@ -784,7 +797,8 @@ data_object$set("public", "append_to_variables_metadata", function(col_names, pr if(missing(property)) stop("property must be specified.") if(!is.character(property)) stop("property must be a character") if(!missing(col_names)) { - if(!all(col_names %in% self$get_column_names())) stop("Not all of ", paste(col_names, collapse = ","), " found in data.") + #if(!all(col_names %in% self$get_column_names())) stop("Not all of ", paste(col_names, collapse = ","), " found in data.") + if(!all(col_names %in% names(private$data))) stop("Not all of ", paste(col_names, collapse = ","), " found in data.") for(curr_col in col_names) { attr(private$data[[curr_col]], property) <- new_val self$append_to_changes(list(Added_variables_metadata, curr_col, property)) @@ -1224,7 +1238,7 @@ data_object$set("public", "get_column_count", function(col_name, new_level_names } ) -data_object$set("public", "get_column_names", function(as_list = FALSE, include = list(), exclude = list(), excluded_items = c()) { +data_object$set("public", "get_column_names", function(as_list = FALSE, include = list(), exclude = list(), excluded_items = c(), max_no) { if(length(include) == 0 && length(exclude) == 0) out <- names(private$data) else { if(data_type_label %in% names(include) && "numeric" %in% include[[data_type_label]]) { @@ -1233,13 +1247,14 @@ data_object$set("public", "get_column_names", function(as_list = FALSE, include if(data_type_label %in% names(exclude) && "numeric" %in% exclude[[data_type_label]]) { exclude[[data_type_label]] = c(exclude[[data_type_label]], "integer") } - col_names <- self$get_column_names() + #col_names <- self$get_column_names() + col_names <- names(private$data) out = c() i = 1 for(col in col_names) { if(length(include) > 0 || length(exclude) > 0) { curr_var_metadata <- self$get_variables_metadata(column = col, direct_from_attributes = TRUE) - if(!data_type_label %in% names(curr_var_metadata)) curr_var_metadata[[data_type_label]] <- class(self$get_columns_from_data(col_names = col)) + if(!data_type_label %in% names(curr_var_metadata)) curr_var_metadata[[data_type_label]] <- class(private$data[[col]]) #TODO this is a temp compatibility solution for how the class of ordered factor used to be shown when getting metadata if(length(curr_var_metadata[[data_type_label]]) == 2 && all(curr_var_metadata[[data_type_label]] %in% c("ordered", "factor"))) curr_var_metadata[[data_type_label]] <- "ordered,factor" if(all(c(names(include), names(exclude)) %in% names(curr_var_metadata)) && all(sapply(names(include), function(prop) curr_var_metadata[[prop]] %in% include[[prop]])) @@ -1250,6 +1265,7 @@ data_object$set("public", "get_column_names", function(as_list = FALSE, include else out <- c(out, col) i = i + 1 } + if(!missing(max_no) && max_no < length(out)) out <- out[1:max_no] } if(length(excluded_items) > 0) { ex_ind = which(out %in% excluded_items) @@ -1268,7 +1284,7 @@ data_object$set("public", "get_column_names", function(as_list = FALSE, include #TODO: Are there other types needed here? data_object$set("public", "get_data_type", function(col_name = "") { if(!(col_name %in% self$get_column_names())) { - stop(paste(col_name, "is not a column in", get_metadata(data_name_label))) + stop(paste(col_name, "is not a column in", self$get_metadata(data_name_label))) } type = "" curr_col <- self$get_columns_from_data(col_name, use_current_filter = FALSE) diff --git a/instat/static/InstatObject/R/instat_object_R6.R b/instat/static/InstatObject/R/instat_object_R6.R index d775820cfbb..688da407aca 100644 --- a/instat/static/InstatObject/R/instat_object_R6.R +++ b/instat/static/InstatObject/R/instat_object_R6.R @@ -209,7 +209,7 @@ instat_object$set("public", "append_data_object", function(name, obj) { stop("obj must be a data object") } obj$append_to_metadata(data_name_label, name) - private$.data_objects[[name]] <- obj + private$.data_objects[[name]] <- obj } ) @@ -230,17 +230,17 @@ instat_object$set("public", "get_data_objects", function(data_name, as_list = FA } ) -instat_object$set("public", "get_data_frame", function(data_name, convert_to_character = FALSE, stack_data = FALSE, include_hidden_columns = TRUE, use_current_filter = TRUE, filter_name = "", remove_attr = FALSE, retain_attr = FALSE, ...) { +instat_object$set("public", "get_data_frame", function(data_name, convert_to_character = FALSE, stack_data = FALSE, include_hidden_columns = TRUE, use_current_filter = TRUE, filter_name = "", remove_attr = FALSE, retain_attr = FALSE, max_cols, max_rows, ...) { if(!stack_data) { if(missing(data_name)) data_name <- self$get_data_names() if(length(data_name) > 1) { retlist <- list() for (curr_name in data_name) { - retlist[[curr_name]] = self$get_data_objects(curr_name)$get_data_frame(convert_to_character = convert_to_character, include_hidden_columns = include_hidden_columns, use_current_filter = use_current_filter, filter_name = filter_name, remove_attr = remove_attr, retain_attr = retain_attr) + retlist[[curr_name]] = self$get_data_objects(curr_name)$get_data_frame(convert_to_character = convert_to_character, include_hidden_columns = include_hidden_columns, use_current_filter = use_current_filter, filter_name = filter_name, remove_attr = remove_attr, retain_attr = retain_attr, max_cols = max_cols, max_rows = max_rows) } return(retlist) } - else return(self$get_data_objects(data_name)$get_data_frame(convert_to_character = convert_to_character, include_hidden_columns = include_hidden_columns, use_current_filter = use_current_filter, filter_name = filter_name, remove_attr = remove_attr, retain_attr = retain_attr)) + else return(self$get_data_objects(data_name)$get_data_frame(convert_to_character = convert_to_character, include_hidden_columns = include_hidden_columns, use_current_filter = use_current_filter, filter_name = filter_name, remove_attr = remove_attr, retain_attr = retain_attr, max_cols = max_cols, max_rows = max_rows)) } else { if(missing(data_name)) stop("data to be stacked is missing") @@ -262,6 +262,11 @@ instat_object$set("public", "get_variables_metadata", function(data_name, data_t } ) +instat_object$set("public", "get_column_data_types", function(data_name, columns) { + return(self$get_data_objects(data_name)$get_column_data_types(columns = columns)) +} +) + instat_object$set("public", "get_combined_metadata", function(convert_to_character = FALSE) { retlist <- data.frame() i = 1 @@ -682,13 +687,13 @@ instat_object$set("public", "get_next_default_column_name", function(data_name, } ) -instat_object$set("public", "get_column_names", function(data_name, as_list = FALSE, include = list(), exclude = list(), excluded_items = c()) { +instat_object$set("public", "get_column_names", function(data_name, as_list = FALSE, include = list(), exclude = list(), excluded_items = c(), max_no) { if(missing(data_name)) { #TODO what to do with excluded items in this case? - return(lapply(self$get_data_objects(), function(x) x$get_column_names(include = include, exclude = exclude))) + return(lapply(self$get_data_objects(), function(x) x$get_column_names(include = include, exclude = exclude, max_no = max_no))) } else { - return(self$get_data_objects(data_name)$get_column_names(as_list, include, exclude, excluded_items = excluded_items)) + return(self$get_data_objects(data_name)$get_column_names(as_list, include, exclude, excluded_items = excluded_items, max_no = max_no)) } } ) From 1f8be4ac9b5bc942915de3a17376a54ea5179d7c Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Mon, 19 Jun 2017 09:35:13 +0300 Subject: [PATCH 066/201] Minor fixes --- instat/dlgRegularSequence.vb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index 3b2ee024e90..0940473584c 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -48,7 +48,7 @@ Public Class dlgRegularSequence ucrInputInStepsOf.SetParameter(New RParameter("by", 2)) ucrInputInStepsOf.AddQuotesIfUnrecognised = False - ucrInputInStepsOf.SetValidationTypeAsNumeric(dcmMin:=0) + ucrInputInStepsOf.SetValidationTypeAsNumeric(dcmMin:=1) ucrNudRepeatValues.SetParameter(New RParameter("each", 1)) ucrNudRepeatValues.SetMinMax(1, Integer.MaxValue) @@ -116,7 +116,9 @@ Public Class dlgRegularSequence ucrInputFrom.SetRCode(clsSeqFunction, bReset) ucrInputTo.SetRCode(clsSeqFunction, bReset) ucrNudRepeatValues.SetRCode(clsRepFunction, bReset) - ucrInputInStepsOf.SetRCode(clsSeqFunction, bReset) + If bReset AndAlso (ucrInputFrom.GetText < ucrInputTo.GetText) Then + ucrInputInStepsOf.SetRCode(clsSeqFunction, bReset) + End If bUpdateBy = True End Sub From 7b66569905bb1b807ac892b272bd6262b077333f Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Mon, 19 Jun 2017 09:56:16 +0300 Subject: [PATCH 067/201] Adding selector headers for graphics dialogs --- instat/dlgBarAndPieChart.vb | 2 ++ instat/dlgBoxPlot.vb | 3 +++ instat/dlgCumulativeDistribution.vb | 2 ++ instat/dlgDotPlot.vb | 3 +++ instat/dlgHistogram.vb | 2 ++ instat/dlgLinePlot.vb | 9 ++++++--- instat/dlgRugPlot.vb | 3 +++ instat/dlgScatterPlot.vb | 3 +++ instat/sdgPlots.vb | 2 ++ 9 files changed, 26 insertions(+), 3 deletions(-) diff --git a/instat/dlgBarAndPieChart.vb b/instat/dlgBarAndPieChart.vb index e1e5b979b8b..3c2047b6bef 100644 --- a/instat/dlgBarAndPieChart.vb +++ b/instat/dlgBarAndPieChart.vb @@ -98,12 +98,14 @@ Public Class dlgBarAndPieChart ucrFactorReceiver.Selector = ucrBarChartSelector ucrFactorReceiver.SetIncludedDataTypes({"factor"}) + ucrFactorReceiver.strSelectorHeading = "Factors" ucrFactorReceiver.SetParameter(New RParameter("x", 0)) ucrFactorReceiver.bWithQuotes = False ucrFactorReceiver.SetParameterIsString() ucrSecondReceiver.Selector = ucrBarChartSelector ucrSecondReceiver.SetIncludedDataTypes({"factor"}) + ucrSecondReceiver.strSelectorHeading = "Factors" ucrSecondReceiver.SetParameter(New RParameter("fill", 1)) ucrSecondReceiver.bWithQuotes = False ucrSecondReceiver.SetParameterIsString() diff --git a/instat/dlgBoxPlot.vb b/instat/dlgBoxPlot.vb index 5bc962618f0..3e39d524c9f 100644 --- a/instat/dlgBoxPlot.vb +++ b/instat/dlgBoxPlot.vb @@ -76,12 +76,14 @@ Public Class dlgBoxplot ucrVariablesAsFactorForBoxplot.SetFactorReceiver(ucrByFactorsReceiver) ucrVariablesAsFactorForBoxplot.Selector = ucrSelectorBoxPlot ucrVariablesAsFactorForBoxplot.SetIncludedDataTypes({"numeric"}) + ucrVariablesAsFactorForBoxplot.strSelectorHeading = "Numerics" ucrVariablesAsFactorForBoxplot.SetParameterIsString() ucrVariablesAsFactorForBoxplot.bWithQuotes = False ucrByFactorsReceiver.SetParameter(New RParameter("x", 1)) ucrByFactorsReceiver.Selector = ucrSelectorBoxPlot ucrByFactorsReceiver.SetIncludedDataTypes({"factor"}) + ucrByFactorsReceiver.strSelectorHeading = "Factors" ucrByFactorsReceiver.SetParameterIsString() ucrByFactorsReceiver.bWithQuotes = False ucrByFactorsReceiver.SetValuesToIgnore({Chr(34) & Chr(34)}) @@ -90,6 +92,7 @@ Public Class dlgBoxplot ucrSecondFactorReceiver.SetParameter(New RParameter("fill", 2)) ucrSecondFactorReceiver.Selector = ucrSelectorBoxPlot ucrSecondFactorReceiver.SetIncludedDataTypes({"factor"}) + ucrSecondFactorReceiver.strSelectorHeading = "Factors" ucrSecondFactorReceiver.SetParameterIsString() ucrSecondFactorReceiver.bWithQuotes = False diff --git a/instat/dlgCumulativeDistribution.vb b/instat/dlgCumulativeDistribution.vb index 31b84f96e80..f28edd11f3f 100644 --- a/instat/dlgCumulativeDistribution.vb +++ b/instat/dlgCumulativeDistribution.vb @@ -63,6 +63,7 @@ Public Class dlgCumulativeDistribution ucrFactorReceiver.SetParameter(New RParameter("colour", 1)) ucrFactorReceiver.Selector = ucrCumDistSelector ucrFactorReceiver.SetIncludedDataTypes({"factor"}) + ucrFactorReceiver.strSelectorHeading = "Factors" ucrFactorReceiver.SetParameterIsString() ucrFactorReceiver.bWithQuotes = False @@ -70,6 +71,7 @@ Public Class dlgCumulativeDistribution ucrVariablesAsFactorforCumDist.SetFactorReceiver(ucrFactorReceiver) ucrVariablesAsFactorforCumDist.Selector = ucrCumDistSelector ucrVariablesAsFactorforCumDist.SetIncludedDataTypes({"numeric"}) + ucrVariablesAsFactorforCumDist.strSelectorHeading = "Numerics" ucrVariablesAsFactorforCumDist.SetParameterIsString() ucrVariablesAsFactorforCumDist.bWithQuotes = False diff --git a/instat/dlgDotPlot.vb b/instat/dlgDotPlot.vb index 60d560b17f7..ef2297cf297 100644 --- a/instat/dlgDotPlot.vb +++ b/instat/dlgDotPlot.vb @@ -81,6 +81,7 @@ Public Class dlgDotPlot ucrOtherAxisReceiver.SetParameterIsString() ucrOtherAxisReceiver.Selector = ucrDotPlotSelector ucrOtherAxisReceiver.SetIncludedDataTypes({"factor", "numeric"}) 'Warning: Even if having "factor" only could be more appropriate for the Axis that is not BinAxis, when coming back from the LayerOptions, where x and y can take both numeric and factor values, we would get bugs if numeric was not allowed. + ucrOtherAxisReceiver.strSelectorHeading = "Variables" ucrOtherAxisReceiver.bWithQuotes = False ucrOtherAxisReceiver.SetValuesToIgnore({Chr(34) & Chr(34)}) ucrOtherAxisReceiver.bAddParameterIfEmpty = True @@ -88,6 +89,7 @@ Public Class dlgDotPlot ucrFactorReceiver.SetParameter(New RParameter("fill", 2)) ucrFactorReceiver.Selector = ucrDotPlotSelector ucrFactorReceiver.SetIncludedDataTypes({"factor"}) + ucrFactorReceiver.strSelectorHeading = "Factors" ucrFactorReceiver.bWithQuotes = False ucrFactorReceiver.SetParameterIsString() @@ -97,6 +99,7 @@ Public Class dlgDotPlot ucrVariablesAsFactorDotPlot.SetFactorReceiver(ucrOtherAxisReceiver) 'Could choose the ucrFactorReceiver for this purpose... ucrVariablesAsFactorDotPlot.Selector = ucrDotPlotSelector ucrVariablesAsFactorDotPlot.SetIncludedDataTypes({"numeric", "factor"}) + ucrVariablesAsFactorDotPlot.strSelectorHeading = "Variables" ucrVariablesAsFactorDotPlot.bWithQuotes = False ucrVariablesAsFactorDotPlot.SetParameterIsString() diff --git a/instat/dlgHistogram.vb b/instat/dlgHistogram.vb index f4a09c7a87a..fdeea414623 100644 --- a/instat/dlgHistogram.vb +++ b/instat/dlgHistogram.vb @@ -72,6 +72,7 @@ Public Class dlgHistogram ucrFactorReceiver.SetParameter(New RParameter("fill", 1)) ucrFactorReceiver.Selector = ucrHistogramSelector ucrFactorReceiver.SetIncludedDataTypes({"factor"}) + ucrFactorReceiver.strSelectorHeading = "Factors" 'can put in colour for density and polygon but fill for Histogram ucrFactorReceiver.bWithQuotes = False ucrFactorReceiver.SetParameterIsString() @@ -80,6 +81,7 @@ Public Class dlgHistogram ucrVariablesAsFactorforHist.SetFactorReceiver(ucrFactorReceiver) ucrVariablesAsFactorforHist.Selector = ucrHistogramSelector ucrVariablesAsFactorforHist.SetIncludedDataTypes({"numeric"}) + ucrVariablesAsFactorforHist.strSelectorHeading = "Numerics" ucrVariablesAsFactorforHist.bWithQuotes = False ucrVariablesAsFactorforHist.SetParameterIsString() diff --git a/instat/dlgLinePlot.vb b/instat/dlgLinePlot.vb index d3a37881269..9b84d8f5d2a 100644 --- a/instat/dlgLinePlot.vb +++ b/instat/dlgLinePlot.vb @@ -62,7 +62,8 @@ Public Class dlgLinePlot ucrReceiverX.SetParameter(New RParameter("x", 0)) ucrReceiverX.Selector = ucrLinePlotSelector - ucrReceiverX.SetIncludedDataTypes({"numeric", "factor"}) + ucrReceiverX.SetIncludedDataTypes({"numeric", "factor"}) + ucrReceiverX.strSelectorHeading = "Variables" ucrReceiverX.bWithQuotes = False ucrReceiverX.SetParameterIsString() ucrReceiverX.SetValuesToIgnore({Chr(34) & Chr(34)}) @@ -70,14 +71,16 @@ Public Class dlgLinePlot ucrFactorOptionalReceiver.SetParameter(New RParameter("colour", 2)) ucrFactorOptionalReceiver.Selector = ucrLinePlotSelector - ucrFactorOptionalReceiver.SetIncludedDataTypes({"factor"}) + ucrFactorOptionalReceiver.SetIncludedDataTypes({"factor"}) + ucrFactorOptionalReceiver.strSelectorHeading = "Factors" ucrFactorOptionalReceiver.bWithQuotes = False ucrFactorOptionalReceiver.SetParameterIsString() ucrVariablesAsFactorForLinePlot.SetParameter(New RParameter("y", 1)) ucrVariablesAsFactorForLinePlot.SetFactorReceiver(ucrFactorOptionalReceiver) ucrVariablesAsFactorForLinePlot.Selector = ucrLinePlotSelector - ucrVariablesAsFactorForLinePlot.SetIncludedDataTypes({"numeric", "factor"}) + ucrVariablesAsFactorForLinePlot.SetIncludedDataTypes({"numeric", "factor"}) + ucrVariablesAsFactorForLinePlot.strSelectorHeading = "Varibles" ucrVariablesAsFactorForLinePlot.SetParameterIsString() ucrVariablesAsFactorForLinePlot.bWithQuotes = False ucrVariablesAsFactorForLinePlot.SetValuesToIgnore({Chr(34) & Chr(34)}) diff --git a/instat/dlgRugPlot.vb b/instat/dlgRugPlot.vb index a3b99462711..fa7e832ee67 100644 --- a/instat/dlgRugPlot.vb +++ b/instat/dlgRugPlot.vb @@ -64,17 +64,20 @@ Public Class dlgRugPlot ucrVariablesAsFactorForRugPlot.SetFactorReceiver(ucrFactorOptionalReceiver) ucrVariablesAsFactorForRugPlot.Selector = ucrRugPlotSelector ucrVariablesAsFactorForRugPlot.SetIncludedDataTypes({"factor", "numeric"}) + ucrVariablesAsFactorForRugPlot.strSelectorHeading = "Variables" ucrVariablesAsFactorForRugPlot.bWithQuotes = False ucrReceiverX.SetParameter(New RParameter("x", 0)) ucrReceiverX.SetParameterIsString() ucrReceiverX.Selector = ucrRugPlotSelector ucrReceiverX.SetIncludedDataTypes({"factor", "numeric"}) + ucrReceiverX.strSelectorHeading = "Variables" ucrReceiverX.bWithQuotes = False ucrFactorOptionalReceiver.SetParameter(New RParameter("colour", 2)) ucrFactorOptionalReceiver.Selector = ucrRugPlotSelector ucrFactorOptionalReceiver.SetIncludedDataTypes({"factor", "numeric"}) + ucrFactorOptionalReceiver.strSelectorHeading = "Variables" ucrFactorOptionalReceiver.bWithQuotes = False ucrFactorOptionalReceiver.SetParameterIsString() diff --git a/instat/dlgScatterPlot.vb b/instat/dlgScatterPlot.vb index e7f9e6e905f..f8134390779 100644 --- a/instat/dlgScatterPlot.vb +++ b/instat/dlgScatterPlot.vb @@ -68,6 +68,7 @@ Public Class dlgScatterPlot ucrVariablesAsFactorForScatter.Selector = ucrSelectorForScatter ucrVariablesAsFactorForScatter.SetFactorReceiver(ucrFactorOptionalReceiver) ucrVariablesAsFactorForScatter.SetIncludedDataTypes({"factor", "numeric"}) + ucrVariablesAsFactorForScatter.strSelectorHeading = "Variables" ucrVariablesAsFactorForScatter.SetValuesToIgnore({Chr(34) & Chr(34)}) ucrVariablesAsFactorForScatter.bAddParameterIfEmpty = True @@ -76,6 +77,7 @@ Public Class dlgScatterPlot ucrReceiverX.bWithQuotes = False ucrReceiverX.Selector = ucrSelectorForScatter ucrReceiverX.SetIncludedDataTypes({"factor", "numeric"}) + ucrReceiverX.strSelectorHeading = "Variables" ucrReceiverX.SetValuesToIgnore({Chr(34) & Chr(34)}) ucrReceiverX.bAddParameterIfEmpty = True @@ -84,6 +86,7 @@ Public Class dlgScatterPlot ucrFactorOptionalReceiver.bWithQuotes = False ucrFactorOptionalReceiver.Selector = ucrSelectorForScatter ucrFactorOptionalReceiver.SetIncludedDataTypes({"factor", "numeric"}) + ucrFactorOptionalReceiver.strSelectorHeading = "Variables" clsGeomSmoothFunc.SetPackageName("ggplot2") clsGeomSmoothFunc.SetRCommand("geom_smooth") diff --git a/instat/sdgPlots.vb b/instat/sdgPlots.vb index 5afd2a29854..a47cb7f8605 100644 --- a/instat/sdgPlots.vb +++ b/instat/sdgPlots.vb @@ -62,6 +62,7 @@ Public Class sdgPlots 'Links the factor receivers, used for creating facets, with the selector. The variables need to be factors. ucr1stFactorReceiver.Selector = ucrFacetSelector ucr1stFactorReceiver.SetIncludedDataTypes({"factor"}) + ucr1stFactorReceiver.strSelectorHeading = "Factors" ucr1stFactorReceiver.SetParameter(New RParameter("var1", 0)) ucr1stFactorReceiver.SetParameterIsString() ucr1stFactorReceiver.bWithQuotes = False @@ -71,6 +72,7 @@ Public Class sdgPlots ucr2ndFactorReceiver.Selector = ucrFacetSelector ucr2ndFactorReceiver.SetIncludedDataTypes({"factor"}) + ucr2ndFactorReceiver.strSelectorHeading = "Factors" ucr2ndFactorReceiver.SetParameter(New RParameter("var2", 1)) ucr2ndFactorReceiver.SetParameterIsString() ucr2ndFactorReceiver.bWithQuotes = False From f0f0b944e18d1d359ee2f20d4e5b8189767a4d1a Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Mon, 19 Jun 2017 10:31:30 +0300 Subject: [PATCH 068/201] Adding more selector for describe menu --- instat/dlgCanonicalCorrelationAnalysis.vb | 2 ++ instat/dlgColumnStats.vb | 2 ++ instat/dlgCorrelation.vb | 3 +++ instat/dlgOneWayFrequencies.vb | 2 ++ instat/dlgPrincipalComponentAnalysis.vb | 1 + instat/dlgRatingScales.vb | 2 ++ instat/dlgSummaryBarOrPieChart.vb | 3 +++ instat/dlgThreeVariableFrequencies.vb | 4 +++- instat/dlgTwoWayFrequencies.vb | 3 +++ instat/dlgWindrose.vb | 3 +++ 10 files changed, 24 insertions(+), 1 deletion(-) diff --git a/instat/dlgCanonicalCorrelationAnalysis.vb b/instat/dlgCanonicalCorrelationAnalysis.vb index 52036a285f3..b775eb83e94 100644 --- a/instat/dlgCanonicalCorrelationAnalysis.vb +++ b/instat/dlgCanonicalCorrelationAnalysis.vb @@ -52,12 +52,14 @@ Public Class dlgCanonicalCorrelationAnalysis ucrReceiverYvariables.SetParameterIsRFunction() ucrReceiverYvariables.Selector = ucrSelectorCCA ucrReceiverYvariables.SetDataType("numeric") + ucrReceiverYvariables.strSelectorHeading = "Numerics" ' X Variable Selector ucrReceiverXvariables.SetParameter(New RParameter("x", 1)) ucrReceiverXvariables.SetParameterIsRFunction() ucrReceiverXvariables.Selector = ucrSelectorCCA ucrReceiverXvariables.SetDataType("numeric") + ucrReceiverXvariables.strSelectorHeading = "Numerics" 'ucrSaveResult ucrSaveResult.SetCheckBoxText("Save Result") diff --git a/instat/dlgColumnStats.vb b/instat/dlgColumnStats.vb index 9cac4636a11..08485eaed46 100644 --- a/instat/dlgColumnStats.vb +++ b/instat/dlgColumnStats.vb @@ -47,11 +47,13 @@ Public Class dlgColumnStats ucrReceiverSelectedVariables.SetParameter(New RParameter("columns_to_summarise", 1)) ucrReceiverSelectedVariables.SetParameterIsString() ucrReceiverSelectedVariables.SetIncludedDataTypes({"numeric"}) + ucrReceiverSelectedVariables.strSelectorHeading = "Numerics" ucrReceiverSelectedVariables.Selector = ucrSelectorForColumnStatistics ucrReceiverByFactor.SetParameter(New RParameter("factors", 2)) ucrReceiverByFactor.Selector = ucrSelectorForColumnStatistics ucrReceiverByFactor.SetIncludedDataTypes({"factor"}) 'This needs to change + ucrReceiverByFactor.strSelectorHeading = "Factors" ucrReceiverByFactor.SetParameterIsString() ucrChkStoreResults.SetParameter(New RParameter("store_results", 3)) diff --git a/instat/dlgCorrelation.vb b/instat/dlgCorrelation.vb index 0a6c71106a6..10750449334 100644 --- a/instat/dlgCorrelation.vb +++ b/instat/dlgCorrelation.vb @@ -35,9 +35,12 @@ Public Class dlgCorrelation ucrReceiverSecondColumn.Selector = ucrSelectorCorrelation ucrReceiverMultipleColumns.Selector = ucrSelectorCorrelation ucrReceiverFirstColumn.SetDataType("numeric") + ucrReceiverFirstColumn.strSelectorHeading = "Numerics" ucrReceiverSecondColumn.SetDataType("numeric") + ucrReceiverSecondColumn.strSelectorHeading = "Numerics" ucrSelectorCorrelation.Focus() ucrReceiverMultipleColumns.SetDataType("numeric") + ucrReceiverMultipleColumns.strSelectorHeading = "Numerics" ucrSaveModel.chkSaveModel.Text = "Result Name" ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False 'TODO: Fix bugs produced when rdoScatterplotMatrix is checked. Disabled for now diff --git a/instat/dlgOneWayFrequencies.vb b/instat/dlgOneWayFrequencies.vb index a8145f2b222..6a0b87526d0 100644 --- a/instat/dlgOneWayFrequencies.vb +++ b/instat/dlgOneWayFrequencies.vb @@ -45,6 +45,7 @@ Public Class dlgOneWayFrequencies ucrReceiverOneWayFreq.SetParameterIsRFunction() ucrReceiverOneWayFreq.bForceAsDataFrame = True ucrReceiverOneWayFreq.Selector = ucrSelectorOneWayFreq + ucrReceiverOneWayFreq.strSelectorHeading = "Variables" 'temp fix to bug in sjPlot ucrReceiverOneWayFreq.bRemoveLabels = True @@ -52,6 +53,7 @@ Public Class dlgOneWayFrequencies ucrReceiverWeights.SetParameterIsRFunction() ucrReceiverWeights.Selector = ucrSelectorOneWayFreq ucrReceiverWeights.SetDataType("numeric") + ucrReceiverWeights.strSelectorHeading = "Numerics" ucrPnlSort.SetParameter(New RParameter("sort.frq", 3)) ucrPnlSort.AddRadioButton(rdoNone, Chr(34) & "none" & Chr(34)) diff --git a/instat/dlgPrincipalComponentAnalysis.vb b/instat/dlgPrincipalComponentAnalysis.vb index 0e5e072619e..d82a020d1ac 100644 --- a/instat/dlgPrincipalComponentAnalysis.vb +++ b/instat/dlgPrincipalComponentAnalysis.vb @@ -37,6 +37,7 @@ Public Class dlgPrincipalComponentAnalysis ucrBasePCA.clsRsyntax.iCallType = 0 ucrReceiverMultiplePCA.Selector = ucrSelectorPCA ucrReceiverMultiplePCA.SetDataType("numeric") + ucrReceiverMultiplePCA.strSelectorHeading = "Numerics" ucrResultName.SetDefaultTypeAsModel() ucrResultName.SetItemsTypeAsModels() ucrResultName.SetValidationTypeAsRVariable() diff --git a/instat/dlgRatingScales.vb b/instat/dlgRatingScales.vb index 42bf54f563d..cecbdb3b367 100644 --- a/instat/dlgRatingScales.vb +++ b/instat/dlgRatingScales.vb @@ -58,11 +58,13 @@ Public Class dlgRatingScales ucrReceiverOrderedFactors.SetParameter(New RParameter("items", 0)) ucrReceiverOrderedFactors.SetParameterIsRFunction() ucrReceiverOrderedFactors.bForceAsDataFrame = True + ucrReceiverOrderedFactors.strSelectorHeading = "Variables" ucrReceiverOrderedFactors.Selector = ucrSelectorRatingScale ucrReceiverWeights.SetParameter(New RParameter("weight.by", 1)) ucrReceiverWeights.SetParameterIsRFunction() ucrReceiverWeights.SetDataType("numeric") + ucrReceiverWeights.strSelectorHeading = "Numerics" ucrReceiverWeights.Selector = ucrSelectorRatingScale 'ucrPnlSortsjp.likert diff --git a/instat/dlgSummaryBarOrPieChart.vb b/instat/dlgSummaryBarOrPieChart.vb index f82a0782d88..570535f2a90 100644 --- a/instat/dlgSummaryBarOrPieChart.vb +++ b/instat/dlgSummaryBarOrPieChart.vb @@ -69,18 +69,21 @@ Public Class dlgSummaryBarOrPieChart ucrYReceiver.SetParameter(New RParameter("y", 1)) ucrYReceiver.Selector = ucrSummaryBarSelector ucrYReceiver.SetIncludedDataTypes({"numeric"}) + ucrYReceiver.strSelectorHeading = "Numerics" ucrYReceiver.bWithQuotes = False ucrYReceiver.SetParameterIsString() ucrFactorReceiver.SetParameter(New RParameter("x", 0)) ucrFactorReceiver.Selector = ucrSummaryBarSelector ucrFactorReceiver.SetIncludedDataTypes({"factor"}) + ucrFactorReceiver.strSelectorHeading = "Factors" ucrFactorReceiver.bWithQuotes = False ucrFactorReceiver.SetParameterIsString() ucrSecondFactorReceiver.SetParameter(New RParameter("fill", 2)) ucrSecondFactorReceiver.Selector = ucrSummaryBarSelector ucrSecondFactorReceiver.SetIncludedDataTypes({"factor"}) + ucrSecondFactorReceiver.strSelectorHeading = "Factors" ucrSecondFactorReceiver.bWithQuotes = False ucrSecondFactorReceiver.SetParameterIsString() diff --git a/instat/dlgThreeVariableFrequencies.vb b/instat/dlgThreeVariableFrequencies.vb index 8d5cbeaa87e..baaf4009f55 100644 --- a/instat/dlgThreeVariableFrequencies.vb +++ b/instat/dlgThreeVariableFrequencies.vb @@ -54,6 +54,7 @@ Public Class dlgThreeVariableFrequencies ucrReceiverColumnFactor.SetParameter(New RParameter("var.col", 2)) ucrReceiverColumnFactor.Selector = ucrSelectorThreeVariableFrequencies ucrReceiverColumnFactor.SetDataType("factor") + ucrReceiverColumnFactor.strSelectorHeading = "Factors" ucrReceiverColumnFactor.SetParameterIsString() ucrReceiverColumnFactor.bWithQuotes = False ucrReceiverColumnFactor.SetParameterIncludeArgumentName(False) @@ -61,7 +62,7 @@ Public Class dlgThreeVariableFrequencies ucrReceiverGroupsBy1st.SetParameter(New RParameter("x", 0)) ucrReceiverGroupsBy1st.Selector = ucrSelectorThreeVariableFrequencies - ucrReceiverGroupsBy1st.SetDataType("factor") + ucrReceiverGroupsBy1st.strSelectorHeading = "Factors" ucrReceiverGroupsBy1st.SetParameterIsString() ucrReceiverGroupsBy1st.bWithQuotes = False ucrReceiverGroupsBy1st.SetParameterIncludeArgumentName(False) @@ -70,6 +71,7 @@ Public Class dlgThreeVariableFrequencies ucrReceiverGroupBy2nd.SetParameter(New RParameter("y", 0)) ucrReceiverGroupBy2nd.Selector = ucrSelectorThreeVariableFrequencies ucrReceiverGroupBy2nd.SetDataType("factor") + ucrReceiverGroupBy2nd.strSelectorHeading = "Factors" ucrReceiverGroupBy2nd.SetParameterIsString() ucrReceiverGroupBy2nd.bWithQuotes = False ucrReceiverGroupBy2nd.SetParameterIncludeArgumentName(False) diff --git a/instat/dlgTwoWayFrequencies.vb b/instat/dlgTwoWayFrequencies.vb index c5d5677f3c3..8f688a212d6 100644 --- a/instat/dlgTwoWayFrequencies.vb +++ b/instat/dlgTwoWayFrequencies.vb @@ -45,11 +45,14 @@ Public Class dlgTwoWayFrequencies ucrReceiverRowFactor.Selector = ucrSelectorTwoWayFrequencies ucrReceiverWeights.Selector = ucrSelectorTwoWayFrequencies ucrReceiverColumnFactor.SetDataType("factor") + ucrReceiverColumnFactor.strSelectorHeading = "Factors" ucrReceiverWeights.SetDataType("numeric") + ucrReceiverWeights.strSelectorHeading = "Numerics" 'setting receivers parameters ucrReceiverRowFactor.SetParameter(New RParameter("var.row", 1)) ucrReceiverRowFactor.SetParameterIsString() + ucrReceiverRowFactor.strSelectorHeading = "Variables" ucrReceiverRowFactor.bWithQuotes = False ucrReceiverRowFactor.SetParameterIncludeArgumentName(False) diff --git a/instat/dlgWindrose.vb b/instat/dlgWindrose.vb index 5eed0bfa838..658c6ca8e9c 100644 --- a/instat/dlgWindrose.vb +++ b/instat/dlgWindrose.vb @@ -47,16 +47,19 @@ Public Class dlgWindrose ucrReceiverWindSpeed.SetParameter(New RParameter("speed", 0)) ucrReceiverWindSpeed.Selector = ucrWindRoseSelector ucrReceiverWindSpeed.SetIncludedDataTypes({"numeric"}) + ucrReceiverWindSpeed.strSelectorHeading = "Numerics" ucrReceiverWindSpeed.SetParameterIsRFunction() ucrReceiverWindDirection.SetParameter(New RParameter("direction", 1)) ucrReceiverWindDirection.Selector = ucrWindRoseSelector ucrReceiverWindDirection.SetIncludedDataTypes({"numeric"}) + ucrReceiverWindDirection.strSelectorHeading = "Numerics" ucrReceiverWindDirection.SetParameterIsRFunction() ucrReceiverFacet.SetParameter(New RParameter("facet", 2)) ucrReceiverFacet.Selector = ucrWindRoseSelector ucrReceiverFacet.SetIncludedDataTypes({"factor"}) + ucrReceiverFacet.strSelectorHeading = "Factors" ucrReceiverFacet.SetParameterIsRFunction() ucrNudNoOfColumns.SetParameter(New RParameter("n_col", 7)) From 0d05b35d6aac0b57aefcf0dba17f6bbd3a9860f0 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Mon, 19 Jun 2017 10:39:05 +0300 Subject: [PATCH 069/201] Chnging text to gettext for ucrinput comments --- instat/dlgOptions.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/dlgOptions.vb b/instat/dlgOptions.vb index 32425879815..12486d647db 100644 --- a/instat/dlgOptions.vb +++ b/instat/dlgOptions.vb @@ -116,7 +116,7 @@ Public Class dlgOptions frmMain.clsInstatOptions.SetFormatComment(fntComment, clrComment) frmMain.clsInstatOptions.SetFormatScript(fntCommand, clrCommand) frmMain.clsInstatOptions.SetFormatEditor(fntEditor, clrEditor) - frmMain.clsInstatOptions.SetComment(ucrInputComment.Text) + frmMain.clsInstatOptions.SetComment(ucrInputComment.GetText) frmMain.clsInstatOptions.SetPreviewRows(ucrNudPreviewRows.Value) frmMain.clsInstatOptions.SetMaxRows(ucrNudMaxRows.Value) frmMain.clsInstatOptions.SetLanguageCultureCode(strCurrLanguageCulture) From bf90947fa387e2168e8435d41a3cb25e520f18ce Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Mon, 19 Jun 2017 10:57:31 +0300 Subject: [PATCH 070/201] adding &Environment.NewLine& --- instat/dlgRegularSequence.vb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index 0940473584c..09f12652d55 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -48,7 +48,7 @@ Public Class dlgRegularSequence ucrInputInStepsOf.SetParameter(New RParameter("by", 2)) ucrInputInStepsOf.AddQuotesIfUnrecognised = False - ucrInputInStepsOf.SetValidationTypeAsNumeric(dcmMin:=1) + ucrInputInStepsOf.SetValidationTypeAsNumeric(dcmMin:=0) ucrNudRepeatValues.SetParameter(New RParameter("each", 1)) ucrNudRepeatValues.SetMinMax(1, Integer.MaxValue) @@ -202,9 +202,9 @@ Public Class dlgRegularSequence vecSequence = frmMain.clsRLink.RunInternalScriptGetValue(strRCommand, bSilent:=True).AsNumeric ucrBase.clsRsyntax.SetAssignTo(strAssignToName:=ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) If iLength < ucrSelectDataFrameRegularSequence.iDataFrameLength Then - txtMessage.Text = "Sequence extended to match the length of the data frame." + txtMessage.Text = "Sequence extended to match" & Environment.NewLine & " the length of the data frame." ElseIf iLength > ucrSelectDataFrameRegularSequence.iDataFrameLength Then - txtMessage.Text = "Sequence truncated to match the length of the data frame." + txtMessage.Text = "Sequence truncated to match" & Environment.NewLine & " the length of the data frame." End If Else clsRepFunction.RemoveParameterByName("length.out") From 30233c1b12dfb2b752889d523ad0fe45e38ebe4f Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 09:11:58 +0100 Subject: [PATCH 071/201] bug fix --- instat/dlgSpells.vb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index eb0879fa8aa..4fe1af72ed7 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -162,7 +162,7 @@ Public Class dlgSpells clsDayToOperator.SetOperation("<=") clsDayToOperator.AddParameter("to", 366) - ' Year group + ' group clsGroupBy.SetRCommand("instat_calculation$new") clsGroupBy.AddParameter("type", Chr(34) & "by" & Chr(34)) @@ -226,7 +226,7 @@ Public Class dlgSpells Private Sub SetRCodeForControls(bReset As Boolean) ucrNudFrom.AddAdditionalCodeParameterPair(clsAdditionalConditionReplaceOperator2, New RParameter("list", 0), iAdditionalPairNo:=1) 'For day: - ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("day", 0), iAdditionalPairNo:=1) + ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("doy", 0), iAdditionalPairNo:=1) ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) @@ -242,7 +242,7 @@ Public Class dlgSpells End Sub Private Sub TestOKEnabled() - If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso ucrNudFrom.GetText = "" AndAlso ucrNudTo.GetText = "" AndAlso ucrInputSpellUpper.Text <> "" Then + If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ucrInputSpellUpper.Text <> "" Then ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) @@ -301,7 +301,7 @@ Public Class dlgSpells 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 End Sub - Private Sub ucrInputSpellLower_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputSpellLower.ControlValueChanged, ucrInputSpellUpper.ControlValueChanged + Private Sub ucrInputSpellLower_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputSpellLower.ControlValueChanged, ucrInputSpellUpper.ControlValueChanged, ucrInputCondition.ControlValueChanged Select Case ucrInputCondition.GetText Case "<= Amount of Rain" ucrInputSpellUpper.Visible = False From 2ae798cc307d126f0798a309f3eb8d145b2ff192 Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 09:20:36 +0100 Subject: [PATCH 072/201] Updating code --- instat/dlgStartofRains.Designer.vb | 355 ++++++++------- instat/dlgStartofRains.vb | 706 ++++++++++++++++++++--------- 2 files changed, 684 insertions(+), 377 deletions(-) diff --git a/instat/dlgStartofRains.Designer.vb b/instat/dlgStartofRains.Designer.vb index 3984c1f47a8..1871fdb05f6 100644 --- a/instat/dlgStartofRains.Designer.vb +++ b/instat/dlgStartofRains.Designer.vb @@ -22,26 +22,27 @@ Partial Class dlgStartofRains 'Do not modify it using the code editor. Private Sub InitializeComponent() - Me.nudTRAmount = New System.Windows.Forms.NumericUpDown() - Me.nudRDMinimum = New System.Windows.Forms.NumericUpDown() Me.lblRainfall = New System.Windows.Forms.Label() Me.grpConditionsForSatrtofRains = New System.Windows.Forms.GroupBox() + Me.ucrChkNumberOfRainyDays = New instat.ucrCheck() + Me.ucrChkTotalRainfall = New instat.ucrCheck() Me.pnlTotalRainfall = New System.Windows.Forms.Panel() + Me.ucrNudTRAmount = New instat.ucrNud() Me.lblTROverDays = New System.Windows.Forms.Label() - Me.nudTRPercentile = New System.Windows.Forms.NumericUpDown() + Me.ucrNudTROverDays = New instat.ucrNud() + Me.ucrNudTRPercentile = New instat.ucrNud() Me.lblTRVal = New System.Windows.Forms.Label() - Me.nudTROverDays = New System.Windows.Forms.NumericUpDown() Me.rdoTRPercentile = New System.Windows.Forms.RadioButton() Me.rdoTRAmount = New System.Windows.Forms.RadioButton() Me.pnlDrySpell = New System.Windows.Forms.Panel() Me.lblDSMaximumDays = New System.Windows.Forms.Label() Me.lblDSLengthofTime = New System.Windows.Forms.Label() Me.nudDSMaximumDays = New System.Windows.Forms.NumericUpDown() - Me.nudDSLengthofTime = New System.Windows.Forms.NumericUpDown() Me.pnlConsecutiveRainyDays = New System.Windows.Forms.Panel() + Me.ucrNudRDMinimumDays = New instat.ucrNud() + Me.ucrNudRDOutOfDays = New instat.ucrNud() Me.lblRDMinimum = New System.Windows.Forms.Label() Me.lblRDWidth = New System.Windows.Forms.Label() - Me.nudRDOutOfDays = New System.Windows.Forms.NumericUpDown() Me.pnlDryPeriod = New System.Windows.Forms.Panel() Me.lblDPMaxRain = New System.Windows.Forms.Label() Me.lblDPLength = New System.Windows.Forms.Label() @@ -51,14 +52,13 @@ Partial Class dlgStartofRains Me.lblDPOverallInterval = New System.Windows.Forms.Label() Me.chkDryPeriod = New System.Windows.Forms.CheckBox() Me.chkDrySpell = New System.Windows.Forms.CheckBox() - Me.chkConsecutiveRainyDays = New System.Windows.Forms.CheckBox() - Me.chkTotalRainfall = New System.Windows.Forms.CheckBox() + Me.ucrPnlTRCalculateBy = New instat.UcrPanel() Me.grpRainParameters = New System.Windows.Forms.GroupBox() - Me.nudThreshold = New System.Windows.Forms.NumericUpDown() + Me.ucrNudThreshold = New instat.ucrNud() + Me.ucrNudTo = New instat.ucrNud() + Me.ucrNudFrom = New instat.ucrNud() Me.lblThreshold = New System.Windows.Forms.Label() - Me.nudFrom = New System.Windows.Forms.NumericUpDown() Me.lblFrom = New System.Windows.Forms.Label() - Me.nudTo = New System.Windows.Forms.NumericUpDown() Me.lblTo = New System.Windows.Forms.Label() Me.lblDOY = New System.Windows.Forms.Label() Me.lblDate = New System.Windows.Forms.Label() @@ -70,46 +70,21 @@ Partial Class dlgStartofRains Me.ucrSelectorForStartofRains = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrBase = New instat.ucrButtons() Me.ucrSaveStartofRains = New instat.ucrSave() - CType(Me.nudTRAmount, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudRDMinimum, System.ComponentModel.ISupportInitialize).BeginInit() + Me.lblStation = New System.Windows.Forms.Label() + Me.ucrReceiverStation = New instat.ucrReceiverSingle() + Me.ucrNudDSLengthOfTime = New instat.ucrNud() Me.grpConditionsForSatrtofRains.SuspendLayout() Me.pnlTotalRainfall.SuspendLayout() - CType(Me.nudTRPercentile, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudTROverDays, System.ComponentModel.ISupportInitialize).BeginInit() Me.pnlDrySpell.SuspendLayout() CType(Me.nudDSMaximumDays, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudDSLengthofTime, System.ComponentModel.ISupportInitialize).BeginInit() Me.pnlConsecutiveRainyDays.SuspendLayout() - CType(Me.nudRDOutOfDays, System.ComponentModel.ISupportInitialize).BeginInit() Me.pnlDryPeriod.SuspendLayout() CType(Me.nudDPMaxRain, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.nudDPRainPeriod, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.nudDPOverallInterval, System.ComponentModel.ISupportInitialize).BeginInit() Me.grpRainParameters.SuspendLayout() - CType(Me.nudThreshold, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudFrom, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudTo, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() ' - 'nudTRAmount - ' - Me.nudTRAmount.Location = New System.Drawing.Point(342, 4) - Me.nudTRAmount.Maximum = New Decimal(New Integer() {200, 0, 0, 0}) - Me.nudTRAmount.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudTRAmount.Name = "nudTRAmount" - Me.nudTRAmount.Size = New System.Drawing.Size(52, 20) - Me.nudTRAmount.TabIndex = 4 - Me.nudTRAmount.Value = New Decimal(New Integer() {30, 0, 0, 0}) - ' - 'nudRDMinimum - ' - Me.nudRDMinimum.Location = New System.Drawing.Point(64, 7) - Me.nudRDMinimum.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudRDMinimum.Name = "nudRDMinimum" - Me.nudRDMinimum.Size = New System.Drawing.Size(47, 20) - Me.nudRDMinimum.TabIndex = 1 - Me.nudRDMinimum.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' 'lblRainfall ' Me.lblRainfall.AutoSize = True @@ -121,14 +96,15 @@ Partial Class dlgStartofRains ' 'grpConditionsForSatrtofRains ' + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkNumberOfRainyDays) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkTotalRainfall) Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlTotalRainfall) Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlDrySpell) Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlConsecutiveRainyDays) Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlDryPeriod) Me.grpConditionsForSatrtofRains.Controls.Add(Me.chkDryPeriod) Me.grpConditionsForSatrtofRains.Controls.Add(Me.chkDrySpell) - Me.grpConditionsForSatrtofRains.Controls.Add(Me.chkConsecutiveRainyDays) - Me.grpConditionsForSatrtofRains.Controls.Add(Me.chkTotalRainfall) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrPnlTRCalculateBy) Me.grpConditionsForSatrtofRains.Location = New System.Drawing.Point(9, 238) Me.grpConditionsForSatrtofRains.Name = "grpConditionsForSatrtofRains" Me.grpConditionsForSatrtofRains.Size = New System.Drawing.Size(579, 160) @@ -136,13 +112,29 @@ Partial Class dlgStartofRains Me.grpConditionsForSatrtofRains.TabStop = False Me.grpConditionsForSatrtofRains.Text = "Conditions for Start of Rains" ' + 'ucrChkNumberOfRainyDays + ' + Me.ucrChkNumberOfRainyDays.Checked = False + Me.ucrChkNumberOfRainyDays.Location = New System.Drawing.Point(7, 69) + Me.ucrChkNumberOfRainyDays.Name = "ucrChkNumberOfRainyDays" + Me.ucrChkNumberOfRainyDays.Size = New System.Drawing.Size(131, 20) + Me.ucrChkNumberOfRainyDays.TabIndex = 10 + ' + 'ucrChkTotalRainfall + ' + Me.ucrChkTotalRainfall.Checked = False + Me.ucrChkTotalRainfall.Location = New System.Drawing.Point(7, 19) + Me.ucrChkTotalRainfall.Name = "ucrChkTotalRainfall" + Me.ucrChkTotalRainfall.Size = New System.Drawing.Size(131, 20) + Me.ucrChkTotalRainfall.TabIndex = 8 + ' 'pnlTotalRainfall ' + Me.pnlTotalRainfall.Controls.Add(Me.ucrNudTRAmount) Me.pnlTotalRainfall.Controls.Add(Me.lblTROverDays) - Me.pnlTotalRainfall.Controls.Add(Me.nudTRAmount) - Me.pnlTotalRainfall.Controls.Add(Me.nudTRPercentile) + Me.pnlTotalRainfall.Controls.Add(Me.ucrNudTROverDays) + Me.pnlTotalRainfall.Controls.Add(Me.ucrNudTRPercentile) Me.pnlTotalRainfall.Controls.Add(Me.lblTRVal) - Me.pnlTotalRainfall.Controls.Add(Me.nudTROverDays) Me.pnlTotalRainfall.Controls.Add(Me.rdoTRPercentile) Me.pnlTotalRainfall.Controls.Add(Me.rdoTRAmount) Me.pnlTotalRainfall.Location = New System.Drawing.Point(144, 13) @@ -150,6 +142,18 @@ Partial Class dlgStartofRains Me.pnlTotalRainfall.Size = New System.Drawing.Size(398, 49) Me.pnlTotalRainfall.TabIndex = 3 ' + 'ucrNudTRAmount + ' + Me.ucrNudTRAmount.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTRAmount.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudTRAmount.Location = New System.Drawing.Point(342, 3) + Me.ucrNudTRAmount.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudTRAmount.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTRAmount.Name = "ucrNudTRAmount" + Me.ucrNudTRAmount.Size = New System.Drawing.Size(50, 20) + Me.ucrNudTRAmount.TabIndex = 8 + Me.ucrNudTRAmount.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'lblTROverDays ' Me.lblTROverDays.AutoSize = True @@ -160,15 +164,29 @@ Partial Class dlgStartofRains Me.lblTROverDays.Tag = "" Me.lblTROverDays.Text = "Over Days:" ' - 'nudTRPercentile - ' - Me.nudTRPercentile.Location = New System.Drawing.Point(342, 25) - Me.nudTRPercentile.Maximum = New Decimal(New Integer() {200, 0, 0, 0}) - Me.nudTRPercentile.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudTRPercentile.Name = "nudTRPercentile" - Me.nudTRPercentile.Size = New System.Drawing.Size(52, 20) - Me.nudTRPercentile.TabIndex = 6 - Me.nudTRPercentile.Value = New Decimal(New Integer() {30, 0, 0, 0}) + 'ucrNudTROverDays + ' + Me.ucrNudTROverDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTROverDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudTROverDays.Location = New System.Drawing.Point(66, 1) + Me.ucrNudTROverDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudTROverDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTROverDays.Name = "ucrNudTROverDays" + Me.ucrNudTROverDays.Size = New System.Drawing.Size(50, 20) + Me.ucrNudTROverDays.TabIndex = 7 + Me.ucrNudTROverDays.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudTRPercentile + ' + Me.ucrNudTRPercentile.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTRPercentile.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudTRPercentile.Location = New System.Drawing.Point(342, 26) + Me.ucrNudTRPercentile.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudTRPercentile.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTRPercentile.Name = "ucrNudTRPercentile" + Me.ucrNudTRPercentile.Size = New System.Drawing.Size(50, 20) + Me.ucrNudTRPercentile.TabIndex = 6 + Me.ucrNudTRPercentile.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'lblTRVal ' @@ -179,16 +197,6 @@ Partial Class dlgStartofRains Me.lblTRVal.TabIndex = 2 Me.lblTRVal.Text = "Calculate Rainfall Value by:" ' - 'nudTROverDays - ' - Me.nudTROverDays.Location = New System.Drawing.Point(65, 2) - Me.nudTROverDays.Maximum = New Decimal(New Integer() {366, 0, 0, 0}) - Me.nudTROverDays.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudTROverDays.Name = "nudTROverDays" - Me.nudTROverDays.Size = New System.Drawing.Size(46, 20) - Me.nudTROverDays.TabIndex = 1 - Me.nudTROverDays.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' 'rdoTRPercentile ' Me.rdoTRPercentile.AutoSize = True @@ -213,10 +221,10 @@ Partial Class dlgStartofRains ' 'pnlDrySpell ' + Me.pnlDrySpell.Controls.Add(Me.ucrNudDSLengthOfTime) Me.pnlDrySpell.Controls.Add(Me.lblDSMaximumDays) Me.pnlDrySpell.Controls.Add(Me.lblDSLengthofTime) Me.pnlDrySpell.Controls.Add(Me.nudDSMaximumDays) - Me.pnlDrySpell.Controls.Add(Me.nudDSLengthofTime) Me.pnlDrySpell.Location = New System.Drawing.Point(96, 95) Me.pnlDrySpell.Name = "pnlDrySpell" Me.pnlDrySpell.Size = New System.Drawing.Size(421, 24) @@ -249,26 +257,41 @@ Partial Class dlgStartofRains Me.nudDSMaximumDays.TabIndex = 1 Me.nudDSMaximumDays.Value = New Decimal(New Integer() {1, 0, 0, 0}) ' - 'nudDSLengthofTime - ' - Me.nudDSLengthofTime.Location = New System.Drawing.Point(289, 2) - Me.nudDSLengthofTime.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudDSLengthofTime.Name = "nudDSLengthofTime" - Me.nudDSLengthofTime.Size = New System.Drawing.Size(52, 20) - Me.nudDSLengthofTime.TabIndex = 3 - Me.nudDSLengthofTime.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' 'pnlConsecutiveRainyDays ' + Me.pnlConsecutiveRainyDays.Controls.Add(Me.ucrNudRDMinimumDays) + Me.pnlConsecutiveRainyDays.Controls.Add(Me.ucrNudRDOutOfDays) Me.pnlConsecutiveRainyDays.Controls.Add(Me.lblRDMinimum) - Me.pnlConsecutiveRainyDays.Controls.Add(Me.nudRDMinimum) Me.pnlConsecutiveRainyDays.Controls.Add(Me.lblRDWidth) - Me.pnlConsecutiveRainyDays.Controls.Add(Me.nudRDOutOfDays) Me.pnlConsecutiveRainyDays.Location = New System.Drawing.Point(144, 62) Me.pnlConsecutiveRainyDays.Name = "pnlConsecutiveRainyDays" Me.pnlConsecutiveRainyDays.Size = New System.Drawing.Size(258, 32) Me.pnlConsecutiveRainyDays.TabIndex = 1 ' + 'ucrNudRDMinimumDays + ' + Me.ucrNudRDMinimumDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudRDMinimumDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudRDMinimumDays.Location = New System.Drawing.Point(61, 7) + Me.ucrNudRDMinimumDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudRDMinimumDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudRDMinimumDays.Name = "ucrNudRDMinimumDays" + Me.ucrNudRDMinimumDays.Size = New System.Drawing.Size(50, 20) + Me.ucrNudRDMinimumDays.TabIndex = 9 + Me.ucrNudRDMinimumDays.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudRDOutOfDays + ' + Me.ucrNudRDOutOfDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudRDOutOfDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudRDOutOfDays.Location = New System.Drawing.Point(186, 7) + Me.ucrNudRDOutOfDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudRDOutOfDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudRDOutOfDays.Name = "ucrNudRDOutOfDays" + Me.ucrNudRDOutOfDays.Size = New System.Drawing.Size(50, 20) + Me.ucrNudRDOutOfDays.TabIndex = 10 + Me.ucrNudRDOutOfDays.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'lblRDMinimum ' Me.lblRDMinimum.AutoSize = True @@ -287,15 +310,6 @@ Partial Class dlgStartofRains Me.lblRDWidth.TabIndex = 2 Me.lblRDWidth.Text = "Out of Days:" ' - 'nudRDOutOfDays - ' - Me.nudRDOutOfDays.Location = New System.Drawing.Point(196, 9) - Me.nudRDOutOfDays.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudRDOutOfDays.Name = "nudRDOutOfDays" - Me.nudRDOutOfDays.Size = New System.Drawing.Size(52, 20) - Me.nudRDOutOfDays.TabIndex = 3 - Me.nudRDOutOfDays.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' 'pnlDryPeriod ' Me.pnlDryPeriod.Controls.Add(Me.lblDPMaxRain) @@ -383,33 +397,20 @@ Partial Class dlgStartofRains Me.chkDrySpell.Text = "Dry Spell" Me.chkDrySpell.UseVisualStyleBackColor = True ' - 'chkConsecutiveRainyDays - ' - Me.chkConsecutiveRainyDays.AutoSize = True - Me.chkConsecutiveRainyDays.Location = New System.Drawing.Point(6, 72) - Me.chkConsecutiveRainyDays.Name = "chkConsecutiveRainyDays" - Me.chkConsecutiveRainyDays.Size = New System.Drawing.Size(132, 17) - Me.chkConsecutiveRainyDays.TabIndex = 0 - Me.chkConsecutiveRainyDays.Text = "Number of Rainy Days" - Me.chkConsecutiveRainyDays.UseVisualStyleBackColor = True - ' - 'chkTotalRainfall + 'ucrPnlTRCalculateBy ' - Me.chkTotalRainfall.AutoSize = True - Me.chkTotalRainfall.Location = New System.Drawing.Point(9, 19) - Me.chkTotalRainfall.Name = "chkTotalRainfall" - Me.chkTotalRainfall.Size = New System.Drawing.Size(88, 17) - Me.chkTotalRainfall.TabIndex = 2 - Me.chkTotalRainfall.Text = "Total Rainfall" - Me.chkTotalRainfall.UseVisualStyleBackColor = True + Me.ucrPnlTRCalculateBy.Location = New System.Drawing.Point(408, 13) + Me.ucrPnlTRCalculateBy.Name = "ucrPnlTRCalculateBy" + Me.ucrPnlTRCalculateBy.Size = New System.Drawing.Size(134, 49) + Me.ucrPnlTRCalculateBy.TabIndex = 9 ' 'grpRainParameters ' - Me.grpRainParameters.Controls.Add(Me.nudThreshold) + Me.grpRainParameters.Controls.Add(Me.ucrNudThreshold) + Me.grpRainParameters.Controls.Add(Me.ucrNudTo) + Me.grpRainParameters.Controls.Add(Me.ucrNudFrom) Me.grpRainParameters.Controls.Add(Me.lblThreshold) - Me.grpRainParameters.Controls.Add(Me.nudFrom) Me.grpRainParameters.Controls.Add(Me.lblFrom) - Me.grpRainParameters.Controls.Add(Me.nudTo) Me.grpRainParameters.Controls.Add(Me.lblTo) Me.grpRainParameters.Location = New System.Drawing.Point(9, 192) Me.grpRainParameters.Name = "grpRainParameters" @@ -417,15 +418,41 @@ Partial Class dlgStartofRains Me.grpRainParameters.TabIndex = 9 Me.grpRainParameters.TabStop = False ' - 'nudThreshold - ' - Me.nudThreshold.DecimalPlaces = 2 - Me.nudThreshold.Increment = New Decimal(New Integer() {1, 0, 0, 65536}) - Me.nudThreshold.Location = New System.Drawing.Point(66, 11) - Me.nudThreshold.Name = "nudThreshold" - Me.nudThreshold.Size = New System.Drawing.Size(53, 20) - Me.nudThreshold.TabIndex = 1 - Me.nudThreshold.Value = New Decimal(New Integer() {85, 0, 0, 131072}) + 'ucrNudThreshold + ' + Me.ucrNudThreshold.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudThreshold.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudThreshold.Location = New System.Drawing.Point(69, 11) + Me.ucrNudThreshold.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudThreshold.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudThreshold.Name = "ucrNudThreshold" + Me.ucrNudThreshold.Size = New System.Drawing.Size(50, 20) + Me.ucrNudThreshold.TabIndex = 10 + Me.ucrNudThreshold.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudTo + ' + Me.ucrNudTo.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTo.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudTo.Location = New System.Drawing.Point(313, 11) + Me.ucrNudTo.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudTo.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTo.Name = "ucrNudTo" + Me.ucrNudTo.Size = New System.Drawing.Size(50, 20) + Me.ucrNudTo.TabIndex = 9 + Me.ucrNudTo.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudFrom + ' + Me.ucrNudFrom.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudFrom.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudFrom.Location = New System.Drawing.Point(188, 11) + Me.ucrNudFrom.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudFrom.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudFrom.Name = "ucrNudFrom" + Me.ucrNudFrom.Size = New System.Drawing.Size(50, 20) + Me.ucrNudFrom.TabIndex = 8 + Me.ucrNudFrom.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'lblThreshold ' @@ -437,19 +464,6 @@ Partial Class dlgStartofRains Me.lblThreshold.Tag = "Threshold" Me.lblThreshold.Text = "Threshold:" ' - 'nudFrom - ' - Me.nudFrom.Location = New System.Drawing.Point(188, 11) - Me.nudFrom.Maximum = New Decimal(New Integer() {366, 0, 0, 0}) - Me.nudFrom.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudFrom.Name = "nudFrom" - Me.nudFrom.RightToLeft = System.Windows.Forms.RightToLeft.Yes - Me.nudFrom.Size = New System.Drawing.Size(53, 20) - Me.nudFrom.TabIndex = 3 - Me.nudFrom.TextAlign = System.Windows.Forms.HorizontalAlignment.Right - Me.nudFrom.UpDownAlign = System.Windows.Forms.LeftRightAlignment.Left - Me.nudFrom.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' 'lblFrom ' Me.lblFrom.AutoSize = True @@ -459,16 +473,6 @@ Partial Class dlgStartofRains Me.lblFrom.TabIndex = 2 Me.lblFrom.Text = "From:" ' - 'nudTo - ' - Me.nudTo.Location = New System.Drawing.Point(321, 10) - Me.nudTo.Maximum = New Decimal(New Integer() {366, 0, 0, 0}) - Me.nudTo.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudTo.Name = "nudTo" - Me.nudTo.Size = New System.Drawing.Size(53, 20) - Me.nudTo.TabIndex = 5 - Me.nudTo.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' 'lblTo ' Me.lblTo.AutoSize = True @@ -514,7 +518,9 @@ Partial Class dlgStartofRains Me.ucrReceiverYear.Name = "ucrReceiverYear" Me.ucrReceiverYear.Selector = Nothing Me.ucrReceiverYear.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverYear.strNcFilePath = "" Me.ucrReceiverYear.TabIndex = 6 + Me.ucrReceiverYear.ucrSelector = Nothing ' 'ucrReceiverDate ' @@ -524,7 +530,9 @@ Partial Class dlgStartofRains Me.ucrReceiverDate.Name = "ucrReceiverDate" Me.ucrReceiverDate.Selector = Nothing Me.ucrReceiverDate.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverDate.strNcFilePath = "" Me.ucrReceiverDate.TabIndex = 2 + Me.ucrReceiverDate.ucrSelector = Nothing ' 'ucrReceiverDOY ' @@ -534,7 +542,9 @@ Partial Class dlgStartofRains Me.ucrReceiverDOY.Name = "ucrReceiverDOY" Me.ucrReceiverDOY.Selector = Nothing Me.ucrReceiverDOY.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverDOY.strNcFilePath = "" Me.ucrReceiverDOY.TabIndex = 8 + Me.ucrReceiverDOY.ucrSelector = Nothing ' 'ucrReceiverRainfall ' @@ -544,7 +554,9 @@ Partial Class dlgStartofRains Me.ucrReceiverRainfall.Name = "ucrReceiverRainfall" Me.ucrReceiverRainfall.Selector = Nothing Me.ucrReceiverRainfall.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverRainfall.strNcFilePath = "" Me.ucrReceiverRainfall.TabIndex = 4 + Me.ucrReceiverRainfall.ucrSelector = Nothing ' 'ucrSelectorForStartofRains ' @@ -570,11 +582,46 @@ Partial Class dlgStartofRains Me.ucrSaveStartofRains.Size = New System.Drawing.Size(316, 24) Me.ucrSaveStartofRains.TabIndex = 12 ' + 'lblStation + ' + Me.lblStation.AutoSize = True + Me.lblStation.Location = New System.Drawing.Point(419, 28) + Me.lblStation.Name = "lblStation" + Me.lblStation.Size = New System.Drawing.Size(43, 13) + Me.lblStation.TabIndex = 13 + Me.lblStation.Text = "Station:" + ' + 'ucrReceiverStation + ' + Me.ucrReceiverStation.frmParent = Me + Me.ucrReceiverStation.Location = New System.Drawing.Point(418, 43) + Me.ucrReceiverStation.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverStation.Name = "ucrReceiverStation" + Me.ucrReceiverStation.Selector = Nothing + Me.ucrReceiverStation.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverStation.strNcFilePath = "" + Me.ucrReceiverStation.TabIndex = 14 + Me.ucrReceiverStation.ucrSelector = Nothing + ' + 'ucrNudDSLengthOfTime + ' + Me.ucrNudDSLengthOfTime.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDSLengthOfTime.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDSLengthOfTime.Location = New System.Drawing.Point(291, 3) + Me.ucrNudDSLengthOfTime.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDSLengthOfTime.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDSLengthOfTime.Name = "ucrNudDSLengthOfTime" + Me.ucrNudDSLengthOfTime.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDSLengthOfTime.TabIndex = 11 + Me.ucrNudDSLengthOfTime.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'dlgStartofRains ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(594, 488) + Me.Controls.Add(Me.lblStation) + Me.Controls.Add(Me.ucrReceiverStation) Me.Controls.Add(Me.ucrSaveStartofRains) Me.Controls.Add(Me.ucrReceiverYear) Me.Controls.Add(Me.lblYear) @@ -595,21 +642,15 @@ Partial Class dlgStartofRains Me.ShowIcon = False Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Text = "Start of Rains" - CType(Me.nudTRAmount, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudRDMinimum, System.ComponentModel.ISupportInitialize).EndInit() Me.grpConditionsForSatrtofRains.ResumeLayout(False) Me.grpConditionsForSatrtofRains.PerformLayout() Me.pnlTotalRainfall.ResumeLayout(False) Me.pnlTotalRainfall.PerformLayout() - CType(Me.nudTRPercentile, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudTROverDays, System.ComponentModel.ISupportInitialize).EndInit() Me.pnlDrySpell.ResumeLayout(False) Me.pnlDrySpell.PerformLayout() CType(Me.nudDSMaximumDays, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudDSLengthofTime, System.ComponentModel.ISupportInitialize).EndInit() Me.pnlConsecutiveRainyDays.ResumeLayout(False) Me.pnlConsecutiveRainyDays.PerformLayout() - CType(Me.nudRDOutOfDays, System.ComponentModel.ISupportInitialize).EndInit() Me.pnlDryPeriod.ResumeLayout(False) Me.pnlDryPeriod.PerformLayout() CType(Me.nudDPMaxRain, System.ComponentModel.ISupportInitialize).EndInit() @@ -617,42 +658,29 @@ Partial Class dlgStartofRains CType(Me.nudDPOverallInterval, System.ComponentModel.ISupportInitialize).EndInit() Me.grpRainParameters.ResumeLayout(False) Me.grpRainParameters.PerformLayout() - CType(Me.nudThreshold, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudFrom, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudTo, System.ComponentModel.ISupportInitialize).EndInit() Me.ResumeLayout(False) Me.PerformLayout() End Sub Friend WithEvents ucrBase As ucrButtons - Friend WithEvents nudTRAmount As NumericUpDown - Friend WithEvents nudRDMinimum As NumericUpDown Friend WithEvents ucrSelectorForStartofRains As ucrSelectorByDataFrameAddRemove Friend WithEvents ucrReceiverRainfall As ucrReceiverSingle Friend WithEvents lblRainfall As Label Friend WithEvents grpConditionsForSatrtofRains As GroupBox - Friend WithEvents nudDSLengthofTime As NumericUpDown Friend WithEvents nudDSMaximumDays As NumericUpDown Friend WithEvents lblDSLengthofTime As Label Friend WithEvents lblDSMaximumDays As Label Friend WithEvents lblTRVal As Label Friend WithEvents lblRDMinimum As Label Friend WithEvents chkDrySpell As CheckBox - Friend WithEvents chkTotalRainfall As CheckBox - Friend WithEvents chkConsecutiveRainyDays As CheckBox Friend WithEvents grpRainParameters As GroupBox - Friend WithEvents nudFrom As NumericUpDown Friend WithEvents lblFrom As Label - Friend WithEvents nudTROverDays As NumericUpDown - Friend WithEvents nudTo As NumericUpDown Friend WithEvents lblTo As Label Friend WithEvents lblTROverDays As Label Friend WithEvents lblDOY As Label Friend WithEvents ucrReceiverDOY As ucrReceiverSingle Friend WithEvents lblRDWidth As Label - Friend WithEvents nudRDOutOfDays As NumericUpDown - Friend WithEvents nudThreshold As NumericUpDown Friend WithEvents lblThreshold As Label Friend WithEvents lblDate As Label Friend WithEvents ucrReceiverDate As ucrReceiverSingle @@ -667,10 +695,23 @@ Partial Class dlgStartofRains Friend WithEvents lblDPLength As Label Friend WithEvents lblDPMaxRain As Label Friend WithEvents chkDryPeriod As CheckBox - Friend WithEvents nudTRPercentile As NumericUpDown Friend WithEvents pnlConsecutiveRainyDays As Panel Friend WithEvents pnlDryPeriod As Panel Friend WithEvents pnlDrySpell As Panel Friend WithEvents pnlTotalRainfall As Panel Friend WithEvents ucrSaveStartofRains As ucrSave + Friend WithEvents ucrNudTROverDays As ucrNud + Friend WithEvents ucrNudTRPercentile As ucrNud + Friend WithEvents lblStation As Label + Friend WithEvents ucrReceiverStation As ucrReceiverSingle + Friend WithEvents ucrNudTo As ucrNud + Friend WithEvents ucrNudFrom As ucrNud + Friend WithEvents ucrChkTotalRainfall As ucrCheck + Friend WithEvents ucrNudTRAmount As ucrNud + Friend WithEvents ucrPnlTRCalculateBy As UcrPanel + Friend WithEvents ucrNudRDMinimumDays As ucrNud + Friend WithEvents ucrNudRDOutOfDays As ucrNud + Friend WithEvents ucrNudThreshold As ucrNud + Friend WithEvents ucrChkNumberOfRainyDays As ucrCheck + Friend WithEvents ucrNudDSLengthOfTime As ucrNud End Class \ No newline at end of file diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 44d2dfa1398..f84b7cf395a 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -16,13 +16,16 @@ Imports instat.Translations Public Class dlgStartofRains - Public clsAddKey, clsDayFromAndTo, clsRainyDays, clsFirstDOYPerYear, clsYearGroupDaily, clsManipulationFirstDOYPerYear, clsCombinedFilter, clsCombinedList As New RFunction + Public clsRainyDays, clsRainyDaysFunction, clsFirstDOYPerYear, clsManipulationFirstDOYPerYear, clsCombinedFilter, clsCombinedList As New RFunction + Private clsDayFromAndTo, clsGroupBy, clsAddKey, clsAddKeyColName As New RFunction + Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator, clsRainyDaysOperator As New ROperator 'Total Rainfall classes - Private clsTRRollingSum, clsTRWetSpell, clsTRWetSpellList As New RFunction + Private clsTRRollingSum, clsTRRollingSumFunction, clsTRWetSpell, clsTRWetSpellList, clsTRWetSpellFunction As New RFunction 'Rainy Day classes - Private clsSubRDRainDays1, clsRDRollingRainDays As New RFunction + Private clsRDRollingRainDays, clsRDRollingRainDaysFunction, clsRDRollingRainDaysSub As New RFunction 'Dry Spell classes - Private clsDSDryPeriodTen, clsDSDrySpell, clsDSDryPeriodTenList, clsSubDSRainDays2 As New RFunction + Private clsDSDryPeriodTen, clsDSDrySpell, clsDSDryPeriodTenFunctionLead, clsDSDryPeriodTenFunction, clsDSDryPeriodTenList, clsDSDrySpellSub As New RFunction + 'Dry Period classes Private clsDPOverallInterval, clsDPOverallIntervalList, clsDPRain, clsDPRainList, clsDPRainInDays As New RFunction Private strCurrDataName As String = "" @@ -39,64 +42,110 @@ Public Class dlgStartofRains TestOKEnabled() End Sub - Private Sub ucrReceiverDOY_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDOY.SelectionChanged - firstDayofTheYear() - DayFromAndToMethod() - FirstDOYPerYear() - TestOKEnabled() - End Sub - - Private Sub ucrSelectorForStartofRains_DataFrameChanged() Handles ucrSelectorForStartofRains.DataFrameChanged - strCurrDataName = Chr(34) & ucrSelectorForStartofRains.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - clsAddKey.AddParameter("data_name", strCurrDataName) - firstDayofTheYear() - End Sub - Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 199 - clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") - clsDayFromAndTo.SetRCommand("instat_calculation$new") - clsDayFromAndTo.SetAssignTo("Day_From_and_To") - clsYearGroupDaily.SetRCommand("instat_calculation$new") - clsYearGroupDaily.SetAssignTo("Year_Group_Daily") - clsRainyDays.SetRCommand("instat_calculation$new") - clsTRRollingSum.SetRCommand("instat_calculation$new") - clsTRRollingSum.SetAssignTo("rolling_sum_day") + + ' setting the selector + ucrSelectorForStartofRains.SetParameter(New RParameter("data_name", 0)) + ucrSelectorForStartofRains.SetParameterIsString() + + ' setting receivers + ucrReceiverStation.SetParameter(New RParameter("station", 1)) + ucrReceiverStation.SetParameterIsString() + ucrReceiverStation.Selector = ucrSelectorForStartofRains + ucrReceiverStation.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "station" & Chr(34)}) + ucrReceiverStation.bAutoFill = True + + ucrReceiverDate.SetParameter(New RParameter("date", 0)) + ucrReceiverDate.SetParameterIsString() + ucrReceiverDate.Selector = ucrSelectorForStartofRains + ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) + ucrReceiverDate.bAutoFill = True + + ucrReceiverDOY.SetParameter(New RParameter("day", 0)) + ucrReceiverDOY.SetParameterIsString() + ucrReceiverDOY.bWithQuotes = False + ucrReceiverDOY.Selector = ucrSelectorForStartofRains + ucrReceiverDOY.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "doy" & Chr(34)}) + ucrReceiverDOY.bAutoFill = True + + ucrReceiverRainfall.SetParameter(New RParameter("data", 0)) + ucrReceiverRainfall.SetParameterIsRFunction() + ucrReceiverRainfall.bWithQuotes = False + ' ucrReceiverRainfall.SetParameterIncludeArgumentName(False) + ucrReceiverRainfall.Selector = ucrSelectorForStartofRains + ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) + ucrReceiverRainfall.bAutoFill = True + + + 'Days + ucrNudFrom.SetParameter(New RParameter("from", 0)) + ucrNudFrom.SetMinMax(1, 365) + + ucrNudTo.SetParameter(New RParameter("to", 0)) + ucrNudTo.SetMinMax(2, 366) + + 'Total Rainfall + ' ucrChkTotalRainfall if not checked then it doesn't run anything - do manually that this runs if checked. + ucrChkTotalRainfall.SetText("Total Rainfall") + ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + ucrNudTROverDays.SetLinkedDisplayControl(lblTROverDays) + ucrNudTROverDays.SetLinkedDisplayControl(lblTRVal) + ucrChkTotalRainfall.AddToLinkedControls(ucrPnlTRCalculateBy, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + + ' set up panel correctly! + ucrPnlTRCalculateBy.AddRadioButton(rdoTRAmount) + ucrPnlTRCalculateBy.AddRadioButton(rdoTRPercentile) + + ' pecentile adds a function, check for amount. + + ' nud + ucrNudTROverDays.SetParameter(New RParameter("width", 1)) + ucrNudTROverDays.SetMinMax(1, 366) ' I think? + ' don't allow quotes around it + + ucrNudTRPercentile.SetParameter(New RParameter("probs", 1)) + ucrNudTRPercentile.SetMinMax(0, 1) + ucrNudTRPercentile.DecimalPlaces = 2 + ucrNudTRPercentile.Increment = 0.1 + + 'Number of Rainy days + ' ucrChkTotalRainfall if not checked then it doesn't run anything + ' if checked, then it runs a function: instat_calculation$new TODO: How to do that? + ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") + ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + ucrNudRDMinimumDays.SetLinkedDisplayControl(lblRDMinimum) + ucrNudRDOutOfDays.SetLinkedDisplayControl(lblRDWidth) + + + ucrNudRDOutOfDays.SetParameter(New RParameter("width", 1)) + 'ucrNudRDOutOfDays.SetMinMax(1, 366) what is appropriate here? + + 'Dry Spell + ucrNudDSLengthOfTime.SetParameter(New RParameter("width", 1)) + ' what is a min/max for this + + 'clsMinimumRainfall.SetRCommand("instat_calculation$new") 'clsMinimumRainfall.SetAssignTo("Minimum_Rainfall") - clsRDRollingRainDays.SetRCommand("instat_calculation$new") - clsRDRollingRainDays.SetAssignTo("Rolling_rain") + clsFirstDOYPerYear.SetRCommand("instat_calculation$new") clsFirstDOYPerYear.SetAssignTo("First_doy_per_year") - clsDSDryPeriodTen.SetRCommand("instat_calculation$new") - clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") - clsDSDrySpell.SetRCommand("instat_calculation$new") - clsDSDrySpell.SetAssignTo("Dry_Spell") + 'clsWithinThirtyDays.SetRCommand("instat_calculation$new") 'clsWithinThirtyDays.SetAssignTo("dry_spell_10") ucrBase.clsRsyntax.SetFunction(frmMain.clsRLink.strInstatDataObject & "$apply_instat_calculation") - clsSubRDRainDays1.SetRCommand("list") - clsSubDSRainDays2.SetRCommand("list") + clsCombinedList.SetRCommand("list") clsManipulationFirstDOYPerYear.SetRCommand("list") - clsDSDryPeriodTenList.SetRCommand("list") - clsTRWetSpellList.SetRCommand("list") - clsTRWetSpell.SetRCommand("instat_calculation$new") - clsTRWetSpell.SetAssignTo("Wet_Spell") clsCombinedFilter.SetRCommand("instat_calculation$new") clsCombinedFilter.SetAssignTo("combined_filter") - ucrReceiverRainfall.Selector = ucrSelectorForStartofRains ucrReceiverYear.Selector = ucrSelectorForStartofRains - ucrReceiverDate.Selector = ucrSelectorForStartofRains - ucrReceiverDOY.Selector = ucrSelectorForStartofRains - ucrReceiverDate.SetMeAsReceiver() - - nudTRPercentile.Minimum = 0 - nudTRPercentile.Maximum = 1 - nudTRPercentile.DecimalPlaces = 2 - nudTRPercentile.Increment = 0.1 clsDPOverallInterval.SetRCommand("instat_calculation$new") clsDPOverallInterval.SetAssignTo("Overall_Interval") @@ -107,13 +156,7 @@ Public Class dlgStartofRains clsDPOverallIntervalList.SetRCommand("list") clsDPRainList.SetRCommand("list") - ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) - ucrReceiverDOY.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "doy" & Chr(34)}) - ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) - ucrReceiverDate.bAutoFill = True - ucrReceiverDOY.bAutoFill = True - ucrReceiverRainfall.bAutoFill = True ucrReceiverYear.bAutoFill = True 'save @@ -125,49 +168,300 @@ Public Class dlgStartofRains End Sub Private Sub SetDefaults() - ucrSaveStartofRains.Reset() + clsAddKey = New RFunction + clsAddKeyColName = New RFunction + clsDayFromAndTo = New RFunction + clsDayFromAndToOperator = New ROperator + clsGroupBy = New RFunction + clsRainyDays = New RFunction + clsRainyDaysFunction = New RFunction + clsRainyDaysOperator = New ROperator + + clsTRRollingSum = New RFunction + clsTRRollingSumFunction = New RFunction + clsTRWetSpellList = New RFunction + clsTRWetSpell = New RFunction + clsTRWetSpellFunction = New RFunction + clsRDRollingRainDays = New RFunction + clsRDRollingRainDaysFunction = New RFunction + clsRDRollingRainDaysSub = New RFunction + + clsDSDrySpell = New RFunction + clsDSDryPeriodTenList = New RFunction + clsDSDryPeriodTen = New RFunction + clsDSDryPeriodTenFunction = New RFunction + clsDSDrySpellSub = New RFunction + clsDSDryPeriodTenFunctionLead = New RFunction + ucrReceiverDate.SetMeAsReceiver() + ucrSaveStartofRains.Reset() ucrSelectorForStartofRains.Reset() - chkConsecutiveRainyDays.Checked = False + + ' Adding a key + clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") + clsAddKey.AddParameter("col_name", clsRFunctionParameter:=clsAddKeyColName) + clsAddKeyColName.SetRCommand("c") + + 'DayFromandTo + clsDayFromAndTo.SetRCommand("instat_calculation$new") + clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) + ' clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) + clsDayFromAndToOperator.SetOperation("&") + clsDayFromAndToOperator.AddParameter("from", clsROperatorParameter:=clsDayFromOperator, iPosition:=0) + clsDayFromOperator.SetOperation(">=") + clsDayFromOperator.AddParameter("from", 1) + clsDayFromAndToOperator.AddParameter("to", clsROperatorParameter:=clsDayToOperator, iPosition:=1) + clsDayToOperator.SetOperation("<=") + clsDayToOperator.AddParameter("to", 366) + + ' group + clsGroupBy.SetRCommand("instat_calculation$new") + clsGroupBy.AddParameter("type", Chr(34) & "by" & Chr(34)) + + 'rainydays + clsRainyDays.SetRCommand("instat_calculation$new") + clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' clsRainyDays.AddParameter("function_exp", Chr(34) & clsRainyDaysFunction.ToScript & Chr(34)) + clsRainyDaysFunction.SetRCommand("match") + clsRainyDaysFunction.AddParameter("x", clsROperatorParameter:=clsRainyDaysOperator, iPosition:=0) + clsRainyDaysOperator.SetOperation(">=") + clsRainyDaysOperator.AddParameter("threshold", 0.85, iPosition:=1) ' rain + clsRainyDaysFunction.AddParameter("table", "1", iPosition:=1) + clsRainyDaysFunction.AddParameter("nomatch", "0", iPosition:=2) + '"match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudThreshold.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) + clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=2) + clsRainyDays.AddParameter("save", 0, iPosition:=6) + + 'TOTAL RAINFALL: associated with ucrChkTRTotalRainfall + clsTRRollingSum.SetRCommand("instat_calculation$new") + clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsTRRollingSum.AddParameter("result_name", Chr(34) & "roll_sum_Rain" & Chr(34), iPosition:=2) + ' clsTRRollingSum.AddParameter("function_exp", Chr(34) & clsTRRollingSumFunction.ToScript & Chr(34), iPosition:=1) + clsTRRollingSumFunction.SetPackageName("zoo") + clsTRRollingSumFunction.SetRCommand("rollapply") + clsTRRollingSumFunction.AddParameter("width", 2, iPosition:=1) + clsTRRollingSumFunction.AddParameter("FUN", "sum", iPosition:=2) + clsTRRollingSumFunction.AddParameter("na.rm", "FALSE", iPosition:=3) + clsTRRollingSumFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) ' chr(39) = ' ?? + clsTRRollingSumFunction.AddParameter("fill", "NA", iPosition:=5) ' chr(39) = ' ?? + clsTRRollingSum.AddParameter("save", 0, iPosition:=6) + + ' Quantile checked: + ' this function is associated with that rdo. + clsTRWetSpellList.SetRCommand("list") + clsTRWetSpell.SetRCommand("instat_calculation$new") + clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + ' clsTRWetSpell.AddParameter("function_exp", Chr(34) & clsTRWetSpellFunction.ToScript & Chr(34), iPosition:=1) + clsTRWetSpellFunction.SetRCommand("quantile") + clsTRWetSpellFunction.AddParameter("x", "roll_sum_Rain", iPosition:=0) + clsTRWetSpellFunction.AddParameter("probs", 0.8, iPosition:=1) ' do I write: 0.8 or "0.8"? + clsTRWetSpellFunction.AddParameter("na.rm", "TRUE", iPosition:=2) + clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34), iPosition:=2) + clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList, iPosition:=5) ' check position + clsTRWetSpell.AddParameter("save", "0", iPosition:=6) + + ' What if amount is checked?? + ' move to approp. place + + + ' RAINY DAY + clsRDRollingRainDays.SetRCommand("instat_calculation$new") + clsRDRollingRainDaysSub.SetRCommand("list") + clsRDRollingRainDays.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & clsRDRollingRainDaysFunction.ToScript & Chr(34), iPosition:=1) + clsRDRollingRainDaysFunction.SetPackageName("zoo") + clsRDRollingRainDaysFunction.SetRCommand("rollapply") + clsRDRollingRainDaysFunction.AddParameter("data", "rain_day", iPosition:=0) + clsRDRollingRainDaysFunction.AddParameter("width", 2, iPosition:=1) ' default = 2? + clsRDRollingRainDaysFunction.AddParameter("FUN", "sum", iPosition:=2) + clsRDRollingRainDaysFunction.AddParameter("na.rm", "FALSE", iPosition:=3) + clsRDRollingRainDaysFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) ' check this is chr(39) for ' + clsRDRollingRainDaysFunction.AddParameter("fill", "NA", iPosition:=5) + clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34), iPosition:=2) + clsRDRollingRainDays.AddParameter("save", 0, iPosition:=6) + + 'DRY SPELL + clsDSDrySpell.SetRCommand("instat_calculation$new") + clsDSDryPeriodTen.SetRCommand("instat_calculation$new") + clsDSDryPeriodTenList.SetRCommand("list") + clsDSDrySpellSub.SetRCommand("list") + + clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34), iPosition:=1) + clsDSDrySpell.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) + clsDSDrySpell.AddParameter("save", 0, iPosition:=6) + + clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & clsDSDryPeriodTenFunctionLead.ToScript & Chr(34)) + clsDSDryPeriodTenFunctionLead.SetRCommand("lead") + clsDSDryPeriodTenFunctionLead.AddParameter("x", clsRFunctionParameter:=clsDSDryPeriodTenFunction) + clsDSDryPeriodTenFunction.SetPackageName("zoo") + clsDSDryPeriodTenFunction.SetRCommand("rollapply") + clsDSDryPeriodTenFunction.AddParameter("data", "Dry_Spell", iPosition:=0) + clsDSDryPeriodTenFunction.AddParameter("width", 30, iPosition:=1) + clsDSDryPeriodTenFunction.AddParameter("FUN", "max", iPosition:=2) + clsDSDryPeriodTenFunction.AddParameter("na.rm", "FALSE", iPosition:=3) + clsDSDryPeriodTenFunction.AddParameter("align", Chr(39) & "max" & Chr(39), iPosition:=4) + clsDSDryPeriodTenFunction.AddParameter("fill", "NA", iPosition:=5) + clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) + clsDSDryPeriodTen.AddParameter("save", 2, iPosition:=6) + + + chkDrySpell.Checked = False - chkTotalRainfall.Checked = False + ucrChkTotalRainfall.Checked = False chkDryPeriod.Checked = False CheckBoxesSetting() TestOKEnabled() - nudTRAmount.Value = 20 - nudTRPercentile.Value = 0.8 - nudRDMinimum.Value = 1 + ucrNudTRAmount.Value = 20 + ' nudRDMinimum.Value = 1 nudDSMaximumDays.Value = 10 - nudDSLengthofTime.Value = 30 - nudTROverDays.Value = 2 - nudThreshold.Value = 0.85 rdoTRAmount.Checked = True nudDPMaxRain.Value = 40 nudDPRainPeriod.Value = 30 nudDPOverallInterval.Value = 45 - nudFrom.Value = 1 - nudTo.Value = 366 'DefaultNudValue() End Sub - Private Sub ReopenDialog() + 'TODO: start of rains changes discussed with francis. leap() and also nud -1 for something and also left? + 'ine 399 in R-Instat: + 'Add in the lead, this Is because we want to count the NEXT x days with less than y days of rain. Without lead, we were counting the current day + '2. If the user wishes to start from day 122, then the nud can say 122. BUT, the value that we call has to be 121. This can be fixed properly when we have more time, but for now will do + ' does that start from 122 mess up the lead()?? + ' add to start of rains to sort the order at the end + + Private Sub SetRCodeForControls(bReset As Boolean) + ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("doy", 0), iAdditionalPairNo:=1) + ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRainyDaysOperator, New RParameter("Rain", 1), iAdditionalPairNo:=1) + ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) + ucrNudFrom.SetRCode(clsDayFromOperator, bReset) + ucrNudTo.SetRCode(clsDayToOperator, bReset) + + ucrReceiverStation.SetRCode(clsAddKeyColName, bReset) + ucrReceiverDate.SetRCode(clsAddKeyColName, bReset) + ucrSelectorForStartofRains.SetRCode(clsAddKey, bReset) + + ucrReceiverRainfall.SetRCode(clsTRRollingSumFunction, bReset) + + 'Total Rainfall + ucrNudTROverDays.SetRCode(clsTRRollingSumFunction, bReset) + ucrNudTRPercentile.SetRCode(clsTRWetSpellFunction, bReset) + 'Rain Days + ucrNudRDOutOfDays.SetRCode(clsRDRollingRainDaysFunction, bReset) + + 'DrySpell + ucrNudDSLengthOfTime.SetRCode(clsDSDryPeriodTenFunction, bReset) End Sub - Private Sub TestOKEnabled() - If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso nudThreshold.Text <> "" AndAlso nudFrom.Text <> "" AndAlso nudTo.Text <> "" AndAlso ((chkConsecutiveRainyDays.Checked AndAlso nudRDMinimum.Text <> "" AndAlso nudRDOutOfDays.Text <> "") OrElse Not chkConsecutiveRainyDays.Checked) AndAlso (((chkTotalRainfall.Checked AndAlso nudTROverDays.Text <> "") AndAlso ((rdoTRAmount.Checked AndAlso nudTRAmount.Text <> "") OrElse (rdoTRPercentile.Checked AndAlso nudTRPercentile.Text <> ""))) OrElse Not chkTotalRainfall.Checked) AndAlso ((chkDrySpell.Checked AndAlso nudDSMaximumDays.Text <> "" AndAlso nudDSLengthofTime.Text <> "") OrElse Not chkDrySpell.Checked) AndAlso ((chkDryPeriod.Checked AndAlso nudDPMaxRain.Text <> "" AndAlso nudDPRainPeriod.Text <> "" AndAlso nudDPOverallInterval.Text <> "") OrElse Not chkDryPeriod.Checked) Then - ucrBase.OKEnabled(True) + Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk + frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining Date column as key") + + clsDayFromAndTo.SetAssignTo("Day_From_and_To") + clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) + + clsGroupBy.SetAssignTo("Grouping") + + clsRainyDays.AddParameter("function_exp", Chr(34) & clsRainyDaysFunction.ToScript & Chr(34)) + If ucrChkTotalRainfall.Checked Then + TotalRainfall() + clsTRRollingSum.SetAssignTo("rolling_sum_day") + clsTRRollingSum.AddParameter("function_exp", Chr(34) & clsTRRollingSumFunction.ToScript & Chr(34)) + clsTRWetSpell.SetAssignTo("Wet_Spell") + + 'if quantile checked + clsTRWetSpell.AddParameter("function_exp", Chr(34) & clsTRWetSpellFunction.ToScript & Chr(34), iPosition:=1) + End If + + If ucrChkNumberOfRainyDays.Checked Then + TotalRainyDays() + clsRDRollingRainDays.SetAssignTo("Rolling_rain") + End If + + If chkDrySpell.Checked Then + clsDSDrySpell.SetAssignTo("Dry_Spell") + clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") + End If + End Sub + + Private Sub RainDays() + clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")", iPosition:=5) ' is that meant to be True? + End Sub + + Private Sub DayBoundaries() + clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + End Sub + + Private Sub TotalRainfall() + clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=0) + ' if quantiles checked: + clsTRWetSpellList.AddParameter("sub1", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) + End Sub + + Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged + DayBoundaries() + ' clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) + ' clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + End Sub + + Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged + ' does this update if I change the data name? + If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") Else - ucrBase.OKEnabled(False) + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") End If + ' clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) + ' clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) + clsManipulationFirstDOYPerYear.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) + End Sub + + Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForStartofRains.ControlContentsChanged + strCurrDataName = Chr(34) & ucrSelectorForStartofRains.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) + End Sub + + Private Sub TotalRainyDays() + clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) + clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) + + End Sub + + Private Sub DrySpell() + clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub, iPosition:=4) + clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) + clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList, iPosition:=5) + clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) + End Sub + + Private Sub ucrReceiverDOY_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDOY.SelectionChanged + firstDayofTheYear() + FirstDOYPerYear() + TestOKEnabled() + End Sub + + Private Sub ucrSelectorForStartofRains_DataFrameChanged() Handles ucrSelectorForStartofRains.DataFrameChanged + strCurrDataName = Chr(34) & ucrSelectorForStartofRains.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) + clsAddKey.AddParameter("data_name", strCurrDataName) + firstDayofTheYear() + End Sub + + Private Sub ReopenDialog() + + End Sub + + Private Sub TestOKEnabled() + 'If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.Text <> "" AndAlso ucrNudFrom.Text = "" AndAlso ucrNudTo.Text = "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.Text <> "" AndAlso ucrNudRDOutOfDays.Text <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso Not ucrNudTROverDays.GetText = "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.Text <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.Text = ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((chkDrySpell.Checked AndAlso nudDSMaximumDays.Text <> "" AndAlso ucrNudDSLengthOfTime.Text <> "") OrElse Not chkDrySpell.Checked) AndAlso ((chkDryPeriod.Checked AndAlso nudDPMaxRain.Text <> "" AndAlso nudDPRainPeriod.Text <> "" AndAlso nudDPOverallInterval.Text <> "") OrElse Not chkDryPeriod.Checked) Then + ' ucrBase.OKEnabled(True) + 'Else + ' ucrBase.OKEnabled(False) + 'End If End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() End Sub - Private Sub grpRainParameters_Enter(sender As Object, e As EventArgs) Handles nudFrom.TextChanged, nudTo.TextChanged, nudThreshold.TextChanged - DayFromAndToMethod() + Private Sub grpRainParameters_Enter(sender As Object, e As EventArgs) RainyDaysMethod() nudValues() CombinedFilter() @@ -181,7 +475,7 @@ Public Class dlgStartofRains TestOKEnabled() End Sub - Private Sub TotalRainfall(sender As Object, e As EventArgs) Handles nudTROverDays.TextChanged, chkTotalRainfall.CheckedChanged, rdoTRAmount.CheckedChanged, rdoTRPercentile.CheckedChanged + Private Sub TotalRainfall(sender As Object, e As EventArgs) Handles rdoTRAmount.CheckedChanged, rdoTRPercentile.CheckedChanged CheckBoxesSetting() CombinedFilter() RollingSumMethod() @@ -191,12 +485,12 @@ Public Class dlgStartofRains TestOKEnabled() End Sub - Private Sub TotalRainfallNuds(sender As Object, e As EventArgs) Handles nudTRAmount.TextChanged, nudTRPercentile.TextChanged + Private Sub TotalRainfallNuds(sender As Object, e As EventArgs) CombinedFilter() TestOKEnabled() End Sub - Private Sub RainyDays(sender As Object, e As EventArgs) Handles nudRDMinimum.TextChanged, nudRDOutOfDays.TextChanged, chkConsecutiveRainyDays.CheckedChanged + Private Sub RainyDays(sender As Object, e As EventArgs) CheckBoxesSetting() RollingOfRainDays() nudValues() @@ -204,9 +498,9 @@ Public Class dlgStartofRains TestOKEnabled() End Sub - Private Sub DrySpell(sender As Object, e As EventArgs) Handles nudDSLengthofTime.ValueChanged, nudDSMaximumDays.ValueChanged, chkDrySpell.CheckedChanged + Private Sub DrySpell_Spe(sender As Object, e As EventArgs) Handles nudDSMaximumDays.ValueChanged, chkDrySpell.CheckedChanged CheckBoxesSetting() - DrySpell() + DrySpellOld() nudValues() CombinedFilter() TestOKEnabled() @@ -218,7 +512,7 @@ Public Class dlgStartofRains ' DayFromAndToMethod() ' CombinedFilter() ' RollingOfRainDays() - ' DrySpell() + ' DrySpellOld() ' RollingSumMethod() ' TotalRainPercentileWetSpell() ' nudValues() @@ -244,7 +538,6 @@ Public Class dlgStartofRains End Sub Private Sub ucrReceiverYear_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverYear.SelectionChanged - YearGroupDaily() TestOKEnabled() End Sub @@ -254,52 +547,52 @@ Public Class dlgStartofRains End Sub Private Sub CheckBoxesSetting() - If chkTotalRainfall.Checked Then - pnlTotalRainfall.Visible = True - nudTRAmount.Visible = False - nudTRPercentile.Visible = False - If rdoTRAmount.Checked Then - nudTRAmount.Visible = True - nudTRPercentile.Visible = False - ElseIf rdoTRPercentile.Checked Then - nudTRAmount.Visible = False - nudTRPercentile.Visible = True - Else - nudTRAmount.Visible = False - nudTRPercentile.Visible = False - End If - Else - pnlTotalRainfall.Visible = False - End If - If chkDrySpell.Checked Then - pnlDrySpell.Visible = True - Else - pnlDrySpell.Visible = False - End If - If chkConsecutiveRainyDays.Checked Then - pnlConsecutiveRainyDays.Visible = True - Else - pnlConsecutiveRainyDays.Visible = False - End If - If chkDryPeriod.Checked Then - pnlDryPeriod.Visible = True - Else - pnlDryPeriod.Visible = False - End If + 'If chkTotalRainfall.Checked Then + ' pnlTotalRainfall.Visible = True + ' nudTRAmount.Visible = False + ' ' nudTRPercentile.Visible = False + ' If rdoTRAmount.Checked Then + ' nudTRAmount.Visible = True + ' nudTRPercentile.Visible = False + ' ElseIf rdoTRPercentile.Checked Then + ' nudTRAmount.Visible = False + ' nudTRPercentile.Visible = True + ' Else + ' nudTRAmount.Visible = False + ' nudTRPercentile.Visible = False + ' End If + 'Else + ' pnlTotalRainfall.Visible = False + 'End If + 'If chkDrySpell.Checked Then + ' pnlDrySpell.Visible = True + 'Else + ' pnlDrySpell.Visible = False + 'End If + 'If chkConsecutiveRainyDays.Checked Then + ' pnlConsecutiveRainyDays.Visible = True + 'Else + ' pnlConsecutiveRainyDays.Visible = False + 'End If + 'If chkDryPeriod.Checked Then + ' pnlDryPeriod.Visible = True + 'Else + ' pnlDryPeriod.Visible = False + 'End If End Sub ' nud max and mins. Private Sub nudValues() ' nudFrom.Maximum = nudTo.Value - 1 ' nudTo.Minimum = nudFrom.Value + 1 - If chkConsecutiveRainyDays.Checked Then - nudRDMinimum.Maximum = nudRDOutOfDays.Value - 1 - nudRDOutOfDays.Minimum = nudRDMinimum.Value + 1 - End If - If chkDrySpell.Checked Then - nudDSMaximumDays.Maximum = nudDSLengthofTime.Value - 1 - nudDSLengthofTime.Minimum = nudDSMaximumDays.Value + 1 - End If + 'If chkConsecutiveRainyDays.Checked Then + ' nudRDMinimum.Maximum = nudRDOutOfDays.Value - 1 + ' nudRDOutOfDays.Minimum = nudRDMinimum.Value + 1 + 'End If + 'If chkDrySpell.Checked Then + ' nudDSMaximumDays.Maximum = nudDSLengthofTime.Value - 1 + ' nudDSLengthofTime.Minimum = nudDSMaximumDays.Value + 1 + 'End If If chkDryPeriod.Checked Then nudDPRainPeriod.Maximum = nudDPOverallInterval.Value - 1 nudDPOverallInterval.Minimum = nudDPRainPeriod.Value + 1 @@ -314,107 +607,90 @@ Public Class dlgStartofRains End If End Sub - Private Sub DayFromAndToMethod() - If nudFrom.Text <> "" AndAlso nudTo.Text <> "" AndAlso (Not ucrReceiverDOY.IsEmpty) Then - clsDayFromAndTo.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & ">=" & nudFrom.Value & " & " & ucrReceiverDOY.GetVariableNames(False) & "<=" & nudTo.Value & Chr(34)) - clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34)) - Else - clsDayFromAndTo.RemoveParameterByName("function_exp") - clsDayFromAndTo.RemoveParameterByName("calculated_from") - End If - End Sub - Private Sub RainyDaysMethod() - If ((Not ucrReceiverRainfall.IsEmpty) AndAlso (nudThreshold.Text <> "")) Then - clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudThreshold.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) - clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34)) - clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")") - clsRainyDays.AddParameter("save", 0) + If ((Not ucrReceiverRainfall.IsEmpty) AndAlso (ucrNudThreshold.Text <> "")) Then + 'clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + 'clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudThreshold.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) + 'clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34)) + 'clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")") + 'clsRainyDays.AddParameter("save", 0) ' clsSubRainDays.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - Else - clsRainyDays.RemoveParameterByName("type") - clsRainyDays.RemoveParameterByName("function_exp") - clsRainyDays.RemoveParameterByName("result_name") - clsRainyDays.RemoveParameterByName("calculated_from") - clsRainyDays.RemoveParameterByName("save") End If End Sub Private Sub RollingSumMethod() - If chkTotalRainfall.Checked AndAlso Not ucrReceiverRainfall.IsEmpty Then - clsTRRollingSum.AddParameter("function_exp", Chr(34) & " zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudTROverDays.Value & ", FUN = sum, na.rm = FALSE, align='right', fill=NA)" & Chr(34)) - clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsTRRollingSum.AddParameter("result_name", Chr(34) & "roll_sum_Rain" & Chr(34)) - clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") - clsTRRollingSum.AddParameter("save", 0) - Else - clsTRRollingSum.RemoveParameterByName("function_exp") - clsTRRollingSum.RemoveParameterByName("type") - clsTRRollingSum.RemoveParameterByName("result_name") - clsTRRollingSum.RemoveParameterByName("calculated_from") - clsTRRollingSum.RemoveParameterByName("save") - End If + 'If chkTotalRainfall.Checked AndAlso Not ucrReceiverRainfall.IsEmpty Then + ' clsTRRollingSum.AddParameter("function_exp", Chr(34) & " zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudTROverDays.Value & ", FUN = sum, na.rm = FALSE, align='right', fill=NA)" & Chr(34)) + ' clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' clsTRRollingSum.AddParameter("result_name", Chr(34) & "roll_sum_Rain" & Chr(34)) + ' clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") + ' clsTRRollingSum.AddParameter("save", 0) + 'Else + ' clsTRRollingSum.RemoveParameterByName("function_exp") + ' clsTRRollingSum.RemoveParameterByName("type") + ' clsTRRollingSum.RemoveParameterByName("result_name") + ' clsTRRollingSum.RemoveParameterByName("calculated_from") + ' clsTRRollingSum.RemoveParameterByName("save") + 'End If End Sub ' If we have 'Percentile' checked Private Sub TotalRainPercentileWetSpell() - If rdoTRPercentile.Checked Then - clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsTRWetSpell.AddParameter("function_exp", Chr(34) & "quantile(roll_sum_Rain, c(" & nudTRPercentile.Value & "), na.rm=T)" & Chr(34)) - clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34)) - clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList) - clsTRWetSpellList.AddParameter("sub1", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) - clsTRWetSpell.AddParameter("save", "0") - Else - clsTRWetSpell.RemoveParameterByName("type") - clsTRWetSpell.RemoveParameterByName("function_exp") - clsTRWetSpell.RemoveParameterByName("result_name") - clsTRWetSpell.RemoveParameterByName("sub_calculations") - clsTRWetSpellList.RemoveParameterByName("sub1") - clsTRWetSpell.RemoveParameterByName("save") - End If + 'If rdoTRPercentile.Checked Then + ' clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' clsTRWetSpell.AddParameter("function_exp", Chr(34) & "quantile(roll_sum_Rain, c(" & nudTRPercentile.Value & "), na.rm=T)" & Chr(34)) + ' clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34)) + ' clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList) + ' clsTRWetSpellList.AddParameter("sub1", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) + ' clsTRWetSpell.AddParameter("save", "0") + 'Else + ' clsTRWetSpell.RemoveParameterByName("type") + ' clsTRWetSpell.RemoveParameterByName("function_exp") + ' clsTRWetSpell.RemoveParameterByName("result_name") + ' clsTRWetSpell.RemoveParameterByName("sub_calculations") + ' clsTRWetSpellList.RemoveParameterByName("sub1") + ' clsTRWetSpell.RemoveParameterByName("save") + 'End If End Sub Private Sub RollingOfRainDays() - ' If rolling of rain days one is checked Then - clsRDRollingRainDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data=rain_day, width = " & nudRDOutOfDays.Value & ", FUN = sum, na.rm = FALSE, align = 'right', fill=NA)" & Chr(34)) - clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34)) - clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubRDRainDays1) - clsSubRDRainDays1.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - clsRDRollingRainDays.AddParameter("save", 0) - End Sub - - Private Sub DrySpell() - If chkDrySpell.Checked Then - clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34)) - clsDSDrySpell.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) - clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubDSRainDays2) - clsSubDSRainDays2.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - clsDSDrySpell.AddParameter("save", 0) - clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Dry_Spell, width=" & nudDSLengthofTime.Value & ", FUN=max, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) - clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList) - clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) - clsDSDryPeriodTen.AddParameter("save", 2) - Else - clsDSDrySpell.RemoveParameterByName("type") - clsDSDrySpell.RemoveParameterByName("function_exp") - clsDSDrySpell.RemoveParameterByName("result_name") - clsDSDrySpell.RemoveParameterByName("sub_calculations") - clsSubDSRainDays2.RemoveParameterByName("sub1") - clsDSDrySpell.RemoveParameterByName("save") - clsDSDryPeriodTen.RemoveParameterByName("type") - clsDSDryPeriodTen.RemoveParameterByName("function_exp") - clsDSDryPeriodTen.RemoveParameterByName("sub_calculations") - clsDSDryPeriodTen.RemoveParameterByName("result_name") - clsDSDryPeriodTen.RemoveParameterByName("save") - clsDSDryPeriodTenList.RemoveParameterByName("sub1") - End If + ' ' If rolling of rain days one is checked Then + 'clsRDRollingRainDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + 'clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data=rain_day, width = " & nudRDOutOfDays.Value & ", FUN = sum, na.rm = FALSE, align = 'right', fill=NA)" & Chr(34)) + 'clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34)) + 'clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) + 'clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) + 'clsRDRollingRainDays.AddParameter("save", 0) + End Sub + + Private Sub DrySpellOld() + 'If chkDrySpell.Checked Then + ' clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34)) + ' clsDSDrySpell.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) + ' clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub) + ' clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) + ' clsDSDrySpell.AddParameter("save", 0) + ' clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Dry_Spell, width=" & ucrNudDSLengthOfTime.Value & ", FUN=max, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) + ' clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) + ' clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList) + ' clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) + ' clsDSDryPeriodTen.AddParameter("save", 2) + 'Else + ' clsDSDrySpell.RemoveParameterByName("type") + ' clsDSDrySpell.RemoveParameterByName("function_exp") + ' clsDSDrySpell.RemoveParameterByName("result_name") + ' clsDSDrySpell.RemoveParameterByName("sub_calculations") + ' clsDSDrySpellSub.RemoveParameterByName("sub1") + ' clsDSDrySpell.RemoveParameterByName("save") + ' clsDSDryPeriodTen.RemoveParameterByName("type") + ' clsDSDryPeriodTen.RemoveParameterByName("function_exp") + ' clsDSDryPeriodTen.RemoveParameterByName("sub_calculations") + ' clsDSDryPeriodTen.RemoveParameterByName("result_name") + ' clsDSDryPeriodTen.RemoveParameterByName("save") + ' clsDSDryPeriodTenList.RemoveParameterByName("sub1") + 'End If End Sub Private Sub DryPeriod() @@ -466,10 +742,10 @@ Public Class dlgStartofRains clsCombinedFilter.RemoveParameterByName("function_exp") - If chkTotalRainfall.Checked Then + If ucrChkTotalRainfall.Checked Then strTempFunExpression = strTempFunExpression & "roll_sum_Rain > " If rdoTRAmount.Checked Then - strTempFunExpression = strTempFunExpression & nudTRAmount.Value + strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value clsCombinedList.RemoveParameterByName("sub4") ElseIf rdoTRPercentile.Checked Then strTempFunExpression = strTempFunExpression & "wet_spell" @@ -480,8 +756,8 @@ Public Class dlgStartofRains Else clsCombinedList.RemoveParameterByName("sub3") End If - If chkConsecutiveRainyDays.Checked Then - strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & nudRDMinimum.Value & " & " + If ucrChkNumberOfRainyDays.Checked Then + strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & ucrNudRDMinimumDays.Value & " & " clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) Else clsCombinedList.RemoveParameterByName("sub2") @@ -499,7 +775,7 @@ Public Class dlgStartofRains clsCombinedList.RemoveParameterByName("sub5") End If - strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudThreshold.Value & Chr(34) + strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) End Sub @@ -509,7 +785,6 @@ Public Class dlgStartofRains If Not ucrReceiverDOY.IsEmpty Then clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) - clsManipulationFirstDOYPerYear.AddParameter("sub2", clsRFunctionParameter:=clsYearGroupDaily, bIncludeArgumentName:=False) clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) @@ -530,19 +805,10 @@ Public Class dlgStartofRains End If End Sub - Private Sub YearGroupDaily() - clsYearGroupDaily.AddParameter("type", Chr(34) & "by" & Chr(34)) - clsYearGroupDaily.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") - End Sub - Private Sub firstDayofTheYear() ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) End Sub - Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk - frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining Date column as key") - End Sub - Private Sub ucrSaveStartofRains_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlContentsChanged TestOKEnabled() End Sub From 83b70f32c91fba6bbe212cff95b141e8e40bf0d8 Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Mon, 19 Jun 2017 11:20:43 +0300 Subject: [PATCH 073/201] excluding the minimum value. --- instat/dlgRegularSequence.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index 09f12652d55..ae704175fad 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -48,7 +48,7 @@ Public Class dlgRegularSequence ucrInputInStepsOf.SetParameter(New RParameter("by", 2)) ucrInputInStepsOf.AddQuotesIfUnrecognised = False - ucrInputInStepsOf.SetValidationTypeAsNumeric(dcmMin:=0) + ucrInputInStepsOf.SetValidationTypeAsNumeric(dcmMin:=0, bIncludeMin:=False) ucrNudRepeatValues.SetParameter(New RParameter("each", 1)) ucrNudRepeatValues.SetMinMax(1, Integer.MaxValue) @@ -142,7 +142,7 @@ Public Class dlgRegularSequence ucrBase.OKEnabled(False) End If Else - ucrBase.OKEnabled(False) + ucrBase.OKEnabled(False) End If End Sub From 8e08a80901665ce89c8c775d19a95f0e1359d94a Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Mon, 19 Jun 2017 11:42:44 +0300 Subject: [PATCH 074/201] Resetting tabs --- instat/dlgScatterPlot.vb | 3 ++- instat/sdgLayerOptions.vb | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/instat/dlgScatterPlot.vb b/instat/dlgScatterPlot.vb index e7f9e6e905f..109cfd37e00 100644 --- a/instat/dlgScatterPlot.vb +++ b/instat/dlgScatterPlot.vb @@ -175,9 +175,10 @@ Public Class dlgScatterPlot Private Sub cmdScatterPlotOptions_Click(sender As Object, e As EventArgs) Handles cmdScatterPlotOptions.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) + sdgLayerOptions.SetupLayer(clsNewGgPlot:=clsRggplotFunction, clsNewGeomFunc:=clsRScatterGeomFunction, clsNewGlobalAesFunc:=clsRaesFunction, clsNewLocalAes:=clsLocalRaesFunction, bFixGeom:=True, ucrNewBaseSelector:=ucrSelectorForScatter, bApplyAesGlobally:=True, bReset:=bResetSubdialog) 'Coming from the sdgLayerOptions, clsRaesFunction and others has been modified. One then needs to display these modifications on the dlgScatteredPlot. sdgLayerOptions.ShowDialog() + bResetSubdialog = False 'The aesthetics parameters on the main dialog are repopulated as required. For Each clsParam In clsRaesFunction.clsParameters If clsParam.strArgumentName = "x" Then diff --git a/instat/sdgLayerOptions.vb b/instat/sdgLayerOptions.vb index aed26884211..69c53121c3c 100644 --- a/instat/sdgLayerOptions.vb +++ b/instat/sdgLayerOptions.vb @@ -52,8 +52,11 @@ Public Class sdgLayerOptions End Sub Public Sub SetupLayer(clsNewGgPlot As RFunction, clsNewGeomFunc As RFunction, clsNewGlobalAesFunc As RFunction, clsNewLocalAes As RFunction, Optional bFixGeom As Boolean = False, Optional ucrNewBaseSelector As ucrSelector = Nothing, Optional bApplyAesGlobally As Boolean = True, Optional iNumVariablesForGeoms As Integer = -1, Optional bReset As Boolean = False, Optional iTabToDisplay As Integer = 0, Optional strDataFrame As String = "") - If iTabToDisplay > 0 AndAlso iTabToDisplay <= tbcLayers.TabCount - 1 Then - tbcLayers.SelectedIndex = iTabToDisplay + 'If iTabToDisplay > 0 AndAlso iTabToDisplay <= tbcLayers.TabCount - 1 Then + ' tbcLayers.SelectedIndex = iTabToDisplay + 'End If + If bReset Then + tbcLayers.SelectedIndex = 0 End If clsGeomFunction = clsNewGeomFunc clsAesFunction = clsNewGlobalAesFunc From a5e65b95120aa7d0eab99cc60cd3998ad7e23541 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Mon, 19 Jun 2017 12:03:09 +0300 Subject: [PATCH 075/201] tabs --- instat/dlgScatterPlot.vb | 2 +- instat/sdgLayerOptions.vb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/instat/dlgScatterPlot.vb b/instat/dlgScatterPlot.vb index b1dd7c15ffa..bd9b9f3323c 100644 --- a/instat/dlgScatterPlot.vb +++ b/instat/dlgScatterPlot.vb @@ -178,7 +178,7 @@ Public Class dlgScatterPlot Private Sub cmdScatterPlotOptions_Click(sender As Object, e As EventArgs) Handles cmdScatterPlotOptions.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:=bResetSubdialog) + sdgLayerOptions.SetupLayer(clsNewGgPlot:=clsRggplotFunction, clsNewGeomFunc:=clsRScatterGeomFunction, clsNewGlobalAesFunc:=clsRaesFunction, clsNewLocalAes:=clsLocalRaesFunction, bFixGeom:=True, ucrNewBaseSelector:=ucrSelectorForScatter, bApplyAesGlobally:=True, bReset:=bResetSubdialog, iTabToDisplay:=0) 'Coming from the sdgLayerOptions, clsRaesFunction and others has been modified. One then needs to display these modifications on the dlgScatteredPlot. sdgLayerOptions.ShowDialog() bResetSubdialog = False diff --git a/instat/sdgLayerOptions.vb b/instat/sdgLayerOptions.vb index 69c53121c3c..2cafd9ad619 100644 --- a/instat/sdgLayerOptions.vb +++ b/instat/sdgLayerOptions.vb @@ -52,9 +52,9 @@ Public Class sdgLayerOptions End Sub Public Sub SetupLayer(clsNewGgPlot As RFunction, clsNewGeomFunc As RFunction, clsNewGlobalAesFunc As RFunction, clsNewLocalAes As RFunction, Optional bFixGeom As Boolean = False, Optional ucrNewBaseSelector As ucrSelector = Nothing, Optional bApplyAesGlobally As Boolean = True, Optional iNumVariablesForGeoms As Integer = -1, Optional bReset As Boolean = False, Optional iTabToDisplay As Integer = 0, Optional strDataFrame As String = "") - 'If iTabToDisplay > 0 AndAlso iTabToDisplay <= tbcLayers.TabCount - 1 Then - ' tbcLayers.SelectedIndex = iTabToDisplay - 'End If + If iTabToDisplay > 0 AndAlso iTabToDisplay <= tbcLayers.TabCount - 1 Then + tbcLayers.SelectedIndex = iTabToDisplay + End If If bReset Then tbcLayers.SelectedIndex = 0 End If From ec2ebd27b843a33ea364d51d98c51b55fe8ac7a2 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Mon, 19 Jun 2017 12:05:09 +0300 Subject: [PATCH 076/201] Deleting unencesary comments --- instat/dlgOptions.vb | 2 -- 1 file changed, 2 deletions(-) diff --git a/instat/dlgOptions.vb b/instat/dlgOptions.vb index 12486d647db..c9c63f6bfbd 100644 --- a/instat/dlgOptions.vb +++ b/instat/dlgOptions.vb @@ -68,8 +68,6 @@ Public Class dlgOptions ucrPnlLanguage.AddRadioButton(rdoEnglish) ucrPnlLanguage.AddRadioButton(rdoSpanish) ucrPnlLanguage.AddRadioButton(rdoFrench) - 'ucrNudDigits.Minimum = 0 - 'ucrNudDigits.Maximum = 22 End Sub Private Sub LoadInstatOptions() From f1377b9bdb8a9ba1599307ab4cb7ed4e3320e712 Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 10:49:36 +0100 Subject: [PATCH 077/201] start of rains update --- instat/dlgStartofRains.Designer.vb | 327 ++++++++++++++--------------- instat/dlgStartofRains.vb | 288 ++++++++++++++++--------- 2 files changed, 351 insertions(+), 264 deletions(-) diff --git a/instat/dlgStartofRains.Designer.vb b/instat/dlgStartofRains.Designer.vb index 1871fdb05f6..7f4b51d4efd 100644 --- a/instat/dlgStartofRains.Designer.vb +++ b/instat/dlgStartofRains.Designer.vb @@ -26,7 +26,6 @@ Partial Class dlgStartofRains Me.grpConditionsForSatrtofRains = New System.Windows.Forms.GroupBox() Me.ucrChkNumberOfRainyDays = New instat.ucrCheck() Me.ucrChkTotalRainfall = New instat.ucrCheck() - Me.pnlTotalRainfall = New System.Windows.Forms.Panel() Me.ucrNudTRAmount = New instat.ucrNud() Me.lblTROverDays = New System.Windows.Forms.Label() Me.ucrNudTROverDays = New instat.ucrNud() @@ -35,24 +34,22 @@ Partial Class dlgStartofRains Me.rdoTRPercentile = New System.Windows.Forms.RadioButton() Me.rdoTRAmount = New System.Windows.Forms.RadioButton() Me.pnlDrySpell = New System.Windows.Forms.Panel() + Me.ucrNudDSMaximumDays = New instat.ucrNud() + Me.ucrNudDSLengthOfTime = New instat.ucrNud() Me.lblDSMaximumDays = New System.Windows.Forms.Label() Me.lblDSLengthofTime = New System.Windows.Forms.Label() - Me.nudDSMaximumDays = New System.Windows.Forms.NumericUpDown() Me.pnlConsecutiveRainyDays = New System.Windows.Forms.Panel() Me.ucrNudRDMinimumDays = New instat.ucrNud() Me.ucrNudRDOutOfDays = New instat.ucrNud() Me.lblRDMinimum = New System.Windows.Forms.Label() Me.lblRDWidth = New System.Windows.Forms.Label() Me.pnlDryPeriod = New System.Windows.Forms.Panel() + Me.ucrNudDPOverallInterval = New instat.ucrNud() Me.lblDPMaxRain = New System.Windows.Forms.Label() + Me.ucrNudDPMaxRain = New instat.ucrNud() Me.lblDPLength = New System.Windows.Forms.Label() - Me.nudDPMaxRain = New System.Windows.Forms.NumericUpDown() - Me.nudDPRainPeriod = New System.Windows.Forms.NumericUpDown() - Me.nudDPOverallInterval = New System.Windows.Forms.NumericUpDown() + Me.ucrNudDPRainPeriod = New instat.ucrNud() Me.lblDPOverallInterval = New System.Windows.Forms.Label() - Me.chkDryPeriod = New System.Windows.Forms.CheckBox() - Me.chkDrySpell = New System.Windows.Forms.CheckBox() - Me.ucrPnlTRCalculateBy = New instat.UcrPanel() Me.grpRainParameters = New System.Windows.Forms.GroupBox() Me.ucrNudThreshold = New instat.ucrNud() Me.ucrNudTo = New instat.ucrNud() @@ -63,25 +60,22 @@ Partial Class dlgStartofRains Me.lblDOY = New System.Windows.Forms.Label() Me.lblDate = New System.Windows.Forms.Label() Me.lblYear = New System.Windows.Forms.Label() + Me.ucrBase = New instat.ucrButtons() + Me.ucrSaveStartofRains = New instat.ucrSave() + Me.lblStation = New System.Windows.Forms.Label() + Me.ucrChkDrySpell = New instat.ucrCheck() + Me.ucrChkDryPeriod = New instat.ucrCheck() + Me.ucrReceiverStation = New instat.ucrReceiverSingle() Me.ucrReceiverYear = New instat.ucrReceiverSingle() Me.ucrReceiverDate = New instat.ucrReceiverSingle() Me.ucrReceiverDOY = New instat.ucrReceiverSingle() + Me.ucrPnlTRCalculateBy = New instat.UcrPanel() Me.ucrReceiverRainfall = New instat.ucrReceiverSingle() Me.ucrSelectorForStartofRains = New instat.ucrSelectorByDataFrameAddRemove() - Me.ucrBase = New instat.ucrButtons() - Me.ucrSaveStartofRains = New instat.ucrSave() - Me.lblStation = New System.Windows.Forms.Label() - Me.ucrReceiverStation = New instat.ucrReceiverSingle() - Me.ucrNudDSLengthOfTime = New instat.ucrNud() Me.grpConditionsForSatrtofRains.SuspendLayout() - Me.pnlTotalRainfall.SuspendLayout() Me.pnlDrySpell.SuspendLayout() - CType(Me.nudDSMaximumDays, System.ComponentModel.ISupportInitialize).BeginInit() Me.pnlConsecutiveRainyDays.SuspendLayout() Me.pnlDryPeriod.SuspendLayout() - CType(Me.nudDPMaxRain, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudDPRainPeriod, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudDPOverallInterval, System.ComponentModel.ISupportInitialize).BeginInit() Me.grpRainParameters.SuspendLayout() Me.SuspendLayout() ' @@ -96,14 +90,20 @@ Partial Class dlgStartofRains ' 'grpConditionsForSatrtofRains ' + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkDryPeriod) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkDrySpell) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblTROverDays) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkNumberOfRainyDays) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudTROverDays) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudTRAmount) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblTRVal) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkTotalRainfall) - Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlTotalRainfall) Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlDrySpell) Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlConsecutiveRainyDays) Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlDryPeriod) - Me.grpConditionsForSatrtofRains.Controls.Add(Me.chkDryPeriod) - Me.grpConditionsForSatrtofRains.Controls.Add(Me.chkDrySpell) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudTRPercentile) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.rdoTRAmount) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.rdoTRPercentile) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrPnlTRCalculateBy) Me.grpConditionsForSatrtofRains.Location = New System.Drawing.Point(9, 238) Me.grpConditionsForSatrtofRains.Name = "grpConditionsForSatrtofRains" @@ -117,36 +117,22 @@ Partial Class dlgStartofRains Me.ucrChkNumberOfRainyDays.Checked = False Me.ucrChkNumberOfRainyDays.Location = New System.Drawing.Point(7, 69) Me.ucrChkNumberOfRainyDays.Name = "ucrChkNumberOfRainyDays" - Me.ucrChkNumberOfRainyDays.Size = New System.Drawing.Size(131, 20) + Me.ucrChkNumberOfRainyDays.Size = New System.Drawing.Size(143, 20) Me.ucrChkNumberOfRainyDays.TabIndex = 10 ' 'ucrChkTotalRainfall ' Me.ucrChkTotalRainfall.Checked = False - Me.ucrChkTotalRainfall.Location = New System.Drawing.Point(7, 19) + Me.ucrChkTotalRainfall.Location = New System.Drawing.Point(7, 22) Me.ucrChkTotalRainfall.Name = "ucrChkTotalRainfall" Me.ucrChkTotalRainfall.Size = New System.Drawing.Size(131, 20) Me.ucrChkTotalRainfall.TabIndex = 8 ' - 'pnlTotalRainfall - ' - Me.pnlTotalRainfall.Controls.Add(Me.ucrNudTRAmount) - Me.pnlTotalRainfall.Controls.Add(Me.lblTROverDays) - Me.pnlTotalRainfall.Controls.Add(Me.ucrNudTROverDays) - Me.pnlTotalRainfall.Controls.Add(Me.ucrNudTRPercentile) - Me.pnlTotalRainfall.Controls.Add(Me.lblTRVal) - Me.pnlTotalRainfall.Controls.Add(Me.rdoTRPercentile) - Me.pnlTotalRainfall.Controls.Add(Me.rdoTRAmount) - Me.pnlTotalRainfall.Location = New System.Drawing.Point(144, 13) - Me.pnlTotalRainfall.Name = "pnlTotalRainfall" - Me.pnlTotalRainfall.Size = New System.Drawing.Size(398, 49) - Me.pnlTotalRainfall.TabIndex = 3 - ' 'ucrNudTRAmount ' Me.ucrNudTRAmount.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudTRAmount.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudTRAmount.Location = New System.Drawing.Point(342, 3) + Me.ucrNudTRAmount.Location = New System.Drawing.Point(503, 17) Me.ucrNudTRAmount.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudTRAmount.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudTRAmount.Name = "ucrNudTRAmount" @@ -157,7 +143,7 @@ Partial Class dlgStartofRains 'lblTROverDays ' Me.lblTROverDays.AutoSize = True - Me.lblTROverDays.Location = New System.Drawing.Point(3, 4) + Me.lblTROverDays.Location = New System.Drawing.Point(142, 19) Me.lblTROverDays.Name = "lblTROverDays" Me.lblTROverDays.Size = New System.Drawing.Size(60, 13) Me.lblTROverDays.TabIndex = 0 @@ -168,7 +154,7 @@ Partial Class dlgStartofRains ' Me.ucrNudTROverDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudTROverDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudTROverDays.Location = New System.Drawing.Point(66, 1) + Me.ucrNudTROverDays.Location = New System.Drawing.Point(206, 17) Me.ucrNudTROverDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudTROverDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudTROverDays.Name = "ucrNudTROverDays" @@ -180,7 +166,7 @@ Partial Class dlgStartofRains ' Me.ucrNudTRPercentile.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudTRPercentile.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudTRPercentile.Location = New System.Drawing.Point(342, 26) + Me.ucrNudTRPercentile.Location = New System.Drawing.Point(503, 40) Me.ucrNudTRPercentile.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudTRPercentile.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudTRPercentile.Name = "ucrNudTRPercentile" @@ -191,7 +177,7 @@ Partial Class dlgStartofRains 'lblTRVal ' Me.lblTRVal.AutoSize = True - Me.lblTRVal.Location = New System.Drawing.Point(128, 6) + Me.lblTRVal.Location = New System.Drawing.Point(283, 21) Me.lblTRVal.Name = "lblTRVal" Me.lblTRVal.Size = New System.Drawing.Size(136, 13) Me.lblTRVal.TabIndex = 2 @@ -200,7 +186,7 @@ Partial Class dlgStartofRains 'rdoTRPercentile ' Me.rdoTRPercentile.AutoSize = True - Me.rdoTRPercentile.Location = New System.Drawing.Point(265, 25) + Me.rdoTRPercentile.Location = New System.Drawing.Point(425, 40) Me.rdoTRPercentile.Name = "rdoTRPercentile" Me.rdoTRPercentile.Size = New System.Drawing.Size(72, 17) Me.rdoTRPercentile.TabIndex = 5 @@ -211,7 +197,7 @@ Partial Class dlgStartofRains 'rdoTRAmount ' Me.rdoTRAmount.AutoSize = True - Me.rdoTRAmount.Location = New System.Drawing.Point(265, 4) + Me.rdoTRAmount.Location = New System.Drawing.Point(425, 19) Me.rdoTRAmount.Name = "rdoTRAmount" Me.rdoTRAmount.Size = New System.Drawing.Size(61, 17) Me.rdoTRAmount.TabIndex = 3 @@ -221,15 +207,39 @@ Partial Class dlgStartofRains ' 'pnlDrySpell ' + Me.pnlDrySpell.Controls.Add(Me.ucrNudDSMaximumDays) Me.pnlDrySpell.Controls.Add(Me.ucrNudDSLengthOfTime) Me.pnlDrySpell.Controls.Add(Me.lblDSMaximumDays) Me.pnlDrySpell.Controls.Add(Me.lblDSLengthofTime) - Me.pnlDrySpell.Controls.Add(Me.nudDSMaximumDays) Me.pnlDrySpell.Location = New System.Drawing.Point(96, 95) Me.pnlDrySpell.Name = "pnlDrySpell" Me.pnlDrySpell.Size = New System.Drawing.Size(421, 24) Me.pnlDrySpell.TabIndex = 5 ' + 'ucrNudDSMaximumDays + ' + Me.ucrNudDSMaximumDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDSMaximumDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDSMaximumDays.Location = New System.Drawing.Point(109, 2) + Me.ucrNudDSMaximumDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDSMaximumDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDSMaximumDays.Name = "ucrNudDSMaximumDays" + Me.ucrNudDSMaximumDays.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDSMaximumDays.TabIndex = 12 + Me.ucrNudDSMaximumDays.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudDSLengthOfTime + ' + Me.ucrNudDSLengthOfTime.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDSLengthOfTime.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDSLengthOfTime.Location = New System.Drawing.Point(291, 3) + Me.ucrNudDSLengthOfTime.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDSLengthOfTime.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDSLengthOfTime.Name = "ucrNudDSLengthOfTime" + Me.ucrNudDSLengthOfTime.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDSLengthOfTime.TabIndex = 11 + Me.ucrNudDSLengthOfTime.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'lblDSMaximumDays ' Me.lblDSMaximumDays.AutoSize = True @@ -248,15 +258,6 @@ Partial Class dlgStartofRains Me.lblDSLengthofTime.TabIndex = 2 Me.lblDSLengthofTime.Text = "Overall Interval Length:" ' - 'nudDSMaximumDays - ' - Me.nudDSMaximumDays.Location = New System.Drawing.Point(113, 3) - Me.nudDSMaximumDays.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudDSMaximumDays.Name = "nudDSMaximumDays" - Me.nudDSMaximumDays.Size = New System.Drawing.Size(47, 20) - Me.nudDSMaximumDays.TabIndex = 1 - Me.nudDSMaximumDays.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' 'pnlConsecutiveRainyDays ' Me.pnlConsecutiveRainyDays.Controls.Add(Me.ucrNudRDMinimumDays) @@ -312,17 +313,29 @@ Partial Class dlgStartofRains ' 'pnlDryPeriod ' + Me.pnlDryPeriod.Controls.Add(Me.ucrNudDPOverallInterval) Me.pnlDryPeriod.Controls.Add(Me.lblDPMaxRain) + Me.pnlDryPeriod.Controls.Add(Me.ucrNudDPMaxRain) Me.pnlDryPeriod.Controls.Add(Me.lblDPLength) - Me.pnlDryPeriod.Controls.Add(Me.nudDPMaxRain) - Me.pnlDryPeriod.Controls.Add(Me.nudDPRainPeriod) - Me.pnlDryPeriod.Controls.Add(Me.nudDPOverallInterval) + Me.pnlDryPeriod.Controls.Add(Me.ucrNudDPRainPeriod) Me.pnlDryPeriod.Controls.Add(Me.lblDPOverallInterval) Me.pnlDryPeriod.Location = New System.Drawing.Point(96, 120) Me.pnlDryPeriod.Name = "pnlDryPeriod" - Me.pnlDryPeriod.Size = New System.Drawing.Size(480, 25) + Me.pnlDryPeriod.Size = New System.Drawing.Size(480, 34) Me.pnlDryPeriod.TabIndex = 7 ' + 'ucrNudDPOverallInterval + ' + Me.ucrNudDPOverallInterval.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPOverallInterval.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDPOverallInterval.Location = New System.Drawing.Point(427, 5) + Me.ucrNudDPOverallInterval.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDPOverallInterval.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPOverallInterval.Name = "ucrNudDPOverallInterval" + Me.ucrNudDPOverallInterval.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDPOverallInterval.TabIndex = 13 + Me.ucrNudDPOverallInterval.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'lblDPMaxRain ' Me.lblDPMaxRain.AutoSize = True @@ -332,6 +345,18 @@ Partial Class dlgStartofRains Me.lblDPMaxRain.TabIndex = 1 Me.lblDPMaxRain.Text = "Maximum Rain:" ' + 'ucrNudDPMaxRain + ' + Me.ucrNudDPMaxRain.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPMaxRain.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDPMaxRain.Location = New System.Drawing.Point(83, 3) + Me.ucrNudDPMaxRain.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDPMaxRain.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPMaxRain.Name = "ucrNudDPMaxRain" + Me.ucrNudDPMaxRain.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDPMaxRain.TabIndex = 15 + Me.ucrNudDPMaxRain.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'lblDPLength ' Me.lblDPLength.AutoSize = True @@ -341,32 +366,17 @@ Partial Class dlgStartofRains Me.lblDPLength.TabIndex = 3 Me.lblDPLength.Text = "Maximum Dry Days:" ' - 'nudDPMaxRain - ' - Me.nudDPMaxRain.Location = New System.Drawing.Point(86, 3) - Me.nudDPMaxRain.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudDPMaxRain.Name = "nudDPMaxRain" - Me.nudDPMaxRain.Size = New System.Drawing.Size(47, 20) - Me.nudDPMaxRain.TabIndex = 2 - Me.nudDPMaxRain.Value = New Decimal(New Integer() {1, 0, 0, 0}) + 'ucrNudDPRainPeriod ' - 'nudDPRainPeriod - ' - Me.nudDPRainPeriod.Location = New System.Drawing.Point(246, 3) - Me.nudDPRainPeriod.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudDPRainPeriod.Name = "nudDPRainPeriod" - Me.nudDPRainPeriod.Size = New System.Drawing.Size(52, 20) - Me.nudDPRainPeriod.TabIndex = 4 - Me.nudDPRainPeriod.Value = New Decimal(New Integer() {1, 0, 0, 0}) - ' - 'nudDPOverallInterval - ' - Me.nudDPOverallInterval.Location = New System.Drawing.Point(422, 4) - Me.nudDPOverallInterval.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudDPOverallInterval.Name = "nudDPOverallInterval" - Me.nudDPOverallInterval.Size = New System.Drawing.Size(52, 20) - Me.nudDPOverallInterval.TabIndex = 0 - Me.nudDPOverallInterval.Value = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDPRainPeriod.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPRainPeriod.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDPRainPeriod.Location = New System.Drawing.Point(245, 3) + Me.ucrNudDPRainPeriod.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDPRainPeriod.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPRainPeriod.Name = "ucrNudDPRainPeriod" + Me.ucrNudDPRainPeriod.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDPRainPeriod.TabIndex = 14 + Me.ucrNudDPRainPeriod.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'lblDPOverallInterval ' @@ -377,33 +387,6 @@ Partial Class dlgStartofRains Me.lblDPOverallInterval.TabIndex = 5 Me.lblDPOverallInterval.Text = "Overall Interval Length:" ' - 'chkDryPeriod - ' - Me.chkDryPeriod.AutoSize = True - Me.chkDryPeriod.Location = New System.Drawing.Point(7, 125) - Me.chkDryPeriod.Name = "chkDryPeriod" - Me.chkDryPeriod.Size = New System.Drawing.Size(75, 17) - Me.chkDryPeriod.TabIndex = 6 - Me.chkDryPeriod.Text = "Dry Period" - Me.chkDryPeriod.UseVisualStyleBackColor = True - ' - 'chkDrySpell - ' - Me.chkDrySpell.AutoSize = True - Me.chkDrySpell.Location = New System.Drawing.Point(7, 98) - Me.chkDrySpell.Name = "chkDrySpell" - Me.chkDrySpell.Size = New System.Drawing.Size(68, 17) - Me.chkDrySpell.TabIndex = 4 - Me.chkDrySpell.Text = "Dry Spell" - Me.chkDrySpell.UseVisualStyleBackColor = True - ' - 'ucrPnlTRCalculateBy - ' - Me.ucrPnlTRCalculateBy.Location = New System.Drawing.Point(408, 13) - Me.ucrPnlTRCalculateBy.Name = "ucrPnlTRCalculateBy" - Me.ucrPnlTRCalculateBy.Size = New System.Drawing.Size(134, 49) - Me.ucrPnlTRCalculateBy.TabIndex = 9 - ' 'grpRainParameters ' Me.grpRainParameters.Controls.Add(Me.ucrNudThreshold) @@ -510,6 +493,57 @@ Partial Class dlgStartofRains Me.lblYear.TabIndex = 5 Me.lblYear.Text = "Year:" ' + 'ucrBase + ' + Me.ucrBase.Location = New System.Drawing.Point(9, 434) + Me.ucrBase.Name = "ucrBase" + Me.ucrBase.Size = New System.Drawing.Size(405, 52) + Me.ucrBase.TabIndex = 11 + ' + 'ucrSaveStartofRains + ' + Me.ucrSaveStartofRains.Location = New System.Drawing.Point(9, 404) + Me.ucrSaveStartofRains.Name = "ucrSaveStartofRains" + Me.ucrSaveStartofRains.Size = New System.Drawing.Size(316, 24) + Me.ucrSaveStartofRains.TabIndex = 12 + ' + 'lblStation + ' + Me.lblStation.AutoSize = True + Me.lblStation.Location = New System.Drawing.Point(419, 28) + Me.lblStation.Name = "lblStation" + Me.lblStation.Size = New System.Drawing.Size(43, 13) + Me.lblStation.TabIndex = 13 + Me.lblStation.Text = "Station:" + ' + 'ucrChkDrySpell + ' + Me.ucrChkDrySpell.Checked = False + Me.ucrChkDrySpell.Location = New System.Drawing.Point(7, 100) + Me.ucrChkDrySpell.Name = "ucrChkDrySpell" + Me.ucrChkDrySpell.Size = New System.Drawing.Size(94, 20) + Me.ucrChkDrySpell.TabIndex = 11 + ' + 'ucrChkDryPeriod + ' + Me.ucrChkDryPeriod.Checked = False + Me.ucrChkDryPeriod.Location = New System.Drawing.Point(7, 126) + Me.ucrChkDryPeriod.Name = "ucrChkDryPeriod" + Me.ucrChkDryPeriod.Size = New System.Drawing.Size(94, 20) + Me.ucrChkDryPeriod.TabIndex = 12 + ' + 'ucrReceiverStation + ' + Me.ucrReceiverStation.frmParent = Me + Me.ucrReceiverStation.Location = New System.Drawing.Point(418, 43) + Me.ucrReceiverStation.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverStation.Name = "ucrReceiverStation" + Me.ucrReceiverStation.Selector = Nothing + Me.ucrReceiverStation.Size = New System.Drawing.Size(143, 20) + Me.ucrReceiverStation.strNcFilePath = "" + Me.ucrReceiverStation.TabIndex = 14 + Me.ucrReceiverStation.ucrSelector = Nothing + ' 'ucrReceiverYear ' Me.ucrReceiverYear.frmParent = Me @@ -546,6 +580,13 @@ Partial Class dlgStartofRains Me.ucrReceiverDOY.TabIndex = 8 Me.ucrReceiverDOY.ucrSelector = Nothing ' + 'ucrPnlTRCalculateBy + ' + Me.ucrPnlTRCalculateBy.Location = New System.Drawing.Point(409, 10) + Me.ucrPnlTRCalculateBy.Name = "ucrPnlTRCalculateBy" + Me.ucrPnlTRCalculateBy.Size = New System.Drawing.Size(165, 50) + Me.ucrPnlTRCalculateBy.TabIndex = 9 + ' 'ucrReceiverRainfall ' Me.ucrReceiverRainfall.frmParent = Me @@ -568,53 +609,6 @@ Partial Class dlgStartofRains Me.ucrSelectorForStartofRains.Size = New System.Drawing.Size(210, 180) Me.ucrSelectorForStartofRains.TabIndex = 0 ' - 'ucrBase - ' - Me.ucrBase.Location = New System.Drawing.Point(9, 434) - Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(405, 52) - Me.ucrBase.TabIndex = 11 - ' - 'ucrSaveStartofRains - ' - Me.ucrSaveStartofRains.Location = New System.Drawing.Point(9, 404) - Me.ucrSaveStartofRains.Name = "ucrSaveStartofRains" - Me.ucrSaveStartofRains.Size = New System.Drawing.Size(316, 24) - Me.ucrSaveStartofRains.TabIndex = 12 - ' - 'lblStation - ' - Me.lblStation.AutoSize = True - Me.lblStation.Location = New System.Drawing.Point(419, 28) - Me.lblStation.Name = "lblStation" - Me.lblStation.Size = New System.Drawing.Size(43, 13) - Me.lblStation.TabIndex = 13 - Me.lblStation.Text = "Station:" - ' - 'ucrReceiverStation - ' - Me.ucrReceiverStation.frmParent = Me - Me.ucrReceiverStation.Location = New System.Drawing.Point(418, 43) - Me.ucrReceiverStation.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverStation.Name = "ucrReceiverStation" - Me.ucrReceiverStation.Selector = Nothing - Me.ucrReceiverStation.Size = New System.Drawing.Size(143, 20) - Me.ucrReceiverStation.strNcFilePath = "" - Me.ucrReceiverStation.TabIndex = 14 - Me.ucrReceiverStation.ucrSelector = Nothing - ' - 'ucrNudDSLengthOfTime - ' - Me.ucrNudDSLengthOfTime.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDSLengthOfTime.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudDSLengthOfTime.Location = New System.Drawing.Point(291, 3) - Me.ucrNudDSLengthOfTime.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudDSLengthOfTime.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDSLengthOfTime.Name = "ucrNudDSLengthOfTime" - Me.ucrNudDSLengthOfTime.Size = New System.Drawing.Size(50, 20) - Me.ucrNudDSLengthOfTime.TabIndex = 11 - Me.ucrNudDSLengthOfTime.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' 'dlgStartofRains ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -644,18 +638,12 @@ Partial Class dlgStartofRains Me.Text = "Start of Rains" Me.grpConditionsForSatrtofRains.ResumeLayout(False) Me.grpConditionsForSatrtofRains.PerformLayout() - Me.pnlTotalRainfall.ResumeLayout(False) - Me.pnlTotalRainfall.PerformLayout() Me.pnlDrySpell.ResumeLayout(False) Me.pnlDrySpell.PerformLayout() - CType(Me.nudDSMaximumDays, System.ComponentModel.ISupportInitialize).EndInit() Me.pnlConsecutiveRainyDays.ResumeLayout(False) Me.pnlConsecutiveRainyDays.PerformLayout() Me.pnlDryPeriod.ResumeLayout(False) Me.pnlDryPeriod.PerformLayout() - CType(Me.nudDPMaxRain, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudDPRainPeriod, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudDPOverallInterval, System.ComponentModel.ISupportInitialize).EndInit() Me.grpRainParameters.ResumeLayout(False) Me.grpRainParameters.PerformLayout() Me.ResumeLayout(False) @@ -668,12 +656,10 @@ Partial Class dlgStartofRains Friend WithEvents ucrReceiverRainfall As ucrReceiverSingle Friend WithEvents lblRainfall As Label Friend WithEvents grpConditionsForSatrtofRains As GroupBox - Friend WithEvents nudDSMaximumDays As NumericUpDown Friend WithEvents lblDSLengthofTime As Label Friend WithEvents lblDSMaximumDays As Label Friend WithEvents lblTRVal As Label Friend WithEvents lblRDMinimum As Label - Friend WithEvents chkDrySpell As CheckBox Friend WithEvents grpRainParameters As GroupBox Friend WithEvents lblFrom As Label Friend WithEvents lblTo As Label @@ -688,17 +674,12 @@ Partial Class dlgStartofRains Friend WithEvents lblYear As Label Friend WithEvents rdoTRPercentile As RadioButton Friend WithEvents rdoTRAmount As RadioButton - Friend WithEvents nudDPOverallInterval As NumericUpDown Friend WithEvents lblDPOverallInterval As Label - Friend WithEvents nudDPRainPeriod As NumericUpDown - Friend WithEvents nudDPMaxRain As NumericUpDown Friend WithEvents lblDPLength As Label Friend WithEvents lblDPMaxRain As Label - Friend WithEvents chkDryPeriod As CheckBox Friend WithEvents pnlConsecutiveRainyDays As Panel Friend WithEvents pnlDryPeriod As Panel Friend WithEvents pnlDrySpell As Panel - Friend WithEvents pnlTotalRainfall As Panel Friend WithEvents ucrSaveStartofRains As ucrSave Friend WithEvents ucrNudTROverDays As ucrNud Friend WithEvents ucrNudTRPercentile As ucrNud @@ -714,4 +695,10 @@ Partial Class dlgStartofRains Friend WithEvents ucrNudThreshold As ucrNud Friend WithEvents ucrChkNumberOfRainyDays As ucrCheck Friend WithEvents ucrNudDSLengthOfTime As ucrNud + Friend WithEvents ucrNudDSMaximumDays As ucrNud + Friend WithEvents ucrNudDPOverallInterval As ucrNud + Friend WithEvents ucrNudDPRainPeriod As ucrNud + Friend WithEvents ucrNudDPMaxRain As ucrNud + Friend WithEvents ucrChkDrySpell As ucrCheck + Friend WithEvents ucrChkDryPeriod As ucrCheck End Class \ No newline at end of file diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index f84b7cf395a..7dd6d6372c8 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -13,6 +13,7 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class dlgStartofRains @@ -25,9 +26,10 @@ Public Class dlgStartofRains Private clsRDRollingRainDays, clsRDRollingRainDaysFunction, clsRDRollingRainDaysSub As New RFunction 'Dry Spell classes Private clsDSDryPeriodTen, clsDSDrySpell, clsDSDryPeriodTenFunctionLead, clsDSDryPeriodTenFunction, clsDSDryPeriodTenList, clsDSDrySpellSub As New RFunction - 'Dry Period classes - Private clsDPOverallInterval, clsDPOverallIntervalList, clsDPRain, clsDPRainList, clsDPRainInDays As New RFunction + Private clsDPOverallInterval, clsDPOverallIntervalList, clsDPRain, clsDPRainList, clsDPRainInDays, clsDPRainInDaysFunctionLead, clsDPRainInDaysFunction, clsDPRainFunction, clsDPOverallIntervalFunction As New RFunction + Private clsDPRainFunctionOperator, clsDPOverallIntervalFunctionOperator, clsDPOverallIntervalFunctionOperatorRight As New ROperator + Private strCurrDataName As String = "" Public bFirstLoad As Boolean = True Private Sub dlgStartofRains_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -77,7 +79,6 @@ Public Class dlgStartofRains ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) ucrReceiverRainfall.bAutoFill = True - 'Days ucrNudFrom.SetParameter(New RParameter("from", 0)) ucrNudFrom.SetMinMax(1, 365) @@ -85,15 +86,17 @@ Public Class dlgStartofRains ucrNudTo.SetParameter(New RParameter("to", 0)) ucrNudTo.SetMinMax(2, 366) + ucrNudThreshold.DecimalPlaces = 2 + 'Total Rainfall ' ucrChkTotalRainfall if not checked then it doesn't run anything - do manually that this runs if checked. ucrChkTotalRainfall.SetText("Total Rainfall") - ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudTROverDays.SetLinkedDisplayControl(lblTROverDays) - ucrNudTROverDays.SetLinkedDisplayControl(lblTRVal) - ucrChkTotalRainfall.AddToLinkedControls(ucrPnlTRCalculateBy, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) - ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) - ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + ucrChkTotalRainfall.AddToLinkedControls(ucrPnlTRCalculateBy, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) ' set up panel correctly! ucrPnlTRCalculateBy.AddRadioButton(rdoTRAmount) @@ -113,28 +116,44 @@ Public Class dlgStartofRains 'Number of Rainy days ' ucrChkTotalRainfall if not checked then it doesn't run anything - ' if checked, then it runs a function: instat_calculation$new TODO: How to do that? + ' if checked, then it runs a function: instat_calculation$new TODO: How to do that? Do manually. ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") - ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) - ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedUpdateFunction:=True) + ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudRDMinimumDays.SetLinkedDisplayControl(lblRDMinimum) ucrNudRDOutOfDays.SetLinkedDisplayControl(lblRDWidth) - ucrNudRDOutOfDays.SetParameter(New RParameter("width", 1)) 'ucrNudRDOutOfDays.SetMinMax(1, 366) what is appropriate here? 'Dry Spell + ucrChkDrySpell.SetText("Dry Spell") + ucrChkDrySpell.AddToLinkedControls(ucrNudDSLengthOfTime, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkDrySpell.AddToLinkedControls(ucrNudDSMaximumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrNudDSLengthOfTime.SetLinkedDisplayControl(lblDSLengthofTime) + ucrNudDSMaximumDays.SetLinkedDisplayControl(lblDSMaximumDays) ucrNudDSLengthOfTime.SetParameter(New RParameter("width", 1)) ' what is a min/max for this + ' Dry Period + ucrChkDryPeriod.SetText("Dry Period") + ucrChkDryPeriod.AddToLinkedControls(ucrNudDPMaxRain, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkDryPeriod.AddToLinkedControls(ucrNudDPOverallInterval, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkDryPeriod.AddToLinkedControls(ucrNudDPRainPeriod, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrNudDPMaxRain.SetLinkedDisplayControl(lblDPMaxRain) + ucrNudDPOverallInterval.SetLinkedDisplayControl(lblDPOverallInterval) + ucrNudDPRainPeriod.SetLinkedDisplayControl(lblDPLength) + ucrNudDPRainPeriod.SetParameter(New RParameter("width", 1)) + ucrNudDPMaxRain.SetParameter(New RParameter("right", 1)) + ucrNudDPOverallInterval.SetParameter(New RParameter("Overall", 0)) + ' minmax? + + 'clsMinimumRainfall.SetRCommand("instat_calculation$new") 'clsMinimumRainfall.SetAssignTo("Minimum_Rainfall") - clsFirstDOYPerYear.SetRCommand("instat_calculation$new") clsFirstDOYPerYear.SetAssignTo("First_doy_per_year") - 'clsWithinThirtyDays.SetRCommand("instat_calculation$new") 'clsWithinThirtyDays.SetAssignTo("dry_spell_10") ucrBase.clsRsyntax.SetFunction(frmMain.clsRLink.strInstatDataObject & "$apply_instat_calculation") @@ -146,16 +165,6 @@ Public Class dlgStartofRains clsCombinedFilter.SetAssignTo("combined_filter") ucrReceiverYear.Selector = ucrSelectorForStartofRains - - clsDPOverallInterval.SetRCommand("instat_calculation$new") - clsDPOverallInterval.SetAssignTo("Overall_Interval") - clsDPRain.SetRCommand("instat_calculation$new") - clsDPRain.SetAssignTo("Above_Threshold") - clsDPRainInDays.SetRCommand("instat_calculation$new") - clsDPRainInDays.SetAssignTo("Rain_Period_Length") - clsDPOverallIntervalList.SetRCommand("list") - clsDPRainList.SetRCommand("list") - ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) ucrReceiverYear.bAutoFill = True @@ -193,6 +202,19 @@ Public Class dlgStartofRains clsDSDrySpellSub = New RFunction clsDSDryPeriodTenFunctionLead = New RFunction + clsDPRainInDays = New RFunction + clsDPRain = New RFunction + clsDPOverallIntervalList = New RFunction + clsDPOverallInterval = New RFunction + clsDPOverallIntervalFunction = New RFunction + clsDPRainInDaysFunctionLead = New RFunction + clsDPRainInDaysFunction = New RFunction + clsDPRainFunction = New RFunction + clsDPRainFunctionOperator = New ROperator + clsDPOverallIntervalFunction = New RFunction + clsDPOverallIntervalFunctionOperator = New ROperator + clsDPOverallIntervalFunctionOperatorRight = New ROperator + ucrReceiverDate.SetMeAsReceiver() ucrSaveStartofRains.Reset() ucrSelectorForStartofRains.Reset() @@ -301,25 +323,80 @@ Public Class dlgStartofRains clsDSDryPeriodTenFunction.AddParameter("width", 30, iPosition:=1) clsDSDryPeriodTenFunction.AddParameter("FUN", "max", iPosition:=2) clsDSDryPeriodTenFunction.AddParameter("na.rm", "FALSE", iPosition:=3) - clsDSDryPeriodTenFunction.AddParameter("align", Chr(39) & "max" & Chr(39), iPosition:=4) + clsDSDryPeriodTenFunction.AddParameter("align", Chr(39) & "left" & Chr(39), iPosition:=4) clsDSDryPeriodTenFunction.AddParameter("fill", "NA", iPosition:=5) clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) clsDSDryPeriodTen.AddParameter("save", 2, iPosition:=6) + 'DRY PERIOD + clsDPOverallInterval.SetRCommand("instat_calculation$new") + clsDPOverallIntervalList.SetRCommand("list") + clsDPRainList.SetRCommand("list") + clsDPRain.SetRCommand("instat_calculation$new") + clsDPRainInDays.SetRCommand("instat_calculation$new") - - chkDrySpell.Checked = False + clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + 'width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) + 'clsDPRainInDays.AddParameter("function_exp", Chr(34) & clsDPRainInDaysFunctionLead.ToScript & Chr(34), iPosition:=2) + clsDPRainInDaysFunctionLead.SetRCommand("lead") ' i assume lead is wanted if it's the NEXT x days. + clsDPRainInDaysFunctionLead.AddParameter("x", clsRFunctionParameter:=clsDPRainInDaysFunction) + clsDPRainInDaysFunction.SetPackageName("zoo") + clsDPRainInDaysFunction.SetRCommand("rollapply") + clsDPRainInDaysFunction.AddParameter("width", 30, iPosition:=1) + clsDPRainInDaysFunction.AddParameter("FUN", "sum", iPosition:=2) + clsDPRainInDaysFunction.AddParameter("na.rm", "FALSE", iPosition:=3) + clsDPRainInDaysFunction.AddParameter("align", Chr(39) & "left" & Chr(39), iPosition:=4) + clsDPRainInDaysFunction.AddParameter("fill", "NA", iPosition:=5) + clsDPRainInDays.AddParameter("result_name", Chr(34) & "Rain_in_Days" & Chr(34), iPosition:=2) ' sub calc running? + clsDPRainInDays.AddParameter("save", "0", iPosition:=6) + + clsDPRain.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + ' clsDPRain.AddParameter("function_exp", Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) + clsDPRain.AddParameter("function_exp", Chr(34) & clsDPRainFunction.ToScript & Chr(34)) + clsDPRainFunction.SetRCommand("match") + clsDPRainFunction.AddParameter("x", clsROperatorParameter:=clsDPRainFunctionOperator) + clsDPRainFunctionOperator.SetOperation("<=") + clsDPRainFunctionOperator.AddParameter("left", "Rain_in_Days", iPosition:=0) + clsDPRainFunctionOperator.AddParameter("right", 40, iPosition:=1) + clsDPRainFunction.AddParameter("table", 1, iPosition:=1) + clsDPRainFunction.AddParameter("nomatch", 0, iPosition:=2) + 'Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) + clsDPRain.AddParameter("result_name", Chr(34) & "Above_Threshold" & Chr(34), iPosition:=1) + clsDPRain.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPRainList, iPosition:=4) + clsDPRain.AddParameter("save", 0, iPosition:=6) + + clsDPRainList.AddParameter("sub1", clsRFunctionParameter:=clsDPRainInDays, bIncludeArgumentName:=False) + clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList, iPosition:=4) + clsDPOverallIntervalList.AddParameter("sub1", clsRFunctionParameter:=clsDPRain, bIncludeArgumentName:=False) + clsDPOverallInterval.AddParameter("function_exp", Chr(34) & clsDPOverallIntervalFunction.ToScript & Chr(34), iPosition:=1) + + clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + 'clsDPOverallInterval.AddParameter("function_exp", Chr(34) & clsDPOverallIntervalFunction.ToScript & Chr(34), iPosition:=1) + clsDPOverallIntervalFunction.SetRCommand("rollapply") + clsDPOverallIntervalFunction.AddParameter("data", "Above_Threshold", iPosition:=0) + clsDPOverallIntervalFunction.AddParameter("width", clsROperatorParameter:=clsDPOverallIntervalFunctionOperator, iPosition:=1) + clsDPOverallIntervalFunctionOperator.SetOperation("-") + clsDPOverallIntervalFunctionOperator.AddParameter("Overall", 45, iPosition:=0) + clsDPOverallIntervalFunctionOperator.AddParameter("right", clsROperatorParameter:=clsDPOverallIntervalFunctionOperatorRight, iPosition:=1) + clsDPOverallIntervalFunctionOperatorRight.SetOperation("+") + clsDPOverallIntervalFunctionOperatorRight.AddParameter("Rain", 30, iPosition:=0) + clsDPOverallIntervalFunctionOperatorRight.AddParameter("1", 1, iPosition:=1) + clsDPOverallIntervalFunction.AddParameter("FUN", "sum", iPosition:=2) + clsDPOverallIntervalFunction.AddParameter("na.rm", "FALSE", iPosition:=3) + clsDPOverallIntervalFunction.AddParameter("align", Chr(39) & "left" & Chr(39), iPosition:=4) + clsDPOverallIntervalFunction.AddParameter("fill", "NA", iPosition:=5) + clsDPOverallInterval.AddParameter("result_name", Chr(34) & "DP_Overall_Interval_Rain" & Chr(34), iPosition:=2) + clsDPOverallInterval.AddParameter("save", "2", iPosition:=6) + + + ucrChkDrySpell.Checked = False ucrChkTotalRainfall.Checked = False - chkDryPeriod.Checked = False + ucrChkDryPeriod.Checked = False CheckBoxesSetting() TestOKEnabled() ucrNudTRAmount.Value = 20 - ' nudRDMinimum.Value = 1 - nudDSMaximumDays.Value = 10 + ucrNudDSMaximumDays.Value = 10 rdoTRAmount.Checked = True - nudDPMaxRain.Value = 40 - nudDPRainPeriod.Value = 30 - nudDPOverallInterval.Value = 45 'DefaultNudValue() End Sub @@ -333,6 +410,7 @@ Public Class dlgStartofRains Private Sub SetRCodeForControls(bReset As Boolean) ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("doy", 0), iAdditionalPairNo:=1) ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRainyDaysOperator, New RParameter("Rain", 1), iAdditionalPairNo:=1) + ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsDPRainInDaysFunction, New RParameter("data", 0), iAdditionalPairNo:=2) ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) @@ -352,10 +430,16 @@ Public Class dlgStartofRains 'DrySpell ucrNudDSLengthOfTime.SetRCode(clsDSDryPeriodTenFunction, bReset) + + 'DryPeriod + ucrNudDPRainPeriod.AddAdditionalCodeParameterPair(clsDPOverallIntervalFunctionOperatorRight, New RParameter("Rain", 0), iAdditionalPairNo:=1) + ucrNudDPRainPeriod.SetRCode(clsDPRainInDaysFunction, bReset) + ucrNudDPMaxRain.SetRCode(clsDPRainFunctionOperator, bReset) + ucrNudDPOverallInterval.SetRCode(clsDPOverallIntervalFunctionOperator, bReset) End Sub Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk - frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining Date column as key") + frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining column(s) as key") clsDayFromAndTo.SetAssignTo("Day_From_and_To") clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) @@ -378,10 +462,18 @@ Public Class dlgStartofRains clsRDRollingRainDays.SetAssignTo("Rolling_rain") End If - If chkDrySpell.Checked Then + If ucrChkDrySpell.Checked Then clsDSDrySpell.SetAssignTo("Dry_Spell") clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") End If + + If ucrChkDryPeriod.Checked Then + clsDPOverallInterval.SetAssignTo("Overall_Interval") + clsDPRainInDays.SetAssignTo("Rain_Period_Length") + clsDPRain.SetAssignTo("Above_Threshold") + clsDPRainInDays.AddParameter("function_exp", Chr(34) & clsDPRainInDaysFunctionLead.ToScript & Chr(34), iPosition:=2) + clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") + End If End Sub Private Sub RainDays() @@ -433,6 +525,14 @@ Public Class dlgStartofRains clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) End Sub + Private Sub DryPeriod() + clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=5) + End Sub + + + + + Private Sub ucrReceiverDOY_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDOY.SelectionChanged firstDayofTheYear() FirstDOYPerYear() @@ -455,7 +555,7 @@ Public Class dlgStartofRains 'Else ' ucrBase.OKEnabled(False) 'End If - End Sub + End Sub ' ucrNudDPRainPeriod, ucrNudDPMaxRain, ucrNudDPOverallInterval Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() @@ -468,9 +568,9 @@ Public Class dlgStartofRains TestOKEnabled() End Sub - Private Sub DryPeriod(sender As Object, e As EventArgs) Handles nudDPRainPeriod.TextChanged, nudDPOverallInterval.TextChanged, nudDPMaxRain.TextChanged, chkDryPeriod.CheckedChanged + Private Sub DryPeriod(sender As Object, e As EventArgs) CheckBoxesSetting() - DryPeriod() + DryPeriodOld() nudValues() TestOKEnabled() End Sub @@ -498,7 +598,7 @@ Public Class dlgStartofRains TestOKEnabled() End Sub - Private Sub DrySpell_Spe(sender As Object, e As EventArgs) Handles nudDSMaximumDays.ValueChanged, chkDrySpell.CheckedChanged + Private Sub DrySpell_Spe(sender As Object, e As EventArgs) CheckBoxesSetting() DrySpellOld() nudValues() @@ -533,7 +633,7 @@ Public Class dlgStartofRains Private Sub ucrReceiverRainfall_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverRainfall.SelectionChanged RainyDaysMethod() RollingSumMethod() - DryPeriod() + DryPeriodOld() TestOKEnabled() End Sub @@ -542,7 +642,7 @@ Public Class dlgStartofRains End Sub Private Sub ucrReceiverDate_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDate.SelectionChanged - AddKeyMethod() + 'AddKeyMethod() TestOKEnabled() End Sub @@ -593,19 +693,19 @@ Public Class dlgStartofRains ' nudDSMaximumDays.Maximum = nudDSLengthofTime.Value - 1 ' nudDSLengthofTime.Minimum = nudDSMaximumDays.Value + 1 'End If - If chkDryPeriod.Checked Then - nudDPRainPeriod.Maximum = nudDPOverallInterval.Value - 1 - nudDPOverallInterval.Minimum = nudDPRainPeriod.Value + 1 - End If + 'If chkDryPeriod.Checked Then + ' nudDPRainPeriod.Maximum = nudDPOverallInterval.Value - 1 + ' nudDPOverallInterval.Minimum = nudDPRainPeriod.Value + 1 + 'End If End Sub - Private Sub AddKeyMethod() - If Not ucrReceiverDate.IsEmpty Then - clsAddKey.AddParameter("col_name", ucrReceiverDate.GetVariableNames) - Else - clsAddKey.RemoveParameterByName("col_name") - End If - End Sub + 'Private Sub AddKeyMethod() + ' If Not ucrReceiverDate.IsEmpty Then + ' clsAddKey.AddParameter("col_name", ucrReceiverDate.GetVariableNames) + ' Else + ' clsAddKey.RemoveParameterByName("col_name") + ' End If + 'End Sub Private Sub RainyDaysMethod() If ((Not ucrReceiverRainfall.IsEmpty) AndAlso (ucrNudThreshold.Text <> "")) Then @@ -693,45 +793,45 @@ Public Class dlgStartofRains 'End If End Sub - Private Sub DryPeriod() - If chkDryPeriod.Checked Then - clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsDPRainInDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - clsDPRainInDays.AddParameter("result_name", Chr(34) & "Rain_in_Days" & Chr(34)) - clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") - clsDPRainInDays.AddParameter("save", "0") - - clsDPRain.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsDPRain.AddParameter("function_exp", Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) - clsDPRain.AddParameter("result_name", Chr(34) & "Above_Threshold" & Chr(34)) - clsDPRain.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPRainList) - clsDPRainList.AddParameter("sub1", clsRFunctionParameter:=clsDPRainInDays, bIncludeArgumentName:=False) - clsDPRain.AddParameter("save", 0) - - clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - clsDPOverallInterval.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Above_Threshold ,width = (" & nudDPOverallInterval.Value & "-" & nudDPRainPeriod.Value & "+ 1), FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - clsDPOverallInterval.AddParameter("result_name", Chr(34) & "DP_Overall_Interval_Rain" & Chr(34)) - clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList) - clsDPOverallIntervalList.AddParameter("sub1", clsRFunctionParameter:=clsDPRain, bIncludeArgumentName:=False) - clsDPOverallInterval.AddParameter("save", "2") - Else - clsDPRainInDays.RemoveParameterByName("type") - clsDPRainInDays.RemoveParameterByName("function_exp") - clsDPRainInDays.RemoveParameterByName("result_name") - clsDPRainInDays.RemoveParameterByName("calculated_from") - clsDPRainInDays.RemoveParameterByName("save") - clsDPRain.RemoveParameterByName("type") - clsDPRain.RemoveParameterByName("function_exp") - clsDPRain.RemoveParameterByName("result_name") - clsDPRain.RemoveParameterByName("sub_calculations") - clsDPRainList.RemoveParameterByName("sub1") - clsDPRain.RemoveParameterByName("save") - clsDPOverallInterval.RemoveParameterByName("type") - clsDPOverallInterval.RemoveParameterByName("function_exp") - clsDPOverallInterval.RemoveParameterByName("result_name") - clsDPOverallInterval.RemoveParameterByName("sub_calculations") - clsDPOverallInterval.RemoveParameterByName("sub1") - clsDPOverallInterval.RemoveParameterByName("save") + Private Sub DryPeriodOld() + If ucrChkDryPeriod.Checked Then + ' clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' clsDPRainInDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) + ' clsDPRainInDays.AddParameter("result_name", Chr(34) & "Rain_in_Days" & Chr(34)) + ' clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") + ' clsDPRainInDays.AddParameter("save", "0") + + ' clsDPRain.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' clsDPRain.AddParameter("function_exp", Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) + ' clsDPRain.AddParameter("result_name", Chr(34) & "Above_Threshold" & Chr(34)) + ' clsDPRain.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPRainList) + ' clsDPRainList.AddParameter("sub1", clsRFunctionParameter:=clsDPRainInDays, bIncludeArgumentName:=False) + ' clsDPRain.AddParameter("save", 0) + + ' clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' clsDPOverallInterval.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Above_Threshold ,width = (" & nudDPOverallInterval.Value & "-" & nudDPRainPeriod.Value & "+ 1), FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) + ' clsDPOverallInterval.AddParameter("result_name", Chr(34) & "DP_Overall_Interval_Rain" & Chr(34)) + ' clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList) + ' clsDPOverallIntervalList.AddParameter("sub1", clsRFunctionParameter:=clsDPRain, bIncludeArgumentName:=False) + ' clsDPOverallInterval.AddParameter("save", "2") + 'Else + ' clsDPRainInDays.RemoveParameterByName("type") + ' clsDPRainInDays.RemoveParameterByName("function_exp") + ' clsDPRainInDays.RemoveParameterByName("result_name") + ' clsDPRainInDays.RemoveParameterByName("calculated_from") + ' clsDPRainInDays.RemoveParameterByName("save") + ' clsDPRain.RemoveParameterByName("type") + ' clsDPRain.RemoveParameterByName("function_exp") + ' clsDPRain.RemoveParameterByName("result_name") + ' clsDPRain.RemoveParameterByName("sub_calculations") + ' clsDPRainList.RemoveParameterByName("sub1") + ' clsDPRain.RemoveParameterByName("save") + ' clsDPOverallInterval.RemoveParameterByName("type") + ' clsDPOverallInterval.RemoveParameterByName("function_exp") + ' clsDPOverallInterval.RemoveParameterByName("result_name") + ' clsDPOverallInterval.RemoveParameterByName("sub_calculations") + ' clsDPOverallInterval.RemoveParameterByName("sub1") + ' clsDPOverallInterval.RemoveParameterByName("save") End If End Sub @@ -762,13 +862,13 @@ Public Class dlgStartofRains Else clsCombinedList.RemoveParameterByName("sub2") End If - If chkDrySpell.Checked Then - strTempFunExpression = strTempFunExpression & "Dry_Spell < " & nudDSMaximumDays.Value & " & " + If ucrChkDrySpell.Checked Then + strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " clsCombinedList.AddParameter("sub1", clsRFunctionParameter:=clsDSDryPeriodTen, bIncludeArgumentName:=False) Else clsCombinedList.RemoveParameterByName("sub1") End If - If chkDryPeriod.Checked Then + If ucrChkDryPeriod.Checked Then strTempFunExpression = strTempFunExpression & "DP_Overall_Interval_Rain == 0 " & " & " clsCombinedList.AddParameter("sub5", clsRFunctionParameter:=clsDPOverallInterval, bIncludeArgumentName:=False) Else From 56e3d9d658ecc6a5e70c8b42aaf56dd9d3e26815 Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 10:51:17 +0100 Subject: [PATCH 078/201] spells fix --- instat/dlgSpells.vb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 4fe1af72ed7..3f05df9cd15 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -342,12 +342,12 @@ Public Class dlgSpells clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub - Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged + Private Sub ucrReceiverDate_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDate.ControlValueChanged, ucrReceiverStation.ControlValueChanged ' does this update if I change the data name? - If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") + If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty Then + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDate.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") Else - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDate.GetVariableNames & ")") End If clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) From 09af0133d9ef5dd954fbb50d7b74531310f8bd1d Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 11:05:26 +0100 Subject: [PATCH 079/201] bug fix --- instat/dlgStartofRains.vb | 42 ++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 7dd6d6372c8..0e28f9d8bf7 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -32,15 +32,20 @@ Public Class dlgStartofRains Private strCurrDataName As String = "" Public bFirstLoad As Boolean = True + Private bReset As Boolean = True + Private Sub dlgStartofRains_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) If bFirstLoad Then InitialiseDialog() - SetDefaults() bFirstLoad = False - Else - ReopenDialog() End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False + autoTranslate(Me) TestOKEnabled() End Sub @@ -496,15 +501,13 @@ Public Class dlgStartofRains ' clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub - Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged + Private Sub ucrReceiverDate_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDate.ControlValueChanged, ucrReceiverStation.ControlValueChanged ' does this update if I change the data name? - If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") + If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty Then + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDate.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") Else - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDate.GetVariableNames & ")") End If - ' clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) - ' clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) clsManipulationFirstDOYPerYear.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) End Sub @@ -515,7 +518,6 @@ Public Class dlgStartofRains Private Sub TotalRainyDays() clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) - End Sub Private Sub DrySpell() @@ -533,6 +535,16 @@ Public Class dlgStartofRains + + + + + + + + + + Private Sub ucrReceiverDOY_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDOY.SelectionChanged firstDayofTheYear() FirstDOYPerYear() @@ -541,7 +553,6 @@ Public Class dlgStartofRains Private Sub ucrSelectorForStartofRains_DataFrameChanged() Handles ucrSelectorForStartofRains.DataFrameChanged strCurrDataName = Chr(34) & ucrSelectorForStartofRains.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - clsAddKey.AddParameter("data_name", strCurrDataName) firstDayofTheYear() End Sub @@ -637,15 +648,6 @@ Public Class dlgStartofRains TestOKEnabled() End Sub - Private Sub ucrReceiverYear_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverYear.SelectionChanged - TestOKEnabled() - End Sub - - Private Sub ucrReceiverDate_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDate.SelectionChanged - 'AddKeyMethod() - TestOKEnabled() - End Sub - Private Sub CheckBoxesSetting() 'If chkTotalRainfall.Checked Then ' pnlTotalRainfall.Visible = True From 485a45de504ba9f36c9a7573de188c0b1a897559 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 19 Jun 2017 11:15:36 +0100 Subject: [PATCH 080/201] changed getting column names from R in refreshing grid --- instat/clsGridLink.vb | 50 ++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/instat/clsGridLink.vb b/instat/clsGridLink.vb index dbd95dab72f..93299a9b9b4 100644 --- a/instat/clsGridLink.vb +++ b/instat/clsGridLink.vb @@ -28,6 +28,7 @@ Public Class clsGridLink Public bGrdMetadataChanged As Boolean Public bGrdVariablesMetadataChanged As Boolean Public iMaxRows As Integer + Public iMaxCols As Integer Private strMetadata As String Public fntText As Font = New Font("Microsoft Sans Serif", 10, FontStyle.Regular) Public clrText As Color = Color.Black @@ -43,6 +44,7 @@ Public Class clsGridLink bGrdMetadataChanged = False bGrdVariablesMetadataChanged = False iMaxRows = 1000 + iMaxCols = 30 End Sub Public Sub UpdateGrids() @@ -78,7 +80,7 @@ Public Class clsGridLink clsGetDataFrame.AddParameter("convert_to_character", "TRUE") clsGetDataFrame.AddParameter("include_hidden_columns", "FALSE") clsGetDataFrame.AddParameter("use_current_filter", "TRUE") - clsGetDataFrame.AddParameter("max_cols", "30") + clsGetDataFrame.AddParameter("max_cols", iMaxCols) clsGetDataFrame.AddParameter("max_rows", iMaxRows) clsFilterApplied.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$filter_applied") clsSetDataFramesChanged.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$set_data_frames_changed") @@ -257,6 +259,8 @@ Public Class clsGridLink Dim i, j, k As Integer Dim expColNames As SymbolicExpression Dim strCurrColNames As String = "" + Dim strCurrHeader As String + Dim lstColumnNames As New List(Of String) iCount = 0 For Each tempWorkSheet In grdCurr.Worksheets @@ -316,25 +320,11 @@ Public Class clsGridLink FormatDataView(fillWorkSheet) End If Try - clsGetColumnNames.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_column_names") - clsGetColumnNames.AddParameter("data_name", Chr(34) & strName & Chr(34)) - clsGetColumnNames.AddParameter("include", "list(Is_Hidden = FALSE)") - clsGetColumnNames.AddParameter("max_no", "30") - If bInstatObjectDataFrame AndAlso frmMain.clsRLink.bInstatObjectExists Then - expColNames = frmMain.clsRLink.RunInternalScriptGetValue(clsGetColumnNames.ToScript()) - If expColNames IsNot Nothing AndAlso expColNames.Type <> Internals.SymbolicExpressionType.Null Then - strCurrColNames = frmMain.clsRLink.GetListAsRString(expColNames.AsCharacter.ToList) - Else - strCurrColNames = "" - End If - End If + lstColumnNames = dfTemp.ColumnNames.ToList + strCurrColNames = frmMain.clsRLink.GetListAsRString(lstColumnNames) If bInstatObjectDataFrame AndAlso frmMain.clsRLink.bInstatObjectExists AndAlso bIncludeDataTypes Then If bInstatObjectDataFrame AndAlso frmMain.clsRLink.bInstatObjectExists Then - 'clsGetVarMetaFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_variables_metadata") - 'clsGetVarMetaFunc.AddParameter("data_name", Chr(34) & strName & Chr(34)) - 'clsGetVarMetaFunc.AddParameter("property", "data_type_label") - 'clsGetVarMetaFunc.AddParameter("column", strCurrColNames) clsGetVarMetaFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_column_data_types") clsGetVarMetaFunc.AddParameter("data_name", Chr(34) & strName & Chr(34)) clsGetVarMetaFunc.AddParameter("columns", strCurrColNames) @@ -347,33 +337,31 @@ Public Class clsGridLink vecColumnDataTypes = frmMain.clsRLink.RunInternalScriptGetValue(clsGetVarMetaFunc.ToScript()).AsCharacter For k = 0 To dfTemp.ColumnCount - 1 + strCurrHeader = lstColumnNames(k) If vecColumnDataTypes(k).Contains("factor") AndAlso vecColumnDataTypes(k).Contains("ordered") Then - fillWorkSheet.ColumnHeaders(k).Text = strColumnNames(k) & " (o.f)" + fillWorkSheet.ColumnHeaders(k).Text = strCurrHeader & " (o.f)" fillWorkSheet.ColumnHeaders(k).TextColor = Graphics.SolidColor.Blue ElseIf vecColumnDataTypes(k).Contains("factor") Then - fillWorkSheet.ColumnHeaders(k).Text = strColumnNames(k) & " (f)" + fillWorkSheet.ColumnHeaders(k).Text = strCurrHeader & " (f)" fillWorkSheet.ColumnHeaders(k).TextColor = Graphics.SolidColor.Blue ElseIf vecColumnDataTypes(k).Contains("character") Then - fillWorkSheet.ColumnHeaders(k).Text = strColumnNames(k) & " (c)" + fillWorkSheet.ColumnHeaders(k).Text = strCurrHeader & " (c)" fillWorkSheet.ColumnHeaders(k).TextColor = Graphics.SolidColor.DarkBlue ElseIf vecColumnDataTypes(k).Contains("Date") Then - fillWorkSheet.ColumnHeaders(k).Text = strColumnNames(k) & " (D)" + fillWorkSheet.ColumnHeaders(k).Text = strCurrHeader & " (D)" + fillWorkSheet.ColumnHeaders(k).TextColor = Graphics.SolidColor.DarkBlue + ElseIf vecColumnDataTypes(k).Contains("logical") Then + fillWorkSheet.ColumnHeaders(k).Text = strCurrHeader & " (l)" fillWorkSheet.ColumnHeaders(k).TextColor = Graphics.SolidColor.DarkBlue Else - fillWorkSheet.ColumnHeaders(k).Text = strColumnNames(k) + fillWorkSheet.ColumnHeaders(k).Text = strCurrHeader fillWorkSheet.ColumnHeaders(k).TextColor = Graphics.SolidColor.DarkBlue End If Next Else - If strColumnNames IsNot Nothing Then - For k = 0 To dfTemp.ColumnCount - 1 - fillWorkSheet.ColumnHeaders(k).Text = strColumnNames(k) - Next - Else - For k = 0 To dfTemp.ColumnCount - 1 - fillWorkSheet.ColumnHeaders(k).Text = "" - Next - End If + For k = 0 To lstColumnNames.Count - 1 + fillWorkSheet.ColumnHeaders(k).Text = lstColumnNames(k) + Next End If grdCurr.CurrentWorksheet = fillWorkSheet If bInstatObjectDataFrame AndAlso frmMain.clsRLink.bInstatObjectExists Then From 05ccb1a3d7d6999d4a54fcad0387770ee450746f Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 11:18:01 +0100 Subject: [PATCH 081/201] SoR --- instat/dlgStartofRains.vb | 108 +++++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 41 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 0e28f9d8bf7..27cb86fa007 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -19,7 +19,7 @@ Imports instat.Translations Public Class dlgStartofRains Public clsRainyDays, clsRainyDaysFunction, clsFirstDOYPerYear, clsManipulationFirstDOYPerYear, clsCombinedFilter, clsCombinedList As New RFunction Private clsDayFromAndTo, clsGroupBy, clsAddKey, clsAddKeyColName As New RFunction - Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator, clsRainyDaysOperator As New ROperator + Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator, clsRainyDaysOperator, clsFirstDOYPerYearOperator As New ROperator 'Total Rainfall classes Private clsTRRollingSum, clsTRRollingSumFunction, clsTRWetSpell, clsTRWetSpellList, clsTRWetSpellFunction As New RFunction 'Rainy Day classes @@ -153,22 +153,14 @@ Public Class dlgStartofRains ucrNudDPOverallInterval.SetParameter(New RParameter("Overall", 0)) ' minmax? - - 'clsMinimumRainfall.SetRCommand("instat_calculation$new") 'clsMinimumRainfall.SetAssignTo("Minimum_Rainfall") - clsFirstDOYPerYear.SetRCommand("instat_calculation$new") - clsFirstDOYPerYear.SetAssignTo("First_doy_per_year") + + 'clsWithinThirtyDays.SetRCommand("instat_calculation$new") 'clsWithinThirtyDays.SetAssignTo("dry_spell_10") ucrBase.clsRsyntax.SetFunction(frmMain.clsRLink.strInstatDataObject & "$apply_instat_calculation") - clsCombinedList.SetRCommand("list") - clsManipulationFirstDOYPerYear.SetRCommand("list") - - clsCombinedFilter.SetRCommand("instat_calculation$new") - clsCombinedFilter.SetAssignTo("combined_filter") - ucrReceiverYear.Selector = ucrSelectorForStartofRains ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) ucrReceiverYear.bAutoFill = True @@ -190,6 +182,10 @@ Public Class dlgStartofRains clsRainyDays = New RFunction clsRainyDaysFunction = New RFunction clsRainyDaysOperator = New ROperator + clsFirstDOYPerYear = New RFunction + clsFirstDOYPerYearOperator = New ROperator + clsCombinedFilter = New RFunction + clsCombinedList = New RFunction clsTRRollingSum = New RFunction clsTRRollingSumFunction = New RFunction @@ -259,6 +255,23 @@ Public Class dlgStartofRains clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=2) clsRainyDays.AddParameter("save", 0, iPosition:=6) + ' First DOY + clsFirstDOYPerYear.SetRCommand("instat_calculation$new") + clsManipulationFirstDOYPerYear.SetRCommand("list") + clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) + clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & clsFirstDOYPerYearOperator.ToScript & Chr(34), iPosition:=1) + clsFirstDOYPerYearOperator.SetOperation("[") + clsFirstDOYPerYearOperator.AddParameter("rightside", "1]", iPosition:=1) + clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34), iPosition:=2) + clsFirstDOYPerYear.AddParameter("save", 2, iPosition:=6) + clsFirstDOYPerYear.SetAssignTo(ucrSaveStartofRains.ucrInputTextSave.GetText) + + ' Combined filter + clsCombinedList.SetRCommand("list") + clsCombinedFilter.SetRCommand("instat_calculation$new") + clsCombinedFilter.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) + clsCombinedFilter.AddParameter("sub_calculations", clsRFunctionParameter:=clsCombinedList) + 'TOTAL RAINFALL: associated with ucrChkTRTotalRainfall clsTRRollingSum.SetRCommand("instat_calculation$new") clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) @@ -394,14 +407,10 @@ Public Class dlgStartofRains clsDPOverallInterval.AddParameter("save", "2", iPosition:=6) - ucrChkDrySpell.Checked = False - ucrChkTotalRainfall.Checked = False - ucrChkDryPeriod.Checked = False CheckBoxesSetting() TestOKEnabled() ucrNudTRAmount.Value = 20 ucrNudDSMaximumDays.Value = 10 - rdoTRAmount.Checked = True 'DefaultNudValue() End Sub @@ -414,8 +423,10 @@ Public Class dlgStartofRains Private Sub SetRCodeForControls(bReset As Boolean) ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("doy", 0), iAdditionalPairNo:=1) + ucrReceiverDOY.AddAdditionalCodeParameterPair(clsFirstDOYPerYearOperator, New RParameter("doy", 0), iAdditionalPairNo:=2) ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRainyDaysOperator, New RParameter("Rain", 1), iAdditionalPairNo:=1) ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsDPRainInDaysFunction, New RParameter("data", 0), iAdditionalPairNo:=2) + ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) @@ -445,6 +456,14 @@ Public Class dlgStartofRains Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining column(s) as key") + clsCombinedFilter.SetAssignTo("combined_filter") + + clsFirstDOYPerYear.SetAssignTo("First_doy_per_year") + clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) + clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear, iPosition:=5) ' if I run this in SetDefaults, will this update automatically + clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")", iPosition:=4) + ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) clsDayFromAndTo.SetAssignTo("Day_From_and_To") clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) @@ -839,8 +858,6 @@ Public Class dlgStartofRains Private Sub CombinedFilter() Dim strTempFunExpression As String = Chr(34) - clsCombinedFilter.AddParameter("type", Chr(34) & "filter" & Chr(34)) - clsCombinedFilter.AddParameter("sub_calculations", clsRFunctionParameter:=clsCombinedList) clsCombinedFilter.RemoveParameterByName("function_exp") @@ -883,42 +900,51 @@ Public Class dlgStartofRains End Sub Private Sub FirstDOYPerYear() - ' run these when things are checked - If Not ucrReceiverDOY.IsEmpty Then + '' run these when things are checked + 'If Not ucrReceiverDOY.IsEmpty Then - clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) - clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + ' clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) + ' clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) - clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & "[" & 1 & "]" & Chr(34)) - clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear) - clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34)) - clsFirstDOYPerYear.AddParameter("save", 2) + ' clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) + ' clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & "[" & 1 & "]" & Chr(34)) + ' clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + ' clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear) + ' clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34)) + ' clsFirstDOYPerYear.AddParameter("save", 2) - Else - clsManipulationFirstDOYPerYear.RemoveParameterByName("sub1") - clsManipulationFirstDOYPerYear.RemoveParameterByName("sub2") - clsManipulationFirstDOYPerYear.RemoveParameterByName("sub3") - clsFirstDOYPerYear.RemoveParameterByName("type") - clsFirstDOYPerYear.RemoveParameterByName("function_exp") - clsFirstDOYPerYear.RemoveParameterByName("calculated_from") - clsFirstDOYPerYear.RemoveParameterByName("manipulations") - End If + 'Else + ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub1") + ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub2") + ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub3") + ' clsFirstDOYPerYear.RemoveParameterByName("type") + ' clsFirstDOYPerYear.RemoveParameterByName("function_exp") + ' clsFirstDOYPerYear.RemoveParameterByName("calculated_from") + ' clsFirstDOYPerYear.RemoveParameterByName("manipulations") + 'End If End Sub Private Sub firstDayofTheYear() - ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) + 'clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) + 'clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + + 'clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) + 'clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & "[" & 1 & "]" & Chr(34)) + 'clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + 'clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear) + 'clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34)) + 'clsFirstDOYPerYear.AddParameter("save", 2) + + 'ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) End Sub Private Sub ucrSaveStartofRains_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlContentsChanged TestOKEnabled() End Sub - Private Sub ucrSaveStartofRains_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlValueChanged - clsFirstDOYPerYear.SetAssignTo(ucrSaveStartofRains.ucrInputTextSave.GetText) - FirstDOYPerYear() - End Sub + 'Private Sub ucrSaveStartofRains_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlValueChanged + ' FirstDOYPerYear() + 'End Sub 'Private Sub DefaultNudValue() ' nudRDOutOfDays.Value = nudTROverDays.Value ' crashes if I go to 100+, can crash upon a reset, also what if I change the nudOverDays then the nudOutofDays - then I lose my nudOverDays value I put in From 44248c15314de2cec41904c3d2c75fa20b5b674b Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Mon, 19 Jun 2017 13:25:14 +0300 Subject: [PATCH 082/201] adding reset for sdglayer options --- instat/dlgBarAndPieChart.vb | 1 + instat/dlgBoxPlot.vb | 1 + instat/dlgDotPlot.vb | 2 +- instat/dlgHistogram.vb | 1 + instat/dlgLinePlot.vb | 1 + instat/dlgRugPlot.vb | 1 + instat/dlgScatterPlot.vb | 6 ++++-- instat/dlgSummaryBarOrPieChart.vb | 1 + instat/sdgLayerOptions.vb | 8 +++++--- 9 files changed, 16 insertions(+), 6 deletions(-) diff --git a/instat/dlgBarAndPieChart.vb b/instat/dlgBarAndPieChart.vb index 3c2047b6bef..095fa52e59e 100644 --- a/instat/dlgBarAndPieChart.vb +++ b/instat/dlgBarAndPieChart.vb @@ -143,6 +143,7 @@ Public Class dlgBarAndPieChart ucrFactorReceiver.SetMeAsReceiver() ucrSaveBar.Reset() bResetSubdialog = True + bResetBarLayerSubdialog = True clsBaseOperator.SetOperation("+") clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) diff --git a/instat/dlgBoxPlot.vb b/instat/dlgBoxPlot.vb index 3e39d524c9f..bd4f3b79634 100644 --- a/instat/dlgBoxPlot.vb +++ b/instat/dlgBoxPlot.vb @@ -128,6 +128,7 @@ Public Class dlgBoxplot ucrSaveBoxplot.Reset() sdgPlots.Reset() bResetSubdialog = True + bResetBoxLayerSubdialog = True 'rdoBoxplot.Checked = True 'These chk boxes add features to the BoxPlot when ticked. See SetCorrdFlip and chkVarwidth_CheckedChanged. By default they are unticked. clsBaseOperator.SetOperation("+") diff --git a/instat/dlgDotPlot.vb b/instat/dlgDotPlot.vb index ef2297cf297..ae381d8abb8 100644 --- a/instat/dlgDotPlot.vb +++ b/instat/dlgDotPlot.vb @@ -128,7 +128,7 @@ Public Class dlgDotPlot ucrDotPlotSelector.Reset() ucrSaveDotPlot.Reset() bResetSubdialog = True - + bResetDotLayerSubdialog = True 'I am not sure we need this bEditAesFunction = True diff --git a/instat/dlgHistogram.vb b/instat/dlgHistogram.vb index fdeea414623..9b95b4dd68f 100644 --- a/instat/dlgHistogram.vb +++ b/instat/dlgHistogram.vb @@ -102,6 +102,7 @@ Public Class dlgHistogram ucrHistogramSelector.Reset() ucrSaveHist.Reset() bResetSubdialog = True + bResetHistLayerSubdialog = True TempOptionsDisabledInMultipleVariablesCase() clsBaseOperator.SetOperation("+") diff --git a/instat/dlgLinePlot.vb b/instat/dlgLinePlot.vb index 9b84d8f5d2a..aada25aef72 100644 --- a/instat/dlgLinePlot.vb +++ b/instat/dlgLinePlot.vb @@ -111,6 +111,7 @@ Public Class dlgLinePlot ucrSave.Reset() ucrVariablesAsFactorForLinePlot.SetMeAsReceiver() bResetSubdialog = True + bResetLineLayerSubdialog = True clsBaseOperator.SetOperation("+") clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) diff --git a/instat/dlgRugPlot.vb b/instat/dlgRugPlot.vb index fa7e832ee67..dff40a35dd7 100644 --- a/instat/dlgRugPlot.vb +++ b/instat/dlgRugPlot.vb @@ -98,6 +98,7 @@ Public Class dlgRugPlot ucrSaveGraph.Reset() ucrRugPlotSelector.Reset() bResetSubdialog = True + bResetRugLayerSubdialog = True clsBaseOperator.SetOperation("+") clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) diff --git a/instat/dlgScatterPlot.vb b/instat/dlgScatterPlot.vb index bd9b9f3323c..3af058d3a81 100644 --- a/instat/dlgScatterPlot.vb +++ b/instat/dlgScatterPlot.vb @@ -25,6 +25,7 @@ Public Class dlgScatterPlot 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 @@ -114,6 +115,7 @@ Public Class dlgScatterPlot ucrSaveScatterPlot.Reset() sdgPlots.Reset() bResetSubdialog = True + bResetlayerSubdialog = True clsBaseOperator.SetOperation("+") clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) @@ -178,10 +180,10 @@ Public Class dlgScatterPlot Private Sub cmdScatterPlotOptions_Click(sender As Object, e As EventArgs) Handles cmdScatterPlotOptions.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:=bResetSubdialog, iTabToDisplay:=0) + 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() - bResetSubdialog = False + bResetlayerSubdialog = False 'The aesthetics parameters on the main dialog are repopulated as required. For Each clsParam In clsRaesFunction.clsParameters If clsParam.strArgumentName = "x" Then diff --git a/instat/dlgSummaryBarOrPieChart.vb b/instat/dlgSummaryBarOrPieChart.vb index 570535f2a90..f307426ca95 100644 --- a/instat/dlgSummaryBarOrPieChart.vb +++ b/instat/dlgSummaryBarOrPieChart.vb @@ -111,6 +111,7 @@ Public Class dlgSummaryBarOrPieChart ucrYReceiver.SetMeAsReceiver() ucrSaveSummaryBar.Reset() bResetSubdialog = True + bResetSummaryBarLayerSubdialog = True clsBaseOperator.SetOperation("+") clsBaseOperator.AddParameter("ggplot", clsRFunctionParameter:=clsRggplotFunction, iPosition:=0) diff --git a/instat/sdgLayerOptions.vb b/instat/sdgLayerOptions.vb index 2cafd9ad619..e0e7bb3d283 100644 --- a/instat/sdgLayerOptions.vb +++ b/instat/sdgLayerOptions.vb @@ -43,6 +43,7 @@ Public Class sdgLayerOptions ucrLayerParameter.ucrGeomWithAes = ucrGeomWithAes ucrGeomWithAes.ucrLayersControl = ucrLayerParameter ucrSdgLayerBase.iHelpTopicID = 569 + tbcLayers.SelectedIndex = 0 'Each ucrLayerParameter has a field of type ucrGeomListWithAes and reciprocally as both of them "collaborate to provide full description of a Layer". 'The obvious linking is performed here in sdgLayerOptions. End Sub @@ -52,9 +53,10 @@ Public Class sdgLayerOptions End Sub Public Sub SetupLayer(clsNewGgPlot As RFunction, clsNewGeomFunc As RFunction, clsNewGlobalAesFunc As RFunction, clsNewLocalAes As RFunction, Optional bFixGeom As Boolean = False, Optional ucrNewBaseSelector As ucrSelector = Nothing, Optional bApplyAesGlobally As Boolean = True, Optional iNumVariablesForGeoms As Integer = -1, Optional bReset As Boolean = False, Optional iTabToDisplay As Integer = 0, Optional strDataFrame As String = "") - If iTabToDisplay > 0 AndAlso iTabToDisplay <= tbcLayers.TabCount - 1 Then - tbcLayers.SelectedIndex = iTabToDisplay - End If + 'If iTabToDisplay > 0 AndAlso iTabToDisplay <= tbcLayers.TabCount - 1 Then + ' tbcLayers.SelectedIndex = iTabToDisplay + 'End If + If bReset Then tbcLayers.SelectedIndex = 0 End If From 35cb97bfa3c8e9808a9745cc613d1bbce0deac70 Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 11:33:37 +0100 Subject: [PATCH 083/201] spells --- instat/dlgSpells.Designer.vb | 4 ++-- instat/dlgSpells.vb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/instat/dlgSpells.Designer.vb b/instat/dlgSpells.Designer.vb index dbf0bf28b04..96ed52659dc 100644 --- a/instat/dlgSpells.Designer.vb +++ b/instat/dlgSpells.Designer.vb @@ -169,7 +169,7 @@ Partial Class dlgSpells Me.ucrInputCondition.IsReadOnly = False Me.ucrInputCondition.Location = New System.Drawing.Point(132, 44) Me.ucrInputCondition.Name = "ucrInputCondition" - Me.ucrInputCondition.Size = New System.Drawing.Size(97, 21) + Me.ucrInputCondition.Size = New System.Drawing.Size(155, 21) Me.ucrInputCondition.TabIndex = 10 ' 'ucrInputSpellUpper @@ -177,7 +177,7 @@ Partial Class dlgSpells Me.ucrInputSpellUpper.AddQuotesIfUnrecognised = True Me.ucrInputSpellUpper.IsMultiline = False Me.ucrInputSpellUpper.IsReadOnly = False - Me.ucrInputSpellUpper.Location = New System.Drawing.Point(237, 44) + Me.ucrInputSpellUpper.Location = New System.Drawing.Point(293, 44) Me.ucrInputSpellUpper.Name = "ucrInputSpellUpper" Me.ucrInputSpellUpper.Size = New System.Drawing.Size(63, 21) Me.ucrInputSpellUpper.TabIndex = 18 diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 3f05df9cd15..170e4e67c94 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -153,7 +153,7 @@ Public Class dlgSpells 'DayFromandTo clsDayFromAndTo.SetRCommand("instat_calculation$new") clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) - ' clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) + 'clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) clsDayFromAndToOperator.SetOperation("&") clsDayFromAndToOperator.AddParameter("from", clsROperatorParameter:=clsDayFromOperator, iPosition:=0) clsDayFromOperator.SetOperation(">=") @@ -172,7 +172,7 @@ Public Class dlgSpells clsRRainday.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=2) clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=3) clsRRainday.AddParameter("save", "0", iPosition:=6) - ' clsRRainday.AddParameter("function_exp", chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) + ' clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) clsRRaindayMatch.SetRCommand("match") clsRRaindayMatch.AddParameter("x", clsROperatorParameter:=clsRRaindayAndOperator) clsRRaindayAndOperator.SetOperation("&") From 061a6245ede0bd6bb865bde5d1047882ee469270 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 19 Jun 2017 12:00:38 +0100 Subject: [PATCH 084/201] added column count to data grid label --- instat/ucrDataView.vb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/instat/ucrDataView.vb b/instat/ucrDataView.vb index d28d96bf463..5a5eeb63ed5 100644 --- a/instat/ucrDataView.vb +++ b/instat/ucrDataView.vb @@ -324,6 +324,9 @@ Public Class ucrDataView End Sub Public Sub UpdateCurrentWorksheet() + Dim iRowCount As Integer + Dim iColumnCount As Integer + grdCurrSheet = grdData.CurrentWorksheet If grdCurrSheet IsNot Nothing AndAlso frmMain.clsRLink.GetDataFrameNames().Contains(grdCurrSheet.Name) Then UpdateRFunctionDataFrameParameters() @@ -331,10 +334,13 @@ Public Class ucrDataView frmMain.tstatus.Text = grdCurrSheet.Name grdCurrSheet.SelectionForwardDirection = unvell.ReoGrid.SelectionForwardDirection.Down grdCurrSheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_DragSelectionToMoveCells, False) - lblRowDisplay.Text = "Showing " & grdCurrSheet.RowCount & " rows of " & frmMain.clsRLink.GetDataFrameLength(grdCurrSheet.Name, True) + iRowCount = frmMain.clsRLink.GetDataFrameLength(grdCurrSheet.Name, True) + iColumnCount = frmMain.clsRLink.GetDataFrameColumnCount(grdCurrSheet.Name) + lblRowDisplay.Text = "Showing " & grdCurrSheet.RowCount & " of " & iRowCount & " rows" If frmMain.clsRLink.RunInternalScriptGetValue(clsFilterApplied.ToScript()).AsLogical(0) Then lblRowDisplay.Text = lblRowDisplay.Text & " (" & frmMain.clsRLink.GetDataFrameLength(grdCurrSheet.Name, False) & ")" End If + lblRowDisplay.Text = lblRowDisplay.Text & " | Showing " & grdCurrSheet.ColumnCount & " of " & iColumnCount & " columns" Else frmMain.tstatus.Text = "No data loaded" lblRowDisplay.Text = "" From 89370c434327365f923947a0dec497563dd4234e Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 19 Jun 2017 12:09:23 +0100 Subject: [PATCH 085/201] removed row limit for non data grids --- instat/clsGridLink.vb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/instat/clsGridLink.vb b/instat/clsGridLink.vb index 93299a9b9b4..7252c541c4f 100644 --- a/instat/clsGridLink.vb +++ b/instat/clsGridLink.vb @@ -239,7 +239,7 @@ Public Class clsGridLink UpdateGrids() End Sub - Public Sub FillSheet(dfTemp As DataFrame, strName As String, grdCurr As ReoGridControl, Optional bInstatObjectDataFrame As Boolean = False, Optional bIncludeDataTypes As Boolean = False, Optional iNewPosition As Integer = -1, Optional bFilterApplied As Boolean = False, Optional bCheckFreezeColumns As Boolean = False) + Public Sub FillSheet(dfTemp As DataFrame, strName As String, grdCurr As ReoGridControl, Optional bInstatObjectDataFrame As Boolean = False, Optional bIncludeDataTypes As Boolean = False, Optional iNewPosition As Integer = -1, Optional bFilterApplied As Boolean = False, Optional bCheckFreezeColumns As Boolean = False, Optional iRowMax As Integer = -1) Dim bFoundWorksheet As Boolean = False Dim tempWorkSheet As Worksheet Dim fillWorkSheet As Worksheet @@ -257,7 +257,6 @@ Public Class clsGridLink Dim vecColumnColours As NumericVector Dim bApplyColumnColours As Boolean Dim i, j, k As Integer - Dim expColNames As SymbolicExpression Dim strCurrColNames As String = "" Dim strCurrHeader As String Dim lstColumnNames As New List(Of String) @@ -293,8 +292,12 @@ Public Class clsGridLink fillWorkSheet.SetRowsHeight(0, 1, 0.1) fillWorkSheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_AllowAdjustRowHeight, False) Else - fillWorkSheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_AllowAdjustRowHeight, True) - fillWorkSheet.Rows = Math.Min(iMaxRows, dfTemp.RowCount) + fillWorkSheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_AllowAdjustRowHeight, True) + If iRowMax <> -1 Then + fillWorkSheet.Rows = Math.Min(iRowMax, dfTemp.RowCount) + Else + fillWorkSheet.Rows = dfTemp.RowCount + End If fillWorkSheet.SetRowsHeight(0, 1, 20) rngDataRange = New RangePosition(0, 0, fillWorkSheet.Rows, fillWorkSheet.Columns) fillWorkSheet.SetRangeDataFormat(rngDataRange, DataFormat.CellDataFormatFlag.Text) From 5c46162b03f7eb77d276c9b204ea53c3fc7aa9a5 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 19 Jun 2017 14:37:46 +0300 Subject: [PATCH 086/201] Rewriting ImportDataset Dlg --- instat/dlgImportDataset.Designer.vb | 456 +++++++++++++++------------- instat/dlgImportDataset.vb | 258 +++++++++------- 2 files changed, 385 insertions(+), 329 deletions(-) diff --git a/instat/dlgImportDataset.Designer.vb b/instat/dlgImportDataset.Designer.vb index d8b605dc460..b61529b6c9a 100644 --- a/instat/dlgImportDataset.Designer.vb +++ b/instat/dlgImportDataset.Designer.vb @@ -32,49 +32,48 @@ Partial Class dlgImportDataset Me.lblDecimal = New System.Windows.Forms.Label() Me.lblNAStrings = New System.Windows.Forms.Label() Me.txtPreview = New System.Windows.Forms.TextBox() - Me.chkStringsAsFactors = New System.Windows.Forms.CheckBox() Me.grdDataPreview = New unvell.ReoGrid.ReoGridControl() Me.lblFileOpenPath = New System.Windows.Forms.Label() Me.lblLinesToSkip = New System.Windows.Forms.Label() - Me.nudSkip = New System.Windows.Forms.NumericUpDown() Me.cmdOpenDataSet = New System.Windows.Forms.Button() Me.grpCSV = New System.Windows.Forms.GroupBox() Me.ucrInputHeaders = New instat.ucrInputComboBox() - Me.pnlRowNames = New System.Windows.Forms.Panel() - Me.rdoRowNamesNo = New System.Windows.Forms.RadioButton() - Me.rdoRowNamesYes = New System.Windows.Forms.RadioButton() Me.ucrInputNAStrings = New instat.ucrInputTextBox() Me.ucrInputDecimal = New instat.ucrInputComboBox() Me.ucrInputSeparator = New instat.ucrInputComboBox() Me.ucrInputEncoding = New instat.ucrInputComboBox() Me.grpExcel = New System.Windows.Forms.GroupBox() + Me.ucrchkColumnNames = New instat.ucrCheck() + Me.ucrNudxlRowsToSkip = New instat.ucrNud() + Me.Label1 = New System.Windows.Forms.Label() + Me.ucrInputMaximumDataSize = New instat.ucrInputTextBox() Me.lblMissingValueString = New System.Windows.Forms.Label() Me.ucrInputXlMissingValueString = New instat.ucrInputTextBox() - Me.lblNamedRegion = New System.Windows.Forms.Label() Me.ucrInputNamedRegions = New instat.ucrInputComboBox() + Me.lblNamedRegion = New System.Windows.Forms.Label() Me.ucrInputSheets = New instat.ucrInputComboBox() Me.lblRowToSkip = New System.Windows.Forms.Label() Me.lblSheets = New System.Windows.Forms.Label() - Me.nudxlRowsToSkip = New System.Windows.Forms.NumericUpDown() - Me.chkColumnNames = New System.Windows.Forms.CheckBox() - Me.grpRDS = New System.Windows.Forms.GroupBox() - Me.chkImportCalculations = New System.Windows.Forms.CheckBox() - Me.chkImportFilters = New System.Windows.Forms.CheckBox() - Me.chkImportChangesLog = New System.Windows.Forms.CheckBox() - Me.chkOverWrite = New System.Windows.Forms.CheckBox() - Me.chkImportMetadata = New System.Windows.Forms.CheckBox() - Me.chkImportObjects = New System.Windows.Forms.CheckBox() - Me.chkExistingData = New System.Windows.Forms.CheckBox() Me.lblCannotImport = New System.Windows.Forms.Label() Me.lblNoPreview = New System.Windows.Forms.Label() Me.ucrInputFilePath = New instat.ucrInputTextBox() Me.ucrInputName = New instat.ucrInputTextBox() Me.ucrBase = New instat.ucrButtons() - CType(Me.nudSkip, System.ComponentModel.ISupportInitialize).BeginInit() + Me.grpRDS = New System.Windows.Forms.GroupBox() + Me.ucrChkOverWrite = New instat.ucrCheck() + Me.ucrChkImportObjects = New instat.ucrCheck() + Me.ucrChkImportCalculations = New instat.ucrCheck() + Me.ucrChkImportChangesLog = New instat.ucrCheck() + Me.ucrChkImportFilters = New instat.ucrCheck() + Me.ucrChkImportMetadata = New instat.ucrCheck() + Me.ucrChkExistingData = New instat.ucrCheck() + Me.ucrPnlRowNames = New instat.UcrPanel() + Me.rdoRowNamesNo = New System.Windows.Forms.RadioButton() + Me.rdoRowNamesYes = New System.Windows.Forms.RadioButton() + Me.ucrNudSkip = New instat.ucrNud() + Me.ucrChkStringsAsFactors = New instat.ucrCheck() Me.grpCSV.SuspendLayout() - Me.pnlRowNames.SuspendLayout() Me.grpExcel.SuspendLayout() - CType(Me.nudxlRowsToSkip, System.ComponentModel.ISupportInitialize).BeginInit() Me.grpRDS.SuspendLayout() Me.SuspendLayout() ' @@ -176,17 +175,6 @@ Partial Class dlgImportDataset Me.txtPreview.Size = New System.Drawing.Size(422, 205) Me.txtPreview.TabIndex = 22 ' - 'chkStringsAsFactors - ' - Me.chkStringsAsFactors.AutoSize = True - Me.chkStringsAsFactors.Location = New System.Drawing.Point(5, 306) - Me.chkStringsAsFactors.Name = "chkStringsAsFactors" - Me.chkStringsAsFactors.Size = New System.Drawing.Size(186, 17) - Me.chkStringsAsFactors.TabIndex = 26 - Me.chkStringsAsFactors.Tag = "Strings_as_factors" - Me.chkStringsAsFactors.Text = "Convert Strings to Factor Columns" - Me.chkStringsAsFactors.UseVisualStyleBackColor = True - ' 'grdDataPreview ' Me.grdDataPreview.BackColor = System.Drawing.Color.White @@ -201,6 +189,7 @@ Partial Class dlgImportDataset Me.grdDataPreview.SheetTabNewButtonVisible = False Me.grdDataPreview.SheetTabVisible = True Me.grdDataPreview.SheetTabWidth = 60 + Me.grdDataPreview.ShowScrollEndSpacing = True Me.grdDataPreview.Size = New System.Drawing.Size(422, 174) Me.grdDataPreview.TabIndex = 28 ' @@ -222,14 +211,6 @@ Partial Class dlgImportDataset Me.lblLinesToSkip.TabIndex = 30 Me.lblLinesToSkip.Text = "Lines To Skip" ' - 'nudSkip - ' - Me.nudSkip.Location = New System.Drawing.Point(83, 278) - Me.nudSkip.Maximum = New Decimal(New Integer() {1000000, 0, 0, 0}) - Me.nudSkip.Name = "nudSkip" - Me.nudSkip.Size = New System.Drawing.Size(59, 20) - Me.nudSkip.TabIndex = 32 - ' 'cmdOpenDataSet ' Me.cmdOpenDataSet.Location = New System.Drawing.Point(164, 22) @@ -244,24 +225,26 @@ Partial Class dlgImportDataset ' Me.grpCSV.AutoSize = True Me.grpCSV.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.grpCSV.Controls.Add(Me.ucrChkStringsAsFactors) + Me.grpCSV.Controls.Add(Me.ucrNudSkip) + Me.grpCSV.Controls.Add(Me.rdoRowNamesNo) + Me.grpCSV.Controls.Add(Me.rdoRowNamesYes) + Me.grpCSV.Controls.Add(Me.ucrPnlRowNames) Me.grpCSV.Controls.Add(Me.ucrInputHeaders) - Me.grpCSV.Controls.Add(Me.pnlRowNames) Me.grpCSV.Controls.Add(Me.ucrInputNAStrings) Me.grpCSV.Controls.Add(Me.ucrInputDecimal) Me.grpCSV.Controls.Add(Me.ucrInputSeparator) Me.grpCSV.Controls.Add(Me.ucrInputEncoding) Me.grpCSV.Controls.Add(Me.lblEncoding) Me.grpCSV.Controls.Add(Me.lblHeaders) - Me.grpCSV.Controls.Add(Me.nudSkip) Me.grpCSV.Controls.Add(Me.lblRowNames) Me.grpCSV.Controls.Add(Me.lblSeparator) Me.grpCSV.Controls.Add(Me.lblLinesToSkip) Me.grpCSV.Controls.Add(Me.lblDecimal) Me.grpCSV.Controls.Add(Me.lblNAStrings) - Me.grpCSV.Controls.Add(Me.chkStringsAsFactors) - Me.grpCSV.Location = New System.Drawing.Point(15, 87) + Me.grpCSV.Location = New System.Drawing.Point(18, 85) Me.grpCSV.Name = "grpCSV" - Me.grpCSV.Size = New System.Drawing.Size(217, 342) + Me.grpCSV.Size = New System.Drawing.Size(219, 346) Me.grpCSV.TabIndex = 34 Me.grpCSV.TabStop = False Me.grpCSV.Text = "Import csv Options" @@ -269,47 +252,17 @@ Partial Class dlgImportDataset ' 'ucrInputHeaders ' + Me.ucrInputHeaders.AddQuotesIfUnrecognised = True Me.ucrInputHeaders.IsReadOnly = False Me.ucrInputHeaders.Location = New System.Drawing.Point(9, 82) Me.ucrInputHeaders.Name = "ucrInputHeaders" Me.ucrInputHeaders.Size = New System.Drawing.Size(149, 21) Me.ucrInputHeaders.TabIndex = 43 ' - 'pnlRowNames - ' - Me.pnlRowNames.Controls.Add(Me.rdoRowNamesNo) - Me.pnlRowNames.Controls.Add(Me.rdoRowNamesYes) - Me.pnlRowNames.Location = New System.Drawing.Point(9, 126) - Me.pnlRowNames.Name = "pnlRowNames" - Me.pnlRowNames.Size = New System.Drawing.Size(106, 24) - Me.pnlRowNames.TabIndex = 42 - ' - 'rdoRowNamesNo - ' - Me.rdoRowNamesNo.AutoSize = True - Me.rdoRowNamesNo.Location = New System.Drawing.Point(55, 3) - Me.rdoRowNamesNo.Name = "rdoRowNamesNo" - Me.rdoRowNamesNo.Size = New System.Drawing.Size(39, 17) - Me.rdoRowNamesNo.TabIndex = 41 - Me.rdoRowNamesNo.TabStop = True - Me.rdoRowNamesNo.Tag = "No" - Me.rdoRowNamesNo.Text = "No" - Me.rdoRowNamesNo.UseVisualStyleBackColor = True - ' - 'rdoRowNamesYes - ' - Me.rdoRowNamesYes.AutoSize = True - Me.rdoRowNamesYes.Location = New System.Drawing.Point(6, 4) - Me.rdoRowNamesYes.Name = "rdoRowNamesYes" - Me.rdoRowNamesYes.Size = New System.Drawing.Size(43, 17) - Me.rdoRowNamesYes.TabIndex = 40 - Me.rdoRowNamesYes.TabStop = True - Me.rdoRowNamesYes.Tag = "Yes" - Me.rdoRowNamesYes.Text = "Yes" - Me.rdoRowNamesYes.UseVisualStyleBackColor = True - ' 'ucrInputNAStrings ' + Me.ucrInputNAStrings.AddQuotesIfUnrecognised = True + Me.ucrInputNAStrings.IsMultiline = False Me.ucrInputNAStrings.IsReadOnly = False Me.ucrInputNAStrings.Location = New System.Drawing.Point(5, 247) Me.ucrInputNAStrings.Name = "ucrInputNAStrings" @@ -318,6 +271,7 @@ Partial Class dlgImportDataset ' 'ucrInputDecimal ' + Me.ucrInputDecimal.AddQuotesIfUnrecognised = True Me.ucrInputDecimal.IsReadOnly = False Me.ucrInputDecimal.Location = New System.Drawing.Point(74, 196) Me.ucrInputDecimal.Name = "ucrInputDecimal" @@ -326,6 +280,7 @@ Partial Class dlgImportDataset ' 'ucrInputSeparator ' + Me.ucrInputSeparator.AddQuotesIfUnrecognised = True Me.ucrInputSeparator.IsReadOnly = False Me.ucrInputSeparator.Location = New System.Drawing.Point(74, 154) Me.ucrInputSeparator.Name = "ucrInputSeparator" @@ -334,6 +289,7 @@ Partial Class dlgImportDataset ' 'ucrInputEncoding ' + Me.ucrInputEncoding.AddQuotesIfUnrecognised = True Me.ucrInputEncoding.IsReadOnly = False Me.ucrInputEncoding.Location = New System.Drawing.Point(62, 25) Me.ucrInputEncoding.Name = "ucrInputEncoding" @@ -342,16 +298,18 @@ Partial Class dlgImportDataset ' 'grpExcel ' + Me.grpExcel.Controls.Add(Me.ucrchkColumnNames) + Me.grpExcel.Controls.Add(Me.ucrNudxlRowsToSkip) + Me.grpExcel.Controls.Add(Me.Label1) + Me.grpExcel.Controls.Add(Me.ucrInputMaximumDataSize) Me.grpExcel.Controls.Add(Me.lblMissingValueString) Me.grpExcel.Controls.Add(Me.ucrInputXlMissingValueString) - Me.grpExcel.Controls.Add(Me.lblNamedRegion) Me.grpExcel.Controls.Add(Me.ucrInputNamedRegions) + Me.grpExcel.Controls.Add(Me.lblNamedRegion) Me.grpExcel.Controls.Add(Me.ucrInputSheets) Me.grpExcel.Controls.Add(Me.lblRowToSkip) Me.grpExcel.Controls.Add(Me.lblSheets) - Me.grpExcel.Controls.Add(Me.nudxlRowsToSkip) - Me.grpExcel.Controls.Add(Me.chkColumnNames) - Me.grpExcel.Location = New System.Drawing.Point(15, 87) + Me.grpExcel.Location = New System.Drawing.Point(669, 86) Me.grpExcel.Name = "grpExcel" Me.grpExcel.Size = New System.Drawing.Size(217, 392) Me.grpExcel.TabIndex = 35 @@ -359,10 +317,49 @@ Partial Class dlgImportDataset Me.grpExcel.Text = "Import Excel options" Me.grpExcel.Visible = False ' + 'ucrchkColumnNames + ' + Me.ucrchkColumnNames.Checked = False + Me.ucrchkColumnNames.Location = New System.Drawing.Point(9, 116) + Me.ucrchkColumnNames.Name = "ucrchkColumnNames" + Me.ucrchkColumnNames.Size = New System.Drawing.Size(170, 20) + Me.ucrchkColumnNames.TabIndex = 39 + ' + 'ucrNudxlRowsToSkip + ' + Me.ucrNudxlRowsToSkip.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudxlRowsToSkip.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudxlRowsToSkip.Location = New System.Drawing.Point(84, 138) + Me.ucrNudxlRowsToSkip.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudxlRowsToSkip.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudxlRowsToSkip.Name = "ucrNudxlRowsToSkip" + Me.ucrNudxlRowsToSkip.Size = New System.Drawing.Size(50, 20) + Me.ucrNudxlRowsToSkip.TabIndex = 42 + Me.ucrNudxlRowsToSkip.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'Label1 + ' + Me.Label1.AutoSize = True + Me.Label1.Location = New System.Drawing.Point(3, 162) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(100, 13) + Me.Label1.TabIndex = 41 + Me.Label1.Text = "Maximum Data Size" + ' + 'ucrInputMaximumDataSize + ' + Me.ucrInputMaximumDataSize.AddQuotesIfUnrecognised = True + Me.ucrInputMaximumDataSize.IsMultiline = False + Me.ucrInputMaximumDataSize.IsReadOnly = False + Me.ucrInputMaximumDataSize.Location = New System.Drawing.Point(2, 180) + Me.ucrInputMaximumDataSize.Name = "ucrInputMaximumDataSize" + Me.ucrInputMaximumDataSize.Size = New System.Drawing.Size(137, 21) + Me.ucrInputMaximumDataSize.TabIndex = 40 + ' 'lblMissingValueString ' Me.lblMissingValueString.AutoSize = True - Me.lblMissingValueString.Location = New System.Drawing.Point(6, 126) + Me.lblMissingValueString.Location = New System.Drawing.Point(7, 71) Me.lblMissingValueString.Name = "lblMissingValueString" Me.lblMissingValueString.Size = New System.Drawing.Size(102, 13) Me.lblMissingValueString.TabIndex = 19 @@ -370,12 +367,23 @@ Partial Class dlgImportDataset ' 'ucrInputXlMissingValueString ' + Me.ucrInputXlMissingValueString.AddQuotesIfUnrecognised = True + Me.ucrInputXlMissingValueString.IsMultiline = False Me.ucrInputXlMissingValueString.IsReadOnly = False - Me.ucrInputXlMissingValueString.Location = New System.Drawing.Point(5, 144) + Me.ucrInputXlMissingValueString.Location = New System.Drawing.Point(23, 281) Me.ucrInputXlMissingValueString.Name = "ucrInputXlMissingValueString" Me.ucrInputXlMissingValueString.Size = New System.Drawing.Size(137, 21) Me.ucrInputXlMissingValueString.TabIndex = 18 ' + 'ucrInputNamedRegions + ' + Me.ucrInputNamedRegions.AddQuotesIfUnrecognised = True + Me.ucrInputNamedRegions.IsReadOnly = False + Me.ucrInputNamedRegions.Location = New System.Drawing.Point(9, 75) + Me.ucrInputNamedRegions.Name = "ucrInputNamedRegions" + Me.ucrInputNamedRegions.Size = New System.Drawing.Size(154, 21) + Me.ucrInputNamedRegions.TabIndex = 16 + ' 'lblNamedRegion ' Me.lblNamedRegion.AutoSize = True @@ -385,16 +393,9 @@ Partial Class dlgImportDataset Me.lblNamedRegion.TabIndex = 17 Me.lblNamedRegion.Text = "or Named Region" ' - 'ucrInputNamedRegions - ' - Me.ucrInputNamedRegions.IsReadOnly = False - Me.ucrInputNamedRegions.Location = New System.Drawing.Point(4, 96) - Me.ucrInputNamedRegions.Name = "ucrInputNamedRegions" - Me.ucrInputNamedRegions.Size = New System.Drawing.Size(154, 21) - Me.ucrInputNamedRegions.TabIndex = 16 - ' 'ucrInputSheets ' + Me.ucrInputSheets.AddQuotesIfUnrecognised = True Me.ucrInputSheets.IsReadOnly = False Me.ucrInputSheets.Location = New System.Drawing.Point(6, 43) Me.ucrInputSheets.Name = "ucrInputSheets" @@ -404,7 +405,7 @@ Partial Class dlgImportDataset 'lblRowToSkip ' Me.lblRowToSkip.AutoSize = True - Me.lblRowToSkip.Location = New System.Drawing.Point(3, 96) + Me.lblRowToSkip.Location = New System.Drawing.Point(3, 140) Me.lblRowToSkip.Name = "lblRowToSkip" Me.lblRowToSkip.Size = New System.Drawing.Size(70, 13) Me.lblRowToSkip.TabIndex = 7 @@ -419,110 +420,6 @@ Partial Class dlgImportDataset Me.lblSheets.TabIndex = 6 Me.lblSheets.Text = "Select Sheet" ' - 'nudxlRowsToSkip - ' - Me.nudxlRowsToSkip.Location = New System.Drawing.Point(77, 94) - Me.nudxlRowsToSkip.Name = "nudxlRowsToSkip" - Me.nudxlRowsToSkip.Size = New System.Drawing.Size(49, 20) - Me.nudxlRowsToSkip.TabIndex = 5 - ' - 'chkColumnNames - ' - Me.chkColumnNames.AutoSize = True - Me.chkColumnNames.Location = New System.Drawing.Point(5, 73) - Me.chkColumnNames.Name = "chkColumnNames" - Me.chkColumnNames.Size = New System.Drawing.Size(154, 17) - Me.chkColumnNames.TabIndex = 2 - Me.chkColumnNames.Text = "First Row is Column Names" - Me.chkColumnNames.UseVisualStyleBackColor = True - ' - 'grpRDS - ' - Me.grpRDS.Controls.Add(Me.chkImportCalculations) - Me.grpRDS.Controls.Add(Me.chkImportFilters) - Me.grpRDS.Controls.Add(Me.chkImportChangesLog) - Me.grpRDS.Controls.Add(Me.chkOverWrite) - Me.grpRDS.Controls.Add(Me.chkImportMetadata) - Me.grpRDS.Controls.Add(Me.chkImportObjects) - Me.grpRDS.Controls.Add(Me.chkExistingData) - Me.grpRDS.Location = New System.Drawing.Point(16, 88) - Me.grpRDS.Name = "grpRDS" - Me.grpRDS.Size = New System.Drawing.Size(217, 150) - Me.grpRDS.TabIndex = 36 - Me.grpRDS.TabStop = False - Me.grpRDS.Text = "Import RDS options" - Me.grpRDS.Visible = False - ' - 'chkImportCalculations - ' - Me.chkImportCalculations.AutoSize = True - Me.chkImportCalculations.Location = New System.Drawing.Point(3, 91) - Me.chkImportCalculations.Name = "chkImportCalculations" - Me.chkImportCalculations.Size = New System.Drawing.Size(114, 17) - Me.chkImportCalculations.TabIndex = 7 - Me.chkImportCalculations.Text = "Import calculations" - Me.chkImportCalculations.UseVisualStyleBackColor = True - ' - 'chkImportFilters - ' - Me.chkImportFilters.AutoSize = True - Me.chkImportFilters.Location = New System.Drawing.Point(3, 73) - Me.chkImportFilters.Name = "chkImportFilters" - Me.chkImportFilters.Size = New System.Drawing.Size(82, 17) - Me.chkImportFilters.TabIndex = 6 - Me.chkImportFilters.Text = "Import filters" - Me.chkImportFilters.UseVisualStyleBackColor = True - ' - 'chkImportChangesLog - ' - Me.chkImportChangesLog.AutoSize = True - Me.chkImportChangesLog.Location = New System.Drawing.Point(3, 109) - Me.chkImportChangesLog.Name = "chkImportChangesLog" - Me.chkImportChangesLog.Size = New System.Drawing.Size(116, 17) - Me.chkImportChangesLog.TabIndex = 5 - Me.chkImportChangesLog.Text = "Import changes log" - Me.chkImportChangesLog.UseVisualStyleBackColor = True - ' - 'chkOverWrite - ' - Me.chkOverWrite.AutoSize = True - Me.chkOverWrite.Location = New System.Drawing.Point(3, 127) - Me.chkOverWrite.Name = "chkOverWrite" - Me.chkOverWrite.Size = New System.Drawing.Size(198, 17) - Me.chkOverWrite.TabIndex = 4 - Me.chkOverWrite.Text = "Overwrite existing if duplicates found" - Me.chkOverWrite.UseVisualStyleBackColor = True - ' - 'chkImportMetadata - ' - Me.chkImportMetadata.AutoSize = True - Me.chkImportMetadata.Location = New System.Drawing.Point(3, 37) - Me.chkImportMetadata.Name = "chkImportMetadata" - Me.chkImportMetadata.Size = New System.Drawing.Size(102, 17) - Me.chkImportMetadata.TabIndex = 2 - Me.chkImportMetadata.Text = "Import metadata" - Me.chkImportMetadata.UseVisualStyleBackColor = True - ' - 'chkImportObjects - ' - Me.chkImportObjects.AutoSize = True - Me.chkImportObjects.Location = New System.Drawing.Point(3, 55) - Me.chkImportObjects.Name = "chkImportObjects" - Me.chkImportObjects.Size = New System.Drawing.Size(92, 17) - Me.chkImportObjects.TabIndex = 1 - Me.chkImportObjects.Text = "Import objects" - Me.chkImportObjects.UseVisualStyleBackColor = True - ' - 'chkExistingData - ' - Me.chkExistingData.AutoSize = True - Me.chkExistingData.Location = New System.Drawing.Point(3, 19) - Me.chkExistingData.Name = "chkExistingData" - Me.chkExistingData.Size = New System.Drawing.Size(147, 17) - Me.chkExistingData.TabIndex = 0 - Me.chkExistingData.Text = "Keep existing data frames" - Me.chkExistingData.UseVisualStyleBackColor = True - ' 'lblCannotImport ' Me.lblCannotImport.AutoSize = True @@ -550,6 +447,8 @@ Partial Class dlgImportDataset ' 'ucrInputFilePath ' + Me.ucrInputFilePath.AddQuotesIfUnrecognised = True + Me.ucrInputFilePath.IsMultiline = False Me.ucrInputFilePath.IsReadOnly = False Me.ucrInputFilePath.Location = New System.Drawing.Point(39, 23) Me.ucrInputFilePath.Name = "ucrInputFilePath" @@ -558,6 +457,8 @@ Partial Class dlgImportDataset ' 'ucrInputName ' + Me.ucrInputName.AddQuotesIfUnrecognised = True + Me.ucrInputName.IsMultiline = False Me.ucrInputName.IsReadOnly = False Me.ucrInputName.Location = New System.Drawing.Point(128, 58) Me.ucrInputName.Name = "ucrInputName" @@ -571,13 +472,137 @@ Partial Class dlgImportDataset Me.ucrBase.Size = New System.Drawing.Size(410, 53) Me.ucrBase.TabIndex = 27 ' + 'grpRDS + ' + Me.grpRDS.Controls.Add(Me.ucrChkOverWrite) + Me.grpRDS.Controls.Add(Me.ucrChkImportObjects) + Me.grpRDS.Controls.Add(Me.ucrChkImportCalculations) + Me.grpRDS.Controls.Add(Me.ucrChkImportChangesLog) + Me.grpRDS.Controls.Add(Me.ucrChkImportFilters) + Me.grpRDS.Controls.Add(Me.ucrChkImportMetadata) + Me.grpRDS.Controls.Add(Me.ucrChkExistingData) + Me.grpRDS.Location = New System.Drawing.Point(329, 56) + Me.grpRDS.Name = "grpRDS" + Me.grpRDS.Size = New System.Drawing.Size(217, 166) + Me.grpRDS.TabIndex = 37 + Me.grpRDS.TabStop = False + Me.grpRDS.Text = "Import RDS options" + Me.grpRDS.Visible = False + ' + 'ucrChkOverWrite + ' + Me.ucrChkOverWrite.Checked = False + Me.ucrChkOverWrite.Location = New System.Drawing.Point(6, 134) + Me.ucrChkOverWrite.Name = "ucrChkOverWrite" + Me.ucrChkOverWrite.Size = New System.Drawing.Size(205, 20) + Me.ucrChkOverWrite.TabIndex = 49 + ' + 'ucrChkImportObjects + ' + Me.ucrChkImportObjects.Checked = False + Me.ucrChkImportObjects.Location = New System.Drawing.Point(6, 54) + Me.ucrChkImportObjects.Name = "ucrChkImportObjects" + Me.ucrChkImportObjects.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportObjects.TabIndex = 48 + ' + 'ucrChkImportCalculations + ' + Me.ucrChkImportCalculations.Checked = False + Me.ucrChkImportCalculations.Location = New System.Drawing.Point(6, 94) + Me.ucrChkImportCalculations.Name = "ucrChkImportCalculations" + Me.ucrChkImportCalculations.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportCalculations.TabIndex = 47 + ' + 'ucrChkImportChangesLog + ' + Me.ucrChkImportChangesLog.Checked = False + Me.ucrChkImportChangesLog.Location = New System.Drawing.Point(6, 114) + Me.ucrChkImportChangesLog.Name = "ucrChkImportChangesLog" + Me.ucrChkImportChangesLog.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportChangesLog.TabIndex = 46 + ' + 'ucrChkImportFilters + ' + Me.ucrChkImportFilters.Checked = False + Me.ucrChkImportFilters.Location = New System.Drawing.Point(6, 74) + Me.ucrChkImportFilters.Name = "ucrChkImportFilters" + Me.ucrChkImportFilters.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportFilters.TabIndex = 45 + ' + 'ucrChkImportMetadata + ' + Me.ucrChkImportMetadata.Checked = False + Me.ucrChkImportMetadata.Location = New System.Drawing.Point(6, 34) + Me.ucrChkImportMetadata.Name = "ucrChkImportMetadata" + Me.ucrChkImportMetadata.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportMetadata.TabIndex = 44 + ' + 'ucrChkExistingData + ' + Me.ucrChkExistingData.Checked = False + Me.ucrChkExistingData.Location = New System.Drawing.Point(6, 14) + Me.ucrChkExistingData.Name = "ucrChkExistingData" + Me.ucrChkExistingData.Size = New System.Drawing.Size(205, 20) + Me.ucrChkExistingData.TabIndex = 43 + ' + 'ucrPnlRowNames + ' + Me.ucrPnlRowNames.Location = New System.Drawing.Point(15, 124) + Me.ucrPnlRowNames.Name = "ucrPnlRowNames" + Me.ucrPnlRowNames.Size = New System.Drawing.Size(113, 24) + Me.ucrPnlRowNames.TabIndex = 44 + ' + 'rdoRowNamesNo + ' + Me.rdoRowNamesNo.AutoSize = True + Me.rdoRowNamesNo.Location = New System.Drawing.Point(70, 130) + Me.rdoRowNamesNo.Name = "rdoRowNamesNo" + Me.rdoRowNamesNo.Size = New System.Drawing.Size(39, 17) + Me.rdoRowNamesNo.TabIndex = 46 + Me.rdoRowNamesNo.TabStop = True + Me.rdoRowNamesNo.Tag = "No" + Me.rdoRowNamesNo.Text = "No" + Me.rdoRowNamesNo.UseVisualStyleBackColor = True + ' + 'rdoRowNamesYes + ' + Me.rdoRowNamesYes.AutoSize = True + Me.rdoRowNamesYes.Location = New System.Drawing.Point(21, 131) + Me.rdoRowNamesYes.Name = "rdoRowNamesYes" + Me.rdoRowNamesYes.Size = New System.Drawing.Size(43, 17) + Me.rdoRowNamesYes.TabIndex = 45 + Me.rdoRowNamesYes.TabStop = True + Me.rdoRowNamesYes.Tag = "Yes" + Me.rdoRowNamesYes.Text = "Yes" + Me.rdoRowNamesYes.UseVisualStyleBackColor = True + ' + 'ucrNudSkip + ' + Me.ucrNudSkip.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSkip.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudSkip.Location = New System.Drawing.Point(81, 277) + Me.ucrNudSkip.Maximum = New Decimal(New Integer() {1000000, 0, 0, 0}) + Me.ucrNudSkip.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSkip.Name = "ucrNudSkip" + Me.ucrNudSkip.Size = New System.Drawing.Size(50, 20) + Me.ucrNudSkip.TabIndex = 47 + Me.ucrNudSkip.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkStringsAsFactors + ' + Me.ucrChkStringsAsFactors.Checked = False + Me.ucrChkStringsAsFactors.Location = New System.Drawing.Point(7, 307) + Me.ucrChkStringsAsFactors.Name = "ucrChkStringsAsFactors" + Me.ucrChkStringsAsFactors.Size = New System.Drawing.Size(206, 20) + Me.ucrChkStringsAsFactors.TabIndex = 43 + ' 'dlgImportDataset ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(668, 499) - Me.Controls.Add(Me.lblNoPreview) + Me.ClientSize = New System.Drawing.Size(889, 499) Me.Controls.Add(Me.grpRDS) + Me.Controls.Add(Me.lblNoPreview) Me.Controls.Add(Me.grpExcel) Me.Controls.Add(Me.grpCSV) Me.Controls.Add(Me.ucrInputFilePath) @@ -598,16 +623,11 @@ Partial Class dlgImportDataset Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Tag = "Import_Dataset" Me.Text = "Import Dataset" - CType(Me.nudSkip, System.ComponentModel.ISupportInitialize).EndInit() Me.grpCSV.ResumeLayout(False) Me.grpCSV.PerformLayout() - Me.pnlRowNames.ResumeLayout(False) - Me.pnlRowNames.PerformLayout() Me.grpExcel.ResumeLayout(False) Me.grpExcel.PerformLayout() - CType(Me.nudxlRowsToSkip, System.ComponentModel.ISupportInitialize).EndInit() Me.grpRDS.ResumeLayout(False) - Me.grpRDS.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -623,25 +643,15 @@ Partial Class dlgImportDataset Friend WithEvents lblDecimal As Label Friend WithEvents lblNAStrings As Label Friend WithEvents txtPreview As TextBox - Friend WithEvents chkStringsAsFactors As CheckBox Friend WithEvents ucrBase As ucrButtons Friend WithEvents grdDataPreview As unvell.ReoGrid.ReoGridControl Friend WithEvents lblFileOpenPath As Label Friend WithEvents lblLinesToSkip As Label - Friend WithEvents nudSkip As NumericUpDown Friend WithEvents cmdOpenDataSet As Button Friend WithEvents grpCSV As GroupBox Friend WithEvents grpExcel As GroupBox - Friend WithEvents nudxlRowsToSkip As NumericUpDown - Friend WithEvents chkColumnNames As CheckBox Friend WithEvents lblRowToSkip As Label Friend WithEvents lblSheets As Label - Friend WithEvents grpRDS As GroupBox - Friend WithEvents chkImportMetadata As CheckBox - Friend WithEvents chkImportObjects As CheckBox - Friend WithEvents chkExistingData As CheckBox - Friend WithEvents chkOverWrite As CheckBox - Friend WithEvents chkImportChangesLog As CheckBox Friend WithEvents ucrInputName As ucrInputTextBox Friend WithEvents ucrInputSheets As ucrInputComboBox Friend WithEvents lblNamedRegion As Label @@ -652,13 +662,25 @@ Partial Class dlgImportDataset Friend WithEvents ucrInputSeparator As ucrInputComboBox Friend WithEvents ucrInputNAStrings As ucrInputTextBox Friend WithEvents ucrInputDecimal As ucrInputComboBox - Friend WithEvents pnlRowNames As Panel - Friend WithEvents rdoRowNamesNo As RadioButton - Friend WithEvents rdoRowNamesYes As RadioButton Friend WithEvents ucrInputHeaders As ucrInputComboBox Friend WithEvents lblMissingValueString As Label Friend WithEvents ucrInputXlMissingValueString As ucrInputTextBox - Friend WithEvents chkImportFilters As CheckBox - Friend WithEvents chkImportCalculations As CheckBox Friend WithEvents lblNoPreview As Label + Friend WithEvents Label1 As Label + Friend WithEvents ucrInputMaximumDataSize As ucrInputTextBox + Friend WithEvents ucrNudxlRowsToSkip As ucrNud + Friend WithEvents grpRDS As GroupBox + Friend WithEvents ucrchkColumnNames As ucrCheck + Friend WithEvents ucrChkExistingData As ucrCheck + Friend WithEvents ucrChkOverWrite As ucrCheck + Friend WithEvents ucrChkImportObjects As ucrCheck + Friend WithEvents ucrChkImportCalculations As ucrCheck + Friend WithEvents ucrChkImportChangesLog As ucrCheck + Friend WithEvents ucrChkImportFilters As ucrCheck + Friend WithEvents ucrChkImportMetadata As ucrCheck + Friend WithEvents rdoRowNamesNo As RadioButton + Friend WithEvents rdoRowNamesYes As RadioButton + Friend WithEvents ucrPnlRowNames As UcrPanel + Friend WithEvents ucrNudSkip As ucrNud + Friend WithEvents ucrChkStringsAsFactors As ucrCheck End Class diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 130b90ed60d..5997503c219 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -28,6 +28,7 @@ Public Class dlgImportDataset Dim strLibraryPath As String Dim strFileType As String Dim bCanImport As Boolean + Private bReset As Boolean = True Dim bComponentsInitialised As Boolean Public bStartOpenDialog As Boolean Public strFilePathToUseOnLoad As String @@ -73,6 +74,8 @@ Public Class dlgImportDataset GetFileFromOpenDialog() bStartOpenDialog = False End If + SetRCodeForControls(bReset) + bReset = False TestOkEnabled() End Sub @@ -84,6 +87,25 @@ Public Class dlgImportDataset ucrInputName.SetValidationTypeAsRVariable() strTempWorkbookName = "temp_workbook" + ucrChkStringsAsFactors.SetText("Convert Strings to Factor Columns") + + ucrChkExistingData.SetText("Keep existing data frames") + ucrChkExistingData.SetParameter(New RParameter("keep_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + + ucrChkImportMetadata.SetText("Import metadata") + ucrChkImportMetadata.SetParameter(New RParameter("include_metadata"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + + ucrChkImportObjects.SetText("Import objects") + ucrChkImportObjects.SetParameter(New RParameter("include_objects"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + + ucrChkImportFilters.SetText("Import filters") + ucrChkImportFilters.SetParameter(New RParameter("include_filters"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + + ucrChkImportCalculations.SetText("Import calculations") + ucrChkImportCalculations.SetParameter(New RParameter("include_calculations"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + + ucrChkOverWrite.SetText("Overwrite existing if duplicates found") + ucrChkOverWrite.SetParameter(New RParameter("overwrite_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") 'temp disabled until can easily switch between fread and read.csv rdoRowNamesYes.Enabled = False 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator @@ -96,15 +118,15 @@ Public Class dlgImportDataset ucrInputFilePath.IsReadOnly = True 'xl options settings - nudxlRowsToSkip.Maximum = Integer.MaxValue + ucrNudxlRowsToSkip.Maximum = Integer.MaxValue 'csv options settings clsReadCSV.AddParameter("check.names", "TRUE") ucrInputEncoding.SetItems({"unknown"}) - ucrInputSeparator.SetItems({"Automatic", ",", "Whitespace", ":", ";", "|", "^"}) + ucrInputSeparator.SetItems({"Automatic", ", ", "Whitespace", ": ", ";", "|", "^"}) ucrInputHeaders.SetItems({"Automatic", "Yes", "No"}) ucrInputDecimal.SetItems({"Automatic", ".", ","}) - nudSkip.Maximum = Integer.MaxValue + ucrNudSkip.Maximum = Integer.MaxValue End Sub Private Sub SetDefaults() @@ -142,7 +164,9 @@ Public Class dlgImportDataset #Region "Dialog options" Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() + SetRCodeForControls(True) RefreshFrameView() + TestOkEnabled() End Sub Private Sub TestOkEnabled() @@ -200,6 +224,11 @@ Public Class dlgImportDataset End Using End Sub + Public Sub SetRCodeForControls(bReset As Boolean) + ucrChkExistingData.SetRCode(clsImportRDS, bReset) + ' ucrChkExistingData.AddAdditionalCodeParameterPair(cls) + End Sub + Public Sub SetDialogWithFile(strFilePath As String) Dim strFileExt As String Dim strFileName As String @@ -268,7 +297,7 @@ Public Class dlgImportDataset clsReadXL.RemoveParameterByName("readxl") End If FillExcelSheetsAndRegions(strFilePath) - ucrInputName.Focus() + 'ucrInputName.SetName(strFileName, bSilent:=True) Else strFileType = strFileExt.Substring(1) @@ -299,7 +328,7 @@ Public Class dlgImportDataset Try sReader = New StreamReader(ucrInputFilePath.GetText()) txtPreview.Text = "" - For i = 1 To intLines + nudSkip.Value + 1 + For i = 1 To intLines + ucrNudSkip.Value + 1 txtPreview.Text = txtPreview.Text & sReader.ReadLine() & Environment.NewLine If sReader.Peek() = -1 Then Exit For @@ -406,99 +435,99 @@ Public Class dlgImportDataset #Region "RDS options" Private Sub SetRDSDefaults() - chkExistingData.Checked = True - chkImportObjects.Checked = True - chkImportMetadata.Checked = True - chkImportChangesLog.Checked = True - chkImportFilters.Checked = True - chkImportCalculations.Checked = True - chkOverWrite.Checked = False - End Sub - - - Private Sub chkExisting_CheckStateChanged(sender As Object, e As EventArgs) Handles chkExistingData.CheckedChanged - If chkExistingData.Checked Then - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsImportRDS.AddParameter("keep_existing", "TRUE") - Else - clsImportRDS.RemoveParameterByName("keep_existing") - End If - Else - clsImportRDS.AddParameter("keep_existing", "FALSE") - End If - End Sub + 'chkExistingData.Checked = True + 'chkImportObjects.Checked = True + 'chkImportMetadata.Checked = True + 'chkImportChangesLog.Checked = True + 'chkImportFilters.Checked = True + 'chkImportCalculations.Checked = True + 'chkOverWrite.Checked = False + End Sub + + + 'Private Sub chkExisting_CheckStateChanged(sender As Object, e As EventArgs) + ' If chkExistingData.Checked Then + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsImportRDS.AddParameter("keep_existing", "TRUE") + ' Else + ' clsImportRDS.RemoveParameterByName("keep_existing") + ' End If + ' Else + ' clsImportRDS.AddParameter("keep_existing", "FALSE") + ' End If + 'End Sub - Private Sub chkLogs_CheckStateChanged(sender As Object, e As EventArgs) Handles chkImportChangesLog.CheckedChanged - If chkImportChangesLog.Checked Then - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsImportRDS.AddParameter("include_logs", "TRUE") - Else - clsImportRDS.RemoveParameterByName("include_logs") - End If - Else - clsImportRDS.RemoveParameterByName("include_logs") - End If - End Sub + 'Private Sub chkLogs_CheckStateChanged(sender As Object, e As EventArgs) + ' If chkImportChangesLog.Checked Then + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsImportRDS.AddParameter("include_logs", "TRUE") + ' Else + ' clsImportRDS.RemoveParameterByName("include_logs") + ' End If + ' Else + ' clsImportRDS.RemoveParameterByName("include_logs") + ' End If + 'End Sub - Private Sub chkOverWrite_CheckStateChanged(sender As Object, e As EventArgs) Handles chkOverWrite.CheckedChanged - If chkOverWrite.Checked Then - clsImportRDS.AddParameter("overwrite_existing", "TRUE") - Else - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsImportRDS.AddParameter("overwrite_existing", "FALSE") - Else - clsImportRDS.RemoveParameterByName("overwrite_existing") - End If - End If - End Sub + 'Private Sub chkOverWrite_CheckStateChanged(sender As Object, e As EventArgs) + ' If chkOverWrite.Checked Then + ' clsImportRDS.AddParameter("overwrite_existing", "TRUE") + ' Else + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsImportRDS.AddParameter("overwrite_existing", "FALSE") + ' Else + ' clsImportRDS.RemoveParameterByName("overwrite_existing") + ' End If + ' End If + 'End Sub - Private Sub chkMetadata_CheckStateChanged(sender As Object, e As EventArgs) Handles chkImportMetadata.CheckedChanged - If chkImportMetadata.Checked Then - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsImportRDS.AddParameter("include_metadata", "TRUE") - Else - clsImportRDS.RemoveParameterByName("include_metadata") - End If - Else - clsImportRDS.AddParameter("include_metadata", "FALSE") - End If - End Sub + 'Private Sub chkMetadata_CheckStateChanged(sender As Object, e As EventArgs) + ' If chkImportMetadata.Checked Then + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsImportRDS.AddParameter("include_metadata", "TRUE") + ' Else + ' clsImportRDS.RemoveParameterByName("include_metadata") + ' End If + ' Else + ' clsImportRDS.AddParameter("include_metadata", "FALSE") + ' End If + 'End Sub - Private Sub chkKeepFilters_CheckedChanged(sender As Object, e As EventArgs) Handles chkImportFilters.CheckedChanged - If chkImportFilters.Checked Then - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsImportRDS.AddParameter("include_filters", "TRUE") - Else - clsImportRDS.RemoveParameterByName("include_filters") - End If - Else - clsImportRDS.AddParameter("include_filters", "FALSE") - End If - End Sub + 'Private Sub chkKeepFilters_CheckedChanged(sender As Object, e As EventArgs) + ' If chkImportFilters.Checked Then + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsImportRDS.AddParameter("include_filters", "TRUE") + ' Else + ' clsImportRDS.RemoveParameterByName("include_filters") + ' End If + ' Else + ' clsImportRDS.AddParameter("include_filters", "FALSE") + ' End If + 'End Sub - Private Sub chkImportCalculations_CheckedChanged(sender As Object, e As EventArgs) Handles chkImportCalculations.CheckedChanged - If chkImportCalculations.Checked Then - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsImportRDS.AddParameter("include_calculations", "TRUE") - Else - clsImportRDS.RemoveParameterByName("include_calculations") - End If - Else - clsImportRDS.AddParameter("include_calculations", "FALSE") - End If - End Sub + 'Private Sub chkImportCalculations_CheckedChanged(sender As Object, e As EventArgs) + ' If chkImportCalculations.Checked Then + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsImportRDS.AddParameter("include_calculations", "TRUE") + ' Else + ' clsImportRDS.RemoveParameterByName("include_calculations") + ' End If + ' Else + ' clsImportRDS.AddParameter("include_calculations", "FALSE") + ' End If + 'End Sub - Private Sub chkKeepObjects_CheckStateChanged(sender As Object, e As EventArgs) Handles chkImportObjects.CheckStateChanged - If chkImportObjects.Checked Then - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsImportRDS.AddParameter("include_objects", "TRUE") - Else - clsImportRDS.RemoveParameterByName("include_objects") - End If - Else - clsImportRDS.AddParameter("include_objects", "FALSE") - End If - End Sub + 'Private Sub chkKeepObjects_CheckStateChanged(sender As Object, e As EventArgs) + ' If chkImportObjects.Checked Then + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsImportRDS.AddParameter("include_objects", "TRUE") + ' Else + ' clsImportRDS.RemoveParameterByName("include_objects") + ' End If + ' Else + ' clsImportRDS.AddParameter("include_objects", "FALSE") + ' End If + 'End Sub #End Region @@ -510,8 +539,8 @@ Public Class dlgImportDataset ucrInputHeaders.SetName("Automatic") ucrInputDecimal.SetName("Automatic") ucrInputNAStrings.SetName("NA") - nudSkip.Value = 0 - chkStringsAsFactors.Checked = True + ' ucrNudSkip.Value = 0 + 'ucrChkStringsAsFactors.Checked = True End Sub Private Sub ucrInputEncoding_NameChanged() Handles ucrInputEncoding.NameChanged @@ -525,7 +554,7 @@ Public Class dlgImportDataset End Sub - Private Sub rdoRowNames_CheckedChanged(sender As Object, e As EventArgs) Handles rdoRowNamesYes.CheckedChanged, rdoRowNamesNo.CheckedChanged + Private Sub rdoRowNames_CheckedChanged(sender As Object, e As EventArgs) If rdoRowNamesYes.Checked Then 'TODO this is not an option for fread so have to change function here clsReadCSV.AddParameter("row.names", 1) @@ -605,12 +634,12 @@ Public Class dlgImportDataset RefreshFrameView() End Sub - Private Sub nudSkips_TextChanged(sender As Object, e As EventArgs) Handles nudSkip.TextChanged + Private Sub nudSkips_TextChanged(sender As Object, e As EventArgs) If bComponentsInitialised Then - If nudSkip.Value = 0 Then + If ucrNudSkip.Value = 0 Then clsReadCSV.RemoveParameterByName("skip") Else - clsReadCSV.AddParameter("skip", nudSkip.Value) + clsReadCSV.AddParameter("skip", ucrNudSkip.Value) End If 'TODO R gives an error if skip is too large RefreshFilePreview() @@ -627,9 +656,9 @@ Public Class dlgImportDataset #Region "Excel options" Private Sub setExcelDefaults() - nudxlRowsToSkip.Value = 0 + ucrNudxlRowsToSkip.Value = 0 XlSkipRowsParameter() - chkColumnNames.Checked = True + ucrchkColumnNames.Checked = True XlStringsAsFactorsParameter() XlColNamesParameter() ucrInputXlMissingValueString.SetName("") @@ -676,17 +705,22 @@ Public Class dlgImportDataset 'ucrInputNamedRegions.SetName("") End Sub - Private Sub nudxlRowsToSkip_TextChanged(sender As Object, e As EventArgs) Handles nudxlRowsToSkip.TextChanged - XlSkipRowsParameter() - End Sub + ' Private Sub nudxlRowsToSkip_TextChanged(sender As Object, e As EventArgs) Handles ucrNudxlRowsToSkip.ControlValueChanged + ' XlSkipRowsParameter() + ' ucrchkColumnNames.SetText("Trim Trailing WhiteSpace") + ' End Sub + 'Private Sub nudxlRowsToSkip_TextChanged(sender As Object, e As EventArgs) Handles ucrchkColumnNames.ControlValueChanged + ' XlSkipRowsParameter() + ' ucrchkColumnNames.SetText("Trim Trailing WhiteSpace") + 'End Sub Private Sub XlSkipRowsParameter() If bComponentsInitialised Then - If nudxlRowsToSkip.Text <> "" Then - If nudxlRowsToSkip.Value = 0 AndAlso Not frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + If ucrNudxlRowsToSkip.Text <> "" Then + If ucrNudxlRowsToSkip.Value = 0 AndAlso Not frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsReadXL.RemoveParameterByName("skip") Else - clsReadXL.AddParameter("skip", nudxlRowsToSkip.Value) + clsReadXL.AddParameter("skip", ucrNudxlRowsToSkip.Value) End If Else clsReadXL.RemoveParameterByName("skip") @@ -695,9 +729,9 @@ Public Class dlgImportDataset End If End Sub - Private Sub chkColumnNames_CheckedChanged(sender As Object, e As EventArgs) Handles chkColumnNames.CheckedChanged - XlColNamesParameter() - End Sub + 'Private Sub chkColumnNames_CheckedChanged(sender As Object, e As EventArgs) Handles ucrchkColumnNames.ControlValueChanged + ' XlColNamesParameter() + 'End Sub Private Sub XlColNamesParameter() Dim strColNameParam As String @@ -710,7 +744,7 @@ Public Class dlgImportDataset clsReadXL.RemoveParameterByName("colNames") End If - If chkColumnNames.Checked Then + If ucrchkColumnNames.Checked Then If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then clsReadXL.AddParameter(strColNameParam, "TRUE") Else @@ -722,12 +756,12 @@ Public Class dlgImportDataset RefreshFrameView() End Sub - Private Sub chkStringsAsFactors_CheckedChanged(sender As Object, e As EventArgs) Handles chkStringsAsFactors.CheckedChanged + Private Sub chkStringsAsFactors_CheckedChanged(sender As Object, e As EventArgs) XlStringsAsFactorsParameter() End Sub Private Sub XlStringsAsFactorsParameter() - If chkStringsAsFactors.Checked Then + If ucrChkStringsAsFactors.Checked Then clsReadCSV.AddParameter("stringsAsFactors", "TRUE") Else If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then From cc0ebe47eef13979354c8ccc2fa5655c4919da91 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 19 Jun 2017 14:44:27 +0300 Subject: [PATCH 087/201] . --- instat/dlgImportDataset.vb | 2 +- instat/dlgOneVarFitModel.vb | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 5997503c219..c69305a62ac 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -581,7 +581,7 @@ Public Class dlgImportDataset Case "No" clsReadCSV.AddParameter("header", "FALSE") Case Else - clsReadCSV.RemoveParameterByName("header") + ' clsReadCSV.RemoveParameterByName("header") End Select RefreshFrameView() End Sub diff --git a/instat/dlgOneVarFitModel.vb b/instat/dlgOneVarFitModel.vb index 62a3d4c5afc..34630fee935 100644 --- a/instat/dlgOneVarFitModel.vb +++ b/instat/dlgOneVarFitModel.vb @@ -1,18 +1,18 @@ -' Instat-R -' Copyright (C) 2015 -' -' 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 k -' along with this program. If not, see . - +' Instat-R +' Copyright (C) 2015 +' +' 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 k +' along with this program. If not, see . + Imports instat.Translations Public Class dlgOneVarFitModel From a3369c15031df8f5e6d769368b02036ebf159256 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 19 Jun 2017 14:45:19 +0300 Subject: [PATCH 088/201] Revert "." This reverts commit cc0ebe47eef13979354c8ccc2fa5655c4919da91. --- instat/dlgImportDataset.vb | 2 +- instat/dlgOneVarFitModel.vb | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index c69305a62ac..5997503c219 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -581,7 +581,7 @@ Public Class dlgImportDataset Case "No" clsReadCSV.AddParameter("header", "FALSE") Case Else - ' clsReadCSV.RemoveParameterByName("header") + clsReadCSV.RemoveParameterByName("header") End Select RefreshFrameView() End Sub diff --git a/instat/dlgOneVarFitModel.vb b/instat/dlgOneVarFitModel.vb index 34630fee935..62a3d4c5afc 100644 --- a/instat/dlgOneVarFitModel.vb +++ b/instat/dlgOneVarFitModel.vb @@ -1,18 +1,18 @@ -' Instat-R -' Copyright (C) 2015 -' -' 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 k -' along with this program. If not, see . - +' Instat-R +' Copyright (C) 2015 +' +' 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 k +' along with this program. If not, see . + Imports instat.Translations Public Class dlgOneVarFitModel From acb5f2ced8061d0ab6857900075c846c1bb69217 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 19 Jun 2017 12:54:05 +0100 Subject: [PATCH 089/201] added to script option for RCode to be a string parameter in another function --- instat/clsRCodeStructure.vb | 5 +++++ instat/clsRFunction.vb | 11 ++++++++++- instat/clsROperator.vb | 15 ++++++++++++--- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index fae1af2f8bc..03d265c9d9f 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -54,6 +54,11 @@ Public Class RCodeStructure 'Will be cleared after running unless bClearFromGlobal = False Public bClearFromGlobal As Boolean = False + ' If True when running ToScript the function will be returned as a string that could be passed to R + ' e.g. "seq(from = 1, to = 10)" instead of seq(from = 1, to = 10) + ' When True, assignment cannot be used for the function or its parameters + Public bToScriptAsRString As Boolean = False + Public Event ParametersChanged() 'Public ReadOnly Property OrderedIndices As List(Of Integer) diff --git a/instat/clsRFunction.vb b/instat/clsRFunction.vb index 22e131b3931..452aa6b4ab5 100644 --- a/instat/clsRFunction.vb +++ b/instat/clsRFunction.vb @@ -51,7 +51,16 @@ Public Class RFunction strTemp = strTemp & clsParameters(i).ToScript(strScript) Next strTemp = strTemp & ")" - + If bToScriptAsRString Then + 'TODO 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 + 'Cannot have double quotes ("") in the string because strTemp will be wrapped with "" + 'In most cases signle quotes (') will give same functionality, though it's preferable to avoid this when constructing the RFunction + strTemp = strTemp.Replace(Chr(34), Chr(39)) + strTemp = Chr(34) & strTemp & Chr(34) + End If Return MyBase.ToScript(strScript, strTemp) End Function diff --git a/instat/clsROperator.vb b/instat/clsROperator.vb index 8f399977d1a..516b10b2884 100644 --- a/instat/clsROperator.vb +++ b/instat/clsROperator.vb @@ -56,10 +56,19 @@ Public Class ROperator strTemp = strTemp & Chr(32) & strOperation & Chr(32) strTemp = strTemp & clsParam.ToScript(strScript) Next + If bToScriptAsRString Then + 'TODO 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 + 'Cannot have double quotes ("") in the string because strTemp will be wrapped with "" + 'In most cases signle quotes (') will give same functionality, though it's preferable to avoid this when constructing the RFunction + strTemp = strTemp.Replace(Chr(34), Chr(39)) + strTemp = Chr(34) & strTemp & Chr(34) + End If Return MyBase.ToScript(strScript, strTemp) - End Function - - + End Function + Public Overrides Sub AddParameter(clsParam As RParameter) clsParam.bIncludeArgumentName = False 'We don't want to allow names in operator parameters... MyBase.AddParameter(clsParam) From 5ade41f7d1ff84c1c3c5703ac97c3fa1cf4da463 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 19 Jun 2017 16:31:32 +0300 Subject: [PATCH 090/201] csv import --- instat/dlgImportDataset.vb | 253 ++++++++++++++++++++++--------------- 1 file changed, 148 insertions(+), 105 deletions(-) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 5997503c219..02f417ec3f1 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -80,6 +80,11 @@ Public Class dlgImportDataset End Sub Private Sub InitialiseDialog() + Dim dctucrInputSeparator As New Dictionary(Of String, String) + Dim dctucrInputEncoding As New Dictionary(Of String, String) + Dim dctucrInputDecimal As New Dictionary(Of String, String) + Dim dctucrInputHeaders As New Dictionary(Of String, String) + ucrBase.iHelpTopicID = 11 'Removes the Sheet Tab control grdDataPreview.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, False) @@ -120,12 +125,41 @@ Public Class dlgImportDataset 'xl options settings ucrNudxlRowsToSkip.Maximum = Integer.MaxValue + ' ucrInputEncoding.SetItems({"unknown"}) + ucrInputEncoding.SetParameter(New RParameter("encoding", 1)) + dctucrInputEncoding.Add("Unknown ,", Chr(34) & "unknown" & Chr(34)) + ucrInputEncoding.SetRDefault(Chr(34) & "unknown" & Chr(34)) 'csv options settings clsReadCSV.AddParameter("check.names", "TRUE") - ucrInputEncoding.SetItems({"unknown"}) - ucrInputSeparator.SetItems({"Automatic", ", ", "Whitespace", ": ", ";", "|", "^"}) - ucrInputHeaders.SetItems({"Automatic", "Yes", "No"}) - ucrInputDecimal.SetItems({"Automatic", ".", ","}) + + ' ucrInputSeparator.SetItems({"Automatic", ", ", "Whitespace", ": ", ";", "|", "^"}) + ucrInputSeparator.SetParameter(New RParameter("sep")) + dctucrInputSeparator.Add("Automatic ,", Chr(34) & "auto" & Chr(34)) + dctucrInputSeparator.Add("Comma(,) ,", Chr(34) & "," & Chr(34)) + dctucrInputSeparator.Add("Whitespace ,", Chr(34) & " " & Chr(34)) + dctucrInputSeparator.Add("Colon(:) ,", Chr(34) & ":" & Chr(34)) + dctucrInputSeparator.Add("Semi-Colon(;) ,", Chr(34) & ";" & Chr(34)) + dctucrInputSeparator.Add("Vertcal-Line ,", Chr(34) & "|" & Chr(34)) + dctucrInputSeparator.Add("Power ,", Chr(34) & "^" & Chr(34)) + ucrInputSeparator.SetRDefault(Chr(34) & "" & Chr(34)) + + 'Check...Changed NO to FALSE! + 'ucrInputHeaders.SetItems({"Automatic", "Yes", "No"}) + ucrInputHeaders.SetParameter(New RParameter("header")) + dctucrInputHeaders.Add("Automatic", Chr(34) & "auto" & Chr(34)) + dctucrInputHeaders.Add("Yes", Chr(34) & "TRUE" & Chr(34)) + dctucrInputHeaders.Add("No", Chr(34) & "FALSE" & Chr(34)) + ucrInputHeaders.SetRDefault(Chr(34) & "FALSE" & Chr(34)) + + ' ucrInputDecimal.SetItems({"Automatic", ".", ","}) + ucrInputDecimal.SetParameter(New RParameter("dec")) + 'dec param absent + dctucrInputDecimal.Add("Automatic", Chr(34) & Chr(34)) + dctucrInputDecimal.Add("Period(.)", Chr(34) & "." & Chr(34)) + dctucrInputDecimal.Add("Comma(,)", Chr(34) & "," & Chr(34)) + ucrInputDecimal.SetRDefault(Chr(34) & "." & Chr(34)) + + ucrNudSkip.SetParameter(New RParameter("skip")) ucrNudSkip.Maximum = Integer.MaxValue End Sub @@ -144,6 +178,11 @@ Public Class dlgImportDataset SetCSVDefault() setExcelDefaults() SetRDSDefaults() + + clsReadCSV.AddParameter("encoding", Chr(34) & "unknown" & Chr(34)) + clsReadCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) + clsReadCSV.AddParameter("header", Chr(34) & "FALSE" & Chr(34)) + clsReadCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) End Sub #Region "Shared options" @@ -151,7 +190,7 @@ Public Class dlgImportDataset intLines = lines End Sub - Private Sub ucrInputName_NameChanged() Handles ucrInputName.NameChanged + Private Sub ucrInputName_NameChanged() Handles ucrInputName.ControlValueChanged If Not ucrInputName.IsEmpty AndAlso strFileType <> "RDS" Then ucrBase.clsRsyntax.SetAssignTo(ucrInputName.GetText(), strTempDataframe:=ucrInputName.GetText()) Else @@ -226,6 +265,10 @@ Public Class dlgImportDataset Public Sub SetRCodeForControls(bReset As Boolean) ucrChkExistingData.SetRCode(clsImportRDS, bReset) + ucrInputSeparator.SetRCode(clsReadCSV, bReset) + ucrInputHeaders.SetRCode(clsReadCSV, bReset) + ucrInputDecimal.SetRCode(clsReadCSV, bReset) + ucrInputEncoding.SetRCode(clsReadCSV, bReset) ' ucrChkExistingData.AddAdditionalCodeParameterPair(cls) End Sub @@ -363,67 +406,67 @@ Public Class dlgImportDataset bToBeAssigned = ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned = False If strFileType <> "RDS" Then - grdDataPreview.Show() - lblDataFrame.Show() + grdDataPreview.Show() + lblDataFrame.Show() If strFileType = "csv" Then clsReadCSV.AddParameter("nrows", intLines) ElseIf strFileType = "xlsx" Then 'iPosition = 0 is needed because of a bug in rio::import clsReadXL.AddParameter("rows", "1:" & intLines, iPosition:=0) End If - lblCannotImport.Hide() - lblNoPreview.Hide() - If ucrInputFilePath.IsEmpty() Then + lblCannotImport.Hide() + lblNoPreview.Hide() + If ucrInputFilePath.IsEmpty() Then + bValid = False + Else + clsAsCharacterFunc.AddParameter("data", clsRFunctionParameter:=ucrBase.clsRsyntax.clsBaseFunction) + expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsAsCharacterFunc.ToScript(), bSilent:=True) + bValid = (expTemp IsNot Nothing) + End If + If bValid Then + dfTemp = Nothing + If expTemp IsNot Nothing Then + dfTemp = expTemp.AsDataFrame + End If + If dfTemp Is Nothing Then bValid = False Else - clsAsCharacterFunc.AddParameter("data", clsRFunctionParameter:=ucrBase.clsRsyntax.clsBaseFunction) - expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsAsCharacterFunc.ToScript(), bSilent:=True) - bValid = (expTemp IsNot Nothing) - End If - If bValid Then - dfTemp = Nothing - If expTemp IsNot Nothing Then - dfTemp = expTemp.AsDataFrame - End If - If dfTemp Is Nothing Then - bValid = False - Else - ucrBase.clsRsyntax.RemoveParameter("nrows") + ucrBase.clsRsyntax.RemoveParameter("nrows") ucrBase.clsRsyntax.RemoveParameter("rows") 'If readXL is not the base function this may be needed. clsReadXL.RemoveParameterByName("rows") ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned = bToBeAssigned - Try - frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False) - grdDataPreview.Enabled = True - bCanImport = True - Catch - bValid = False - End Try - End If - End If - If Not bValid Then - grdDataPreview.CurrentWorksheet.Reset() - grdDataPreview.Enabled = False - If Not ucrInputFilePath.IsEmpty() Then - lblCannotImport.Show() - Else - lblCannotImport.Hide() - End If - bCanImport = False + Try + frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False) + grdDataPreview.Enabled = True + bCanImport = True + Catch + bValid = False + End Try End If - Else - bCanImport = True - lblCannotImport.Hide() - lblNoPreview.Show() - grdDataPreview.CurrentWorksheet.Reset() - grdDataPreview.Hide() - lblDataFrame.Hide() End If - If grdDataPreview.CurrentWorksheet IsNot Nothing Then - grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_DragSelectionToMoveCells, False) - grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_Readonly, True) + If Not bValid Then + grdDataPreview.CurrentWorksheet.Reset() + grdDataPreview.Enabled = False + If Not ucrInputFilePath.IsEmpty() Then + lblCannotImport.Show() + Else + lblCannotImport.Hide() + End If + bCanImport = False End If + Else + bCanImport = True + lblCannotImport.Hide() + lblNoPreview.Show() + grdDataPreview.CurrentWorksheet.Reset() + grdDataPreview.Hide() + lblDataFrame.Hide() + End If + If grdDataPreview.CurrentWorksheet IsNot Nothing Then + grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_DragSelectionToMoveCells, False) + grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_Readonly, True) + End If 'Remove as may have other effects 'For Each control In Me.Controls ' control.Enabled = True @@ -543,7 +586,7 @@ Public Class dlgImportDataset 'ucrChkStringsAsFactors.Checked = True End Sub - Private Sub ucrInputEncoding_NameChanged() Handles ucrInputEncoding.NameChanged + Private Sub ucrInputEncoding_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputEncoding.ControlValueChanged If ucrInputEncoding.GetText() <> "" AndAlso (ucrInputEncoding.GetText() <> "unknown" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then clsReadCSV.AddParameter("encoding", ucrInputEncoding.GetText) @@ -554,7 +597,7 @@ Public Class dlgImportDataset End Sub - Private Sub rdoRowNames_CheckedChanged(sender As Object, e As EventArgs) + Private Sub rdoRowNames_CheckedChanged() Handles ucrPnlRowNames.ControlValueChanged If rdoRowNamesYes.Checked Then 'TODO this is not an option for fread so have to change function here clsReadCSV.AddParameter("row.names", 1) @@ -567,65 +610,65 @@ Public Class dlgImportDataset End If End Sub - Private Sub ucrInputHeaders_NameChanged() Handles ucrInputHeaders.NameChanged - Select Case ucrInputHeaders.GetText() - Case "Automatic" - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsReadCSV.AddParameter("header", Chr(34) & "auto" & Chr(34)) - Else - clsReadCSV.RemoveParameterByName("header") - End If - clsReadCSV.RemoveParameterByName("header") - Case "Yes" - clsReadCSV.AddParameter("header", "TRUE") - Case "No" - clsReadCSV.AddParameter("header", "FALSE") - Case Else - clsReadCSV.RemoveParameterByName("header") - End Select + Private Sub ucrInputHeaders_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputHeaders.ControlValueChanged + ' Select Case ucrInputHeaders.GetText() + ' Case "Automatic" + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsReadCSV.AddParameter("header", Chr(34) & "auto" & Chr(34)) + ' Else + ' clsReadCSV.RemoveParameterByName("header") + ' End If + ' clsReadCSV.RemoveParameterByName("header") + ' Case "Yes" + ' clsReadCSV.AddParameter("header", "TRUE") + ' Case "No" + ' clsReadCSV.AddParameter("header", "FALSE") + ' Case Else + ' 'clsReadCSV.RemoveParameterByName("header") + ' End Select RefreshFrameView() End Sub - Private Sub ucrInputDecimal_NameChanged() Handles ucrInputDecimal.NameChanged - Select Case ucrInputDecimal.GetText - Case "Automatic" - clsReadCSV.RemoveParameterByName("dec") - Case Else - clsReadCSV.AddParameter("dec", Chr(34) & ucrInputDecimal.GetText() & Chr(34)) - End Select + Private Sub ucrInputDecimal_ControlValueChanged() Handles ucrInputDecimal.ControlValueChanged + 'Select Case ucrInputDecimal.GetText + ' Case "Automatic" + ' clsReadCSV.RemoveParameterByName("dec") + ' Case Else + ' clsReadCSV.AddParameter("dec", Chr(34) & ucrInputDecimal.GetText() & Chr(34)) + 'End Select RefreshFrameView() End Sub - Private Sub ucrInputSeparator_NameChanged() Handles ucrInputSeparator.NameChanged - Select Case ucrInputSeparator.GetText - Case "Automatic" - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsReadCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) - Else - clsReadCSV.RemoveParameterByName("sep") - End If - clsReadCSV.RemoveParameterByName("sep") - Case "Whitespace" - clsReadCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) - Case "" - clsReadCSV.RemoveParameterByName("sep") - Case Else - clsReadCSV.AddParameter("sep", Chr(34) & ucrInputSeparator.GetText() & Chr(34)) - End Select + Private Sub ucrInputSeparator_ControlValueChanged() Handles ucrInputSeparator.ControlValueChanged + 'Select Case ucrInputSeparator.GetText + ' Case "Automatic" + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsReadCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) + ' Else + ' clsReadCSV.RemoveParameterByName("sep") + ' End If + ' clsReadCSV.RemoveParameterByName("sep") + ' Case "Whitespace" + ' clsReadCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) + ' Case "" + ' clsReadCSV.RemoveParameterByName("sep") + ' Case Else + ' clsReadCSV.AddParameter("sep", Chr(34) & ucrInputSeparator.GetText() & Chr(34)) + 'End Select RefreshFrameView() End Sub - Private Sub ucrInputDecimal_TextChanged(sender As Object, e As EventArgs) Handles ucrInputDecimal.TextChanged - Select Case ucrInputDecimal.GetText - Case "Period" - clsReadCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) - Case "Comma" - clsReadCSV.AddParameter("dec", Chr(34) & "," & Chr(34)) - End Select + Private Sub ucrInputDecimal_TextChanged() Handles ucrInputDecimal.ControlValueChanged + 'Select Case ucrInputDecimal.GetText + ' Case "Period" + ' clsReadCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) + ' Case "Comma" + ' clsReadCSV.AddParameter("dec", Chr(34) & "," & Chr(34)) + 'End Select RefreshFrameView() End Sub - Private Sub ucrInputNAStrings_NameChanged() Handles ucrInputNAStrings.NameChanged + Private Sub ucrInputNAStrings_ControlValueChanged() Handles ucrInputNAStrings.ControlValueChanged If ucrInputNAStrings.GetText() <> "" AndAlso (ucrInputNAStrings.GetText() <> "NA" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then clsReadCSV.AddParameter("na.strings", Chr(34) & ucrInputNAStrings.GetText() & Chr(34)) Else @@ -634,7 +677,7 @@ Public Class dlgImportDataset RefreshFrameView() End Sub - Private Sub nudSkips_TextChanged(sender As Object, e As EventArgs) + Private Sub ucrNudSkip_ControlValueChanged() Handles ucrNudSkip.ControlValueChanged If bComponentsInitialised Then If ucrNudSkip.Value = 0 Then clsReadCSV.RemoveParameterByName("skip") @@ -756,7 +799,7 @@ Public Class dlgImportDataset RefreshFrameView() End Sub - Private Sub chkStringsAsFactors_CheckedChanged(sender As Object, e As EventArgs) + Private Sub Control_ControlValueChanged() Handles ucrChkStringsAsFactors.ControlValueChanged XlStringsAsFactorsParameter() End Sub @@ -778,7 +821,7 @@ Public Class dlgImportDataset frmMetaData.Show() End Sub - Private Sub ucrInputXlMissingValueString_NameChanged() Handles ucrInputXlMissingValueString.NameChanged + Private Sub ucrInputXlMissingValueString_ControlValueChanged() Handles ucrInputXlMissingValueString.ControlValueChanged If Not ucrInputXlMissingValueString.IsEmpty() Then clsReadXL.AddParameter("na", Chr(34) & ucrInputXlMissingValueString.GetText() & Chr(34)) Else @@ -791,7 +834,7 @@ Public Class dlgImportDataset RefreshFrameView() End Sub - Private Sub ucrInputSheets_NameChanged() Handles ucrInputSheets.NameChanged + Private Sub ucrInputSheets_ControlValueChanged() Handles ucrInputSheets.ControlValueChanged If Not ucrInputSheets.IsEmpty() Then If strFileType = "xlsx" Then clsReadXL.AddParameter("which", ucrInputSheets.cboInput.SelectedIndex + 1) @@ -828,7 +871,7 @@ Public Class dlgImportDataset End If End Sub - 'Private Sub ucrInputNamedRegions_NameChanged() Handles ucrInputNamedRegions.NameChanged + 'Private Sub ucrInputNamedRegions_ControlValueChanged() Handles ucrInputNamedRegions.ControlValueChanged ' If Not ucrInputNamedRegions.IsEmpty() Then ' clsReadXLSX.AddParameter("namedRegion", Chr(34) & ucrInputNamedRegions.GetText() & Chr(34)) ' ucrInputSheets.SetName("") From 7c22594300eaac371ecdc7195987896466b675d4 Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 14:50:21 +0100 Subject: [PATCH 091/201] bToScriptAsString addition --- instat/dlgSpells.vb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 170e4e67c94..96ac101ea14 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -153,7 +153,7 @@ Public Class dlgSpells 'DayFromandTo clsDayFromAndTo.SetRCommand("instat_calculation$new") clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) - 'clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) + clsDayFromAndTo.AddParameter("function_exp", clsDayFromAndToOperator.bToScriptAsRString = True, iPosition:=1) clsDayFromAndToOperator.SetOperation("&") clsDayFromAndToOperator.AddParameter("from", clsROperatorParameter:=clsDayFromOperator, iPosition:=0) clsDayFromOperator.SetOperation(">=") @@ -172,7 +172,7 @@ Public Class dlgSpells clsRRainday.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=2) clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=3) clsRRainday.AddParameter("save", "0", iPosition:=6) - ' clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) + clsRRainday.AddParameter("function_exp", clsRRaindayMatch.bToScriptAsRString = True, iPosition:=1) clsRRaindayMatch.SetRCommand("match") clsRRaindayMatch.AddParameter("x", clsROperatorParameter:=clsRRaindayAndOperator) clsRRaindayAndOperator.SetOperation("&") @@ -257,14 +257,14 @@ Public Class dlgSpells Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining Date column as key") - clsDayFromAndTo.SetAssignTo("Day_From_and_To") + ' clsDayFromAndTo.SetAssignTo("Day_From_and_To") clsGroupBy.SetAssignTo("Grouping") clsMaxValue.SetAssignTo("Spells_Rain") clsSpellLength.SetAssignTo("Dry_Spell") - clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) + ' clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) clsMaxValue.AddParameter("function_exp", Chr(34) & clsMaxValueFunction.ToScript & Chr(34), iPosition:=1) - clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) + ' clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) If ucrChkConditional.Checked Then clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) From 2e14ed66e4b1cc97da67fb93a0901d58ff7d9e8e Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 15:00:08 +0100 Subject: [PATCH 092/201] receiver year --- instat/dlgStartofRains.vb | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 27cb86fa007..93aff44d673 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -13,7 +13,6 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . -Imports instat Imports instat.Translations Public Class dlgStartofRains @@ -174,7 +173,7 @@ Public Class dlgStartofRains End Sub Private Sub SetDefaults() - clsAddKey = New RFunction + ' clsAddKey = New RFunction clsAddKeyColName = New RFunction clsDayFromAndTo = New RFunction clsDayFromAndToOperator = New ROperator @@ -259,7 +258,7 @@ Public Class dlgStartofRains clsFirstDOYPerYear.SetRCommand("instat_calculation$new") clsManipulationFirstDOYPerYear.SetRCommand("list") clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) - clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & clsFirstDOYPerYearOperator.ToScript & Chr(34), iPosition:=1) + ' clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & clsFirstDOYPerYearOperator.ToScript & Chr(34), iPosition:=1) clsFirstDOYPerYearOperator.SetOperation("[") clsFirstDOYPerYearOperator.AddParameter("rightside", "1]", iPosition:=1) clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34), iPosition:=2) @@ -498,6 +497,7 @@ Public Class dlgStartofRains clsDPRainInDays.AddParameter("function_exp", Chr(34) & clsDPRainInDaysFunctionLead.ToScript & Chr(34), iPosition:=2) clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") End If + clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & clsFirstDOYPerYearOperator.ToScript & Chr(34), iPosition:=1) End Sub Private Sub RainDays() @@ -520,12 +520,12 @@ Public Class dlgStartofRains ' clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub - Private Sub ucrReceiverDate_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDate.ControlValueChanged, ucrReceiverStation.ControlValueChanged + Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged ' does this update if I change the data name? - If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty Then - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDate.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") + If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") Else - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDate.GetVariableNames & ")") + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") End If clsManipulationFirstDOYPerYear.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) End Sub @@ -589,6 +589,8 @@ Public Class dlgStartofRains Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() + SetRCodeForControls(True) + TestOKEnabled() End Sub Private Sub grpRainParameters_Enter(sender As Object, e As EventArgs) @@ -720,14 +722,6 @@ Public Class dlgStartofRains 'End If End Sub - 'Private Sub AddKeyMethod() - ' If Not ucrReceiverDate.IsEmpty Then - ' clsAddKey.AddParameter("col_name", ucrReceiverDate.GetVariableNames) - ' Else - ' clsAddKey.RemoveParameterByName("col_name") - ' End If - 'End Sub - Private Sub RainyDaysMethod() If ((Not ucrReceiverRainfall.IsEmpty) AndAlso (ucrNudThreshold.Text <> "")) Then 'clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) From 1079b100445f874c477487c7e654559917884fea Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 15:01:15 +0100 Subject: [PATCH 093/201] bug fix --- instat/dlgSpells.vb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 96ac101ea14..9efaa24baa3 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -342,12 +342,12 @@ Public Class dlgSpells clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub - Private Sub ucrReceiverDate_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDate.ControlValueChanged, ucrReceiverStation.ControlValueChanged + Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged ' does this update if I change the data name? - If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty Then - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDate.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") + If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") Else - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDate.GetVariableNames & ")") + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") End If clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) From 28c1037b0d2108a22fda2a9349e02a8ba4448738 Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 15:08:12 +0100 Subject: [PATCH 094/201] fixes --- instat/dlgStartofRains.vb | 85 +++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 93aff44d673..96b37aed83f 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -498,6 +498,7 @@ Public Class dlgStartofRains clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") End If clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & clsFirstDOYPerYearOperator.ToScript & Chr(34), iPosition:=1) + CombinedFilter() End Sub Private Sub RainDays() @@ -550,7 +551,48 @@ Public Class dlgStartofRains clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=5) End Sub + Private Sub CombinedFilter() + Dim strTempFunExpression As String = Chr(34) + clsCombinedFilter.RemoveParameterByName("function_exp") + + If ucrChkTotalRainfall.Checked Then + strTempFunExpression = strTempFunExpression & "roll_sum_Rain > " + If rdoTRAmount.Checked Then + strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value + clsCombinedList.RemoveParameterByName("sub4") + ElseIf rdoTRPercentile.Checked Then + strTempFunExpression = strTempFunExpression & "wet_spell" + clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) + End If + strTempFunExpression = strTempFunExpression & " & " + clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) + Else + clsCombinedList.RemoveParameterByName("sub3") + End If + If ucrChkNumberOfRainyDays.Checked Then + strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & ucrNudRDMinimumDays.Value & " & " + clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) + Else + clsCombinedList.RemoveParameterByName("sub2") + End If + If ucrChkDrySpell.Checked Then + strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " + clsCombinedList.AddParameter("sub1", clsRFunctionParameter:=clsDSDryPeriodTen, bIncludeArgumentName:=False) + Else + clsCombinedList.RemoveParameterByName("sub1") + End If + If ucrChkDryPeriod.Checked Then + strTempFunExpression = strTempFunExpression & "DP_Overall_Interval_Rain == 0 " & " & " + clsCombinedList.AddParameter("sub5", clsRFunctionParameter:=clsDPOverallInterval, bIncludeArgumentName:=False) + Else + clsCombinedList.RemoveParameterByName("sub5") + End If + + strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) + + clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) + End Sub @@ -850,49 +892,6 @@ Public Class dlgStartofRains End If End Sub - Private Sub CombinedFilter() - Dim strTempFunExpression As String = Chr(34) - - clsCombinedFilter.RemoveParameterByName("function_exp") - - If ucrChkTotalRainfall.Checked Then - strTempFunExpression = strTempFunExpression & "roll_sum_Rain > " - If rdoTRAmount.Checked Then - strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value - clsCombinedList.RemoveParameterByName("sub4") - ElseIf rdoTRPercentile.Checked Then - strTempFunExpression = strTempFunExpression & "wet_spell" - clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) - End If - strTempFunExpression = strTempFunExpression & " & " - clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) - Else - clsCombinedList.RemoveParameterByName("sub3") - End If - If ucrChkNumberOfRainyDays.Checked Then - strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & ucrNudRDMinimumDays.Value & " & " - clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) - Else - clsCombinedList.RemoveParameterByName("sub2") - End If - If ucrChkDrySpell.Checked Then - strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " - clsCombinedList.AddParameter("sub1", clsRFunctionParameter:=clsDSDryPeriodTen, bIncludeArgumentName:=False) - Else - clsCombinedList.RemoveParameterByName("sub1") - End If - If ucrChkDryPeriod.Checked Then - strTempFunExpression = strTempFunExpression & "DP_Overall_Interval_Rain == 0 " & " & " - clsCombinedList.AddParameter("sub5", clsRFunctionParameter:=clsDPOverallInterval, bIncludeArgumentName:=False) - Else - clsCombinedList.RemoveParameterByName("sub5") - End If - - strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) - - clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) - End Sub - Private Sub FirstDOYPerYear() '' run these when things are checked 'If Not ucrReceiverDOY.IsEmpty Then From c22294020b7f656e1d865f4cd3d62228ee8de7dc Mon Sep 17 00:00:00 2001 From: Lily Date: Mon, 19 Jun 2017 15:23:28 +0100 Subject: [PATCH 095/201] bug fix --- instat/dlgStartofRains.vb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 96b37aed83f..874942bf425 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -90,6 +90,7 @@ Public Class dlgStartofRains ucrNudTo.SetParameter(New RParameter("to", 0)) ucrNudTo.SetMinMax(2, 366) + ucrNudThreshold.SetParameter(New RParameter("threshold", 1)) ucrNudThreshold.DecimalPlaces = 2 'Total Rainfall @@ -430,6 +431,8 @@ Public Class dlgStartofRains ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) + ucrNudThreshold.SetRCode(clsRainyDaysOperator, bReset) + ucrReceiverStation.SetRCode(clsAddKeyColName, bReset) ucrReceiverDate.SetRCode(clsAddKeyColName, bReset) ucrSelectorForStartofRains.SetRCode(clsAddKey, bReset) From 573acbff09a53c4fbdb8d09a9279f504e2edf596 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 19 Jun 2017 17:25:51 +0300 Subject: [PATCH 096/201] more code changes onimporting csv format dataset --- instat/dlgImportDataset.vb | 183 ++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 84 deletions(-) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 02f417ec3f1..4ac47b52711 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -21,7 +21,7 @@ Imports System.ComponentModel Public Class dlgImportDataset Private intLines As Integer - Private clsReadCSV, clsReadRDS, clsImportRDS, clsReadXL As RFunction + Private clsImportCSV, clsReadRDS, clsImportRDS, clsImportExcel As RFunction Private strTempWorkbookName As String Dim bFirstLoad As Boolean Public bFromLibrary As Boolean @@ -40,10 +40,10 @@ Public Class dlgImportDataset ' Add any initialization after the InitializeComponent() call. intLines = 10 - clsReadCSV = New RFunction + clsImportCSV = New RFunction clsReadRDS = New RFunction clsImportRDS = New RFunction - clsReadXL = New RFunction + clsImportExcel = New RFunction 'clsTempWorkbookImport = New RFunction 'clsTempExcelPreview = New RFunction ucrBase.clsRsyntax.SetFunction("import") @@ -94,6 +94,9 @@ Public Class dlgImportDataset ucrChkStringsAsFactors.SetText("Convert Strings to Factor Columns") + ucrChkImportChangesLog.SetText("Import Changes log") + ucrChkImportChangesLog.SetParameter(New RParameter("include_logs"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") + ucrChkExistingData.SetText("Keep existing data frames") ucrChkExistingData.SetParameter(New RParameter("keep_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") @@ -112,6 +115,11 @@ Public Class dlgImportDataset ucrChkOverWrite.SetText("Overwrite existing if duplicates found") ucrChkOverWrite.SetParameter(New RParameter("overwrite_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") 'temp disabled until can easily switch between fread and read.csv + + ucrPnlRowNames.SetParameter(New RParameter("row.names")) + ' ucrPnlRowNames.AddRadioButton(rdoRowNamesYes, Chr(34) & Chr(34)) + ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "NULL" & Chr(34)) + ucrPnlRowNames.SetRDefault(Chr(34) & "NULL" & Chr(34)) rdoRowNamesYes.Enabled = False 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator ucrInputSeparator.Enabled = False @@ -130,7 +138,7 @@ Public Class dlgImportDataset dctucrInputEncoding.Add("Unknown ,", Chr(34) & "unknown" & Chr(34)) ucrInputEncoding.SetRDefault(Chr(34) & "unknown" & Chr(34)) 'csv options settings - clsReadCSV.AddParameter("check.names", "TRUE") + clsImportCSV.AddParameter("check.names", "TRUE") ' ucrInputSeparator.SetItems({"Automatic", ", ", "Whitespace", ": ", ";", "|", "^"}) ucrInputSeparator.SetParameter(New RParameter("sep")) @@ -141,7 +149,7 @@ Public Class dlgImportDataset dctucrInputSeparator.Add("Semi-Colon(;) ,", Chr(34) & ";" & Chr(34)) dctucrInputSeparator.Add("Vertcal-Line ,", Chr(34) & "|" & Chr(34)) dctucrInputSeparator.Add("Power ,", Chr(34) & "^" & Chr(34)) - ucrInputSeparator.SetRDefault(Chr(34) & "" & Chr(34)) + ucrInputSeparator.SetRDefault(Chr(34) & "auto" & Chr(34)) 'Check...Changed NO to FALSE! 'ucrInputHeaders.SetItems({"Automatic", "Yes", "No"}) @@ -154,10 +162,10 @@ Public Class dlgImportDataset ' ucrInputDecimal.SetItems({"Automatic", ".", ","}) ucrInputDecimal.SetParameter(New RParameter("dec")) 'dec param absent - dctucrInputDecimal.Add("Automatic", Chr(34) & Chr(34)) + dctucrInputDecimal.Add("Automatic", Chr(34) & "auto" & Chr(34)) dctucrInputDecimal.Add("Period(.)", Chr(34) & "." & Chr(34)) dctucrInputDecimal.Add("Comma(,)", Chr(34) & "," & Chr(34)) - ucrInputDecimal.SetRDefault(Chr(34) & "." & Chr(34)) + ucrInputDecimal.SetRDefault(Chr(34) & "auto" & Chr(34)) ucrNudSkip.SetParameter(New RParameter("skip")) ucrNudSkip.Maximum = Integer.MaxValue @@ -179,10 +187,10 @@ Public Class dlgImportDataset setExcelDefaults() SetRDSDefaults() - clsReadCSV.AddParameter("encoding", Chr(34) & "unknown" & Chr(34)) - clsReadCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) - clsReadCSV.AddParameter("header", Chr(34) & "FALSE" & Chr(34)) - clsReadCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) + clsImportCSV.AddParameter("encoding", Chr(34) & "unknown" & Chr(34)) + clsImportCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) + clsImportCSV.AddParameter("header", Chr(34) & "FALSE" & Chr(34)) + clsImportCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) End Sub #Region "Shared options" @@ -214,6 +222,7 @@ Public Class dlgImportDataset Else ucrBase.OKEnabled(False) End If + ucrBase.OKEnabled(True) End Sub #End Region @@ -264,12 +273,18 @@ Public Class dlgImportDataset End Sub Public Sub SetRCodeForControls(bReset As Boolean) + ucrInputSeparator.SetRCode(clsImportCSV, bReset) + ucrInputHeaders.SetRCode(clsImportCSV, bReset) + ucrInputDecimal.SetRCode(clsImportCSV, bReset) + ucrInputEncoding.SetRCode(clsImportCSV, bReset) + ucrPnlRowNames.SetRCode(clsImportCSV, bReset) + ucrChkImportChangesLog.SetRCode(clsImportRDS, bReset) ucrChkExistingData.SetRCode(clsImportRDS, bReset) - ucrInputSeparator.SetRCode(clsReadCSV, bReset) - ucrInputHeaders.SetRCode(clsReadCSV, bReset) - ucrInputDecimal.SetRCode(clsReadCSV, bReset) - ucrInputEncoding.SetRCode(clsReadCSV, bReset) - ' ucrChkExistingData.AddAdditionalCodeParameterPair(cls) + ucrChkImportMetadata.SetRCode(clsImportRDS, bReset) + ucrChkImportObjects.SetRCode(clsImportRDS, bReset) + ucrChkImportFilters.SetRCode(clsImportRDS, bReset) + ucrChkImportCalculations.SetRCode(clsImportRDS, bReset) + ucrChkOverWrite.SetRCode(clsImportRDS, bReset) End Sub Public Sub SetDialogWithFile(strFilePath As String) @@ -308,10 +323,10 @@ Public Class dlgImportDataset lblName.Hide() 'ucrInputName.SetName(strFileName, bSilent:=True) ElseIf strFileExt = ".csv" Then - clsReadCSV.SetPackageName("rio") - clsReadCSV.SetRCommand("import") - clsReadCSV.AddParameter("file", Chr(34) & strFilePath & Chr(34)) - ucrBase.clsRsyntax.SetBaseRFunction(clsReadCSV) + clsImportCSV.SetPackageName("rio") + clsImportCSV.SetRCommand("import") + clsImportCSV.AddParameter("file", Chr(34) & strFilePath & Chr(34)) + ucrBase.clsRsyntax.SetBaseRFunction(clsImportCSV) grpRDS.Hide() grpExcel.Hide() grpCSV.Show() @@ -322,10 +337,10 @@ Public Class dlgImportDataset RefreshFilePreview() ucrInputName.Focus() ElseIf strFileExt = ".xlsx" OrElse strFileExt = ".xls" Then - clsReadXL.SetPackageName("rio") - clsReadXL.SetRCommand("import") - clsReadXL.AddParameter("file", Chr(34) & strFilePath & Chr(34)) - ucrBase.clsRsyntax.SetBaseRFunction(clsReadXL) + clsImportExcel.SetPackageName("rio") + clsImportExcel.SetRCommand("import") + clsImportExcel.AddParameter("file", Chr(34) & strFilePath & Chr(34)) + ucrBase.clsRsyntax.SetBaseRFunction(clsImportExcel) grpCSV.Hide() grpRDS.Hide() grpExcel.Show() @@ -334,10 +349,10 @@ Public Class dlgImportDataset grdDataPreview.Enabled = True If strFileExt = ".xlsx" Then strFileType = "xlsx" - clsReadXL.AddParameter("readxl", "FALSE") + '.AddParameter("readxl", "FALSE") Else strFileType = "xls" - clsReadXL.RemoveParameterByName("readxl") + 'clsImportExcel.RemoveParameterByName("readxl") End If FillExcelSheetsAndRegions(strFilePath) @@ -409,10 +424,10 @@ Public Class dlgImportDataset grdDataPreview.Show() lblDataFrame.Show() If strFileType = "csv" Then - clsReadCSV.AddParameter("nrows", intLines) + clsImportCSV.AddParameter("nrows", intLines) ElseIf strFileType = "xlsx" Then 'iPosition = 0 is needed because of a bug in rio::import - clsReadXL.AddParameter("rows", "1:" & intLines, iPosition:=0) + 'clsReadXL.AddParameter("rows", "1:" & intLines, iPosition:=0) End If lblCannotImport.Hide() lblNoPreview.Hide() @@ -434,7 +449,7 @@ Public Class dlgImportDataset ucrBase.clsRsyntax.RemoveParameter("nrows") ucrBase.clsRsyntax.RemoveParameter("rows") 'If readXL is not the base function this may be needed. - clsReadXL.RemoveParameterByName("rows") + 'clsReadXL.RemoveParameterByName("rows") ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned = bToBeAssigned Try frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False) @@ -576,11 +591,11 @@ Public Class dlgImportDataset #Region "CSV options" Private Sub SetCSVDefault() - ucrInputEncoding.SetName("unknown") - rdoRowNamesNo.Checked = True - ucrInputSeparator.SetName("Automatic") - ucrInputHeaders.SetName("Automatic") - ucrInputDecimal.SetName("Automatic") + 'ucrInputEncoding.SetName("unknown") + 'rdoRowNamesNo.Checked = True + 'ucrInputSeparator.SetName("Automatic") + 'ucrInputHeaders.SetName("Automatic") + 'ucrInputDecimal.SetName("Automatic") ucrInputNAStrings.SetName("NA") ' ucrNudSkip.Value = 0 'ucrChkStringsAsFactors.Checked = True @@ -588,11 +603,11 @@ Public Class dlgImportDataset Private Sub ucrInputEncoding_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputEncoding.ControlValueChanged - If ucrInputEncoding.GetText() <> "" AndAlso (ucrInputEncoding.GetText() <> "unknown" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then - clsReadCSV.AddParameter("encoding", ucrInputEncoding.GetText) - Else - clsReadCSV.RemoveParameterByName("encoding") - End If + 'If ucrInputEncoding.GetText() <> "" AndAlso (ucrInputEncoding.GetText() <> "unknown" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then + ' clsImportCSV.AddParameter("encoding", ucrInputEncoding.GetText) + 'Else + ' clsImportCSV.RemoveParameterByName("encoding") + 'End If RefreshFrameView() End Sub @@ -600,13 +615,13 @@ Public Class dlgImportDataset Private Sub rdoRowNames_CheckedChanged() Handles ucrPnlRowNames.ControlValueChanged If rdoRowNamesYes.Checked Then 'TODO this is not an option for fread so have to change function here - clsReadCSV.AddParameter("row.names", 1) + clsImportCSV.AddParameter("row.names", 1) Else 'TODO find out what difference there is between 'row.names = NULL and row.names missing 'disabled as import (fread) does not support row.names - 'clsReadCSV.AddParameter("row.names", "NULL") - clsReadCSV.RemoveParameterByName("row.names") + clsImportCSV.AddParameter("row.names", "NULL") + ' clsImportCSV.RemoveParameterByName("row.names") End If End Sub @@ -614,17 +629,17 @@ Public Class dlgImportDataset ' Select Case ucrInputHeaders.GetText() ' Case "Automatic" ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsReadCSV.AddParameter("header", Chr(34) & "auto" & Chr(34)) + ' clsImportCSV.AddParameter("header", Chr(34) & "auto" & Chr(34)) ' Else - ' clsReadCSV.RemoveParameterByName("header") + ' clsImportCSV.RemoveParameterByName("header") ' End If - ' clsReadCSV.RemoveParameterByName("header") + ' clsImportCSV.RemoveParameterByName("header") ' Case "Yes" - ' clsReadCSV.AddParameter("header", "TRUE") + ' clsImportCSV.AddParameter("header", "TRUE") ' Case "No" - ' clsReadCSV.AddParameter("header", "FALSE") + ' clsImportCSV.AddParameter("header", "FALSE") ' Case Else - ' 'clsReadCSV.RemoveParameterByName("header") + ' 'clsImportCSV.RemoveParameterByName("header") ' End Select RefreshFrameView() End Sub @@ -632,9 +647,9 @@ Public Class dlgImportDataset Private Sub ucrInputDecimal_ControlValueChanged() Handles ucrInputDecimal.ControlValueChanged 'Select Case ucrInputDecimal.GetText ' Case "Automatic" - ' clsReadCSV.RemoveParameterByName("dec") + ' clsImportCSV.RemoveParameterByName("dec") ' Case Else - ' clsReadCSV.AddParameter("dec", Chr(34) & ucrInputDecimal.GetText() & Chr(34)) + ' clsImportCSV.AddParameter("dec", Chr(34) & ucrInputDecimal.GetText() & Chr(34)) 'End Select RefreshFrameView() End Sub @@ -643,17 +658,17 @@ Public Class dlgImportDataset 'Select Case ucrInputSeparator.GetText ' Case "Automatic" ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsReadCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) + ' clsImportCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) ' Else - ' clsReadCSV.RemoveParameterByName("sep") + ' clsImportCSV.RemoveParameterByName("sep") ' End If - ' clsReadCSV.RemoveParameterByName("sep") + ' clsImportCSV.RemoveParameterByName("sep") ' Case "Whitespace" - ' clsReadCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) + ' clsImportCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) ' Case "" - ' clsReadCSV.RemoveParameterByName("sep") + ' clsImportCSV.RemoveParameterByName("sep") ' Case Else - ' clsReadCSV.AddParameter("sep", Chr(34) & ucrInputSeparator.GetText() & Chr(34)) + ' clsImportCSV.AddParameter("sep", Chr(34) & ucrInputSeparator.GetText() & Chr(34)) 'End Select RefreshFrameView() End Sub @@ -661,18 +676,18 @@ Public Class dlgImportDataset Private Sub ucrInputDecimal_TextChanged() Handles ucrInputDecimal.ControlValueChanged 'Select Case ucrInputDecimal.GetText ' Case "Period" - ' clsReadCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) + ' clsImportCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) ' Case "Comma" - ' clsReadCSV.AddParameter("dec", Chr(34) & "," & Chr(34)) + ' clsImportCSV.AddParameter("dec", Chr(34) & "," & Chr(34)) 'End Select RefreshFrameView() End Sub Private Sub ucrInputNAStrings_ControlValueChanged() Handles ucrInputNAStrings.ControlValueChanged If ucrInputNAStrings.GetText() <> "" AndAlso (ucrInputNAStrings.GetText() <> "NA" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then - clsReadCSV.AddParameter("na.strings", Chr(34) & ucrInputNAStrings.GetText() & Chr(34)) + clsImportCSV.AddParameter("na.strings", Chr(34) & ucrInputNAStrings.GetText() & Chr(34)) Else - clsReadCSV.RemoveParameterByName("na.strings") + ' clsImportCSV.RemoveParameterByName("na.strings") End If RefreshFrameView() End Sub @@ -680,9 +695,9 @@ Public Class dlgImportDataset Private Sub ucrNudSkip_ControlValueChanged() Handles ucrNudSkip.ControlValueChanged If bComponentsInitialised Then If ucrNudSkip.Value = 0 Then - clsReadCSV.RemoveParameterByName("skip") + clsImportCSV.RemoveParameterByName("skip") Else - clsReadCSV.AddParameter("skip", ucrNudSkip.Value) + clsImportCSV.AddParameter("skip", ucrNudSkip.Value) End If 'TODO R gives an error if skip is too large RefreshFilePreview() @@ -761,12 +776,12 @@ Public Class dlgImportDataset If bComponentsInitialised Then If ucrNudxlRowsToSkip.Text <> "" Then If ucrNudxlRowsToSkip.Value = 0 AndAlso Not frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsReadXL.RemoveParameterByName("skip") + 'clsReadXL.RemoveParameterByName("skip") Else - clsReadXL.AddParameter("skip", ucrNudxlRowsToSkip.Value) + ' clsReadXL.AddParameter("skip", ucrNudxlRowsToSkip.Value) End If Else - clsReadXL.RemoveParameterByName("skip") + 'clsReadXL.RemoveParameterByName("skip") End If RefreshFrameView() End If @@ -781,20 +796,20 @@ Public Class dlgImportDataset If strFileType = "xlsx" Then strColNameParam = "colNames" - clsReadXL.RemoveParameterByName("col_names") + ' clsReadXL.RemoveParameterByName("col_names") Else strColNameParam = "col_names" - clsReadXL.RemoveParameterByName("colNames") + ' clsReadXL.RemoveParameterByName("colNames") End If If ucrchkColumnNames.Checked Then If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsReadXL.AddParameter(strColNameParam, "TRUE") + ' clsReadXL.AddParameter(strColNameParam, "TRUE") Else - clsReadXL.RemoveParameterByName(strColNameParam) + ' clsReadXL.RemoveParameterByName(strColNameParam) End If Else - clsReadXL.AddParameter(strColNameParam, "FALSE") + 'clsReadXL.AddParameter(strColNameParam, "FALSE") End If RefreshFrameView() End Sub @@ -805,12 +820,12 @@ Public Class dlgImportDataset Private Sub XlStringsAsFactorsParameter() If ucrChkStringsAsFactors.Checked Then - clsReadCSV.AddParameter("stringsAsFactors", "TRUE") + clsImportCSV.AddParameter("stringsAsFactors", "TRUE") Else If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsReadCSV.AddParameter("stringsAsFactors", "FALSE") + clsImportCSV.AddParameter("stringsAsFactors", "FALSE") Else - clsReadCSV.RemoveParameterByName("stringsAsFactors") + clsImportCSV.RemoveParameterByName("stringsAsFactors") End If End If RefreshFrameView() @@ -823,12 +838,12 @@ Public Class dlgImportDataset Private Sub ucrInputXlMissingValueString_ControlValueChanged() Handles ucrInputXlMissingValueString.ControlValueChanged If Not ucrInputXlMissingValueString.IsEmpty() Then - clsReadXL.AddParameter("na", Chr(34) & ucrInputXlMissingValueString.GetText() & Chr(34)) + ' clsReadXL.AddParameter("na", Chr(34) & ucrInputXlMissingValueString.GetText() & Chr(34)) Else If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsReadXL.AddParameter("na", Chr(34) & Chr(34)) + ' clsReadXL.AddParameter("na", Chr(34) & Chr(34)) Else - clsReadXL.RemoveParameterByName("na") + 'lsReadXL.RemoveParameterByName("na") End If End If RefreshFrameView() @@ -837,27 +852,27 @@ Public Class dlgImportDataset Private Sub ucrInputSheets_ControlValueChanged() Handles ucrInputSheets.ControlValueChanged If Not ucrInputSheets.IsEmpty() Then If strFileType = "xlsx" Then - clsReadXL.AddParameter("which", ucrInputSheets.cboInput.SelectedIndex + 1) - clsReadXL.RemoveParameterByName("sheet") + ' clsReadXL.AddParameter("which", ucrInputSheets.cboInput.SelectedIndex + 1) + ' clsReadXL.RemoveParameterByName("sheet") If Not ucrInputName.UserTyped() Then ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) ucrInputName.Focus() End If ElseIf strFileType = "xls" Then - clsReadXL.AddParameter("sheet", ucrInputSheets.cboInput.SelectedIndex + 1) - clsReadXL.RemoveParameterByName("which") + 'clsReadXL.AddParameter("sheet", ucrInputSheets.cboInput.SelectedIndex + 1) + ' clsReadXL.RemoveParameterByName("which") If Not ucrInputName.UserTyped() Then ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) ucrInputName.Focus() End If Else - clsReadXL.RemoveParameterByName("sheet") - clsReadXL.RemoveParameterByName("which") + ' clsReadXL.RemoveParameterByName("sheet") + ' clsReadXL.RemoveParameterByName("which") End If 'ucrInputNamedRegions.SetName("") Else - clsReadXL.RemoveParameterByName("sheet") - clsReadXL.RemoveParameterByName("which") + ' clsReadXL.RemoveParameterByName("sheet") + ' clsReadXL.RemoveParameterByName("which") End If RefreshFrameView() End Sub From 4afdabfe2a68b065e7f4c9f1a17841cb5caf2577 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 19 Jun 2017 18:04:26 +0100 Subject: [PATCH 097/201] adding multiple sets of columns option to stack dialog --- instat/dlgStack.Designer.vb | 62 +++++++++++++++---- instat/dlgStack.vb | 60 +++++++++++++++++- .../InstatObject/R/stand_alone_functions.R | 6 ++ 3 files changed, 114 insertions(+), 14 deletions(-) diff --git a/instat/dlgStack.Designer.vb b/instat/dlgStack.Designer.vb index f9f5e147e0b..f983829bb49 100644 --- a/instat/dlgStack.Designer.vb +++ b/instat/dlgStack.Designer.vb @@ -25,6 +25,9 @@ Partial Class dlgStack Me.lblColumnsTostack = New System.Windows.Forms.Label() Me.lblStackDataInto = New System.Windows.Forms.Label() Me.lblFactorInto = New System.Windows.Forms.Label() + Me.ucrNudNoSets = New instat.ucrNud() + Me.ucrChkStackMultipleSets = New instat.ucrCheck() + Me.ucrSaveNewDataName = New instat.ucrSave() Me.ucrChkCarryColumns = New instat.ucrCheck() Me.ucrStackDataInto = New instat.ucrInputTextBox() Me.ucrFactorInto = New instat.ucrInputTextBox() @@ -32,7 +35,7 @@ Partial Class dlgStack Me.ucrSelectorStack = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrBase = New instat.ucrButtons() Me.ucrReceiverColumnsToBeStack = New instat.ucrReceiverMultiple() - Me.ucrSaveNewDataName = New instat.ucrSave() + Me.lblSets = New System.Windows.Forms.Label() Me.SuspendLayout() ' 'lblColumnsTostack @@ -48,7 +51,7 @@ Partial Class dlgStack 'lblStackDataInto ' Me.lblStackDataInto.AutoSize = True - Me.lblStackDataInto.Location = New System.Drawing.Point(10, 248) + Me.lblStackDataInto.Location = New System.Drawing.Point(10, 275) Me.lblStackDataInto.Name = "lblStackDataInto" Me.lblStackDataInto.Size = New System.Drawing.Size(85, 13) Me.lblStackDataInto.TabIndex = 7 @@ -58,13 +61,40 @@ Partial Class dlgStack 'lblFactorInto ' Me.lblFactorInto.AutoSize = True - Me.lblFactorInto.Location = New System.Drawing.Point(10, 216) + Me.lblFactorInto.Location = New System.Drawing.Point(10, 243) Me.lblFactorInto.Name = "lblFactorInto" Me.lblFactorInto.Size = New System.Drawing.Size(61, 13) Me.lblFactorInto.TabIndex = 5 Me.lblFactorInto.Tag = "Factor_Into" Me.lblFactorInto.Text = "Factor Into:" ' + 'ucrNudNoSets + ' + Me.ucrNudNoSets.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudNoSets.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudNoSets.Location = New System.Drawing.Point(210, 209) + Me.ucrNudNoSets.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudNoSets.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudNoSets.Name = "ucrNudNoSets" + Me.ucrNudNoSets.Size = New System.Drawing.Size(50, 20) + Me.ucrNudNoSets.TabIndex = 12 + Me.ucrNudNoSets.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkStackMultipleSets + ' + Me.ucrChkStackMultipleSets.Checked = False + Me.ucrChkStackMultipleSets.Location = New System.Drawing.Point(10, 209) + Me.ucrChkStackMultipleSets.Name = "ucrChkStackMultipleSets" + Me.ucrChkStackMultipleSets.Size = New System.Drawing.Size(148, 20) + Me.ucrChkStackMultipleSets.TabIndex = 11 + ' + 'ucrSaveNewDataName + ' + Me.ucrSaveNewDataName.Location = New System.Drawing.Point(10, 301) + Me.ucrSaveNewDataName.Name = "ucrSaveNewDataName" + Me.ucrSaveNewDataName.Size = New System.Drawing.Size(266, 20) + Me.ucrSaveNewDataName.TabIndex = 9 + ' 'ucrChkCarryColumns ' Me.ucrChkCarryColumns.Checked = False @@ -79,7 +109,7 @@ Partial Class dlgStack Me.ucrStackDataInto.AddQuotesIfUnrecognised = True Me.ucrStackDataInto.IsMultiline = False Me.ucrStackDataInto.IsReadOnly = False - Me.ucrStackDataInto.Location = New System.Drawing.Point(95, 245) + Me.ucrStackDataInto.Location = New System.Drawing.Point(95, 272) Me.ucrStackDataInto.Margin = New System.Windows.Forms.Padding(5) Me.ucrStackDataInto.Name = "ucrStackDataInto" Me.ucrStackDataInto.Size = New System.Drawing.Size(165, 21) @@ -90,7 +120,7 @@ Partial Class dlgStack Me.ucrFactorInto.AddQuotesIfUnrecognised = True Me.ucrFactorInto.IsMultiline = False Me.ucrFactorInto.IsReadOnly = False - Me.ucrFactorInto.Location = New System.Drawing.Point(95, 214) + Me.ucrFactorInto.Location = New System.Drawing.Point(95, 241) Me.ucrFactorInto.Margin = New System.Windows.Forms.Padding(5) Me.ucrFactorInto.Name = "ucrFactorInto" Me.ucrFactorInto.Size = New System.Drawing.Size(165, 21) @@ -120,7 +150,7 @@ Partial Class dlgStack ' 'ucrBase ' - Me.ucrBase.Location = New System.Drawing.Point(10, 301) + Me.ucrBase.Location = New System.Drawing.Point(10, 331) Me.ucrBase.Margin = New System.Windows.Forms.Padding(4) Me.ucrBase.Name = "ucrBase" Me.ucrBase.Size = New System.Drawing.Size(410, 52) @@ -138,18 +168,23 @@ Partial Class dlgStack Me.ucrReceiverColumnsToBeStack.TabIndex = 2 Me.ucrReceiverColumnsToBeStack.ucrSelector = Nothing ' - 'ucrSaveNewDataName + 'lblSets ' - Me.ucrSaveNewDataName.Location = New System.Drawing.Point(10, 274) - Me.ucrSaveNewDataName.Name = "ucrSaveNewDataName" - Me.ucrSaveNewDataName.Size = New System.Drawing.Size(266, 20) - Me.ucrSaveNewDataName.TabIndex = 9 + Me.lblSets.AutoSize = True + Me.lblSets.Location = New System.Drawing.Point(176, 212) + Me.lblSets.Name = "lblSets" + Me.lblSets.Size = New System.Drawing.Size(31, 13) + Me.lblSets.TabIndex = 13 + Me.lblSets.Text = "Sets:" ' 'dlgStack ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(416, 357) + Me.ClientSize = New System.Drawing.Size(416, 386) + Me.Controls.Add(Me.lblSets) + Me.Controls.Add(Me.ucrNudNoSets) + Me.Controls.Add(Me.ucrChkStackMultipleSets) Me.Controls.Add(Me.ucrSaveNewDataName) Me.Controls.Add(Me.ucrChkCarryColumns) Me.Controls.Add(Me.ucrStackDataInto) @@ -183,4 +218,7 @@ Partial Class dlgStack Friend WithEvents ucrStackDataInto As ucrInputTextBox Friend WithEvents ucrChkCarryColumns As ucrCheck Friend WithEvents ucrSaveNewDataName As ucrSave + Friend WithEvents ucrNudNoSets As ucrNud + Friend WithEvents ucrChkStackMultipleSets As ucrCheck + Friend WithEvents lblSets As Label End Class diff --git a/instat/dlgStack.vb b/instat/dlgStack.vb index 875aa0af7b3..9f6b9eb7af2 100644 --- a/instat/dlgStack.vb +++ b/instat/dlgStack.vb @@ -13,11 +13,15 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class dlgStack Private clsMeltFunction As New RFunction + Private clsReshapeFunction As RFunction + Private clsSplitColumnsInGroups As RFunction Private bFirstLoad As Boolean = True Private bReset As Boolean = True + Private Sub dlgStack_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) If bFirstLoad Then @@ -60,10 +64,23 @@ Public Class dlgStack ucrFactorInto.SetParameter(New RParameter("variable.name", 3)) ucrFactorInto.SetValidationTypeAsRVariable() ucrFactorInto.SetRDefault(Chr(34) & "variable" & Chr(34)) + ucrFactorInto.SetLinkedDisplayControl(lblFactorInto) ucrStackDataInto.SetParameter(New RParameter("value.name", 4)) ucrStackDataInto.SetValidationTypeAsRVariable() ucrStackDataInto.SetRDefault(Chr(34) & "value" & Chr(34)) + ucrStackDataInto.SetLinkedDisplayControl(lblStackDataInto) + + ucrChkStackMultipleSets.SetText("Stack multiple column sets") + ucrChkStackMultipleSets.AddToLinkedControls(ucrNudNoSets, {True}, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=2) + ucrChkStackMultipleSets.AddToLinkedControls(ucrChkCarryColumns, {False}, bNewLinkedHideIfParameterMissing:=True) + ucrChkStackMultipleSets.AddToLinkedControls(ucrStackDataInto, {False}, bNewLinkedHideIfParameterMissing:=True) + ucrChkStackMultipleSets.AddFunctionNamesCondition(True, "reshape") + ucrChkStackMultipleSets.AddFunctionNamesCondition(False, "melt") + + ucrNudNoSets.SetParameter(New RParameter("num", 1)) + ucrNudNoSets.Minimum = 2 + ucrNudNoSets.SetLinkedDisplayControl(lblSets) ucrSaveNewDataName.SetIsTextBox() ucrSaveNewDataName.SetLabelText("New Data Frame Name:") @@ -73,21 +90,49 @@ Public Class dlgStack Private Sub SetDefaults() clsMeltFunction = New RFunction + clsReshapeFunction = New RFunction + clsSplitColumnsInGroups = New RFunction ucrSelectorStack.Reset() ucrSaveNewDataName.Reset() ucrReceiverColumnsToBeStack.SetMeAsReceiver() - clsMeltFunction.SetPackageName("data.table") + clsMeltFunction.SetPackageName("reshape2") clsMeltFunction.SetRCommand("melt") clsMeltFunction.AddParameter("id.vars", "NULL") + clsMeltFunction.SetAssignTo(ucrSelectorStack.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_stacked", strTempDataframe:=ucrSelectorStack.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_stacked") + clsReshapeFunction.SetPackageName("stats") + clsReshapeFunction.SetRCommand("reshape") + clsReshapeFunction.SetAssignTo(ucrSelectorStack.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_stacked", strTempDataframe:=ucrSelectorStack.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_stacked") + clsReshapeFunction.AddParameter("direction", Chr(34) & "long" & Chr(34)) + clsReshapeFunction.AddParameter("timevar", Chr(34) & "variable" & Chr(34)) + + clsSplitColumnsInGroups.SetRCommand("split_items_in_groups") + clsSplitColumnsInGroups.AddParameter("num", 2, iPosition:=1) + + clsReshapeFunction.AddParameter("varying", clsRFunctionParameter:=clsSplitColumnsInGroups, iPosition:=1) + ucrBase.clsRsyntax.SetBaseRFunction(clsMeltFunction) End Sub Private Sub SetRCodeForControls(bReset As Boolean) - SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) + ucrReceiverColumnsToBeStack.AddAdditionalCodeParameterPair(clsSplitColumnsInGroups, New RParameter("items", 0), iAdditionalPairNo:=1) + ucrFactorInto.AddAdditionalCodeParameterPair(clsReshapeFunction, New RParameter("timevar", 3), iAdditionalPairNo:=1) + ucrSelectorStack.AddAdditionalCodeParameterPair(clsReshapeFunction, ucrSelectorStack.GetParameter(), iAdditionalPairNo:=1) + ucrSaveNewDataName.AddAdditionalRCode(clsReshapeFunction, iAdditionalPairNo:=1) + + ucrChkStackMultipleSets.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + + ucrSelectorStack.SetRCode(clsMeltFunction, bReset) + ucrReceiverColumnsToBeStack.SetRCode(clsMeltFunction, bReset) + ucrColumnsToCarryReceiver.SetRCode(clsMeltFunction, bReset) + ucrChkCarryColumns.SetRCode(clsMeltFunction, bReset) + ucrFactorInto.SetRCode(clsMeltFunction, bReset) + ucrStackDataInto.SetRCode(clsMeltFunction, bReset) + ucrSaveNewDataName.SetRCode(clsMeltFunction, bReset) + If bReset Then SetCarryColumnsOptions() End If @@ -149,4 +194,15 @@ Public Class dlgStack Private Sub CoreControls_ControlContentesChanged(ucrChangedControl As ucrCore) Handles ucrReceiverColumnsToBeStack.ControlContentsChanged, ucrStackDataInto.ControlContentsChanged, ucrFactorInto.ControlContentsChanged, ucrSaveNewDataName.ControlContentsChanged, ucrChkCarryColumns.ControlContentsChanged, ucrColumnsToCarryReceiver.ControlContentsChanged TestOKEnabled() End Sub + + Private Sub ucrChkStackMultipleSets_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkStackMultipleSets.ControlValueChanged + If ucrChkStackMultipleSets.Checked Then + ucrBase.clsRsyntax.SetBaseRFunction(clsReshapeFunction) + If Not ucrFactorInto.IsEmpty Then + clsReshapeFunction.AddParameter("timevar", Chr(34) & ucrFactorInto.GetText() & Chr(34)) + End If + Else + ucrBase.clsRsyntax.SetBaseRFunction(clsMeltFunction) + End If + End Sub End Class diff --git a/instat/static/InstatObject/R/stand_alone_functions.R b/instat/static/InstatObject/R/stand_alone_functions.R index f4288afd95e..5aa12bfb9cd 100644 --- a/instat/static/InstatObject/R/stand_alone_functions.R +++ b/instat/static/InstatObject/R/stand_alone_functions.R @@ -480,4 +480,10 @@ get_column_attributes <- function(x, drop = c("class", "levels")) { tmp_attr <- attributes(x) tmp_attr <- tmp_attr[!names(tmp_attr) %in% drop] return(tmp_attr) +} + +split_items_in_groups <- function(items, num) { + if(length(items) %% num != 0) stop("The number of items must be divisible by the number of groups") + x <- split(items, rep(1:num, each = length(items)/num)) + return(x) } \ No newline at end of file From ca6556a7ec35383a0a57e5976d3734c1e3ca3148 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 19 Jun 2017 22:15:12 +0300 Subject: [PATCH 098/201] Edits --- instat/dlgImportDataset.Designer.vb | 118 ++++++++++----------- instat/dlgImportDataset.vb | 157 ++++++++++++++++------------ 2 files changed, 151 insertions(+), 124 deletions(-) diff --git a/instat/dlgImportDataset.Designer.vb b/instat/dlgImportDataset.Designer.vb index b61529b6c9a..39797b2d59c 100644 --- a/instat/dlgImportDataset.Designer.vb +++ b/instat/dlgImportDataset.Designer.vb @@ -37,6 +37,11 @@ Partial Class dlgImportDataset Me.lblLinesToSkip = New System.Windows.Forms.Label() Me.cmdOpenDataSet = New System.Windows.Forms.Button() Me.grpCSV = New System.Windows.Forms.GroupBox() + Me.ucrChkStringsAsFactors = New instat.ucrCheck() + Me.ucrNudSkip = New instat.ucrNud() + Me.rdoRowNamesNo = New System.Windows.Forms.RadioButton() + Me.rdoRowNamesYes = New System.Windows.Forms.RadioButton() + Me.ucrPnlRowNames = New instat.UcrPanel() Me.ucrInputHeaders = New instat.ucrInputComboBox() Me.ucrInputNAStrings = New instat.ucrInputTextBox() Me.ucrInputDecimal = New instat.ucrInputComboBox() @@ -67,11 +72,6 @@ Partial Class dlgImportDataset Me.ucrChkImportFilters = New instat.ucrCheck() Me.ucrChkImportMetadata = New instat.ucrCheck() Me.ucrChkExistingData = New instat.ucrCheck() - Me.ucrPnlRowNames = New instat.UcrPanel() - Me.rdoRowNamesNo = New System.Windows.Forms.RadioButton() - Me.rdoRowNamesYes = New System.Windows.Forms.RadioButton() - Me.ucrNudSkip = New instat.ucrNud() - Me.ucrChkStringsAsFactors = New instat.ucrCheck() Me.grpCSV.SuspendLayout() Me.grpExcel.SuspendLayout() Me.grpRDS.SuspendLayout() @@ -250,6 +250,57 @@ Partial Class dlgImportDataset Me.grpCSV.Text = "Import csv Options" Me.grpCSV.Visible = False ' + 'ucrChkStringsAsFactors + ' + Me.ucrChkStringsAsFactors.Checked = False + Me.ucrChkStringsAsFactors.Location = New System.Drawing.Point(7, 307) + Me.ucrChkStringsAsFactors.Name = "ucrChkStringsAsFactors" + Me.ucrChkStringsAsFactors.Size = New System.Drawing.Size(206, 20) + Me.ucrChkStringsAsFactors.TabIndex = 43 + ' + 'ucrNudSkip + ' + Me.ucrNudSkip.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSkip.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudSkip.Location = New System.Drawing.Point(81, 277) + Me.ucrNudSkip.Maximum = New Decimal(New Integer() {1000000, 0, 0, 0}) + Me.ucrNudSkip.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSkip.Name = "ucrNudSkip" + Me.ucrNudSkip.Size = New System.Drawing.Size(50, 20) + Me.ucrNudSkip.TabIndex = 47 + Me.ucrNudSkip.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'rdoRowNamesNo + ' + Me.rdoRowNamesNo.AutoSize = True + Me.rdoRowNamesNo.Location = New System.Drawing.Point(70, 130) + Me.rdoRowNamesNo.Name = "rdoRowNamesNo" + Me.rdoRowNamesNo.Size = New System.Drawing.Size(39, 17) + Me.rdoRowNamesNo.TabIndex = 46 + Me.rdoRowNamesNo.TabStop = True + Me.rdoRowNamesNo.Tag = "No" + Me.rdoRowNamesNo.Text = "No" + Me.rdoRowNamesNo.UseVisualStyleBackColor = True + ' + 'rdoRowNamesYes + ' + Me.rdoRowNamesYes.AutoSize = True + Me.rdoRowNamesYes.Location = New System.Drawing.Point(21, 131) + Me.rdoRowNamesYes.Name = "rdoRowNamesYes" + Me.rdoRowNamesYes.Size = New System.Drawing.Size(43, 17) + Me.rdoRowNamesYes.TabIndex = 45 + Me.rdoRowNamesYes.TabStop = True + Me.rdoRowNamesYes.Tag = "Yes" + Me.rdoRowNamesYes.Text = "Yes" + Me.rdoRowNamesYes.UseVisualStyleBackColor = True + ' + 'ucrPnlRowNames + ' + Me.ucrPnlRowNames.Location = New System.Drawing.Point(15, 124) + Me.ucrPnlRowNames.Name = "ucrPnlRowNames" + Me.ucrPnlRowNames.Size = New System.Drawing.Size(113, 24) + Me.ucrPnlRowNames.TabIndex = 44 + ' 'ucrInputHeaders ' Me.ucrInputHeaders.AddQuotesIfUnrecognised = True @@ -359,7 +410,7 @@ Partial Class dlgImportDataset 'lblMissingValueString ' Me.lblMissingValueString.AutoSize = True - Me.lblMissingValueString.Location = New System.Drawing.Point(7, 71) + Me.lblMissingValueString.Location = New System.Drawing.Point(6, 73) Me.lblMissingValueString.Name = "lblMissingValueString" Me.lblMissingValueString.Size = New System.Drawing.Size(102, 13) Me.lblMissingValueString.TabIndex = 19 @@ -370,7 +421,7 @@ Partial Class dlgImportDataset Me.ucrInputXlMissingValueString.AddQuotesIfUnrecognised = True Me.ucrInputXlMissingValueString.IsMultiline = False Me.ucrInputXlMissingValueString.IsReadOnly = False - Me.ucrInputXlMissingValueString.Location = New System.Drawing.Point(23, 281) + Me.ucrInputXlMissingValueString.Location = New System.Drawing.Point(10, 90) Me.ucrInputXlMissingValueString.Name = "ucrInputXlMissingValueString" Me.ucrInputXlMissingValueString.Size = New System.Drawing.Size(137, 21) Me.ucrInputXlMissingValueString.TabIndex = 18 @@ -379,7 +430,7 @@ Partial Class dlgImportDataset ' Me.ucrInputNamedRegions.AddQuotesIfUnrecognised = True Me.ucrInputNamedRegions.IsReadOnly = False - Me.ucrInputNamedRegions.Location = New System.Drawing.Point(9, 75) + Me.ucrInputNamedRegions.Location = New System.Drawing.Point(10, 90) Me.ucrInputNamedRegions.Name = "ucrInputNamedRegions" Me.ucrInputNamedRegions.Size = New System.Drawing.Size(154, 21) Me.ucrInputNamedRegions.TabIndex = 16 @@ -545,57 +596,6 @@ Partial Class dlgImportDataset Me.ucrChkExistingData.Size = New System.Drawing.Size(205, 20) Me.ucrChkExistingData.TabIndex = 43 ' - 'ucrPnlRowNames - ' - Me.ucrPnlRowNames.Location = New System.Drawing.Point(15, 124) - Me.ucrPnlRowNames.Name = "ucrPnlRowNames" - Me.ucrPnlRowNames.Size = New System.Drawing.Size(113, 24) - Me.ucrPnlRowNames.TabIndex = 44 - ' - 'rdoRowNamesNo - ' - Me.rdoRowNamesNo.AutoSize = True - Me.rdoRowNamesNo.Location = New System.Drawing.Point(70, 130) - Me.rdoRowNamesNo.Name = "rdoRowNamesNo" - Me.rdoRowNamesNo.Size = New System.Drawing.Size(39, 17) - Me.rdoRowNamesNo.TabIndex = 46 - Me.rdoRowNamesNo.TabStop = True - Me.rdoRowNamesNo.Tag = "No" - Me.rdoRowNamesNo.Text = "No" - Me.rdoRowNamesNo.UseVisualStyleBackColor = True - ' - 'rdoRowNamesYes - ' - Me.rdoRowNamesYes.AutoSize = True - Me.rdoRowNamesYes.Location = New System.Drawing.Point(21, 131) - Me.rdoRowNamesYes.Name = "rdoRowNamesYes" - Me.rdoRowNamesYes.Size = New System.Drawing.Size(43, 17) - Me.rdoRowNamesYes.TabIndex = 45 - Me.rdoRowNamesYes.TabStop = True - Me.rdoRowNamesYes.Tag = "Yes" - Me.rdoRowNamesYes.Text = "Yes" - Me.rdoRowNamesYes.UseVisualStyleBackColor = True - ' - 'ucrNudSkip - ' - Me.ucrNudSkip.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSkip.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudSkip.Location = New System.Drawing.Point(81, 277) - Me.ucrNudSkip.Maximum = New Decimal(New Integer() {1000000, 0, 0, 0}) - Me.ucrNudSkip.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSkip.Name = "ucrNudSkip" - Me.ucrNudSkip.Size = New System.Drawing.Size(50, 20) - Me.ucrNudSkip.TabIndex = 47 - Me.ucrNudSkip.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrChkStringsAsFactors - ' - Me.ucrChkStringsAsFactors.Checked = False - Me.ucrChkStringsAsFactors.Location = New System.Drawing.Point(7, 307) - Me.ucrChkStringsAsFactors.Name = "ucrChkStringsAsFactors" - Me.ucrChkStringsAsFactors.Size = New System.Drawing.Size(206, 20) - Me.ucrChkStringsAsFactors.TabIndex = 43 - ' 'dlgImportDataset ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 4ac47b52711..f7e1e3c0032 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -21,7 +21,7 @@ Imports System.ComponentModel Public Class dlgImportDataset Private intLines As Integer - Private clsImportCSV, clsReadRDS, clsImportRDS, clsImportExcel As RFunction + Private clsImportCSV, clsReadRDS, clsImportRDS, clsImportExcel, clsImport As RFunction Private strTempWorkbookName As String Dim bFirstLoad As Boolean Public bFromLibrary As Boolean @@ -44,6 +44,7 @@ Public Class dlgImportDataset clsReadRDS = New RFunction clsImportRDS = New RFunction clsImportExcel = New RFunction + clsImport = New RFunction 'clsTempWorkbookImport = New RFunction 'clsTempExcelPreview = New RFunction ucrBase.clsRsyntax.SetFunction("import") @@ -116,10 +117,10 @@ Public Class dlgImportDataset ucrChkOverWrite.SetParameter(New RParameter("overwrite_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") 'temp disabled until can easily switch between fread and read.csv - ucrPnlRowNames.SetParameter(New RParameter("row.names")) + 'ucrPnlRowNames.SetParameter(New RParameter("row.names")) ' ucrPnlRowNames.AddRadioButton(rdoRowNamesYes, Chr(34) & Chr(34)) - ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "NULL" & Chr(34)) - ucrPnlRowNames.SetRDefault(Chr(34) & "NULL" & Chr(34)) + 'ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "NULL" & Chr(34)) + 'ucrPnlRowNames.SetRDefault(Chr(34) & "NULL" & Chr(34)) rdoRowNamesYes.Enabled = False 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator ucrInputSeparator.Enabled = False @@ -130,34 +131,37 @@ Public Class dlgImportDataset ucrInputFilePath.IsReadOnly = True - 'xl options settings - ucrNudxlRowsToSkip.Maximum = Integer.MaxValue ' ucrInputEncoding.SetItems({"unknown"}) ucrInputEncoding.SetParameter(New RParameter("encoding", 1)) - dctucrInputEncoding.Add("Unknown ,", Chr(34) & "unknown" & Chr(34)) + dctucrInputEncoding.Add("Unknown", Chr(34) & "unknown" & Chr(34)) + ucrInputEncoding.SetItems(dctucrInputEncoding) ucrInputEncoding.SetRDefault(Chr(34) & "unknown" & Chr(34)) + ucrInputEncoding.SetDropDownStyleAsNonEditable() 'csv options settings clsImportCSV.AddParameter("check.names", "TRUE") ' ucrInputSeparator.SetItems({"Automatic", ", ", "Whitespace", ": ", ";", "|", "^"}) ucrInputSeparator.SetParameter(New RParameter("sep")) - dctucrInputSeparator.Add("Automatic ,", Chr(34) & "auto" & Chr(34)) - dctucrInputSeparator.Add("Comma(,) ,", Chr(34) & "," & Chr(34)) - dctucrInputSeparator.Add("Whitespace ,", Chr(34) & " " & Chr(34)) - dctucrInputSeparator.Add("Colon(:) ,", Chr(34) & ":" & Chr(34)) - dctucrInputSeparator.Add("Semi-Colon(;) ,", Chr(34) & ";" & Chr(34)) - dctucrInputSeparator.Add("Vertcal-Line ,", Chr(34) & "|" & Chr(34)) - dctucrInputSeparator.Add("Power ,", Chr(34) & "^" & Chr(34)) + dctucrInputSeparator.Add("Automatic", Chr(34) & "auto" & Chr(34)) + dctucrInputSeparator.Add("Comma(,)", Chr(34) & "," & Chr(34)) + dctucrInputSeparator.Add("Whitespace", Chr(34) & " " & Chr(34)) + dctucrInputSeparator.Add("Colon(:)", Chr(34) & ":" & Chr(34)) + dctucrInputSeparator.Add("Semi-Colon(;)", Chr(34) & ";" & Chr(34)) + dctucrInputSeparator.Add("Vertcal-Line", Chr(34) & "|" & Chr(34)) + dctucrInputSeparator.Add("Power", Chr(34) & "^" & Chr(34)) + ucrInputSeparator.SetItems(dctucrInputSeparator) ucrInputSeparator.SetRDefault(Chr(34) & "auto" & Chr(34)) - + ucrInputSeparator.SetDropDownStyleAsNonEditable() 'Check...Changed NO to FALSE! 'ucrInputHeaders.SetItems({"Automatic", "Yes", "No"}) ucrInputHeaders.SetParameter(New RParameter("header")) dctucrInputHeaders.Add("Automatic", Chr(34) & "auto" & Chr(34)) dctucrInputHeaders.Add("Yes", Chr(34) & "TRUE" & Chr(34)) dctucrInputHeaders.Add("No", Chr(34) & "FALSE" & Chr(34)) - ucrInputHeaders.SetRDefault(Chr(34) & "FALSE" & Chr(34)) + ucrInputHeaders.SetItems(dctucrInputHeaders) + ucrInputHeaders.SetRDefault(Chr(34) & "auto" & Chr(34)) + ucrInputHeaders.SetDropDownStyleAsNonEditable() ' ucrInputDecimal.SetItems({"Automatic", ".", ","}) ucrInputDecimal.SetParameter(New RParameter("dec")) @@ -165,10 +169,30 @@ Public Class dlgImportDataset dctucrInputDecimal.Add("Automatic", Chr(34) & "auto" & Chr(34)) dctucrInputDecimal.Add("Period(.)", Chr(34) & "." & Chr(34)) dctucrInputDecimal.Add("Comma(,)", Chr(34) & "," & Chr(34)) + ucrInputDecimal.SetItems(dctucrInputDecimal) ucrInputDecimal.SetRDefault(Chr(34) & "auto" & Chr(34)) + ucrInputDecimal.SetDropDownStyleAsNonEditable() ucrNudSkip.SetParameter(New RParameter("skip")) ucrNudSkip.Maximum = Integer.MaxValue + + 'EXCEL + ucrInputSheets.SetDropDownStyleAsNonEditable() + ucrInputSheets.bAllowNonConditionValues = True + + ucrInputXlMissingValueString.SetParameter(New RParameter("na")) + ucrInputXlMissingValueString.SetRDefault(Chr(34) & "" & Chr(34)) + + ucrchkColumnNames.SetParameter(New RParameter("trim_ws"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrchkColumnNames.SetText("Trim Trailing WhiteSpace") + + 'xl options settings + ucrNudxlRowsToSkip.SetParameter(New RParameter("skip")) + ucrNudxlRowsToSkip.Maximum = Integer.MaxValue + ucrInputMaximumDataSize.SetParameter(New RParameter("n_max")) + ucrInputMaximumDataSize.SetRDefault(Chr(34) & "100000" & Chr(34)) + + End Sub Private Sub SetDefaults() @@ -187,10 +211,10 @@ Public Class dlgImportDataset setExcelDefaults() SetRDSDefaults() - clsImportCSV.AddParameter("encoding", Chr(34) & "unknown" & Chr(34)) - clsImportCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) - clsImportCSV.AddParameter("header", Chr(34) & "FALSE" & Chr(34)) - clsImportCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) + 'clsImportCSV.AddParameter("encoding", Chr(34) & "unknown" & Chr(34)) + 'clsImportCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) + 'clsImportCSV.AddParameter("header", Chr(34) & "auto" & Chr(34)) + 'clsImportCSV.AddParameter("dec", Chr(34) & "auto" & Chr(34)) End Sub #Region "Shared options" @@ -277,7 +301,7 @@ Public Class dlgImportDataset ucrInputHeaders.SetRCode(clsImportCSV, bReset) ucrInputDecimal.SetRCode(clsImportCSV, bReset) ucrInputEncoding.SetRCode(clsImportCSV, bReset) - ucrPnlRowNames.SetRCode(clsImportCSV, bReset) + 'ucrPnlRowNames.SetRCode(clsImportCSV, bReset) ucrChkImportChangesLog.SetRCode(clsImportRDS, bReset) ucrChkExistingData.SetRCode(clsImportRDS, bReset) ucrChkImportMetadata.SetRCode(clsImportRDS, bReset) @@ -285,6 +309,13 @@ Public Class dlgImportDataset ucrChkImportFilters.SetRCode(clsImportRDS, bReset) ucrChkImportCalculations.SetRCode(clsImportRDS, bReset) ucrChkOverWrite.SetRCode(clsImportRDS, bReset) + + ucrNudxlRowsToSkip.SetRCode(clsImportExcel, bReset) + ucrInputMaximumDataSize.SetRCode(clsImportExcel, bReset) + ucrInputSheets.SetRCode(clsImportExcel, bReset) + ucrInputXlMissingValueString.SetRCode(clsImportExcel, bReset) + ucrchkColumnNames.SetRCode(clsImportExcel, bReset) + End Sub Public Sub SetDialogWithFile(strFilePath As String) @@ -335,7 +366,6 @@ Public Class dlgImportDataset strFileType = "csv" ucrInputName.SetName(strFileName, bSilent:=True) RefreshFilePreview() - ucrInputName.Focus() ElseIf strFileExt = ".xlsx" OrElse strFileExt = ".xls" Then clsImportExcel.SetPackageName("rio") clsImportExcel.SetRCommand("import") @@ -359,10 +389,10 @@ Public Class dlgImportDataset 'ucrInputName.SetName(strFileName, bSilent:=True) Else strFileType = strFileExt.Substring(1) - ucrBase.clsRsyntax.clsBaseFunction.SetPackageName("rio") - ucrBase.clsRsyntax.clsBaseFunction.ClearParameters() - ucrBase.clsRsyntax.SetFunction("import") - ucrBase.clsRsyntax.AddParameter("file", Chr(34) & strFilePath & Chr(34)) + clsImport.SetPackageName("rio") + clsImport.SetRCommand("import") + clsImport.AddParameter("file", Chr(34) & strFilePath & Chr(34)) + ucrBase.clsRsyntax.SetBaseRFunction(clsImport) grpCSV.Hide() grpExcel.Hide() grpRDS.Hide() @@ -371,7 +401,6 @@ Public Class dlgImportDataset txtPreview.Hide() lblInputFile.Hide() ucrInputName.SetName(strFileName, bSilent:=True) - ucrInputName.Focus() End If RefreshFilePreview() RefreshFrameView() @@ -596,7 +625,7 @@ Public Class dlgImportDataset 'ucrInputSeparator.SetName("Automatic") 'ucrInputHeaders.SetName("Automatic") 'ucrInputDecimal.SetName("Automatic") - ucrInputNAStrings.SetName("NA") + 'ucrInputNAStrings.SetName("NA") ' ucrNudSkip.Value = 0 'ucrChkStringsAsFactors.Checked = True End Sub @@ -615,12 +644,12 @@ Public Class dlgImportDataset Private Sub rdoRowNames_CheckedChanged() Handles ucrPnlRowNames.ControlValueChanged If rdoRowNamesYes.Checked Then 'TODO this is not an option for fread so have to change function here - clsImportCSV.AddParameter("row.names", 1) + ' clsImportCSV.AddParameter("row.names", 1) Else 'TODO find out what difference there is between 'row.names = NULL and row.names missing 'disabled as import (fread) does not support row.names - clsImportCSV.AddParameter("row.names", "NULL") + 'clsImportCSV.AddParameter("row.names", "NULL") ' clsImportCSV.RemoveParameterByName("row.names") End If End Sub @@ -654,34 +683,34 @@ Public Class dlgImportDataset RefreshFrameView() End Sub - Private Sub ucrInputSeparator_ControlValueChanged() Handles ucrInputSeparator.ControlValueChanged - 'Select Case ucrInputSeparator.GetText - ' Case "Automatic" - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) - ' Else - ' clsImportCSV.RemoveParameterByName("sep") - ' End If - ' clsImportCSV.RemoveParameterByName("sep") - ' Case "Whitespace" - ' clsImportCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) - ' Case "" - ' clsImportCSV.RemoveParameterByName("sep") - ' Case Else - ' clsImportCSV.AddParameter("sep", Chr(34) & ucrInputSeparator.GetText() & Chr(34)) - 'End Select - RefreshFrameView() - End Sub + ' Private Sub ucrInputSeparator_ControlValueChanged() Handles ucrInputSeparator.ControlValueChanged + 'Select Case ucrInputSeparator.GetText + ' Case "Automatic" + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsImportCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) + ' Else + ' clsImportCSV.RemoveParameterByName("sep") + ' End If + ' clsImportCSV.RemoveParameterByName("sep") + ' Case "Whitespace" + ' clsImportCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) + ' Case "" + ' clsImportCSV.RemoveParameterByName("sep") + ' Case Else + ' clsImportCSV.AddParameter("sep", Chr(34) & ucrInputSeparator.GetText() & Chr(34)) + 'End Select + ' RefreshFrameView() + 'End Sub - Private Sub ucrInputDecimal_TextChanged() Handles ucrInputDecimal.ControlValueChanged - 'Select Case ucrInputDecimal.GetText - ' Case "Period" - ' clsImportCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) - ' Case "Comma" - ' clsImportCSV.AddParameter("dec", Chr(34) & "," & Chr(34)) - 'End Select - RefreshFrameView() - End Sub + 'Private Sub ucrInputDecimal_TextChanged() Handles ucrInputDecimal.ControlValueChanged + 'Select Case ucrInputDecimal.GetText + ' Case "Period" + ' clsImportCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) + ' Case "Comma" + ' clsImportCSV.AddParameter("dec", Chr(34) & "," & Chr(34)) + 'End Select + ' RefreshFrameView() + ' End Sub Private Sub ucrInputNAStrings_ControlValueChanged() Handles ucrInputNAStrings.ControlValueChanged If ucrInputNAStrings.GetText() <> "" AndAlso (ucrInputNAStrings.GetText() <> "NA" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then @@ -714,7 +743,7 @@ Public Class dlgImportDataset #Region "Excel options" Private Sub setExcelDefaults() - ucrNudxlRowsToSkip.Value = 0 + ' ucrNudxlRowsToSkip.Value = 0 XlSkipRowsParameter() ucrchkColumnNames.Checked = True XlStringsAsFactorsParameter() @@ -765,6 +794,7 @@ Public Class dlgImportDataset ' Private Sub nudxlRowsToSkip_TextChanged(sender As Object, e As EventArgs) Handles ucrNudxlRowsToSkip.ControlValueChanged ' XlSkipRowsParameter() + ' ucrchkColumnNames ' ucrchkColumnNames.SetText("Trim Trailing WhiteSpace") ' End Sub 'Private Sub nudxlRowsToSkip_TextChanged(sender As Object, e As EventArgs) Handles ucrchkColumnNames.ControlValueChanged @@ -776,12 +806,12 @@ Public Class dlgImportDataset If bComponentsInitialised Then If ucrNudxlRowsToSkip.Text <> "" Then If ucrNudxlRowsToSkip.Value = 0 AndAlso Not frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - 'clsReadXL.RemoveParameterByName("skip") + clsImportExcel.RemoveParameterByName("skip") Else - ' clsReadXL.AddParameter("skip", ucrNudxlRowsToSkip.Value) + clsImportExcel.AddParameter("skip", ucrNudxlRowsToSkip.Value) End If Else - 'clsReadXL.RemoveParameterByName("skip") + clsImportExcel.RemoveParameterByName("skip") End If RefreshFrameView() End If @@ -856,14 +886,12 @@ Public Class dlgImportDataset ' clsReadXL.RemoveParameterByName("sheet") If Not ucrInputName.UserTyped() Then ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) - ucrInputName.Focus() End If ElseIf strFileType = "xls" Then 'clsReadXL.AddParameter("sheet", ucrInputSheets.cboInput.SelectedIndex + 1) ' clsReadXL.RemoveParameterByName("which") If Not ucrInputName.UserTyped() Then ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) - ucrInputName.Focus() End If Else ' clsReadXL.RemoveParameterByName("sheet") @@ -894,8 +922,7 @@ Public Class dlgImportDataset ' nudStartRow.Enabled = False ' If Not ucrInputName.UserTyped() Then ' ucrInputName.SetName(ucrInputNamedRegions.GetText(), bSilent:=True) - ' ucrInputName.Focus() - ' End If + ' ' End If ' Else ' clsReadXLSX.RemoveParameterByName("namedRegion") ' nudStartRow.Enabled = True From 9ff068f840c8db4b818655db9fbd8c0b02dedd0f Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 19 Jun 2017 22:42:24 +0300 Subject: [PATCH 099/201] Controls arrangement --- instat/dlgImportDataset.Designer.vb | 168 ++++++++++---------- instat/dlgImportDataset.resx | 238 ++++++++++++++-------------- instat/dlgImportDataset.vb | 24 ++- 3 files changed, 223 insertions(+), 207 deletions(-) diff --git a/instat/dlgImportDataset.Designer.vb b/instat/dlgImportDataset.Designer.vb index 39797b2d59c..066df380e3e 100644 --- a/instat/dlgImportDataset.Designer.vb +++ b/instat/dlgImportDataset.Designer.vb @@ -48,6 +48,14 @@ Partial Class dlgImportDataset Me.ucrInputSeparator = New instat.ucrInputComboBox() Me.ucrInputEncoding = New instat.ucrInputComboBox() Me.grpExcel = New System.Windows.Forms.GroupBox() + Me.grpRDS = New System.Windows.Forms.GroupBox() + Me.ucrChkOverWrite = New instat.ucrCheck() + Me.ucrChkImportObjects = New instat.ucrCheck() + Me.ucrChkImportCalculations = New instat.ucrCheck() + Me.ucrChkImportChangesLog = New instat.ucrCheck() + Me.ucrChkImportFilters = New instat.ucrCheck() + Me.ucrChkImportMetadata = New instat.ucrCheck() + Me.ucrChkExistingData = New instat.ucrCheck() Me.ucrchkColumnNames = New instat.ucrCheck() Me.ucrNudxlRowsToSkip = New instat.ucrNud() Me.Label1 = New System.Windows.Forms.Label() @@ -64,14 +72,6 @@ Partial Class dlgImportDataset Me.ucrInputFilePath = New instat.ucrInputTextBox() Me.ucrInputName = New instat.ucrInputTextBox() Me.ucrBase = New instat.ucrButtons() - Me.grpRDS = New System.Windows.Forms.GroupBox() - Me.ucrChkOverWrite = New instat.ucrCheck() - Me.ucrChkImportObjects = New instat.ucrCheck() - Me.ucrChkImportCalculations = New instat.ucrCheck() - Me.ucrChkImportChangesLog = New instat.ucrCheck() - Me.ucrChkImportFilters = New instat.ucrCheck() - Me.ucrChkImportMetadata = New instat.ucrCheck() - Me.ucrChkExistingData = New instat.ucrCheck() Me.grpCSV.SuspendLayout() Me.grpExcel.SuspendLayout() Me.grpRDS.SuspendLayout() @@ -242,7 +242,7 @@ Partial Class dlgImportDataset Me.grpCSV.Controls.Add(Me.lblLinesToSkip) Me.grpCSV.Controls.Add(Me.lblDecimal) Me.grpCSV.Controls.Add(Me.lblNAStrings) - Me.grpCSV.Location = New System.Drawing.Point(18, 85) + Me.grpCSV.Location = New System.Drawing.Point(9, 88) Me.grpCSV.Name = "grpCSV" Me.grpCSV.Size = New System.Drawing.Size(219, 346) Me.grpCSV.TabIndex = 34 @@ -360,7 +360,7 @@ Partial Class dlgImportDataset Me.grpExcel.Controls.Add(Me.ucrInputSheets) Me.grpExcel.Controls.Add(Me.lblRowToSkip) Me.grpExcel.Controls.Add(Me.lblSheets) - Me.grpExcel.Location = New System.Drawing.Point(669, 86) + Me.grpExcel.Location = New System.Drawing.Point(11, 88) Me.grpExcel.Name = "grpExcel" Me.grpExcel.Size = New System.Drawing.Size(217, 392) Me.grpExcel.TabIndex = 35 @@ -368,6 +368,79 @@ Partial Class dlgImportDataset Me.grpExcel.Text = "Import Excel options" Me.grpExcel.Visible = False ' + 'grpRDS + ' + Me.grpRDS.Controls.Add(Me.ucrChkOverWrite) + Me.grpRDS.Controls.Add(Me.ucrChkImportObjects) + Me.grpRDS.Controls.Add(Me.ucrChkImportCalculations) + Me.grpRDS.Controls.Add(Me.ucrChkImportChangesLog) + Me.grpRDS.Controls.Add(Me.ucrChkImportFilters) + Me.grpRDS.Controls.Add(Me.ucrChkImportMetadata) + Me.grpRDS.Controls.Add(Me.ucrChkExistingData) + Me.grpRDS.Location = New System.Drawing.Point(13, 88) + Me.grpRDS.Name = "grpRDS" + Me.grpRDS.Size = New System.Drawing.Size(217, 166) + Me.grpRDS.TabIndex = 37 + Me.grpRDS.TabStop = False + Me.grpRDS.Text = "Import RDS options" + Me.grpRDS.Visible = False + ' + 'ucrChkOverWrite + ' + Me.ucrChkOverWrite.Checked = False + Me.ucrChkOverWrite.Location = New System.Drawing.Point(6, 134) + Me.ucrChkOverWrite.Name = "ucrChkOverWrite" + Me.ucrChkOverWrite.Size = New System.Drawing.Size(205, 20) + Me.ucrChkOverWrite.TabIndex = 49 + ' + 'ucrChkImportObjects + ' + Me.ucrChkImportObjects.Checked = False + Me.ucrChkImportObjects.Location = New System.Drawing.Point(6, 54) + Me.ucrChkImportObjects.Name = "ucrChkImportObjects" + Me.ucrChkImportObjects.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportObjects.TabIndex = 48 + ' + 'ucrChkImportCalculations + ' + Me.ucrChkImportCalculations.Checked = False + Me.ucrChkImportCalculations.Location = New System.Drawing.Point(6, 94) + Me.ucrChkImportCalculations.Name = "ucrChkImportCalculations" + Me.ucrChkImportCalculations.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportCalculations.TabIndex = 47 + ' + 'ucrChkImportChangesLog + ' + Me.ucrChkImportChangesLog.Checked = False + Me.ucrChkImportChangesLog.Location = New System.Drawing.Point(6, 114) + Me.ucrChkImportChangesLog.Name = "ucrChkImportChangesLog" + Me.ucrChkImportChangesLog.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportChangesLog.TabIndex = 46 + ' + 'ucrChkImportFilters + ' + Me.ucrChkImportFilters.Checked = False + Me.ucrChkImportFilters.Location = New System.Drawing.Point(6, 74) + Me.ucrChkImportFilters.Name = "ucrChkImportFilters" + Me.ucrChkImportFilters.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportFilters.TabIndex = 45 + ' + 'ucrChkImportMetadata + ' + Me.ucrChkImportMetadata.Checked = False + Me.ucrChkImportMetadata.Location = New System.Drawing.Point(6, 34) + Me.ucrChkImportMetadata.Name = "ucrChkImportMetadata" + Me.ucrChkImportMetadata.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportMetadata.TabIndex = 44 + ' + 'ucrChkExistingData + ' + Me.ucrChkExistingData.Checked = False + Me.ucrChkExistingData.Location = New System.Drawing.Point(6, 14) + Me.ucrChkExistingData.Name = "ucrChkExistingData" + Me.ucrChkExistingData.Size = New System.Drawing.Size(205, 20) + Me.ucrChkExistingData.TabIndex = 43 + ' 'ucrchkColumnNames ' Me.ucrchkColumnNames.Checked = False @@ -523,84 +596,11 @@ Partial Class dlgImportDataset Me.ucrBase.Size = New System.Drawing.Size(410, 53) Me.ucrBase.TabIndex = 27 ' - 'grpRDS - ' - Me.grpRDS.Controls.Add(Me.ucrChkOverWrite) - Me.grpRDS.Controls.Add(Me.ucrChkImportObjects) - Me.grpRDS.Controls.Add(Me.ucrChkImportCalculations) - Me.grpRDS.Controls.Add(Me.ucrChkImportChangesLog) - Me.grpRDS.Controls.Add(Me.ucrChkImportFilters) - Me.grpRDS.Controls.Add(Me.ucrChkImportMetadata) - Me.grpRDS.Controls.Add(Me.ucrChkExistingData) - Me.grpRDS.Location = New System.Drawing.Point(329, 56) - Me.grpRDS.Name = "grpRDS" - Me.grpRDS.Size = New System.Drawing.Size(217, 166) - Me.grpRDS.TabIndex = 37 - Me.grpRDS.TabStop = False - Me.grpRDS.Text = "Import RDS options" - Me.grpRDS.Visible = False - ' - 'ucrChkOverWrite - ' - Me.ucrChkOverWrite.Checked = False - Me.ucrChkOverWrite.Location = New System.Drawing.Point(6, 134) - Me.ucrChkOverWrite.Name = "ucrChkOverWrite" - Me.ucrChkOverWrite.Size = New System.Drawing.Size(205, 20) - Me.ucrChkOverWrite.TabIndex = 49 - ' - 'ucrChkImportObjects - ' - Me.ucrChkImportObjects.Checked = False - Me.ucrChkImportObjects.Location = New System.Drawing.Point(6, 54) - Me.ucrChkImportObjects.Name = "ucrChkImportObjects" - Me.ucrChkImportObjects.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportObjects.TabIndex = 48 - ' - 'ucrChkImportCalculations - ' - Me.ucrChkImportCalculations.Checked = False - Me.ucrChkImportCalculations.Location = New System.Drawing.Point(6, 94) - Me.ucrChkImportCalculations.Name = "ucrChkImportCalculations" - Me.ucrChkImportCalculations.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportCalculations.TabIndex = 47 - ' - 'ucrChkImportChangesLog - ' - Me.ucrChkImportChangesLog.Checked = False - Me.ucrChkImportChangesLog.Location = New System.Drawing.Point(6, 114) - Me.ucrChkImportChangesLog.Name = "ucrChkImportChangesLog" - Me.ucrChkImportChangesLog.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportChangesLog.TabIndex = 46 - ' - 'ucrChkImportFilters - ' - Me.ucrChkImportFilters.Checked = False - Me.ucrChkImportFilters.Location = New System.Drawing.Point(6, 74) - Me.ucrChkImportFilters.Name = "ucrChkImportFilters" - Me.ucrChkImportFilters.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportFilters.TabIndex = 45 - ' - 'ucrChkImportMetadata - ' - Me.ucrChkImportMetadata.Checked = False - Me.ucrChkImportMetadata.Location = New System.Drawing.Point(6, 34) - Me.ucrChkImportMetadata.Name = "ucrChkImportMetadata" - Me.ucrChkImportMetadata.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportMetadata.TabIndex = 44 - ' - 'ucrChkExistingData - ' - Me.ucrChkExistingData.Checked = False - Me.ucrChkExistingData.Location = New System.Drawing.Point(6, 14) - Me.ucrChkExistingData.Name = "ucrChkExistingData" - Me.ucrChkExistingData.Size = New System.Drawing.Size(205, 20) - Me.ucrChkExistingData.TabIndex = 43 - ' 'dlgImportDataset ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(889, 499) + Me.ClientSize = New System.Drawing.Size(679, 499) Me.Controls.Add(Me.grpRDS) Me.Controls.Add(Me.lblNoPreview) Me.Controls.Add(Me.grpExcel) diff --git a/instat/dlgImportDataset.resx b/instat/dlgImportDataset.resx index 1af7de150c9..29dcb1b3a35 100644 --- a/instat/dlgImportDataset.resx +++ b/instat/dlgImportDataset.resx @@ -1,120 +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 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/dlgImportDataset.vb b/instat/dlgImportDataset.vb index f7e1e3c0032..7e070948be0 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -97,24 +97,32 @@ Public Class dlgImportDataset ucrChkImportChangesLog.SetText("Import Changes log") ucrChkImportChangesLog.SetParameter(New RParameter("include_logs"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") + ucrChkImportChangesLog.AddParameterPresentCondition(True, "include_logs") ucrChkExistingData.SetText("Keep existing data frames") ucrChkExistingData.SetParameter(New RParameter("keep_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkExistingData.AddParameterPresentCondition(True, "keep_existing") ucrChkImportMetadata.SetText("Import metadata") ucrChkImportMetadata.SetParameter(New RParameter("include_metadata"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkImportMetadata.AddParameterPresentCondition(True, "include_metadata") ucrChkImportObjects.SetText("Import objects") ucrChkImportObjects.SetParameter(New RParameter("include_objects"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkImportObjects.AddParameterPresentCondition(True, "include_objects") ucrChkImportFilters.SetText("Import filters") ucrChkImportFilters.SetParameter(New RParameter("include_filters"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkImportFilters.AddParameterPresentCondition(True, "include_filters") ucrChkImportCalculations.SetText("Import calculations") ucrChkImportCalculations.SetParameter(New RParameter("include_calculations"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkImportCalculations.AddParameterPresentCondition(True, "include_calculations") ucrChkOverWrite.SetText("Overwrite existing if duplicates found") ucrChkOverWrite.SetParameter(New RParameter("overwrite_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkOverWrite.AddParameterPresentCondition(True, "overwrite_existing") + 'temp disabled until can easily switch between fread and read.csv 'ucrPnlRowNames.SetParameter(New RParameter("row.names")) @@ -211,10 +219,6 @@ Public Class dlgImportDataset setExcelDefaults() SetRDSDefaults() - 'clsImportCSV.AddParameter("encoding", Chr(34) & "unknown" & Chr(34)) - 'clsImportCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) - 'clsImportCSV.AddParameter("header", Chr(34) & "auto" & Chr(34)) - 'clsImportCSV.AddParameter("dec", Chr(34) & "auto" & Chr(34)) End Sub #Region "Shared options" @@ -861,6 +865,18 @@ Public Class dlgImportDataset RefreshFrameView() End Sub + Private Sub ucrInputXlMissingValueString_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputXlMissingValueString.ControlValueChanged + + End Sub + + Private Sub ucrInputNAStrings_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputNAStrings.ControlValueChanged + + End Sub + + Private Sub ucrInputName_NameChanged(ucrChangedControl As ucrCore) Handles ucrInputName.ControlValueChanged + + End Sub + Private Sub lblRowVector_Click(sender As Object, e As EventArgs) Me.Hide() frmMetaData.Show() From 67b89ef239770cc415bbb70e7edc9e0729ec3e5c Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 19 Jun 2017 20:52:54 +0100 Subject: [PATCH 100/201] corrected setting R code --- instat/dlgStack.vb | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/instat/dlgStack.vb b/instat/dlgStack.vb index 9f6b9eb7af2..828a5e9a139 100644 --- a/instat/dlgStack.vb +++ b/instat/dlgStack.vb @@ -72,7 +72,7 @@ Public Class dlgStack ucrStackDataInto.SetLinkedDisplayControl(lblStackDataInto) ucrChkStackMultipleSets.SetText("Stack multiple column sets") - ucrChkStackMultipleSets.AddToLinkedControls(ucrNudNoSets, {True}, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=2) + ucrChkStackMultipleSets.AddToLinkedControls(ucrNudNoSets, {True}, bNewLinkedHideIfParameterMissing:=True) ucrChkStackMultipleSets.AddToLinkedControls(ucrChkCarryColumns, {False}, bNewLinkedHideIfParameterMissing:=True) ucrChkStackMultipleSets.AddToLinkedControls(ucrStackDataInto, {False}, bNewLinkedHideIfParameterMissing:=True) ucrChkStackMultipleSets.AddFunctionNamesCondition(True, "reshape") @@ -125,6 +125,8 @@ Public Class dlgStack ucrChkStackMultipleSets.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + ucrNudNoSets.SetRCode(clsSplitColumnsInGroups, bReset) + ucrSelectorStack.SetRCode(clsMeltFunction, bReset) ucrReceiverColumnsToBeStack.SetRCode(clsMeltFunction, bReset) ucrColumnsToCarryReceiver.SetRCode(clsMeltFunction, bReset) @@ -136,25 +138,34 @@ Public Class dlgStack If bReset Then SetCarryColumnsOptions() End If + SetSingleOrMultipleOptions() End Sub Private Sub TestOKEnabled() - If ucrSaveNewDataName.IsComplete AndAlso Not ucrStackDataInto.IsEmpty() AndAlso Not ucrFactorInto.IsEmpty() Then - If Not ucrChkCarryColumns.Checked Then - If Not ucrReceiverColumnsToBeStack.IsEmpty() Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If + If ucrChkStackMultipleSets.Checked Then + If ucrSaveNewDataName.IsComplete AndAlso Not ucrStackDataInto.IsEmpty() Then + ucrBase.OKEnabled(True) Else - If Not ucrColumnsToCarryReceiver.IsEmpty Then - ucrBase.OKEnabled(True) + ucrBase.OKEnabled(False) + End If + Else + If ucrSaveNewDataName.IsComplete AndAlso Not ucrStackDataInto.IsEmpty() AndAlso Not ucrFactorInto.IsEmpty() Then + If Not ucrChkCarryColumns.Checked Then + If Not ucrReceiverColumnsToBeStack.IsEmpty() Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If Else - ucrBase.OKEnabled(False) + If Not ucrColumnsToCarryReceiver.IsEmpty Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If End If + Else + ucrBase.OKEnabled(False) End If - Else - ucrBase.OKEnabled(False) End If End Sub @@ -196,13 +207,21 @@ Public Class dlgStack End Sub Private Sub ucrChkStackMultipleSets_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkStackMultipleSets.ControlValueChanged + SetSingleOrMultipleOptions() + End Sub + + Private Sub SetSingleOrMultipleOptions() If ucrChkStackMultipleSets.Checked Then ucrBase.clsRsyntax.SetBaseRFunction(clsReshapeFunction) + ucrReceiverColumnsToBeStack.SetMeAsReceiver() + 'This is needed in case the value in ucrFactorInto is the R default for melt ("variable") + 'in which case it would have been removed from all functions (R default shared by all functions) If Not ucrFactorInto.IsEmpty Then clsReshapeFunction.AddParameter("timevar", Chr(34) & ucrFactorInto.GetText() & Chr(34)) End If Else ucrBase.clsRsyntax.SetBaseRFunction(clsMeltFunction) End If + TestOKEnabled() End Sub End Class From 01a688bb00e25ab1e1d88919f2f16fc63451db13 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Tue, 20 Jun 2017 09:31:40 +0300 Subject: [PATCH 101/201] Adding max columns nud --- instat/dlgOptions.Designer.vb | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/instat/dlgOptions.Designer.vb b/instat/dlgOptions.Designer.vb index 5d421272c4e..d956e7c5134 100644 --- a/instat/dlgOptions.Designer.vb +++ b/instat/dlgOptions.Designer.vb @@ -88,6 +88,8 @@ Partial Class dlgOptions Me.trOptions = New System.Windows.Forms.TreeView() Me.spltControls = New System.Windows.Forms.SplitContainer() Me.cmdFactoryReset = New System.Windows.Forms.Button() + Me.lblMaxCols = New System.Windows.Forms.Label() + Me.ucrNudMaxCols = New instat.ucrNud() Me.tbcOptions.SuspendLayout() Me.tbpLanguages.SuspendLayout() Me.pnLanguages.SuspendLayout() @@ -582,6 +584,8 @@ Partial Class dlgOptions ' 'tbpDataView ' + Me.tbpDataView.Controls.Add(Me.ucrNudMaxCols) + Me.tbpDataView.Controls.Add(Me.lblMaxCols) Me.tbpDataView.Controls.Add(Me.ucrNudMaxRows) Me.tbpDataView.Controls.Add(Me.lblMaxRows) Me.tbpDataView.Location = New System.Drawing.Point(4, 22) @@ -596,7 +600,7 @@ Partial Class dlgOptions ' Me.ucrNudMaxRows.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudMaxRows.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudMaxRows.Location = New System.Drawing.Point(198, 15) + Me.ucrNudMaxRows.Location = New System.Drawing.Point(220, 15) Me.ucrNudMaxRows.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudMaxRows.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudMaxRows.Name = "ucrNudMaxRows" @@ -765,6 +769,27 @@ Partial Class dlgOptions Me.cmdFactoryReset.Text = "Factory Reset" Me.cmdFactoryReset.UseVisualStyleBackColor = True ' + 'lblMaxCols + ' + Me.lblMaxCols.AutoSize = True + Me.lblMaxCols.Location = New System.Drawing.Point(10, 44) + Me.lblMaxCols.Name = "lblMaxCols" + Me.lblMaxCols.Size = New System.Drawing.Size(198, 13) + Me.lblMaxCols.TabIndex = 1 + Me.lblMaxCols.Text = "Maximum Number of Columns to Display:" + ' + 'ucrNudMaxCols + ' + Me.ucrNudMaxCols.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudMaxCols.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudMaxCols.Location = New System.Drawing.Point(221, 41) + Me.ucrNudMaxCols.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudMaxCols.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudMaxCols.Name = "ucrNudMaxCols" + Me.ucrNudMaxCols.Size = New System.Drawing.Size(50, 20) + Me.ucrNudMaxCols.TabIndex = 2 + Me.ucrNudMaxCols.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'dlgOptions ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -880,4 +905,6 @@ Partial Class dlgOptions Friend WithEvents ucrPnlGraphDisplay As UcrPanel Friend WithEvents ucrPnlLanguage As UcrPanel Friend WithEvents ucrInputComment As ucrInputTextBox + Friend WithEvents ucrNudMaxCols As ucrNud + Friend WithEvents lblMaxCols As Label End Class From 30f218cc0694f1c3c139ce2e91cadd12d7968569 Mon Sep 17 00:00:00 2001 From: Lily Date: Tue, 20 Jun 2017 08:49:53 +0100 Subject: [PATCH 102/201] minor edits --- instat/dlgStartofRains.vb | 620 +++++++++++++++++++------------------- 1 file changed, 312 insertions(+), 308 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 874942bf425..e5d1519fb64 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -13,6 +13,7 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class dlgStartofRains @@ -282,8 +283,8 @@ Public Class dlgStartofRains clsTRRollingSumFunction.AddParameter("width", 2, iPosition:=1) clsTRRollingSumFunction.AddParameter("FUN", "sum", iPosition:=2) clsTRRollingSumFunction.AddParameter("na.rm", "FALSE", iPosition:=3) - clsTRRollingSumFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) ' chr(39) = ' ?? - clsTRRollingSumFunction.AddParameter("fill", "NA", iPosition:=5) ' chr(39) = ' ?? + clsTRRollingSumFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) + clsTRRollingSumFunction.AddParameter("fill", "NA", iPosition:=5) clsTRRollingSum.AddParameter("save", 0, iPosition:=6) ' Quantile checked: @@ -308,7 +309,6 @@ Public Class dlgStartofRains clsRDRollingRainDays.SetRCommand("instat_calculation$new") clsRDRollingRainDaysSub.SetRCommand("list") clsRDRollingRainDays.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & clsRDRollingRainDaysFunction.ToScript & Chr(34), iPosition:=1) clsRDRollingRainDaysFunction.SetPackageName("zoo") clsRDRollingRainDaysFunction.SetRCommand("rollapply") clsRDRollingRainDaysFunction.AddParameter("data", "rain_day", iPosition:=0) @@ -332,7 +332,6 @@ Public Class dlgStartofRains clsDSDrySpell.AddParameter("save", 0, iPosition:=6) clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & clsDSDryPeriodTenFunctionLead.ToScript & Chr(34)) clsDSDryPeriodTenFunctionLead.SetRCommand("lead") clsDSDryPeriodTenFunctionLead.AddParameter("x", clsRFunctionParameter:=clsDSDryPeriodTenFunction) clsDSDryPeriodTenFunction.SetPackageName("zoo") @@ -407,8 +406,6 @@ Public Class dlgStartofRains clsDPOverallInterval.AddParameter("save", "2", iPosition:=6) - CheckBoxesSetting() - TestOKEnabled() ucrNudTRAmount.Value = 20 ucrNudDSMaximumDays.Value = 10 'DefaultNudValue() @@ -486,11 +483,13 @@ Public Class dlgStartofRains If ucrChkNumberOfRainyDays.Checked Then TotalRainyDays() clsRDRollingRainDays.SetAssignTo("Rolling_rain") + clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & clsRDRollingRainDaysFunction.ToScript & Chr(34), iPosition:=1) End If If ucrChkDrySpell.Checked Then clsDSDrySpell.SetAssignTo("Dry_Spell") clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") + clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & clsDSDryPeriodTenFunctionLead.ToScript & Chr(34)) End If If ucrChkDryPeriod.Checked Then @@ -498,7 +497,7 @@ Public Class dlgStartofRains clsDPRainInDays.SetAssignTo("Rain_Period_Length") clsDPRain.SetAssignTo("Above_Threshold") clsDPRainInDays.AddParameter("function_exp", Chr(34) & clsDPRainInDaysFunctionLead.ToScript & Chr(34), iPosition:=2) - clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") + DryPeriod() End If clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & clsFirstDOYPerYearOperator.ToScript & Chr(34), iPosition:=1) CombinedFilter() @@ -552,6 +551,7 @@ Public Class dlgStartofRains Private Sub DryPeriod() clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=5) + clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") End Sub Private Sub CombinedFilter() @@ -597,6 +597,9 @@ Public Class dlgStartofRains clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) End Sub + Private Sub ucrChkDryPeriod_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDryPeriod.ControlValueChanged, ucrChkDrySpell.ControlValueChanged, ucrChkNumberOfRainyDays.ControlValueChanged, ucrChkTotalRainfall.ControlValueChanged + CombinedFilter() + End Sub @@ -609,340 +612,341 @@ Public Class dlgStartofRains - Private Sub ucrReceiverDOY_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDOY.SelectionChanged - firstDayofTheYear() - FirstDOYPerYear() - TestOKEnabled() - End Sub - Private Sub ucrSelectorForStartofRains_DataFrameChanged() Handles ucrSelectorForStartofRains.DataFrameChanged - strCurrDataName = Chr(34) & ucrSelectorForStartofRains.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - firstDayofTheYear() - End Sub - - Private Sub ReopenDialog() - - End Sub - - Private Sub TestOKEnabled() - 'If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.Text <> "" AndAlso ucrNudFrom.Text = "" AndAlso ucrNudTo.Text = "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.Text <> "" AndAlso ucrNudRDOutOfDays.Text <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso Not ucrNudTROverDays.GetText = "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.Text <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.Text = ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((chkDrySpell.Checked AndAlso nudDSMaximumDays.Text <> "" AndAlso ucrNudDSLengthOfTime.Text <> "") OrElse Not chkDrySpell.Checked) AndAlso ((chkDryPeriod.Checked AndAlso nudDPMaxRain.Text <> "" AndAlso nudDPRainPeriod.Text <> "" AndAlso nudDPOverallInterval.Text <> "") OrElse Not chkDryPeriod.Checked) Then - ' ucrBase.OKEnabled(True) - 'Else - ' ucrBase.OKEnabled(False) - 'End If - End Sub ' ucrNudDPRainPeriod, ucrNudDPMaxRain, ucrNudDPOverallInterval - - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeForControls(True) - TestOKEnabled() - End Sub + 'Private Sub ucrReceiverDOY_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDOY.SelectionChanged + ' firstDayofTheYear() + ' FirstDOYPerYear() + ' TestOKEnabled() + 'End Sub - Private Sub grpRainParameters_Enter(sender As Object, e As EventArgs) - RainyDaysMethod() - nudValues() - CombinedFilter() - TestOKEnabled() - End Sub + 'Private Sub ucrSelectorForStartofRains_DataFrameChanged() Handles ucrSelectorForStartofRains.DataFrameChanged + ' strCurrDataName = Chr(34) & ucrSelectorForStartofRains.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) + ' firstDayofTheYear() + 'End Sub - Private Sub DryPeriod(sender As Object, e As EventArgs) - CheckBoxesSetting() - DryPeriodOld() - nudValues() - TestOKEnabled() - End Sub + 'Private Sub ReopenDialog() - Private Sub TotalRainfall(sender As Object, e As EventArgs) Handles rdoTRAmount.CheckedChanged, rdoTRPercentile.CheckedChanged - CheckBoxesSetting() - CombinedFilter() - RollingSumMethod() - TotalRainPercentileWetSpell() - nudValues() ' new - 'DefaultNudValue() - TestOKEnabled() - End Sub - - Private Sub TotalRainfallNuds(sender As Object, e As EventArgs) - CombinedFilter() - TestOKEnabled() - End Sub + 'End Sub - Private Sub RainyDays(sender As Object, e As EventArgs) - CheckBoxesSetting() - RollingOfRainDays() - nudValues() - CombinedFilter() - TestOKEnabled() - End Sub + 'Private Sub TestOKEnabled() + ' 'If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.Text <> "" AndAlso ucrNudFrom.Text = "" AndAlso ucrNudTo.Text = "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.Text <> "" AndAlso ucrNudRDOutOfDays.Text <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso Not ucrNudTROverDays.GetText = "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.Text <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.Text = ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((chkDrySpell.Checked AndAlso nudDSMaximumDays.Text <> "" AndAlso ucrNudDSLengthOfTime.Text <> "") OrElse Not chkDrySpell.Checked) AndAlso ((chkDryPeriod.Checked AndAlso nudDPMaxRain.Text <> "" AndAlso nudDPRainPeriod.Text <> "" AndAlso nudDPOverallInterval.Text <> "") OrElse Not chkDryPeriod.Checked) Then + ' ' ucrBase.OKEnabled(True) + ' 'Else + ' ' ucrBase.OKEnabled(False) + ' 'End If + 'End Sub ' ucrNudDPRainPeriod, ucrNudDPMaxRain, ucrNudDPOverallInterval + + 'Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset + ' SetDefaults() + ' SetRCodeForControls(True) + ' TestOKEnabled() + 'End Sub - Private Sub DrySpell_Spe(sender As Object, e As EventArgs) - CheckBoxesSetting() - DrySpellOld() - nudValues() - CombinedFilter() - TestOKEnabled() - End Sub + 'Private Sub grpRainParameters_Enter(sender As Object, e As EventArgs) + ' RainyDaysMethod() + ' nudValues() + ' CombinedFilter() + ' TestOKEnabled() + 'End Sub + 'Private Sub DryPeriod(sender As Object, e As EventArgs) + ' CheckBoxesSetting() + ' DryPeriodOld() + ' nudValues() + ' TestOKEnabled() + 'End Sub - 'Private Sub grpConditionsForStartofRains_Enter(sender As Object, e As EventArgs) Handles nudTRAmount.TextChanged, nudTRPercentile.TextChanged, nudRDMinimum.TextChanged, nudDSMaximumDays.TextChanged, nudDSLengthofTime.TextChanged, nudTROverDays.TextChanged, nudRDOutOfDays.TextChanged - ' RainyDaysMethod() - ' DayFromAndToMethod() + 'Private Sub TotalRainfall(sender As Object, e As EventArgs) Handles rdoTRAmount.CheckedChanged, rdoTRPercentile.CheckedChanged + ' CheckBoxesSetting() ' CombinedFilter() - ' RollingOfRainDays() - ' DrySpellOld() ' RollingSumMethod() ' TotalRainPercentileWetSpell() - ' nudValues() + ' nudValues() ' new + ' 'DefaultNudValue() ' TestOKEnabled() 'End Sub - 'Private Sub grpConditionsForStartofRains1_Enter(sender As Object, e As EventArgs) Handles chkConsecutiveRainyDays.CheckedChanged, chkTotalRainfall.CheckedChanged, chkDrySpell.CheckedChanged, chkDryPeriod.CheckedChanged - ' CheckBoxesSetting() - ' DrySpell() - ' RainyDaysMethod() + 'Private Sub TotalRainfallNuds(sender As Object, e As EventArgs) ' CombinedFilter() - ' FirstDOYPerYear() ' TestOKEnabled() + 'End Sub + + 'Private Sub RainyDays(sender As Object, e As EventArgs) + ' CheckBoxesSetting() + ' RollingOfRainDays() ' nudValues() + ' CombinedFilter() + ' TestOKEnabled() 'End Sub - ' yep - Private Sub ucrReceiverRainfall_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverRainfall.SelectionChanged - RainyDaysMethod() - RollingSumMethod() - DryPeriodOld() - TestOKEnabled() - End Sub + 'Private Sub DrySpell_Spe(sender As Object, e As EventArgs) + ' CheckBoxesSetting() + ' DrySpellOld() + ' nudValues() + ' CombinedFilter() + ' TestOKEnabled() + 'End Sub - Private Sub CheckBoxesSetting() - 'If chkTotalRainfall.Checked Then - ' pnlTotalRainfall.Visible = True - ' nudTRAmount.Visible = False - ' ' nudTRPercentile.Visible = False - ' If rdoTRAmount.Checked Then - ' nudTRAmount.Visible = True - ' nudTRPercentile.Visible = False - ' ElseIf rdoTRPercentile.Checked Then - ' nudTRAmount.Visible = False - ' nudTRPercentile.Visible = True - ' Else - ' nudTRAmount.Visible = False - ' nudTRPercentile.Visible = False - ' End If - 'Else - ' pnlTotalRainfall.Visible = False - 'End If - 'If chkDrySpell.Checked Then - ' pnlDrySpell.Visible = True - 'Else - ' pnlDrySpell.Visible = False - 'End If - 'If chkConsecutiveRainyDays.Checked Then - ' pnlConsecutiveRainyDays.Visible = True - 'Else - ' pnlConsecutiveRainyDays.Visible = False - 'End If - 'If chkDryPeriod.Checked Then - ' pnlDryPeriod.Visible = True - 'Else - ' pnlDryPeriod.Visible = False - 'End If - End Sub - ' nud max and mins. - Private Sub nudValues() - ' nudFrom.Maximum = nudTo.Value - 1 - ' nudTo.Minimum = nudFrom.Value + 1 - 'If chkConsecutiveRainyDays.Checked Then - ' nudRDMinimum.Maximum = nudRDOutOfDays.Value - 1 - ' nudRDOutOfDays.Minimum = nudRDMinimum.Value + 1 - 'End If - 'If chkDrySpell.Checked Then - ' nudDSMaximumDays.Maximum = nudDSLengthofTime.Value - 1 - ' nudDSLengthofTime.Minimum = nudDSMaximumDays.Value + 1 - 'End If - 'If chkDryPeriod.Checked Then - ' nudDPRainPeriod.Maximum = nudDPOverallInterval.Value - 1 - ' nudDPOverallInterval.Minimum = nudDPRainPeriod.Value + 1 - 'End If - End Sub + ''Private Sub grpConditionsForStartofRains_Enter(sender As Object, e As EventArgs) Handles nudTRAmount.TextChanged, nudTRPercentile.TextChanged, nudRDMinimum.TextChanged, nudDSMaximumDays.TextChanged, nudDSLengthofTime.TextChanged, nudTROverDays.TextChanged, nudRDOutOfDays.TextChanged + '' RainyDaysMethod() + '' DayFromAndToMethod() + '' CombinedFilter() + '' RollingOfRainDays() + '' DrySpellOld() + '' RollingSumMethod() + '' TotalRainPercentileWetSpell() + '' nudValues() + '' TestOKEnabled() + ''End Sub + + ''Private Sub grpConditionsForStartofRains1_Enter(sender As Object, e As EventArgs) Handles chkConsecutiveRainyDays.CheckedChanged, chkTotalRainfall.CheckedChanged, chkDrySpell.CheckedChanged, chkDryPeriod.CheckedChanged + '' CheckBoxesSetting() + '' DrySpell() + '' RainyDaysMethod() + '' CombinedFilter() + '' FirstDOYPerYear() + '' TestOKEnabled() + '' nudValues() + ''End Sub + + '' yep + 'Private Sub ucrReceiverRainfall_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverRainfall.SelectionChanged + ' RainyDaysMethod() + ' RollingSumMethod() + ' DryPeriodOld() + ' TestOKEnabled() + 'End Sub - Private Sub RainyDaysMethod() - If ((Not ucrReceiverRainfall.IsEmpty) AndAlso (ucrNudThreshold.Text <> "")) Then - 'clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - 'clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudThreshold.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) - 'clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34)) - 'clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")") - 'clsRainyDays.AddParameter("save", 0) - ' clsSubRainDays.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - End If - End Sub + 'Private Sub CheckBoxesSetting() + ' 'If chkTotalRainfall.Checked Then + ' ' pnlTotalRainfall.Visible = True + ' ' nudTRAmount.Visible = False + ' ' ' nudTRPercentile.Visible = False + ' ' If rdoTRAmount.Checked Then + ' ' nudTRAmount.Visible = True + ' ' nudTRPercentile.Visible = False + ' ' ElseIf rdoTRPercentile.Checked Then + ' ' nudTRAmount.Visible = False + ' ' nudTRPercentile.Visible = True + ' ' Else + ' ' nudTRAmount.Visible = False + ' ' nudTRPercentile.Visible = False + ' ' End If + ' 'Else + ' ' pnlTotalRainfall.Visible = False + ' 'End If + ' 'If chkDrySpell.Checked Then + ' ' pnlDrySpell.Visible = True + ' 'Else + ' ' pnlDrySpell.Visible = False + ' 'End If + ' 'If chkConsecutiveRainyDays.Checked Then + ' ' pnlConsecutiveRainyDays.Visible = True + ' 'Else + ' ' pnlConsecutiveRainyDays.Visible = False + ' 'End If + ' 'If chkDryPeriod.Checked Then + ' ' pnlDryPeriod.Visible = True + ' 'Else + ' ' pnlDryPeriod.Visible = False + ' 'End If + 'End Sub - Private Sub RollingSumMethod() - 'If chkTotalRainfall.Checked AndAlso Not ucrReceiverRainfall.IsEmpty Then - ' clsTRRollingSum.AddParameter("function_exp", Chr(34) & " zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudTROverDays.Value & ", FUN = sum, na.rm = FALSE, align='right', fill=NA)" & Chr(34)) - ' clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' clsTRRollingSum.AddParameter("result_name", Chr(34) & "roll_sum_Rain" & Chr(34)) - ' clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") - ' clsTRRollingSum.AddParameter("save", 0) - 'Else - ' clsTRRollingSum.RemoveParameterByName("function_exp") - ' clsTRRollingSum.RemoveParameterByName("type") - ' clsTRRollingSum.RemoveParameterByName("result_name") - ' clsTRRollingSum.RemoveParameterByName("calculated_from") - ' clsTRRollingSum.RemoveParameterByName("save") - 'End If - End Sub + '' nud max and mins. + 'Private Sub nudValues() + ' ' nudFrom.Maximum = nudTo.Value - 1 + ' ' nudTo.Minimum = nudFrom.Value + 1 + ' 'If chkConsecutiveRainyDays.Checked Then + ' ' nudRDMinimum.Maximum = nudRDOutOfDays.Value - 1 + ' ' nudRDOutOfDays.Minimum = nudRDMinimum.Value + 1 + ' 'End If + ' 'If chkDrySpell.Checked Then + ' ' nudDSMaximumDays.Maximum = nudDSLengthofTime.Value - 1 + ' ' nudDSLengthofTime.Minimum = nudDSMaximumDays.Value + 1 + ' 'End If + ' 'If chkDryPeriod.Checked Then + ' ' nudDPRainPeriod.Maximum = nudDPOverallInterval.Value - 1 + ' ' nudDPOverallInterval.Minimum = nudDPRainPeriod.Value + 1 + ' 'End If + 'End Sub - ' If we have 'Percentile' checked - Private Sub TotalRainPercentileWetSpell() - 'If rdoTRPercentile.Checked Then - ' clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' clsTRWetSpell.AddParameter("function_exp", Chr(34) & "quantile(roll_sum_Rain, c(" & nudTRPercentile.Value & "), na.rm=T)" & Chr(34)) - ' clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34)) - ' clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList) - ' clsTRWetSpellList.AddParameter("sub1", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) - ' clsTRWetSpell.AddParameter("save", "0") - 'Else - ' clsTRWetSpell.RemoveParameterByName("type") - ' clsTRWetSpell.RemoveParameterByName("function_exp") - ' clsTRWetSpell.RemoveParameterByName("result_name") - ' clsTRWetSpell.RemoveParameterByName("sub_calculations") - ' clsTRWetSpellList.RemoveParameterByName("sub1") - ' clsTRWetSpell.RemoveParameterByName("save") - 'End If - End Sub + 'Private Sub RainyDaysMethod() + ' If ((Not ucrReceiverRainfall.IsEmpty) AndAlso (ucrNudThreshold.Text <> "")) Then + ' 'clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' 'clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudThreshold.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) + ' 'clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34)) + ' 'clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")") + ' 'clsRainyDays.AddParameter("save", 0) + ' ' clsSubRainDays.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) + ' End If + 'End Sub - Private Sub RollingOfRainDays() - ' ' If rolling of rain days one is checked Then - 'clsRDRollingRainDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - 'clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data=rain_day, width = " & nudRDOutOfDays.Value & ", FUN = sum, na.rm = FALSE, align = 'right', fill=NA)" & Chr(34)) - 'clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34)) - 'clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) - 'clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - 'clsRDRollingRainDays.AddParameter("save", 0) - End Sub + 'Private Sub RollingSumMethod() + ' 'If chkTotalRainfall.Checked AndAlso Not ucrReceiverRainfall.IsEmpty Then + ' ' clsTRRollingSum.AddParameter("function_exp", Chr(34) & " zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudTROverDays.Value & ", FUN = sum, na.rm = FALSE, align='right', fill=NA)" & Chr(34)) + ' ' clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' ' clsTRRollingSum.AddParameter("result_name", Chr(34) & "roll_sum_Rain" & Chr(34)) + ' ' clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") + ' ' clsTRRollingSum.AddParameter("save", 0) + ' 'Else + ' ' clsTRRollingSum.RemoveParameterByName("function_exp") + ' ' clsTRRollingSum.RemoveParameterByName("type") + ' ' clsTRRollingSum.RemoveParameterByName("result_name") + ' ' clsTRRollingSum.RemoveParameterByName("calculated_from") + ' ' clsTRRollingSum.RemoveParameterByName("save") + ' 'End If + 'End Sub - Private Sub DrySpellOld() - 'If chkDrySpell.Checked Then - ' clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34)) - ' clsDSDrySpell.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) - ' clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub) - ' clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - ' clsDSDrySpell.AddParameter("save", 0) - ' clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Dry_Spell, width=" & ucrNudDSLengthOfTime.Value & ", FUN=max, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - ' clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) - ' clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList) - ' clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) - ' clsDSDryPeriodTen.AddParameter("save", 2) - 'Else - ' clsDSDrySpell.RemoveParameterByName("type") - ' clsDSDrySpell.RemoveParameterByName("function_exp") - ' clsDSDrySpell.RemoveParameterByName("result_name") - ' clsDSDrySpell.RemoveParameterByName("sub_calculations") - ' clsDSDrySpellSub.RemoveParameterByName("sub1") - ' clsDSDrySpell.RemoveParameterByName("save") - ' clsDSDryPeriodTen.RemoveParameterByName("type") - ' clsDSDryPeriodTen.RemoveParameterByName("function_exp") - ' clsDSDryPeriodTen.RemoveParameterByName("sub_calculations") - ' clsDSDryPeriodTen.RemoveParameterByName("result_name") - ' clsDSDryPeriodTen.RemoveParameterByName("save") - ' clsDSDryPeriodTenList.RemoveParameterByName("sub1") - 'End If - End Sub + '' If we have 'Percentile' checked + 'Private Sub TotalRainPercentileWetSpell() + ' 'If rdoTRPercentile.Checked Then + ' ' clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' ' clsTRWetSpell.AddParameter("function_exp", Chr(34) & "quantile(roll_sum_Rain, c(" & nudTRPercentile.Value & "), na.rm=T)" & Chr(34)) + ' ' clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34)) + ' ' clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList) + ' ' clsTRWetSpellList.AddParameter("sub1", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) + ' ' clsTRWetSpell.AddParameter("save", "0") + ' 'Else + ' ' clsTRWetSpell.RemoveParameterByName("type") + ' ' clsTRWetSpell.RemoveParameterByName("function_exp") + ' ' clsTRWetSpell.RemoveParameterByName("result_name") + ' ' clsTRWetSpell.RemoveParameterByName("sub_calculations") + ' ' clsTRWetSpellList.RemoveParameterByName("sub1") + ' ' clsTRWetSpell.RemoveParameterByName("save") + ' 'End If + 'End Sub - Private Sub DryPeriodOld() - If ucrChkDryPeriod.Checked Then - ' clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' clsDPRainInDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - ' clsDPRainInDays.AddParameter("result_name", Chr(34) & "Rain_in_Days" & Chr(34)) - ' clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") - ' clsDPRainInDays.AddParameter("save", "0") - - ' clsDPRain.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' clsDPRain.AddParameter("function_exp", Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) - ' clsDPRain.AddParameter("result_name", Chr(34) & "Above_Threshold" & Chr(34)) - ' clsDPRain.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPRainList) - ' clsDPRainList.AddParameter("sub1", clsRFunctionParameter:=clsDPRainInDays, bIncludeArgumentName:=False) - ' clsDPRain.AddParameter("save", 0) - - ' clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' clsDPOverallInterval.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Above_Threshold ,width = (" & nudDPOverallInterval.Value & "-" & nudDPRainPeriod.Value & "+ 1), FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - ' clsDPOverallInterval.AddParameter("result_name", Chr(34) & "DP_Overall_Interval_Rain" & Chr(34)) - ' clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList) - ' clsDPOverallIntervalList.AddParameter("sub1", clsRFunctionParameter:=clsDPRain, bIncludeArgumentName:=False) - ' clsDPOverallInterval.AddParameter("save", "2") - 'Else - ' clsDPRainInDays.RemoveParameterByName("type") - ' clsDPRainInDays.RemoveParameterByName("function_exp") - ' clsDPRainInDays.RemoveParameterByName("result_name") - ' clsDPRainInDays.RemoveParameterByName("calculated_from") - ' clsDPRainInDays.RemoveParameterByName("save") - ' clsDPRain.RemoveParameterByName("type") - ' clsDPRain.RemoveParameterByName("function_exp") - ' clsDPRain.RemoveParameterByName("result_name") - ' clsDPRain.RemoveParameterByName("sub_calculations") - ' clsDPRainList.RemoveParameterByName("sub1") - ' clsDPRain.RemoveParameterByName("save") - ' clsDPOverallInterval.RemoveParameterByName("type") - ' clsDPOverallInterval.RemoveParameterByName("function_exp") - ' clsDPOverallInterval.RemoveParameterByName("result_name") - ' clsDPOverallInterval.RemoveParameterByName("sub_calculations") - ' clsDPOverallInterval.RemoveParameterByName("sub1") - ' clsDPOverallInterval.RemoveParameterByName("save") - End If - End Sub + 'Private Sub RollingOfRainDays() + ' ' ' If rolling of rain days one is checked Then + ' 'clsRDRollingRainDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' 'clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data=rain_day, width = " & nudRDOutOfDays.Value & ", FUN = sum, na.rm = FALSE, align = 'right', fill=NA)" & Chr(34)) + ' 'clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34)) + ' 'clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) + ' 'clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) + ' 'clsRDRollingRainDays.AddParameter("save", 0) + 'End Sub - Private Sub FirstDOYPerYear() - '' run these when things are checked - 'If Not ucrReceiverDOY.IsEmpty Then - - ' clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) - ' clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - - ' clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) - ' clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & "[" & 1 & "]" & Chr(34)) - ' clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - ' clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear) - ' clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34)) - ' clsFirstDOYPerYear.AddParameter("save", 2) - - 'Else - ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub1") - ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub2") - ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub3") - ' clsFirstDOYPerYear.RemoveParameterByName("type") - ' clsFirstDOYPerYear.RemoveParameterByName("function_exp") - ' clsFirstDOYPerYear.RemoveParameterByName("calculated_from") - ' clsFirstDOYPerYear.RemoveParameterByName("manipulations") - 'End If - End Sub + 'Private Sub DrySpellOld() + ' 'If chkDrySpell.Checked Then + ' ' clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' ' clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34)) + ' ' clsDSDrySpell.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) + ' ' clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub) + ' ' clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) + ' ' clsDSDrySpell.AddParameter("save", 0) + ' ' clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' ' clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Dry_Spell, width=" & ucrNudDSLengthOfTime.Value & ", FUN=max, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) + ' ' clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) + ' ' clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList) + ' ' clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) + ' ' clsDSDryPeriodTen.AddParameter("save", 2) + ' 'Else + ' ' clsDSDrySpell.RemoveParameterByName("type") + ' ' clsDSDrySpell.RemoveParameterByName("function_exp") + ' ' clsDSDrySpell.RemoveParameterByName("result_name") + ' ' clsDSDrySpell.RemoveParameterByName("sub_calculations") + ' ' clsDSDrySpellSub.RemoveParameterByName("sub1") + ' ' clsDSDrySpell.RemoveParameterByName("save") + ' ' clsDSDryPeriodTen.RemoveParameterByName("type") + ' ' clsDSDryPeriodTen.RemoveParameterByName("function_exp") + ' ' clsDSDryPeriodTen.RemoveParameterByName("sub_calculations") + ' ' clsDSDryPeriodTen.RemoveParameterByName("result_name") + ' ' clsDSDryPeriodTen.RemoveParameterByName("save") + ' ' clsDSDryPeriodTenList.RemoveParameterByName("sub1") + ' 'End If + 'End Sub - Private Sub firstDayofTheYear() - 'clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) - 'clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + 'Private Sub DryPeriodOld() + ' If ucrChkDryPeriod.Checked Then + ' ' clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' ' clsDPRainInDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) + ' ' clsDPRainInDays.AddParameter("result_name", Chr(34) & "Rain_in_Days" & Chr(34)) + ' ' clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") + ' ' clsDPRainInDays.AddParameter("save", "0") + + ' ' clsDPRain.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' ' clsDPRain.AddParameter("function_exp", Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) + ' ' clsDPRain.AddParameter("result_name", Chr(34) & "Above_Threshold" & Chr(34)) + ' ' clsDPRain.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPRainList) + ' ' clsDPRainList.AddParameter("sub1", clsRFunctionParameter:=clsDPRainInDays, bIncludeArgumentName:=False) + ' ' clsDPRain.AddParameter("save", 0) + + ' ' clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34)) + ' ' clsDPOverallInterval.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Above_Threshold ,width = (" & nudDPOverallInterval.Value & "-" & nudDPRainPeriod.Value & "+ 1), FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) + ' ' clsDPOverallInterval.AddParameter("result_name", Chr(34) & "DP_Overall_Interval_Rain" & Chr(34)) + ' ' clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList) + ' ' clsDPOverallIntervalList.AddParameter("sub1", clsRFunctionParameter:=clsDPRain, bIncludeArgumentName:=False) + ' ' clsDPOverallInterval.AddParameter("save", "2") + ' 'Else + ' ' clsDPRainInDays.RemoveParameterByName("type") + ' ' clsDPRainInDays.RemoveParameterByName("function_exp") + ' ' clsDPRainInDays.RemoveParameterByName("result_name") + ' ' clsDPRainInDays.RemoveParameterByName("calculated_from") + ' ' clsDPRainInDays.RemoveParameterByName("save") + ' ' clsDPRain.RemoveParameterByName("type") + ' ' clsDPRain.RemoveParameterByName("function_exp") + ' ' clsDPRain.RemoveParameterByName("result_name") + ' ' clsDPRain.RemoveParameterByName("sub_calculations") + ' ' clsDPRainList.RemoveParameterByName("sub1") + ' ' clsDPRain.RemoveParameterByName("save") + ' ' clsDPOverallInterval.RemoveParameterByName("type") + ' ' clsDPOverallInterval.RemoveParameterByName("function_exp") + ' ' clsDPOverallInterval.RemoveParameterByName("result_name") + ' ' clsDPOverallInterval.RemoveParameterByName("sub_calculations") + ' ' clsDPOverallInterval.RemoveParameterByName("sub1") + ' ' clsDPOverallInterval.RemoveParameterByName("save") + ' End If + 'End Sub - 'clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) - 'clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & "[" & 1 & "]" & Chr(34)) - 'clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - 'clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear) - 'clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34)) - 'clsFirstDOYPerYear.AddParameter("save", 2) + 'Private Sub FirstDOYPerYear() + ' '' run these when things are checked + ' 'If Not ucrReceiverDOY.IsEmpty Then + + ' ' clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) + ' ' clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + + ' ' clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) + ' ' clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & "[" & 1 & "]" & Chr(34)) + ' ' clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + ' ' clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear) + ' ' clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34)) + ' ' clsFirstDOYPerYear.AddParameter("save", 2) + + ' 'Else + ' ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub1") + ' ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub2") + ' ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub3") + ' ' clsFirstDOYPerYear.RemoveParameterByName("type") + ' ' clsFirstDOYPerYear.RemoveParameterByName("function_exp") + ' ' clsFirstDOYPerYear.RemoveParameterByName("calculated_from") + ' ' clsFirstDOYPerYear.RemoveParameterByName("manipulations") + ' 'End If + 'End Sub - 'ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) - End Sub + 'Private Sub firstDayofTheYear() + ' 'clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) + ' 'clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - Private Sub ucrSaveStartofRains_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlContentsChanged - TestOKEnabled() - End Sub + ' 'clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) + ' 'clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & "[" & 1 & "]" & Chr(34)) + ' 'clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + ' 'clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear) + ' 'clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34)) + ' 'clsFirstDOYPerYear.AddParameter("save", 2) - 'Private Sub ucrSaveStartofRains_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlValueChanged - ' FirstDOYPerYear() + ' 'ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) 'End Sub - 'Private Sub DefaultNudValue() - ' nudRDOutOfDays.Value = nudTROverDays.Value ' crashes if I go to 100+, can crash upon a reset, also what if I change the nudOverDays then the nudOutofDays - then I lose my nudOverDays value I put in - 'End Sub + ''Private Sub ucrSaveStartofRains_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlContentsChanged + '' TestOKEnabled() + ''End Sub + + '''Private Sub ucrSaveStartofRains_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlValueChanged + ''' FirstDOYPerYear() + '''End Sub + + '''Private Sub DefaultNudValue() + ''' nudRDOutOfDays.Value = nudTROverDays.Value ' crashes if I go to 100+, can crash upon a reset, also what if I change the nudOverDays then the nudOutofDays - then I lose my nudOverDays value I put in + '''End Sub End Class \ No newline at end of file From 2fadac86b3d046a417960ec5d9ebe7be587396c4 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Tue, 20 Jun 2017 11:28:25 +0300 Subject: [PATCH 103/201] Adding Maxcolumns to be viewed in dataview window --- instat/clsGridLink.vb | 18 +++++++++++++++++- instat/clsInstatOptions.vb | 16 ++++++++++++++++ instat/dlgOptions.vb | 8 ++++++-- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/instat/clsGridLink.vb b/instat/clsGridLink.vb index 51f83c1e5e1..d3291c09e8d 100644 --- a/instat/clsGridLink.vb +++ b/instat/clsGridLink.vb @@ -28,6 +28,7 @@ Public Class clsGridLink Public bGrdMetadataChanged As Boolean Public bGrdVariablesMetadataChanged As Boolean Public iMaxRows As Integer + Public iMaxCols As Integer Private strMetadata As String Public fntText As Font = New Font("Microsoft Sans Serif", 10, FontStyle.Regular) Public clrText As Color = Color.Black @@ -43,6 +44,7 @@ Public Class clsGridLink bGrdMetadataChanged = False bGrdVariablesMetadataChanged = False iMaxRows = 1000 + iMaxCols = 30 End Sub Public Sub UpdateGrids() @@ -277,7 +279,8 @@ Public Class clsGridLink If iNewPosition <> -1 AndAlso iNewPosition <> iCurrPosition AndAlso iNewPosition < grdCurr.Worksheets.Count Then grdCurr.MoveWorksheet(fillWorkSheet, iNewPosition) End If - fillWorkSheet.Columns = dfTemp.ColumnCount + 'replaced this to fill columns with the iMaxCols + fillWorkSheet.Columns = Math.Min(iMaxCols, dfTemp.ColumnCount) strColumnNames = dfTemp.ColumnNames If dfTemp.RowCount = 0 Then fillWorkSheet.Rows = 1 @@ -455,6 +458,19 @@ Public Class clsGridLink UpdateGrids() End Sub + Public Sub SetMaxCols(iCols As Integer) + iMaxCols = iCols + bGrdDataChanged = True + bGrdMetadataChanged = True + bGrdVariablesMetadataChanged = True + 'TODO This causes the last sheet to be current sheet after running this. + ' Need to change how this is done so that the current sheet is remembered before changing. + If frmMain.clsRLink.bInstatObjectExists Then + frmMain.clsRLink.RunInternalScript(frmMain.clsRLink.strInstatDataObject & "$data_objects_changed <- TRUE") + End If + UpdateGrids() + End Sub + Public Sub SetFormatDataView(fntNew As Font, clrNew As Color) fntText = fntNew clrText = clrNew diff --git a/instat/clsInstatOptions.vb b/instat/clsInstatOptions.vb index 1212f121624..49458d1cb54 100644 --- a/instat/clsInstatOptions.vb +++ b/instat/clsInstatOptions.vb @@ -14,6 +14,7 @@ Imports RDotNet ' Needed so we can check if variable has been specified, not just has default value Public iPreviewRows As Nullable(Of Integer) Public iMaxRows As Nullable(Of Integer) + Public iMaxCols As Nullable(Of Integer) Public lstColourPalette As List(Of Color) Public strGraphDisplayOption As String Public bCommandsinOutput As Nullable(Of Boolean) @@ -36,6 +37,7 @@ Imports RDotNet Private DEFAULTclrEditor As Color = Color.Black Private DEFAULTiPreviewRows As Integer = 10 Private DEFAULTiMaxRows As Integer = 1000 + Private DEFAULTiMaxCols As Integer = 30 Private DEFAULTstrComment As String = "code generated by the dialog" Private DEFAULTstrGraphDisplayOption As String = "view_output_window" Private DEFAULTbChangeDataFrame As Boolean = False @@ -61,6 +63,7 @@ Imports RDotNet clrEditor = DEFAULTclrEditor iPreviewRows = DEFAULTiPreviewRows iMaxRows = DEFAULTiMaxRows + iMaxCols = DEFAULTiMaxCols strComment = DEFAULTstrComment strGraphDisplayOption = DEFAULTstrGraphDisplayOption 'TODO is this sensible? @@ -111,6 +114,12 @@ Imports RDotNet SetMaxRows(DEFAULTiMaxRows) End If + If iMaxRows.HasValue Then + SetMaxCols(iMaxCols) + Else + SetMaxCols(DEFAULTiMaxCols) + End If + If bCommandsinOutput.HasValue Then SetCommandInOutpt(bCommandsinOutput) Else @@ -165,6 +174,13 @@ Imports RDotNet iMaxRows = iRows frmMain.clsGrids.SetMaxRows(iMaxRows) End If + End Sub + + Public Sub SetMaxCols(iCols As Integer) + If iCols <> iMaxCols Then + iMaxCols = iCols + frmMain.clsGrids.SetMaxCols(iMaxCols) + End If End Sub Public Sub SetFormatOutput(fntNew As Font, clrNew As Color) diff --git a/instat/dlgOptions.vb b/instat/dlgOptions.vb index c9c63f6bfbd..a4ad9e61c1b 100644 --- a/instat/dlgOptions.vb +++ b/instat/dlgOptions.vb @@ -46,7 +46,9 @@ Public Class dlgOptions 'ucrBase.iHelpTopicID = 336 Dim strPreviewText As String ucrNudMaxRows.Maximum = Integer.MaxValue + ucrNudMaxCols.Maximum = Integer.MaxValue ucrNudMaxRows.Increment = 10 + ucrNudMaxCols.Increment = 5 strPreviewText = "R-Instat 2016" rtbCommandPreview.Text = strPreviewText rtbCommentPreview.Text = strPreviewText @@ -77,6 +79,7 @@ Public Class dlgOptions SetCommentFont(frmMain.clsInstatOptions.fntComment, frmMain.clsInstatOptions.clrComment) SetEditorFont(frmMain.clsInstatOptions.fntEditor, frmMain.clsInstatOptions.clrEditor) ucrNudMaxRows.Value = frmMain.clsInstatOptions.iMaxRows + ucrNudMaxCols.Value = frmMain.clsInstatOptions.iMaxCols ucrNudPreviewRows.Value = frmMain.clsInstatOptions.iPreviewRows ucrInputComment.SetName(frmMain.clsInstatOptions.strComment) ucrWorkingDirectory.SetName(frmMain.clsInstatOptions.strWorkingDirectory) @@ -116,7 +119,8 @@ Public Class dlgOptions frmMain.clsInstatOptions.SetFormatEditor(fntEditor, clrEditor) frmMain.clsInstatOptions.SetComment(ucrInputComment.GetText) frmMain.clsInstatOptions.SetPreviewRows(ucrNudPreviewRows.Value) - frmMain.clsInstatOptions.SetMaxRows(ucrNudMaxRows.Value) + frmMain.clsInstatOptions.SetMaxRows(ucrNudMaxRows.Value) + frmMain.clsInstatOptions.SetMaxCols(ucrNudMaxCols.Value) frmMain.clsInstatOptions.SetLanguageCultureCode(strCurrLanguageCulture) frmMain.clsInstatOptions.SetWorkingDirectory(strWorkingDirectory) frmMain.clsInstatOptions.SetGraphDisplayOption(strGraphDisplayOption) @@ -284,7 +288,7 @@ Public Class dlgOptions End Sub - Private Sub ucrNudPreviewRows_ValueChanged() Handles ucrNudPreviewRows.ControlValueChanged, ucrInputComment.ControlContentsChanged, ucrChkIncludeCommentsbyDefault.ControlValueChanged, ucrNudMaxRows.ControlValueChanged, ucrChkIncludeDefaultParams.ControlValueChanged, ucrChkShowRCommandsinOutputWindow.ControlValueChanged, ucrNudDigits.ControlValueChanged, ucrChkShowSignifStars.ControlValueChanged + Private Sub ucrNudPreviewRows_ValueChanged() Handles ucrNudMaxCols.ControlValueChanged, ucrNudPreviewRows.ControlValueChanged, ucrInputComment.ControlContentsChanged, ucrChkIncludeCommentsbyDefault.ControlValueChanged, ucrNudMaxRows.ControlValueChanged, ucrChkIncludeDefaultParams.ControlValueChanged, ucrChkShowRCommandsinOutputWindow.ControlValueChanged, ucrNudDigits.ControlValueChanged, ucrChkShowSignifStars.ControlValueChanged ApplyEnabled(True) End Sub From 1e09309182ed7a8960cdf1471835a82bf7de9844 Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 20 Jun 2017 11:29:22 +0300 Subject: [PATCH 104/201] Tidying code --- instat/dlgImportDataset.Designer.vb | 210 +++++++------ instat/dlgImportDataset.vb | 441 +++++++--------------------- 2 files changed, 207 insertions(+), 444 deletions(-) diff --git a/instat/dlgImportDataset.Designer.vb b/instat/dlgImportDataset.Designer.vb index 066df380e3e..1127f37fedf 100644 --- a/instat/dlgImportDataset.Designer.vb +++ b/instat/dlgImportDataset.Designer.vb @@ -30,7 +30,6 @@ Partial Class dlgImportDataset Me.lblRowNames = New System.Windows.Forms.Label() Me.lblSeparator = New System.Windows.Forms.Label() Me.lblDecimal = New System.Windows.Forms.Label() - Me.lblNAStrings = New System.Windows.Forms.Label() Me.txtPreview = New System.Windows.Forms.TextBox() Me.grdDataPreview = New unvell.ReoGrid.ReoGridControl() Me.lblFileOpenPath = New System.Windows.Forms.Label() @@ -48,17 +47,9 @@ Partial Class dlgImportDataset Me.ucrInputSeparator = New instat.ucrInputComboBox() Me.ucrInputEncoding = New instat.ucrInputComboBox() Me.grpExcel = New System.Windows.Forms.GroupBox() - Me.grpRDS = New System.Windows.Forms.GroupBox() - Me.ucrChkOverWrite = New instat.ucrCheck() - Me.ucrChkImportObjects = New instat.ucrCheck() - Me.ucrChkImportCalculations = New instat.ucrCheck() - Me.ucrChkImportChangesLog = New instat.ucrCheck() - Me.ucrChkImportFilters = New instat.ucrCheck() - Me.ucrChkImportMetadata = New instat.ucrCheck() - Me.ucrChkExistingData = New instat.ucrCheck() + Me.ucrChkMaximumDataSize = New instat.ucrCheck() Me.ucrchkColumnNames = New instat.ucrCheck() Me.ucrNudxlRowsToSkip = New instat.ucrNud() - Me.Label1 = New System.Windows.Forms.Label() Me.ucrInputMaximumDataSize = New instat.ucrInputTextBox() Me.lblMissingValueString = New System.Windows.Forms.Label() Me.ucrInputXlMissingValueString = New instat.ucrInputTextBox() @@ -67,11 +58,20 @@ Partial Class dlgImportDataset Me.ucrInputSheets = New instat.ucrInputComboBox() Me.lblRowToSkip = New System.Windows.Forms.Label() Me.lblSheets = New System.Windows.Forms.Label() + Me.grpRDS = New System.Windows.Forms.GroupBox() + Me.ucrChkOverWrite = New instat.ucrCheck() + Me.ucrChkImportObjects = New instat.ucrCheck() + Me.ucrChkImportCalculations = New instat.ucrCheck() + Me.ucrChkImportChangesLog = New instat.ucrCheck() + Me.ucrChkImportFilters = New instat.ucrCheck() + Me.ucrChkImportMetadata = New instat.ucrCheck() + Me.ucrChkExistingData = New instat.ucrCheck() Me.lblCannotImport = New System.Windows.Forms.Label() Me.lblNoPreview = New System.Windows.Forms.Label() Me.ucrInputFilePath = New instat.ucrInputTextBox() Me.ucrInputName = New instat.ucrInputTextBox() Me.ucrBase = New instat.ucrButtons() + Me.ucrChkMissingValueStrings = New instat.ucrCheck() Me.grpCSV.SuspendLayout() Me.grpExcel.SuspendLayout() Me.grpRDS.SuspendLayout() @@ -157,15 +157,6 @@ Partial Class dlgImportDataset Me.lblDecimal.Tag = "Decimal" Me.lblDecimal.Text = "Decimal" ' - 'lblNAStrings - ' - Me.lblNAStrings.AutoSize = True - Me.lblNAStrings.Location = New System.Drawing.Point(6, 231) - Me.lblNAStrings.Name = "lblNAStrings" - Me.lblNAStrings.Size = New System.Drawing.Size(102, 13) - Me.lblNAStrings.TabIndex = 10 - Me.lblNAStrings.Text = "Missing Value String" - ' 'txtPreview ' Me.txtPreview.Location = New System.Drawing.Point(241, 25) @@ -225,6 +216,7 @@ Partial Class dlgImportDataset ' Me.grpCSV.AutoSize = True Me.grpCSV.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.grpCSV.Controls.Add(Me.ucrChkMissingValueStrings) Me.grpCSV.Controls.Add(Me.ucrChkStringsAsFactors) Me.grpCSV.Controls.Add(Me.ucrNudSkip) Me.grpCSV.Controls.Add(Me.rdoRowNamesNo) @@ -241,8 +233,7 @@ Partial Class dlgImportDataset Me.grpCSV.Controls.Add(Me.lblSeparator) Me.grpCSV.Controls.Add(Me.lblLinesToSkip) Me.grpCSV.Controls.Add(Me.lblDecimal) - Me.grpCSV.Controls.Add(Me.lblNAStrings) - Me.grpCSV.Location = New System.Drawing.Point(9, 88) + Me.grpCSV.Location = New System.Drawing.Point(449, 115) Me.grpCSV.Name = "grpCSV" Me.grpCSV.Size = New System.Drawing.Size(219, 346) Me.grpCSV.TabIndex = 34 @@ -315,7 +306,7 @@ Partial Class dlgImportDataset Me.ucrInputNAStrings.AddQuotesIfUnrecognised = True Me.ucrInputNAStrings.IsMultiline = False Me.ucrInputNAStrings.IsReadOnly = False - Me.ucrInputNAStrings.Location = New System.Drawing.Point(5, 247) + Me.ucrInputNAStrings.Location = New System.Drawing.Point(6, 248) Me.ucrInputNAStrings.Name = "ucrInputNAStrings" Me.ucrInputNAStrings.Size = New System.Drawing.Size(137, 21) Me.ucrInputNAStrings.TabIndex = 39 @@ -349,9 +340,9 @@ Partial Class dlgImportDataset ' 'grpExcel ' + Me.grpExcel.Controls.Add(Me.ucrChkMaximumDataSize) Me.grpExcel.Controls.Add(Me.ucrchkColumnNames) Me.grpExcel.Controls.Add(Me.ucrNudxlRowsToSkip) - Me.grpExcel.Controls.Add(Me.Label1) Me.grpExcel.Controls.Add(Me.ucrInputMaximumDataSize) Me.grpExcel.Controls.Add(Me.lblMissingValueString) Me.grpExcel.Controls.Add(Me.ucrInputXlMissingValueString) @@ -368,78 +359,13 @@ Partial Class dlgImportDataset Me.grpExcel.Text = "Import Excel options" Me.grpExcel.Visible = False ' - 'grpRDS - ' - Me.grpRDS.Controls.Add(Me.ucrChkOverWrite) - Me.grpRDS.Controls.Add(Me.ucrChkImportObjects) - Me.grpRDS.Controls.Add(Me.ucrChkImportCalculations) - Me.grpRDS.Controls.Add(Me.ucrChkImportChangesLog) - Me.grpRDS.Controls.Add(Me.ucrChkImportFilters) - Me.grpRDS.Controls.Add(Me.ucrChkImportMetadata) - Me.grpRDS.Controls.Add(Me.ucrChkExistingData) - Me.grpRDS.Location = New System.Drawing.Point(13, 88) - Me.grpRDS.Name = "grpRDS" - Me.grpRDS.Size = New System.Drawing.Size(217, 166) - Me.grpRDS.TabIndex = 37 - Me.grpRDS.TabStop = False - Me.grpRDS.Text = "Import RDS options" - Me.grpRDS.Visible = False - ' - 'ucrChkOverWrite - ' - Me.ucrChkOverWrite.Checked = False - Me.ucrChkOverWrite.Location = New System.Drawing.Point(6, 134) - Me.ucrChkOverWrite.Name = "ucrChkOverWrite" - Me.ucrChkOverWrite.Size = New System.Drawing.Size(205, 20) - Me.ucrChkOverWrite.TabIndex = 49 - ' - 'ucrChkImportObjects - ' - Me.ucrChkImportObjects.Checked = False - Me.ucrChkImportObjects.Location = New System.Drawing.Point(6, 54) - Me.ucrChkImportObjects.Name = "ucrChkImportObjects" - Me.ucrChkImportObjects.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportObjects.TabIndex = 48 - ' - 'ucrChkImportCalculations - ' - Me.ucrChkImportCalculations.Checked = False - Me.ucrChkImportCalculations.Location = New System.Drawing.Point(6, 94) - Me.ucrChkImportCalculations.Name = "ucrChkImportCalculations" - Me.ucrChkImportCalculations.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportCalculations.TabIndex = 47 - ' - 'ucrChkImportChangesLog - ' - Me.ucrChkImportChangesLog.Checked = False - Me.ucrChkImportChangesLog.Location = New System.Drawing.Point(6, 114) - Me.ucrChkImportChangesLog.Name = "ucrChkImportChangesLog" - Me.ucrChkImportChangesLog.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportChangesLog.TabIndex = 46 - ' - 'ucrChkImportFilters - ' - Me.ucrChkImportFilters.Checked = False - Me.ucrChkImportFilters.Location = New System.Drawing.Point(6, 74) - Me.ucrChkImportFilters.Name = "ucrChkImportFilters" - Me.ucrChkImportFilters.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportFilters.TabIndex = 45 - ' - 'ucrChkImportMetadata - ' - Me.ucrChkImportMetadata.Checked = False - Me.ucrChkImportMetadata.Location = New System.Drawing.Point(6, 34) - Me.ucrChkImportMetadata.Name = "ucrChkImportMetadata" - Me.ucrChkImportMetadata.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportMetadata.TabIndex = 44 - ' - 'ucrChkExistingData + 'ucrChkMaximumDataSize ' - Me.ucrChkExistingData.Checked = False - Me.ucrChkExistingData.Location = New System.Drawing.Point(6, 14) - Me.ucrChkExistingData.Name = "ucrChkExistingData" - Me.ucrChkExistingData.Size = New System.Drawing.Size(205, 20) - Me.ucrChkExistingData.TabIndex = 43 + Me.ucrChkMaximumDataSize.Checked = False + Me.ucrChkMaximumDataSize.Location = New System.Drawing.Point(6, 168) + Me.ucrChkMaximumDataSize.Name = "ucrChkMaximumDataSize" + Me.ucrChkMaximumDataSize.Size = New System.Drawing.Size(173, 20) + Me.ucrChkMaximumDataSize.TabIndex = 50 ' 'ucrchkColumnNames ' @@ -461,21 +387,12 @@ Partial Class dlgImportDataset Me.ucrNudxlRowsToSkip.TabIndex = 42 Me.ucrNudxlRowsToSkip.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'Label1 - ' - Me.Label1.AutoSize = True - Me.Label1.Location = New System.Drawing.Point(3, 162) - Me.Label1.Name = "Label1" - Me.Label1.Size = New System.Drawing.Size(100, 13) - Me.Label1.TabIndex = 41 - Me.Label1.Text = "Maximum Data Size" - ' 'ucrInputMaximumDataSize ' Me.ucrInputMaximumDataSize.AddQuotesIfUnrecognised = True Me.ucrInputMaximumDataSize.IsMultiline = False Me.ucrInputMaximumDataSize.IsReadOnly = False - Me.ucrInputMaximumDataSize.Location = New System.Drawing.Point(2, 180) + Me.ucrInputMaximumDataSize.Location = New System.Drawing.Point(6, 194) Me.ucrInputMaximumDataSize.Name = "ucrInputMaximumDataSize" Me.ucrInputMaximumDataSize.Size = New System.Drawing.Size(137, 21) Me.ucrInputMaximumDataSize.TabIndex = 40 @@ -544,6 +461,79 @@ Partial Class dlgImportDataset Me.lblSheets.TabIndex = 6 Me.lblSheets.Text = "Select Sheet" ' + 'grpRDS + ' + Me.grpRDS.Controls.Add(Me.ucrChkOverWrite) + Me.grpRDS.Controls.Add(Me.ucrChkImportObjects) + Me.grpRDS.Controls.Add(Me.ucrChkImportCalculations) + Me.grpRDS.Controls.Add(Me.ucrChkImportChangesLog) + Me.grpRDS.Controls.Add(Me.ucrChkImportFilters) + Me.grpRDS.Controls.Add(Me.ucrChkImportMetadata) + Me.grpRDS.Controls.Add(Me.ucrChkExistingData) + Me.grpRDS.Location = New System.Drawing.Point(226, 24) + Me.grpRDS.Name = "grpRDS" + Me.grpRDS.Size = New System.Drawing.Size(217, 166) + Me.grpRDS.TabIndex = 37 + Me.grpRDS.TabStop = False + Me.grpRDS.Text = "Import RDS options" + Me.grpRDS.Visible = False + ' + 'ucrChkOverWrite + ' + Me.ucrChkOverWrite.Checked = False + Me.ucrChkOverWrite.Location = New System.Drawing.Point(6, 134) + Me.ucrChkOverWrite.Name = "ucrChkOverWrite" + Me.ucrChkOverWrite.Size = New System.Drawing.Size(205, 20) + Me.ucrChkOverWrite.TabIndex = 49 + ' + 'ucrChkImportObjects + ' + Me.ucrChkImportObjects.Checked = False + Me.ucrChkImportObjects.Location = New System.Drawing.Point(6, 54) + Me.ucrChkImportObjects.Name = "ucrChkImportObjects" + Me.ucrChkImportObjects.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportObjects.TabIndex = 48 + ' + 'ucrChkImportCalculations + ' + Me.ucrChkImportCalculations.Checked = False + Me.ucrChkImportCalculations.Location = New System.Drawing.Point(6, 94) + Me.ucrChkImportCalculations.Name = "ucrChkImportCalculations" + Me.ucrChkImportCalculations.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportCalculations.TabIndex = 47 + ' + 'ucrChkImportChangesLog + ' + Me.ucrChkImportChangesLog.Checked = False + Me.ucrChkImportChangesLog.Location = New System.Drawing.Point(6, 114) + Me.ucrChkImportChangesLog.Name = "ucrChkImportChangesLog" + Me.ucrChkImportChangesLog.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportChangesLog.TabIndex = 46 + ' + 'ucrChkImportFilters + ' + Me.ucrChkImportFilters.Checked = False + Me.ucrChkImportFilters.Location = New System.Drawing.Point(6, 74) + Me.ucrChkImportFilters.Name = "ucrChkImportFilters" + Me.ucrChkImportFilters.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportFilters.TabIndex = 45 + ' + 'ucrChkImportMetadata + ' + Me.ucrChkImportMetadata.Checked = False + Me.ucrChkImportMetadata.Location = New System.Drawing.Point(6, 34) + Me.ucrChkImportMetadata.Name = "ucrChkImportMetadata" + Me.ucrChkImportMetadata.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportMetadata.TabIndex = 44 + ' + 'ucrChkExistingData + ' + Me.ucrChkExistingData.Checked = False + Me.ucrChkExistingData.Location = New System.Drawing.Point(6, 14) + Me.ucrChkExistingData.Name = "ucrChkExistingData" + Me.ucrChkExistingData.Size = New System.Drawing.Size(205, 20) + Me.ucrChkExistingData.TabIndex = 43 + ' 'lblCannotImport ' Me.lblCannotImport.AutoSize = True @@ -596,6 +586,14 @@ Partial Class dlgImportDataset Me.ucrBase.Size = New System.Drawing.Size(410, 53) Me.ucrBase.TabIndex = 27 ' + 'ucrChkMissingValueStrings + ' + Me.ucrChkMissingValueStrings.Checked = False + Me.ucrChkMissingValueStrings.Location = New System.Drawing.Point(5, 225) + Me.ucrChkMissingValueStrings.Name = "ucrChkMissingValueStrings" + Me.ucrChkMissingValueStrings.Size = New System.Drawing.Size(173, 20) + Me.ucrChkMissingValueStrings.TabIndex = 51 + ' 'dlgImportDataset ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -641,7 +639,6 @@ Partial Class dlgImportDataset Friend WithEvents lblRowNames As Label Friend WithEvents lblSeparator As Label Friend WithEvents lblDecimal As Label - Friend WithEvents lblNAStrings As Label Friend WithEvents txtPreview As TextBox Friend WithEvents ucrBase As ucrButtons Friend WithEvents grdDataPreview As unvell.ReoGrid.ReoGridControl @@ -666,7 +663,6 @@ Partial Class dlgImportDataset Friend WithEvents lblMissingValueString As Label Friend WithEvents ucrInputXlMissingValueString As ucrInputTextBox Friend WithEvents lblNoPreview As Label - Friend WithEvents Label1 As Label Friend WithEvents ucrInputMaximumDataSize As ucrInputTextBox Friend WithEvents ucrNudxlRowsToSkip As ucrNud Friend WithEvents grpRDS As GroupBox @@ -683,4 +679,6 @@ Partial Class dlgImportDataset Friend WithEvents ucrPnlRowNames As UcrPanel Friend WithEvents ucrNudSkip As ucrNud Friend WithEvents ucrChkStringsAsFactors As ucrCheck + Friend WithEvents ucrChkMaximumDataSize As ucrCheck + Friend WithEvents ucrChkMissingValueStrings As ucrCheck End Class diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 7e070948be0..9e14e0b3e4f 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -40,16 +40,7 @@ Public Class dlgImportDataset ' Add any initialization after the InitializeComponent() call. intLines = 10 - clsImportCSV = New RFunction - clsReadRDS = New RFunction - clsImportRDS = New RFunction - clsImportExcel = New RFunction - clsImport = New RFunction - 'clsTempWorkbookImport = New RFunction - 'clsTempExcelPreview = New RFunction - ucrBase.clsRsyntax.SetFunction("import") - ucrBase.clsRsyntax.SetPackageName("rio") - clsImportRDS.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_RDS") + bFirstLoad = True bFromLibrary = False strLibraryPath = frmMain.strStaticPath & "\Library" @@ -94,41 +85,50 @@ Public Class dlgImportDataset strTempWorkbookName = "temp_workbook" ucrChkStringsAsFactors.SetText("Convert Strings to Factor Columns") + ucrChkStringsAsFactors.SetParameter(New RParameter("stringsAsFactors"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") + ucrChkStringsAsFactors.AddFunctionNamesCondition(True, "import") ucrChkImportChangesLog.SetText("Import Changes log") ucrChkImportChangesLog.SetParameter(New RParameter("include_logs"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") - ucrChkImportChangesLog.AddParameterPresentCondition(True, "include_logs") + ucrChkImportChangesLog.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrChkImportChangesLog.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) ucrChkExistingData.SetText("Keep existing data frames") ucrChkExistingData.SetParameter(New RParameter("keep_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkExistingData.AddParameterPresentCondition(True, "keep_existing") + ucrChkExistingData.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrChkExistingData.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) ucrChkImportMetadata.SetText("Import metadata") ucrChkImportMetadata.SetParameter(New RParameter("include_metadata"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkImportMetadata.AddParameterPresentCondition(True, "include_metadata") + ucrChkImportMetadata.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrChkImportMetadata.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) ucrChkImportObjects.SetText("Import objects") ucrChkImportObjects.SetParameter(New RParameter("include_objects"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkImportObjects.AddParameterPresentCondition(True, "include_objects") + ucrChkImportObjects.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrChkImportObjects.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) ucrChkImportFilters.SetText("Import filters") ucrChkImportFilters.SetParameter(New RParameter("include_filters"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkImportFilters.AddParameterPresentCondition(True, "include_filters") + ucrChkImportFilters.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") ucrChkImportCalculations.SetText("Import calculations") ucrChkImportCalculations.SetParameter(New RParameter("include_calculations"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkImportCalculations.AddParameterPresentCondition(True, "include_calculations") + ucrChkImportCalculations.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrChkImportCalculations.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) ucrChkOverWrite.SetText("Overwrite existing if duplicates found") ucrChkOverWrite.SetParameter(New RParameter("overwrite_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkOverWrite.AddParameterPresentCondition(True, "overwrite_existing") + ' ucrChkOverWrite.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + 'temp disabled until can easily switch between fread and read.csv + 'TODO this is not an option for fread so have to change function here - 'ucrPnlRowNames.SetParameter(New RParameter("row.names")) - ' ucrPnlRowNames.AddRadioButton(rdoRowNamesYes, Chr(34) & Chr(34)) - 'ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "NULL" & Chr(34)) - 'ucrPnlRowNames.SetRDefault(Chr(34) & "NULL" & Chr(34)) + ucrPnlRowNames.SetParameter(New RParameter("row.names")) + ucrPnlRowNames.AddRadioButton(rdoRowNamesYes, Chr(34) & Chr(34)) + ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "NULL" & Chr(34)) + ucrPnlRowNames.SetRDefault(Chr(34) & "NULL" & Chr(34)) rdoRowNamesYes.Enabled = False 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator ucrInputSeparator.Enabled = False @@ -139,6 +139,11 @@ Public Class dlgImportDataset ucrInputFilePath.IsReadOnly = True + ucrChkMissingValueStrings.SetText("Missing Value String") + ucrInputNAStrings.SetParameter(New RParameter("na.strings")) + ucrChkMissingValueStrings.AddParameterPresentCondition(True, "na.strings") + ucrChkMissingValueStrings.AddParameterPresentCondition(False, "na.strings", False) + ' ucrInputEncoding.SetItems({"unknown"}) ucrInputEncoding.SetParameter(New RParameter("encoding", 1)) @@ -147,7 +152,7 @@ Public Class dlgImportDataset ucrInputEncoding.SetRDefault(Chr(34) & "unknown" & Chr(34)) ucrInputEncoding.SetDropDownStyleAsNonEditable() 'csv options settings - clsImportCSV.AddParameter("check.names", "TRUE") + ' clsImportCSV.AddParameter("check.names", "TRUE") ' ucrInputSeparator.SetItems({"Automatic", ", ", "Whitespace", ": ", ";", "|", "^"}) ucrInputSeparator.SetParameter(New RParameter("sep")) @@ -197,13 +202,29 @@ Public Class dlgImportDataset 'xl options settings ucrNudxlRowsToSkip.SetParameter(New RParameter("skip")) ucrNudxlRowsToSkip.Maximum = Integer.MaxValue - ucrInputMaximumDataSize.SetParameter(New RParameter("n_max")) - ucrInputMaximumDataSize.SetRDefault(Chr(34) & "100000" & Chr(34)) - + ucrChkMaximumDataSize.SetText("Maximum Data Size") + ucrInputMaximumDataSize.SetParameter(New RParameter("n_max")) + ucrChkMaximumDataSize.AddParameterPresentCondition(True, "n_max") + ucrChkMaximumDataSize.AddParameterPresentCondition(False, "n_max", False) End Sub Private Sub SetDefaults() + + clsImportCSV = New RFunction + clsReadRDS = New RFunction + clsImportRDS = New RFunction + clsImportExcel = New RFunction + clsImport = New RFunction + + clsImportExcel.SetPackageName("rio") + clsImportExcel.SetRCommand("import") + clsImportCSV.SetPackageName("rio") + clsImportCSV.SetRCommand("import") + clsImport.SetPackageName("rio") + clsImport.SetRCommand("import") + clsImportRDS.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_RDS") + grpCSV.Hide() grpRDS.Hide() grpExcel.Hide() @@ -215,10 +236,12 @@ Public Class dlgImportDataset grdDataPreview.Hide() ucrInputFilePath.SetName("") ucrInputName.SetName("") - SetCSVDefault() - setExcelDefaults() - SetRDSDefaults() + ucrInputXlMissingValueString.SetName("") + clsImportCSV.AddParameter("skip", 0) + clsImportExcel.AddParameter("skip", 0) + 'rdoRowNamesNo.Checked = True + 'ucrChkStringsAsFactors.Checked = True End Sub #Region "Shared options" @@ -305,7 +328,7 @@ Public Class dlgImportDataset ucrInputHeaders.SetRCode(clsImportCSV, bReset) ucrInputDecimal.SetRCode(clsImportCSV, bReset) ucrInputEncoding.SetRCode(clsImportCSV, bReset) - 'ucrPnlRowNames.SetRCode(clsImportCSV, bReset) + ucrPnlRowNames.SetRCode(clsImportCSV, bReset) ucrChkImportChangesLog.SetRCode(clsImportRDS, bReset) ucrChkExistingData.SetRCode(clsImportRDS, bReset) ucrChkImportMetadata.SetRCode(clsImportRDS, bReset) @@ -316,9 +339,13 @@ Public Class dlgImportDataset ucrNudxlRowsToSkip.SetRCode(clsImportExcel, bReset) ucrInputMaximumDataSize.SetRCode(clsImportExcel, bReset) + ucrChkMaximumDataSize.SetRCode(clsImportExcel, bReset) ucrInputSheets.SetRCode(clsImportExcel, bReset) ucrInputXlMissingValueString.SetRCode(clsImportExcel, bReset) ucrchkColumnNames.SetRCode(clsImportExcel, bReset) + ucrChkStringsAsFactors.SetRCode(clsImportCSV, bReset) + ucrInputNAStrings.SetRCode(clsImportCSV, bReset) + ucrChkMissingValueStrings.SetRCode(clsImportCSV, bReset) End Sub @@ -350,16 +377,13 @@ Public Class dlgImportDataset txtPreview.Text = "" txtPreview.Enabled = False grdDataPreview.Enabled = False - ucrBase.clsRsyntax.clsBaseFunction.ClearParameters() ucrBase.clsRsyntax.SetBaseRFunction(clsImportRDS) - ucrBase.clsRsyntax.AddParameter("data_RDS", clsRFunctionParameter:=clsReadRDS) + clsImportRDS.AddParameter("data_RDS", clsRFunctionParameter:=clsReadRDS) strFileType = "RDS" ucrInputName.Hide() lblName.Hide() 'ucrInputName.SetName(strFileName, bSilent:=True) ElseIf strFileExt = ".csv" Then - clsImportCSV.SetPackageName("rio") - clsImportCSV.SetRCommand("import") clsImportCSV.AddParameter("file", Chr(34) & strFilePath & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportCSV) grpRDS.Hide() @@ -371,8 +395,6 @@ Public Class dlgImportDataset ucrInputName.SetName(strFileName, bSilent:=True) RefreshFilePreview() ElseIf strFileExt = ".xlsx" OrElse strFileExt = ".xls" Then - clsImportExcel.SetPackageName("rio") - clsImportExcel.SetRCommand("import") clsImportExcel.AddParameter("file", Chr(34) & strFilePath & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportExcel) grpCSV.Hide() @@ -383,18 +405,16 @@ Public Class dlgImportDataset grdDataPreview.Enabled = True If strFileExt = ".xlsx" Then strFileType = "xlsx" - '.AddParameter("readxl", "FALSE") + clsImportExcel.AddParameter("readxl", "FALSE") Else strFileType = "xls" - 'clsImportExcel.RemoveParameterByName("readxl") + clsImportExcel.RemoveParameterByName("readxl") End If FillExcelSheetsAndRegions(strFilePath) 'ucrInputName.SetName(strFileName, bSilent:=True) Else strFileType = strFileExt.Substring(1) - clsImport.SetPackageName("rio") - clsImport.SetRCommand("import") clsImport.AddParameter("file", Chr(34) & strFilePath & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImport) grpCSV.Hide() @@ -524,208 +544,21 @@ Public Class dlgImportDataset End Sub #End Region -#Region "RDS options" - Private Sub SetRDSDefaults() - 'chkExistingData.Checked = True - 'chkImportObjects.Checked = True - 'chkImportMetadata.Checked = True - 'chkImportChangesLog.Checked = True - 'chkImportFilters.Checked = True - 'chkImportCalculations.Checked = True - 'chkOverWrite.Checked = False - End Sub - - - 'Private Sub chkExisting_CheckStateChanged(sender As Object, e As EventArgs) - ' If chkExistingData.Checked Then - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportRDS.AddParameter("keep_existing", "TRUE") - ' Else - ' clsImportRDS.RemoveParameterByName("keep_existing") - ' End If - ' Else - ' clsImportRDS.AddParameter("keep_existing", "FALSE") - ' End If - 'End Sub - - 'Private Sub chkLogs_CheckStateChanged(sender As Object, e As EventArgs) - ' If chkImportChangesLog.Checked Then - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportRDS.AddParameter("include_logs", "TRUE") - ' Else - ' clsImportRDS.RemoveParameterByName("include_logs") - ' End If + 'Private Sub rdoRowNames_CheckedChanged() Handles ucrPnlRowNames.ControlValueChanged + ' If rdoRowNamesYes.Checked Then + ' TODO this Is Not an option for fread so have to change function here + ' clsImportCSV.AddParameter("row.names", 1) ' Else - ' clsImportRDS.RemoveParameterByName("include_logs") + ' TODO find out what difference there Is between + ' row.names = NULL And row.names missing + ' disabled as import (fread) does Not support row.names + ' clsImportCSV.AddParameter("row.names", "NULL") + ' clsImportCSV.RemoveParameterByName("row.names") ' End If 'End Sub - 'Private Sub chkOverWrite_CheckStateChanged(sender As Object, e As EventArgs) - ' If chkOverWrite.Checked Then - ' clsImportRDS.AddParameter("overwrite_existing", "TRUE") - ' Else - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportRDS.AddParameter("overwrite_existing", "FALSE") - ' Else - ' clsImportRDS.RemoveParameterByName("overwrite_existing") - ' End If - ' End If - 'End Sub - - 'Private Sub chkMetadata_CheckStateChanged(sender As Object, e As EventArgs) - ' If chkImportMetadata.Checked Then - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportRDS.AddParameter("include_metadata", "TRUE") - ' Else - ' clsImportRDS.RemoveParameterByName("include_metadata") - ' End If - ' Else - ' clsImportRDS.AddParameter("include_metadata", "FALSE") - ' End If - 'End Sub - - 'Private Sub chkKeepFilters_CheckedChanged(sender As Object, e As EventArgs) - ' If chkImportFilters.Checked Then - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportRDS.AddParameter("include_filters", "TRUE") - ' Else - ' clsImportRDS.RemoveParameterByName("include_filters") - ' End If - ' Else - ' clsImportRDS.AddParameter("include_filters", "FALSE") - ' End If - 'End Sub - - 'Private Sub chkImportCalculations_CheckedChanged(sender As Object, e As EventArgs) - ' If chkImportCalculations.Checked Then - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportRDS.AddParameter("include_calculations", "TRUE") - ' Else - ' clsImportRDS.RemoveParameterByName("include_calculations") - ' End If - ' Else - ' clsImportRDS.AddParameter("include_calculations", "FALSE") - ' End If - 'End Sub - - 'Private Sub chkKeepObjects_CheckStateChanged(sender As Object, e As EventArgs) - ' If chkImportObjects.Checked Then - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportRDS.AddParameter("include_objects", "TRUE") - ' Else - ' clsImportRDS.RemoveParameterByName("include_objects") - ' End If - ' Else - ' clsImportRDS.AddParameter("include_objects", "FALSE") - ' End If - 'End Sub - -#End Region - -#Region "CSV options" - Private Sub SetCSVDefault() - 'ucrInputEncoding.SetName("unknown") - 'rdoRowNamesNo.Checked = True - 'ucrInputSeparator.SetName("Automatic") - 'ucrInputHeaders.SetName("Automatic") - 'ucrInputDecimal.SetName("Automatic") - 'ucrInputNAStrings.SetName("NA") - ' ucrNudSkip.Value = 0 - 'ucrChkStringsAsFactors.Checked = True - End Sub - - Private Sub ucrInputEncoding_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputEncoding.ControlValueChanged - - 'If ucrInputEncoding.GetText() <> "" AndAlso (ucrInputEncoding.GetText() <> "unknown" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then - ' clsImportCSV.AddParameter("encoding", ucrInputEncoding.GetText) - 'Else - ' clsImportCSV.RemoveParameterByName("encoding") - 'End If - RefreshFrameView() - - End Sub - - Private Sub rdoRowNames_CheckedChanged() Handles ucrPnlRowNames.ControlValueChanged - If rdoRowNamesYes.Checked Then - 'TODO this is not an option for fread so have to change function here - ' clsImportCSV.AddParameter("row.names", 1) - Else - 'TODO find out what difference there is between - 'row.names = NULL and row.names missing - 'disabled as import (fread) does not support row.names - 'clsImportCSV.AddParameter("row.names", "NULL") - ' clsImportCSV.RemoveParameterByName("row.names") - End If - End Sub - - Private Sub ucrInputHeaders_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputHeaders.ControlValueChanged - ' Select Case ucrInputHeaders.GetText() - ' Case "Automatic" - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportCSV.AddParameter("header", Chr(34) & "auto" & Chr(34)) - ' Else - ' clsImportCSV.RemoveParameterByName("header") - ' End If - ' clsImportCSV.RemoveParameterByName("header") - ' Case "Yes" - ' clsImportCSV.AddParameter("header", "TRUE") - ' Case "No" - ' clsImportCSV.AddParameter("header", "FALSE") - ' Case Else - ' 'clsImportCSV.RemoveParameterByName("header") - ' End Select - RefreshFrameView() - End Sub - - Private Sub ucrInputDecimal_ControlValueChanged() Handles ucrInputDecimal.ControlValueChanged - 'Select Case ucrInputDecimal.GetText - ' Case "Automatic" - ' clsImportCSV.RemoveParameterByName("dec") - ' Case Else - ' clsImportCSV.AddParameter("dec", Chr(34) & ucrInputDecimal.GetText() & Chr(34)) - 'End Select - RefreshFrameView() - End Sub - - ' Private Sub ucrInputSeparator_ControlValueChanged() Handles ucrInputSeparator.ControlValueChanged - 'Select Case ucrInputSeparator.GetText - ' Case "Automatic" - ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsImportCSV.AddParameter("sep", Chr(34) & "auto" & Chr(34)) - ' Else - ' clsImportCSV.RemoveParameterByName("sep") - ' End If - ' clsImportCSV.RemoveParameterByName("sep") - ' Case "Whitespace" - ' clsImportCSV.AddParameter("sep", Chr(34) & "" & Chr(34)) - ' Case "" - ' clsImportCSV.RemoveParameterByName("sep") - ' Case Else - ' clsImportCSV.AddParameter("sep", Chr(34) & ucrInputSeparator.GetText() & Chr(34)) - 'End Select - ' RefreshFrameView() - 'End Sub - - 'Private Sub ucrInputDecimal_TextChanged() Handles ucrInputDecimal.ControlValueChanged - 'Select Case ucrInputDecimal.GetText - ' Case "Period" - ' clsImportCSV.AddParameter("dec", Chr(34) & "." & Chr(34)) - ' Case "Comma" - ' clsImportCSV.AddParameter("dec", Chr(34) & "," & Chr(34)) - 'End Select - ' RefreshFrameView() - ' End Sub - - Private Sub ucrInputNAStrings_ControlValueChanged() Handles ucrInputNAStrings.ControlValueChanged - If ucrInputNAStrings.GetText() <> "" AndAlso (ucrInputNAStrings.GetText() <> "NA" OrElse frmMain.clsInstatOptions.bIncludeRDefaultParameters) Then - clsImportCSV.AddParameter("na.strings", Chr(34) & ucrInputNAStrings.GetText() & Chr(34)) - Else - ' clsImportCSV.RemoveParameterByName("na.strings") - End If - RefreshFrameView() - End Sub - Private Sub ucrNudSkip_ControlValueChanged() Handles ucrNudSkip.ControlValueChanged + Private Sub ucrNudSkip_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudSkip.ControlValueChanged If bComponentsInitialised Then If ucrNudSkip.Value = 0 Then clsImportCSV.RemoveParameterByName("skip") @@ -741,18 +574,16 @@ Public Class dlgImportDataset Private Sub cmdOpenDataSet_Click(sender As Object, e As EventArgs) Handles cmdOpenDataSet.Click GetFileFromOpenDialog() End Sub -#End Region - #Region "Excel options" Private Sub setExcelDefaults() - ' ucrNudxlRowsToSkip.Value = 0 - XlSkipRowsParameter() - ucrchkColumnNames.Checked = True - XlStringsAsFactorsParameter() - XlColNamesParameter() - ucrInputXlMissingValueString.SetName("") + 'ucrchkColumnNames.Checked = True + + End Sub + + Private Sub ucrChkMissingValueStrings_Load(sender As Object, e As EventArgs) + End Sub Private Sub FillExcelSheetsAndRegions(strFilePath As String) @@ -796,127 +627,61 @@ Public Class dlgImportDataset 'ucrInputNamedRegions.SetName("") End Sub - ' Private Sub nudxlRowsToSkip_TextChanged(sender As Object, e As EventArgs) Handles ucrNudxlRowsToSkip.ControlValueChanged - ' XlSkipRowsParameter() - ' ucrchkColumnNames - ' ucrchkColumnNames.SetText("Trim Trailing WhiteSpace") - ' End Sub - 'Private Sub nudxlRowsToSkip_TextChanged(sender As Object, e As EventArgs) Handles ucrchkColumnNames.ControlValueChanged - ' XlSkipRowsParameter() - ' ucrchkColumnNames.SetText("Trim Trailing WhiteSpace") - 'End Sub - - Private Sub XlSkipRowsParameter() - If bComponentsInitialised Then - If ucrNudxlRowsToSkip.Text <> "" Then - If ucrNudxlRowsToSkip.Value = 0 AndAlso Not frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsImportExcel.RemoveParameterByName("skip") - Else - clsImportExcel.AddParameter("skip", ucrNudxlRowsToSkip.Value) - End If - Else - clsImportExcel.RemoveParameterByName("skip") - End If - RefreshFrameView() - End If - End Sub - - 'Private Sub chkColumnNames_CheckedChanged(sender As Object, e As EventArgs) Handles ucrchkColumnNames.ControlValueChanged + 'Private Sub ucrchkColumnNames_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrchkColumnNames.ControlValueChanged ' XlColNamesParameter() 'End Sub - Private Sub XlColNamesParameter() - Dim strColNameParam As String + 'Private Sub XlColNamesParameter() + ' Dim strColNameParam As String - If strFileType = "xlsx" Then - strColNameParam = "colNames" - ' clsReadXL.RemoveParameterByName("col_names") - Else - strColNameParam = "col_names" - ' clsReadXL.RemoveParameterByName("colNames") - End If - - If ucrchkColumnNames.Checked Then - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsReadXL.AddParameter(strColNameParam, "TRUE") - Else - ' clsReadXL.RemoveParameterByName(strColNameParam) - End If - Else - 'clsReadXL.AddParameter(strColNameParam, "FALSE") - End If - RefreshFrameView() - End Sub - - Private Sub Control_ControlValueChanged() Handles ucrChkStringsAsFactors.ControlValueChanged - XlStringsAsFactorsParameter() - End Sub - - Private Sub XlStringsAsFactorsParameter() - If ucrChkStringsAsFactors.Checked Then - clsImportCSV.AddParameter("stringsAsFactors", "TRUE") - Else - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - clsImportCSV.AddParameter("stringsAsFactors", "FALSE") - Else - clsImportCSV.RemoveParameterByName("stringsAsFactors") - End If - End If - RefreshFrameView() - End Sub - - Private Sub ucrInputXlMissingValueString_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputXlMissingValueString.ControlValueChanged - - End Sub - - Private Sub ucrInputNAStrings_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputNAStrings.ControlValueChanged - - End Sub + ' If strFileType = "xlsx" Then + ' strColNameParam = "colNames" + ' clsImportExcel.RemoveParameterByName("col_names") + ' Else + ' strColNameParam = "col_names" + ' clsImportExcel.RemoveParameterByName("colNames") + ' End If - Private Sub ucrInputName_NameChanged(ucrChangedControl As ucrCore) Handles ucrInputName.ControlValueChanged + ' If ucrchkColumnNames.Checked Then + ' If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then + ' clsImportExcel.AddParameter(strColNameParam, "TRUE") + ' Else + ' clsImportExcel.RemoveParameterByName(strColNameParam) + ' End If + ' Else + ' clsImportExcel.AddParameter(strColNameParam, "FALSE") + ' End If + ' RefreshFrameView() + 'End Sub - End Sub Private Sub lblRowVector_Click(sender As Object, e As EventArgs) Me.Hide() frmMetaData.Show() End Sub - Private Sub ucrInputXlMissingValueString_ControlValueChanged() Handles ucrInputXlMissingValueString.ControlValueChanged - If Not ucrInputXlMissingValueString.IsEmpty() Then - ' clsReadXL.AddParameter("na", Chr(34) & ucrInputXlMissingValueString.GetText() & Chr(34)) - Else - If frmMain.clsInstatOptions.bIncludeRDefaultParameters Then - ' clsReadXL.AddParameter("na", Chr(34) & Chr(34)) - Else - 'lsReadXL.RemoveParameterByName("na") - End If - End If - RefreshFrameView() - End Sub Private Sub ucrInputSheets_ControlValueChanged() Handles ucrInputSheets.ControlValueChanged If Not ucrInputSheets.IsEmpty() Then If strFileType = "xlsx" Then - ' clsReadXL.AddParameter("which", ucrInputSheets.cboInput.SelectedIndex + 1) - ' clsReadXL.RemoveParameterByName("sheet") + clsImportExcel.AddParameter("which", ucrInputSheets.cboInput.SelectedIndex + 1) + clsImportExcel.RemoveParameterByName("sheet") If Not ucrInputName.UserTyped() Then ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) End If ElseIf strFileType = "xls" Then - 'clsReadXL.AddParameter("sheet", ucrInputSheets.cboInput.SelectedIndex + 1) - ' clsReadXL.RemoveParameterByName("which") + clsImportExcel.AddParameter("sheet", ucrInputSheets.cboInput.SelectedIndex + 1) + clsImportExcel.RemoveParameterByName("which") If Not ucrInputName.UserTyped() Then ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) End If Else - ' clsReadXL.RemoveParameterByName("sheet") - ' clsReadXL.RemoveParameterByName("which") + clsImportExcel.RemoveParameterByName("sheet") + clsImportExcel.RemoveParameterByName("which") End If 'ucrInputNamedRegions.SetName("") Else - ' clsReadXL.RemoveParameterByName("sheet") - ' clsReadXL.RemoveParameterByName("which") + End If RefreshFrameView() End Sub From 47b1e63b8e81e5b265ebbc19b9b05ebf15b0597d Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Tue, 20 Jun 2017 11:33:19 +0300 Subject: [PATCH 105/201] removing unwanted code for radiobuttons --- instat/dlgOptions.vb | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/instat/dlgOptions.vb b/instat/dlgOptions.vb index a4ad9e61c1b..27180229b31 100644 --- a/instat/dlgOptions.vb +++ b/instat/dlgOptions.vb @@ -291,19 +291,6 @@ Public Class dlgOptions Private Sub ucrNudPreviewRows_ValueChanged() Handles ucrNudMaxCols.ControlValueChanged, ucrNudPreviewRows.ControlValueChanged, ucrInputComment.ControlContentsChanged, ucrChkIncludeCommentsbyDefault.ControlValueChanged, ucrNudMaxRows.ControlValueChanged, ucrChkIncludeDefaultParams.ControlValueChanged, ucrChkShowRCommandsinOutputWindow.ControlValueChanged, ucrNudDigits.ControlValueChanged, ucrChkShowSignifStars.ControlValueChanged ApplyEnabled(True) End Sub - - Private Sub rdoDisplayinOutputWindow_CheckedChanged(sender As Object, e As EventArgs) Handles rdoDisplayinOutputWindow.CheckedChanged, rdoDisplayinSeparateWindows.CheckedChanged, rdoDisplayinRViewer.CheckedChanged - 'If rdoDisplayinOutputWindow.Checked Then - ' strGraphDisplayOption = "view_output_window" - 'ElseIf rdoDisplayinSeparateWindows.Checked Then - ' strGraphDisplayOption = "view_separate_window" - 'ElseIf rdoDisplayinRViewer.Checked Then - ' strGraphDisplayOption = "view_R_viewer" - 'End If - - 'ApplyEnabled(True) - End Sub - Private Sub ApplyEnabled(bEnable As Boolean) cmdApply.Enabled = bEnable cmdOk.Enabled = bEnable From 69164528f2de1f4edacc321d36d2e444275bc9c1 Mon Sep 17 00:00:00 2001 From: Lily Date: Tue, 20 Jun 2017 09:39:19 +0100 Subject: [PATCH 106/201] spells --- instat/dlgSpells.vb | 68 +++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 9efaa24baa3..796a085cac4 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -14,15 +14,14 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . -Imports instat Imports instat.Translations Public Class dlgSpells Private bFirstload As Boolean = True Private bReset As Boolean = True Private clsAddKey, clsSpellLength, clsMaxValueManipulation, clsSubSpellLength1 As New RFunction Private clsMaxValue, clsMaxValueList, clsMaxValueFunction As New RFunction - Private clsDayFromAndTo, clsGroupBy, clsAddKeyColName As New RFunction - Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator As New ROperator + Private clsDayFromAndTo, clsGroupBy, clsAddKeyColName, clsDayFromAndToCalcFrom As New RFunction + Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator, clsDayFromAndToCalcFromOp As New ROperator Private clsApplyInstatFunction, clsRRainday, clsRRaindayMatch As New RFunction Private clsRRaindayOperator, clsRRaindayAndOperator, clsRRaindayLowerOperator, clsRRaindayUpperOperator, clsAdditionalConditionReplaceOperator, clsAdditionalConditionReplaceOperator2 As New ROperator Private clsAdditionalCondition, clsAdditionalConditionList, clsSubSpellLength2, clsAdditionalConditionReplaceFunction As New RFunction @@ -122,6 +121,7 @@ Public Class dlgSpells clsMaxValueManipulation = New RFunction clsDayFromAndTo = New RFunction clsGroupBy = New RFunction + clsAddKey = New RFunction clsAddKeyColName = New RFunction clsRRainday = New RFunction clsSpellLength = New RFunction @@ -143,7 +143,7 @@ Public Class dlgSpells ucrSelectorForSpells.Reset() ucrReceiverDate.SetMeAsReceiver() - ucrInputCondition.SetName("<= Amount of Rain") 'TODO set item/name as this + ucrInputCondition.SetName("<= Amount of Rain") 'TODO1: set item/name as this ' key clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") @@ -151,9 +151,10 @@ Public Class dlgSpells clsAddKeyColName.SetRCommand("c") 'DayFromandTo + clsDayFromAndToOperator.bToScriptAsRString = True clsDayFromAndTo.SetRCommand("instat_calculation$new") clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) - clsDayFromAndTo.AddParameter("function_exp", clsDayFromAndToOperator.bToScriptAsRString = True, iPosition:=1) + clsDayFromAndTo.AddParameter("function_exp", clsROperatorParameter:=clsDayFromAndToOperator, iPosition:=1) clsDayFromAndToOperator.SetOperation("&") clsDayFromAndToOperator.AddParameter("from", clsROperatorParameter:=clsDayFromOperator, iPosition:=0) clsDayFromOperator.SetOperation(">=") @@ -161,18 +162,24 @@ Public Class dlgSpells clsDayFromAndToOperator.AddParameter("to", clsROperatorParameter:=clsDayToOperator, iPosition:=1) clsDayToOperator.SetOperation("<=") clsDayToOperator.AddParameter("to", 366) + clsDayFromAndToCalcFrom.SetRCommand("list") + clsDayFromAndToCalcFrom.AddParameter("x", clsROperatorParameter:=clsDayFromAndToCalcFromOp) + clsDayFromAndToCalcFromOp.SetOperation("=") + clsDayFromAndToCalcFromOp.AddParameter("x", strCurrDataName, iPosition:=0) + clsDayFromAndTo.AddParameter("calculated_from", clsRFunctionParameter:=clsDayFromAndToCalcFrom) ' group clsGroupBy.SetRCommand("instat_calculation$new") clsGroupBy.AddParameter("type", Chr(34) & "by" & Chr(34)) ' rain_day + clsRRaindayMatch.bToScriptAsRString = True clsRRainday.SetRCommand("instat_calculation$new") clsRRainday.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsRRainday.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=2) clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=3) clsRRainday.AddParameter("save", "0", iPosition:=6) - clsRRainday.AddParameter("function_exp", clsRRaindayMatch.bToScriptAsRString = True, iPosition:=1) + clsRRainday.AddParameter("function_exp", clsRFunctionParameter:=clsRRaindayMatch, iPosition:=1) clsRRaindayMatch.SetRCommand("match") clsRRaindayMatch.AddParameter("x", clsROperatorParameter:=clsRRaindayAndOperator) clsRRaindayAndOperator.SetOperation("&") @@ -195,8 +202,10 @@ Public Class dlgSpells clsMaxValueManipulation.SetRCommand("list") ' Additional Checkbox + clsAdditionalConditionReplaceFunction.bToScriptAsRString = True clsAdditionalCondition.SetRCommand("instat_calculation$new") clsAdditionalCondition.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsAdditionalCondition.AddParameter("function_exp", clsRFunctionParameter:=clsAdditionalConditionReplaceFunction, iPosition:=1) clsAdditionalCondition.AddParameter("result_name", Chr(34) & "rain_day2" & Chr(34), iPosition:=2) clsAdditionalCondition.AddParameter("save", 0, iPosition:=6) clsAdditionalConditionReplaceFunction.SetRCommand("replace") @@ -206,9 +215,10 @@ Public Class dlgSpells clsAdditionalConditionList.SetRCommand("list") 'Max Value + clsMaxValueFunction.bToScriptAsRString = True clsMaxValue.SetRCommand("instat_calculation$new") clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) - ' clsMaxValue.AddParameter("function_exp", Chr(34) & clsMaxValueFunction.ToScript & Chr(34), iPosition:=1) + clsMaxValue.AddParameter("function_exp", clsRFunctionParameter:=clsMaxValueFunction, iPosition:=1) clsMaxValueFunction.SetRCommand("max") clsMaxValueFunction.AddParameter("x", "Dry_Spell") clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34), iPosition:=3) @@ -227,6 +237,7 @@ Public Class dlgSpells ucrNudFrom.AddAdditionalCodeParameterPair(clsAdditionalConditionReplaceOperator2, New RParameter("list", 0), iAdditionalPairNo:=1) 'For day: ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("doy", 0), iAdditionalPairNo:=1) + ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromAndToCalcFromOp, New RParameter("X", 1), iAdditionalPairNo:=2) ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) @@ -241,7 +252,7 @@ Public Class dlgSpells ucrSelectorForSpells.SetRCode(clsAddKey, bReset) End Sub - Private Sub TestOKEnabled() + Private Sub TestOKEnabled() 'TODO2: check this sub works and everything is calling If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ucrInputSpellUpper.Text <> "" Then ucrBase.OKEnabled(True) Else @@ -256,21 +267,16 @@ Public Class dlgSpells End Sub Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk - frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining Date column as key") + frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining column(s) as key") ' clsDayFromAndTo.SetAssignTo("Day_From_and_To") - clsGroupBy.SetAssignTo("Grouping") + clsGroupBy.SetAssignTo("Grouping") ' TODO: When to do .SetAssignTo? clsMaxValue.SetAssignTo("Spells_Rain") clsSpellLength.SetAssignTo("Dry_Spell") - ' clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) - clsMaxValue.AddParameter("function_exp", Chr(34) & clsMaxValueFunction.ToScript & Chr(34), iPosition:=1) - ' clsRRainday.AddParameter("function_exp", Chr(34) & clsRRaindayMatch.ToScript & Chr(34), iPosition:=1) - - If ucrChkConditional.Checked Then + If ucrChkConditional.Checked Then 'TODO: A more efficient way here? clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) - clsAdditionalCondition.AddParameter("function_exp", Chr(34) & clsAdditionalConditionReplaceFunction.ToScript & Chr(34)) clsAdditionalCondition.SetAssignTo("Additional_Condition") clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day2)-cummax((rain_day2==0)*cumsum(rain_day2))" & Chr(34)) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) @@ -285,22 +291,18 @@ Public Class dlgSpells ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) End Sub - Private Sub DayBoundaries() - clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + Private Sub DayBoundaries() ' TODO: What to do about the calculated_from, sub1, etc + ' clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) + clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub Private Sub RainyDaysMethod() + clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) End Sub - Private Sub nudValues() - ' nudFrom.Maximum = ucrNudTo.Value - 1 - ' ucrNudTo.Minimum = nudFrom.Value + 1 - 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 - 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 - End Sub - Private Sub ucrInputSpellLower_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputSpellLower.ControlValueChanged, ucrInputSpellUpper.ControlValueChanged, ucrInputCondition.ControlValueChanged Select Case ucrInputCondition.GetText Case "<= Amount of Rain" @@ -322,24 +324,24 @@ Public Class dlgSpells End Sub Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged - clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) - RainyDaysMethod() - End Sub - - Private Sub ucrReceivers_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged - ' when rain_day changes, then clsSpellLength changes. So do I need to run everything again when rain_day changes?! clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=4) clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False, iPosition:=0) + RainyDaysMethod() End Sub Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForSpells.ControlContentsChanged strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) End Sub + Private Sub nudValues() + ' nudFrom.Maximum = ucrNudTo.Value - 1 + ' ucrNudTo.Minimum = nudFrom.Value + 1 + 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 + 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 + End Sub + Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged DayBoundaries() - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) - clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged From bc07561a41929e69d4a5c48d54fa41fc3547cc44 Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 20 Jun 2017 12:00:24 +0300 Subject: [PATCH 107/201] Linking and fixing testOK --- instat/dlgImportDataset.vb | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 9e14e0b3e4f..a793bd352be 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -17,6 +17,7 @@ Imports instat.Translations Imports System.IO Imports RDotNet Imports System.ComponentModel +Imports instat Public Class dlgImportDataset @@ -87,16 +88,18 @@ Public Class dlgImportDataset ucrChkStringsAsFactors.SetText("Convert Strings to Factor Columns") ucrChkStringsAsFactors.SetParameter(New RParameter("stringsAsFactors"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") ucrChkStringsAsFactors.AddFunctionNamesCondition(True, "import") + ucrChkStringsAsFactors.AddFunctionNamesCondition(False, "import", False) ucrChkImportChangesLog.SetText("Import Changes log") ucrChkImportChangesLog.SetParameter(New RParameter("include_logs"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") - ucrChkImportChangesLog.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") - ucrChkImportChangesLog.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + ucrChkImportChangesLog.AddParameterPresentCondition(True, "include_logs") + ucrChkImportChangesLog.AddFunctionNamesCondition(False, "include_logs", False) ucrChkExistingData.SetText("Keep existing data frames") ucrChkExistingData.SetParameter(New RParameter("keep_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkExistingData.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") - ucrChkExistingData.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + ucrChkExistingData.AddParameterPresentCondition(True, "keep_existing") + ucrChkExistingData.AddFunctionNamesCondition(False, "keep_existing", False) + ucrChkImportMetadata.SetText("Import metadata") ucrChkImportMetadata.SetParameter(New RParameter("include_metadata"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") @@ -199,16 +202,20 @@ Public Class dlgImportDataset ucrchkColumnNames.SetParameter(New RParameter("trim_ws"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") ucrchkColumnNames.SetText("Trim Trailing WhiteSpace") - 'xl options settings ucrNudxlRowsToSkip.SetParameter(New RParameter("skip")) + ucrNudxlRowsToSkip.Maximum = Integer.MaxValue ucrChkMaximumDataSize.SetText("Maximum Data Size") ucrInputMaximumDataSize.SetParameter(New RParameter("n_max")) - ucrChkMaximumDataSize.AddParameterPresentCondition(True, "n_max") + 'ucrChkMaximumDataSize.AddParameterPresentCondition(True, "n_max") ucrChkMaximumDataSize.AddParameterPresentCondition(False, "n_max", False) + ucrInputMaximumDataSize.AddQuotesIfUnrecognised = False + + ucrChkMaximumDataSize.AddToLinkedControls(ucrInputMaximumDataSize, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=100000) End Sub + Private Sub SetDefaults() clsImportCSV = New RFunction @@ -273,7 +280,6 @@ Public Class dlgImportDataset Else ucrBase.OKEnabled(False) End If - ucrBase.OKEnabled(True) End Sub #End Region @@ -403,13 +409,6 @@ Public Class dlgImportDataset txtPreview.Text = "" txtPreview.Enabled = False grdDataPreview.Enabled = True - If strFileExt = ".xlsx" Then - strFileType = "xlsx" - clsImportExcel.AddParameter("readxl", "FALSE") - Else - strFileType = "xls" - clsImportExcel.RemoveParameterByName("readxl") - End If FillExcelSheetsAndRegions(strFilePath) 'ucrInputName.SetName(strFileName, bSilent:=True) @@ -695,6 +694,10 @@ Public Class dlgImportDataset End If End Sub + Private Sub ucrInputName_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrInputName.ControlContentsChanged + TestOkEnabled() + End Sub + 'Private Sub ucrInputNamedRegions_ControlValueChanged() Handles ucrInputNamedRegions.ControlValueChanged ' If Not ucrInputNamedRegions.IsEmpty() Then ' clsReadXLSX.AddParameter("namedRegion", Chr(34) & ucrInputNamedRegions.GetText() & Chr(34)) From 2a563a39615e737dbf80438cd82bc2fafdbbb2a4 Mon Sep 17 00:00:00 2001 From: Lily Date: Tue, 20 Jun 2017 12:59:01 +0100 Subject: [PATCH 108/201] Update --- instat/clsRParameter.vb | 17 +++++++- instat/dlgStartofRains.vb | 85 +++++++++++++++++++++++++-------------- 2 files changed, 70 insertions(+), 32 deletions(-) diff --git a/instat/clsRParameter.vb b/instat/clsRParameter.vb index c60416f84c3..6a9a0dc46d2 100644 --- a/instat/clsRParameter.vb +++ b/instat/clsRParameter.vb @@ -33,9 +33,24 @@ Public Class RParameter Public Sub New() End Sub - Public Sub New(strParameterName As String, Optional iNewPosition As Integer = -1) + Public Sub New(strParameterName As String, Optional iNewPosition As Integer = -1, Optional bNewIncludeArgumentName As Boolean = True) SetArgumentName(strParameterName) Position = iNewPosition + bIncludeArgumentName = bNewIncludeArgumentName + End Sub + + Public Sub New(strParameterName As String, strParamValue As String, Optional iNewPosition As Integer = -1, Optional bNewIncludeArgumentName As Boolean = True) + SetArgumentName(strParameterName) + SetArgumentValue(strParamValue) + Position = iNewPosition + bIncludeArgumentName = bNewIncludeArgumentName + End Sub + + Public Sub New(strParameterName As String, strParamValue As RCodeStructure, Optional iNewPosition As Integer = -1, Optional bNewIncludeArgumentName As Boolean = True) + SetArgumentName(strParameterName) + SetArgument(strParamValue) + Position = iNewPosition + bIncludeArgumentName = bNewIncludeArgumentName End Sub ''Public Event PositionChanged() diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index e5d1519fb64..74270ea1a47 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -46,7 +46,7 @@ Public Class dlgStartofRains SetRCodeForControls(bReset) bReset = False autoTranslate(Me) - TestOKEnabled() + ' TestOKEnabled() End Sub Private Sub InitialiseDialog() @@ -95,7 +95,7 @@ Public Class dlgStartofRains ucrNudThreshold.DecimalPlaces = 2 'Total Rainfall - ' ucrChkTotalRainfall if not checked then it doesn't run anything - do manually that this runs if checked. + ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 2, False)) ucrChkTotalRainfall.SetText("Total Rainfall") ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudTROverDays.SetLinkedDisplayControl(lblTROverDays) @@ -103,10 +103,14 @@ Public Class dlgStartofRains ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) + 'ucrChkTotalRainfall.AddParameterPresentCondition(ucrNudTROverDays, {True}) + 'ucrChkTotalRainfall.AddParameterPresentCondition(ucrPnlTRCalculateBy, {True}) ' set up panel correctly! ucrPnlTRCalculateBy.AddRadioButton(rdoTRAmount) ucrPnlTRCalculateBy.AddRadioButton(rdoTRPercentile) + ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "sub4", False) + ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "sub4") ' pecentile adds a function, check for amount. @@ -121,17 +125,21 @@ Public Class dlgStartofRains ucrNudTRPercentile.Increment = 0.1 'Number of Rainy days - ' ucrChkTotalRainfall if not checked then it doesn't run anything ' if checked, then it runs a function: instat_calculation$new TODO: How to do that? Do manually. ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub1", clsRDRollingRainDays, 2, False)) ucrNudRDMinimumDays.SetLinkedDisplayControl(lblRDMinimum) + ucrNudRDMinimumDays.SetParameter(New RParameter("RDMin", 1)) ucrNudRDOutOfDays.SetLinkedDisplayControl(lblRDWidth) ucrNudRDOutOfDays.SetParameter(New RParameter("width", 1)) 'ucrNudRDOutOfDays.SetMinMax(1, 366) what is appropriate here? + ' ucrChkNumberOfRainyDays.AddParameterPresentCondition(ucrNudRDMinimumDays, {True}) + ' ucrChkNumberOfRainyDays.AddParameterPresentCondition(ucrNudRDOutOfDays, {True}) + 'Dry Spell ucrChkDrySpell.SetText("Dry Spell") ucrChkDrySpell.AddToLinkedControls(ucrNudDSLengthOfTime, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -140,19 +148,28 @@ Public Class dlgStartofRains ucrNudDSMaximumDays.SetLinkedDisplayControl(lblDSMaximumDays) ucrNudDSLengthOfTime.SetParameter(New RParameter("width", 1)) ' what is a min/max for this + ' ucrChkDrySpell.AddParameterPresentCondition(ucrNudDSLengthOfTime, {True}) + ' ucrChkDrySpell.AddParameterPresentCondition(ucrNudDSMaximumDays, {True}) ' Dry Period ucrChkDryPeriod.SetText("Dry Period") - ucrChkDryPeriod.AddToLinkedControls(ucrNudDPMaxRain, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkDryPeriod.AddToLinkedControls(ucrNudDPOverallInterval, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkDryPeriod.AddToLinkedControls(ucrNudDPRainPeriod, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrNudDPMaxRain.SetLinkedDisplayControl(lblDPMaxRain) - ucrNudDPOverallInterval.SetLinkedDisplayControl(lblDPOverallInterval) - ucrNudDPRainPeriod.SetLinkedDisplayControl(lblDPLength) + ucrNudDPRainPeriod.SetParameter(New RParameter("width", 1)) + ucrNudDPRainPeriod.SetLinkedDisplayControl(lblDPLength) + ucrNudDPMaxRain.SetParameter(New RParameter("right", 1)) + ucrNudDPMaxRain.SetLinkedDisplayControl(lblDPMaxRain) + ucrNudDPOverallInterval.SetParameter(New RParameter("Overall", 0)) + ucrNudDPOverallInterval.SetLinkedDisplayControl(lblDPOverallInterval) + ' minmax? + ucrChkDryPeriod.AddToLinkedControls(ucrNudDPMaxRain, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkDryPeriod.AddToLinkedControls(ucrNudDPOverallInterval, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkDryPeriod.AddToLinkedControls(ucrNudDPRainPeriod, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ' ucrChkDryPeriod.AddParameterPresentCondition(ucrNudDPMaxRain, {True}) + ' ucrChkDryPeriod.AddParameterPresentCondition(ucrNudDPOverallInterval, {True}) + ' ucrChkDryPeriod.AddParameterPresentCondition(ucrNudDPRainPeriod, {True}) 'clsMinimumRainfall.SetRCommand("instat_calculation$new") 'clsMinimumRainfall.SetAssignTo("Minimum_Rainfall") @@ -237,10 +254,12 @@ Public Class dlgStartofRains clsDayFromAndToOperator.AddParameter("to", clsROperatorParameter:=clsDayToOperator, iPosition:=1) clsDayToOperator.SetOperation("<=") clsDayToOperator.AddParameter("to", 366) + clsDayFromAndTo.SetAssignTo("Day_From_and_To") ' group clsGroupBy.SetRCommand("instat_calculation$new") clsGroupBy.AddParameter("type", Chr(34) & "by" & Chr(34)) + clsGroupBy.SetAssignTo("Grouping") 'rainydays clsRainyDays.SetRCommand("instat_calculation$new") @@ -286,6 +305,7 @@ Public Class dlgStartofRains clsTRRollingSumFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) clsTRRollingSumFunction.AddParameter("fill", "NA", iPosition:=5) clsTRRollingSum.AddParameter("save", 0, iPosition:=6) + clsTRRollingSum.SetAssignTo("rolling_sum_day") ' Quantile checked: ' this function is associated with that rdo. @@ -300,6 +320,7 @@ Public Class dlgStartofRains clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34), iPosition:=2) clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList, iPosition:=5) ' check position clsTRWetSpell.AddParameter("save", "0", iPosition:=6) + clsTRWetSpell.SetAssignTo("Wet_Spell") ' What if amount is checked?? ' move to approp. place @@ -319,6 +340,7 @@ Public Class dlgStartofRains clsRDRollingRainDaysFunction.AddParameter("fill", "NA", iPosition:=5) clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34), iPosition:=2) clsRDRollingRainDays.AddParameter("save", 0, iPosition:=6) + clsRDRollingRainDays.SetAssignTo("Rolling_rain") 'DRY SPELL clsDSDrySpell.SetRCommand("instat_calculation$new") @@ -330,6 +352,7 @@ Public Class dlgStartofRains clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34), iPosition:=1) clsDSDrySpell.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) clsDSDrySpell.AddParameter("save", 0, iPosition:=6) + clsDSDrySpell.SetAssignTo("Dry_Spell") clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsDSDryPeriodTenFunctionLead.SetRCommand("lead") @@ -344,6 +367,7 @@ Public Class dlgStartofRains clsDSDryPeriodTenFunction.AddParameter("fill", "NA", iPosition:=5) clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) clsDSDryPeriodTen.AddParameter("save", 2, iPosition:=6) + clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") 'DRY PERIOD clsDPOverallInterval.SetRCommand("instat_calculation$new") @@ -366,6 +390,7 @@ Public Class dlgStartofRains clsDPRainInDaysFunction.AddParameter("fill", "NA", iPosition:=5) clsDPRainInDays.AddParameter("result_name", Chr(34) & "Rain_in_Days" & Chr(34), iPosition:=2) ' sub calc running? clsDPRainInDays.AddParameter("save", "0", iPosition:=6) + clsDPRainInDays.SetAssignTo("Rain_Period_Length") clsDPRain.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) ' clsDPRain.AddParameter("function_exp", Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) @@ -381,6 +406,7 @@ Public Class dlgStartofRains clsDPRain.AddParameter("result_name", Chr(34) & "Above_Threshold" & Chr(34), iPosition:=1) clsDPRain.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPRainList, iPosition:=4) clsDPRain.AddParameter("save", 0, iPosition:=6) + clsDPRain.SetAssignTo("Above_Threshold") clsDPRainList.AddParameter("sub1", clsRFunctionParameter:=clsDPRainInDays, bIncludeArgumentName:=False) clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList, iPosition:=4) @@ -404,10 +430,10 @@ Public Class dlgStartofRains clsDPOverallIntervalFunction.AddParameter("fill", "NA", iPosition:=5) clsDPOverallInterval.AddParameter("result_name", Chr(34) & "DP_Overall_Interval_Rain" & Chr(34), iPosition:=2) clsDPOverallInterval.AddParameter("save", "2", iPosition:=6) + clsDPOverallInterval.SetAssignTo("Overall_Interval") - - ucrNudTRAmount.Value = 20 - ucrNudDSMaximumDays.Value = 10 + 'ucrNudTRAmount.Value = 20 + 'ucrNudDSMaximumDays.Value = 10 'DefaultNudValue() End Sub @@ -437,16 +463,20 @@ Public Class dlgStartofRains ucrReceiverRainfall.SetRCode(clsTRRollingSumFunction, bReset) 'Total Rainfall + ucrChkTotalRainfall.SetRCode(clsCombinedList, bReset) 'TODO: correct class ucrNudTROverDays.SetRCode(clsTRRollingSumFunction, bReset) ucrNudTRPercentile.SetRCode(clsTRWetSpellFunction, bReset) 'Rain Days + ucrChkNumberOfRainyDays.SetRCode(clsCombinedList, bReset) ucrNudRDOutOfDays.SetRCode(clsRDRollingRainDaysFunction, bReset) 'DrySpell + ucrChkDrySpell.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) 'TODO: correct class ucrNudDSLengthOfTime.SetRCode(clsDSDryPeriodTenFunction, bReset) 'DryPeriod + ucrChkDryPeriod.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) 'TODO: correct class ucrNudDPRainPeriod.AddAdditionalCodeParameterPair(clsDPOverallIntervalFunctionOperatorRight, New RParameter("Rain", 0), iAdditionalPairNo:=1) ucrNudDPRainPeriod.SetRCode(clsDPRainInDaysFunction, bReset) ucrNudDPMaxRain.SetRCode(clsDPRainFunctionOperator, bReset) @@ -464,17 +494,14 @@ Public Class dlgStartofRains clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")", iPosition:=4) ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) - clsDayFromAndTo.SetAssignTo("Day_From_and_To") + clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) - clsGroupBy.SetAssignTo("Grouping") clsRainyDays.AddParameter("function_exp", Chr(34) & clsRainyDaysFunction.ToScript & Chr(34)) If ucrChkTotalRainfall.Checked Then TotalRainfall() - clsTRRollingSum.SetAssignTo("rolling_sum_day") clsTRRollingSum.AddParameter("function_exp", Chr(34) & clsTRRollingSumFunction.ToScript & Chr(34)) - clsTRWetSpell.SetAssignTo("Wet_Spell") 'if quantile checked clsTRWetSpell.AddParameter("function_exp", Chr(34) & clsTRWetSpellFunction.ToScript & Chr(34), iPosition:=1) @@ -482,20 +509,15 @@ Public Class dlgStartofRains If ucrChkNumberOfRainyDays.Checked Then TotalRainyDays() - clsRDRollingRainDays.SetAssignTo("Rolling_rain") clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & clsRDRollingRainDaysFunction.ToScript & Chr(34), iPosition:=1) End If If ucrChkDrySpell.Checked Then - clsDSDrySpell.SetAssignTo("Dry_Spell") - clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & clsDSDryPeriodTenFunctionLead.ToScript & Chr(34)) End If If ucrChkDryPeriod.Checked Then - clsDPOverallInterval.SetAssignTo("Overall_Interval") - clsDPRainInDays.SetAssignTo("Rain_Period_Length") - clsDPRain.SetAssignTo("Above_Threshold") + clsDPRainInDays.AddParameter("function_exp", Chr(34) & clsDPRainInDaysFunctionLead.ToScript & Chr(34), iPosition:=2) DryPeriod() End If @@ -575,9 +597,10 @@ Public Class dlgStartofRains End If If ucrChkNumberOfRainyDays.Checked Then strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & ucrNudRDMinimumDays.Value & " & " - clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) - Else - clsCombinedList.RemoveParameterByName("sub2") + ' clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) + ' param name = sub2, setrcode(clscombinedlist) + ' Else + ' clsCombinedList.RemoveParameterByName("sub2") End If If ucrChkDrySpell.Checked Then strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " @@ -942,11 +965,11 @@ Public Class dlgStartofRains '' TestOKEnabled() ''End Sub - '''Private Sub ucrSaveStartofRains_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlValueChanged - ''' FirstDOYPerYear() - '''End Sub + ''Private Sub ucrSaveStartofRains_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlValueChanged + '' FirstDOYPerYear() + ''End Sub - '''Private Sub DefaultNudValue() - ''' nudRDOutOfDays.Value = nudTROverDays.Value ' crashes if I go to 100+, can crash upon a reset, also what if I change the nudOverDays then the nudOutofDays - then I lose my nudOverDays value I put in - '''End Sub + ''Private Sub DefaultNudValue() + '' nudRDOutOfDays.Value = nudTROverDays.Value ' crashes if I go to 100+, can crash upon a reset, also what if I change the nudOverDays then the nudOutofDays - then I lose my nudOverDays value I put in + ''End Sub End Class \ No newline at end of file From 339e6ec1f6e00e94f7fb7a2411231aa52cbdeb3b Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 20 Jun 2017 15:08:21 +0300 Subject: [PATCH 109/201] .dat file import added --- instat/dlgImportDataset.vb | 88 +++++++++++--------------------------- 1 file changed, 26 insertions(+), 62 deletions(-) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index a793bd352be..4257763cf64 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -86,19 +86,19 @@ Public Class dlgImportDataset strTempWorkbookName = "temp_workbook" ucrChkStringsAsFactors.SetText("Convert Strings to Factor Columns") - ucrChkStringsAsFactors.SetParameter(New RParameter("stringsAsFactors"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") + ucrChkStringsAsFactors.SetParameter(New RParameter("stringsAsFactors"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") ucrChkStringsAsFactors.AddFunctionNamesCondition(True, "import") ucrChkStringsAsFactors.AddFunctionNamesCondition(False, "import", False) ucrChkImportChangesLog.SetText("Import Changes log") ucrChkImportChangesLog.SetParameter(New RParameter("include_logs"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") - ucrChkImportChangesLog.AddParameterPresentCondition(True, "include_logs") - ucrChkImportChangesLog.AddFunctionNamesCondition(False, "include_logs", False) + ucrChkImportChangesLog.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrChkImportChangesLog.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) ucrChkExistingData.SetText("Keep existing data frames") ucrChkExistingData.SetParameter(New RParameter("keep_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkExistingData.AddParameterPresentCondition(True, "keep_existing") - ucrChkExistingData.AddFunctionNamesCondition(False, "keep_existing", False) + ucrChkExistingData.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrChkExistingData.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) ucrChkImportMetadata.SetText("Import metadata") @@ -122,19 +122,17 @@ Public Class dlgImportDataset ucrChkOverWrite.SetText("Overwrite existing if duplicates found") ucrChkOverWrite.SetParameter(New RParameter("overwrite_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ' ucrChkOverWrite.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrChkOverWrite.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") 'temp disabled until can easily switch between fread and read.csv 'TODO this is not an option for fread so have to change function here ucrPnlRowNames.SetParameter(New RParameter("row.names")) - ucrPnlRowNames.AddRadioButton(rdoRowNamesYes, Chr(34) & Chr(34)) - ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "NULL" & Chr(34)) - ucrPnlRowNames.SetRDefault(Chr(34) & "NULL" & Chr(34)) - rdoRowNamesYes.Enabled = False - 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator - ucrInputSeparator.Enabled = False + ucrPnlRowNames.AddRadioButton(rdoRowNamesYes, Chr(34) & "TRUE" & Chr(34)) + ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "FALSE" & Chr(34)) + ucrPnlRowNames.SetRDefault(Chr(34) & "TRUE" & Chr(34)) + 'hide since no longer using openxlsx package ucrInputNamedRegions.Hide() @@ -144,20 +142,18 @@ Public Class dlgImportDataset ucrChkMissingValueStrings.SetText("Missing Value String") ucrInputNAStrings.SetParameter(New RParameter("na.strings")) - ucrChkMissingValueStrings.AddParameterPresentCondition(True, "na.strings") ucrChkMissingValueStrings.AddParameterPresentCondition(False, "na.strings", False) + ucrChkMissingValueStrings.AddToLinkedControls(ucrInputNAStrings, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="") - ' ucrInputEncoding.SetItems({"unknown"}) ucrInputEncoding.SetParameter(New RParameter("encoding", 1)) dctucrInputEncoding.Add("Unknown", Chr(34) & "unknown" & Chr(34)) ucrInputEncoding.SetItems(dctucrInputEncoding) ucrInputEncoding.SetRDefault(Chr(34) & "unknown" & Chr(34)) ucrInputEncoding.SetDropDownStyleAsNonEditable() + 'csv options settings - ' clsImportCSV.AddParameter("check.names", "TRUE") - ' ucrInputSeparator.SetItems({"Automatic", ", ", "Whitespace", ": ", ";", "|", "^"}) ucrInputSeparator.SetParameter(New RParameter("sep")) dctucrInputSeparator.Add("Automatic", Chr(34) & "auto" & Chr(34)) dctucrInputSeparator.Add("Comma(,)", Chr(34) & "," & Chr(34)) @@ -169,8 +165,7 @@ Public Class dlgImportDataset ucrInputSeparator.SetItems(dctucrInputSeparator) ucrInputSeparator.SetRDefault(Chr(34) & "auto" & Chr(34)) ucrInputSeparator.SetDropDownStyleAsNonEditable() - 'Check...Changed NO to FALSE! - 'ucrInputHeaders.SetItems({"Automatic", "Yes", "No"}) + ucrInputHeaders.SetParameter(New RParameter("header")) dctucrInputHeaders.Add("Automatic", Chr(34) & "auto" & Chr(34)) dctucrInputHeaders.Add("Yes", Chr(34) & "TRUE" & Chr(34)) @@ -179,9 +174,7 @@ Public Class dlgImportDataset ucrInputHeaders.SetRDefault(Chr(34) & "auto" & Chr(34)) ucrInputHeaders.SetDropDownStyleAsNonEditable() - ' ucrInputDecimal.SetItems({"Automatic", ".", ","}) ucrInputDecimal.SetParameter(New RParameter("dec")) - 'dec param absent dctucrInputDecimal.Add("Automatic", Chr(34) & "auto" & Chr(34)) dctucrInputDecimal.Add("Period(.)", Chr(34) & "." & Chr(34)) dctucrInputDecimal.Add("Comma(,)", Chr(34) & "," & Chr(34)) @@ -208,7 +201,6 @@ Public Class dlgImportDataset ucrChkMaximumDataSize.SetText("Maximum Data Size") ucrInputMaximumDataSize.SetParameter(New RParameter("n_max")) - 'ucrChkMaximumDataSize.AddParameterPresentCondition(True, "n_max") ucrChkMaximumDataSize.AddParameterPresentCondition(False, "n_max", False) ucrInputMaximumDataSize.AddQuotesIfUnrecognised = False @@ -246,9 +238,7 @@ Public Class dlgImportDataset ucrInputXlMissingValueString.SetName("") clsImportCSV.AddParameter("skip", 0) clsImportExcel.AddParameter("skip", 0) - - 'rdoRowNamesNo.Checked = True - 'ucrChkStringsAsFactors.Checked = True + clsImportCSV.AddParameter("row.names", "FALSE") End Sub #Region "Shared options" @@ -389,7 +379,7 @@ Public Class dlgImportDataset ucrInputName.Hide() lblName.Hide() 'ucrInputName.SetName(strFileName, bSilent:=True) - ElseIf strFileExt = ".csv" Then + ElseIf strFileExt = ".csv" OrElse strFileExt = ".DAT" Then clsImportCSV.AddParameter("file", Chr(34) & strFilePath & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportCSV) grpRDS.Hide() @@ -397,9 +387,16 @@ Public Class dlgImportDataset grpCSV.Show() txtPreview.Enabled = True grdDataPreview.Enabled = True - strFileType = "csv" ucrInputName.SetName(strFileName, bSilent:=True) + If strFileExt = ".csv" Then + strFileType = "csv" + clsImportCSV.RemoveParameterByName("format") + Else + strFileType = "DAT" + clsImportCSV.AddParameter("format", Chr(34) & "txt" & Chr(34)) + End If RefreshFilePreview() + ElseIf strFileExt = ".xlsx" OrElse strFileExt = ".xls" Then clsImportExcel.AddParameter("file", Chr(34) & strFilePath & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportExcel) @@ -543,48 +540,12 @@ Public Class dlgImportDataset End Sub #End Region - 'Private Sub rdoRowNames_CheckedChanged() Handles ucrPnlRowNames.ControlValueChanged - ' If rdoRowNamesYes.Checked Then - ' TODO this Is Not an option for fread so have to change function here - ' clsImportCSV.AddParameter("row.names", 1) - ' Else - ' TODO find out what difference there Is between - ' row.names = NULL And row.names missing - ' disabled as import (fread) does Not support row.names - ' clsImportCSV.AddParameter("row.names", "NULL") - ' clsImportCSV.RemoveParameterByName("row.names") - ' End If - 'End Sub - - - Private Sub ucrNudSkip_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudSkip.ControlValueChanged - If bComponentsInitialised Then - If ucrNudSkip.Value = 0 Then - clsImportCSV.RemoveParameterByName("skip") - Else - clsImportCSV.AddParameter("skip", ucrNudSkip.Value) - End If - 'TODO R gives an error if skip is too large - RefreshFilePreview() - RefreshFrameView() - End If - End Sub - Private Sub cmdOpenDataSet_Click(sender As Object, e As EventArgs) Handles cmdOpenDataSet.Click GetFileFromOpenDialog() End Sub #Region "Excel options" - Private Sub setExcelDefaults() - 'ucrchkColumnNames.Checked = True - - End Sub - - Private Sub ucrChkMissingValueStrings_Load(sender As Object, e As EventArgs) - - End Sub - Private Sub FillExcelSheetsAndRegions(strFilePath As String) Dim i As Integer Dim chrSheets As CharacterVector @@ -675,6 +636,9 @@ Public Class dlgImportDataset ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) End If Else + If Not ucrInputName.UserTyped() Then + ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) + End If clsImportExcel.RemoveParameterByName("sheet") clsImportExcel.RemoveParameterByName("which") End If From 074081c0882cb139eae05995faa0971d2e56c3b0 Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 20 Jun 2017 15:39:48 +0300 Subject: [PATCH 110/201] edits --- instat/dlgImportDataset.Designer.vb | 26 +++++++++++------------ instat/dlgImportDataset.vb | 33 +++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/instat/dlgImportDataset.Designer.vb b/instat/dlgImportDataset.Designer.vb index 1127f37fedf..9db687cc974 100644 --- a/instat/dlgImportDataset.Designer.vb +++ b/instat/dlgImportDataset.Designer.vb @@ -36,6 +36,7 @@ Partial Class dlgImportDataset Me.lblLinesToSkip = New System.Windows.Forms.Label() Me.cmdOpenDataSet = New System.Windows.Forms.Button() Me.grpCSV = New System.Windows.Forms.GroupBox() + Me.ucrChkMissingValueStrings = New instat.ucrCheck() Me.ucrChkStringsAsFactors = New instat.ucrCheck() Me.ucrNudSkip = New instat.ucrNud() Me.rdoRowNamesNo = New System.Windows.Forms.RadioButton() @@ -71,7 +72,6 @@ Partial Class dlgImportDataset Me.ucrInputFilePath = New instat.ucrInputTextBox() Me.ucrInputName = New instat.ucrInputTextBox() Me.ucrBase = New instat.ucrButtons() - Me.ucrChkMissingValueStrings = New instat.ucrCheck() Me.grpCSV.SuspendLayout() Me.grpExcel.SuspendLayout() Me.grpRDS.SuspendLayout() @@ -233,7 +233,7 @@ Partial Class dlgImportDataset Me.grpCSV.Controls.Add(Me.lblSeparator) Me.grpCSV.Controls.Add(Me.lblLinesToSkip) Me.grpCSV.Controls.Add(Me.lblDecimal) - Me.grpCSV.Location = New System.Drawing.Point(449, 115) + Me.grpCSV.Location = New System.Drawing.Point(10, 86) Me.grpCSV.Name = "grpCSV" Me.grpCSV.Size = New System.Drawing.Size(219, 346) Me.grpCSV.TabIndex = 34 @@ -241,6 +241,14 @@ Partial Class dlgImportDataset Me.grpCSV.Text = "Import csv Options" Me.grpCSV.Visible = False ' + 'ucrChkMissingValueStrings + ' + Me.ucrChkMissingValueStrings.Checked = False + Me.ucrChkMissingValueStrings.Location = New System.Drawing.Point(5, 225) + Me.ucrChkMissingValueStrings.Name = "ucrChkMissingValueStrings" + Me.ucrChkMissingValueStrings.Size = New System.Drawing.Size(173, 20) + Me.ucrChkMissingValueStrings.TabIndex = 51 + ' 'ucrChkStringsAsFactors ' Me.ucrChkStringsAsFactors.Checked = False @@ -351,7 +359,7 @@ Partial Class dlgImportDataset Me.grpExcel.Controls.Add(Me.ucrInputSheets) Me.grpExcel.Controls.Add(Me.lblRowToSkip) Me.grpExcel.Controls.Add(Me.lblSheets) - Me.grpExcel.Location = New System.Drawing.Point(11, 88) + Me.grpExcel.Location = New System.Drawing.Point(1, 0) Me.grpExcel.Name = "grpExcel" Me.grpExcel.Size = New System.Drawing.Size(217, 392) Me.grpExcel.TabIndex = 35 @@ -465,12 +473,13 @@ Partial Class dlgImportDataset ' Me.grpRDS.Controls.Add(Me.ucrChkOverWrite) Me.grpRDS.Controls.Add(Me.ucrChkImportObjects) + Me.grpRDS.Controls.Add(Me.grpExcel) Me.grpRDS.Controls.Add(Me.ucrChkImportCalculations) Me.grpRDS.Controls.Add(Me.ucrChkImportChangesLog) Me.grpRDS.Controls.Add(Me.ucrChkImportFilters) Me.grpRDS.Controls.Add(Me.ucrChkImportMetadata) Me.grpRDS.Controls.Add(Me.ucrChkExistingData) - Me.grpRDS.Location = New System.Drawing.Point(226, 24) + Me.grpRDS.Location = New System.Drawing.Point(11, 86) Me.grpRDS.Name = "grpRDS" Me.grpRDS.Size = New System.Drawing.Size(217, 166) Me.grpRDS.TabIndex = 37 @@ -586,14 +595,6 @@ Partial Class dlgImportDataset Me.ucrBase.Size = New System.Drawing.Size(410, 53) Me.ucrBase.TabIndex = 27 ' - 'ucrChkMissingValueStrings - ' - Me.ucrChkMissingValueStrings.Checked = False - Me.ucrChkMissingValueStrings.Location = New System.Drawing.Point(5, 225) - Me.ucrChkMissingValueStrings.Name = "ucrChkMissingValueStrings" - Me.ucrChkMissingValueStrings.Size = New System.Drawing.Size(173, 20) - Me.ucrChkMissingValueStrings.TabIndex = 51 - ' 'dlgImportDataset ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -601,7 +602,6 @@ Partial Class dlgImportDataset Me.ClientSize = New System.Drawing.Size(679, 499) Me.Controls.Add(Me.grpRDS) Me.Controls.Add(Me.lblNoPreview) - Me.Controls.Add(Me.grpExcel) Me.Controls.Add(Me.grpCSV) Me.Controls.Add(Me.ucrInputFilePath) Me.Controls.Add(Me.lblCannotImport) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 4257763cf64..6607d847d11 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -128,10 +128,17 @@ Public Class dlgImportDataset 'temp disabled until can easily switch between fread and read.csv 'TODO this is not an option for fread so have to change function here - ucrPnlRowNames.SetParameter(New RParameter("row.names")) - ucrPnlRowNames.AddRadioButton(rdoRowNamesYes, Chr(34) & "TRUE" & Chr(34)) - ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "FALSE" & Chr(34)) - ucrPnlRowNames.SetRDefault(Chr(34) & "TRUE" & Chr(34)) + 'temp disabled until can easily switch between fread and read.csv + 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator + ucrInputSeparator.Enabled = False + ucrPnlRowNames.Enabled = False + rdoRowNamesYes.Enabled = False + rdoRowNamesNo.Enabled = False + ucrPnlRowNames.bAllowNonConditionValues = True + 'ucrPnlRowNames.SetParameter(New RParameter("row.names")) + 'ucrPnlRowNames.AddRadioButton(rdoRowNamesYes, Chr(34) & "TRUE" & Chr(34)) + 'ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "FALSE" & Chr(34)) + 'ucrPnlRowNames.SetRDefault(Chr(34) & "TRUE" & Chr(34)) 'hide since no longer using openxlsx package @@ -238,7 +245,6 @@ Public Class dlgImportDataset ucrInputXlMissingValueString.SetName("") clsImportCSV.AddParameter("skip", 0) clsImportExcel.AddParameter("skip", 0) - clsImportCSV.AddParameter("row.names", "FALSE") End Sub #Region "Shared options" @@ -476,7 +482,7 @@ Public Class dlgImportDataset clsImportCSV.AddParameter("nrows", intLines) ElseIf strFileType = "xlsx" Then 'iPosition = 0 is needed because of a bug in rio::import - 'clsReadXL.AddParameter("rows", "1:" & intLines, iPosition:=0) + 'clsImportExcel.AddParameter("rows", "1:" & intLines, iPosition:=0) End If lblCannotImport.Hide() lblNoPreview.Hide() @@ -498,7 +504,7 @@ Public Class dlgImportDataset ucrBase.clsRsyntax.RemoveParameter("nrows") ucrBase.clsRsyntax.RemoveParameter("rows") 'If readXL is not the base function this may be needed. - 'clsReadXL.RemoveParameterByName("rows") + ' clsImportExcel.RemoveParameterByName("rows") ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned = bToBeAssigned Try frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False) @@ -620,6 +626,19 @@ Public Class dlgImportDataset frmMetaData.Show() End Sub + 'Not implemented yet + 'Private Sub rdoRowNames_CheckedChanged(sender As Object, e As EventArgs) Handles rdoRowNamesYes.CheckedChanged, rdoRowNamesNo.CheckedChanged + ' If rdoRowNamesYes.Checked Then + ' 'TODO this is not an option for fread so have to change function here + ' clsReadCSV.AddParameter("row.names", 1) + ' Else + ' 'TODO find out what difference there is between + ' 'row.names = NULL and row.names missing + ' 'disabled as import (fread) does not support row.names + ' 'clsReadCSV.AddParameter("row.names", "NULL") + ' clsReadCSV.RemoveParameterByName("row.names") + ' End If + 'End Sub Private Sub ucrInputSheets_ControlValueChanged() Handles ucrInputSheets.ControlValueChanged If Not ucrInputSheets.IsEmpty() Then From 04174e5496b08aaed4b65acb535fe056b4915733 Mon Sep 17 00:00:00 2001 From: Lily Date: Tue, 20 Jun 2017 14:06:32 +0100 Subject: [PATCH 111/201] bug fixes --- instat/dlgStartofRains.vb | 107 ++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 46 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 74270ea1a47..a344fb2448f 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -13,7 +13,6 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . -Imports instat Imports instat.Translations Public Class dlgStartofRains @@ -29,7 +28,7 @@ Public Class dlgStartofRains 'Dry Period classes Private clsDPOverallInterval, clsDPOverallIntervalList, clsDPRain, clsDPRainList, clsDPRainInDays, clsDPRainInDaysFunctionLead, clsDPRainInDaysFunction, clsDPRainFunction, clsDPOverallIntervalFunction As New RFunction Private clsDPRainFunctionOperator, clsDPOverallIntervalFunctionOperator, clsDPOverallIntervalFunctionOperatorRight As New ROperator - + Private clsTRParameter, clsRDParameter, clsDSParameter, clsDPParameter As New RParameter Private strCurrDataName As String = "" Public bFirstLoad As Boolean = True Private bReset As Boolean = True @@ -95,22 +94,26 @@ Public Class dlgStartofRains ucrNudThreshold.DecimalPlaces = 2 'Total Rainfall - ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 2, False)) + ' set up panel correctly! + ucrPnlTRCalculateBy.AddRadioButton(rdoTRAmount) + ucrPnlTRCalculateBy.AddRadioButton(rdoTRPercentile) + ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "sub4", False) + ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "sub4") + ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) + + clsTRParameter.SetArgumentName("sub3") + ucrChkTotalRainfall.SetParameter(clsTRParameter, bNewChangeParameterValue:=False) + + ' ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 2, False)) ucrChkTotalRainfall.SetText("Total Rainfall") ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudTROverDays.SetLinkedDisplayControl(lblTROverDays) ucrChkTotalRainfall.AddToLinkedControls(ucrPnlTRCalculateBy, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) 'ucrChkTotalRainfall.AddParameterPresentCondition(ucrNudTROverDays, {True}) 'ucrChkTotalRainfall.AddParameterPresentCondition(ucrPnlTRCalculateBy, {True}) - ' set up panel correctly! - ucrPnlTRCalculateBy.AddRadioButton(rdoTRAmount) - ucrPnlTRCalculateBy.AddRadioButton(rdoTRPercentile) - ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "sub4", False) - ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "sub4") ' pecentile adds a function, check for amount. @@ -126,21 +129,26 @@ Public Class dlgStartofRains 'Number of Rainy days ' if checked, then it runs a function: instat_calculation$new TODO: How to do that? Do manually. + clsRDParameter.SetArgumentName("sub2") + ucrChkNumberOfRainyDays.SetParameter(clsRDParameter, bNewChangeParameterValue:=False) ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub1", clsRDRollingRainDays, 2, False)) + + ucrNudRDMinimumDays.SetParameter(New RParameter("RDMin", 1)) ' TODO, sort this ucrNudRDMinimumDays.SetLinkedDisplayControl(lblRDMinimum) - ucrNudRDMinimumDays.SetParameter(New RParameter("RDMin", 1)) - ucrNudRDOutOfDays.SetLinkedDisplayControl(lblRDWidth) ucrNudRDOutOfDays.SetParameter(New RParameter("width", 1)) + ucrNudRDOutOfDays.SetLinkedDisplayControl(lblRDWidth) + 'ucrNudRDOutOfDays.SetMinMax(1, 366) what is appropriate here? ' ucrChkNumberOfRainyDays.AddParameterPresentCondition(ucrNudRDMinimumDays, {True}) ' ucrChkNumberOfRainyDays.AddParameterPresentCondition(ucrNudRDOutOfDays, {True}) 'Dry Spell + clsDSParameter.SetArgumentName("sub1") + ucrChkDrySpell.SetParameter(clsDSParameter, bNewChangeParameterValue:=False) ucrChkDrySpell.SetText("Dry Spell") ucrChkDrySpell.AddToLinkedControls(ucrNudDSLengthOfTime, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkDrySpell.AddToLinkedControls(ucrNudDSMaximumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -152,6 +160,8 @@ Public Class dlgStartofRains ' ucrChkDrySpell.AddParameterPresentCondition(ucrNudDSMaximumDays, {True}) ' Dry Period + clsDPParameter.SetArgumentName("sub5") + ucrChkDryPeriod.SetParameter(clsDPParameter, bNewChangeParameterValue:=False) ucrChkDryPeriod.SetText("Dry Period") ucrNudDPRainPeriod.SetParameter(New RParameter("width", 1)) @@ -192,7 +202,7 @@ Public Class dlgStartofRains End Sub Private Sub SetDefaults() - ' clsAddKey = New RFunction + clsAddKey = New RFunction clsAddKeyColName = New RFunction clsDayFromAndTo = New RFunction clsDayFromAndToOperator = New ROperator @@ -244,9 +254,10 @@ Public Class dlgStartofRains clsAddKeyColName.SetRCommand("c") 'DayFromandTo + clsDayFromAndToOperator.bToScriptAsRString = True clsDayFromAndTo.SetRCommand("instat_calculation$new") clsDayFromAndTo.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) - ' clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) + clsDayFromAndTo.AddParameter("function_exp", clsROperatorParameter:=clsDayFromAndToOperator, iPosition:=1) clsDayFromAndToOperator.SetOperation("&") clsDayFromAndToOperator.AddParameter("from", clsROperatorParameter:=clsDayFromOperator, iPosition:=0) clsDayFromOperator.SetOperation(">=") @@ -262,9 +273,10 @@ Public Class dlgStartofRains clsGroupBy.SetAssignTo("Grouping") 'rainydays + clsRainyDaysFunction.bToScriptAsRString = True clsRainyDays.SetRCommand("instat_calculation$new") clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' clsRainyDays.AddParameter("function_exp", Chr(34) & clsRainyDaysFunction.ToScript & Chr(34)) + clsRainyDays.AddParameter("function_exp", clsRFunctionParameter:=clsRainyDaysFunction, iPosition:=1) clsRainyDaysFunction.SetRCommand("match") clsRainyDaysFunction.AddParameter("x", clsROperatorParameter:=clsRainyDaysOperator, iPosition:=0) clsRainyDaysOperator.SetOperation(">=") @@ -276,10 +288,11 @@ Public Class dlgStartofRains clsRainyDays.AddParameter("save", 0, iPosition:=6) ' First DOY + clsFirstDOYPerYearOperator.bToScriptAsRString = True clsFirstDOYPerYear.SetRCommand("instat_calculation$new") clsManipulationFirstDOYPerYear.SetRCommand("list") clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) - ' clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & clsFirstDOYPerYearOperator.ToScript & Chr(34), iPosition:=1) + clsFirstDOYPerYear.AddParameter("function_exp", clsROperatorParameter:=clsFirstDOYPerYearOperator, iPosition:=1) clsFirstDOYPerYearOperator.SetOperation("[") clsFirstDOYPerYearOperator.AddParameter("rightside", "1]", iPosition:=1) clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34), iPosition:=2) @@ -293,10 +306,11 @@ Public Class dlgStartofRains clsCombinedFilter.AddParameter("sub_calculations", clsRFunctionParameter:=clsCombinedList) 'TOTAL RAINFALL: associated with ucrChkTRTotalRainfall + clsTRRollingSumFunction.bToScriptAsRString = True clsTRRollingSum.SetRCommand("instat_calculation$new") clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsTRRollingSum.AddParameter("result_name", Chr(34) & "roll_sum_Rain" & Chr(34), iPosition:=2) - ' clsTRRollingSum.AddParameter("function_exp", Chr(34) & clsTRRollingSumFunction.ToScript & Chr(34), iPosition:=1) + clsTRRollingSum.AddParameter("function_exp", clsRFunctionParameter:=clsTRRollingSumFunction, iPosition:=1) clsTRRollingSumFunction.SetPackageName("zoo") clsTRRollingSumFunction.SetRCommand("rollapply") clsTRRollingSumFunction.AddParameter("width", 2, iPosition:=1) @@ -309,10 +323,11 @@ Public Class dlgStartofRains ' Quantile checked: ' this function is associated with that rdo. + clsTRWetSpellFunction.bToScriptAsRString = True clsTRWetSpellList.SetRCommand("list") clsTRWetSpell.SetRCommand("instat_calculation$new") clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - ' clsTRWetSpell.AddParameter("function_exp", Chr(34) & clsTRWetSpellFunction.ToScript & Chr(34), iPosition:=1) + clsTRWetSpell.AddParameter("function_exp", clsRFunctionParameter:=clsTRWetSpellFunction, iPosition:=1) clsTRWetSpellFunction.SetRCommand("quantile") clsTRWetSpellFunction.AddParameter("x", "roll_sum_Rain", iPosition:=0) clsTRWetSpellFunction.AddParameter("probs", 0.8, iPosition:=1) ' do I write: 0.8 or "0.8"? @@ -322,14 +337,18 @@ Public Class dlgStartofRains clsTRWetSpell.AddParameter("save", "0", iPosition:=6) clsTRWetSpell.SetAssignTo("Wet_Spell") + clsTRParameter.SetArgument(clsTRRollingSum) + ' What if amount is checked?? ' move to approp. place ' RAINY DAY + clsRDRollingRainDaysFunction.bToScriptAsRString = True clsRDRollingRainDays.SetRCommand("instat_calculation$new") clsRDRollingRainDaysSub.SetRCommand("list") clsRDRollingRainDays.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsRDRollingRainDays.AddParameter("function_exp", clsRFunctionParameter:=clsRDRollingRainDaysFunction, iPosition:=1) clsRDRollingRainDaysFunction.SetPackageName("zoo") clsRDRollingRainDaysFunction.SetRCommand("rollapply") clsRDRollingRainDaysFunction.AddParameter("data", "rain_day", iPosition:=0) @@ -342,6 +361,8 @@ Public Class dlgStartofRains clsRDRollingRainDays.AddParameter("save", 0, iPosition:=6) clsRDRollingRainDays.SetAssignTo("Rolling_rain") + clsRDParameter.SetArgument(clsRDRollingRainDays) + 'DRY SPELL clsDSDrySpell.SetRCommand("instat_calculation$new") clsDSDryPeriodTen.SetRCommand("instat_calculation$new") @@ -354,7 +375,9 @@ Public Class dlgStartofRains clsDSDrySpell.AddParameter("save", 0, iPosition:=6) clsDSDrySpell.SetAssignTo("Dry_Spell") + clsDSDryPeriodTenFunctionLead.bToScriptAsRString = True clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsDSDryPeriodTen.AddParameter("function_exp", clsRFunctionParameter:=clsDSDryPeriodTenFunctionLead) clsDSDryPeriodTenFunctionLead.SetRCommand("lead") clsDSDryPeriodTenFunctionLead.AddParameter("x", clsRFunctionParameter:=clsDSDryPeriodTenFunction) clsDSDryPeriodTenFunction.SetPackageName("zoo") @@ -369,7 +392,10 @@ Public Class dlgStartofRains clsDSDryPeriodTen.AddParameter("save", 2, iPosition:=6) clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") + clsDSParameter.SetArgument(clsDSDryPeriodTen) + 'DRY PERIOD + clsDPRainInDaysFunctionLead.bToScriptAsRString = True clsDPOverallInterval.SetRCommand("instat_calculation$new") clsDPOverallIntervalList.SetRCommand("list") clsDPRainList.SetRCommand("list") @@ -378,7 +404,7 @@ Public Class dlgStartofRains clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) 'width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - 'clsDPRainInDays.AddParameter("function_exp", Chr(34) & clsDPRainInDaysFunctionLead.ToScript & Chr(34), iPosition:=2) + clsDPRainInDays.AddParameter("function_exp", clsRFunctionParameter:=clsDPRainInDaysFunctionLead, iPosition:=2) clsDPRainInDaysFunctionLead.SetRCommand("lead") ' i assume lead is wanted if it's the NEXT x days. clsDPRainInDaysFunctionLead.AddParameter("x", clsRFunctionParameter:=clsDPRainInDaysFunction) clsDPRainInDaysFunction.SetPackageName("zoo") @@ -411,10 +437,10 @@ Public Class dlgStartofRains clsDPRainList.AddParameter("sub1", clsRFunctionParameter:=clsDPRainInDays, bIncludeArgumentName:=False) clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList, iPosition:=4) clsDPOverallIntervalList.AddParameter("sub1", clsRFunctionParameter:=clsDPRain, bIncludeArgumentName:=False) - clsDPOverallInterval.AddParameter("function_exp", Chr(34) & clsDPOverallIntervalFunction.ToScript & Chr(34), iPosition:=1) + clsDPOverallIntervalFunction.bToScriptAsRString = True clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - 'clsDPOverallInterval.AddParameter("function_exp", Chr(34) & clsDPOverallIntervalFunction.ToScript & Chr(34), iPosition:=1) + clsDPOverallInterval.AddParameter("function_exp", clsRFunctionParameter:=clsDPOverallIntervalFunction, iPosition:=1) clsDPOverallIntervalFunction.SetRCommand("rollapply") clsDPOverallIntervalFunction.AddParameter("data", "Above_Threshold", iPosition:=0) clsDPOverallIntervalFunction.AddParameter("width", clsROperatorParameter:=clsDPOverallIntervalFunctionOperator, iPosition:=1) @@ -432,6 +458,8 @@ Public Class dlgStartofRains clsDPOverallInterval.AddParameter("save", "2", iPosition:=6) clsDPOverallInterval.SetAssignTo("Overall_Interval") + clsDPParameter.SetArgument(clsDPOverallInterval) + 'ucrNudTRAmount.Value = 20 'ucrNudDSMaximumDays.Value = 10 'DefaultNudValue() @@ -472,11 +500,11 @@ Public Class dlgStartofRains ucrNudRDOutOfDays.SetRCode(clsRDRollingRainDaysFunction, bReset) 'DrySpell - ucrChkDrySpell.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) 'TODO: correct class + ucrChkDrySpell.SetRCode(clsCombinedList, bReset) 'TODO: correct class ucrNudDSLengthOfTime.SetRCode(clsDSDryPeriodTenFunction, bReset) 'DryPeriod - ucrChkDryPeriod.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) 'TODO: correct class + ucrChkDryPeriod.SetRCode(clsCombinedList, bReset) 'TODO: correct class ucrNudDPRainPeriod.AddAdditionalCodeParameterPair(clsDPOverallIntervalFunctionOperatorRight, New RParameter("Rain", 0), iAdditionalPairNo:=1) ucrNudDPRainPeriod.SetRCode(clsDPRainInDaysFunction, bReset) ucrNudDPMaxRain.SetRCode(clsDPRainFunctionOperator, bReset) @@ -494,34 +522,21 @@ Public Class dlgStartofRains clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")", iPosition:=4) ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) - - clsDayFromAndTo.AddParameter("function_exp", Chr(34) & clsDayFromAndToOperator.ToScript & Chr(34), iPosition:=1) - - - clsRainyDays.AddParameter("function_exp", Chr(34) & clsRainyDaysFunction.ToScript & Chr(34)) If ucrChkTotalRainfall.Checked Then TotalRainfall() - clsTRRollingSum.AddParameter("function_exp", Chr(34) & clsTRRollingSumFunction.ToScript & Chr(34)) - - 'if quantile checked - clsTRWetSpell.AddParameter("function_exp", Chr(34) & clsTRWetSpellFunction.ToScript & Chr(34), iPosition:=1) End If If ucrChkNumberOfRainyDays.Checked Then TotalRainyDays() - clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & clsRDRollingRainDaysFunction.ToScript & Chr(34), iPosition:=1) End If If ucrChkDrySpell.Checked Then - clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & clsDSDryPeriodTenFunctionLead.ToScript & Chr(34)) End If If ucrChkDryPeriod.Checked Then - clsDPRainInDays.AddParameter("function_exp", Chr(34) & clsDPRainInDaysFunctionLead.ToScript & Chr(34), iPosition:=2) DryPeriod() End If - clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & clsFirstDOYPerYearOperator.ToScript & Chr(34), iPosition:=1) CombinedFilter() End Sub @@ -591,9 +606,9 @@ Public Class dlgStartofRains clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) End If strTempFunExpression = strTempFunExpression & " & " - clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) + 'clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) Else - clsCombinedList.RemoveParameterByName("sub3") + 'clsCombinedList.RemoveParameterByName("sub3") End If If ucrChkNumberOfRainyDays.Checked Then strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & ucrNudRDMinimumDays.Value & " & " @@ -604,15 +619,15 @@ Public Class dlgStartofRains End If If ucrChkDrySpell.Checked Then strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " - clsCombinedList.AddParameter("sub1", clsRFunctionParameter:=clsDSDryPeriodTen, bIncludeArgumentName:=False) - Else - clsCombinedList.RemoveParameterByName("sub1") + ' clsCombinedList.AddParameter("sub1", clsRFunctionParameter:=clsDSDryPeriodTen, bIncludeArgumentName:=False) + 'Else + ' clsCombinedList.RemoveParameterByName("sub1") End If If ucrChkDryPeriod.Checked Then strTempFunExpression = strTempFunExpression & "DP_Overall_Interval_Rain == 0 " & " & " - clsCombinedList.AddParameter("sub5", clsRFunctionParameter:=clsDPOverallInterval, bIncludeArgumentName:=False) - Else - clsCombinedList.RemoveParameterByName("sub5") + ' clsCombinedList.AddParameter("sub5", clsRFunctionParameter:=clsDPOverallInterval, bIncludeArgumentName:=False) + 'Else + ' clsCombinedList.RemoveParameterByName("sub5") End If strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) From 0c3d6395ac2a698e72e838e949b870c4a608377c Mon Sep 17 00:00:00 2001 From: Lily Date: Tue, 20 Jun 2017 15:59:32 +0100 Subject: [PATCH 112/201] Startof rains updates + class/core chnages --- instat/clsRCodeStructure.vb | 26 +++++++++++++++-- instat/clsRFunction.vb | 27 ++++++----------- instat/clsROperator.vb | 25 +++++++--------- instat/dlgStartofRains.vb | 29 +++++++------------ instat/static/InstatObject/R/data_object_R6.R | 3 ++ 5 files changed, 56 insertions(+), 54 deletions(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index 03d265c9d9f..47a93633960 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -384,8 +384,30 @@ Public Class RCodeStructure End Sub Public Overridable Function Clone() As RCodeStructure - Dim clsTemp As New RCodeStructure - Return clsTemp + Dim clsTempCode As New RCodeStructure + Dim clsRParam As RParameter + + clsTempCode.strAssignTo = strAssignTo + clsTempCode.strAssignToDataFrame = strAssignToDataFrame + clsTempCode.strAssignToColumn = strAssignToColumn + clsTempCode.strAssignToModel = strAssignToModel + clsTempCode.strAssignToGraph = strAssignToGraph + clsTempCode.strAssignToTable = strAssignToTable + clsTempCode.bToBeAssigned = bToBeAssigned + clsTempCode.bIsAssigned = bIsAssigned + clsTempCode.bAssignToIsPrefix = bAssignToIsPrefix + clsTempCode.bAssignToColumnWithoutNames = bAssignToColumnWithoutNames + clsTempCode.bInsertColumnBefore = bInsertColumnBefore + clsTempCode.iNumberOfAddedParameters = iNumberOfAddedParameters + clsTempCode.iPosition = iPosition + clsTempCode.iCallType = iCallType + clsTempCode.bExcludeAssignedFunctionOutput = bExcludeAssignedFunctionOutput + clsTempCode.bClearFromGlobal = bClearFromGlobal + clsTempCode.bToScriptAsRString = bToScriptAsRString + For Each clsRParam In clsParameters + clsTempCode.AddParameter(clsRParam.Clone) + Next + Return clsTempCode End Function Public Sub GetAllAssignTo(lstCodes As List(Of RCodeStructure), lstValues As List(Of String)) diff --git a/instat/clsRFunction.vb b/instat/clsRFunction.vb index 452aa6b4ab5..4d4ff7061d9 100644 --- a/instat/clsRFunction.vb +++ b/instat/clsRFunction.vb @@ -88,27 +88,18 @@ Public Class RFunction End Sub Public Overrides Function Clone() As RCodeStructure - Dim clsRFunction As New RFunction - Dim clsRParam As RParameter - - clsRFunction.strPackageName = strPackageName - clsRFunction.strRCommand = strRCommand - clsRFunction.strAssignTo = strAssignTo - clsRFunction.strAssignToDataFrame = strAssignToDataFrame - clsRFunction.strAssignToColumn = strAssignToColumn - clsRFunction.strAssignToModel = strAssignToModel - clsRFunction.strAssignToGraph = strAssignToGraph - clsRFunction.bToBeAssigned = bToBeAssigned - clsRFunction.bIsAssigned = bIsAssigned - clsRFunction.bAssignToIsPrefix = bAssignToIsPrefix - - For Each clsRParam In clsParameters - clsRFunction.AddParameter(clsRParam.Clone) - Next + Dim clsTempCode As RCodeStructure + clsTempCode = MyBase.Clone() + clsRFunction = TryCast(clsTempCode, RFunction) + If clsRFunction IsNot Nothing Then + clsRFunction.strPackageName = strPackageName + clsRFunction.strRCommand = strRCommand + Else + clsRFunction = New RFunction + End If Return clsRFunction - End Function Public ReadOnly Property iParameterCount() As Integer diff --git a/instat/clsROperator.vb b/instat/clsROperator.vb index 516b10b2884..719c345823a 100644 --- a/instat/clsROperator.vb +++ b/instat/clsROperator.vb @@ -99,22 +99,17 @@ Public Class ROperator Public Overrides Function Clone() As RCodeStructure Dim clsTempROperator As New ROperator + Dim clsTempCode As RCodeStructure - clsTempROperator.strOperation = strOperation - clsTempROperator.bBrackets = bBrackets - clsTempROperator.strAssignTo = strAssignTo - clsTempROperator.strAssignToDataFrame = strAssignToDataFrame - clsTempROperator.strAssignToColumn = strAssignToColumn - clsTempROperator.strAssignToModel = strAssignToModel - clsTempROperator.strAssignToGraph = strAssignToGraph - clsTempROperator.bToBeAssigned = bToBeAssigned - clsTempROperator.bIsAssigned = bIsAssigned - clsTempROperator.bForceIncludeOperation = bForceIncludeOperation - clsTempROperator.bAssignToIsPrefix = bAssignToIsPrefix - - For Each clsParam As RParameter In MyBase.clsParameters - clsTempROperator.AddParameter(clsParam.Clone) - Next + clsTempCode = MyBase.Clone() + clsTempROperator = TryCast(clsTempCode, ROperator) + If clsTempROperator IsNot Nothing Then + clsTempROperator.bForceIncludeOperation = bForceIncludeOperation + clsTempROperator.strOperation = strOperation + clsTempROperator.bBrackets = bBrackets + Else + clsTempROperator = New ROperator + End If Return clsTempROperator End Function End Class \ No newline at end of file diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index a344fb2448f..a825b88dd58 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -17,7 +17,7 @@ Imports instat.Translations Public Class dlgStartofRains Public clsRainyDays, clsRainyDaysFunction, clsFirstDOYPerYear, clsManipulationFirstDOYPerYear, clsCombinedFilter, clsCombinedList As New RFunction - Private clsDayFromAndTo, clsGroupBy, clsAddKey, clsAddKeyColName As New RFunction + Private clsDayFromAndTo, clsGroupBy, clsAddKey, clsAddKeyColName, clsApplyInstatFunction As New RFunction Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator, clsRainyDaysOperator, clsFirstDOYPerYearOperator As New ROperator 'Total Rainfall classes Private clsTRRollingSum, clsTRRollingSumFunction, clsTRWetSpell, clsTRWetSpellList, clsTRWetSpellFunction As New RFunction @@ -114,7 +114,6 @@ Public Class dlgStartofRains 'ucrChkTotalRainfall.AddParameterPresentCondition(ucrNudTROverDays, {True}) 'ucrChkTotalRainfall.AddParameterPresentCondition(ucrPnlTRCalculateBy, {True}) - ' pecentile adds a function, check for amount. ' nud @@ -143,9 +142,6 @@ Public Class dlgStartofRains 'ucrNudRDOutOfDays.SetMinMax(1, 366) what is appropriate here? - ' ucrChkNumberOfRainyDays.AddParameterPresentCondition(ucrNudRDMinimumDays, {True}) - ' ucrChkNumberOfRainyDays.AddParameterPresentCondition(ucrNudRDOutOfDays, {True}) - 'Dry Spell clsDSParameter.SetArgumentName("sub1") ucrChkDrySpell.SetParameter(clsDSParameter, bNewChangeParameterValue:=False) @@ -156,8 +152,7 @@ Public Class dlgStartofRains ucrNudDSMaximumDays.SetLinkedDisplayControl(lblDSMaximumDays) ucrNudDSLengthOfTime.SetParameter(New RParameter("width", 1)) ' what is a min/max for this - ' ucrChkDrySpell.AddParameterPresentCondition(ucrNudDSLengthOfTime, {True}) - ' ucrChkDrySpell.AddParameterPresentCondition(ucrNudDSMaximumDays, {True}) + ' Dry Period clsDPParameter.SetArgumentName("sub5") @@ -177,18 +172,8 @@ Public Class dlgStartofRains ucrChkDryPeriod.AddToLinkedControls(ucrNudDPMaxRain, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkDryPeriod.AddToLinkedControls(ucrNudDPOverallInterval, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkDryPeriod.AddToLinkedControls(ucrNudDPRainPeriod, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ' ucrChkDryPeriod.AddParameterPresentCondition(ucrNudDPMaxRain, {True}) - ' ucrChkDryPeriod.AddParameterPresentCondition(ucrNudDPOverallInterval, {True}) - ' ucrChkDryPeriod.AddParameterPresentCondition(ucrNudDPRainPeriod, {True}) - - 'clsMinimumRainfall.SetRCommand("instat_calculation$new") - 'clsMinimumRainfall.SetAssignTo("Minimum_Rainfall") - 'clsWithinThirtyDays.SetRCommand("instat_calculation$new") - 'clsWithinThirtyDays.SetAssignTo("dry_spell_10") - ucrBase.clsRsyntax.SetFunction(frmMain.clsRLink.strInstatDataObject & "$apply_instat_calculation") - ucrReceiverYear.Selector = ucrSelectorForStartofRains ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) ucrReceiverYear.bAutoFill = True @@ -243,6 +228,7 @@ Public Class dlgStartofRains clsDPOverallIntervalFunction = New RFunction clsDPOverallIntervalFunctionOperator = New ROperator clsDPOverallIntervalFunctionOperatorRight = New ROperator + clsApplyInstatFunction = New RFunction ucrReceiverDate.SetMeAsReceiver() ucrSaveStartofRains.Reset() @@ -460,6 +446,12 @@ Public Class dlgStartofRains clsDPParameter.SetArgument(clsDPOverallInterval) + clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") + clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) + + 'Base Function + ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) + 'ucrNudTRAmount.Value = 20 'ucrNudDSMaximumDays.Value = 10 'DefaultNudValue() @@ -520,7 +512,7 @@ Public Class dlgStartofRains clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear, iPosition:=5) ' if I run this in SetDefaults, will this update automatically clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")", iPosition:=4) - ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) + clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear, iPosition:=0) If ucrChkTotalRainfall.Checked Then TotalRainfall() @@ -588,7 +580,6 @@ Public Class dlgStartofRains Private Sub DryPeriod() clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=5) - clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") End Sub Private Sub CombinedFilter() diff --git a/instat/static/InstatObject/R/data_object_R6.R b/instat/static/InstatObject/R/data_object_R6.R index 24e985796a0..2a1cbf275e5 100644 --- a/instat/static/InstatObject/R/data_object_R6.R +++ b/instat/static/InstatObject/R/data_object_R6.R @@ -107,6 +107,9 @@ data_object$set("public", "set_data", function(new_data, messages=TRUE, check_na ind <- zoo::index(new_data) new_data <- data.frame(index = ind, value = new_data) } + else if(is.array(new_data)) { + new_data <- as.data.frame(new_data) + } else if(is.vector(new_data) && !is.list(new_data)) { new_data <- as.data.frame(new_data) } From 69fb8a76cafd828082b52ca39a870c29e57b0fda Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Tue, 20 Jun 2017 16:07:42 +0100 Subject: [PATCH 113/201] updated merge dialog and sub dialog added subset of columns functionality --- instat/dlgMerge.Designer.vb | 292 +++++-------------- instat/dlgMerge.vb | 261 ++++++----------- instat/sdgMerge.Designer.vb | 463 +++++++++++++++++++++++-------- instat/sdgMerge.resx | 21 -- instat/sdgMerge.vb | 260 +++++++++++++++-- instat/ucrDataFrame.vb | 4 + instat/ucrInputComboBox.vb | 12 +- instat/ucrSelectorByDataFrame.vb | 4 + 8 files changed, 757 insertions(+), 560 deletions(-) diff --git a/instat/dlgMerge.Designer.vb b/instat/dlgMerge.Designer.vb index 24e5df2ec64..3206100a150 100644 --- a/instat/dlgMerge.Designer.vb +++ b/instat/dlgMerge.Designer.vb @@ -22,236 +22,85 @@ Partial Class dlgMerge 'Do not modify it using the code editor. Private Sub InitializeComponent() - Me.lblFirstDataFrame = New System.Windows.Forms.Label() - Me.lblSecondDataFrame = New System.Windows.Forms.Label() - Me.lblNewDataFrameName = New System.Windows.Forms.Label() - Me.ucrNewDataFrameName = New instat.ucrInputTextBox() - Me.ucrBase = New instat.ucrButtons() - Me.pnlKeyColumns = New System.Windows.Forms.Panel() - Me.cmdRemoveAll = New System.Windows.Forms.Button() - Me.lstKeyColumns = New System.Windows.Forms.ListView() - Me.lblKeyColumns = New System.Windows.Forms.Label() - Me.cmdRemoveSelectedPair = New System.Windows.Forms.Button() - Me.rdoByAllMatching = New System.Windows.Forms.RadioButton() - Me.rdoChooseColumns = New System.Windows.Forms.RadioButton() - Me.grpKeys = New System.Windows.Forms.GroupBox() - Me.cmdAddPair = New System.Windows.Forms.Button() - Me.lblFirstKeyMatch = New System.Windows.Forms.Label() - Me.ucrReceiverSecondDF = New instat.ucrReceiverSingle() - Me.ucrReceiverFirstDF = New instat.ucrReceiverSingle() - Me.ucrSelectorFirstDF = New instat.ucrSelectorByDataFrameAddRemove() - Me.ucrSelectorSecondDF = New instat.ucrSelectorByDataFrameAddRemove() Me.cmdJoinOptions = New System.Windows.Forms.Button() - Me.pnlKeyColumns.SuspendLayout() - Me.grpKeys.SuspendLayout() + Me.lnlJoinType = New System.Windows.Forms.Label() + Me.ucrSaveMerge = New instat.ucrSave() + Me.ucrInputJoinType = New instat.ucrInputComboBox() + Me.ucrSecondDataFrame = New instat.ucrDataFrame() + Me.ucrFirstDataFrame = New instat.ucrDataFrame() + Me.ucrBase = New instat.ucrButtons() Me.SuspendLayout() ' - 'lblFirstDataFrame - ' - Me.lblFirstDataFrame.AutoSize = True - Me.lblFirstDataFrame.Location = New System.Drawing.Point(10, 11) - Me.lblFirstDataFrame.Name = "lblFirstDataFrame" - Me.lblFirstDataFrame.Size = New System.Drawing.Size(133, 13) - Me.lblFirstDataFrame.TabIndex = 3 - Me.lblFirstDataFrame.Text = "First Data Frame To Merge" - ' - 'lblSecondDataFrame - ' - Me.lblSecondDataFrame.AutoSize = True - Me.lblSecondDataFrame.Location = New System.Drawing.Point(224, 13) - Me.lblSecondDataFrame.Name = "lblSecondDataFrame" - Me.lblSecondDataFrame.Size = New System.Drawing.Size(151, 13) - Me.lblSecondDataFrame.TabIndex = 4 - Me.lblSecondDataFrame.Text = "Second Data Frame To Merge" - ' - 'lblNewDataFrameName - ' - Me.lblNewDataFrameName.AutoSize = True - Me.lblNewDataFrameName.Location = New System.Drawing.Point(5, 364) - Me.lblNewDataFrameName.Name = "lblNewDataFrameName" - Me.lblNewDataFrameName.Size = New System.Drawing.Size(118, 13) - Me.lblNewDataFrameName.TabIndex = 9 - Me.lblNewDataFrameName.Text = "New Data Frame Name" - ' - 'ucrNewDataFrameName - ' - Me.ucrNewDataFrameName.IsReadOnly = False - Me.ucrNewDataFrameName.Location = New System.Drawing.Point(129, 361) - Me.ucrNewDataFrameName.Name = "ucrNewDataFrameName" - Me.ucrNewDataFrameName.Size = New System.Drawing.Size(277, 21) - Me.ucrNewDataFrameName.TabIndex = 10 - ' - 'ucrBase - ' - Me.ucrBase.Location = New System.Drawing.Point(8, 388) - Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(410, 53) - Me.ucrBase.TabIndex = 0 - ' - 'pnlKeyColumns - ' - Me.pnlKeyColumns.Controls.Add(Me.cmdRemoveAll) - Me.pnlKeyColumns.Controls.Add(Me.lstKeyColumns) - Me.pnlKeyColumns.Controls.Add(Me.lblKeyColumns) - Me.pnlKeyColumns.Controls.Add(Me.cmdRemoveSelectedPair) - Me.pnlKeyColumns.Location = New System.Drawing.Point(431, 185) - Me.pnlKeyColumns.Name = "pnlKeyColumns" - Me.pnlKeyColumns.Size = New System.Drawing.Size(194, 256) - Me.pnlKeyColumns.TabIndex = 21 - ' - 'cmdRemoveAll - ' - Me.cmdRemoveAll.Location = New System.Drawing.Point(6, 223) - Me.cmdRemoveAll.Name = "cmdRemoveAll" - Me.cmdRemoveAll.Size = New System.Drawing.Size(99, 23) - Me.cmdRemoveAll.TabIndex = 18 - Me.cmdRemoveAll.Text = "Remove All Pairs" - Me.cmdRemoveAll.UseVisualStyleBackColor = True - ' - 'lstKeyColumns - ' - Me.lstKeyColumns.FullRowSelect = True - Me.lstKeyColumns.Location = New System.Drawing.Point(6, 21) - Me.lstKeyColumns.Name = "lstKeyColumns" - Me.lstKeyColumns.Size = New System.Drawing.Size(185, 167) - Me.lstKeyColumns.TabIndex = 12 - Me.lstKeyColumns.UseCompatibleStateImageBehavior = False - Me.lstKeyColumns.View = System.Windows.Forms.View.Details - ' - 'lblKeyColumns - ' - Me.lblKeyColumns.AutoSize = True - Me.lblKeyColumns.Location = New System.Drawing.Point(3, 5) - Me.lblKeyColumns.Name = "lblKeyColumns" - Me.lblKeyColumns.Size = New System.Drawing.Size(68, 13) - Me.lblKeyColumns.TabIndex = 17 - Me.lblKeyColumns.Text = "Key Columns" - ' - 'cmdRemoveSelectedPair - ' - Me.cmdRemoveSelectedPair.Location = New System.Drawing.Point(6, 194) - Me.cmdRemoveSelectedPair.Name = "cmdRemoveSelectedPair" - Me.cmdRemoveSelectedPair.Size = New System.Drawing.Size(130, 23) - Me.cmdRemoveSelectedPair.TabIndex = 17 - Me.cmdRemoveSelectedPair.Text = "Remove Selected Pair" - Me.cmdRemoveSelectedPair.UseVisualStyleBackColor = True - ' - 'rdoByAllMatching - ' - Me.rdoByAllMatching.AutoSize = True - Me.rdoByAllMatching.Location = New System.Drawing.Point(8, 226) - Me.rdoByAllMatching.Name = "rdoByAllMatching" - Me.rdoByAllMatching.Size = New System.Drawing.Size(221, 17) - Me.rdoByAllMatching.TabIndex = 22 - Me.rdoByAllMatching.TabStop = True - Me.rdoByAllMatching.Text = "Merge by all columns with the same name" - Me.rdoByAllMatching.UseVisualStyleBackColor = True - ' - 'rdoChooseColumns - ' - Me.rdoChooseColumns.AutoSize = True - Me.rdoChooseColumns.Location = New System.Drawing.Point(230, 226) - Me.rdoChooseColumns.Name = "rdoChooseColumns" - Me.rdoChooseColumns.Size = New System.Drawing.Size(192, 17) - Me.rdoChooseColumns.TabIndex = 23 - Me.rdoChooseColumns.TabStop = True - Me.rdoChooseColumns.Text = "Choose which columns to merge by" - Me.rdoChooseColumns.UseVisualStyleBackColor = True - ' - 'grpKeys - ' - Me.grpKeys.Controls.Add(Me.cmdAddPair) - Me.grpKeys.Controls.Add(Me.lblFirstKeyMatch) - Me.grpKeys.Controls.Add(Me.ucrReceiverSecondDF) - Me.grpKeys.Controls.Add(Me.ucrReceiverFirstDF) - Me.grpKeys.Location = New System.Drawing.Point(9, 251) - Me.grpKeys.Name = "grpKeys" - Me.grpKeys.Size = New System.Drawing.Size(335, 76) - Me.grpKeys.TabIndex = 24 - Me.grpKeys.TabStop = False - Me.grpKeys.Text = "Key Columns" - ' - 'cmdAddPair + 'cmdJoinOptions ' - Me.cmdAddPair.Location = New System.Drawing.Point(4, 46) - Me.cmdAddPair.Name = "cmdAddPair" - Me.cmdAddPair.Size = New System.Drawing.Size(118, 23) - Me.cmdAddPair.TabIndex = 16 - Me.cmdAddPair.Text = "Add Pair" - Me.cmdAddPair.UseVisualStyleBackColor = True + Me.cmdJoinOptions.Location = New System.Drawing.Point(8, 121) + Me.cmdJoinOptions.Name = "cmdJoinOptions" + Me.cmdJoinOptions.Size = New System.Drawing.Size(115, 23) + Me.cmdJoinOptions.TabIndex = 4 + Me.cmdJoinOptions.Text = "Merge Options" + Me.cmdJoinOptions.UseVisualStyleBackColor = True ' - 'lblFirstKeyMatch + 'lnlJoinType ' - Me.lblFirstKeyMatch.AutoSize = True - Me.lblFirstKeyMatch.Location = New System.Drawing.Point(128, 22) - Me.lblFirstKeyMatch.Name = "lblFirstKeyMatch" - Me.lblFirstKeyMatch.Size = New System.Drawing.Size(74, 13) - Me.lblFirstKeyMatch.TabIndex = 9 - Me.lblFirstKeyMatch.Text = "Matched With" + Me.lnlJoinType.AutoSize = True + Me.lnlJoinType.Location = New System.Drawing.Point(9, 88) + Me.lnlJoinType.Name = "lnlJoinType" + Me.lnlJoinType.Size = New System.Drawing.Size(56, 13) + Me.lnlJoinType.TabIndex = 2 + Me.lnlJoinType.Text = "Join Type:" ' - 'ucrReceiverSecondDF + 'ucrSaveMerge ' - Me.ucrReceiverSecondDF.Location = New System.Drawing.Point(205, 20) - Me.ucrReceiverSecondDF.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverSecondDF.Name = "ucrReceiverSecondDF" - Me.ucrReceiverSecondDF.Selector = Nothing - Me.ucrReceiverSecondDF.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverSecondDF.TabIndex = 8 + Me.ucrSaveMerge.Location = New System.Drawing.Point(9, 155) + Me.ucrSaveMerge.Name = "ucrSaveMerge" + Me.ucrSaveMerge.Size = New System.Drawing.Size(301, 24) + Me.ucrSaveMerge.TabIndex = 5 ' - 'ucrReceiverFirstDF + 'ucrInputJoinType ' - Me.ucrReceiverFirstDF.Location = New System.Drawing.Point(4, 20) - Me.ucrReceiverFirstDF.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverFirstDF.Name = "ucrReceiverFirstDF" - Me.ucrReceiverFirstDF.Selector = Nothing - Me.ucrReceiverFirstDF.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverFirstDF.TabIndex = 7 + Me.ucrInputJoinType.AddQuotesIfUnrecognised = True + Me.ucrInputJoinType.IsReadOnly = False + Me.ucrInputJoinType.Location = New System.Drawing.Point(71, 85) + Me.ucrInputJoinType.Name = "ucrInputJoinType" + Me.ucrInputJoinType.Size = New System.Drawing.Size(137, 21) + Me.ucrInputJoinType.TabIndex = 3 ' - 'ucrSelectorFirstDF + 'ucrSecondDataFrame ' - Me.ucrSelectorFirstDF.bShowHiddenColumns = False - Me.ucrSelectorFirstDF.bUseCurrentFilter = True - Me.ucrSelectorFirstDF.Location = New System.Drawing.Point(10, 34) - Me.ucrSelectorFirstDF.Margin = New System.Windows.Forms.Padding(0) - Me.ucrSelectorFirstDF.Name = "ucrSelectorFirstDF" - Me.ucrSelectorFirstDF.Size = New System.Drawing.Size(210, 180) - Me.ucrSelectorFirstDF.TabIndex = 25 + Me.ucrSecondDataFrame.bUseCurrentFilter = True + Me.ucrSecondDataFrame.Location = New System.Drawing.Point(209, 22) + Me.ucrSecondDataFrame.Margin = New System.Windows.Forms.Padding(0) + Me.ucrSecondDataFrame.Name = "ucrSecondDataFrame" + Me.ucrSecondDataFrame.Size = New System.Drawing.Size(120, 50) + Me.ucrSecondDataFrame.TabIndex = 1 ' - 'ucrSelectorSecondDF + 'ucrFirstDataFrame ' - Me.ucrSelectorSecondDF.bShowHiddenColumns = False - Me.ucrSelectorSecondDF.bUseCurrentFilter = True - Me.ucrSelectorSecondDF.Location = New System.Drawing.Point(226, 34) - Me.ucrSelectorSecondDF.Margin = New System.Windows.Forms.Padding(0) - Me.ucrSelectorSecondDF.Name = "ucrSelectorSecondDF" - Me.ucrSelectorSecondDF.Size = New System.Drawing.Size(210, 180) - Me.ucrSelectorSecondDF.TabIndex = 26 + Me.ucrFirstDataFrame.bUseCurrentFilter = True + Me.ucrFirstDataFrame.Location = New System.Drawing.Point(9, 22) + Me.ucrFirstDataFrame.Margin = New System.Windows.Forms.Padding(0) + Me.ucrFirstDataFrame.Name = "ucrFirstDataFrame" + Me.ucrFirstDataFrame.Size = New System.Drawing.Size(120, 50) + Me.ucrFirstDataFrame.TabIndex = 0 ' - 'cmdJoinOptions + 'ucrBase ' - Me.cmdJoinOptions.Location = New System.Drawing.Point(9, 333) - Me.cmdJoinOptions.Name = "cmdJoinOptions" - Me.cmdJoinOptions.Size = New System.Drawing.Size(115, 23) - Me.cmdJoinOptions.TabIndex = 27 - Me.cmdJoinOptions.Text = "Join Options" - Me.cmdJoinOptions.UseVisualStyleBackColor = True + Me.ucrBase.Location = New System.Drawing.Point(8, 185) + Me.ucrBase.Name = "ucrBase" + Me.ucrBase.Size = New System.Drawing.Size(410, 53) + Me.ucrBase.TabIndex = 6 ' 'dlgMerge ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(624, 441) + Me.ClientSize = New System.Drawing.Size(418, 239) + Me.Controls.Add(Me.ucrSaveMerge) + Me.Controls.Add(Me.lnlJoinType) + Me.Controls.Add(Me.ucrInputJoinType) + Me.Controls.Add(Me.ucrSecondDataFrame) + Me.Controls.Add(Me.ucrFirstDataFrame) Me.Controls.Add(Me.cmdJoinOptions) - Me.Controls.Add(Me.ucrSelectorSecondDF) - Me.Controls.Add(Me.ucrSelectorFirstDF) - Me.Controls.Add(Me.grpKeys) - Me.Controls.Add(Me.rdoChooseColumns) - Me.Controls.Add(Me.rdoByAllMatching) - Me.Controls.Add(Me.pnlKeyColumns) - Me.Controls.Add(Me.ucrNewDataFrameName) - Me.Controls.Add(Me.lblNewDataFrameName) - Me.Controls.Add(Me.lblSecondDataFrame) - Me.Controls.Add(Me.lblFirstDataFrame) Me.Controls.Add(Me.ucrBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False @@ -260,33 +109,16 @@ Partial Class dlgMerge Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Tag = "Merge" Me.Text = "Merge" - Me.pnlKeyColumns.ResumeLayout(False) - Me.pnlKeyColumns.PerformLayout() - Me.grpKeys.ResumeLayout(False) - Me.grpKeys.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() End Sub Friend WithEvents ucrBase As ucrButtons - Friend WithEvents lblFirstDataFrame As Label - Friend WithEvents lblSecondDataFrame As Label - Friend WithEvents lblNewDataFrameName As Label - Friend WithEvents ucrNewDataFrameName As ucrInputTextBox - Friend WithEvents pnlKeyColumns As Panel - Friend WithEvents lstKeyColumns As ListView - Friend WithEvents lblKeyColumns As Label - Friend WithEvents cmdRemoveSelectedPair As Button - Friend WithEvents rdoByAllMatching As RadioButton - Friend WithEvents rdoChooseColumns As RadioButton - Friend WithEvents grpKeys As GroupBox - Friend WithEvents cmdAddPair As Button - Friend WithEvents lblFirstKeyMatch As Label - Friend WithEvents ucrReceiverSecondDF As ucrReceiverSingle - Friend WithEvents ucrReceiverFirstDF As ucrReceiverSingle - Friend WithEvents ucrSelectorFirstDF As ucrSelectorByDataFrameAddRemove - Friend WithEvents ucrSelectorSecondDF As ucrSelectorByDataFrameAddRemove - Friend WithEvents cmdRemoveAll As Button Friend WithEvents cmdJoinOptions As Button + Friend WithEvents ucrFirstDataFrame As ucrDataFrame + Friend WithEvents ucrSecondDataFrame As ucrDataFrame + Friend WithEvents ucrInputJoinType As ucrInputComboBox + Friend WithEvents lnlJoinType As Label + Friend WithEvents ucrSaveMerge As ucrSave End Class diff --git a/instat/dlgMerge.vb b/instat/dlgMerge.vb index b101eef3e40..cfd2769f13a 100644 --- a/instat/dlgMerge.vb +++ b/instat/dlgMerge.vb @@ -13,11 +13,15 @@ ' ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class dlgMerge Private bFirstLoad As Boolean = True - Private clsByList As New RFunction + Private clsMerge As RFunction + Private clsByList As RFunction + Private bReset As Boolean = True + Private bResetSubdialog As Boolean = True ' This dialog has a bug when using numeric and integer columns as the joining columns. ' Issue reported here: https://github.com/hadley/dplyr/issues/2164 @@ -25,205 +29,124 @@ Public Class dlgMerge ' Alternatives would be to use the much slower base merge ' or plyr::join which cannot handle joining columns with different names Private Sub dlgMerge_Load(sender As Object, e As EventArgs) Handles MyBase.Load - autoTranslate(Me) - If bFirstLoad Then InitialiseDialog() - SetDefaults() bFirstLoad = False End If + If bReset Then + SetDefaults() + End If + SetRCodeForControls(bReset) + bReset = False + autoTranslate(Me) TestOKEnabled() End Sub Private Sub InitialiseDialog() + Dim dctJoinTypes As New Dictionary(Of String, String) + ucrBase.iHelpTopicID = 60 - ucrNewDataFrameName.SetValidationTypeAsRVariable() - sdgMerge.SetRSyntax(ucrBase.clsRsyntax) - ucrReceiverFirstDF.Selector = ucrSelectorFirstDF - ucrReceiverSecondDF.Selector = ucrSelectorSecondDF - ' Ideally this is what we want but the functionality of the selectors/receivers doesn't allow for this yet - ' The list should be set up so that errors and not possible with the by argument - 'ucrReceiverFirstDF.bExcludeFromSelector = True - 'ucrReceiverSecondDF.bExcludeFromSelector = True - ucrReceiverFirstDF.SetMeAsReceiver() - ucrReceiverSecondDF.SetMeAsReceiver() - clsByList.SetRCommand("c") + + 'sdgMerge.SetRSyntax(ucrBase.clsRsyntax) + dctJoinTypes.Add("Left Join", "left_join") + dctJoinTypes.Add("Full Join", "full_join") + dctJoinTypes.Add("Right Join", "right_join") + dctJoinTypes.Add("Semi Join", "semi_join") + dctJoinTypes.Add("Anti Join", "anti_join") + ucrInputJoinType.SetItems(dctItemParameterValuePairs:=dctJoinTypes, bSetCondtions:=False) + + ucrInputJoinType.AddFunctionNamesCondition("Left Join", "left_join") + ucrInputJoinType.AddFunctionNamesCondition("Full Join", "full_join") + ucrInputJoinType.AddFunctionNamesCondition("Right Join", "right_join") + ucrInputJoinType.AddFunctionNamesCondition("Semi Join", "semi_join") + ucrInputJoinType.AddFunctionNamesCondition("Anti Join", "anti_join") + ucrInputJoinType.SetDropDownStyleAsNonEditable() + + ucrFirstDataFrame.SetParameter(New RParameter("x", 0)) + ucrFirstDataFrame.SetParameterIsRFunction() + ucrFirstDataFrame.SetLabelText("First Data Frame:") + + ucrSecondDataFrame.SetParameter(New RParameter("y", 1)) + ucrSecondDataFrame.SetParameterIsRFunction() + ucrSecondDataFrame.SetLabelText("Second Data Frame:") + + ucrSaveMerge.SetLabelText("New Data Frame Name:") + ucrSaveMerge.SetIsTextBox() + ucrSaveMerge.SetSaveTypeAsDataFrame() + ucrSaveMerge.SetPrefix("merge") End Sub Private Sub SetDefaults() - ucrNewDataFrameName.Reset() - ucrSelectorFirstDF.Reset() - ucrSelectorSecondDF.Reset() - sdgMerge.SetDefaults() - rdoByAllMatching.Checked = True + clsMerge = New RFunction + clsByList = New RFunction + + ucrFirstDataFrame.Reset() + ucrSecondDataFrame.Reset() + + ucrSaveMerge.Reset() + + clsMerge.SetPackageName("dplyr") + clsMerge.SetRCommand("left_join") + + clsByList.SetRCommand("c") + + ucrBase.clsRsyntax.SetBaseRFunction(clsMerge) + bResetSubdialog = True + End Sub + + Private Sub SetRCodeForControls(bResetControls As Boolean) + ucrFirstDataFrame.SetRCode(clsMerge, bResetControls) + ucrSecondDataFrame.SetRCode(clsMerge, bResetControls) + ucrInputJoinType.SetRCode(clsMerge, bResetControls) + ucrSaveMerge.SetRCode(clsMerge, bResetControls) End Sub Private Sub TestOKEnabled() - If ucrNewDataFrameName.IsEmpty() Then - ucrBase.OKEnabled(False) + If ucrSaveMerge.IsComplete() AndAlso ucrFirstDataFrame.cboAvailableDataFrames.Text <> "" AndAlso ucrSecondDataFrame.cboAvailableDataFrames.Text <> "" Then + ucrBase.OKEnabled(True) Else - If rdoByAllMatching.Checked Then - ucrBase.OKEnabled(True) - ElseIf rdoChooseColumns.Checked Then - If lstKeyColumns.Items.Count > 0 Then - ucrBase.OKEnabled(True) - Else - ucrBase.OKEnabled(False) - End If - End If + ucrBase.OKEnabled(False) End If End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() - sdgMerge.SetDefaults() - TestOKEnabled() - End Sub - - Private Sub ucrSelectorFirstDF_DataFrameChanged() Handles ucrSelectorFirstDF.DataFrameChanged - SetDataFrameParameters() - ResetKeyList() - End Sub - - Private Sub ucrSelectorSecondDF_DataFrameChanged() Handles ucrSelectorSecondDF.DataFrameChanged - SetDataFrameParameters() - ResetKeyList() - End Sub - - Private Sub SetDataFrameParameters() - If Not ucrNewDataFrameName.UserTyped() Then - ucrNewDataFrameName.SetName("Merge_" & ucrSelectorFirstDF.ucrAvailableDataFrames.cboAvailableDataFrames.Text & "_" & ucrSelectorSecondDF.ucrAvailableDataFrames.cboAvailableDataFrames.Text) - End If - ucrBase.clsRsyntax.AddParameter("x", clsRFunctionParameter:=ucrSelectorFirstDF.ucrAvailableDataFrames.clsCurrDataFrame) - ucrBase.clsRsyntax.AddParameter("y", clsRFunctionParameter:=ucrSelectorSecondDF.ucrAvailableDataFrames.clsCurrDataFrame) - ucrBase.clsRsyntax.AddParameter("suffix", "c(" & Chr(34) & ucrSelectorFirstDF.ucrAvailableDataFrames.cboAvailableDataFrames.Text & Chr(34) & ", " & Chr(34) & ucrSelectorSecondDF.ucrAvailableDataFrames.cboAvailableDataFrames.Text & Chr(34) & ")") - End Sub - - Private Sub ucrNewDataFrameName_NameChanged() Handles ucrNewDataFrameName.NameChanged - If ucrNewDataFrameName.IsEmpty Then - ucrBase.clsRsyntax.RemoveAssignTo() - Else - ucrBase.clsRsyntax.SetAssignTo(ucrNewDataFrameName.GetText(), strTempDataframe:=ucrNewDataFrameName.GetText()) - End If - TestOKEnabled() - End Sub - - Private Sub MatchingColumns_CheckedChanged(sender As Object, e As EventArgs) Handles rdoByAllMatching.CheckedChanged, rdoChooseColumns.CheckedChanged - If rdoByAllMatching.Checked Then - ucrSelectorFirstDF.SetVariablesVisible(False) - ucrSelectorSecondDF.SetVariablesVisible(False) - grpKeys.Visible = False - pnlKeyColumns.Visible = False - ucrBase.clsRsyntax.RemoveParameter("by") - ElseIf rdoChooseColumns.Checked Then - ucrSelectorFirstDF.SetVariablesVisible(True) - ucrSelectorSecondDF.SetVariablesVisible(True) - grpKeys.Visible = True - pnlKeyColumns.Visible = True - SetByArgument() - End If + SetRCodeForControls(True) TestOKEnabled() End Sub - Public Sub AutoAddInOtherReceiver(ucrChangedReceiver As ucrReceiverSingle, ucrOtherReceiver As ucrReceiverSingle) - If Not ucrChangedReceiver.IsEmpty() Then - If ucrOtherReceiver.IsEmpty AndAlso ucrOtherReceiver.Selector.ContainsVariable(ucrChangedReceiver.GetVariableNames(False)) Then - ucrOtherReceiver.Add(ucrChangedReceiver.GetVariableNames(False)) - End If - End If - If ucrChangedReceiver.IsEmpty() OrElse ucrOtherReceiver.IsEmpty Then - cmdAddPair.Enabled = False - Else - cmdAddPair.Enabled = True - End If - End Sub - - Private Sub SetByArgument() - Dim lviItem As ListViewItem - - clsByList.ClearParameters() - For Each lviItem In lstKeyColumns.Items - clsByList.AddParameter(Chr(34) & lviItem.Text() & Chr(34), Chr(34) & lviItem.SubItems(2).Text() & Chr(34)) - Next - ucrBase.clsRsyntax.AddParameter("by", clsRFunctionParameter:=clsByList) - End Sub - - Private Sub ResetKeyList() - lstKeyColumns.Columns.Clear() - lstKeyColumns.Clear() - lstKeyColumns.Columns.Add(ucrSelectorFirstDF.ucrAvailableDataFrames.cboAvailableDataFrames.Text) - lstKeyColumns.Columns.Add(" ") - lstKeyColumns.Columns.Add(ucrSelectorSecondDF.ucrAvailableDataFrames.cboAvailableDataFrames.Text) - lstKeyColumns.Columns(0).Width = 75 - lstKeyColumns.Columns(1).Width = 31 - lstKeyColumns.Columns(2).Width = 75 - ucrBase.clsRsyntax.RemoveParameter("by") - cmdRemoveAll.Enabled = False - End Sub - - Private Sub cmdAddPair_Click(sender As Object, e As EventArgs) Handles cmdAddPair.Click - Dim i As Integer - Dim bFound As Boolean = False - - ' If either column of pair already appears in the list, modify that list, since we can't have a column matched to multiple columns - For i = 0 To lstKeyColumns.Items.Count - 1 - If lstKeyColumns.Items(i).Text = ucrReceiverFirstDF.GetVariableNames(False) Then - lstKeyColumns.Items(i).SubItems(2).Text() = ucrReceiverSecondDF.GetVariableNames(False) - bFound = True - ElseIf lstKeyColumns.Items(i).SubItems(2).Text() = ucrReceiverSecondDF.GetVariableNames(False) Then - lstKeyColumns.Items(i).Text = ucrReceiverFirstDF.GetVariableNames(False) - bFound = True - End If - Next - - If Not bFound Then - lstKeyColumns.Items.Add(ucrReceiverFirstDF.GetVariableNames(False)).SubItems.AddRange({"and", ucrReceiverSecondDF.GetVariableNames(False)}) + Private Sub cmdJoinOptions_Click(sender As Object, e As EventArgs) Handles cmdJoinOptions.Click + sdgMerge.Setup(ucrFirstDataFrame.cboAvailableDataFrames.Text, ucrSecondDataFrame.cboAvailableDataFrames.Text, clsMerge, clsByList, bResetSubdialog) + sdgMerge.ShowDialog() + bResetSubdialog = False + End Sub + + Private Sub ucrInputJoinType_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputJoinType.ControlValueChanged + If Not ucrInputJoinType.IsEmpty() Then + Select Case ucrInputJoinType.GetText() + Case "Left Join" + clsMerge.SetRCommand("left_join") + Case "Full Join" + clsMerge.SetRCommand("full_join") + Case "Right Join" + clsMerge.SetRCommand("right_join") + Case "Semi Join" + clsMerge.SetRCommand("semi_join") + Case "Anti Join" + clsMerge.SetRCommand("anti_join") + End Select End If - cmdRemoveAll.Enabled = True - ucrReceiverFirstDF.Clear() - ucrReceiverSecondDF.Clear() - SetByArgument() - TestOKEnabled() End Sub - Private Sub lstKeyColumns_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstKeyColumns.SelectedIndexChanged - If lstKeyColumns.SelectedItems.Count = 0 Then - cmdRemoveSelectedPair.Enabled = False + Private Sub DataFrames_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrFirstDataFrame.ControlValueChanged, ucrSecondDataFrame.ControlValueChanged + If ucrFirstDataFrame.cboAvailableDataFrames.Text <> "" AndAlso ucrSecondDataFrame.cboAvailableDataFrames.Text <> "" Then + clsMerge.AddParameter("suffix", "c(" & Chr(34) & ucrFirstDataFrame.cboAvailableDataFrames.Text & Chr(34) & ", " & Chr(34) & ucrSecondDataFrame.cboAvailableDataFrames.Text & Chr(34) & ")") Else - cmdRemoveSelectedPair.Enabled = True + clsMerge.RemoveParameterByName("suffix") End If End Sub - Private Sub ucrReceiverFirstDF_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverFirstDF.SelectionChanged - AutoAddInOtherReceiver(ucrReceiverFirstDF, ucrReceiverSecondDF) - End Sub - - Private Sub ucrReceiverSecondDF_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverSecondDF.SelectionChanged - AutoAddInOtherReceiver(ucrReceiverSecondDF, ucrReceiverFirstDF) - End Sub - - Private Sub cmdRemoveSelectedPair_Click(sender As Object, e As EventArgs) Handles cmdRemoveSelectedPair.Click - Dim i As Integer - - If lstKeyColumns.SelectedItems.Count > 0 Then - For i = lstKeyColumns.SelectedItems.Count - 1 To 0 Step -1 - lstKeyColumns.Items.RemoveAt(lstKeyColumns.SelectedIndices(i)) - Next - End If - SetByArgument() - TestOKEnabled() - End Sub - - Private Sub cmdRemoveAll_Click(sender As Object, e As EventArgs) Handles cmdRemoveAll.Click - ResetKeyList() - TestOKEnabled() - End Sub - - Private Sub cmdJoinOptions_Click(sender As Object, e As EventArgs) Handles cmdJoinOptions.Click - sdgMerge.ShowDialog() - End Sub - - Private Sub ucrNewDataFrameName_ContentsChanged() Handles ucrNewDataFrameName.ContentsChanged + Private Sub ucrFirstDataFrame_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrFirstDataFrame.ControlContentsChanged, ucrSecondDataFrame.ControlContentsChanged, ucrSaveMerge.ControlContentsChanged TestOKEnabled() End Sub End Class \ No newline at end of file diff --git a/instat/sdgMerge.Designer.vb b/instat/sdgMerge.Designer.vb index 0570cb93192..489e2cf6475 100644 --- a/instat/sdgMerge.Designer.vb +++ b/instat/sdgMerge.Designer.vb @@ -23,117 +23,333 @@ Partial Class sdgMerge _ Private Sub InitializeComponent() Me.components = New System.ComponentModel.Container() - Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(sdgMerge)) - Me.grpJoinType = New System.Windows.Forms.GroupBox() - Me.rdoAntiJoin = New System.Windows.Forms.RadioButton() - Me.rdoSemiJoin = New System.Windows.Forms.RadioButton() - Me.rdoRightJoin = New System.Windows.Forms.RadioButton() - Me.rdoLeftJoin = New System.Windows.Forms.RadioButton() - Me.rdoFullJoin = New System.Windows.Forms.RadioButton() - Me.rdoInnerJoin = New System.Windows.Forms.RadioButton() Me.ttJoinDetails = New System.Windows.Forms.ToolTip(Me.components) + Me.grpKeys = New System.Windows.Forms.GroupBox() + Me.cmdAddPair = New System.Windows.Forms.Button() + Me.lblFirstKeyMatch = New System.Windows.Forms.Label() + Me.ucrReceiverSecondDF = New instat.ucrReceiverSingle() + Me.ucrReceiverFirstDF = New instat.ucrReceiverSingle() + Me.pnlKeyColumns = New System.Windows.Forms.Panel() + Me.cmdRemoveAll = New System.Windows.Forms.Button() + Me.lstKeyColumns = New System.Windows.Forms.ListView() + Me.lblKeyColumns = New System.Windows.Forms.Label() + Me.cmdRemoveSelectedPair = New System.Windows.Forms.Button() + Me.tbcMergeOptions = New System.Windows.Forms.TabControl() + Me.tpJoinByOptions = New System.Windows.Forms.TabPage() + Me.rdoChooseColumns = New System.Windows.Forms.RadioButton() + Me.rdoByAllMatching = New System.Windows.Forms.RadioButton() + Me.ucrSelectorSecondDF = New instat.ucrSelectorByDataFrameAddRemove() + Me.ucrSelectorFirstDF = New instat.ucrSelectorByDataFrameAddRemove() + Me.ucrPnlMergeByOptions = New instat.UcrPanel() + Me.tpIncludeColumns = New System.Windows.Forms.TabPage() + Me.ucrChkMergeWithSubsetSecond = New instat.ucrCheck() + Me.ucrChkMergeWithSubsetFirst = New instat.ucrCheck() + Me.lblVariablesToIncludeSecond = New System.Windows.Forms.Label() + Me.lblVariablesToIncludeFirst = New System.Windows.Forms.Label() + Me.ucrReceiverSecondSelected = New instat.ucrReceiverMultiple() + Me.ucrReceiverFirstSelected = New instat.ucrReceiverMultiple() + Me.ucrSelectorColumnsToIncludeSecond = New instat.ucrSelectorByDataFrameAddRemove() + Me.ucrSelectorColumnsToIncludeFirst = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrSubBase = New instat.ucrButtonsSubdialogue() - Me.grpJoinType.SuspendLayout() + Me.grpKeys.SuspendLayout() + Me.pnlKeyColumns.SuspendLayout() + Me.tbcMergeOptions.SuspendLayout() + Me.tpJoinByOptions.SuspendLayout() + Me.tpIncludeColumns.SuspendLayout() Me.SuspendLayout() ' - 'grpJoinType - ' - Me.grpJoinType.Controls.Add(Me.rdoAntiJoin) - Me.grpJoinType.Controls.Add(Me.rdoSemiJoin) - Me.grpJoinType.Controls.Add(Me.rdoRightJoin) - Me.grpJoinType.Controls.Add(Me.rdoLeftJoin) - Me.grpJoinType.Controls.Add(Me.rdoFullJoin) - Me.grpJoinType.Controls.Add(Me.rdoInnerJoin) - Me.grpJoinType.Location = New System.Drawing.Point(12, 21) - Me.grpJoinType.Name = "grpJoinType" - Me.grpJoinType.Size = New System.Drawing.Size(106, 166) - Me.grpJoinType.TabIndex = 26 - Me.grpJoinType.TabStop = False - Me.grpJoinType.Text = "Join Type" - ' - 'rdoAntiJoin - ' - Me.rdoAntiJoin.AutoSize = True - Me.rdoAntiJoin.Location = New System.Drawing.Point(6, 140) - Me.rdoAntiJoin.Name = "rdoAntiJoin" - Me.rdoAntiJoin.Size = New System.Drawing.Size(65, 17) - Me.rdoAntiJoin.TabIndex = 29 - Me.rdoAntiJoin.TabStop = True - Me.rdoAntiJoin.Text = "Anti Join" - Me.ttJoinDetails.SetToolTip(Me.rdoAntiJoin, "Include all rows from the 1st data frame where there are not matching values in t" & - "he second data frame, " & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "keeping just columns from the first data frame.") - Me.rdoAntiJoin.UseVisualStyleBackColor = True - ' - 'rdoSemiJoin - ' - Me.rdoSemiJoin.AutoSize = True - Me.rdoSemiJoin.Location = New System.Drawing.Point(6, 116) - Me.rdoSemiJoin.Name = "rdoSemiJoin" - Me.rdoSemiJoin.Size = New System.Drawing.Size(70, 17) - Me.rdoSemiJoin.TabIndex = 28 - Me.rdoSemiJoin.TabStop = True - Me.rdoSemiJoin.Text = "Semi Join" - Me.ttJoinDetails.SetToolTip(Me.rdoSemiJoin, resources.GetString("rdoSemiJoin.ToolTip")) - Me.rdoSemiJoin.UseVisualStyleBackColor = True - ' - 'rdoRightJoin - ' - Me.rdoRightJoin.AutoSize = True - Me.rdoRightJoin.Location = New System.Drawing.Point(6, 92) - Me.rdoRightJoin.Name = "rdoRightJoin" - Me.rdoRightJoin.Size = New System.Drawing.Size(72, 17) - Me.rdoRightJoin.TabIndex = 27 - Me.rdoRightJoin.TabStop = True - Me.rdoRightJoin.Text = "Right Join" - Me.ttJoinDetails.SetToolTip(Me.rdoRightJoin, resources.GetString("rdoRightJoin.ToolTip")) - Me.rdoRightJoin.UseVisualStyleBackColor = True - ' - 'rdoLeftJoin - ' - Me.rdoLeftJoin.AutoSize = True - Me.rdoLeftJoin.Location = New System.Drawing.Point(6, 20) - Me.rdoLeftJoin.Name = "rdoLeftJoin" - Me.rdoLeftJoin.Size = New System.Drawing.Size(65, 17) - Me.rdoLeftJoin.TabIndex = 16 - Me.rdoLeftJoin.TabStop = True - Me.rdoLeftJoin.Text = "Left Join" - Me.ttJoinDetails.SetToolTip(Me.rdoLeftJoin, resources.GetString("rdoLeftJoin.ToolTip")) - Me.rdoLeftJoin.UseVisualStyleBackColor = True - ' - 'rdoFullJoin - ' - Me.rdoFullJoin.AutoSize = True - Me.rdoFullJoin.Location = New System.Drawing.Point(6, 44) - Me.rdoFullJoin.Name = "rdoFullJoin" - Me.rdoFullJoin.Size = New System.Drawing.Size(63, 17) - Me.rdoFullJoin.TabIndex = 14 - Me.rdoFullJoin.TabStop = True - Me.rdoFullJoin.Text = "Full Join" - Me.ttJoinDetails.SetToolTip(Me.rdoFullJoin, "Include all rows and all columns from both data frames." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Where there are not matc" & - "hing values, NAs are used for the one missing.") - Me.rdoFullJoin.UseVisualStyleBackColor = True - ' - 'rdoInnerJoin - ' - Me.rdoInnerJoin.AutoSize = True - Me.rdoInnerJoin.Location = New System.Drawing.Point(6, 68) - Me.rdoInnerJoin.Name = "rdoInnerJoin" - Me.rdoInnerJoin.Size = New System.Drawing.Size(71, 17) - Me.rdoInnerJoin.TabIndex = 12 - Me.rdoInnerJoin.TabStop = True - Me.rdoInnerJoin.Text = "Inner Join" - Me.ttJoinDetails.SetToolTip(Me.rdoInnerJoin, resources.GetString("rdoInnerJoin.ToolTip")) - Me.rdoInnerJoin.UseVisualStyleBackColor = True - ' 'ttJoinDetails ' Me.ttJoinDetails.AutoPopDelay = 10000 Me.ttJoinDetails.InitialDelay = 500 Me.ttJoinDetails.ReshowDelay = 100 ' + 'grpKeys + ' + Me.grpKeys.Controls.Add(Me.cmdAddPair) + Me.grpKeys.Controls.Add(Me.lblFirstKeyMatch) + Me.grpKeys.Controls.Add(Me.ucrReceiverSecondDF) + Me.grpKeys.Controls.Add(Me.ucrReceiverFirstDF) + Me.grpKeys.Location = New System.Drawing.Point(5, 243) + Me.grpKeys.Name = "grpKeys" + Me.grpKeys.Size = New System.Drawing.Size(335, 76) + Me.grpKeys.TabIndex = 5 + Me.grpKeys.TabStop = False + Me.grpKeys.Text = "Key Columns" + ' + 'cmdAddPair + ' + Me.cmdAddPair.Location = New System.Drawing.Point(4, 46) + Me.cmdAddPair.Name = "cmdAddPair" + Me.cmdAddPair.Size = New System.Drawing.Size(118, 23) + Me.cmdAddPair.TabIndex = 3 + Me.cmdAddPair.Text = "Add Pair" + Me.cmdAddPair.UseVisualStyleBackColor = True + ' + 'lblFirstKeyMatch + ' + Me.lblFirstKeyMatch.AutoSize = True + Me.lblFirstKeyMatch.Location = New System.Drawing.Point(128, 22) + Me.lblFirstKeyMatch.Name = "lblFirstKeyMatch" + Me.lblFirstKeyMatch.Size = New System.Drawing.Size(74, 13) + Me.lblFirstKeyMatch.TabIndex = 1 + Me.lblFirstKeyMatch.Text = "Matched With" + ' + 'ucrReceiverSecondDF + ' + Me.ucrReceiverSecondDF.frmParent = Nothing + Me.ucrReceiverSecondDF.Location = New System.Drawing.Point(205, 20) + Me.ucrReceiverSecondDF.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverSecondDF.Name = "ucrReceiverSecondDF" + Me.ucrReceiverSecondDF.Selector = Nothing + Me.ucrReceiverSecondDF.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverSecondDF.strNcFilePath = "" + Me.ucrReceiverSecondDF.TabIndex = 2 + Me.ucrReceiverSecondDF.ucrSelector = Nothing + ' + 'ucrReceiverFirstDF + ' + Me.ucrReceiverFirstDF.frmParent = Nothing + Me.ucrReceiverFirstDF.Location = New System.Drawing.Point(4, 20) + Me.ucrReceiverFirstDF.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverFirstDF.Name = "ucrReceiverFirstDF" + Me.ucrReceiverFirstDF.Selector = Nothing + Me.ucrReceiverFirstDF.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverFirstDF.strNcFilePath = "" + Me.ucrReceiverFirstDF.TabIndex = 0 + Me.ucrReceiverFirstDF.ucrSelector = Nothing + ' + 'pnlKeyColumns + ' + Me.pnlKeyColumns.Controls.Add(Me.cmdRemoveAll) + Me.pnlKeyColumns.Controls.Add(Me.lstKeyColumns) + Me.pnlKeyColumns.Controls.Add(Me.lblKeyColumns) + Me.pnlKeyColumns.Controls.Add(Me.cmdRemoveSelectedPair) + Me.pnlKeyColumns.Location = New System.Drawing.Point(435, 65) + Me.pnlKeyColumns.Name = "pnlKeyColumns" + Me.pnlKeyColumns.Size = New System.Drawing.Size(194, 256) + Me.pnlKeyColumns.TabIndex = 6 + ' + 'cmdRemoveAll + ' + Me.cmdRemoveAll.Location = New System.Drawing.Point(6, 223) + Me.cmdRemoveAll.Name = "cmdRemoveAll" + Me.cmdRemoveAll.Size = New System.Drawing.Size(130, 23) + Me.cmdRemoveAll.TabIndex = 0 + Me.cmdRemoveAll.Text = "Remove All Pairs" + Me.cmdRemoveAll.UseVisualStyleBackColor = True + ' + 'lstKeyColumns + ' + Me.lstKeyColumns.FullRowSelect = True + Me.lstKeyColumns.Location = New System.Drawing.Point(6, 21) + Me.lstKeyColumns.Name = "lstKeyColumns" + Me.lstKeyColumns.Size = New System.Drawing.Size(185, 167) + Me.lstKeyColumns.TabIndex = 2 + Me.lstKeyColumns.UseCompatibleStateImageBehavior = False + Me.lstKeyColumns.View = System.Windows.Forms.View.Details + ' + 'lblKeyColumns + ' + Me.lblKeyColumns.AutoSize = True + Me.lblKeyColumns.Location = New System.Drawing.Point(3, 5) + Me.lblKeyColumns.Name = "lblKeyColumns" + Me.lblKeyColumns.Size = New System.Drawing.Size(68, 13) + Me.lblKeyColumns.TabIndex = 0 + Me.lblKeyColumns.Text = "Key Columns" + ' + 'cmdRemoveSelectedPair + ' + Me.cmdRemoveSelectedPair.Location = New System.Drawing.Point(6, 194) + Me.cmdRemoveSelectedPair.Name = "cmdRemoveSelectedPair" + Me.cmdRemoveSelectedPair.Size = New System.Drawing.Size(130, 23) + Me.cmdRemoveSelectedPair.TabIndex = 3 + Me.cmdRemoveSelectedPair.Text = "Remove Selected Pair" + Me.cmdRemoveSelectedPair.UseVisualStyleBackColor = True + ' + 'tbcMergeOptions + ' + Me.tbcMergeOptions.Controls.Add(Me.tpJoinByOptions) + Me.tbcMergeOptions.Controls.Add(Me.tpIncludeColumns) + Me.tbcMergeOptions.Location = New System.Drawing.Point(8, 8) + Me.tbcMergeOptions.Name = "tbcMergeOptions" + Me.tbcMergeOptions.SelectedIndex = 0 + Me.tbcMergeOptions.Size = New System.Drawing.Size(656, 393) + Me.tbcMergeOptions.TabIndex = 0 + ' + 'tpJoinByOptions + ' + Me.tpJoinByOptions.Controls.Add(Me.rdoChooseColumns) + Me.tpJoinByOptions.Controls.Add(Me.rdoByAllMatching) + Me.tpJoinByOptions.Controls.Add(Me.ucrSelectorSecondDF) + Me.tpJoinByOptions.Controls.Add(Me.ucrSelectorFirstDF) + Me.tpJoinByOptions.Controls.Add(Me.pnlKeyColumns) + Me.tpJoinByOptions.Controls.Add(Me.grpKeys) + Me.tpJoinByOptions.Controls.Add(Me.ucrPnlMergeByOptions) + Me.tpJoinByOptions.Location = New System.Drawing.Point(4, 22) + Me.tpJoinByOptions.Name = "tpJoinByOptions" + Me.tpJoinByOptions.Padding = New System.Windows.Forms.Padding(3) + Me.tpJoinByOptions.Size = New System.Drawing.Size(648, 367) + Me.tpJoinByOptions.TabIndex = 0 + Me.tpJoinByOptions.Text = "Joining Columns" + Me.tpJoinByOptions.UseVisualStyleBackColor = True + ' + 'rdoChooseColumns + ' + Me.rdoChooseColumns.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoChooseColumns.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoChooseColumns.FlatAppearance.BorderSize = 2 + Me.rdoChooseColumns.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoChooseColumns.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoChooseColumns.Location = New System.Drawing.Point(316, 15) + Me.rdoChooseColumns.Name = "rdoChooseColumns" + Me.rdoChooseColumns.Size = New System.Drawing.Size(224, 28) + Me.rdoChooseColumns.TabIndex = 2 + Me.rdoChooseColumns.Text = "Choose which columns to merge by" + Me.rdoChooseColumns.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoChooseColumns.UseVisualStyleBackColor = True + ' + 'rdoByAllMatching + ' + Me.rdoByAllMatching.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoByAllMatching.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoByAllMatching.FlatAppearance.BorderSize = 2 + Me.rdoByAllMatching.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoByAllMatching.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoByAllMatching.Location = New System.Drawing.Point(94, 15) + Me.rdoByAllMatching.Name = "rdoByAllMatching" + Me.rdoByAllMatching.Size = New System.Drawing.Size(224, 28) + Me.rdoByAllMatching.TabIndex = 1 + Me.rdoByAllMatching.Text = "Merge by all columns with the same name" + Me.rdoByAllMatching.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoByAllMatching.UseVisualStyleBackColor = True + ' + 'ucrSelectorSecondDF + ' + Me.ucrSelectorSecondDF.bShowHiddenColumns = False + Me.ucrSelectorSecondDF.bUseCurrentFilter = True + Me.ucrSelectorSecondDF.Location = New System.Drawing.Point(222, 57) + Me.ucrSelectorSecondDF.Margin = New System.Windows.Forms.Padding(0) + Me.ucrSelectorSecondDF.Name = "ucrSelectorSecondDF" + Me.ucrSelectorSecondDF.Size = New System.Drawing.Size(210, 180) + Me.ucrSelectorSecondDF.TabIndex = 4 + ' + 'ucrSelectorFirstDF + ' + Me.ucrSelectorFirstDF.bShowHiddenColumns = False + Me.ucrSelectorFirstDF.bUseCurrentFilter = True + Me.ucrSelectorFirstDF.Location = New System.Drawing.Point(6, 57) + Me.ucrSelectorFirstDF.Margin = New System.Windows.Forms.Padding(0) + Me.ucrSelectorFirstDF.Name = "ucrSelectorFirstDF" + Me.ucrSelectorFirstDF.Size = New System.Drawing.Size(210, 180) + Me.ucrSelectorFirstDF.TabIndex = 3 + ' + 'ucrPnlMergeByOptions + ' + Me.ucrPnlMergeByOptions.Location = New System.Drawing.Point(90, 13) + Me.ucrPnlMergeByOptions.Name = "ucrPnlMergeByOptions" + Me.ucrPnlMergeByOptions.Size = New System.Drawing.Size(460, 42) + Me.ucrPnlMergeByOptions.TabIndex = 0 + ' + 'tpIncludeColumns + ' + Me.tpIncludeColumns.Controls.Add(Me.ucrChkMergeWithSubsetSecond) + Me.tpIncludeColumns.Controls.Add(Me.ucrChkMergeWithSubsetFirst) + Me.tpIncludeColumns.Controls.Add(Me.lblVariablesToIncludeSecond) + Me.tpIncludeColumns.Controls.Add(Me.lblVariablesToIncludeFirst) + Me.tpIncludeColumns.Controls.Add(Me.ucrReceiverSecondSelected) + Me.tpIncludeColumns.Controls.Add(Me.ucrReceiverFirstSelected) + Me.tpIncludeColumns.Controls.Add(Me.ucrSelectorColumnsToIncludeSecond) + Me.tpIncludeColumns.Controls.Add(Me.ucrSelectorColumnsToIncludeFirst) + Me.tpIncludeColumns.Location = New System.Drawing.Point(4, 22) + Me.tpIncludeColumns.Name = "tpIncludeColumns" + Me.tpIncludeColumns.Padding = New System.Windows.Forms.Padding(3) + Me.tpIncludeColumns.Size = New System.Drawing.Size(648, 367) + Me.tpIncludeColumns.TabIndex = 1 + Me.tpIncludeColumns.Text = "Columns to Include" + Me.tpIncludeColumns.UseVisualStyleBackColor = True + ' + 'ucrChkMergeWithSubsetSecond + ' + Me.ucrChkMergeWithSubsetSecond.Checked = False + Me.ucrChkMergeWithSubsetSecond.Location = New System.Drawing.Point(252, 10) + Me.ucrChkMergeWithSubsetSecond.Name = "ucrChkMergeWithSubsetSecond" + Me.ucrChkMergeWithSubsetSecond.Size = New System.Drawing.Size(210, 20) + Me.ucrChkMergeWithSubsetSecond.TabIndex = 4 + ' + 'ucrChkMergeWithSubsetFirst + ' + Me.ucrChkMergeWithSubsetFirst.Checked = False + Me.ucrChkMergeWithSubsetFirst.Location = New System.Drawing.Point(10, 10) + Me.ucrChkMergeWithSubsetFirst.Name = "ucrChkMergeWithSubsetFirst" + Me.ucrChkMergeWithSubsetFirst.Size = New System.Drawing.Size(206, 20) + Me.ucrChkMergeWithSubsetFirst.TabIndex = 0 + ' + 'lblVariablesToIncludeSecond + ' + Me.lblVariablesToIncludeSecond.AutoSize = True + Me.lblVariablesToIncludeSecond.Location = New System.Drawing.Point(249, 223) + Me.lblVariablesToIncludeSecond.Name = "lblVariablesToIncludeSecond" + Me.lblVariablesToIncludeSecond.Size = New System.Drawing.Size(107, 13) + Me.lblVariablesToIncludeSecond.TabIndex = 6 + Me.lblVariablesToIncludeSecond.Text = "Variables To Include:" + ' + 'lblVariablesToIncludeFirst + ' + Me.lblVariablesToIncludeFirst.AutoSize = True + Me.lblVariablesToIncludeFirst.Location = New System.Drawing.Point(10, 223) + Me.lblVariablesToIncludeFirst.Name = "lblVariablesToIncludeFirst" + Me.lblVariablesToIncludeFirst.Size = New System.Drawing.Size(102, 13) + Me.lblVariablesToIncludeFirst.TabIndex = 2 + Me.lblVariablesToIncludeFirst.Text = "Variable To Include:" + ' + 'ucrReceiverSecondSelected + ' + Me.ucrReceiverSecondSelected.frmParent = Nothing + Me.ucrReceiverSecondSelected.Location = New System.Drawing.Point(252, 238) + Me.ucrReceiverSecondSelected.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverSecondSelected.Name = "ucrReceiverSecondSelected" + Me.ucrReceiverSecondSelected.Selector = Nothing + Me.ucrReceiverSecondSelected.Size = New System.Drawing.Size(120, 119) + Me.ucrReceiverSecondSelected.strNcFilePath = "" + Me.ucrReceiverSecondSelected.TabIndex = 7 + Me.ucrReceiverSecondSelected.ucrSelector = Nothing + ' + 'ucrReceiverFirstSelected + ' + Me.ucrReceiverFirstSelected.frmParent = Nothing + Me.ucrReceiverFirstSelected.Location = New System.Drawing.Point(10, 238) + Me.ucrReceiverFirstSelected.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverFirstSelected.Name = "ucrReceiverFirstSelected" + Me.ucrReceiverFirstSelected.Selector = Nothing + Me.ucrReceiverFirstSelected.Size = New System.Drawing.Size(120, 119) + Me.ucrReceiverFirstSelected.strNcFilePath = "" + Me.ucrReceiverFirstSelected.TabIndex = 3 + Me.ucrReceiverFirstSelected.ucrSelector = Nothing + ' + 'ucrSelectorColumnsToIncludeSecond + ' + Me.ucrSelectorColumnsToIncludeSecond.bShowHiddenColumns = False + Me.ucrSelectorColumnsToIncludeSecond.bUseCurrentFilter = True + Me.ucrSelectorColumnsToIncludeSecond.Location = New System.Drawing.Point(252, 34) + Me.ucrSelectorColumnsToIncludeSecond.Margin = New System.Windows.Forms.Padding(0) + Me.ucrSelectorColumnsToIncludeSecond.Name = "ucrSelectorColumnsToIncludeSecond" + Me.ucrSelectorColumnsToIncludeSecond.Size = New System.Drawing.Size(210, 180) + Me.ucrSelectorColumnsToIncludeSecond.TabIndex = 5 + ' + 'ucrSelectorColumnsToIncludeFirst + ' + Me.ucrSelectorColumnsToIncludeFirst.bShowHiddenColumns = False + Me.ucrSelectorColumnsToIncludeFirst.bUseCurrentFilter = True + Me.ucrSelectorColumnsToIncludeFirst.Location = New System.Drawing.Point(10, 34) + Me.ucrSelectorColumnsToIncludeFirst.Margin = New System.Windows.Forms.Padding(0) + Me.ucrSelectorColumnsToIncludeFirst.Name = "ucrSelectorColumnsToIncludeFirst" + Me.ucrSelectorColumnsToIncludeFirst.Size = New System.Drawing.Size(210, 180) + Me.ucrSelectorColumnsToIncludeFirst.TabIndex = 1 + ' 'ucrSubBase ' - Me.ucrSubBase.Location = New System.Drawing.Point(12, 212) + Me.ucrSubBase.Location = New System.Drawing.Point(264, 407) Me.ucrSubBase.Name = "ucrSubBase" Me.ucrSubBase.Size = New System.Drawing.Size(142, 30) Me.ucrSubBase.TabIndex = 0 @@ -142,28 +358,53 @@ Partial Class sdgMerge ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(171, 244) - Me.Controls.Add(Me.grpJoinType) + Me.ClientSize = New System.Drawing.Size(670, 439) + Me.Controls.Add(Me.tbcMergeOptions) Me.Controls.Add(Me.ucrSubBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "sdgMerge" Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent - Me.Text = "sdgMerge" - Me.grpJoinType.ResumeLayout(False) - Me.grpJoinType.PerformLayout() + Me.Text = "Merge Options" + Me.grpKeys.ResumeLayout(False) + Me.grpKeys.PerformLayout() + Me.pnlKeyColumns.ResumeLayout(False) + Me.pnlKeyColumns.PerformLayout() + Me.tbcMergeOptions.ResumeLayout(False) + Me.tpJoinByOptions.ResumeLayout(False) + Me.tpIncludeColumns.ResumeLayout(False) + Me.tpIncludeColumns.PerformLayout() Me.ResumeLayout(False) End Sub Friend WithEvents ucrSubBase As ucrButtonsSubdialogue - Friend WithEvents grpJoinType As GroupBox - Friend WithEvents rdoFullJoin As RadioButton - Friend WithEvents rdoInnerJoin As RadioButton - Friend WithEvents rdoAntiJoin As RadioButton Friend WithEvents ttJoinDetails As ToolTip - Friend WithEvents rdoSemiJoin As RadioButton - Friend WithEvents rdoRightJoin As RadioButton - Friend WithEvents rdoLeftJoin As RadioButton + Friend WithEvents ucrSelectorSecondDF As ucrSelectorByDataFrameAddRemove + Friend WithEvents ucrSelectorFirstDF As ucrSelectorByDataFrameAddRemove + Friend WithEvents grpKeys As GroupBox + Friend WithEvents cmdAddPair As Button + Friend WithEvents lblFirstKeyMatch As Label + Friend WithEvents ucrReceiverSecondDF As ucrReceiverSingle + Friend WithEvents tbcMergeOptions As TabControl + Friend WithEvents tpJoinByOptions As TabPage + Friend WithEvents pnlKeyColumns As Panel + Friend WithEvents cmdRemoveAll As Button + Friend WithEvents lstKeyColumns As ListView + Friend WithEvents lblKeyColumns As Label + Friend WithEvents cmdRemoveSelectedPair As Button + Friend WithEvents tpIncludeColumns As TabPage + Friend WithEvents ucrReceiverFirstDF As ucrReceiverSingle + Friend WithEvents ucrPnlMergeByOptions As UcrPanel + Friend WithEvents lblVariablesToIncludeSecond As Label + Friend WithEvents lblVariablesToIncludeFirst As Label + Friend WithEvents ucrReceiverSecondSelected As ucrReceiverMultiple + Friend WithEvents ucrReceiverFirstSelected As ucrReceiverMultiple + Friend WithEvents ucrSelectorColumnsToIncludeSecond As ucrSelectorByDataFrameAddRemove + Friend WithEvents ucrSelectorColumnsToIncludeFirst As ucrSelectorByDataFrameAddRemove + Friend WithEvents rdoChooseColumns As RadioButton + Friend WithEvents rdoByAllMatching As RadioButton + Friend WithEvents ucrChkMergeWithSubsetSecond As ucrCheck + Friend WithEvents ucrChkMergeWithSubsetFirst As ucrCheck End Class diff --git a/instat/sdgMerge.resx b/instat/sdgMerge.resx index 32f54c2d5fd..3862a984f17 100644 --- a/instat/sdgMerge.resx +++ b/instat/sdgMerge.resx @@ -120,25 +120,4 @@ 17, 17 - - Include all rows from the 1st data frame where there are matching values in the 2nd data frame, keeping just columns from the 1st data frame. -(A semi join differs from an inner join because an inner join will return one row of the 1st data frame for each matching row of the 2nd data frame, -where a semi join will never duplicate rows of the 1st data frame.) - - - Include all rows from the 2nd data frame, and all columns from both data frames. -Rows in the second data frame with no match in the 1st data frame will have NA values in the new columns. -If there are multiple matches, all combinations of the matches are included. - - - - Include all rows from the 1st data frame, and all columns from both data frames. -Rows in the 1st data frame with no match in the second data frame will have NA values in the new columns. -If there are multiple matches, all combinations of the matches are returned. - - - Include all rows from the 1st data frame where there are matching values in the 2nd data frame, -and all columns from both data frames. -If there are multiple matches, all combination of the matches are included. - \ No newline at end of file diff --git a/instat/sdgMerge.vb b/instat/sdgMerge.vb index 3cc2ce597c1..a89bc530be7 100644 --- a/instat/sdgMerge.vb +++ b/instat/sdgMerge.vb @@ -16,42 +16,252 @@ Public Class sdgMerge Private clsRSyntax As New RSyntax - Private bFirstLoad As Boolean = True + Private bControlsInitialised As Boolean = False + Private clsByList As New RFunction + Private clsMerge As RFunction - Private Sub sdgMerge_Load(sender As Object, e As EventArgs) Handles MyBase.Load - If bFirstLoad Then - SetDefaults() - bFirstLoad = False + 'Private Sub sdgMerge_Load(sender As Object, e As EventArgs) Handles MyBase.Load + 'End Sub + + Public Sub InitiatiseControls() + 'Merge by Columns tab + ucrSelectorFirstDF.SetLabelText("First Data Frame") + ucrSelectorSecondDF.SetLabelText("Second Data Frame") + + ucrReceiverFirstDF.Selector = ucrSelectorFirstDF + ucrReceiverFirstDF.SetMeAsReceiver() + + ucrReceiverSecondDF.Selector = ucrSelectorSecondDF + ucrReceiverSecondDF.SetMeAsReceiver() + + ucrPnlMergeByOptions.AddRadioButton(rdoByAllMatching) + ucrPnlMergeByOptions.AddRadioButton(rdoChooseColumns) + + ucrPnlMergeByOptions.AddParameterPresentCondition(rdoByAllMatching, "by", False) + ucrPnlMergeByOptions.AddParameterPresentCondition(rdoChooseColumns, "by") + ucrPnlMergeByOptions.AddToLinkedControls(ucrSelectorFirstDF, {rdoChooseColumns}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlMergeByOptions.AddToLinkedControls(ucrSelectorSecondDF, {rdoChooseColumns}, bNewLinkedHideIfParameterMissing:=True) + + ' Columns to Include tab + ucrChkMergeWithSubsetFirst.SetText("Choose Subset of Columns to Merge") + ucrChkMergeWithSubsetFirst.AddToLinkedControls(ucrReceiverFirstSelected, {True}, bNewLinkedHideIfParameterMissing:=True) + ucrChkMergeWithSubsetFirst.AddParameterValueFunctionNamesCondition(True, "x", frmMain.clsRLink.strInstatDataObject & "$get_columns_from_data") + ucrChkMergeWithSubsetFirst.AddParameterValueFunctionNamesCondition(False, "x", frmMain.clsRLink.strInstatDataObject & "$get_data_frame") + + ucrChkMergeWithSubsetSecond.SetText("Choose Subset of Columns to Merge") + ucrChkMergeWithSubsetSecond.AddToLinkedControls(ucrReceiverSecondSelected, {True}, bNewLinkedHideIfParameterMissing:=True) + ucrChkMergeWithSubsetSecond.AddParameterValueFunctionNamesCondition(True, "y", frmMain.clsRLink.strInstatDataObject & "$get_columns_from_data") + ucrChkMergeWithSubsetSecond.AddParameterValueFunctionNamesCondition(False, "y", frmMain.clsRLink.strInstatDataObject & "$get_data_frame") + + ucrReceiverFirstSelected.SetParameter(New RParameter("x", 0)) + ucrReceiverFirstSelected.SetParameterIsRFunction() + ucrReceiverFirstSelected.SetLinkedDisplayControl(lblVariablesToIncludeFirst) + ucrReceiverFirstSelected.Selector = ucrSelectorColumnsToIncludeFirst + ucrReceiverFirstSelected.SetMeAsReceiver() + ucrReceiverFirstSelected.bForceAsDataFrame = True + + ucrReceiverSecondSelected.SetParameter(New RParameter("y", 1)) + ucrReceiverSecondSelected.SetParameterIsRFunction() + ucrReceiverSecondSelected.SetLinkedDisplayControl(lblVariablesToIncludeSecond) + ucrReceiverSecondSelected.Selector = ucrSelectorColumnsToIncludeSecond + ucrReceiverSecondSelected.SetMeAsReceiver() + ucrReceiverSecondSelected.bForceAsDataFrame = True + + bControlsInitialised = True + End Sub + + Public Sub Setup(strFirstDataName As String, strSecondDataName As String, clsNewMerge As RFunction, clsNewByList As RFunction, bReset As Boolean) + If Not bControlsInitialised Then + InitiatiseControls() + End If + ucrSelectorFirstDF.SetDataframe(strFirstDataName, False) + ucrSelectorSecondDF.SetDataframe(strSecondDataName, False) + + ucrSelectorColumnsToIncludeFirst.SetDataframe(strFirstDataName, False) + ucrSelectorColumnsToIncludeSecond.SetDataframe(strSecondDataName, False) + + clsMerge = clsNewMerge + clsByList = clsNewByList + ResetKeyList() + For Each clsTempParam In clsByList.clsParameters + lstKeyColumns.Items.Add(clsTempParam.strArgumentName.Trim(Chr(34))).SubItems.AddRange({"and", clsTempParam.strArgumentValue.Trim(Chr(34))}) + Next + If bReset Then + tbcMergeOptions.SelectedIndex = 0 End If + + ucrPnlMergeByOptions.SetRCode(clsMerge, bReset) + ucrChkMergeWithSubsetFirst.SetRCode(clsMerge, bReset) + ucrChkMergeWithSubsetSecond.SetRCode(clsMerge, bReset) + If ucrChkMergeWithSubsetFirst.Checked Then + ucrReceiverFirstSelected.SetRCode(clsMerge, bReset) + Else + ucrReceiverFirstSelected.Clear() + End If + If ucrChkMergeWithSubsetSecond.Checked Then + ucrReceiverSecondSelected.SetRCode(clsMerge, bReset) + Else + ucrReceiverSecondSelected.Clear() + End If + SetXParameter() + SetYParameter() End Sub - Public Sub SetDefaults() - rdoLeftJoin.Checked = True + Public ReadOnly Property IsComplete() As Boolean + Get + If rdoByAllMatching.Checked Then + Return True + ElseIf rdoChooseColumns.Checked Then + If lstKeyColumns.Items.Count > 0 Then + Return True + Else + Return False + End If + Else + Return False + End If + End Get + End Property + + Private Sub AddRemoveBy() + If rdoByAllMatching.Checked Then + ucrSelectorFirstDF.SetVariablesVisible(False) + ucrSelectorSecondDF.SetVariablesVisible(False) + grpKeys.Visible = False + pnlKeyColumns.Visible = False + clsMerge.RemoveParameterByName("by") + ElseIf rdoChooseColumns.Checked Then + ucrSelectorFirstDF.SetVariablesVisible(True) + ucrSelectorSecondDF.SetVariablesVisible(True) + grpKeys.Visible = True + pnlKeyColumns.Visible = True + SetByArgument() + End If End Sub - Public Sub SetRSyntax(clsNewRSyntax As RSyntax) - clsRSyntax = clsNewRSyntax + Public Sub AutoAddInOtherReceiver(ucrChangedReceiver As ucrReceiverSingle, ucrOtherReceiver As ucrReceiverSingle) + If Not ucrChangedReceiver.IsEmpty() Then + If ucrOtherReceiver.IsEmpty AndAlso ucrOtherReceiver.Selector.ContainsVariable(ucrChangedReceiver.GetVariableNames(False)) Then + ucrOtherReceiver.Add(ucrChangedReceiver.GetVariableNames(False)) + End If + End If + If ucrChangedReceiver.IsEmpty() OrElse ucrOtherReceiver.IsEmpty Then + cmdAddPair.Enabled = False + Else + cmdAddPair.Enabled = True + End If End Sub - Private Sub JoinType() - If rdoLeftJoin.Checked Then - clsRSyntax.SetFunction("left_join") - ElseIf rdoFullJoin.Checked Then - clsRSyntax.SetFunction("full_join") - ElseIf rdoInnerJoin.Checked Then - clsRSyntax.SetFunction("inner_join") - ElseIf rdoRightJoin.Checked Then - clsRSyntax.SetFunction("right_join") - ElseIf rdoSemiJoin.Checked Then - clsRSyntax.SetFunction("semi_join") - ElseIf rdoAntiJoin.Checked Then - clsRSyntax.SetFunction("anti_join") + Private Sub SetByArgument() + Dim lviItem As ListViewItem + + clsByList.ClearParameters() + For Each lviItem In lstKeyColumns.Items + clsByList.AddParameter(Chr(34) & lviItem.Text() & Chr(34), Chr(34) & lviItem.SubItems(2).Text() & Chr(34)) + Next + If lstKeyColumns.Items.Count > 0 Then + clsMerge.AddParameter("by", clsRFunctionParameter:=clsByList) Else - clsRSyntax.SetFunction("") + clsMerge.RemoveParameterByName("by") End If End Sub - Private Sub JoinType_CheckedChanged(sender As Object, e As EventArgs) Handles rdoAntiJoin.CheckedChanged, rdoFullJoin.CheckedChanged, rdoInnerJoin.CheckedChanged, rdoLeftJoin.CheckedChanged, rdoRightJoin.CheckedChanged, rdoSemiJoin.CheckedChanged - JoinType() + Private Sub ResetKeyList() + lstKeyColumns.Columns.Clear() + lstKeyColumns.Clear() + lstKeyColumns.Columns.Add(ucrSelectorFirstDF.ucrAvailableDataFrames.cboAvailableDataFrames.Text) + lstKeyColumns.Columns.Add(" ") + lstKeyColumns.Columns.Add(ucrSelectorSecondDF.ucrAvailableDataFrames.cboAvailableDataFrames.Text) + lstKeyColumns.Columns(0).Width = 75 + lstKeyColumns.Columns(1).Width = 31 + lstKeyColumns.Columns(2).Width = 75 + cmdRemoveAll.Enabled = False + End Sub + + Private Sub cmdAddPair_Click(sender As Object, e As EventArgs) Handles cmdAddPair.Click + Dim i As Integer + Dim bFound As Boolean = False + + ' If either column of pair already appears in the list, modify that list, since we can't have a column matched to multiple columns + For i = 0 To lstKeyColumns.Items.Count - 1 + If lstKeyColumns.Items(i).Text = ucrReceiverFirstDF.GetVariableNames(False) Then + lstKeyColumns.Items(i).SubItems(2).Text() = ucrReceiverSecondDF.GetVariableNames(False) + bFound = True + ElseIf lstKeyColumns.Items(i).SubItems(2).Text() = ucrReceiverSecondDF.GetVariableNames(False) Then + lstKeyColumns.Items(i).Text = ucrReceiverFirstDF.GetVariableNames(False) + bFound = True + End If + Next + + If Not bFound Then + lstKeyColumns.Items.Add(ucrReceiverFirstDF.GetVariableNames(False)).SubItems.AddRange({"and", ucrReceiverSecondDF.GetVariableNames(False)}) + End If + cmdRemoveAll.Enabled = True + ucrReceiverFirstDF.Clear() + ucrReceiverSecondDF.Clear() + SetByArgument() + End Sub + + Private Sub lstKeyColumns_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstKeyColumns.SelectedIndexChanged + If lstKeyColumns.SelectedItems.Count = 0 Then + cmdRemoveSelectedPair.Enabled = False + Else + cmdRemoveSelectedPair.Enabled = True + End If + End Sub + + Private Sub cmdRemoveSelectedPair_Click(sender As Object, e As EventArgs) Handles cmdRemoveSelectedPair.Click + Dim i As Integer + + If lstKeyColumns.SelectedItems.Count > 0 Then + For i = lstKeyColumns.SelectedItems.Count - 1 To 0 Step -1 + lstKeyColumns.Items.RemoveAt(lstKeyColumns.SelectedIndices(i)) + Next + End If + SetByArgument() + End Sub + + Private Sub SetXParameter() + If ucrChkMergeWithSubsetFirst.Checked AndAlso Not ucrReceiverFirstSelected.IsEmpty Then + clsMerge.AddParameter("x", clsRFunctionParameter:=ucrReceiverFirstSelected.GetVariables(bForceAsDataFrame:=True)) + Else + clsMerge.AddParameter("x", clsRFunctionParameter:=ucrSelectorColumnsToIncludeFirst.ucrAvailableDataFrames.clsCurrDataFrame) + End If + ucrSelectorColumnsToIncludeFirst.SetVariablesVisible(ucrChkMergeWithSubsetFirst.Checked) + End Sub + + Private Sub SetYParameter() + If ucrChkMergeWithSubsetSecond.Checked AndAlso Not ucrReceiverSecondSelected.IsEmpty Then + clsMerge.AddParameter("y", clsRFunctionParameter:=ucrReceiverSecondSelected.GetVariables(bForceAsDataFrame:=True)) + Else + clsMerge.AddParameter("y", clsRFunctionParameter:=ucrSelectorColumnsToIncludeSecond.ucrAvailableDataFrames.clsCurrDataFrame) + End If + ucrSelectorColumnsToIncludeSecond.SetVariablesVisible(ucrChkMergeWithSubsetSecond.Checked) + End Sub + + Private Sub ucrPnlMergeByOptions_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlMergeByOptions.ControlValueChanged + pnlKeyColumns.Visible = rdoChooseColumns.Checked + grpKeys.Visible = rdoChooseColumns.Checked + AddRemoveBy() + End Sub + + Private Sub cmdRemoveAll_Click(sender As Object, e As EventArgs) Handles cmdRemoveAll.Click + ResetKeyList() + End Sub + + Private Sub ucrReceiverSecondDF_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverSecondDF.ControlValueChanged + AutoAddInOtherReceiver(ucrReceiverSecondDF, ucrReceiverFirstDF) + End Sub + + Private Sub ucrReceiverFirstDF_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverFirstDF.ControlValueChanged + AutoAddInOtherReceiver(ucrReceiverFirstDF, ucrReceiverSecondDF) + End Sub + + Private Sub FirstSubsetControls_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkMergeWithSubsetFirst.ControlValueChanged, ucrReceiverFirstSelected.ControlValueChanged + SetXParameter() + End Sub + + Private Sub SecondSubsetControls_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkMergeWithSubsetSecond.ControlValueChanged, ucrReceiverSecondSelected.ControlValueChanged + SetYParameter() End Sub End Class \ No newline at end of file diff --git a/instat/ucrDataFrame.vb b/instat/ucrDataFrame.vb index 04fcf8915b3..8ff432c81dd 100644 --- a/instat/ucrDataFrame.vb +++ b/instat/ucrDataFrame.vb @@ -220,4 +220,8 @@ Public Class ucrDataFrame frmMain.SetCurrentDataFrame(cboAvailableDataFrames.Text) End If End Sub + + Public Sub SetLabelText(strText As String) + lblDataFrame.Text = strText + End Sub End Class \ No newline at end of file diff --git a/instat/ucrInputComboBox.vb b/instat/ucrInputComboBox.vb index 96b93af47eb..a260c2a713d 100644 --- a/instat/ucrInputComboBox.vb +++ b/instat/ucrInputComboBox.vb @@ -160,20 +160,24 @@ Public Class ucrInputComboBox End If End Sub - Public Sub SetItems(dctItemParameterValuePairs As Dictionary(Of String, String), Optional bClearExisting As Boolean = True) + Public Sub SetItems(dctItemParameterValuePairs As Dictionary(Of String, String), Optional bClearExisting As Boolean = True, Optional bSetCondtions As Boolean = True) Dim kvpTemp As KeyValuePair(Of String, String) If bClearExisting Then cboInput.Items.Clear() dctDisplayParameterValues.Clear() End If - 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.") + If bSetCondtions 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) - AddParameterValuesCondition(kvpTemp.Key, GetParameter().strArgumentName, kvpTemp.Value) + If bSetCondtions Then + AddParameterValuesCondition(kvpTemp.Key, GetParameter().strArgumentName, kvpTemp.Value) + End If Next AdjustComboBoxWidth(cboInput) End Sub diff --git a/instat/ucrSelectorByDataFrame.vb b/instat/ucrSelectorByDataFrame.vb index aa82e414783..1b1630fed81 100644 --- a/instat/ucrSelectorByDataFrame.vb +++ b/instat/ucrSelectorByDataFrame.vb @@ -147,4 +147,8 @@ Public Class ucrSelectorByDataFrame MyBase.AddAdditionalCodeParameterPair(clsNewRCode, clsNewRParameter, iAdditionalPairNo) ucrAvailableDataFrames.AddAdditionalCodeParameterPair(clsNewRCode, clsNewRParameter, iAdditionalPairNo) End Sub + + Public Sub SetLabelText(strText As String) + ucrAvailableDataFrames.SetLabelText(strText) + End Sub End Class \ No newline at end of file From 3df178d5fba81228e6e94f9f1996814dc2f7cded Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Tue, 20 Jun 2017 16:46:16 +0100 Subject: [PATCH 114/201] added tool tipcs added inner join option changed default to full join --- instat/dlgMerge.vb | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/instat/dlgMerge.vb b/instat/dlgMerge.vb index cfd2769f13a..6e9581388cb 100644 --- a/instat/dlgMerge.vb +++ b/instat/dlgMerge.vb @@ -22,6 +22,8 @@ Public Class dlgMerge Private clsByList As RFunction Private bReset As Boolean = True Private bResetSubdialog As Boolean = True + Private ttJoinType As New ToolTip + Private dctJoinTexts As New Dictionary(Of String, String) ' This dialog has a bug when using numeric and integer columns as the joining columns. ' Issue reported here: https://github.com/hadley/dplyr/issues/2164 @@ -48,16 +50,25 @@ Public Class dlgMerge ucrBase.iHelpTopicID = 60 'sdgMerge.SetRSyntax(ucrBase.clsRsyntax) - dctJoinTypes.Add("Left Join", "left_join") dctJoinTypes.Add("Full Join", "full_join") + dctJoinTypes.Add("Left Join", "left_join") dctJoinTypes.Add("Right Join", "right_join") + dctJoinTypes.Add("Inner Join", "inner_join") dctJoinTypes.Add("Semi Join", "semi_join") dctJoinTypes.Add("Anti Join", "anti_join") ucrInputJoinType.SetItems(dctItemParameterValuePairs:=dctJoinTypes, bSetCondtions:=False) - ucrInputJoinType.AddFunctionNamesCondition("Left Join", "left_join") + dctJoinTexts.Add("Full Join", "Include all rows and all columns from both data frames. Where there are not matching values, returns NA for the one missing.") + dctJoinTexts.Add("Left Join", "Include all rows from the 1st data frame, and all columns from both data frames." & Environment.NewLine & "Rows in the 1st data frame with no match in the second data frame will have NA values in the new columns." & Environment.NewLine & "If there are multiple matches, all combinations of the matches are included.") + dctJoinTexts.Add("Right Join", "Include all rows from the 2nd data frame, and all columns from both data frames." & Environment.NewLine & "Rows in the second data frame with no match in the 1st data frame will have NA values in the new columns." & Environment.NewLine & "If there are multiple matches, all combinations of the matches are included.") + dctJoinTexts.Add("Inner Join", "Include all rows from the 1st data frame where there are matching values in the 2nd data frame, and all columns from both data frames." & Environment.NewLine & "If there are multiple matches, all combination of the matches are included.") + dctJoinTexts.Add("Semi Join", "Include all rows from the 1st data frame where there are matching values in the 2nd data frame, keeping just columns from the 1st data frame." & Environment.NewLine & "(A semi join differs from an inner join because an inner join will include one row of the 1st data frame for each matching row of the 2nd data frame, where a semi join will never duplicate rows of the 1st data frame.)") + dctJoinTexts.Add("Anti Join", "Include all rows from the 1st data frame where there are not matching values the 2nd data frame, keeping just columns from the 1st data frame.") + ucrInputJoinType.AddFunctionNamesCondition("Full Join", "full_join") + ucrInputJoinType.AddFunctionNamesCondition("Left Join", "left_join") ucrInputJoinType.AddFunctionNamesCondition("Right Join", "right_join") + ucrInputJoinType.AddFunctionNamesCondition("Inner Join", "inner_join") ucrInputJoinType.AddFunctionNamesCondition("Semi Join", "semi_join") ucrInputJoinType.AddFunctionNamesCondition("Anti Join", "anti_join") ucrInputJoinType.SetDropDownStyleAsNonEditable() @@ -86,7 +97,7 @@ Public Class dlgMerge ucrSaveMerge.Reset() clsMerge.SetPackageName("dplyr") - clsMerge.SetRCommand("left_join") + clsMerge.SetRCommand("full_join") clsByList.SetRCommand("c") @@ -122,19 +133,31 @@ Public Class dlgMerge End Sub Private Sub ucrInputJoinType_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputJoinType.ControlValueChanged + Dim bFound As Boolean = True + If Not ucrInputJoinType.IsEmpty() Then Select Case ucrInputJoinType.GetText() - Case "Left Join" - clsMerge.SetRCommand("left_join") Case "Full Join" clsMerge.SetRCommand("full_join") + Case "Left Join" + clsMerge.SetRCommand("left_join") Case "Right Join" clsMerge.SetRCommand("right_join") + Case "Inner Join" + clsMerge.SetRCommand("inner_join") Case "Semi Join" clsMerge.SetRCommand("semi_join") Case "Anti Join" clsMerge.SetRCommand("anti_join") + Case Else + bFound = False End Select + 'This stops the tool tip popping up during selection + ttJoinType.Active = False + If bFound Then + ttJoinType.SetToolTip(ucrInputJoinType.cboInput, dctJoinTexts(ucrInputJoinType.GetText())) + ttJoinType.Active = True + End If End If End Sub From 9538e80fc2aa5a37e2c30564721fc6cf9049abb9 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Tue, 20 Jun 2017 19:02:27 +0100 Subject: [PATCH 115/201] fixing bugs on import dataset fixed bug in cloning RCodeStructure --- instat/clsInstatOptions.vb | 1 - instat/clsRCodeStructure.vb | 2 +- instat/clsRFunction.vb | 36 +- instat/clsROperator.vb | 38 +- instat/dlgImportDataset.Designer.vb | 954 ++++++++++++++-------------- instat/dlgImportDataset.vb | 662 +++++++++---------- instat/ucrSave.vb | 8 + 7 files changed, 839 insertions(+), 862 deletions(-) diff --git a/instat/clsInstatOptions.vb b/instat/clsInstatOptions.vb index 49458d1cb54..58a50f51b3f 100644 --- a/instat/clsInstatOptions.vb +++ b/instat/clsInstatOptions.vb @@ -209,7 +209,6 @@ Imports RDotNet Public Sub SetPreviewRows(intlines As Integer) iPreviewRows = intlines - dlgImportDataset.setLinesToRead(iPreviewRows) End Sub Public Sub SetComment(strText As String) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index 47a93633960..bacb6bfab5c 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -38,7 +38,7 @@ Public Class RCodeStructure Public bAssignToColumnWithoutNames As Boolean = False Public bInsertColumnBefore As Boolean = False Public clsParameters As New List(Of RParameter) - Private iNumberOfAddedParameters As Integer = 0 'This might be temporary, it enables to have a default name for parameters... + Protected iNumberOfAddedParameters As Integer = 0 'This might be temporary, it enables to have a default name for parameters... 'Currently only used when this is in RSyntax as a before/after code to determine position code should be run in the list 'Similar behaviour to parameter positions Public iPosition = -1 diff --git a/instat/clsRFunction.vb b/instat/clsRFunction.vb index 4d4ff7061d9..26f231a8e45 100644 --- a/instat/clsRFunction.vb +++ b/instat/clsRFunction.vb @@ -89,16 +89,34 @@ Public Class RFunction Public Overrides Function Clone() As RCodeStructure Dim clsRFunction As New RFunction - Dim clsTempCode As RCodeStructure + 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 + For Each clsRParam In clsParameters + clsRFunction.AddParameter(clsRParam.Clone) + Next + + 'RFunction specific properties + clsRFunction.strPackageName = strPackageName + clsRFunction.strRCommand = strRCommand - clsTempCode = MyBase.Clone() - clsRFunction = TryCast(clsTempCode, RFunction) - If clsRFunction IsNot Nothing Then - clsRFunction.strPackageName = strPackageName - clsRFunction.strRCommand = strRCommand - Else - clsRFunction = New RFunction - End If Return clsRFunction End Function diff --git a/instat/clsROperator.vb b/instat/clsROperator.vb index 719c345823a..8e59e21a27d 100644 --- a/instat/clsROperator.vb +++ b/instat/clsROperator.vb @@ -99,17 +99,35 @@ Public Class ROperator Public Overrides Function Clone() As RCodeStructure Dim clsTempROperator As New ROperator - Dim clsTempCode As RCodeStructure + 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 + For Each clsRParam In clsParameters + clsTempROperator.AddParameter(clsRParam.Clone) + Next + + 'ROperator specific properties + clsTempROperator.bForceIncludeOperation = bForceIncludeOperation + clsTempROperator.strOperation = strOperation + clsTempROperator.bBrackets = bBrackets - clsTempCode = MyBase.Clone() - clsTempROperator = TryCast(clsTempCode, ROperator) - If clsTempROperator IsNot Nothing Then - clsTempROperator.bForceIncludeOperation = bForceIncludeOperation - clsTempROperator.strOperation = strOperation - clsTempROperator.bBrackets = bBrackets - Else - clsTempROperator = New ROperator - End If Return clsTempROperator End Function End Class \ No newline at end of file diff --git a/instat/dlgImportDataset.Designer.vb b/instat/dlgImportDataset.Designer.vb index 9db687cc974..4e648a0c582 100644 --- a/instat/dlgImportDataset.Designer.vb +++ b/instat/dlgImportDataset.Designer.vb @@ -22,70 +22,71 @@ Partial Class dlgImportDataset 'Do not modify it using the code editor. Private Sub InitializeComponent() - Me.lblInputFile = New System.Windows.Forms.Label() + Me.lblTextFilePreview = New System.Windows.Forms.Label() Me.lblDataFrame = New System.Windows.Forms.Label() - Me.lblName = New System.Windows.Forms.Label() - Me.lblEncoding = New System.Windows.Forms.Label() - Me.lblHeaders = New System.Windows.Forms.Label() - Me.lblRowNames = New System.Windows.Forms.Label() - Me.lblSeparator = New System.Windows.Forms.Label() - Me.lblDecimal = New System.Windows.Forms.Label() - Me.txtPreview = New System.Windows.Forms.TextBox() + Me.lblEncodingCSV = New System.Windows.Forms.Label() + Me.lblHeadersCSV = New System.Windows.Forms.Label() + Me.lblRowNamesCSV = New System.Windows.Forms.Label() + Me.lblSeparatorCSV = New System.Windows.Forms.Label() + Me.lblDecimalCSV = New System.Windows.Forms.Label() + Me.txtTextFilePreview = New System.Windows.Forms.TextBox() Me.grdDataPreview = New unvell.ReoGrid.ReoGridControl() Me.lblFileOpenPath = New System.Windows.Forms.Label() - Me.lblLinesToSkip = New System.Windows.Forms.Label() - Me.cmdOpenDataSet = New System.Windows.Forms.Button() + Me.lblLinesToSkipCSV = New System.Windows.Forms.Label() + Me.cmdBrowse = New System.Windows.Forms.Button() Me.grpCSV = New System.Windows.Forms.GroupBox() - Me.ucrChkMissingValueStrings = New instat.ucrCheck() - Me.ucrChkStringsAsFactors = New instat.ucrCheck() - Me.ucrNudSkip = New instat.ucrNud() - Me.rdoRowNamesNo = New System.Windows.Forms.RadioButton() - Me.rdoRowNamesYes = New System.Windows.Forms.RadioButton() - Me.ucrPnlRowNames = New instat.UcrPanel() - Me.ucrInputHeaders = New instat.ucrInputComboBox() - Me.ucrInputNAStrings = New instat.ucrInputTextBox() - Me.ucrInputDecimal = New instat.ucrInputComboBox() - Me.ucrInputSeparator = New instat.ucrInputComboBox() - Me.ucrInputEncoding = New instat.ucrInputComboBox() + Me.lblNAStringsCSV = New System.Windows.Forms.Label() + Me.rdoRowNamesNoCSV = New System.Windows.Forms.RadioButton() + Me.rdoRowNamesYesCSV = New System.Windows.Forms.RadioButton() Me.grpExcel = New System.Windows.Forms.GroupBox() - Me.ucrChkMaximumDataSize = New instat.ucrCheck() - Me.ucrchkColumnNames = New instat.ucrCheck() - Me.ucrNudxlRowsToSkip = New instat.ucrNud() - Me.ucrInputMaximumDataSize = New instat.ucrInputTextBox() - Me.lblMissingValueString = New System.Windows.Forms.Label() - Me.ucrInputXlMissingValueString = New instat.ucrInputTextBox() - Me.ucrInputNamedRegions = New instat.ucrInputComboBox() + Me.lblMissingValueStringExcel = New System.Windows.Forms.Label() Me.lblNamedRegion = New System.Windows.Forms.Label() - Me.ucrInputSheets = New instat.ucrInputComboBox() - Me.lblRowToSkip = New System.Windows.Forms.Label() - Me.lblSheets = New System.Windows.Forms.Label() + Me.lblRowToSkipExcel = New System.Windows.Forms.Label() + Me.lblSelectSheetExcel = New System.Windows.Forms.Label() Me.grpRDS = New System.Windows.Forms.GroupBox() - Me.ucrChkOverWrite = New instat.ucrCheck() - Me.ucrChkImportObjects = New instat.ucrCheck() - Me.ucrChkImportCalculations = New instat.ucrCheck() - Me.ucrChkImportChangesLog = New instat.ucrCheck() - Me.ucrChkImportFilters = New instat.ucrCheck() - Me.ucrChkImportMetadata = New instat.ucrCheck() - Me.ucrChkExistingData = New instat.ucrCheck() Me.lblCannotImport = New System.Windows.Forms.Label() Me.lblNoPreview = New System.Windows.Forms.Label() + Me.lblLinesToPreview = New System.Windows.Forms.Label() + Me.ucrNudPreviewLines = New instat.ucrNud() + Me.ucrChkMaxRowsExcel = New instat.ucrCheck() + Me.ucrChkTrimWSExcel = New instat.ucrCheck() + Me.ucrNudRowsToSkipExcel = New instat.ucrNud() + Me.ucrInputMaxRowsExcel = New instat.ucrInputTextBox() + Me.ucrInputMissingValueStringExcel = New instat.ucrInputTextBox() + Me.ucrInputNamedRegions = New instat.ucrInputComboBox() + Me.ucrInputSelectSheetExcel = New instat.ucrInputComboBox() + Me.ucrSaveFile = New instat.ucrSave() + Me.ucrChkOverwriteRDS = New instat.ucrCheck() + Me.ucrChkImportObjectsRDS = New instat.ucrCheck() + Me.ucrChkImportCalculationsRDS = New instat.ucrCheck() + Me.ucrChkImportChangesLogRDS = New instat.ucrCheck() + Me.ucrChkImportFiltersRDS = New instat.ucrCheck() + Me.ucrChkImportMetadataRDS = New instat.ucrCheck() + Me.ucrChkKeepExistingDataRDS = New instat.ucrCheck() + Me.ucrChkStringsAsFactorsCSV = New instat.ucrCheck() + Me.ucrNudLinesToSkipCSV = New instat.ucrNud() + Me.ucrPnlRowNamesCSV = New instat.UcrPanel() + Me.ucrInputHeadersCSV = New instat.ucrInputComboBox() + Me.ucrInputNAStringsCSV = New instat.ucrInputTextBox() + Me.ucrInputDecimalCSV = New instat.ucrInputComboBox() + Me.ucrInputSeparatorCSV = New instat.ucrInputComboBox() + Me.ucrInputEncodingCSV = New instat.ucrInputComboBox() Me.ucrInputFilePath = New instat.ucrInputTextBox() - Me.ucrInputName = New instat.ucrInputTextBox() Me.ucrBase = New instat.ucrButtons() Me.grpCSV.SuspendLayout() Me.grpExcel.SuspendLayout() Me.grpRDS.SuspendLayout() Me.SuspendLayout() ' - 'lblInputFile + 'lblTextFilePreview ' - Me.lblInputFile.AutoSize = True - Me.lblInputFile.Location = New System.Drawing.Point(238, 9) - Me.lblInputFile.Name = "lblInputFile" - Me.lblInputFile.Size = New System.Drawing.Size(94, 13) - Me.lblInputFile.TabIndex = 0 - Me.lblInputFile.Tag = "Input_File_Preview" - Me.lblInputFile.Text = "Input File Preview:" + Me.lblTextFilePreview.AutoSize = True + Me.lblTextFilePreview.Location = New System.Drawing.Point(238, 9) + Me.lblTextFilePreview.Name = "lblTextFilePreview" + Me.lblTextFilePreview.Size = New System.Drawing.Size(91, 13) + Me.lblTextFilePreview.TabIndex = 0 + Me.lblTextFilePreview.Tag = "Input_File_Preview" + Me.lblTextFilePreview.Text = "Text File Preview:" ' 'lblDataFrame ' @@ -97,81 +98,71 @@ Partial Class dlgImportDataset Me.lblDataFrame.Tag = "Data_Frame_Preview" Me.lblDataFrame.Text = "Data Frame Preview:" ' - 'lblName - ' - Me.lblName.AutoSize = True - Me.lblName.Location = New System.Drawing.Point(8, 61) - Me.lblName.Name = "lblName" - Me.lblName.Size = New System.Drawing.Size(115, 13) - Me.lblName.TabIndex = 2 - Me.lblName.Tag = "New Dataframe Name" - Me.lblName.Text = "New Dataframe Name:" - ' - 'lblEncoding - ' - Me.lblEncoding.AutoSize = True - Me.lblEncoding.Location = New System.Drawing.Point(6, 27) - Me.lblEncoding.Name = "lblEncoding" - Me.lblEncoding.Size = New System.Drawing.Size(52, 13) - Me.lblEncoding.TabIndex = 3 - Me.lblEncoding.Tag = "Encoding" - Me.lblEncoding.Text = "Encoding" - ' - 'lblHeaders - ' - Me.lblHeaders.AutoSize = True - Me.lblHeaders.Location = New System.Drawing.Point(6, 63) - Me.lblHeaders.Name = "lblHeaders" - Me.lblHeaders.Size = New System.Drawing.Size(142, 13) - Me.lblHeaders.TabIndex = 4 - Me.lblHeaders.Tag = "Heading" - Me.lblHeaders.Text = "First Row is Column Headers" - ' - 'lblRowNames - ' - Me.lblRowNames.AutoSize = True - Me.lblRowNames.Location = New System.Drawing.Point(6, 108) - Me.lblRowNames.Name = "lblRowNames" - Me.lblRowNames.Size = New System.Drawing.Size(133, 13) - Me.lblRowNames.TabIndex = 5 - Me.lblRowNames.Tag = "Row_names" - Me.lblRowNames.Text = "First Column is Row names" - ' - 'lblSeparator - ' - Me.lblSeparator.AutoSize = True - Me.lblSeparator.Location = New System.Drawing.Point(6, 160) - Me.lblSeparator.Name = "lblSeparator" - Me.lblSeparator.Size = New System.Drawing.Size(53, 13) - Me.lblSeparator.TabIndex = 6 - Me.lblSeparator.Tag = "Separator" - Me.lblSeparator.Text = "Separator" - ' - 'lblDecimal - ' - Me.lblDecimal.AutoSize = True - Me.lblDecimal.Location = New System.Drawing.Point(8, 199) - Me.lblDecimal.Name = "lblDecimal" - Me.lblDecimal.Size = New System.Drawing.Size(45, 13) - Me.lblDecimal.TabIndex = 7 - Me.lblDecimal.Tag = "Decimal" - Me.lblDecimal.Text = "Decimal" - ' - 'txtPreview - ' - Me.txtPreview.Location = New System.Drawing.Point(241, 25) - Me.txtPreview.Multiline = True - Me.txtPreview.Name = "txtPreview" - Me.txtPreview.ScrollBars = System.Windows.Forms.ScrollBars.Both - Me.txtPreview.Size = New System.Drawing.Size(422, 205) - Me.txtPreview.TabIndex = 22 + 'lblEncodingCSV + ' + Me.lblEncodingCSV.AutoSize = True + Me.lblEncodingCSV.Location = New System.Drawing.Point(6, 27) + Me.lblEncodingCSV.Name = "lblEncodingCSV" + Me.lblEncodingCSV.Size = New System.Drawing.Size(52, 13) + Me.lblEncodingCSV.TabIndex = 3 + Me.lblEncodingCSV.Tag = "Encoding" + Me.lblEncodingCSV.Text = "Encoding" + ' + 'lblHeadersCSV + ' + Me.lblHeadersCSV.AutoSize = True + Me.lblHeadersCSV.Location = New System.Drawing.Point(6, 63) + Me.lblHeadersCSV.Name = "lblHeadersCSV" + Me.lblHeadersCSV.Size = New System.Drawing.Size(142, 13) + Me.lblHeadersCSV.TabIndex = 4 + Me.lblHeadersCSV.Tag = "Heading" + Me.lblHeadersCSV.Text = "First Row is Column Headers" + ' + 'lblRowNamesCSV + ' + Me.lblRowNamesCSV.AutoSize = True + Me.lblRowNamesCSV.Location = New System.Drawing.Point(6, 108) + Me.lblRowNamesCSV.Name = "lblRowNamesCSV" + Me.lblRowNamesCSV.Size = New System.Drawing.Size(133, 13) + Me.lblRowNamesCSV.TabIndex = 5 + Me.lblRowNamesCSV.Tag = "Row_names" + Me.lblRowNamesCSV.Text = "First Column is Row names" + ' + 'lblSeparatorCSV + ' + Me.lblSeparatorCSV.AutoSize = True + Me.lblSeparatorCSV.Location = New System.Drawing.Point(8, 160) + Me.lblSeparatorCSV.Name = "lblSeparatorCSV" + Me.lblSeparatorCSV.Size = New System.Drawing.Size(53, 13) + Me.lblSeparatorCSV.TabIndex = 6 + Me.lblSeparatorCSV.Tag = "Separator" + Me.lblSeparatorCSV.Text = "Separator" + ' + 'lblDecimalCSV + ' + Me.lblDecimalCSV.AutoSize = True + Me.lblDecimalCSV.Location = New System.Drawing.Point(8, 199) + Me.lblDecimalCSV.Name = "lblDecimalCSV" + Me.lblDecimalCSV.Size = New System.Drawing.Size(45, 13) + Me.lblDecimalCSV.TabIndex = 7 + Me.lblDecimalCSV.Tag = "Decimal" + Me.lblDecimalCSV.Text = "Decimal" + ' + 'txtTextFilePreview + ' + Me.txtTextFilePreview.Location = New System.Drawing.Point(241, 25) + Me.txtTextFilePreview.Multiline = True + Me.txtTextFilePreview.Name = "txtTextFilePreview" + Me.txtTextFilePreview.ScrollBars = System.Windows.Forms.ScrollBars.Both + Me.txtTextFilePreview.Size = New System.Drawing.Size(422, 205) + Me.txtTextFilePreview.TabIndex = 22 ' 'grdDataPreview ' Me.grdDataPreview.BackColor = System.Drawing.Color.White Me.grdDataPreview.ColumnHeaderContextMenuStrip = Nothing Me.grdDataPreview.LeadHeaderContextMenuStrip = Nothing - Me.grdDataPreview.Location = New System.Drawing.Point(241, 256) + Me.grdDataPreview.Location = New System.Drawing.Point(241, 263) Me.grdDataPreview.Name = "grdDataPreview" Me.grdDataPreview.Readonly = True Me.grdDataPreview.RowHeaderContextMenuStrip = Nothing @@ -193,173 +184,101 @@ Partial Class dlgImportDataset Me.lblFileOpenPath.TabIndex = 29 Me.lblFileOpenPath.Text = "File:" ' - 'lblLinesToSkip + 'lblLinesToSkipCSV ' - Me.lblLinesToSkip.AutoSize = True - Me.lblLinesToSkip.Location = New System.Drawing.Point(3, 280) - Me.lblLinesToSkip.Name = "lblLinesToSkip" - Me.lblLinesToSkip.Size = New System.Drawing.Size(72, 13) - Me.lblLinesToSkip.TabIndex = 30 - Me.lblLinesToSkip.Text = "Lines To Skip" + Me.lblLinesToSkipCSV.AutoSize = True + Me.lblLinesToSkipCSV.Location = New System.Drawing.Point(8, 277) + Me.lblLinesToSkipCSV.Name = "lblLinesToSkipCSV" + Me.lblLinesToSkipCSV.Size = New System.Drawing.Size(72, 13) + Me.lblLinesToSkipCSV.TabIndex = 30 + Me.lblLinesToSkipCSV.Text = "Lines To Skip" ' - 'cmdOpenDataSet + 'cmdBrowse ' - Me.cmdOpenDataSet.Location = New System.Drawing.Point(164, 22) - Me.cmdOpenDataSet.Name = "cmdOpenDataSet" - Me.cmdOpenDataSet.Size = New System.Drawing.Size(66, 23) - Me.cmdOpenDataSet.TabIndex = 33 - Me.cmdOpenDataSet.Tag = "browse" - Me.cmdOpenDataSet.Text = "Browse" - Me.cmdOpenDataSet.UseVisualStyleBackColor = True + Me.cmdBrowse.Location = New System.Drawing.Point(164, 22) + Me.cmdBrowse.Name = "cmdBrowse" + Me.cmdBrowse.Size = New System.Drawing.Size(66, 23) + Me.cmdBrowse.TabIndex = 33 + Me.cmdBrowse.Tag = "browse" + Me.cmdBrowse.Text = "Browse" + Me.cmdBrowse.UseVisualStyleBackColor = True ' 'grpCSV ' Me.grpCSV.AutoSize = True Me.grpCSV.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.grpCSV.Controls.Add(Me.ucrChkMissingValueStrings) - Me.grpCSV.Controls.Add(Me.ucrChkStringsAsFactors) - Me.grpCSV.Controls.Add(Me.ucrNudSkip) - Me.grpCSV.Controls.Add(Me.rdoRowNamesNo) - Me.grpCSV.Controls.Add(Me.rdoRowNamesYes) - Me.grpCSV.Controls.Add(Me.ucrPnlRowNames) - Me.grpCSV.Controls.Add(Me.ucrInputHeaders) - Me.grpCSV.Controls.Add(Me.ucrInputNAStrings) - Me.grpCSV.Controls.Add(Me.ucrInputDecimal) - Me.grpCSV.Controls.Add(Me.ucrInputSeparator) - Me.grpCSV.Controls.Add(Me.ucrInputEncoding) - Me.grpCSV.Controls.Add(Me.lblEncoding) - Me.grpCSV.Controls.Add(Me.lblHeaders) - Me.grpCSV.Controls.Add(Me.lblRowNames) - Me.grpCSV.Controls.Add(Me.lblSeparator) - Me.grpCSV.Controls.Add(Me.lblLinesToSkip) - Me.grpCSV.Controls.Add(Me.lblDecimal) - Me.grpCSV.Location = New System.Drawing.Point(10, 86) + Me.grpCSV.Controls.Add(Me.lblNAStringsCSV) + Me.grpCSV.Controls.Add(Me.ucrChkStringsAsFactorsCSV) + Me.grpCSV.Controls.Add(Me.ucrNudLinesToSkipCSV) + Me.grpCSV.Controls.Add(Me.rdoRowNamesNoCSV) + Me.grpCSV.Controls.Add(Me.rdoRowNamesYesCSV) + Me.grpCSV.Controls.Add(Me.ucrPnlRowNamesCSV) + Me.grpCSV.Controls.Add(Me.ucrInputHeadersCSV) + Me.grpCSV.Controls.Add(Me.ucrInputNAStringsCSV) + Me.grpCSV.Controls.Add(Me.ucrInputDecimalCSV) + Me.grpCSV.Controls.Add(Me.ucrInputSeparatorCSV) + Me.grpCSV.Controls.Add(Me.ucrInputEncodingCSV) + Me.grpCSV.Controls.Add(Me.lblEncodingCSV) + Me.grpCSV.Controls.Add(Me.lblHeadersCSV) + Me.grpCSV.Controls.Add(Me.lblRowNamesCSV) + Me.grpCSV.Controls.Add(Me.lblSeparatorCSV) + Me.grpCSV.Controls.Add(Me.lblLinesToSkipCSV) + Me.grpCSV.Controls.Add(Me.lblDecimalCSV) + Me.grpCSV.Location = New System.Drawing.Point(10, 85) Me.grpCSV.Name = "grpCSV" - Me.grpCSV.Size = New System.Drawing.Size(219, 346) + Me.grpCSV.Size = New System.Drawing.Size(220, 346) Me.grpCSV.TabIndex = 34 Me.grpCSV.TabStop = False Me.grpCSV.Text = "Import csv Options" Me.grpCSV.Visible = False ' - 'ucrChkMissingValueStrings - ' - Me.ucrChkMissingValueStrings.Checked = False - Me.ucrChkMissingValueStrings.Location = New System.Drawing.Point(5, 225) - Me.ucrChkMissingValueStrings.Name = "ucrChkMissingValueStrings" - Me.ucrChkMissingValueStrings.Size = New System.Drawing.Size(173, 20) - Me.ucrChkMissingValueStrings.TabIndex = 51 - ' - 'ucrChkStringsAsFactors - ' - Me.ucrChkStringsAsFactors.Checked = False - Me.ucrChkStringsAsFactors.Location = New System.Drawing.Point(7, 307) - Me.ucrChkStringsAsFactors.Name = "ucrChkStringsAsFactors" - Me.ucrChkStringsAsFactors.Size = New System.Drawing.Size(206, 20) - Me.ucrChkStringsAsFactors.TabIndex = 43 - ' - 'ucrNudSkip - ' - Me.ucrNudSkip.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSkip.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudSkip.Location = New System.Drawing.Point(81, 277) - Me.ucrNudSkip.Maximum = New Decimal(New Integer() {1000000, 0, 0, 0}) - Me.ucrNudSkip.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSkip.Name = "ucrNudSkip" - Me.ucrNudSkip.Size = New System.Drawing.Size(50, 20) - Me.ucrNudSkip.TabIndex = 47 - Me.ucrNudSkip.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'rdoRowNamesNo - ' - Me.rdoRowNamesNo.AutoSize = True - Me.rdoRowNamesNo.Location = New System.Drawing.Point(70, 130) - Me.rdoRowNamesNo.Name = "rdoRowNamesNo" - Me.rdoRowNamesNo.Size = New System.Drawing.Size(39, 17) - Me.rdoRowNamesNo.TabIndex = 46 - Me.rdoRowNamesNo.TabStop = True - Me.rdoRowNamesNo.Tag = "No" - Me.rdoRowNamesNo.Text = "No" - Me.rdoRowNamesNo.UseVisualStyleBackColor = True - ' - 'rdoRowNamesYes - ' - Me.rdoRowNamesYes.AutoSize = True - Me.rdoRowNamesYes.Location = New System.Drawing.Point(21, 131) - Me.rdoRowNamesYes.Name = "rdoRowNamesYes" - Me.rdoRowNamesYes.Size = New System.Drawing.Size(43, 17) - Me.rdoRowNamesYes.TabIndex = 45 - Me.rdoRowNamesYes.TabStop = True - Me.rdoRowNamesYes.Tag = "Yes" - Me.rdoRowNamesYes.Text = "Yes" - Me.rdoRowNamesYes.UseVisualStyleBackColor = True - ' - 'ucrPnlRowNames - ' - Me.ucrPnlRowNames.Location = New System.Drawing.Point(15, 124) - Me.ucrPnlRowNames.Name = "ucrPnlRowNames" - Me.ucrPnlRowNames.Size = New System.Drawing.Size(113, 24) - Me.ucrPnlRowNames.TabIndex = 44 - ' - 'ucrInputHeaders - ' - Me.ucrInputHeaders.AddQuotesIfUnrecognised = True - Me.ucrInputHeaders.IsReadOnly = False - Me.ucrInputHeaders.Location = New System.Drawing.Point(9, 82) - Me.ucrInputHeaders.Name = "ucrInputHeaders" - Me.ucrInputHeaders.Size = New System.Drawing.Size(149, 21) - Me.ucrInputHeaders.TabIndex = 43 - ' - 'ucrInputNAStrings - ' - Me.ucrInputNAStrings.AddQuotesIfUnrecognised = True - Me.ucrInputNAStrings.IsMultiline = False - Me.ucrInputNAStrings.IsReadOnly = False - Me.ucrInputNAStrings.Location = New System.Drawing.Point(6, 248) - Me.ucrInputNAStrings.Name = "ucrInputNAStrings" - Me.ucrInputNAStrings.Size = New System.Drawing.Size(137, 21) - Me.ucrInputNAStrings.TabIndex = 39 - ' - 'ucrInputDecimal - ' - Me.ucrInputDecimal.AddQuotesIfUnrecognised = True - Me.ucrInputDecimal.IsReadOnly = False - Me.ucrInputDecimal.Location = New System.Drawing.Point(74, 196) - Me.ucrInputDecimal.Name = "ucrInputDecimal" - Me.ucrInputDecimal.Size = New System.Drawing.Size(137, 21) - Me.ucrInputDecimal.TabIndex = 36 - ' - 'ucrInputSeparator - ' - Me.ucrInputSeparator.AddQuotesIfUnrecognised = True - Me.ucrInputSeparator.IsReadOnly = False - Me.ucrInputSeparator.Location = New System.Drawing.Point(74, 154) - Me.ucrInputSeparator.Name = "ucrInputSeparator" - Me.ucrInputSeparator.Size = New System.Drawing.Size(137, 21) - Me.ucrInputSeparator.TabIndex = 35 - ' - 'ucrInputEncoding - ' - Me.ucrInputEncoding.AddQuotesIfUnrecognised = True - Me.ucrInputEncoding.IsReadOnly = False - Me.ucrInputEncoding.Location = New System.Drawing.Point(62, 25) - Me.ucrInputEncoding.Name = "ucrInputEncoding" - Me.ucrInputEncoding.Size = New System.Drawing.Size(149, 21) - Me.ucrInputEncoding.TabIndex = 33 + 'lblNAStringsCSV + ' + Me.lblNAStringsCSV.AutoSize = True + Me.lblNAStringsCSV.Location = New System.Drawing.Point(8, 239) + Me.lblNAStringsCSV.Name = "lblNAStringsCSV" + Me.lblNAStringsCSV.Size = New System.Drawing.Size(102, 13) + Me.lblNAStringsCSV.TabIndex = 48 + Me.lblNAStringsCSV.Text = "Missing Value String" + ' + 'rdoRowNamesNoCSV + ' + Me.rdoRowNamesNoCSV.AutoSize = True + Me.rdoRowNamesNoCSV.Location = New System.Drawing.Point(70, 130) + Me.rdoRowNamesNoCSV.Name = "rdoRowNamesNoCSV" + Me.rdoRowNamesNoCSV.Size = New System.Drawing.Size(39, 17) + Me.rdoRowNamesNoCSV.TabIndex = 46 + Me.rdoRowNamesNoCSV.TabStop = True + Me.rdoRowNamesNoCSV.Tag = "No" + Me.rdoRowNamesNoCSV.Text = "No" + Me.rdoRowNamesNoCSV.UseVisualStyleBackColor = True + ' + 'rdoRowNamesYesCSV + ' + Me.rdoRowNamesYesCSV.AutoSize = True + Me.rdoRowNamesYesCSV.Location = New System.Drawing.Point(21, 131) + Me.rdoRowNamesYesCSV.Name = "rdoRowNamesYesCSV" + Me.rdoRowNamesYesCSV.Size = New System.Drawing.Size(43, 17) + Me.rdoRowNamesYesCSV.TabIndex = 45 + Me.rdoRowNamesYesCSV.TabStop = True + Me.rdoRowNamesYesCSV.Tag = "Yes" + Me.rdoRowNamesYesCSV.Text = "Yes" + Me.rdoRowNamesYesCSV.UseVisualStyleBackColor = True ' 'grpExcel ' - Me.grpExcel.Controls.Add(Me.ucrChkMaximumDataSize) - Me.grpExcel.Controls.Add(Me.ucrchkColumnNames) - Me.grpExcel.Controls.Add(Me.ucrNudxlRowsToSkip) - Me.grpExcel.Controls.Add(Me.ucrInputMaximumDataSize) - Me.grpExcel.Controls.Add(Me.lblMissingValueString) - Me.grpExcel.Controls.Add(Me.ucrInputXlMissingValueString) + Me.grpExcel.Controls.Add(Me.ucrChkMaxRowsExcel) + Me.grpExcel.Controls.Add(Me.ucrChkTrimWSExcel) + Me.grpExcel.Controls.Add(Me.ucrNudRowsToSkipExcel) + Me.grpExcel.Controls.Add(Me.ucrInputMaxRowsExcel) + Me.grpExcel.Controls.Add(Me.lblMissingValueStringExcel) + Me.grpExcel.Controls.Add(Me.ucrInputMissingValueStringExcel) Me.grpExcel.Controls.Add(Me.ucrInputNamedRegions) Me.grpExcel.Controls.Add(Me.lblNamedRegion) - Me.grpExcel.Controls.Add(Me.ucrInputSheets) - Me.grpExcel.Controls.Add(Me.lblRowToSkip) - Me.grpExcel.Controls.Add(Me.lblSheets) - Me.grpExcel.Location = New System.Drawing.Point(1, 0) + Me.grpExcel.Controls.Add(Me.ucrInputSelectSheetExcel) + Me.grpExcel.Controls.Add(Me.lblRowToSkipExcel) + Me.grpExcel.Controls.Add(Me.lblSelectSheetExcel) + Me.grpExcel.Location = New System.Drawing.Point(10, 85) Me.grpExcel.Name = "grpExcel" Me.grpExcel.Size = New System.Drawing.Size(217, 392) Me.grpExcel.TabIndex = 35 @@ -367,71 +286,14 @@ Partial Class dlgImportDataset Me.grpExcel.Text = "Import Excel options" Me.grpExcel.Visible = False ' - 'ucrChkMaximumDataSize - ' - Me.ucrChkMaximumDataSize.Checked = False - Me.ucrChkMaximumDataSize.Location = New System.Drawing.Point(6, 168) - Me.ucrChkMaximumDataSize.Name = "ucrChkMaximumDataSize" - Me.ucrChkMaximumDataSize.Size = New System.Drawing.Size(173, 20) - Me.ucrChkMaximumDataSize.TabIndex = 50 - ' - 'ucrchkColumnNames - ' - Me.ucrchkColumnNames.Checked = False - Me.ucrchkColumnNames.Location = New System.Drawing.Point(9, 116) - Me.ucrchkColumnNames.Name = "ucrchkColumnNames" - Me.ucrchkColumnNames.Size = New System.Drawing.Size(170, 20) - Me.ucrchkColumnNames.TabIndex = 39 - ' - 'ucrNudxlRowsToSkip - ' - Me.ucrNudxlRowsToSkip.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudxlRowsToSkip.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudxlRowsToSkip.Location = New System.Drawing.Point(84, 138) - Me.ucrNudxlRowsToSkip.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudxlRowsToSkip.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudxlRowsToSkip.Name = "ucrNudxlRowsToSkip" - Me.ucrNudxlRowsToSkip.Size = New System.Drawing.Size(50, 20) - Me.ucrNudxlRowsToSkip.TabIndex = 42 - Me.ucrNudxlRowsToSkip.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrInputMaximumDataSize - ' - Me.ucrInputMaximumDataSize.AddQuotesIfUnrecognised = True - Me.ucrInputMaximumDataSize.IsMultiline = False - Me.ucrInputMaximumDataSize.IsReadOnly = False - Me.ucrInputMaximumDataSize.Location = New System.Drawing.Point(6, 194) - Me.ucrInputMaximumDataSize.Name = "ucrInputMaximumDataSize" - Me.ucrInputMaximumDataSize.Size = New System.Drawing.Size(137, 21) - Me.ucrInputMaximumDataSize.TabIndex = 40 - ' - 'lblMissingValueString - ' - Me.lblMissingValueString.AutoSize = True - Me.lblMissingValueString.Location = New System.Drawing.Point(6, 73) - Me.lblMissingValueString.Name = "lblMissingValueString" - Me.lblMissingValueString.Size = New System.Drawing.Size(102, 13) - Me.lblMissingValueString.TabIndex = 19 - Me.lblMissingValueString.Text = "Missing Value String" - ' - 'ucrInputXlMissingValueString - ' - Me.ucrInputXlMissingValueString.AddQuotesIfUnrecognised = True - Me.ucrInputXlMissingValueString.IsMultiline = False - Me.ucrInputXlMissingValueString.IsReadOnly = False - Me.ucrInputXlMissingValueString.Location = New System.Drawing.Point(10, 90) - Me.ucrInputXlMissingValueString.Name = "ucrInputXlMissingValueString" - Me.ucrInputXlMissingValueString.Size = New System.Drawing.Size(137, 21) - Me.ucrInputXlMissingValueString.TabIndex = 18 + 'lblMissingValueStringExcel ' - 'ucrInputNamedRegions - ' - Me.ucrInputNamedRegions.AddQuotesIfUnrecognised = True - Me.ucrInputNamedRegions.IsReadOnly = False - Me.ucrInputNamedRegions.Location = New System.Drawing.Point(10, 90) - Me.ucrInputNamedRegions.Name = "ucrInputNamedRegions" - Me.ucrInputNamedRegions.Size = New System.Drawing.Size(154, 21) - Me.ucrInputNamedRegions.TabIndex = 16 + Me.lblMissingValueStringExcel.AutoSize = True + Me.lblMissingValueStringExcel.Location = New System.Drawing.Point(6, 73) + Me.lblMissingValueStringExcel.Name = "lblMissingValueStringExcel" + Me.lblMissingValueStringExcel.Size = New System.Drawing.Size(102, 13) + Me.lblMissingValueStringExcel.TabIndex = 19 + Me.lblMissingValueStringExcel.Text = "Missing Value String" ' 'lblNamedRegion ' @@ -442,44 +304,34 @@ Partial Class dlgImportDataset Me.lblNamedRegion.TabIndex = 17 Me.lblNamedRegion.Text = "or Named Region" ' - 'ucrInputSheets - ' - Me.ucrInputSheets.AddQuotesIfUnrecognised = True - Me.ucrInputSheets.IsReadOnly = False - Me.ucrInputSheets.Location = New System.Drawing.Point(6, 43) - Me.ucrInputSheets.Name = "ucrInputSheets" - Me.ucrInputSheets.Size = New System.Drawing.Size(154, 21) - Me.ucrInputSheets.TabIndex = 15 + 'lblRowToSkipExcel ' - 'lblRowToSkip + Me.lblRowToSkipExcel.AutoSize = True + Me.lblRowToSkipExcel.Location = New System.Drawing.Point(3, 140) + Me.lblRowToSkipExcel.Name = "lblRowToSkipExcel" + Me.lblRowToSkipExcel.Size = New System.Drawing.Size(70, 13) + Me.lblRowToSkipExcel.TabIndex = 7 + Me.lblRowToSkipExcel.Text = "Rows to Skip" ' - Me.lblRowToSkip.AutoSize = True - Me.lblRowToSkip.Location = New System.Drawing.Point(3, 140) - Me.lblRowToSkip.Name = "lblRowToSkip" - Me.lblRowToSkip.Size = New System.Drawing.Size(70, 13) - Me.lblRowToSkip.TabIndex = 7 - Me.lblRowToSkip.Text = "Rows to Skip" + 'lblSelectSheetExcel ' - 'lblSheets - ' - Me.lblSheets.AutoSize = True - Me.lblSheets.Location = New System.Drawing.Point(6, 27) - Me.lblSheets.Name = "lblSheets" - Me.lblSheets.Size = New System.Drawing.Size(68, 13) - Me.lblSheets.TabIndex = 6 - Me.lblSheets.Text = "Select Sheet" + Me.lblSelectSheetExcel.AutoSize = True + Me.lblSelectSheetExcel.Location = New System.Drawing.Point(6, 27) + Me.lblSelectSheetExcel.Name = "lblSelectSheetExcel" + Me.lblSelectSheetExcel.Size = New System.Drawing.Size(68, 13) + Me.lblSelectSheetExcel.TabIndex = 6 + Me.lblSelectSheetExcel.Text = "Select Sheet" ' 'grpRDS ' - Me.grpRDS.Controls.Add(Me.ucrChkOverWrite) - Me.grpRDS.Controls.Add(Me.ucrChkImportObjects) - Me.grpRDS.Controls.Add(Me.grpExcel) - Me.grpRDS.Controls.Add(Me.ucrChkImportCalculations) - Me.grpRDS.Controls.Add(Me.ucrChkImportChangesLog) - Me.grpRDS.Controls.Add(Me.ucrChkImportFilters) - Me.grpRDS.Controls.Add(Me.ucrChkImportMetadata) - Me.grpRDS.Controls.Add(Me.ucrChkExistingData) - Me.grpRDS.Location = New System.Drawing.Point(11, 86) + Me.grpRDS.Controls.Add(Me.ucrChkOverwriteRDS) + Me.grpRDS.Controls.Add(Me.ucrChkImportObjectsRDS) + Me.grpRDS.Controls.Add(Me.ucrChkImportCalculationsRDS) + Me.grpRDS.Controls.Add(Me.ucrChkImportChangesLogRDS) + Me.grpRDS.Controls.Add(Me.ucrChkImportFiltersRDS) + Me.grpRDS.Controls.Add(Me.ucrChkImportMetadataRDS) + Me.grpRDS.Controls.Add(Me.ucrChkKeepExistingDataRDS) + Me.grpRDS.Location = New System.Drawing.Point(10, 85) Me.grpRDS.Name = "grpRDS" Me.grpRDS.Size = New System.Drawing.Size(217, 166) Me.grpRDS.TabIndex = 37 @@ -487,62 +339,6 @@ Partial Class dlgImportDataset Me.grpRDS.Text = "Import RDS options" Me.grpRDS.Visible = False ' - 'ucrChkOverWrite - ' - Me.ucrChkOverWrite.Checked = False - Me.ucrChkOverWrite.Location = New System.Drawing.Point(6, 134) - Me.ucrChkOverWrite.Name = "ucrChkOverWrite" - Me.ucrChkOverWrite.Size = New System.Drawing.Size(205, 20) - Me.ucrChkOverWrite.TabIndex = 49 - ' - 'ucrChkImportObjects - ' - Me.ucrChkImportObjects.Checked = False - Me.ucrChkImportObjects.Location = New System.Drawing.Point(6, 54) - Me.ucrChkImportObjects.Name = "ucrChkImportObjects" - Me.ucrChkImportObjects.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportObjects.TabIndex = 48 - ' - 'ucrChkImportCalculations - ' - Me.ucrChkImportCalculations.Checked = False - Me.ucrChkImportCalculations.Location = New System.Drawing.Point(6, 94) - Me.ucrChkImportCalculations.Name = "ucrChkImportCalculations" - Me.ucrChkImportCalculations.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportCalculations.TabIndex = 47 - ' - 'ucrChkImportChangesLog - ' - Me.ucrChkImportChangesLog.Checked = False - Me.ucrChkImportChangesLog.Location = New System.Drawing.Point(6, 114) - Me.ucrChkImportChangesLog.Name = "ucrChkImportChangesLog" - Me.ucrChkImportChangesLog.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportChangesLog.TabIndex = 46 - ' - 'ucrChkImportFilters - ' - Me.ucrChkImportFilters.Checked = False - Me.ucrChkImportFilters.Location = New System.Drawing.Point(6, 74) - Me.ucrChkImportFilters.Name = "ucrChkImportFilters" - Me.ucrChkImportFilters.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportFilters.TabIndex = 45 - ' - 'ucrChkImportMetadata - ' - Me.ucrChkImportMetadata.Checked = False - Me.ucrChkImportMetadata.Location = New System.Drawing.Point(6, 34) - Me.ucrChkImportMetadata.Name = "ucrChkImportMetadata" - Me.ucrChkImportMetadata.Size = New System.Drawing.Size(205, 20) - Me.ucrChkImportMetadata.TabIndex = 44 - ' - 'ucrChkExistingData - ' - Me.ucrChkExistingData.Checked = False - Me.ucrChkExistingData.Location = New System.Drawing.Point(6, 14) - Me.ucrChkExistingData.Name = "ucrChkExistingData" - Me.ucrChkExistingData.Size = New System.Drawing.Size(205, 20) - Me.ucrChkExistingData.TabIndex = 43 - ' 'lblCannotImport ' Me.lblCannotImport.AutoSize = True @@ -562,12 +358,235 @@ Partial Class dlgImportDataset Me.lblNoPreview.Font = New System.Drawing.Font("Microsoft Sans Serif", 11.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.lblNoPreview.Location = New System.Drawing.Point(298, 318) Me.lblNoPreview.Name = "lblNoPreview" - Me.lblNoPreview.Size = New System.Drawing.Size(333, 18) + Me.lblNoPreview.Size = New System.Drawing.Size(302, 18) Me.lblNoPreview.TabIndex = 38 - Me.lblNoPreview.Text = "Data Frame Preview not available for this file type." + Me.lblNoPreview.Text = "Preview not yet implemented for this file type." Me.lblNoPreview.TextAlign = System.Drawing.ContentAlignment.TopCenter Me.lblNoPreview.Visible = False ' + 'lblLinesToPreview + ' + Me.lblLinesToPreview.AutoSize = True + Me.lblLinesToPreview.Location = New System.Drawing.Point(519, 239) + Me.lblLinesToPreview.Name = "lblLinesToPreview" + Me.lblLinesToPreview.Size = New System.Drawing.Size(88, 13) + Me.lblLinesToPreview.TabIndex = 41 + Me.lblLinesToPreview.Text = "Lines to Preview:" + ' + 'ucrNudPreviewLines + ' + Me.ucrNudPreviewLines.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudPreviewLines.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudPreviewLines.Location = New System.Drawing.Point(613, 236) + Me.ucrNudPreviewLines.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudPreviewLines.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudPreviewLines.Name = "ucrNudPreviewLines" + Me.ucrNudPreviewLines.Size = New System.Drawing.Size(50, 20) + Me.ucrNudPreviewLines.TabIndex = 40 + Me.ucrNudPreviewLines.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkMaxRowsExcel + ' + Me.ucrChkMaxRowsExcel.Checked = False + Me.ucrChkMaxRowsExcel.Location = New System.Drawing.Point(6, 168) + Me.ucrChkMaxRowsExcel.Name = "ucrChkMaxRowsExcel" + Me.ucrChkMaxRowsExcel.Size = New System.Drawing.Size(173, 20) + Me.ucrChkMaxRowsExcel.TabIndex = 50 + ' + 'ucrChkTrimWSExcel + ' + Me.ucrChkTrimWSExcel.Checked = False + Me.ucrChkTrimWSExcel.Location = New System.Drawing.Point(9, 116) + Me.ucrChkTrimWSExcel.Name = "ucrChkTrimWSExcel" + Me.ucrChkTrimWSExcel.Size = New System.Drawing.Size(170, 20) + Me.ucrChkTrimWSExcel.TabIndex = 39 + ' + 'ucrNudRowsToSkipExcel + ' + Me.ucrNudRowsToSkipExcel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudRowsToSkipExcel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudRowsToSkipExcel.Location = New System.Drawing.Point(84, 138) + Me.ucrNudRowsToSkipExcel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudRowsToSkipExcel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudRowsToSkipExcel.Name = "ucrNudRowsToSkipExcel" + Me.ucrNudRowsToSkipExcel.Size = New System.Drawing.Size(50, 20) + Me.ucrNudRowsToSkipExcel.TabIndex = 42 + Me.ucrNudRowsToSkipExcel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrInputMaxRowsExcel + ' + Me.ucrInputMaxRowsExcel.AddQuotesIfUnrecognised = True + Me.ucrInputMaxRowsExcel.IsMultiline = False + Me.ucrInputMaxRowsExcel.IsReadOnly = False + Me.ucrInputMaxRowsExcel.Location = New System.Drawing.Point(6, 194) + Me.ucrInputMaxRowsExcel.Name = "ucrInputMaxRowsExcel" + Me.ucrInputMaxRowsExcel.Size = New System.Drawing.Size(137, 21) + Me.ucrInputMaxRowsExcel.TabIndex = 40 + ' + 'ucrInputMissingValueStringExcel + ' + Me.ucrInputMissingValueStringExcel.AddQuotesIfUnrecognised = True + Me.ucrInputMissingValueStringExcel.IsMultiline = False + Me.ucrInputMissingValueStringExcel.IsReadOnly = False + Me.ucrInputMissingValueStringExcel.Location = New System.Drawing.Point(10, 90) + Me.ucrInputMissingValueStringExcel.Name = "ucrInputMissingValueStringExcel" + Me.ucrInputMissingValueStringExcel.Size = New System.Drawing.Size(137, 21) + Me.ucrInputMissingValueStringExcel.TabIndex = 18 + ' + 'ucrInputNamedRegions + ' + Me.ucrInputNamedRegions.AddQuotesIfUnrecognised = True + Me.ucrInputNamedRegions.IsReadOnly = False + Me.ucrInputNamedRegions.Location = New System.Drawing.Point(10, 90) + Me.ucrInputNamedRegions.Name = "ucrInputNamedRegions" + Me.ucrInputNamedRegions.Size = New System.Drawing.Size(154, 21) + Me.ucrInputNamedRegions.TabIndex = 16 + ' + 'ucrInputSelectSheetExcel + ' + Me.ucrInputSelectSheetExcel.AddQuotesIfUnrecognised = True + Me.ucrInputSelectSheetExcel.IsReadOnly = False + Me.ucrInputSelectSheetExcel.Location = New System.Drawing.Point(6, 43) + Me.ucrInputSelectSheetExcel.Name = "ucrInputSelectSheetExcel" + Me.ucrInputSelectSheetExcel.Size = New System.Drawing.Size(154, 21) + Me.ucrInputSelectSheetExcel.TabIndex = 15 + ' + 'ucrSaveFile + ' + Me.ucrSaveFile.Location = New System.Drawing.Point(10, 52) + Me.ucrSaveFile.Name = "ucrSaveFile" + Me.ucrSaveFile.Size = New System.Drawing.Size(220, 24) + Me.ucrSaveFile.TabIndex = 39 + ' + 'ucrChkOverwriteRDS + ' + Me.ucrChkOverwriteRDS.Checked = False + Me.ucrChkOverwriteRDS.Location = New System.Drawing.Point(6, 134) + Me.ucrChkOverwriteRDS.Name = "ucrChkOverwriteRDS" + Me.ucrChkOverwriteRDS.Size = New System.Drawing.Size(205, 20) + Me.ucrChkOverwriteRDS.TabIndex = 49 + ' + 'ucrChkImportObjectsRDS + ' + Me.ucrChkImportObjectsRDS.Checked = False + Me.ucrChkImportObjectsRDS.Location = New System.Drawing.Point(6, 54) + Me.ucrChkImportObjectsRDS.Name = "ucrChkImportObjectsRDS" + Me.ucrChkImportObjectsRDS.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportObjectsRDS.TabIndex = 48 + ' + 'ucrChkImportCalculationsRDS + ' + Me.ucrChkImportCalculationsRDS.Checked = False + Me.ucrChkImportCalculationsRDS.Location = New System.Drawing.Point(6, 94) + Me.ucrChkImportCalculationsRDS.Name = "ucrChkImportCalculationsRDS" + Me.ucrChkImportCalculationsRDS.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportCalculationsRDS.TabIndex = 47 + ' + 'ucrChkImportChangesLogRDS + ' + Me.ucrChkImportChangesLogRDS.Checked = False + Me.ucrChkImportChangesLogRDS.Location = New System.Drawing.Point(6, 114) + Me.ucrChkImportChangesLogRDS.Name = "ucrChkImportChangesLogRDS" + Me.ucrChkImportChangesLogRDS.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportChangesLogRDS.TabIndex = 46 + ' + 'ucrChkImportFiltersRDS + ' + Me.ucrChkImportFiltersRDS.Checked = False + Me.ucrChkImportFiltersRDS.Location = New System.Drawing.Point(6, 74) + Me.ucrChkImportFiltersRDS.Name = "ucrChkImportFiltersRDS" + Me.ucrChkImportFiltersRDS.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportFiltersRDS.TabIndex = 45 + ' + 'ucrChkImportMetadataRDS + ' + Me.ucrChkImportMetadataRDS.Checked = False + Me.ucrChkImportMetadataRDS.Location = New System.Drawing.Point(6, 34) + Me.ucrChkImportMetadataRDS.Name = "ucrChkImportMetadataRDS" + Me.ucrChkImportMetadataRDS.Size = New System.Drawing.Size(205, 20) + Me.ucrChkImportMetadataRDS.TabIndex = 44 + ' + 'ucrChkKeepExistingDataRDS + ' + Me.ucrChkKeepExistingDataRDS.Checked = False + Me.ucrChkKeepExistingDataRDS.Location = New System.Drawing.Point(6, 14) + Me.ucrChkKeepExistingDataRDS.Name = "ucrChkKeepExistingDataRDS" + Me.ucrChkKeepExistingDataRDS.Size = New System.Drawing.Size(205, 20) + Me.ucrChkKeepExistingDataRDS.TabIndex = 43 + ' + 'ucrChkStringsAsFactorsCSV + ' + Me.ucrChkStringsAsFactorsCSV.Checked = False + Me.ucrChkStringsAsFactorsCSV.Location = New System.Drawing.Point(8, 307) + Me.ucrChkStringsAsFactorsCSV.Name = "ucrChkStringsAsFactorsCSV" + Me.ucrChkStringsAsFactorsCSV.Size = New System.Drawing.Size(206, 20) + Me.ucrChkStringsAsFactorsCSV.TabIndex = 43 + ' + 'ucrNudLinesToSkipCSV + ' + Me.ucrNudLinesToSkipCSV.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLinesToSkipCSV.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudLinesToSkipCSV.Location = New System.Drawing.Point(86, 275) + Me.ucrNudLinesToSkipCSV.Maximum = New Decimal(New Integer() {1000000, 0, 0, 0}) + Me.ucrNudLinesToSkipCSV.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudLinesToSkipCSV.Name = "ucrNudLinesToSkipCSV" + Me.ucrNudLinesToSkipCSV.Size = New System.Drawing.Size(62, 20) + Me.ucrNudLinesToSkipCSV.TabIndex = 47 + Me.ucrNudLinesToSkipCSV.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrPnlRowNamesCSV + ' + Me.ucrPnlRowNamesCSV.Location = New System.Drawing.Point(15, 124) + Me.ucrPnlRowNamesCSV.Name = "ucrPnlRowNamesCSV" + Me.ucrPnlRowNamesCSV.Size = New System.Drawing.Size(113, 24) + Me.ucrPnlRowNamesCSV.TabIndex = 44 + ' + 'ucrInputHeadersCSV + ' + Me.ucrInputHeadersCSV.AddQuotesIfUnrecognised = True + Me.ucrInputHeadersCSV.IsReadOnly = False + Me.ucrInputHeadersCSV.Location = New System.Drawing.Point(9, 82) + Me.ucrInputHeadersCSV.Name = "ucrInputHeadersCSV" + Me.ucrInputHeadersCSV.Size = New System.Drawing.Size(149, 21) + Me.ucrInputHeadersCSV.TabIndex = 43 + ' + 'ucrInputNAStringsCSV + ' + Me.ucrInputNAStringsCSV.AddQuotesIfUnrecognised = True + Me.ucrInputNAStringsCSV.IsMultiline = False + Me.ucrInputNAStringsCSV.IsReadOnly = False + Me.ucrInputNAStringsCSV.Location = New System.Drawing.Point(117, 236) + Me.ucrInputNAStringsCSV.Name = "ucrInputNAStringsCSV" + Me.ucrInputNAStringsCSV.Size = New System.Drawing.Size(94, 21) + Me.ucrInputNAStringsCSV.TabIndex = 39 + ' + 'ucrInputDecimalCSV + ' + Me.ucrInputDecimalCSV.AddQuotesIfUnrecognised = True + Me.ucrInputDecimalCSV.IsReadOnly = False + Me.ucrInputDecimalCSV.Location = New System.Drawing.Point(74, 196) + Me.ucrInputDecimalCSV.Name = "ucrInputDecimalCSV" + Me.ucrInputDecimalCSV.Size = New System.Drawing.Size(137, 21) + Me.ucrInputDecimalCSV.TabIndex = 36 + ' + 'ucrInputSeparatorCSV + ' + Me.ucrInputSeparatorCSV.AddQuotesIfUnrecognised = True + Me.ucrInputSeparatorCSV.IsReadOnly = False + Me.ucrInputSeparatorCSV.Location = New System.Drawing.Point(74, 154) + Me.ucrInputSeparatorCSV.Name = "ucrInputSeparatorCSV" + Me.ucrInputSeparatorCSV.Size = New System.Drawing.Size(137, 21) + Me.ucrInputSeparatorCSV.TabIndex = 35 + ' + 'ucrInputEncodingCSV + ' + Me.ucrInputEncodingCSV.AddQuotesIfUnrecognised = True + Me.ucrInputEncodingCSV.IsReadOnly = False + Me.ucrInputEncodingCSV.Location = New System.Drawing.Point(62, 25) + Me.ucrInputEncodingCSV.Name = "ucrInputEncodingCSV" + Me.ucrInputEncodingCSV.Size = New System.Drawing.Size(149, 21) + Me.ucrInputEncodingCSV.TabIndex = 33 + ' 'ucrInputFilePath ' Me.ucrInputFilePath.AddQuotesIfUnrecognised = True @@ -578,16 +597,6 @@ Partial Class dlgImportDataset Me.ucrInputFilePath.Size = New System.Drawing.Size(119, 21) Me.ucrInputFilePath.TabIndex = 37 ' - 'ucrInputName - ' - Me.ucrInputName.AddQuotesIfUnrecognised = True - Me.ucrInputName.IsMultiline = False - Me.ucrInputName.IsReadOnly = False - Me.ucrInputName.Location = New System.Drawing.Point(128, 58) - Me.ucrInputName.Name = "ucrInputName" - Me.ucrInputName.Size = New System.Drawing.Size(102, 21) - Me.ucrInputName.TabIndex = 15 - ' 'ucrBase ' Me.ucrBase.Location = New System.Drawing.Point(241, 445) @@ -600,20 +609,22 @@ Partial Class dlgImportDataset Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(679, 499) + Me.Controls.Add(Me.lblLinesToPreview) + Me.Controls.Add(Me.ucrNudPreviewLines) + Me.Controls.Add(Me.grpExcel) + Me.Controls.Add(Me.ucrSaveFile) Me.Controls.Add(Me.grpRDS) Me.Controls.Add(Me.lblNoPreview) Me.Controls.Add(Me.grpCSV) Me.Controls.Add(Me.ucrInputFilePath) Me.Controls.Add(Me.lblCannotImport) - Me.Controls.Add(Me.ucrInputName) - Me.Controls.Add(Me.cmdOpenDataSet) + Me.Controls.Add(Me.cmdBrowse) Me.Controls.Add(Me.lblFileOpenPath) Me.Controls.Add(Me.grdDataPreview) Me.Controls.Add(Me.ucrBase) - Me.Controls.Add(Me.txtPreview) - Me.Controls.Add(Me.lblName) + Me.Controls.Add(Me.txtTextFilePreview) Me.Controls.Add(Me.lblDataFrame) - Me.Controls.Add(Me.lblInputFile) + Me.Controls.Add(Me.lblTextFilePreview) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.MinimizeBox = False @@ -631,54 +642,55 @@ Partial Class dlgImportDataset End Sub - Friend WithEvents lblInputFile As Label + Friend WithEvents lblTextFilePreview As Label Friend WithEvents lblDataFrame As Label - Friend WithEvents lblName As Label - Friend WithEvents lblEncoding As Label - Friend WithEvents lblHeaders As Label - Friend WithEvents lblRowNames As Label - Friend WithEvents lblSeparator As Label - Friend WithEvents lblDecimal As Label - Friend WithEvents txtPreview As TextBox + Friend WithEvents lblEncodingCSV As Label + Friend WithEvents lblHeadersCSV As Label + Friend WithEvents lblRowNamesCSV As Label + Friend WithEvents lblSeparatorCSV As Label + Friend WithEvents lblDecimalCSV As Label + Friend WithEvents txtTextFilePreview As TextBox Friend WithEvents ucrBase As ucrButtons Friend WithEvents grdDataPreview As unvell.ReoGrid.ReoGridControl Friend WithEvents lblFileOpenPath As Label - Friend WithEvents lblLinesToSkip As Label - Friend WithEvents cmdOpenDataSet As Button + Friend WithEvents lblLinesToSkipCSV As Label + Friend WithEvents cmdBrowse As Button Friend WithEvents grpCSV As GroupBox Friend WithEvents grpExcel As GroupBox - Friend WithEvents lblRowToSkip As Label - Friend WithEvents lblSheets As Label - Friend WithEvents ucrInputName As ucrInputTextBox - Friend WithEvents ucrInputSheets As ucrInputComboBox + Friend WithEvents lblRowToSkipExcel As Label + Friend WithEvents lblSelectSheetExcel As Label + Friend WithEvents ucrInputSelectSheetExcel As ucrInputComboBox Friend WithEvents lblNamedRegion As Label Friend WithEvents ucrInputNamedRegions As ucrInputComboBox Friend WithEvents lblCannotImport As Label Friend WithEvents ucrInputFilePath As ucrInputTextBox - Friend WithEvents ucrInputEncoding As ucrInputComboBox - Friend WithEvents ucrInputSeparator As ucrInputComboBox - Friend WithEvents ucrInputNAStrings As ucrInputTextBox - Friend WithEvents ucrInputDecimal As ucrInputComboBox - Friend WithEvents ucrInputHeaders As ucrInputComboBox - Friend WithEvents lblMissingValueString As Label - Friend WithEvents ucrInputXlMissingValueString As ucrInputTextBox + Friend WithEvents ucrInputEncodingCSV As ucrInputComboBox + Friend WithEvents ucrInputSeparatorCSV As ucrInputComboBox + Friend WithEvents ucrInputNAStringsCSV As ucrInputTextBox + Friend WithEvents ucrInputDecimalCSV As ucrInputComboBox + Friend WithEvents ucrInputHeadersCSV As ucrInputComboBox + Friend WithEvents lblMissingValueStringExcel As Label + Friend WithEvents ucrInputMissingValueStringExcel As ucrInputTextBox Friend WithEvents lblNoPreview As Label - Friend WithEvents ucrInputMaximumDataSize As ucrInputTextBox - Friend WithEvents ucrNudxlRowsToSkip As ucrNud + Friend WithEvents ucrInputMaxRowsExcel As ucrInputTextBox + Friend WithEvents ucrNudRowsToSkipExcel As ucrNud Friend WithEvents grpRDS As GroupBox - Friend WithEvents ucrchkColumnNames As ucrCheck - Friend WithEvents ucrChkExistingData As ucrCheck - Friend WithEvents ucrChkOverWrite As ucrCheck - Friend WithEvents ucrChkImportObjects As ucrCheck - Friend WithEvents ucrChkImportCalculations As ucrCheck - Friend WithEvents ucrChkImportChangesLog As ucrCheck - Friend WithEvents ucrChkImportFilters As ucrCheck - Friend WithEvents ucrChkImportMetadata As ucrCheck - Friend WithEvents rdoRowNamesNo As RadioButton - Friend WithEvents rdoRowNamesYes As RadioButton - Friend WithEvents ucrPnlRowNames As UcrPanel - Friend WithEvents ucrNudSkip As ucrNud - Friend WithEvents ucrChkStringsAsFactors As ucrCheck - Friend WithEvents ucrChkMaximumDataSize As ucrCheck - Friend WithEvents ucrChkMissingValueStrings As ucrCheck + Friend WithEvents ucrChkTrimWSExcel As ucrCheck + Friend WithEvents ucrChkKeepExistingDataRDS As ucrCheck + Friend WithEvents ucrChkOverwriteRDS As ucrCheck + Friend WithEvents ucrChkImportObjectsRDS As ucrCheck + Friend WithEvents ucrChkImportCalculationsRDS As ucrCheck + Friend WithEvents ucrChkImportChangesLogRDS As ucrCheck + Friend WithEvents ucrChkImportFiltersRDS As ucrCheck + Friend WithEvents ucrChkImportMetadataRDS As ucrCheck + Friend WithEvents rdoRowNamesNoCSV As RadioButton + Friend WithEvents rdoRowNamesYesCSV As RadioButton + Friend WithEvents ucrPnlRowNamesCSV As UcrPanel + Friend WithEvents ucrNudLinesToSkipCSV As ucrNud + Friend WithEvents ucrChkStringsAsFactorsCSV As ucrCheck + Friend WithEvents ucrChkMaxRowsExcel As ucrCheck + Friend WithEvents ucrSaveFile As ucrSave + Friend WithEvents lblNAStringsCSV As Label + Friend WithEvents ucrNudPreviewLines As ucrNud + Friend WithEvents lblLinesToPreview As Label End Class diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 6607d847d11..580b8ca7d0c 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -21,18 +21,17 @@ Imports instat Public Class dlgImportDataset - Private intLines As Integer - Private clsImportCSV, clsReadRDS, clsImportRDS, clsImportExcel, clsImport As RFunction - Private strTempWorkbookName As String - Dim bFirstLoad As Boolean + Private clsImportCSV, clsImportDAT, clsImportRDS, clsReadRDS, clsImportExcel, clsImport As RFunction + Private bFirstLoad As Boolean Public bFromLibrary As Boolean - Dim strLibraryPath As String - Dim strFileType As String - Dim bCanImport As Boolean + Private strLibraryPath As String + Private strFileType As String + Private bCanImport As Boolean Private bReset As Boolean = True - Dim bComponentsInitialised As Boolean + Private bComponentsInitialised As Boolean Public bStartOpenDialog As Boolean Public strFilePathToUseOnLoad As String + Public strCurrentDirectory As String Public Sub New() @@ -40,16 +39,14 @@ Public Class dlgImportDataset InitializeComponent() ' Add any initialization after the InitializeComponent() call. - intLines = 10 - bFirstLoad = True bFromLibrary = False - strLibraryPath = frmMain.strStaticPath & "\Library" + strLibraryPath = Path.Combine(frmMain.strStaticPath & "\Library") bCanImport = True bComponentsInitialised = True bStartOpenDialog = True - ucrInputName.bAutoChangeOnLeave = True strFilePathToUseOnLoad = "" + strCurrentDirectory = "" End Sub Private Sub dlgImportDataset_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -61,7 +58,7 @@ Public Class dlgImportDataset bFirstLoad = False End If If strFilePathToUseOnLoad <> "" Then - SetDialogWithFile(strFilePathToUseOnLoad) + SetControlsFromFile(strFilePathToUseOnLoad) bStartOpenDialog = False ElseIf bStartOpenDialog Then GetFileFromOpenDialog() @@ -73,196 +70,217 @@ Public Class dlgImportDataset End Sub Private Sub InitialiseDialog() - Dim dctucrInputSeparator As New Dictionary(Of String, String) - Dim dctucrInputEncoding As New Dictionary(Of String, String) - Dim dctucrInputDecimal As New Dictionary(Of String, String) - Dim dctucrInputHeaders As New Dictionary(Of String, String) + Dim dctucrInputSeparatorCSV As New Dictionary(Of String, String) + Dim dctucrInputEncodingCSV As New Dictionary(Of String, String) + Dim dctucrInputDecimalCSV As New Dictionary(Of String, String) + Dim dctucrInputHeadersCSV As New Dictionary(Of String, String) ucrBase.iHelpTopicID = 11 + 'Removes the Sheet Tab control grdDataPreview.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, False) grdDataPreview.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_AutoFormatCell, False) - ucrInputName.SetValidationTypeAsRVariable() - strTempWorkbookName = "temp_workbook" - ucrChkStringsAsFactors.SetText("Convert Strings to Factor Columns") - ucrChkStringsAsFactors.SetParameter(New RParameter("stringsAsFactors"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkStringsAsFactors.AddFunctionNamesCondition(True, "import") - ucrChkStringsAsFactors.AddFunctionNamesCondition(False, "import", False) + '############################################################## - ucrChkImportChangesLog.SetText("Import Changes log") - ucrChkImportChangesLog.SetParameter(New RParameter("include_logs"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") - ucrChkImportChangesLog.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") - ucrChkImportChangesLog.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + 'General Controls - ucrChkExistingData.SetText("Keep existing data frames") - ucrChkExistingData.SetParameter(New RParameter("keep_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkExistingData.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") - ucrChkExistingData.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + ucrInputFilePath.SetParameter(New RParameter("file")) + ucrInputFilePath.IsReadOnly = True + ucrSaveFile.SetLabelText("New Data Frame Name:") + ucrSaveFile.SetIsTextBox() + ucrSaveFile.SetSaveTypeAsDataFrame() + ucrSaveFile.ucrInputTextSave.bAutoChangeOnLeave = True - ucrChkImportMetadata.SetText("Import metadata") - ucrChkImportMetadata.SetParameter(New RParameter("include_metadata"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkImportMetadata.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") - ucrChkImportMetadata.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + ucrNudPreviewLines.Value = 10 - ucrChkImportObjects.SetText("Import objects") - ucrChkImportObjects.SetParameter(New RParameter("include_objects"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkImportObjects.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") - ucrChkImportObjects.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + '############################################################## - ucrChkImportFilters.SetText("Import filters") - ucrChkImportFilters.SetParameter(New RParameter("include_filters"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkImportFilters.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + 'RDS Controls - ucrChkImportCalculations.SetText("Import calculations") - ucrChkImportCalculations.SetParameter(New RParameter("include_calculations"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkImportCalculations.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") - ucrChkImportCalculations.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + ucrChkImportChangesLogRDS.SetText("Import Changes log") + ucrChkImportChangesLogRDS.SetParameter(New RParameter("include_logs"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") + ucrChkImportChangesLogRDS.SetRDefault("TRUE") + 'ucrChkImportChangesLog.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + 'ucrChkImportChangesLog.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) - ucrChkOverWrite.SetText("Overwrite existing if duplicates found") - ucrChkOverWrite.SetParameter(New RParameter("overwrite_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkOverWrite.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrChkKeepExistingDataRDS.SetText("Keep existing data frames") + ucrChkKeepExistingDataRDS.SetParameter(New RParameter("keep_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkKeepExistingDataRDS.SetRDefault("TRUE") + 'ucrChkExistingData.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + 'ucrChkExistingData.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + ucrChkImportMetadataRDS.SetText("Import metadata") + ucrChkImportMetadataRDS.SetParameter(New RParameter("include_metadata"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkImportMetadataRDS.SetRDefault("TRUE") + 'ucrChkImportMetadata.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + 'ucrChkImportMetadata.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) - 'temp disabled until can easily switch between fread and read.csv - 'TODO this is not an option for fread so have to change function here + ucrChkImportObjectsRDS.SetText("Import objects") + ucrChkImportObjectsRDS.SetParameter(New RParameter("include_objects"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkImportObjectsRDS.SetRDefault("TRUE") + + 'ucrChkImportObjects.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + 'ucrChkImportObjects.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + + ucrChkImportFiltersRDS.SetText("Import filters") + ucrChkImportFiltersRDS.SetParameter(New RParameter("include_filters"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkImportFiltersRDS.SetRDefault("TRUE") + 'ucrChkImportFilters.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + + ucrChkImportCalculationsRDS.SetText("Import calculations") + ucrChkImportCalculationsRDS.SetParameter(New RParameter("include_calculations"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkImportCalculationsRDS.SetRDefault("TRUE") + 'ucrChkImportCalculations.AddFunctionNamesCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") + 'ucrChkImportCalculations.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) + + ucrChkOverwriteRDS.SetText("Overwrite existing if duplicates found") + ucrChkOverwriteRDS.SetParameter(New RParameter("overwrite_existing"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkOverwriteRDS.SetRDefault("FALSE") + 'ucrChkOverWrite.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") - 'temp disabled until can easily switch between fread and read.csv - 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator - ucrInputSeparator.Enabled = False - ucrPnlRowNames.Enabled = False - rdoRowNamesYes.Enabled = False - rdoRowNamesNo.Enabled = False - ucrPnlRowNames.bAllowNonConditionValues = True 'ucrPnlRowNames.SetParameter(New RParameter("row.names")) 'ucrPnlRowNames.AddRadioButton(rdoRowNamesYes, Chr(34) & "TRUE" & Chr(34)) 'ucrPnlRowNames.AddRadioButton(rdoRowNamesNo, Chr(34) & "FALSE" & Chr(34)) 'ucrPnlRowNames.SetRDefault(Chr(34) & "TRUE" & Chr(34)) + '############################################################## + + 'CSV Controls + + ucrChkStringsAsFactorsCSV.SetText("Convert Strings to Factor Columns") + ucrChkStringsAsFactorsCSV.SetParameter(New RParameter("stringsAsFactors"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkStringsAsFactorsCSV.AddFunctionNamesCondition(True, "import") + ucrChkStringsAsFactorsCSV.AddFunctionNamesCondition(False, "import", False) + + ucrInputNAStringsCSV.SetParameter(New RParameter("na.strings")) + ucrInputNAStringsCSV.SetRDefault(Chr(34) & "NA" & Chr(34)) + + ucrInputEncodingCSV.SetParameter(New RParameter("encoding", 1)) + dctucrInputEncodingCSV.Add("unknown", Chr(34) & "unknown" & Chr(34)) + dctucrInputEncodingCSV.Add("UTF-8", Chr(34) & "UTF-8" & Chr(34)) + dctucrInputEncodingCSV.Add("Latin-1", Chr(34) & "Latin-1" & Chr(34)) + ucrInputEncodingCSV.SetItems(dctucrInputEncodingCSV) + ucrInputEncodingCSV.SetRDefault(Chr(34) & "unknown" & Chr(34)) + ucrInputEncodingCSV.SetDropDownStyleAsNonEditable() + + ucrInputSeparatorCSV.SetParameter(New RParameter("sep")) + dctucrInputSeparatorCSV.Add("Automatic", Chr(34) & "auto" & Chr(34)) + dctucrInputSeparatorCSV.Add("Comma(,)", Chr(34) & "," & Chr(34)) + dctucrInputSeparatorCSV.Add("Whitespace", Chr(34) & " " & Chr(34)) + dctucrInputSeparatorCSV.Add("Colon(:)", Chr(34) & ":" & Chr(34)) + dctucrInputSeparatorCSV.Add("Semi-Colon(;)", Chr(34) & ";" & Chr(34)) + dctucrInputSeparatorCSV.Add("Vertcal-Line", Chr(34) & "|" & Chr(34)) + dctucrInputSeparatorCSV.Add("Power", Chr(34) & "^" & Chr(34)) + ucrInputSeparatorCSV.SetItems(dctucrInputSeparatorCSV) + ucrInputSeparatorCSV.SetRDefault(Chr(34) & "auto" & Chr(34)) + ucrInputSeparatorCSV.bAllowNonConditionValues = True + + ucrInputHeadersCSV.SetParameter(New RParameter("header")) + dctucrInputHeadersCSV.Add("Automatic", Chr(34) & "auto" & Chr(34)) + dctucrInputHeadersCSV.Add("Yes", Chr(34) & "TRUE" & Chr(34)) + dctucrInputHeadersCSV.Add("No", Chr(34) & "FALSE" & Chr(34)) + ucrInputHeadersCSV.SetItems(dctucrInputHeadersCSV) + ucrInputHeadersCSV.SetRDefault(Chr(34) & "auto" & Chr(34)) + ucrInputHeadersCSV.SetDropDownStyleAsNonEditable() + + ucrInputDecimalCSV.SetParameter(New RParameter("dec")) + dctucrInputDecimalCSV.Add("Automatic", Chr(34) & "auto" & Chr(34)) + dctucrInputDecimalCSV.Add("Period(.)", Chr(34) & "." & Chr(34)) + dctucrInputDecimalCSV.Add("Comma(,)", Chr(34) & "," & Chr(34)) + ucrInputDecimalCSV.SetItems(dctucrInputDecimalCSV) + ucrInputDecimalCSV.SetRDefault(Chr(34) & "auto" & Chr(34)) + ucrInputDecimalCSV.SetDropDownStyleAsNonEditable() + + ucrNudLinesToSkipCSV.SetParameter(New RParameter("skip")) + ucrNudLinesToSkipCSV.Maximum = Integer.MaxValue + ucrNudLinesToSkipCSV.SetRDefault(0) + + 'temp disabled until can easily switch between fread and read.csv + 'disabled until issue is resolved: http://stackoverflow.com/questions/37635541/rio-r-package-can-i-import-a-csv-file-with-non-comma-separator + ucrInputSeparatorCSV.Enabled = False + ucrPnlRowNamesCSV.Enabled = False + rdoRowNamesYesCSV.Enabled = False + rdoRowNamesNoCSV.Enabled = False + + '############################################################## + + 'EXCEL controls + ucrInputSelectSheetExcel.SetDropDownStyleAsNonEditable() + ucrInputSelectSheetExcel.bAllowNonConditionValues = True + + ucrInputMissingValueStringExcel.SetParameter(New RParameter("na")) + ucrInputMissingValueStringExcel.SetRDefault(Chr(34) & "" & Chr(34)) + + ucrChkTrimWSExcel.SetParameter(New RParameter("trim_ws"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkTrimWSExcel.SetText("Trim Trailing WhiteSpace") + + ucrNudRowsToSkipExcel.SetParameter(New RParameter("skip")) + ucrNudRowsToSkipExcel.Minimum = 0 + ucrNudRowsToSkipExcel.SetRDefault(0) + + ucrChkMaxRowsExcel.SetText("Maximum Rows To Import") + ucrInputMaxRowsExcel.SetParameter(New RParameter("n_max")) + ucrChkMaxRowsExcel.AddParameterPresentCondition(False, "n_max", False) + ucrInputMaxRowsExcel.AddQuotesIfUnrecognised = False + + ucrChkMaxRowsExcel.AddToLinkedControls(ucrInputMaxRowsExcel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=100000) 'hide since no longer using openxlsx package ucrInputNamedRegions.Hide() lblNamedRegion.Hide() - - ucrInputFilePath.IsReadOnly = True - - ucrChkMissingValueStrings.SetText("Missing Value String") - ucrInputNAStrings.SetParameter(New RParameter("na.strings")) - ucrChkMissingValueStrings.AddParameterPresentCondition(False, "na.strings", False) - ucrChkMissingValueStrings.AddToLinkedControls(ucrInputNAStrings, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:="") - - - ucrInputEncoding.SetParameter(New RParameter("encoding", 1)) - dctucrInputEncoding.Add("Unknown", Chr(34) & "unknown" & Chr(34)) - ucrInputEncoding.SetItems(dctucrInputEncoding) - ucrInputEncoding.SetRDefault(Chr(34) & "unknown" & Chr(34)) - ucrInputEncoding.SetDropDownStyleAsNonEditable() - - 'csv options settings - - ucrInputSeparator.SetParameter(New RParameter("sep")) - dctucrInputSeparator.Add("Automatic", Chr(34) & "auto" & Chr(34)) - dctucrInputSeparator.Add("Comma(,)", Chr(34) & "," & Chr(34)) - dctucrInputSeparator.Add("Whitespace", Chr(34) & " " & Chr(34)) - dctucrInputSeparator.Add("Colon(:)", Chr(34) & ":" & Chr(34)) - dctucrInputSeparator.Add("Semi-Colon(;)", Chr(34) & ";" & Chr(34)) - dctucrInputSeparator.Add("Vertcal-Line", Chr(34) & "|" & Chr(34)) - dctucrInputSeparator.Add("Power", Chr(34) & "^" & Chr(34)) - ucrInputSeparator.SetItems(dctucrInputSeparator) - ucrInputSeparator.SetRDefault(Chr(34) & "auto" & Chr(34)) - ucrInputSeparator.SetDropDownStyleAsNonEditable() - - ucrInputHeaders.SetParameter(New RParameter("header")) - dctucrInputHeaders.Add("Automatic", Chr(34) & "auto" & Chr(34)) - dctucrInputHeaders.Add("Yes", Chr(34) & "TRUE" & Chr(34)) - dctucrInputHeaders.Add("No", Chr(34) & "FALSE" & Chr(34)) - ucrInputHeaders.SetItems(dctucrInputHeaders) - ucrInputHeaders.SetRDefault(Chr(34) & "auto" & Chr(34)) - ucrInputHeaders.SetDropDownStyleAsNonEditable() - - ucrInputDecimal.SetParameter(New RParameter("dec")) - dctucrInputDecimal.Add("Automatic", Chr(34) & "auto" & Chr(34)) - dctucrInputDecimal.Add("Period(.)", Chr(34) & "." & Chr(34)) - dctucrInputDecimal.Add("Comma(,)", Chr(34) & "," & Chr(34)) - ucrInputDecimal.SetItems(dctucrInputDecimal) - ucrInputDecimal.SetRDefault(Chr(34) & "auto" & Chr(34)) - ucrInputDecimal.SetDropDownStyleAsNonEditable() - - ucrNudSkip.SetParameter(New RParameter("skip")) - ucrNudSkip.Maximum = Integer.MaxValue - - 'EXCEL - ucrInputSheets.SetDropDownStyleAsNonEditable() - ucrInputSheets.bAllowNonConditionValues = True - - ucrInputXlMissingValueString.SetParameter(New RParameter("na")) - ucrInputXlMissingValueString.SetRDefault(Chr(34) & "" & Chr(34)) - - ucrchkColumnNames.SetParameter(New RParameter("trim_ws"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrchkColumnNames.SetText("Trim Trailing WhiteSpace") - - ucrNudxlRowsToSkip.SetParameter(New RParameter("skip")) - - ucrNudxlRowsToSkip.Maximum = Integer.MaxValue - - ucrChkMaximumDataSize.SetText("Maximum Data Size") - ucrInputMaximumDataSize.SetParameter(New RParameter("n_max")) - ucrChkMaximumDataSize.AddParameterPresentCondition(False, "n_max", False) - ucrInputMaximumDataSize.AddQuotesIfUnrecognised = False - - ucrChkMaximumDataSize.AddToLinkedControls(ucrInputMaximumDataSize, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=100000) End Sub - Private Sub SetDefaults() - clsImportCSV = New RFunction - clsReadRDS = New RFunction clsImportRDS = New RFunction clsImportExcel = New RFunction clsImport = New RFunction + clsReadRDS = New RFunction + clsImportDAT = New RFunction clsImportExcel.SetPackageName("rio") clsImportExcel.SetRCommand("import") + clsImportCSV.SetPackageName("rio") clsImportCSV.SetRCommand("import") + clsImport.SetPackageName("rio") clsImport.SetRCommand("import") + + clsImportDAT.SetPackageName("rio") + clsImportDAT.SetRCommand("import") + 'Needed as rio currently doesn't support .DAT files + 'https://github.com/leeper/rio/issues/155 + 'This only works if .DAT file is text based, this seems to be common usage + clsImportDAT.AddParameter("format", Chr(34) & "txt" & Chr(34)) + + clsReadRDS.SetRCommand("readRDS") + clsReadRDS.SetAssignTo("new_RDS") + clsImportRDS.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_RDS") grpCSV.Hide() grpRDS.Hide() grpExcel.Hide() - txtPreview.Hide() - lblInputFile.Hide() + txtTextFilePreview.Hide() + lblTextFilePreview.Hide() lblNoPreview.Hide() lblCannotImport.Hide() lblDataFrame.Hide() grdDataPreview.Hide() - ucrInputFilePath.SetName("") - ucrInputName.SetName("") - ucrInputXlMissingValueString.SetName("") - clsImportCSV.AddParameter("skip", 0) - clsImportExcel.AddParameter("skip", 0) - End Sub - -#Region "Shared options" - Public Sub setLinesToRead(lines As Integer) - intLines = lines End Sub - Private Sub ucrInputName_NameChanged() Handles ucrInputName.ControlValueChanged - If Not ucrInputName.IsEmpty AndAlso strFileType <> "RDS" Then - ucrBase.clsRsyntax.SetAssignTo(ucrInputName.GetText(), strTempDataframe:=ucrInputName.GetText()) - Else - ucrBase.clsRsyntax.RemoveAssignTo() - End If - TestOkEnabled() - End Sub -#End Region + 'Private Sub ucrInputName_NameChanged() Handles ucrInputName.ControlValueChanged + ' If Not ucrInputName.IsEmpty AndAlso strFileType <> "RDS" Then + ' ucrBase.clsRsyntax.SetAssignTo(ucrInputName.GetText(), strTempDataframe:=ucrInputName.GetText()) + ' Else + ' ucrBase.clsRsyntax.RemoveAssignTo() + ' End If + ' TestOkEnabled() + 'End Sub -#Region "Dialog options" Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() SetRCodeForControls(True) @@ -271,38 +289,34 @@ Public Class dlgImportDataset End Sub Private Sub TestOkEnabled() - If (Not ucrInputName.IsEmpty OrElse strFileType = "RDS") AndAlso bCanImport Then + If (ucrSaveFile.IsComplete OrElse strFileType = "RDS") AndAlso bCanImport Then ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) End If End Sub -#End Region -#Region "Import options" 'Loads the open dialog on load and click Public Sub GetFileFromOpenDialog() Using dlgOpen As New OpenFileDialog dlgOpen.Filter = "All Data files|*.csv;*.txt;*.xls;*.xlsx;*.RDS;*.sav;*.tsv;*.csvy;*.feather;*.psv;*.RData;*.json;*.yml;*.dta;*.dbf;*.arff;*.R;*.sas7bdat;*.xpt;*.mtp;*.rec;*.syd;*.dif;*.ods;*.xml;*.html|Comma separated files|*.csv|Text data file|*.txt|Excel files|*.xls;*.xlsx|R Data Structure files|*.RDS|SPSS files|*.sav|Tab separated files|*.tsv|CSV with a YAML metadata header|*.csvy|Feather R/Python interchange format|*.feather|Pipe separates files|*.psv|Saved R objects|*.RData|JSON|*.json|YAML|*.yml|Stata files|*.dta|XBASE database files|*.dbf|Weka Attribute-Relation File Format|*.arff|R syntax object|*.R|SAS Files|*.sas7bdat|SAS XPORT|*.xpt|Minitab Files|*.mtp|Epiinfo Files|*.rec|Systat Files|*.syd|Data Interchange Format|*.dif|OpenDocument Spreadsheet|*.ods|Shallow XML documents|*.xml|Single-table HTML documents|*.html;|All files|*.*;" If bFromLibrary Then - dlgOpen.Title = "Import from library" + dlgOpen.Title = "Import from Library" dlgOpen.InitialDirectory = strLibraryPath bFromLibrary = False Else dlgOpen.Title = "Open Data from file" - If Not ucrInputFilePath.IsEmpty() Then - dlgOpen.InitialDirectory = Path.GetDirectoryName(Replace(ucrInputFilePath.GetText(), "/", "\")) + If strCurrentDirectory <> "" Then + dlgOpen.InitialDirectory = Path.GetDirectoryName(strCurrentDirectory) Else dlgOpen.InitialDirectory = frmMain.clsInstatOptions.strWorkingDirectory End If End If If dlgOpen.ShowDialog() = DialogResult.OK Then - ucrInputName.SetName("") - ucrInputName.Reset() - 'checks if the file name is not blank' + ucrSaveFile.Reset() If dlgOpen.FileName <> "" Then - SetDialogWithFile(dlgOpen.FileName) + SetControlsFromFile(dlgOpen.FileName) End If Else If bFromLibrary Then @@ -317,8 +331,8 @@ Public Class dlgImportDataset grpRDS.Hide() grdDataPreview.Hide() lblDataFrame.Hide() - txtPreview.Hide() - lblInputFile.Hide() + txtTextFilePreview.Hide() + lblTextFilePreview.Hide() End If End If TestOkEnabled() @@ -326,233 +340,179 @@ Public Class dlgImportDataset End Sub Public Sub SetRCodeForControls(bReset As Boolean) - ucrInputSeparator.SetRCode(clsImportCSV, bReset) - ucrInputHeaders.SetRCode(clsImportCSV, bReset) - ucrInputDecimal.SetRCode(clsImportCSV, bReset) - ucrInputEncoding.SetRCode(clsImportCSV, bReset) - ucrPnlRowNames.SetRCode(clsImportCSV, bReset) - ucrChkImportChangesLog.SetRCode(clsImportRDS, bReset) - ucrChkExistingData.SetRCode(clsImportRDS, bReset) - ucrChkImportMetadata.SetRCode(clsImportRDS, bReset) - ucrChkImportObjects.SetRCode(clsImportRDS, bReset) - ucrChkImportFilters.SetRCode(clsImportRDS, bReset) - ucrChkImportCalculations.SetRCode(clsImportRDS, bReset) - ucrChkOverWrite.SetRCode(clsImportRDS, bReset) - - ucrNudxlRowsToSkip.SetRCode(clsImportExcel, bReset) - ucrInputMaximumDataSize.SetRCode(clsImportExcel, bReset) - ucrChkMaximumDataSize.SetRCode(clsImportExcel, bReset) - ucrInputSheets.SetRCode(clsImportExcel, bReset) - ucrInputXlMissingValueString.SetRCode(clsImportExcel, bReset) - ucrchkColumnNames.SetRCode(clsImportExcel, bReset) - ucrChkStringsAsFactors.SetRCode(clsImportCSV, bReset) - ucrInputNAStrings.SetRCode(clsImportCSV, bReset) - ucrChkMissingValueStrings.SetRCode(clsImportCSV, bReset) + ucrInputSeparatorCSV.SetRCode(clsImportCSV, bReset) + ucrInputHeadersCSV.SetRCode(clsImportCSV, bReset) + ucrInputDecimalCSV.SetRCode(clsImportCSV, bReset) + ucrInputEncodingCSV.SetRCode(clsImportCSV, bReset) + ucrPnlRowNamesCSV.SetRCode(clsImportCSV, bReset) + ucrChkImportChangesLogRDS.SetRCode(clsImportRDS, bReset) + ucrChkKeepExistingDataRDS.SetRCode(clsImportRDS, bReset) + ucrChkImportMetadataRDS.SetRCode(clsImportRDS, bReset) + ucrChkImportObjectsRDS.SetRCode(clsImportRDS, bReset) + ucrChkImportFiltersRDS.SetRCode(clsImportRDS, bReset) + ucrChkImportCalculationsRDS.SetRCode(clsImportRDS, bReset) + ucrChkOverwriteRDS.SetRCode(clsImportRDS, bReset) + + ucrNudRowsToSkipExcel.SetRCode(clsImportExcel, bReset) + ucrInputMaxRowsExcel.SetRCode(clsImportExcel, bReset) + ucrChkMaxRowsExcel.SetRCode(clsImportExcel, bReset) + ucrInputSelectSheetExcel.SetRCode(clsImportExcel, bReset) + ucrInputMissingValueStringExcel.SetRCode(clsImportExcel, bReset) + ucrChkTrimWSExcel.SetRCode(clsImportExcel, bReset) + ucrChkStringsAsFactorsCSV.SetRCode(clsImportCSV, bReset) + ucrInputNAStringsCSV.SetRCode(clsImportCSV, bReset) + End Sub + Private Sub TextPreviewVisible(bVisible As Boolean) + txtTextFilePreview.Visible = bVisible + lblTextFilePreview.Visible = bVisible End Sub - Public Sub SetDialogWithFile(strFilePath As String) + Private Sub GridPreviewVisible(bVisible As Boolean) + grdDataPreview.Visible = bVisible + lblDataFrame.Visible = bVisible + End Sub + + Public Sub SetControlsFromFile(strFilePath As String) Dim strFileExt As String Dim strFileName As String + Dim strFilePathForR As String strFileName = Path.GetFileNameWithoutExtension(strFilePath) - strFilePath = Replace(strFilePath, "\", "/") - strFileExt = Path.GetExtension(strFilePath) - - strFileExt = Path.GetExtension(strFilePath) - ucrInputFilePath.SetName(strFilePath) - grdDataPreview.Show() - lblDataFrame.Show() - txtPreview.Show() - lblInputFile.Show() - ucrInputName.Show() - lblName.Show() - If strFileExt = ".RDS" Then - clsReadRDS.SetRCommand("readRDS") - clsReadRDS.AddParameter("file", Chr(34) & strFilePath & Chr(34)) - 'TODO This needs to be different when RDS is a data frame - 'need to be able to detect RDS as data.frame/Instat Object - clsReadRDS.SetAssignTo("new_RDS") - grpExcel.Hide() - grpCSV.Hide() - grpRDS.Show() - txtPreview.Text = "" - txtPreview.Enabled = False - grdDataPreview.Enabled = False + strFileExt = Path.GetExtension(strFilePath).ToLower() + strFilePathForR = Replace(strFilePath, "\", "/") + + ucrInputFilePath.SetName(strFilePathForR) + + ucrSaveFile.Show() + grpRDS.Hide() + grpExcel.Hide() + grpCSV.Hide() + + 'TODO This needs to be different when RDS is a data frame + 'need to be able to detect RDS as data.frame/Instat Object + If strFileExt = ".rds" Then + strFileType = "RDS" + clsReadRDS.AddParameter("file", Chr(34) & strFilePathForR & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportRDS) clsImportRDS.AddParameter("data_RDS", clsRFunctionParameter:=clsReadRDS) - strFileType = "RDS" - ucrInputName.Hide() - lblName.Hide() - 'ucrInputName.SetName(strFileName, bSilent:=True) - ElseIf strFileExt = ".csv" OrElse strFileExt = ".DAT" Then - clsImportCSV.AddParameter("file", Chr(34) & strFilePath & Chr(34)) + grpRDS.Show() + ucrSaveFile.Hide() + ElseIf strFileExt = ".csv" Then + strFileType = "CSV" ucrBase.clsRsyntax.SetBaseRFunction(clsImportCSV) - grpRDS.Hide() - grpExcel.Hide() + clsImportCSV.AddParameter("file", Chr(34) & strFilePathForR & Chr(34)) + ucrSaveFile.SetName(strFileName, bSilent:=True) + TextPreviewVisible(True) grpCSV.Show() - txtPreview.Enabled = True - grdDataPreview.Enabled = True - ucrInputName.SetName(strFileName, bSilent:=True) - If strFileExt = ".csv" Then - strFileType = "csv" - clsImportCSV.RemoveParameterByName("format") - Else - strFileType = "DAT" - clsImportCSV.AddParameter("format", Chr(34) & "txt" & Chr(34)) - End If - RefreshFilePreview() - + ElseIf strFileExt = ".dat" Then + clsImportDAT.AddParameter("file", Chr(34) & strFilePathForR & Chr(34)) + ucrBase.clsRsyntax.SetBaseRFunction(clsImportDAT) + ucrSaveFile.SetName(strFileName, bSilent:=True) ElseIf strFileExt = ".xlsx" OrElse strFileExt = ".xls" Then - clsImportExcel.AddParameter("file", Chr(34) & strFilePath & Chr(34)) + clsImportExcel.AddParameter("file", Chr(34) & strFilePathForR & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportExcel) - grpCSV.Hide() - grpRDS.Hide() grpExcel.Show() - txtPreview.Text = "" - txtPreview.Enabled = False - grdDataPreview.Enabled = True - FillExcelSheetsAndRegions(strFilePath) - - 'ucrInputName.SetName(strFileName, bSilent:=True) + FillExcelSheets(strFilePath) + ucrSaveFile.SetName(strFileName, bSilent:=True) Else - strFileType = strFileExt.Substring(1) + strFileType = strFileExt.Substring(1).ToUpper() clsImport.AddParameter("file", Chr(34) & strFilePath & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImport) - grpCSV.Hide() - grpExcel.Hide() - grpRDS.Hide() - grdDataPreview.Show() - lblDataFrame.Show() - txtPreview.Hide() - lblInputFile.Hide() - ucrInputName.SetName(strFileName, bSilent:=True) + End If + If strFileType <> "RDS" Then + ucrSaveFile.Visible = True + ucrSaveFile.SetName(strFileName, bSilent:=True) + Else + ucrSaveFile.Visible = False End If RefreshFilePreview() RefreshFrameView() End Sub -#End Region - -#Region "File Preview options" Public Sub RefreshFilePreview() Dim sReader As StreamReader - If strFileType = "csv" AndAlso ucrInputFilePath.GetText() <> "" Then + + If strFileType = "CSV" AndAlso ucrInputFilePath.GetText() <> "" Then + TextPreviewVisible(True) Try sReader = New StreamReader(ucrInputFilePath.GetText()) - txtPreview.Text = "" - For i = 1 To intLines + ucrNudSkip.Value + 1 - txtPreview.Text = txtPreview.Text & sReader.ReadLine() & Environment.NewLine + txtTextFilePreview.Text = "" + For i = 1 To ucrNudPreviewLines.Value + ucrNudLinesToSkipCSV.Value + 1 + txtTextFilePreview.Text = txtTextFilePreview.Text & sReader.ReadLine() & Environment.NewLine If sReader.Peek() = -1 Then Exit For End If Next Catch ex As Exception - txtPreview.Text = "Cannot show text preview of file:" & ucrInputFilePath.GetText() & ". The file may be in use by another program. Close the file and select it again from the dialog to refresh the preview." + txtTextFilePreview.Text = "Cannot show text preview of file:" & ucrInputFilePath.GetText() & ". The file may be in use by another program. Close the file and select it again from the dialog to refresh the preview." bCanImport = False End Try Else - txtPreview.Text = "Preview only available for text files" + TextPreviewVisible(False) End If End Sub Private Sub RefreshFrameView() Dim dfTemp As DataFrame - Dim expTemp As SymbolicExpression = Nothing - Dim bToBeAssigned As Boolean + Dim expTemp As SymbolicExpression Dim strTempDataFrameName As String Dim bValid As Boolean Dim clsAsCharacterFunc As New RFunction - 'Dim control As Control + Dim clsTempImport As New RFunction - 'Remove as may have other effects - 'For Each control In Me.Controls - ' control.Enabled = False - 'Next Cursor = Cursors.WaitCursor ucrBase.OKEnabled(False) clsAsCharacterFunc.SetRCommand("convert_to_character_matrix") strTempDataFrameName = "temp" - bToBeAssigned = ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned - ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned = False - If strFileType <> "RDS" Then - grdDataPreview.Show() - lblDataFrame.Show() - If strFileType = "csv" Then - clsImportCSV.AddParameter("nrows", intLines) - ElseIf strFileType = "xlsx" Then - 'iPosition = 0 is needed because of a bug in rio::import - 'clsImportExcel.AddParameter("rows", "1:" & intLines, iPosition:=0) - End If - lblCannotImport.Hide() - lblNoPreview.Hide() - If ucrInputFilePath.IsEmpty() Then - bValid = False - Else - clsAsCharacterFunc.AddParameter("data", clsRFunctionParameter:=ucrBase.clsRsyntax.clsBaseFunction) - expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsAsCharacterFunc.ToScript(), bSilent:=True) - bValid = (expTemp IsNot Nothing) + grdDataPreview.Worksheets.Clear() + lblCannotImport.Hide() + bValid = False + If {"CSV", "XLSX", "XLS"}.Contains(strFileType) AndAlso Not ucrInputFilePath.IsEmpty() Then + If strFileType = "CSV" Then + clsTempImport = clsImportCSV.Clone() + clsTempImport.AddParameter("nrows", ucrNudPreviewLines.Value) + ElseIf strFileType = "XLSX" OrElse strFileType = "XLS" Then + clsTempImport = clsImportExcel.Clone() + clsTempImport.AddParameter("n_max", ucrNudPreviewLines.Value) End If - If bValid Then - dfTemp = Nothing - If expTemp IsNot Nothing Then - dfTemp = expTemp.AsDataFrame - End If - If dfTemp Is Nothing Then - bValid = False - Else - ucrBase.clsRsyntax.RemoveParameter("nrows") - ucrBase.clsRsyntax.RemoveParameter("rows") - 'If readXL is not the base function this may be needed. - ' clsImportExcel.RemoveParameterByName("rows") - ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned = bToBeAssigned + clsAsCharacterFunc.AddParameter("data", clsRFunctionParameter:=clsTempImport) + expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsAsCharacterFunc.ToScript(), bSilent:=True) + If expTemp IsNot Nothing Then + dfTemp = expTemp.AsDataFrame + If dfTemp IsNot Nothing Then Try frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False) - grdDataPreview.Enabled = True + grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_DragSelectionToMoveCells, False) + grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_Readonly, True) + bValid = True bCanImport = True Catch - bValid = False + End Try End If End If - If Not bValid Then - grdDataPreview.CurrentWorksheet.Reset() - grdDataPreview.Enabled = False - If Not ucrInputFilePath.IsEmpty() Then - lblCannotImport.Show() - Else - lblCannotImport.Hide() - End If + If bValid Then + GridPreviewVisible(True) + Else + lblCannotImport.Show() bCanImport = False End If Else bCanImport = True lblCannotImport.Hide() lblNoPreview.Show() - grdDataPreview.CurrentWorksheet.Reset() - grdDataPreview.Hide() - lblDataFrame.Hide() + GridPreviewVisible(False) End If - If grdDataPreview.CurrentWorksheet IsNot Nothing Then - grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_DragSelectionToMoveCells, False) - grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_Readonly, True) - End If - 'Remove as may have other effects - 'For Each control In Me.Controls - ' control.Enabled = True - 'Next Cursor = Cursors.Default TestOkEnabled() End Sub -#End Region - Private Sub cmdOpenDataSet_Click(sender As Object, e As EventArgs) Handles cmdOpenDataSet.Click + Private Sub cmdBrowse_Click(sender As Object, e As EventArgs) Handles cmdBrowse.Click GetFileFromOpenDialog() End Sub -#Region "Excel options" - - Private Sub FillExcelSheetsAndRegions(strFilePath As String) + Private Sub FillExcelSheets(strFilePath As String) Dim i As Integer Dim chrSheets As CharacterVector 'Dim chrRegions As CharacterVector @@ -574,14 +534,14 @@ Public Class dlgImportDataset chrSheets = frmMain.clsRLink.RunInternalScriptGetValue(clsGetSheetNames.ToScript()).AsCharacter 'chrRegions = frmMain.clsRLink.RunInternalScriptGetValue(clsGetNamedRegions.ToScript()).AsCharacter - ucrInputSheets.cboInput.Items.Clear() + ucrInputSelectSheetExcel.cboInput.Items.Clear() If chrSheets IsNot Nothing AndAlso chrSheets.Count > 0 Then For i = 0 To chrSheets.Count - 1 - ucrInputSheets.cboInput.Items.Add(chrSheets(i)) + ucrInputSelectSheetExcel.cboInput.Items.Add(chrSheets(i)) Next - ucrInputSheets.SetName(ucrInputSheets.cboInput.Items(0), bSilent:=True) + ucrInputSelectSheetExcel.SetName(ucrInputSelectSheetExcel.cboInput.Items(0), bSilent:=True) Else - ucrInputSheets.SetName("") + ucrInputSelectSheetExcel.SetName("") End If 'ucrInputNamedRegions.cboInput.Items.Clear() @@ -640,32 +600,16 @@ Public Class dlgImportDataset ' End If 'End Sub - Private Sub ucrInputSheets_ControlValueChanged() Handles ucrInputSheets.ControlValueChanged - If Not ucrInputSheets.IsEmpty() Then - If strFileType = "xlsx" Then - clsImportExcel.AddParameter("which", ucrInputSheets.cboInput.SelectedIndex + 1) - clsImportExcel.RemoveParameterByName("sheet") - If Not ucrInputName.UserTyped() Then - ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) - End If - ElseIf strFileType = "xls" Then - clsImportExcel.AddParameter("sheet", ucrInputSheets.cboInput.SelectedIndex + 1) - clsImportExcel.RemoveParameterByName("which") - If Not ucrInputName.UserTyped() Then - ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) + Private Sub ucrInputSheets_ControlValueChanged() Handles ucrInputSelectSheetExcel.ControlValueChanged + If strFileType = "XLS" OrElse strFileType = "XLSX" Then + If Not ucrInputSelectSheetExcel.IsEmpty() Then + clsImportExcel.AddParameter("which", ucrInputSelectSheetExcel.cboInput.SelectedIndex + 1) + If Not ucrSaveFile.UserTyped() Then + ucrSaveFile.SetName(ucrInputSelectSheetExcel.GetText(), bSilent:=True) End If - Else - If Not ucrInputName.UserTyped() Then - ucrInputName.SetName(ucrInputSheets.GetText(), bSilent:=True) - End If - clsImportExcel.RemoveParameterByName("sheet") - clsImportExcel.RemoveParameterByName("which") End If - 'ucrInputNamedRegions.SetName("") - Else - + RefreshFrameView() End If - RefreshFrameView() End Sub Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk @@ -676,26 +620,4 @@ Public Class dlgImportDataset frmMain.strSaveFilePath = ucrInputFilePath.GetText() End If End Sub - - Private Sub ucrInputName_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrInputName.ControlContentsChanged - TestOkEnabled() - End Sub - - 'Private Sub ucrInputNamedRegions_ControlValueChanged() Handles ucrInputNamedRegions.ControlValueChanged - ' If Not ucrInputNamedRegions.IsEmpty() Then - ' clsReadXLSX.AddParameter("namedRegion", Chr(34) & ucrInputNamedRegions.GetText() & Chr(34)) - ' ucrInputSheets.SetName("") - ' nudStartRow.Value = 1 - ' nudStartRow.Enabled = False - ' If Not ucrInputName.UserTyped() Then - ' ucrInputName.SetName(ucrInputNamedRegions.GetText(), bSilent:=True) - ' ' End If - ' Else - ' clsReadXLSX.RemoveParameterByName("namedRegion") - ' nudStartRow.Enabled = True - ' End If - ' RefreshFrameView() - 'End Sub - -#End Region End Class \ No newline at end of file diff --git a/instat/ucrSave.vb b/instat/ucrSave.vb index b14c0253d29..9e83a964669 100644 --- a/instat/ucrSave.vb +++ b/instat/ucrSave.vb @@ -358,4 +358,12 @@ Public Class ucrSave Public Sub AddAdditionalRCode(clsNewRCode As RCodeStructure, Optional iAdditionalPairNo As Integer = -1) AddAdditionalCodeParameterPair(clsNewRCode, Nothing, iAdditionalPairNo) End Sub + + Public Function UserTyped() As Boolean + If bIsComboBox Then + Return ucrInputComboSave.bUserTyped + Else + Return ucrInputTextSave.bUserTyped + End If + End Function End Class \ No newline at end of file From 774b4338a4ed876c196e75f6f1f190fa68edbca0 Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 20 Jun 2017 23:24:59 +0300 Subject: [PATCH 116/201] Rewriting the subdialogue display options --- instat/dlgRegressionSimple.Designer.vb | 202 +++--- instat/dlgRegressionSimple.vb | 122 ++-- instat/sdgSimpleRegOptions.Designer.vb | 835 +++++++++++++------------ instat/sdgSimpleRegOptions.vb | 266 ++++---- 4 files changed, 760 insertions(+), 665 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index a8ea4a21ec3..2b789b746f1 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -36,6 +36,16 @@ Partial Class dlgRegressionSimple Me.lblFactor = New System.Windows.Forms.Label() Me.lblHyp1 = New System.Windows.Forms.Label() Me.grpParameters = New System.Windows.Forms.GroupBox() + Me.ucrChkFunction = New instat.ucrCheck() + Me.ucrNudSuccess = New instat.ucrNud() + Me.lblSuccess = New System.Windows.Forms.Label() + Me.ucrInputLevel2 = New instat.ucrInputComboBox() + Me.ucrInputLevel1 = New instat.ucrInputComboBox() + Me.Label1 = New System.Windows.Forms.Label() + Me.lblLevel1 = New System.Windows.Forms.Label() + Me.rdoKruskalTest = New System.Windows.Forms.RadioButton() + Me.rdoWilcoxonTest = New System.Windows.Forms.RadioButton() + Me.ucrpnlKruskalWilcoxonTest = New instat.UcrPanel() Me.ucrNudHypothesis = New instat.ucrNud() Me.ucrChkPairedTest = New instat.ucrCheck() Me.ucrNudCI = New instat.ucrNud() @@ -50,21 +60,11 @@ Partial Class dlgRegressionSimple Me.ucrSelectorSimpleReg = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrFamily = New instat.ucrDistributions() Me.ucrBase = New instat.ucrButtons() - Me.rdoGeneralCase = New System.Windows.Forms.RadioButton() - Me.rdoTwoSample = New System.Windows.Forms.RadioButton() - Me.ucrPnlModelType = New instat.UcrPanel() Me.ucrChkConvertToVariate = New instat.ucrCheck() Me.ucrSaveModels = New instat.ucrSave() - Me.ucrChkFunction = New instat.ucrCheck() - Me.ucrpnlKruskalWilcoxonTest = New instat.UcrPanel() - Me.rdoWilcoxonTest = New System.Windows.Forms.RadioButton() - Me.rdoKruskalTest = New System.Windows.Forms.RadioButton() - Me.lblLevel1 = New System.Windows.Forms.Label() - Me.Label1 = New System.Windows.Forms.Label() - Me.ucrInputLevel1 = New instat.ucrInputComboBox() - Me.ucrInputLevel2 = New instat.ucrInputComboBox() - Me.lblSuccess = New System.Windows.Forms.Label() - Me.ucrNudSuccess = New instat.ucrNud() + Me.rdoTwoSample = New System.Windows.Forms.RadioButton() + Me.rdoGeneralCase = New System.Windows.Forms.RadioButton() + Me.ucrPnlModelType = New instat.UcrPanel() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -138,6 +138,7 @@ Partial Class dlgRegressionSimple ' 'grpParameters ' + Me.grpParameters.Controls.Add(Me.ucrChkFunction) Me.grpParameters.Controls.Add(Me.ucrNudSuccess) Me.grpParameters.Controls.Add(Me.lblSuccess) Me.grpParameters.Controls.Add(Me.ucrInputLevel2) @@ -160,6 +161,70 @@ Partial Class dlgRegressionSimple Me.grpParameters.Name = "grpParameters" Me.grpParameters.TabStop = False ' + 'ucrChkFunction + ' + Me.ucrChkFunction.Checked = False + resources.ApplyResources(Me.ucrChkFunction, "ucrChkFunction") + Me.ucrChkFunction.Name = "ucrChkFunction" + ' + 'ucrNudSuccess + ' + Me.ucrNudSuccess.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSuccess.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + resources.ApplyResources(Me.ucrNudSuccess, "ucrNudSuccess") + Me.ucrNudSuccess.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudSuccess.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSuccess.Name = "ucrNudSuccess" + Me.ucrNudSuccess.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'lblSuccess + ' + resources.ApplyResources(Me.lblSuccess, "lblSuccess") + Me.lblSuccess.Name = "lblSuccess" + ' + 'ucrInputLevel2 + ' + Me.ucrInputLevel2.AddQuotesIfUnrecognised = True + Me.ucrInputLevel2.IsReadOnly = False + resources.ApplyResources(Me.ucrInputLevel2, "ucrInputLevel2") + Me.ucrInputLevel2.Name = "ucrInputLevel2" + ' + 'ucrInputLevel1 + ' + Me.ucrInputLevel1.AddQuotesIfUnrecognised = True + Me.ucrInputLevel1.IsReadOnly = False + resources.ApplyResources(Me.ucrInputLevel1, "ucrInputLevel1") + Me.ucrInputLevel1.Name = "ucrInputLevel1" + ' + 'Label1 + ' + resources.ApplyResources(Me.Label1, "Label1") + Me.Label1.Name = "Label1" + ' + 'lblLevel1 + ' + resources.ApplyResources(Me.lblLevel1, "lblLevel1") + Me.lblLevel1.Name = "lblLevel1" + ' + 'rdoKruskalTest + ' + resources.ApplyResources(Me.rdoKruskalTest, "rdoKruskalTest") + Me.rdoKruskalTest.Name = "rdoKruskalTest" + Me.rdoKruskalTest.TabStop = True + Me.rdoKruskalTest.UseVisualStyleBackColor = True + ' + 'rdoWilcoxonTest + ' + resources.ApplyResources(Me.rdoWilcoxonTest, "rdoWilcoxonTest") + Me.rdoWilcoxonTest.Name = "rdoWilcoxonTest" + Me.rdoWilcoxonTest.TabStop = True + Me.rdoWilcoxonTest.UseVisualStyleBackColor = True + ' + 'ucrpnlKruskalWilcoxonTest + ' + resources.ApplyResources(Me.ucrpnlKruskalWilcoxonTest, "ucrpnlKruskalWilcoxonTest") + Me.ucrpnlKruskalWilcoxonTest.Name = "ucrpnlKruskalWilcoxonTest" + ' 'ucrNudHypothesis ' Me.ucrNudHypothesis.DecimalPlaces = New Decimal(New Integer() {2, 0, 0, 0}) @@ -258,31 +323,6 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrBase, "ucrBase") Me.ucrBase.Name = "ucrBase" ' - 'rdoGeneralCase - ' - resources.ApplyResources(Me.rdoGeneralCase, "rdoGeneralCase") - Me.rdoGeneralCase.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoGeneralCase.FlatAppearance.BorderSize = 2 - Me.rdoGeneralCase.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoGeneralCase.ForeColor = System.Drawing.SystemColors.ControlText - Me.rdoGeneralCase.Name = "rdoGeneralCase" - Me.rdoGeneralCase.UseVisualStyleBackColor = True - ' - 'rdoTwoSample - ' - resources.ApplyResources(Me.rdoTwoSample, "rdoTwoSample") - Me.rdoTwoSample.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoTwoSample.FlatAppearance.BorderSize = 2 - Me.rdoTwoSample.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoTwoSample.ForeColor = System.Drawing.SystemColors.ActiveCaptionText - Me.rdoTwoSample.Name = "rdoTwoSample" - Me.rdoTwoSample.UseVisualStyleBackColor = True - ' - 'ucrPnlModelType - ' - resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") - Me.ucrPnlModelType.Name = "ucrPnlModelType" - ' 'ucrChkConvertToVariate ' Me.ucrChkConvertToVariate.Checked = False @@ -294,80 +334,38 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") Me.ucrSaveModels.Name = "ucrSaveModels" ' - 'ucrChkFunction - ' - Me.ucrChkFunction.Checked = False - resources.ApplyResources(Me.ucrChkFunction, "ucrChkFunction") - Me.ucrChkFunction.Name = "ucrChkFunction" - ' - 'ucrpnlKruskalWilcoxonTest - ' - resources.ApplyResources(Me.ucrpnlKruskalWilcoxonTest, "ucrpnlKruskalWilcoxonTest") - Me.ucrpnlKruskalWilcoxonTest.Name = "ucrpnlKruskalWilcoxonTest" - ' - 'rdoWilcoxonTest - ' - resources.ApplyResources(Me.rdoWilcoxonTest, "rdoWilcoxonTest") - Me.rdoWilcoxonTest.Name = "rdoWilcoxonTest" - Me.rdoWilcoxonTest.TabStop = True - Me.rdoWilcoxonTest.UseVisualStyleBackColor = True - ' - 'rdoKruskalTest - ' - resources.ApplyResources(Me.rdoKruskalTest, "rdoKruskalTest") - Me.rdoKruskalTest.Name = "rdoKruskalTest" - Me.rdoKruskalTest.TabStop = True - Me.rdoKruskalTest.UseVisualStyleBackColor = True - ' - 'lblLevel1 - ' - resources.ApplyResources(Me.lblLevel1, "lblLevel1") - Me.lblLevel1.Name = "lblLevel1" - ' - 'Label1 - ' - resources.ApplyResources(Me.Label1, "Label1") - Me.Label1.Name = "Label1" - ' - 'ucrInputLevel1 - ' - Me.ucrInputLevel1.AddQuotesIfUnrecognised = True - Me.ucrInputLevel1.IsReadOnly = False - resources.ApplyResources(Me.ucrInputLevel1, "ucrInputLevel1") - Me.ucrInputLevel1.Name = "ucrInputLevel1" - ' - 'ucrInputLevel2 + 'rdoTwoSample ' - Me.ucrInputLevel2.AddQuotesIfUnrecognised = True - Me.ucrInputLevel2.IsReadOnly = False - resources.ApplyResources(Me.ucrInputLevel2, "ucrInputLevel2") - Me.ucrInputLevel2.Name = "ucrInputLevel2" + resources.ApplyResources(Me.rdoTwoSample, "rdoTwoSample") + Me.rdoTwoSample.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoTwoSample.FlatAppearance.BorderSize = 2 + Me.rdoTwoSample.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoTwoSample.Name = "rdoTwoSample" + Me.rdoTwoSample.UseVisualStyleBackColor = True ' - 'lblSuccess + 'rdoGeneralCase ' - resources.ApplyResources(Me.lblSuccess, "lblSuccess") - Me.lblSuccess.Name = "lblSuccess" + resources.ApplyResources(Me.rdoGeneralCase, "rdoGeneralCase") + Me.rdoGeneralCase.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoGeneralCase.FlatAppearance.BorderSize = 2 + Me.rdoGeneralCase.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoGeneralCase.Name = "rdoGeneralCase" + Me.rdoGeneralCase.UseVisualStyleBackColor = True ' - 'ucrNudSuccess + 'ucrPnlModelType ' - Me.ucrNudSuccess.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSuccess.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - resources.ApplyResources(Me.ucrNudSuccess, "ucrNudSuccess") - Me.ucrNudSuccess.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudSuccess.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSuccess.Name = "ucrNudSuccess" - Me.ucrNudSuccess.Value = New Decimal(New Integer() {0, 0, 0, 0}) + resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") + Me.ucrPnlModelType.Name = "ucrPnlModelType" ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.Controls.Add(Me.ucrChkFunction) Me.Controls.Add(Me.ucrSaveModels) - Me.Controls.Add(Me.ucrChkConvertToVariate) - Me.Controls.Add(Me.rdoGeneralCase) Me.Controls.Add(Me.rdoTwoSample) + Me.Controls.Add(Me.rdoGeneralCase) Me.Controls.Add(Me.ucrPnlModelType) + Me.Controls.Add(Me.ucrChkConvertToVariate) Me.Controls.Add(Me.grpParameters) Me.Controls.Add(Me.lblFactor) Me.Controls.Add(Me.lblNumeric) @@ -419,9 +417,6 @@ Partial Class dlgRegressionSimple Friend WithEvents lblConfidenceInterval As Label Friend WithEvents lblDifferenceInMeans As Label Friend WithEvents ucrChkConvertToVariate As ucrCheck - Friend WithEvents rdoGeneralCase As RadioButton - Friend WithEvents rdoTwoSample As RadioButton - Friend WithEvents ucrPnlModelType As UcrPanel Friend WithEvents ucrChkPairedTest As ucrCheck Friend WithEvents rdoCompareVariance As RadioButton Friend WithEvents rdoCompareMeans As RadioButton @@ -439,4 +434,7 @@ Partial Class dlgRegressionSimple Friend WithEvents ucrInputLevel1 As ucrInputComboBox Friend WithEvents Label1 As Label Friend WithEvents lblLevel1 As Label + Friend WithEvents rdoTwoSample As RadioButton + Friend WithEvents rdoGeneralCase As RadioButton + Friend WithEvents ucrPnlModelType As UcrPanel End Class \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 8173b1fbe63..452bfdbd5ed 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -19,10 +19,11 @@ Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True Public clsModel, clsFormulaOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator - Public clsRPoisson, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsRYVariable, clsRXVariable, clsTFunc, clsRLength As New RFunction + Public clsRPoisson, clsRModelsFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsRYVariable, clsRXVariable, clsTFunc, clsRLength As New RFunction Private bReset As Boolean = True - Private bResetSubDialog As Boolean = False + Public bResetSubDialog As Boolean = False + Public bResetOptionsSubDialog As Boolean = False Private Sub dlgRegressionSimple_Load(sender As Object, e As EventArgs) Handles Me.Load autoTranslate(Me) If bFirstLoad Then @@ -53,6 +54,8 @@ Public Class dlgRegressionSimple ucrExplanatory.Selector = ucrSelectorSimpleReg ucrBase.iHelpTopicID = 366 + ucrChkConvertToVariate.SetText("Convert to Variate") + ucrSaveModels.SetPrefix("reg") ucrSaveModels.SetText("Save Models") ucrSaveModels.SetDataFrameSelector(ucrSelectorSimpleReg.ucrAvailableDataFrames) @@ -105,11 +108,11 @@ Public Class dlgRegressionSimple ucrPnlMeansAndVariance.AddToLinkedControls(ucrNudHypothesis, {rdoCompareVariance}, bNewLinkedDisabledIfParameterMissing:=True) - sdgSimpleRegOptions.SetRModelFunction(clsRLmOrGLM) - sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) - sdgSimpleRegOptions.SetRYVariable(ucrResponse) - sdgSimpleRegOptions.SetRXVariable(ucrExplanatory) - sdgModelOptions.SetRCIFunction(clsRCIFunction) + ' sdgSimpleRegOptions.SetRModelFunction(clsRLmOrGLM) + 'sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) + 'sdgSimpleRegOptions.SetRYVariable(ucrResponse) + ' sdgSimpleRegOptions.SetRXVariable(ucrExplanatory) + ' sdgModelOptions.SetRCIFunction(clsRCIFunction) End Sub @@ -128,6 +131,11 @@ Public Class dlgRegressionSimple clsRLength = New RFunction clsRKruskalTest = New RFunction clsRFTest = New RFunction + clsRModelsFunction = New RFunction + clsRModelFunction = New RFunction + clsRaovFunction = New RFunction + clsRaovpvalFunction = New RFunction + clsRConfint = New RFunction ucrSelectorSimpleReg.Reset() ucrResponse.SetMeAsReceiver() @@ -141,14 +149,37 @@ Public Class dlgRegressionSimple clsFormulaOperator.AddParameter("y", 1, iPosition:=0) clsFormulaOperator.AddParameter("x", 1, iPosition:=1) + clsRLmOrGLM.SetRCommand("lm") + clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator) + + clsRModelsFunction.SetPackageName("base") + clsRModelsFunction.SetRCommand("formula") + clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRModelsFunction.iCallType = 2 + + + clsRaovFunction.SetPackageName("stats") + clsRaovFunction.SetRCommand("anova") + clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRaovFunction.iCallType = 2 + + clsRaovpvalFunction.SetPackageName("stats") + clsRaovpvalFunction.SetRCommand("anova") + clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + ' clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRaovpvalFunction.iCallType = 2 + + clsRConfint.SetPackageName("stats") + clsRConfint.SetRCommand("confint") + clsRConfint.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) + clsRConfint.iCallType = 2 + clsRConvert.SetRCommand("as.numeric") clsRCIFunction.SetRCommand(ucrFamily.clsCurrDistribution.strGLMFunctionName) clsGLM.AddParameter("family", clsRFunctionParameter:=clsRCIFunction) - clsRLmOrGLM.SetRCommand("lm") - clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator) clsRTTest.SetPackageName("mosaic") clsRTTest.SetRCommand("t.test") @@ -175,23 +206,28 @@ Public Class dlgRegressionSimple clsTFunc.SetRCommand("c") + frmMain.clsRLink.RunScript(clsRaovFunction.ToScript(), 2) clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=ucrSaveModels.GetText, bAssignToIsPrefix:=True) + ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) + ucrBase.clsRsyntax.AddToAfterCodes(clsRaovFunction, iPosition:=0) + ucrBase.clsRsyntax.AddToAfterCodes(clsRModelsFunction, iPosition:=1) + ucrBase.clsRsyntax.AddToAfterCodes(clsRaovpvalFunction, iPosition:=2) + ucrBase.clsRsyntax.AddToAfterCodes(clsRConfint, iPosition:=3) - - - - sdgSimpleRegOptions.SetDefaults() - sdgModelOptions.SetDefaults() + 'sdgSimpleRegOptions.SetDefaults() + 'sdgModelOptions.SetDefaults() ucrModelPreview.SetName("") SetRCode() ucrFamily.SetGLMDistributions() - sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True - sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True - sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True + 'sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True + 'sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True + 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True rdoCompareMeans.Checked = True SetEnableDists() TestOKEnabled() + bResetSubDialog = True + bResetOptionsSubDialog = True End Sub Private Sub ucrDistWithParameters_ucrInputDistributionsIndexChanged() Handles ucrFamily.DistributionsIndexChanged @@ -222,12 +258,19 @@ Public Class dlgRegressionSimple Private Sub ucrChkFunction_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkFunction.ControlValueChanged If ucrChkFunction.Checked Then - sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsRLmOrGLM, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel, clsNewFunction:=clsRCIFunction) - sdgVariableTransformations.Show() + 'sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsRLmOrGLM, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel, clsNewFunction:=clsRCIFunction) + sdgVariableTransformations.ShowDialog() bResetSubDialog = False End If End Sub + Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click + Display() + sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsRLmOrGLM, clsRModelFunction, clsRXVariable, clsRYVariable, bResetOptionsSubDialog) + bResetOptionsSubDialog = False + sdgSimpleRegOptions.ShowDialog() + End Sub + Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged clsRYVariable = ucrResponse.GetVariables End Sub @@ -244,6 +287,14 @@ Public Class dlgRegressionSimple clsRXVariable = ucrExplanatory.GetVariables End Sub + Private Sub ucrPnlModelType_Load(sender As Object, e As EventArgs) + + End Sub + + Private Sub rdoTable_CheckedChanged(sender As Object, e As EventArgs) Handles rdoGeneralCase.CheckedChanged + + End Sub + Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click sdgModelOptions.ShowDialog() ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) @@ -463,18 +514,21 @@ Public Class dlgRegressionSimple End Sub Private Sub TestOKEnabled() - If Not ucrResponse.IsEmpty() AndAlso Not ucrExplanatory.IsEmpty() AndAlso ucrFamily.Enabled AndAlso Not ucrFamily.ucrInputDistributions.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then - ucrModelPreview.SetName(clsModel.ToScript) - ' If rdoSpecific.Checked AndAlso (ucrFamily.clsCurrDistribution.strNameTag = "Poisson" OrElse ucrFamily.clsCurrDistribution.strNameTag = "Binomial") AndAlso Not (ucrLevel1.IsEmpty OrElse ucrLevel2.IsEmpty) Then + ' If Not ucrResponse.IsEmpty() AndAlso Not ucrExplanatory.IsEmpty() AndAlso ucrFamily.Enabled AndAlso Not ucrFamily.ucrInputDistributions.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then + 'ucrModelPreview.SetName(clsModel.ToScript) + ' If rdoSpecific.Checked AndAlso (ucrFamily.clsCurrDistribution.strNameTag = "Poisson" OrElse ucrFamily.clsCurrDistribution.strNameTag = "Binomial") AndAlso Not (ucrLevel1.IsEmpty OrElse ucrLevel2.IsEmpty) Then + 'ucrBase.OKEnabled(True) + ' Else + ' ucrBase.OKEnabled(False) + ' End If + 'If rdoGeneralCase.Checked Then + 'ucrBase.clsRsyntax.AddParameter("formula", clsROperatorParameter:=clsModel) + 'End If + 'Else + 'ucrBase.OKEnabled(False) + ' End If + If Not ucrResponse.IsEmpty() Then ucrBase.OKEnabled(True) - ' Else - ' ucrBase.OKEnabled(False) - ' End If - If rdoGeneralCase.Checked Then - ucrBase.clsRsyntax.AddParameter("formula", clsROperatorParameter:=clsModel) - End If - Else - ucrBase.OKEnabled(False) End If End Sub @@ -483,11 +537,6 @@ Public Class dlgRegressionSimple SetRCode() End Sub - Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click - Display() - sdgSimpleRegOptions.ShowDialog() - End Sub - Public Sub ConvertToVariate() If rdoGeneralCase.Checked Then If Not ucrResponse.IsEmpty Then @@ -726,4 +775,7 @@ Public Class dlgRegressionSimple SetEnableDists() End Sub + Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlContentsChanged + TestOKEnabled() + End Sub End Class \ No newline at end of file diff --git a/instat/sdgSimpleRegOptions.Designer.vb b/instat/sdgSimpleRegOptions.Designer.vb index 687c8f2cdb9..c870478f8d8 100644 --- a/instat/sdgSimpleRegOptions.Designer.vb +++ b/instat/sdgSimpleRegOptions.Designer.vb @@ -25,71 +25,72 @@ Partial Class sdgSimpleRegOptions Me.tbGraphics = New System.Windows.Forms.TabPage() Me.tcGraphics = New System.Windows.Forms.TabControl() Me.tbModel = New System.Windows.Forms.TabPage() - Me.chkConfIntervalband = New System.Windows.Forms.CheckBox() + Me.ucrNudWhiteSpace = New instat.ucrNud() + Me.ucrNudGraphicsCLevel = New instat.ucrNud() + Me.ucrChkRugs = New instat.ucrCheck() + Me.ucrChkJitter = New instat.ucrCheck() + Me.ucrChkPartial = New instat.ucrCheck() + Me.ucrChkConfIntervalband = New instat.ucrCheck() + Me.ucrChkFittedModel = New instat.ucrCheck() Me.grpRugs = New System.Windows.Forms.GroupBox() Me.rdoPartial = New System.Windows.Forms.RadioButton() Me.rdo1 = New System.Windows.Forms.RadioButton() Me.rdo2 = New System.Windows.Forms.RadioButton() - Me.nudWhiteSpace = New System.Windows.Forms.NumericUpDown() - Me.chkFittedModel = New System.Windows.Forms.CheckBox() - Me.nudGraphicsCLevel = New System.Windows.Forms.NumericUpDown() + Me.ucrPnlPartial12 = New instat.UcrPanel() Me.lblWhiteSpace = New System.Windows.Forms.Label() Me.lblGraphicsSignLevel = New System.Windows.Forms.Label() - Me.chkPartial = New System.Windows.Forms.CheckBox() - Me.chkJitter = New System.Windows.Forms.CheckBox() - Me.chkRugs = New System.Windows.Forms.CheckBox() Me.grpScale = New System.Windows.Forms.GroupBox() Me.rdoResponse = New System.Windows.Forms.RadioButton() Me.rdoLinear = New System.Windows.Forms.RadioButton() + Me.ucrPnlScale = New instat.UcrPanel() Me.grpPlotType = New System.Windows.Forms.GroupBox() Me.rdoContrast = New System.Windows.Forms.RadioButton() Me.rdoConditional = New System.Windows.Forms.RadioButton() + Me.ucrPnlPlotType = New instat.UcrPanel() Me.tbResiduals = New System.Windows.Forms.TabPage() - Me.chkIndividualPlots = New System.Windows.Forms.CheckBox() - Me.chkMultiplePlots = New System.Windows.Forms.CheckBox() Me.grpIndividualPlots = New System.Windows.Forms.GroupBox() - Me.rdoCooksDistanceLeverage = New System.Windows.Forms.RadioButton() - Me.rdoCooksDistance = New System.Windows.Forms.RadioButton() - Me.rdoResidualsLeverage = New System.Windows.Forms.RadioButton() - Me.rdoScaleLocation = New System.Windows.Forms.RadioButton() - Me.rdoQQ = New System.Windows.Forms.RadioButton() - Me.rdoResidualsFitted = New System.Windows.Forms.RadioButton() Me.grpMultiplePlots = New System.Windows.Forms.GroupBox() - Me.rdoSixPlots3Rows = New System.Windows.Forms.RadioButton() - Me.rdoFourPlots = New System.Windows.Forms.RadioButton() - Me.rdoSixPlots2Rows = New System.Windows.Forms.RadioButton() Me.tbDisplay = New System.Windows.Forms.TabPage() - Me.chkDisplayCLimits = New System.Windows.Forms.CheckBox() - Me.nudDisplayCLevel = New System.Windows.Forms.NumericUpDown() + Me.ucrNudDisplayCLevel = New instat.ucrNud() + Me.ucrChkPvalues = New instat.ucrCheck() + Me.ucrChkEstimates = New instat.ucrCheck() + Me.ucrChkDisplayCLimits = New instat.ucrCheck() + Me.ucrChkANOVA = New instat.ucrCheck() + Me.ucrChkModel = New instat.ucrCheck() Me.lblDisplayCLevel = New System.Windows.Forms.Label() - Me.chkEstimates = New System.Windows.Forms.CheckBox() - Me.chkPvalues = New System.Windows.Forms.CheckBox() - Me.chkANOVA = New System.Windows.Forms.CheckBox() - Me.chkModel = New System.Windows.Forms.CheckBox() Me.tbRegOptions = New System.Windows.Forms.TabControl() Me.tbSave = New System.Windows.Forms.TabPage() + Me.ucrChkLeverage = New instat.ucrCheck() + Me.ucrChkStdResiduals = New instat.ucrCheck() + Me.ucrChkResiduals = New instat.ucrCheck() + Me.ucrChkFittedValues = New instat.ucrCheck() Me.ucrLeverageColumnName = New instat.ucrInputComboBox() Me.ucrStdResidualsColumnName = New instat.ucrInputComboBox() Me.ucrResidualsColumnName = New instat.ucrInputComboBox() Me.ucrFittedColumnName = New instat.ucrInputComboBox() - Me.chkFittedValues = New System.Windows.Forms.CheckBox() - Me.chkResiduals = New System.Windows.Forms.CheckBox() - Me.chkStdResiduals = New System.Windows.Forms.CheckBox() - Me.chkLeverage = New System.Windows.Forms.CheckBox() Me.ucrSdgButtons = New instat.ucrButtonsSubdialogue() + Me.ucrChkMultiplePlots = New instat.ucrCheck() + Me.ucrChkIndividualPlots = New instat.ucrCheck() + Me.ucrPnlIndividualPlots = New instat.UcrPanel() + Me.rdoCooksDistanceLeverage = New System.Windows.Forms.RadioButton() + Me.rdoCooksDistance = New System.Windows.Forms.RadioButton() + Me.rdoResidualsLeverage = New System.Windows.Forms.RadioButton() + Me.rdoScaleLocation = New System.Windows.Forms.RadioButton() + Me.rdoQQ = New System.Windows.Forms.RadioButton() + Me.rdoResidualsFitted = New System.Windows.Forms.RadioButton() + Me.rdoSixPlots3Rows = New System.Windows.Forms.RadioButton() + Me.rdoFourPlots = New System.Windows.Forms.RadioButton() + Me.rdoSixPlots2Rows = New System.Windows.Forms.RadioButton() + Me.ucrPnlMutiplePlots = New instat.UcrPanel() Me.tbGraphics.SuspendLayout() Me.tcGraphics.SuspendLayout() Me.tbModel.SuspendLayout() Me.grpRugs.SuspendLayout() - CType(Me.nudWhiteSpace, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.nudGraphicsCLevel, System.ComponentModel.ISupportInitialize).BeginInit() Me.grpScale.SuspendLayout() Me.grpPlotType.SuspendLayout() Me.tbResiduals.SuspendLayout() - Me.grpIndividualPlots.SuspendLayout() Me.grpMultiplePlots.SuspendLayout() Me.tbDisplay.SuspendLayout() - CType(Me.nudDisplayCLevel, System.ComponentModel.ISupportInitialize).BeginInit() Me.tbRegOptions.SuspendLayout() Me.tbSave.SuspendLayout() Me.SuspendLayout() @@ -119,16 +120,16 @@ Partial Class sdgSimpleRegOptions 'tbModel ' Me.tbModel.AccessibleDescription = "" - Me.tbModel.Controls.Add(Me.chkConfIntervalband) + Me.tbModel.Controls.Add(Me.ucrNudWhiteSpace) + Me.tbModel.Controls.Add(Me.ucrNudGraphicsCLevel) + Me.tbModel.Controls.Add(Me.ucrChkRugs) + Me.tbModel.Controls.Add(Me.ucrChkJitter) + Me.tbModel.Controls.Add(Me.ucrChkPartial) + Me.tbModel.Controls.Add(Me.ucrChkConfIntervalband) + Me.tbModel.Controls.Add(Me.ucrChkFittedModel) Me.tbModel.Controls.Add(Me.grpRugs) - Me.tbModel.Controls.Add(Me.nudWhiteSpace) - Me.tbModel.Controls.Add(Me.chkFittedModel) - Me.tbModel.Controls.Add(Me.nudGraphicsCLevel) Me.tbModel.Controls.Add(Me.lblWhiteSpace) Me.tbModel.Controls.Add(Me.lblGraphicsSignLevel) - Me.tbModel.Controls.Add(Me.chkPartial) - Me.tbModel.Controls.Add(Me.chkJitter) - Me.tbModel.Controls.Add(Me.chkRugs) Me.tbModel.Controls.Add(Me.grpScale) Me.tbModel.Controls.Add(Me.grpPlotType) Me.tbModel.Location = New System.Drawing.Point(4, 22) @@ -140,23 +141,77 @@ Partial Class sdgSimpleRegOptions Me.tbModel.Text = "Model" Me.tbModel.UseVisualStyleBackColor = True ' - 'chkConfIntervalband - ' - Me.chkConfIntervalband.AutoSize = True - Me.chkConfIntervalband.Location = New System.Drawing.Point(115, 205) - Me.chkConfIntervalband.Name = "chkConfIntervalband" - Me.chkConfIntervalband.Size = New System.Drawing.Size(66, 17) - Me.chkConfIntervalband.TabIndex = 10 - Me.chkConfIntervalband.Tag = "C.I band" - Me.chkConfIntervalband.Text = "C.I band" - Me.chkConfIntervalband.UseVisualStyleBackColor = True + 'ucrNudWhiteSpace + ' + Me.ucrNudWhiteSpace.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudWhiteSpace.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudWhiteSpace.Location = New System.Drawing.Point(115, 147) + Me.ucrNudWhiteSpace.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudWhiteSpace.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudWhiteSpace.Name = "ucrNudWhiteSpace" + Me.ucrNudWhiteSpace.Size = New System.Drawing.Size(50, 20) + Me.ucrNudWhiteSpace.TabIndex = 27 + Me.ucrNudWhiteSpace.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudGraphicsCLevel + ' + Me.ucrNudGraphicsCLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Location = New System.Drawing.Point(115, 121) + Me.ucrNudGraphicsCLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Name = "ucrNudGraphicsCLevel" + Me.ucrNudGraphicsCLevel.Size = New System.Drawing.Size(50, 20) + Me.ucrNudGraphicsCLevel.TabIndex = 26 + Me.ucrNudGraphicsCLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkRugs + ' + Me.ucrChkRugs.Checked = False + Me.ucrChkRugs.Location = New System.Drawing.Point(115, 179) + Me.ucrChkRugs.Name = "ucrChkRugs" + Me.ucrChkRugs.Size = New System.Drawing.Size(113, 20) + Me.ucrChkRugs.TabIndex = 24 + ' + 'ucrChkJitter + ' + Me.ucrChkJitter.Checked = False + Me.ucrChkJitter.Location = New System.Drawing.Point(10, 204) + Me.ucrChkJitter.Name = "ucrChkJitter" + Me.ucrChkJitter.Size = New System.Drawing.Size(97, 20) + Me.ucrChkJitter.TabIndex = 23 + ' + 'ucrChkPartial + ' + Me.ucrChkPartial.Checked = False + Me.ucrChkPartial.Location = New System.Drawing.Point(10, 178) + Me.ucrChkPartial.Name = "ucrChkPartial" + Me.ucrChkPartial.Size = New System.Drawing.Size(113, 20) + Me.ucrChkPartial.TabIndex = 25 + ' + 'ucrChkConfIntervalband + ' + Me.ucrChkConfIntervalband.Checked = False + Me.ucrChkConfIntervalband.Location = New System.Drawing.Point(115, 202) + Me.ucrChkConfIntervalband.Name = "ucrChkConfIntervalband" + Me.ucrChkConfIntervalband.Size = New System.Drawing.Size(113, 20) + Me.ucrChkConfIntervalband.TabIndex = 22 + ' + 'ucrChkFittedModel + ' + Me.ucrChkFittedModel.Checked = False + Me.ucrChkFittedModel.Location = New System.Drawing.Point(10, 7) + Me.ucrChkFittedModel.Name = "ucrChkFittedModel" + Me.ucrChkFittedModel.Size = New System.Drawing.Size(113, 20) + Me.ucrChkFittedModel.TabIndex = 21 ' 'grpRugs ' Me.grpRugs.Controls.Add(Me.rdoPartial) Me.grpRugs.Controls.Add(Me.rdo1) Me.grpRugs.Controls.Add(Me.rdo2) - Me.grpRugs.Location = New System.Drawing.Point(10, 228) + Me.grpRugs.Controls.Add(Me.ucrPnlPartial12) + Me.grpRugs.Location = New System.Drawing.Point(9, 231) Me.grpRugs.Name = "grpRugs" Me.grpRugs.Size = New System.Drawing.Size(190, 46) Me.grpRugs.TabIndex = 7 @@ -165,10 +220,10 @@ Partial Class sdgSimpleRegOptions 'rdoPartial ' Me.rdoPartial.AutoSize = True - Me.rdoPartial.Location = New System.Drawing.Point(6, 17) + Me.rdoPartial.Location = New System.Drawing.Point(14, 16) Me.rdoPartial.Name = "rdoPartial" Me.rdoPartial.Size = New System.Drawing.Size(54, 17) - Me.rdoPartial.TabIndex = 5 + Me.rdoPartial.TabIndex = 38 Me.rdoPartial.TabStop = True Me.rdoPartial.Tag = "Partial" Me.rdoPartial.Text = "Partial" @@ -177,10 +232,10 @@ Partial Class sdgSimpleRegOptions 'rdo1 ' Me.rdo1.AutoSize = True - Me.rdo1.Location = New System.Drawing.Point(80, 17) + Me.rdo1.Location = New System.Drawing.Point(88, 16) Me.rdo1.Name = "rdo1" Me.rdo1.Size = New System.Drawing.Size(31, 17) - Me.rdo1.TabIndex = 3 + Me.rdo1.TabIndex = 36 Me.rdo1.TabStop = True Me.rdo1.Tag = "1" Me.rdo1.Text = "1" @@ -189,47 +244,21 @@ Partial Class sdgSimpleRegOptions 'rdo2 ' Me.rdo2.AutoSize = True - Me.rdo2.Location = New System.Drawing.Point(131, 17) + Me.rdo2.Location = New System.Drawing.Point(139, 16) Me.rdo2.Name = "rdo2" Me.rdo2.Size = New System.Drawing.Size(31, 17) - Me.rdo2.TabIndex = 4 + Me.rdo2.TabIndex = 37 Me.rdo2.TabStop = True Me.rdo2.Tag = "2" Me.rdo2.Text = "2" Me.rdo2.UseVisualStyleBackColor = True ' - 'nudWhiteSpace - ' - Me.nudWhiteSpace.DecimalPlaces = 1 - Me.nudWhiteSpace.Increment = New Decimal(New Integer() {1, 0, 0, 65536}) - Me.nudWhiteSpace.Location = New System.Drawing.Point(109, 147) - Me.nudWhiteSpace.Maximum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudWhiteSpace.Name = "nudWhiteSpace" - Me.nudWhiteSpace.Size = New System.Drawing.Size(46, 20) - Me.nudWhiteSpace.TabIndex = 9 - Me.nudWhiteSpace.Value = New Decimal(New Integer() {2, 0, 0, 65536}) - ' - 'chkFittedModel - ' - Me.chkFittedModel.AutoSize = True - Me.chkFittedModel.Location = New System.Drawing.Point(10, 10) - Me.chkFittedModel.Name = "chkFittedModel" - Me.chkFittedModel.Size = New System.Drawing.Size(84, 17) - Me.chkFittedModel.TabIndex = 0 - Me.chkFittedModel.Tag = "Fitted_Model" - Me.chkFittedModel.Text = "Fitted Model" - Me.chkFittedModel.UseVisualStyleBackColor = True - ' - 'nudGraphicsCLevel - ' - Me.nudGraphicsCLevel.DecimalPlaces = 2 - Me.nudGraphicsCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 131072}) - Me.nudGraphicsCLevel.Location = New System.Drawing.Point(109, 121) - Me.nudGraphicsCLevel.Maximum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudGraphicsCLevel.Name = "nudGraphicsCLevel" - Me.nudGraphicsCLevel.Size = New System.Drawing.Size(46, 20) - Me.nudGraphicsCLevel.TabIndex = 3 - Me.nudGraphicsCLevel.Value = New Decimal(New Integer() {5, 0, 0, 131072}) + 'ucrPnlPartial12 + ' + Me.ucrPnlPartial12.Location = New System.Drawing.Point(6, 13) + Me.ucrPnlPartial12.Name = "ucrPnlPartial12" + Me.ucrPnlPartial12.Size = New System.Drawing.Size(176, 27) + Me.ucrPnlPartial12.TabIndex = 35 ' 'lblWhiteSpace ' @@ -251,43 +280,11 @@ Partial Class sdgSimpleRegOptions Me.lblGraphicsSignLevel.Tag = "Significance_Level:" Me.lblGraphicsSignLevel.Text = "Significance Level:" ' - 'chkPartial - ' - Me.chkPartial.AutoSize = True - Me.chkPartial.Location = New System.Drawing.Point(10, 182) - Me.chkPartial.Name = "chkPartial" - Me.chkPartial.Size = New System.Drawing.Size(55, 17) - Me.chkPartial.TabIndex = 6 - Me.chkPartial.Tag = "Partial" - Me.chkPartial.Text = "Partial" - Me.chkPartial.UseVisualStyleBackColor = True - ' - 'chkJitter - ' - Me.chkJitter.AutoSize = True - Me.chkJitter.Location = New System.Drawing.Point(10, 205) - Me.chkJitter.Name = "chkJitter" - Me.chkJitter.Size = New System.Drawing.Size(48, 17) - Me.chkJitter.TabIndex = 7 - Me.chkJitter.Tag = "Jitter" - Me.chkJitter.Text = "Jitter" - Me.chkJitter.UseVisualStyleBackColor = True - ' - 'chkRugs - ' - Me.chkRugs.AutoSize = True - Me.chkRugs.Location = New System.Drawing.Point(115, 182) - Me.chkRugs.Name = "chkRugs" - Me.chkRugs.Size = New System.Drawing.Size(51, 17) - Me.chkRugs.TabIndex = 2 - Me.chkRugs.Tag = "Rugs" - Me.chkRugs.Text = "Rugs" - Me.chkRugs.UseVisualStyleBackColor = True - ' 'grpScale ' Me.grpScale.Controls.Add(Me.rdoResponse) Me.grpScale.Controls.Add(Me.rdoLinear) + Me.grpScale.Controls.Add(Me.ucrPnlScale) Me.grpScale.Location = New System.Drawing.Point(178, 33) Me.grpScale.Name = "grpScale" Me.grpScale.Size = New System.Drawing.Size(112, 75) @@ -299,10 +296,10 @@ Partial Class sdgSimpleRegOptions 'rdoResponse ' Me.rdoResponse.AutoSize = True - Me.rdoResponse.Location = New System.Drawing.Point(6, 42) + Me.rdoResponse.Location = New System.Drawing.Point(11, 42) Me.rdoResponse.Name = "rdoResponse" Me.rdoResponse.Size = New System.Drawing.Size(73, 17) - Me.rdoResponse.TabIndex = 8 + Me.rdoResponse.TabIndex = 30 Me.rdoResponse.TabStop = True Me.rdoResponse.Tag = "Response" Me.rdoResponse.Text = "Response" @@ -311,19 +308,27 @@ Partial Class sdgSimpleRegOptions 'rdoLinear ' Me.rdoLinear.AutoSize = True - Me.rdoLinear.Location = New System.Drawing.Point(6, 19) + Me.rdoLinear.Location = New System.Drawing.Point(11, 19) Me.rdoLinear.Name = "rdoLinear" Me.rdoLinear.Size = New System.Drawing.Size(54, 17) - Me.rdoLinear.TabIndex = 7 + Me.rdoLinear.TabIndex = 29 Me.rdoLinear.TabStop = True Me.rdoLinear.Tag = "Linear" Me.rdoLinear.Text = "Linear" Me.rdoLinear.UseVisualStyleBackColor = True ' + 'ucrPnlScale + ' + Me.ucrPnlScale.Location = New System.Drawing.Point(6, 19) + Me.ucrPnlScale.Name = "ucrPnlScale" + Me.ucrPnlScale.Size = New System.Drawing.Size(94, 43) + Me.ucrPnlScale.TabIndex = 28 + ' 'grpPlotType ' Me.grpPlotType.Controls.Add(Me.rdoContrast) Me.grpPlotType.Controls.Add(Me.rdoConditional) + Me.grpPlotType.Controls.Add(Me.ucrPnlPlotType) Me.grpPlotType.Location = New System.Drawing.Point(10, 33) Me.grpPlotType.Name = "grpPlotType" Me.grpPlotType.Size = New System.Drawing.Size(111, 75) @@ -335,10 +340,10 @@ Partial Class sdgSimpleRegOptions 'rdoContrast ' Me.rdoContrast.AutoSize = True - Me.rdoContrast.Location = New System.Drawing.Point(10, 42) + Me.rdoContrast.Location = New System.Drawing.Point(9, 42) Me.rdoContrast.Name = "rdoContrast" Me.rdoContrast.Size = New System.Drawing.Size(64, 17) - Me.rdoContrast.TabIndex = 3 + Me.rdoContrast.TabIndex = 33 Me.rdoContrast.Tag = "Contrast" Me.rdoContrast.Text = "Contrast" Me.rdoContrast.UseVisualStyleBackColor = True @@ -346,18 +351,32 @@ Partial Class sdgSimpleRegOptions 'rdoConditional ' Me.rdoConditional.AutoSize = True - Me.rdoConditional.Location = New System.Drawing.Point(10, 19) + Me.rdoConditional.Location = New System.Drawing.Point(9, 19) Me.rdoConditional.Name = "rdoConditional" Me.rdoConditional.Size = New System.Drawing.Size(77, 17) - Me.rdoConditional.TabIndex = 2 + Me.rdoConditional.TabIndex = 32 Me.rdoConditional.Tag = "Conditional" Me.rdoConditional.Text = "Conditional" Me.rdoConditional.UseVisualStyleBackColor = True ' + 'ucrPnlPlotType + ' + Me.ucrPnlPlotType.Location = New System.Drawing.Point(9, 19) + Me.ucrPnlPlotType.Name = "ucrPnlPlotType" + Me.ucrPnlPlotType.Size = New System.Drawing.Size(77, 43) + Me.ucrPnlPlotType.TabIndex = 31 + ' 'tbResiduals ' - Me.tbResiduals.Controls.Add(Me.chkIndividualPlots) - Me.tbResiduals.Controls.Add(Me.chkMultiplePlots) + Me.tbResiduals.Controls.Add(Me.rdoCooksDistanceLeverage) + Me.tbResiduals.Controls.Add(Me.rdoCooksDistance) + Me.tbResiduals.Controls.Add(Me.rdoResidualsLeverage) + Me.tbResiduals.Controls.Add(Me.rdoScaleLocation) + Me.tbResiduals.Controls.Add(Me.rdoQQ) + Me.tbResiduals.Controls.Add(Me.rdoResidualsFitted) + Me.tbResiduals.Controls.Add(Me.ucrPnlIndividualPlots) + Me.tbResiduals.Controls.Add(Me.ucrChkIndividualPlots) + Me.tbResiduals.Controls.Add(Me.ucrChkMultiplePlots) Me.tbResiduals.Controls.Add(Me.grpIndividualPlots) Me.tbResiduals.Controls.Add(Me.grpMultiplePlots) Me.tbResiduals.Location = New System.Drawing.Point(4, 22) @@ -369,37 +388,8 @@ Partial Class sdgSimpleRegOptions Me.tbResiduals.Text = "Residuals" Me.tbResiduals.UseVisualStyleBackColor = True ' - 'chkIndividualPlots - ' - Me.chkIndividualPlots.AutoSize = True - Me.chkIndividualPlots.Location = New System.Drawing.Point(10, 127) - Me.chkIndividualPlots.Name = "chkIndividualPlots" - Me.chkIndividualPlots.Size = New System.Drawing.Size(97, 17) - Me.chkIndividualPlots.TabIndex = 3 - Me.chkIndividualPlots.TabStop = False - Me.chkIndividualPlots.Tag = "Individual_Plots" - Me.chkIndividualPlots.Text = "Individual Plots" - Me.chkIndividualPlots.UseVisualStyleBackColor = True - ' - 'chkMultiplePlots - ' - Me.chkMultiplePlots.AutoSize = True - Me.chkMultiplePlots.Location = New System.Drawing.Point(10, 10) - Me.chkMultiplePlots.Name = "chkMultiplePlots" - Me.chkMultiplePlots.Size = New System.Drawing.Size(88, 17) - Me.chkMultiplePlots.TabIndex = 2 - Me.chkMultiplePlots.Tag = "Multiple_Plots" - Me.chkMultiplePlots.Text = "Multiple Plots" - Me.chkMultiplePlots.UseVisualStyleBackColor = True - ' 'grpIndividualPlots ' - Me.grpIndividualPlots.Controls.Add(Me.rdoCooksDistanceLeverage) - Me.grpIndividualPlots.Controls.Add(Me.rdoCooksDistance) - Me.grpIndividualPlots.Controls.Add(Me.rdoResidualsLeverage) - Me.grpIndividualPlots.Controls.Add(Me.rdoScaleLocation) - Me.grpIndividualPlots.Controls.Add(Me.rdoQQ) - Me.grpIndividualPlots.Controls.Add(Me.rdoResidualsFitted) Me.grpIndividualPlots.Location = New System.Drawing.Point(10, 149) Me.grpIndividualPlots.Name = "grpIndividualPlots" Me.grpIndividualPlots.Size = New System.Drawing.Size(278, 89) @@ -407,83 +397,12 @@ Partial Class sdgSimpleRegOptions Me.grpIndividualPlots.TabStop = False Me.grpIndividualPlots.Tag = "" ' - 'rdoCooksDistanceLeverage - ' - Me.rdoCooksDistanceLeverage.AutoSize = True - Me.rdoCooksDistanceLeverage.Location = New System.Drawing.Point(10, 65) - Me.rdoCooksDistanceLeverage.Name = "rdoCooksDistanceLeverage" - Me.rdoCooksDistanceLeverage.Size = New System.Drawing.Size(159, 17) - Me.rdoCooksDistanceLeverage.TabIndex = 6 - Me.rdoCooksDistanceLeverage.TabStop = True - Me.rdoCooksDistanceLeverage.Tag = "Cook's_Distance_v_Leverage" - Me.rdoCooksDistanceLeverage.Text = "Cook's Distance v Leverage" - Me.rdoCooksDistanceLeverage.UseVisualStyleBackColor = True - ' - 'rdoCooksDistance - ' - Me.rdoCooksDistance.AutoSize = True - Me.rdoCooksDistance.Location = New System.Drawing.Point(174, 65) - Me.rdoCooksDistance.Name = "rdoCooksDistance" - Me.rdoCooksDistance.Size = New System.Drawing.Size(102, 17) - Me.rdoCooksDistance.TabIndex = 5 - Me.rdoCooksDistance.TabStop = True - Me.rdoCooksDistance.Tag = "Cook's_Distance" - Me.rdoCooksDistance.Text = "Cook's Distance" - Me.rdoCooksDistance.UseVisualStyleBackColor = True - ' - 'rdoResidualsLeverage - ' - Me.rdoResidualsLeverage.AutoSize = True - Me.rdoResidualsLeverage.Location = New System.Drawing.Point(10, 42) - Me.rdoResidualsLeverage.Name = "rdoResidualsLeverage" - Me.rdoResidualsLeverage.Size = New System.Drawing.Size(128, 17) - Me.rdoResidualsLeverage.TabIndex = 4 - Me.rdoResidualsLeverage.TabStop = True - Me.rdoResidualsLeverage.Tag = "Residuals_v_Leverage" - Me.rdoResidualsLeverage.Text = "Residuals v Leverage" - Me.rdoResidualsLeverage.UseVisualStyleBackColor = True - ' - 'rdoScaleLocation - ' - Me.rdoScaleLocation.AutoSize = True - Me.rdoScaleLocation.Location = New System.Drawing.Point(174, 42) - Me.rdoScaleLocation.Name = "rdoScaleLocation" - Me.rdoScaleLocation.Size = New System.Drawing.Size(96, 17) - Me.rdoScaleLocation.TabIndex = 3 - Me.rdoScaleLocation.TabStop = True - Me.rdoScaleLocation.Tag = "Scale-Location" - Me.rdoScaleLocation.Text = "Scale-Location" - Me.rdoScaleLocation.UseVisualStyleBackColor = True - ' - 'rdoQQ - ' - Me.rdoQQ.AutoSize = True - Me.rdoQQ.Location = New System.Drawing.Point(174, 19) - Me.rdoQQ.Name = "rdoQQ" - Me.rdoQQ.Size = New System.Drawing.Size(44, 17) - Me.rdoQQ.TabIndex = 2 - Me.rdoQQ.TabStop = True - Me.rdoQQ.Tag = "Q-Q" - Me.rdoQQ.Text = "Q-Q" - Me.rdoQQ.UseVisualStyleBackColor = True - ' - 'rdoResidualsFitted - ' - Me.rdoResidualsFitted.AutoSize = True - Me.rdoResidualsFitted.Location = New System.Drawing.Point(10, 19) - Me.rdoResidualsFitted.Name = "rdoResidualsFitted" - Me.rdoResidualsFitted.Size = New System.Drawing.Size(109, 17) - Me.rdoResidualsFitted.TabIndex = 1 - Me.rdoResidualsFitted.TabStop = True - Me.rdoResidualsFitted.Tag = "Residuals_v_Fitted" - Me.rdoResidualsFitted.Text = "Residuals v Fitted" - Me.rdoResidualsFitted.UseVisualStyleBackColor = True - ' 'grpMultiplePlots ' Me.grpMultiplePlots.Controls.Add(Me.rdoSixPlots3Rows) Me.grpMultiplePlots.Controls.Add(Me.rdoFourPlots) Me.grpMultiplePlots.Controls.Add(Me.rdoSixPlots2Rows) + Me.grpMultiplePlots.Controls.Add(Me.ucrPnlMutiplePlots) Me.grpMultiplePlots.Location = New System.Drawing.Point(10, 33) Me.grpMultiplePlots.Name = "grpMultiplePlots" Me.grpMultiplePlots.Size = New System.Drawing.Size(278, 78) @@ -491,51 +410,15 @@ Partial Class sdgSimpleRegOptions Me.grpMultiplePlots.TabStop = False Me.grpMultiplePlots.Tag = "" ' - 'rdoSixPlots3Rows - ' - Me.rdoSixPlots3Rows.AutoSize = True - Me.rdoSixPlots3Rows.Location = New System.Drawing.Point(174, 19) - Me.rdoSixPlots3Rows.Name = "rdoSixPlots3Rows" - Me.rdoSixPlots3Rows.Size = New System.Drawing.Size(102, 17) - Me.rdoSixPlots3Rows.TabIndex = 2 - Me.rdoSixPlots3Rows.TabStop = True - Me.rdoSixPlots3Rows.Tag = "Six_Plots(3 rows)" - Me.rdoSixPlots3Rows.Text = "Six Plots(3 rows)" - Me.rdoSixPlots3Rows.UseVisualStyleBackColor = True - ' - 'rdoFourPlots - ' - Me.rdoFourPlots.AutoSize = True - Me.rdoFourPlots.Location = New System.Drawing.Point(10, 19) - Me.rdoFourPlots.Name = "rdoFourPlots" - Me.rdoFourPlots.Size = New System.Drawing.Size(72, 17) - Me.rdoFourPlots.TabIndex = 1 - Me.rdoFourPlots.TabStop = True - Me.rdoFourPlots.Tag = "Four_Plots" - Me.rdoFourPlots.Text = "Four Plots" - Me.rdoFourPlots.UseVisualStyleBackColor = True - ' - 'rdoSixPlots2Rows - ' - Me.rdoSixPlots2Rows.AutoSize = True - Me.rdoSixPlots2Rows.Location = New System.Drawing.Point(10, 42) - Me.rdoSixPlots2Rows.Name = "rdoSixPlots2Rows" - Me.rdoSixPlots2Rows.Size = New System.Drawing.Size(105, 17) - Me.rdoSixPlots2Rows.TabIndex = 0 - Me.rdoSixPlots2Rows.TabStop = True - Me.rdoSixPlots2Rows.Tag = "Six_Plots(2 rows)" - Me.rdoSixPlots2Rows.Text = "Six_Plots(2 rows)" - Me.rdoSixPlots2Rows.UseVisualStyleBackColor = True - ' 'tbDisplay ' - Me.tbDisplay.Controls.Add(Me.chkDisplayCLimits) - Me.tbDisplay.Controls.Add(Me.nudDisplayCLevel) + Me.tbDisplay.Controls.Add(Me.ucrNudDisplayCLevel) + Me.tbDisplay.Controls.Add(Me.ucrChkPvalues) + Me.tbDisplay.Controls.Add(Me.ucrChkEstimates) + Me.tbDisplay.Controls.Add(Me.ucrChkDisplayCLimits) + Me.tbDisplay.Controls.Add(Me.ucrChkANOVA) + Me.tbDisplay.Controls.Add(Me.ucrChkModel) Me.tbDisplay.Controls.Add(Me.lblDisplayCLevel) - Me.tbDisplay.Controls.Add(Me.chkEstimates) - Me.tbDisplay.Controls.Add(Me.chkPvalues) - Me.tbDisplay.Controls.Add(Me.chkANOVA) - Me.tbDisplay.Controls.Add(Me.chkModel) Me.tbDisplay.Location = New System.Drawing.Point(4, 22) Me.tbDisplay.Name = "tbDisplay" Me.tbDisplay.Padding = New System.Windows.Forms.Padding(3) @@ -545,27 +428,57 @@ Partial Class sdgSimpleRegOptions Me.tbDisplay.Text = "Display" Me.tbDisplay.UseVisualStyleBackColor = True ' - 'chkDisplayCLimits + 'ucrNudDisplayCLevel + ' + Me.ucrNudDisplayCLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDisplayCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDisplayCLevel.Location = New System.Drawing.Point(147, 109) + Me.ucrNudDisplayCLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDisplayCLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDisplayCLevel.Name = "ucrNudDisplayCLevel" + Me.ucrNudDisplayCLevel.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDisplayCLevel.TabIndex = 12 + Me.ucrNudDisplayCLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkPvalues + ' + Me.ucrChkPvalues.Checked = False + Me.ucrChkPvalues.Location = New System.Drawing.Point(142, 45) + Me.ucrChkPvalues.Name = "ucrChkPvalues" + Me.ucrChkPvalues.Size = New System.Drawing.Size(113, 20) + Me.ucrChkPvalues.TabIndex = 11 + ' + 'ucrChkEstimates + ' + Me.ucrChkEstimates.Checked = False + Me.ucrChkEstimates.Location = New System.Drawing.Point(10, 65) + Me.ucrChkEstimates.Name = "ucrChkEstimates" + Me.ucrChkEstimates.Size = New System.Drawing.Size(113, 20) + Me.ucrChkEstimates.TabIndex = 10 + ' + 'ucrChkDisplayCLimits + ' + Me.ucrChkDisplayCLimits.Checked = False + Me.ucrChkDisplayCLimits.Location = New System.Drawing.Point(10, 88) + Me.ucrChkDisplayCLimits.Name = "ucrChkDisplayCLimits" + Me.ucrChkDisplayCLimits.Size = New System.Drawing.Size(113, 20) + Me.ucrChkDisplayCLimits.TabIndex = 9 ' - Me.chkDisplayCLimits.AutoSize = True - Me.chkDisplayCLimits.Location = New System.Drawing.Point(10, 91) - Me.chkDisplayCLimits.Name = "chkDisplayCLimits" - Me.chkDisplayCLimits.Size = New System.Drawing.Size(109, 17) - Me.chkDisplayCLimits.TabIndex = 4 - Me.chkDisplayCLimits.Tag = "Confidence_Limits" - Me.chkDisplayCLimits.Text = "Confidence Limits" - Me.chkDisplayCLimits.UseVisualStyleBackColor = True + 'ucrChkANOVA ' - 'nudDisplayCLevel + Me.ucrChkANOVA.Checked = False + Me.ucrChkANOVA.Location = New System.Drawing.Point(10, 38) + Me.ucrChkANOVA.Name = "ucrChkANOVA" + Me.ucrChkANOVA.Size = New System.Drawing.Size(113, 20) + Me.ucrChkANOVA.TabIndex = 8 ' - Me.nudDisplayCLevel.DecimalPlaces = 2 - Me.nudDisplayCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 131072}) - Me.nudDisplayCLevel.Location = New System.Drawing.Point(147, 108) - Me.nudDisplayCLevel.Maximum = New Decimal(New Integer() {1, 0, 0, 0}) - Me.nudDisplayCLevel.Name = "nudDisplayCLevel" - Me.nudDisplayCLevel.Size = New System.Drawing.Size(45, 20) - Me.nudDisplayCLevel.TabIndex = 6 - Me.nudDisplayCLevel.Value = New Decimal(New Integer() {95, 0, 0, 131072}) + 'ucrChkModel + ' + Me.ucrChkModel.Checked = False + Me.ucrChkModel.Location = New System.Drawing.Point(10, 15) + Me.ucrChkModel.Name = "ucrChkModel" + Me.ucrChkModel.Size = New System.Drawing.Size(113, 20) + Me.ucrChkModel.TabIndex = 7 ' 'lblDisplayCLevel ' @@ -577,50 +490,6 @@ Partial Class sdgSimpleRegOptions Me.lblDisplayCLevel.Tag = "Confidence_Level:" Me.lblDisplayCLevel.Text = "Confidence Level:" ' - 'chkEstimates - ' - Me.chkEstimates.AutoSize = True - Me.chkEstimates.Location = New System.Drawing.Point(10, 66) - Me.chkEstimates.Name = "chkEstimates" - Me.chkEstimates.Size = New System.Drawing.Size(71, 17) - Me.chkEstimates.TabIndex = 3 - Me.chkEstimates.Tag = "Estimates" - Me.chkEstimates.Text = "Estimates" - Me.chkEstimates.UseVisualStyleBackColor = True - ' - 'chkPvalues - ' - Me.chkPvalues.AutoSize = True - Me.chkPvalues.Location = New System.Drawing.Point(125, 41) - Me.chkPvalues.Name = "chkPvalues" - Me.chkPvalues.Size = New System.Drawing.Size(67, 17) - Me.chkPvalues.TabIndex = 2 - Me.chkPvalues.Tag = "P_values" - Me.chkPvalues.Text = "P-values" - Me.chkPvalues.UseVisualStyleBackColor = True - ' - 'chkANOVA - ' - Me.chkANOVA.AutoSize = True - Me.chkANOVA.Location = New System.Drawing.Point(10, 41) - Me.chkANOVA.Name = "chkANOVA" - Me.chkANOVA.Size = New System.Drawing.Size(63, 17) - Me.chkANOVA.TabIndex = 1 - Me.chkANOVA.Tag = "ANOVA" - Me.chkANOVA.Text = "ANOVA" - Me.chkANOVA.UseVisualStyleBackColor = True - ' - 'chkModel - ' - Me.chkModel.AutoSize = True - Me.chkModel.Location = New System.Drawing.Point(10, 16) - Me.chkModel.Name = "chkModel" - Me.chkModel.Size = New System.Drawing.Size(55, 17) - Me.chkModel.TabIndex = 0 - Me.chkModel.Tag = "Model" - Me.chkModel.Text = "Model" - Me.chkModel.UseVisualStyleBackColor = True - ' 'tbRegOptions ' Me.tbRegOptions.Controls.Add(Me.tbDisplay) @@ -634,14 +503,14 @@ Partial Class sdgSimpleRegOptions ' 'tbSave ' + Me.tbSave.Controls.Add(Me.ucrChkLeverage) + Me.tbSave.Controls.Add(Me.ucrChkStdResiduals) + Me.tbSave.Controls.Add(Me.ucrChkResiduals) + Me.tbSave.Controls.Add(Me.ucrChkFittedValues) Me.tbSave.Controls.Add(Me.ucrLeverageColumnName) Me.tbSave.Controls.Add(Me.ucrStdResidualsColumnName) Me.tbSave.Controls.Add(Me.ucrResidualsColumnName) Me.tbSave.Controls.Add(Me.ucrFittedColumnName) - Me.tbSave.Controls.Add(Me.chkFittedValues) - Me.tbSave.Controls.Add(Me.chkResiduals) - Me.tbSave.Controls.Add(Me.chkStdResiduals) - Me.tbSave.Controls.Add(Me.chkLeverage) Me.tbSave.Location = New System.Drawing.Point(4, 22) Me.tbSave.Name = "tbSave" Me.tbSave.Padding = New System.Windows.Forms.Padding(3) @@ -651,82 +520,74 @@ Partial Class sdgSimpleRegOptions Me.tbSave.Text = "Save" Me.tbSave.UseVisualStyleBackColor = True ' + 'ucrChkLeverage + ' + Me.ucrChkLeverage.Checked = False + Me.ucrChkLeverage.Location = New System.Drawing.Point(6, 91) + Me.ucrChkLeverage.Name = "ucrChkLeverage" + Me.ucrChkLeverage.Size = New System.Drawing.Size(113, 20) + Me.ucrChkLeverage.TabIndex = 23 + ' + 'ucrChkStdResiduals + ' + Me.ucrChkStdResiduals.Checked = False + Me.ucrChkStdResiduals.Location = New System.Drawing.Point(6, 65) + Me.ucrChkStdResiduals.Name = "ucrChkStdResiduals" + Me.ucrChkStdResiduals.Size = New System.Drawing.Size(113, 20) + Me.ucrChkStdResiduals.TabIndex = 22 + ' + 'ucrChkResiduals + ' + Me.ucrChkResiduals.Checked = False + Me.ucrChkResiduals.Location = New System.Drawing.Point(6, 39) + Me.ucrChkResiduals.Name = "ucrChkResiduals" + Me.ucrChkResiduals.Size = New System.Drawing.Size(113, 20) + Me.ucrChkResiduals.TabIndex = 21 + ' + 'ucrChkFittedValues + ' + Me.ucrChkFittedValues.Checked = False + Me.ucrChkFittedValues.Location = New System.Drawing.Point(6, 13) + Me.ucrChkFittedValues.Name = "ucrChkFittedValues" + Me.ucrChkFittedValues.Size = New System.Drawing.Size(113, 20) + Me.ucrChkFittedValues.TabIndex = 20 + ' 'ucrLeverageColumnName ' + Me.ucrLeverageColumnName.AddQuotesIfUnrecognised = True Me.ucrLeverageColumnName.IsReadOnly = False - Me.ucrLeverageColumnName.Location = New System.Drawing.Point(115, 93) + Me.ucrLeverageColumnName.Location = New System.Drawing.Point(128, 93) Me.ucrLeverageColumnName.Name = "ucrLeverageColumnName" Me.ucrLeverageColumnName.Size = New System.Drawing.Size(115, 21) Me.ucrLeverageColumnName.TabIndex = 19 ' 'ucrStdResidualsColumnName ' + Me.ucrStdResidualsColumnName.AddQuotesIfUnrecognised = True Me.ucrStdResidualsColumnName.IsReadOnly = False - Me.ucrStdResidualsColumnName.Location = New System.Drawing.Point(115, 66) + Me.ucrStdResidualsColumnName.Location = New System.Drawing.Point(128, 66) Me.ucrStdResidualsColumnName.Name = "ucrStdResidualsColumnName" Me.ucrStdResidualsColumnName.Size = New System.Drawing.Size(115, 21) Me.ucrStdResidualsColumnName.TabIndex = 17 ' 'ucrResidualsColumnName ' + Me.ucrResidualsColumnName.AddQuotesIfUnrecognised = True Me.ucrResidualsColumnName.IsReadOnly = False - Me.ucrResidualsColumnName.Location = New System.Drawing.Point(115, 39) + Me.ucrResidualsColumnName.Location = New System.Drawing.Point(128, 39) Me.ucrResidualsColumnName.Name = "ucrResidualsColumnName" Me.ucrResidualsColumnName.Size = New System.Drawing.Size(115, 21) Me.ucrResidualsColumnName.TabIndex = 15 ' 'ucrFittedColumnName ' + Me.ucrFittedColumnName.AddQuotesIfUnrecognised = True Me.ucrFittedColumnName.IsReadOnly = False - Me.ucrFittedColumnName.Location = New System.Drawing.Point(115, 12) + Me.ucrFittedColumnName.Location = New System.Drawing.Point(128, 12) Me.ucrFittedColumnName.Name = "ucrFittedColumnName" Me.ucrFittedColumnName.Size = New System.Drawing.Size(115, 21) Me.ucrFittedColumnName.TabIndex = 13 ' - 'chkFittedValues - ' - Me.chkFittedValues.AutoSize = True - Me.chkFittedValues.Location = New System.Drawing.Point(10, 16) - Me.chkFittedValues.Name = "chkFittedValues" - Me.chkFittedValues.Size = New System.Drawing.Size(87, 17) - Me.chkFittedValues.TabIndex = 4 - Me.chkFittedValues.Tag = "Fitted_Values" - Me.chkFittedValues.Text = "Fitted Values" - Me.chkFittedValues.UseVisualStyleBackColor = True - ' - 'chkResiduals - ' - Me.chkResiduals.AutoSize = True - Me.chkResiduals.Location = New System.Drawing.Point(10, 41) - Me.chkResiduals.Name = "chkResiduals" - Me.chkResiduals.Size = New System.Drawing.Size(72, 17) - Me.chkResiduals.TabIndex = 3 - Me.chkResiduals.Tag = "Residuals" - Me.chkResiduals.Text = "Residuals" - Me.chkResiduals.UseVisualStyleBackColor = True - ' - 'chkStdResiduals - ' - Me.chkStdResiduals.AutoSize = True - Me.chkStdResiduals.Location = New System.Drawing.Point(10, 66) - Me.chkStdResiduals.Name = "chkStdResiduals" - Me.chkStdResiduals.Size = New System.Drawing.Size(91, 17) - Me.chkStdResiduals.TabIndex = 2 - Me.chkStdResiduals.Tag = "Std_Residuals" - Me.chkStdResiduals.Text = "Std Residuals" - Me.chkStdResiduals.UseVisualStyleBackColor = True - ' - 'chkLeverage - ' - Me.chkLeverage.AutoSize = True - Me.chkLeverage.Location = New System.Drawing.Point(10, 91) - Me.chkLeverage.Name = "chkLeverage" - Me.chkLeverage.Size = New System.Drawing.Size(71, 17) - Me.chkLeverage.TabIndex = 1 - Me.chkLeverage.Tag = "Leverage" - Me.chkLeverage.Text = "Leverage" - Me.chkLeverage.UseVisualStyleBackColor = True - ' 'ucrSdgButtons ' Me.ucrSdgButtons.Location = New System.Drawing.Point(94, 347) @@ -734,6 +595,144 @@ Partial Class sdgSimpleRegOptions Me.ucrSdgButtons.Size = New System.Drawing.Size(142, 30) Me.ucrSdgButtons.TabIndex = 0 ' + 'ucrChkMultiplePlots + ' + Me.ucrChkMultiplePlots.Checked = False + Me.ucrChkMultiplePlots.Location = New System.Drawing.Point(6, 7) + Me.ucrChkMultiplePlots.Name = "ucrChkMultiplePlots" + Me.ucrChkMultiplePlots.Size = New System.Drawing.Size(113, 20) + Me.ucrChkMultiplePlots.TabIndex = 22 + ' + 'ucrChkIndividualPlots + ' + Me.ucrChkIndividualPlots.Checked = False + Me.ucrChkIndividualPlots.Location = New System.Drawing.Point(6, 123) + Me.ucrChkIndividualPlots.Name = "ucrChkIndividualPlots" + Me.ucrChkIndividualPlots.Size = New System.Drawing.Size(113, 20) + Me.ucrChkIndividualPlots.TabIndex = 23 + ' + 'ucrPnlIndividualPlots + ' + Me.ucrPnlIndividualPlots.Location = New System.Drawing.Point(20, 164) + Me.ucrPnlIndividualPlots.Name = "ucrPnlIndividualPlots" + Me.ucrPnlIndividualPlots.Size = New System.Drawing.Size(268, 68) + Me.ucrPnlIndividualPlots.TabIndex = 29 + ' + 'rdoCooksDistanceLeverage + ' + Me.rdoCooksDistanceLeverage.AutoSize = True + Me.rdoCooksDistanceLeverage.Location = New System.Drawing.Point(25, 212) + Me.rdoCooksDistanceLeverage.Name = "rdoCooksDistanceLeverage" + Me.rdoCooksDistanceLeverage.Size = New System.Drawing.Size(159, 17) + Me.rdoCooksDistanceLeverage.TabIndex = 35 + Me.rdoCooksDistanceLeverage.TabStop = True + Me.rdoCooksDistanceLeverage.Tag = "Cook's_Distance_v_Leverage" + Me.rdoCooksDistanceLeverage.Text = "Cook's Distance v Leverage" + Me.rdoCooksDistanceLeverage.UseVisualStyleBackColor = True + ' + 'rdoCooksDistance + ' + Me.rdoCooksDistance.AutoSize = True + Me.rdoCooksDistance.Location = New System.Drawing.Point(189, 212) + Me.rdoCooksDistance.Name = "rdoCooksDistance" + Me.rdoCooksDistance.Size = New System.Drawing.Size(102, 17) + Me.rdoCooksDistance.TabIndex = 34 + Me.rdoCooksDistance.TabStop = True + Me.rdoCooksDistance.Tag = "Cook's_Distance" + Me.rdoCooksDistance.Text = "Cook's Distance" + Me.rdoCooksDistance.UseVisualStyleBackColor = True + ' + 'rdoResidualsLeverage + ' + Me.rdoResidualsLeverage.AutoSize = True + Me.rdoResidualsLeverage.Location = New System.Drawing.Point(25, 189) + Me.rdoResidualsLeverage.Name = "rdoResidualsLeverage" + Me.rdoResidualsLeverage.Size = New System.Drawing.Size(128, 17) + Me.rdoResidualsLeverage.TabIndex = 33 + Me.rdoResidualsLeverage.TabStop = True + Me.rdoResidualsLeverage.Tag = "Residuals_v_Leverage" + Me.rdoResidualsLeverage.Text = "Residuals v Leverage" + Me.rdoResidualsLeverage.UseVisualStyleBackColor = True + ' + 'rdoScaleLocation + ' + Me.rdoScaleLocation.AutoSize = True + Me.rdoScaleLocation.Location = New System.Drawing.Point(189, 189) + Me.rdoScaleLocation.Name = "rdoScaleLocation" + Me.rdoScaleLocation.Size = New System.Drawing.Size(96, 17) + Me.rdoScaleLocation.TabIndex = 32 + Me.rdoScaleLocation.TabStop = True + Me.rdoScaleLocation.Tag = "Scale-Location" + Me.rdoScaleLocation.Text = "Scale-Location" + Me.rdoScaleLocation.UseVisualStyleBackColor = True + ' + 'rdoQQ + ' + Me.rdoQQ.AutoSize = True + Me.rdoQQ.Location = New System.Drawing.Point(189, 166) + Me.rdoQQ.Name = "rdoQQ" + Me.rdoQQ.Size = New System.Drawing.Size(44, 17) + Me.rdoQQ.TabIndex = 31 + Me.rdoQQ.TabStop = True + Me.rdoQQ.Tag = "Q-Q" + Me.rdoQQ.Text = "Q-Q" + Me.rdoQQ.UseVisualStyleBackColor = True + ' + 'rdoResidualsFitted + ' + Me.rdoResidualsFitted.AutoSize = True + Me.rdoResidualsFitted.Location = New System.Drawing.Point(25, 166) + Me.rdoResidualsFitted.Name = "rdoResidualsFitted" + Me.rdoResidualsFitted.Size = New System.Drawing.Size(109, 17) + Me.rdoResidualsFitted.TabIndex = 30 + Me.rdoResidualsFitted.TabStop = True + Me.rdoResidualsFitted.Tag = "Residuals_v_Fitted" + Me.rdoResidualsFitted.Text = "Residuals v Fitted" + Me.rdoResidualsFitted.UseVisualStyleBackColor = True + ' + 'rdoSixPlots3Rows + ' + Me.rdoSixPlots3Rows.AutoSize = True + Me.rdoSixPlots3Rows.Location = New System.Drawing.Point(173, 18) + Me.rdoSixPlots3Rows.Name = "rdoSixPlots3Rows" + Me.rdoSixPlots3Rows.Size = New System.Drawing.Size(102, 17) + Me.rdoSixPlots3Rows.TabIndex = 43 + Me.rdoSixPlots3Rows.TabStop = True + Me.rdoSixPlots3Rows.Tag = "Six_Plots(3 rows)" + Me.rdoSixPlots3Rows.Text = "Six Plots(3 rows)" + Me.rdoSixPlots3Rows.UseVisualStyleBackColor = True + ' + 'rdoFourPlots + ' + Me.rdoFourPlots.AutoSize = True + Me.rdoFourPlots.Location = New System.Drawing.Point(9, 18) + Me.rdoFourPlots.Name = "rdoFourPlots" + Me.rdoFourPlots.Size = New System.Drawing.Size(72, 17) + Me.rdoFourPlots.TabIndex = 42 + Me.rdoFourPlots.TabStop = True + Me.rdoFourPlots.Tag = "Four_Plots" + Me.rdoFourPlots.Text = "Four Plots" + Me.rdoFourPlots.UseVisualStyleBackColor = True + ' + 'rdoSixPlots2Rows + ' + Me.rdoSixPlots2Rows.AutoSize = True + Me.rdoSixPlots2Rows.Location = New System.Drawing.Point(9, 41) + Me.rdoSixPlots2Rows.Name = "rdoSixPlots2Rows" + Me.rdoSixPlots2Rows.Size = New System.Drawing.Size(105, 17) + Me.rdoSixPlots2Rows.TabIndex = 41 + Me.rdoSixPlots2Rows.TabStop = True + Me.rdoSixPlots2Rows.Tag = "Six_Plots(2 rows)" + Me.rdoSixPlots2Rows.Text = "Six_Plots(2 rows)" + Me.rdoSixPlots2Rows.UseVisualStyleBackColor = True + ' + 'ucrPnlMutiplePlots + ' + Me.ucrPnlMutiplePlots.Location = New System.Drawing.Point(4, 12) + Me.ucrPnlMutiplePlots.Name = "ucrPnlMutiplePlots" + Me.ucrPnlMutiplePlots.Size = New System.Drawing.Size(268, 56) + Me.ucrPnlMutiplePlots.TabIndex = 40 + ' 'sdgSimpleRegOptions ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -754,71 +753,75 @@ Partial Class sdgSimpleRegOptions Me.tbModel.PerformLayout() Me.grpRugs.ResumeLayout(False) Me.grpRugs.PerformLayout() - CType(Me.nudWhiteSpace, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.nudGraphicsCLevel, System.ComponentModel.ISupportInitialize).EndInit() Me.grpScale.ResumeLayout(False) Me.grpScale.PerformLayout() Me.grpPlotType.ResumeLayout(False) Me.grpPlotType.PerformLayout() Me.tbResiduals.ResumeLayout(False) Me.tbResiduals.PerformLayout() - Me.grpIndividualPlots.ResumeLayout(False) - Me.grpIndividualPlots.PerformLayout() Me.grpMultiplePlots.ResumeLayout(False) Me.grpMultiplePlots.PerformLayout() Me.tbDisplay.ResumeLayout(False) Me.tbDisplay.PerformLayout() - CType(Me.nudDisplayCLevel, System.ComponentModel.ISupportInitialize).EndInit() Me.tbRegOptions.ResumeLayout(False) Me.tbSave.ResumeLayout(False) - Me.tbSave.PerformLayout() Me.ResumeLayout(False) End Sub Friend WithEvents ucrSdgButtons As ucrButtonsSubdialogue Friend WithEvents tbGraphics As TabPage - Friend WithEvents chkFittedModel As CheckBox Friend WithEvents nudGraphicsCLevel As NumericUpDown Friend WithEvents lblGraphicsSignLevel As Label Friend WithEvents grpMultiplePlots As GroupBox Friend WithEvents tbDisplay As TabPage - Friend WithEvents chkDisplayCLimits As CheckBox - Friend WithEvents nudDisplayCLevel As NumericUpDown Friend WithEvents lblDisplayCLevel As Label - Friend WithEvents chkEstimates As CheckBox Friend WithEvents chkPvalues As CheckBox - Friend WithEvents chkANOVA As CheckBox - Friend WithEvents chkModel As CheckBox Friend WithEvents tbRegOptions As TabControl Friend WithEvents tbSave As TabPage - Friend WithEvents chkFittedValues As CheckBox - Friend WithEvents chkResiduals As CheckBox - Friend WithEvents chkStdResiduals As CheckBox - Friend WithEvents chkLeverage As CheckBox Friend WithEvents ucrFittedColumnName As ucrInputComboBox Friend WithEvents ucrLeverageColumnName As ucrInputComboBox Friend WithEvents ucrStdResidualsColumnName As ucrInputComboBox Friend WithEvents ucrResidualsColumnName As ucrInputComboBox - Friend WithEvents rdoContrast As RadioButton - Friend WithEvents rdoConditional As RadioButton Friend WithEvents grpPlotType As GroupBox Friend WithEvents grpScale As GroupBox - Friend WithEvents rdoResponse As RadioButton - Friend WithEvents rdoLinear As RadioButton - Friend WithEvents rdo2 As RadioButton - Friend WithEvents rdo1 As RadioButton - Friend WithEvents chkRugs As CheckBox - Friend WithEvents chkJitter As CheckBox Friend WithEvents nudWhiteSpace As NumericUpDown Friend WithEvents lblWhiteSpace As Label - Friend WithEvents chkPartial As CheckBox - Friend WithEvents rdoPartial As RadioButton Friend WithEvents grpRugs As GroupBox Friend WithEvents tcGraphics As TabControl Friend WithEvents tbModel As TabPage Friend WithEvents tbResiduals As TabPage Friend WithEvents grpIndividualPlots As GroupBox + Friend WithEvents ucrChkEstimates As ucrCheck + Friend WithEvents ucrChkDisplayCLimits As ucrCheck + Friend WithEvents ucrChkANOVA As ucrCheck + Friend WithEvents ucrChkModel As ucrCheck + Friend WithEvents ucrNudDisplayCLevel As ucrNud + Friend WithEvents ucrChkPvalues As ucrCheck + Friend WithEvents ucrChkLeverage As ucrCheck + Friend WithEvents ucrChkStdResiduals As ucrCheck + Friend WithEvents ucrChkResiduals As ucrCheck + Friend WithEvents ucrChkFittedValues As ucrCheck + Friend WithEvents ucrChkRugs As ucrCheck + Friend WithEvents ucrChkJitter As ucrCheck + Friend WithEvents ucrChkPartial As ucrCheck + Friend WithEvents ucrChkConfIntervalband As ucrCheck + Friend WithEvents ucrChkFittedModel As ucrCheck + Friend WithEvents rdoResponse As RadioButton + Friend WithEvents rdoLinear As RadioButton + Friend WithEvents ucrPnlScale As UcrPanel + Friend WithEvents ucrNudWhiteSpace As ucrNud + Friend WithEvents ucrNudGraphicsCLevel As ucrNud + Friend WithEvents rdoContrast As RadioButton + Friend WithEvents rdoConditional As RadioButton + Friend WithEvents ucrPnlPlotType As UcrPanel + Friend WithEvents rdoPartial As RadioButton + Friend WithEvents rdo1 As RadioButton + Friend WithEvents rdo2 As RadioButton + Friend WithEvents ucrPnlPartial12 As UcrPanel + Friend WithEvents ucrChkIndividualPlots As ucrCheck + Friend WithEvents ucrChkMultiplePlots As ucrCheck + Friend WithEvents ucrPnlIndividualPlots As UcrPanel Friend WithEvents rdoCooksDistanceLeverage As RadioButton Friend WithEvents rdoCooksDistance As RadioButton Friend WithEvents rdoResidualsLeverage As RadioButton @@ -828,7 +831,5 @@ Partial Class sdgSimpleRegOptions Friend WithEvents rdoSixPlots3Rows As RadioButton Friend WithEvents rdoFourPlots As RadioButton Friend WithEvents rdoSixPlots2Rows As RadioButton - Friend WithEvents chkMultiplePlots As CheckBox - Friend WithEvents chkIndividualPlots As CheckBox - Friend WithEvents chkConfIntervalband As CheckBox + Friend WithEvents ucrPnlMutiplePlots As UcrPanel End Class diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index e4506b750fc..0bf89b1633d 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -17,49 +17,93 @@ Imports instat.Translations Public Class sdgSimpleRegOptions Public clsRModelFunction As RFunction Public clsRDataFrame As ucrDataFrame - Public clsRYVariable, clsRXVariable As ucrReceiverSingle + Public clsRYVariable, clsRXVariable As RFunction Public clsRGraphics As New RSyntax Public clsRaovFunction, clsRaovpvalFunction, clsRestpvalFunction, clsRResidualPlotsFunction, clsRgeom_point, clsRPredFunction, clsRDFFunction, clsRFittedValues, clsRWriteFitted, clsRResiduals, clsRWriteResiduals, clsRStdResiduals, clsRWriteStdResiduals, clsRLeverage, clsRWriteLeverage As New RFunction Public clsRggplotFunction, clsRaesFunction, clsRStat_smooth, clsRModelsFunction, clsRCIFunction, clsR_ribbon, clsRaes_ribbon As New RFunction - Public bFirstLoad As Boolean = True + Public bControlsInitialised As Boolean = False Private Sub sdgSimpleRegOptions_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) + End Sub - If bFirstLoad Then - SetDefaults() - bFirstLoad = False - End If + Private Sub InitialiseControls() + ucrChkModel.SetText("Model") + ucrChkModel.AddRSyntaxContainsFunctionNamesCondition(True, {"formula"}) + + ucrChkANOVA.SetText("ANOVA") + ucrChkANOVA.AddRSyntaxContainsFunctionNamesCondition(True, {"anova"}) + + ucrChkEstimates.SetText("Estimates") + ucrChkEstimates.AddRSyntaxContainsFunctionNamesCondition(True, {"anova"}) + + ucrChkDisplayCLimits.SetText("Confidence Limits") + ucrChkDisplayCLimits.AddRSyntaxContainsFunctionNamesCondition(True, {"confint"}) + + ucrChkPvalues.SetText("P-Values") + ucrChkPvalues.AddRSyntaxContainsFunctionNamesCondition(True, {"anova"}) + + ucrChkPvalues.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) + + ucrChkFittedValues.SetText("Fitted Values") + ucrChkResiduals.SetText("Residuals") + ucrChkStdResiduals.SetText("Std Residuals") + ucrChkLeverage.SetText("Leverage") + + ucrChkFittedValues.AddToLinkedControls(ucrFittedColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ucrChkResiduals.AddToLinkedControls(ucrResidualsColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ucrChkStdResiduals.AddToLinkedControls(ucrStdResidualsColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ucrChkLeverage.AddToLinkedControls(ucrLeverageColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + + ucrChkMultiplePlots.SetText("Multiple Plots") + ucrChkIndividualPlots.SetText("Individual Plots") + ucrChkFittedModel.SetText("Fitted Model") + ucrChkPartial.SetText("Partial") + ucrChkRugs.SetText("Rugs") + ucrChkJitter.SetText("Jitter") + ucrChkConfIntervalband.SetText("C.I band") + + bControlsInitialised = True End Sub - Public Sub SetRModelFunction(clsRModelFunc As RFunction) - clsRModelFunction = clsRModelFunc + Public Sub SetRCode(clsNewRSyntax As RSyntax, clsNewRLmOrGLM As RFunction, clsNewRModelFunction As RFunction, clsNewRXVariable As RFunction, clsNewRYVariable As RFunction, Optional bReset As Boolean = False) + If Not bControlsInitialised Then + InitialiseControls() + End If + clsRModelFunction = clsNewRModelFunction + clsRXVariable = clsNewRXVariable + clsRYVariable = clsNewRYVariable End Sub + 'Public Sub SetRModelFunction(clsRModelFunc As RFunction) + ' clsRModelFunction = clsRModelFunc + 'End Sub + Public Sub SetRDataFrame(clsRDataFr As ucrDataFrame) clsRDataFrame = clsRDataFr End Sub - Public Sub SetRYVariable(clsRYVar As ucrReceiverSingle) - clsRYVariable = clsRYVar - End Sub - Public Sub SetRXVariable(clsRXVar As ucrReceiverSingle) - clsRXVariable = clsRXVar - End Sub + 'Public Sub SetRYVariable(clsRYVar As ucrReceiverSingle) + ' clsRYVariable = clsRYVar + 'End Sub + 'Public Sub SetRXVariable(clsRXVar As ucrReceiverSingle) + ' clsRXVariable = clsRXVar + 'End Sub Public Sub AnovaTable() 'p-values should be false here - clsRaovFunction.SetRCommand("anova") - clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) - frmMain.clsRLink.RunScript(clsRaovFunction.ToScript(), 2) + 'clsRaovFunction.SetRCommand("anova") + 'clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) + 'frmMain.clsRLink.RunScript(clsRaovFunction.ToScript(), 2) End Sub Private Sub AnovaTablePvalues() - clsRaovpvalFunction.SetRCommand("anova") - clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) - clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) + 'clsRaovpvalFunction.SetRCommand("anova") + 'clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) + 'clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) - frmMain.clsRLink.RunScript(clsRaovpvalFunction.ToScript(), 2) + 'frmMain.clsRLink.RunScript(clsRaovpvalFunction.ToScript(), 2) End Sub Private Sub Estimates() @@ -74,9 +118,9 @@ Public Class sdgSimpleRegOptions End Sub Private Sub Model() - clsRModelsFunction.SetRCommand("formula") - clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) - frmMain.clsRLink.RunScript(clsRModelsFunction.ToScript(), 2) + ' clsRModelsFunction.SetRCommand("formula") + ' clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) + 'frmMain.clsRLink.RunScript(clsRModelsFunction.ToScript(), 2) End Sub Public Sub ResidualPlots() @@ -101,24 +145,24 @@ Public Class sdgSimpleRegOptions ElseIf rdoResponse.Checked Then clsRggplotFunction.AddParameter("scale", Chr(34) & "response" & Chr(34)) End If - If chkJitter.Checked Then + If ucrChkJitter.Checked Then clsRggplotFunction.AddParameter("jitter", "TRUE") Else clsRggplotFunction.RemoveParameterByName("jitter") End If clsRggplotFunction.AddParameter("alpha", nudGraphicsCLevel.Value) clsRggplotFunction.AddParameter("whitespace", nudWhiteSpace.Value) - If chkPartial.Checked Then + If ucrChkPartial.Checked Then clsRggplotFunction.AddParameter("partial", "TRUE") Else clsRggplotFunction.AddParameter("partial", "FALSE") End If - If chkConfIntervalband.Checked = False Then + If ucrChkConfIntervalband.Checked = False Then clsRggplotFunction.AddParameter("band", "FALSE") Else clsRggplotFunction.RemoveParameterByName("band") End If - If chkRugs.Checked Then + If ucrChkRugs.Checked Then If rdo1.Checked Then clsRggplotFunction.AddParameter("rug", 1) ElseIf rdo2.Checked Then @@ -137,46 +181,46 @@ Public Class sdgSimpleRegOptions frmMain.clsRLink.RunScript(clsRCIFunction.ToScript(), 2) End Sub - Private Sub chkPartial_CheckedChanged(sender As Object, e As EventArgs) Handles chkPartial.CheckedChanged + Private Sub chkPartial_CheckedChanged(sender As Object, e As EventArgs) FittedModel() End Sub - Private Sub chkRugs_CheckedChanged(sender As Object, e As EventArgs) Handles chkRugs.CheckedChanged - If chkRugs.Checked Then + Private Sub chkRugs_CheckedChanged(sender As Object, e As EventArgs) + If ucrChkRugs.Checked Then grpRugs.Enabled = True rdoPartial.Checked = True End If FittedModel() End Sub - Private Sub rdoPartial_CheckedChanged(sender As Object, e As EventArgs) Handles rdoPartial.CheckedChanged + Private Sub rdoPartial_CheckedChanged(sender As Object, e As EventArgs) FittedModel() End Sub - Private Sub rdo1_CheckedChanged(sender As Object, e As EventArgs) Handles rdo1.CheckedChanged + Private Sub rdo1_CheckedChanged(sender As Object, e As EventArgs) FittedModel() End Sub - Private Sub rdo2_CheckedChanged(sender As Object, e As EventArgs) Handles rdo2.CheckedChanged + Private Sub rdo2_CheckedChanged(sender As Object, e As EventArgs) FittedModel() End Sub - Private Sub rdoConditional_CheckedChanged(sender As Object, e As EventArgs) Handles rdoConditional.CheckedChanged + Private Sub rdoConditional_CheckedChanged(sender As Object, e As EventArgs) FittedModel() End Sub - Private Sub rdoContrast_CheckedChanged(sender As Object, e As EventArgs) Handles rdoContrast.CheckedChanged + Private Sub rdoContrast_CheckedChanged(sender As Object, e As EventArgs) FittedModel() End Sub - Private Sub chkMultiplePlots_CheckedChanged(sender As Object, e As EventArgs) Handles chkMultiplePlots.CheckedChanged + Private Sub chkMultiplePlots_CheckedChanged(sender As Object, e As EventArgs) GraphMultiplePlots() End Sub Private Sub GraphMultiplePlots() - If chkMultiplePlots.Checked Then - chkFittedModel.Checked = False - chkIndividualPlots.Checked = False + If ucrChkMultiplePlots.Checked Then + ucrChkFittedModel.Checked = False + ucrChkIndividualPlots.Checked = False grpMultiplePlots.Enabled = True rdoFourPlots.Checked = True Else @@ -185,9 +229,9 @@ Public Class sdgSimpleRegOptions End Sub Private Sub GraphIndividualPlots() - If chkIndividualPlots.Checked Then - chkFittedModel.Checked = False - chkMultiplePlots.Checked = False + If ucrChkIndividualPlots.Checked Then + ucrChkFittedModel.Checked = False + ucrChkMultiplePlots.Checked = False grpIndividualPlots.Enabled = True rdoResidualsFitted.Checked = True Else @@ -195,11 +239,11 @@ Public Class sdgSimpleRegOptions End If End Sub - Private Sub chkIndividualPlots_CheckedChanged(sender As Object, e As EventArgs) Handles chkIndividualPlots.CheckedChanged + Private Sub chkIndividualPlots_CheckedChanged(sender As Object, e As EventArgs) GraphIndividualPlots() End Sub - Private Sub rdoMultiplePlots(sender As Object, e As EventArgs) Handles rdoFourPlots.CheckedChanged, rdoSixPlots3Rows.CheckedChanged, rdoSixPlots2Rows.CheckedChanged + Private Sub rdoMultiplePlots(sender As Object, e As EventArgs) ResidualPlots() If rdoFourPlots.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 2) @@ -221,64 +265,64 @@ Public Class sdgSimpleRegOptions End If End Sub - Private Sub rdoQQ_CheckedChanged(sender As Object, e As EventArgs) Handles rdoQQ.CheckedChanged + Private Sub rdoQQ_CheckedChanged(sender As Object, e As EventArgs) clsRResidualPlotsFunction.RemoveParameterByName("ncol") clsRResidualPlotsFunction.AddParameter("which", 2) clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) End Sub - Private Sub rdoResidualsFitted_CheckedChanged(sender As Object, e As EventArgs) Handles rdoResidualsFitted.CheckedChanged + Private Sub rdoResidualsFitted_CheckedChanged(sender As Object, e As EventArgs) clsRResidualPlotsFunction.RemoveParameterByName("ncol") clsRResidualPlotsFunction.AddParameter("which", 1) clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) End Sub - Private Sub rdoResidualsLeverage_CheckedChanged(sender As Object, e As EventArgs) Handles rdoResidualsLeverage.CheckedChanged + Private Sub rdoResidualsLeverage_CheckedChanged(sender As Object, e As EventArgs) clsRResidualPlotsFunction.RemoveParameterByName("ncol") clsRResidualPlotsFunction.AddParameter("which", 5) clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) End Sub - Private Sub rdoCooksDistanceLeverage_CheckedChanged(sender As Object, e As EventArgs) Handles rdoCooksDistanceLeverage.CheckedChanged + Private Sub rdoCooksDistanceLeverage_CheckedChanged(sender As Object, e As EventArgs) clsRResidualPlotsFunction.RemoveParameterByName("ncol") clsRResidualPlotsFunction.AddParameter("which", 6) clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) End Sub - Private Sub rdoCooksDistance_CheckedChanged(sender As Object, e As EventArgs) Handles rdoCooksDistance.CheckedChanged + Private Sub rdoCooksDistance_CheckedChanged(sender As Object, e As EventArgs) clsRResidualPlotsFunction.RemoveParameterByName("ncol") clsRResidualPlotsFunction.AddParameter("which", 4) clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) End Sub - Private Sub rdoScaleLocation_CheckedChanged(sender As Object, e As EventArgs) Handles rdoScaleLocation.CheckedChanged + Private Sub rdoScaleLocation_CheckedChanged(sender As Object, e As EventArgs) clsRResidualPlotsFunction.RemoveParameterByName("ncol") clsRResidualPlotsFunction.AddParameter("which", 3) clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) End Sub - Private Sub FittedModel_CheckedChanged(sender As Object, e As EventArgs) Handles chkConfIntervalband.CheckedChanged, chkJitter.CheckedChanged, chkPartial.CheckedChanged, rdoLinear.CheckedChanged, rdoResponse.CheckedChanged, rdoContrast.CheckedChanged, rdoConditional.CheckedChanged, nudWhiteSpace.ValueChanged, nudGraphicsCLevel.ValueChanged, rdoPartial.CheckedChanged, rdo1.CheckedChanged, rdo2.CheckedChanged + Private Sub FittedModel_CheckedChanged(sender As Object, e As EventArgs) Handles rdoContrast.CheckedChanged, rdoConditional.CheckedChanged, rdoPartial.CheckedChanged, rdo1.CheckedChanged, rdo2.CheckedChanged FittedModel() End Sub - Private Sub CheckRugs_CheckedChanged(sender As Object, e As EventArgs) Handles chkRugs.CheckedChanged + Private Sub CheckRugs_CheckedChanged(sender As Object, e As EventArgs) GraphFittedModel() End Sub Private Sub DisplayTabDefaults() - chkANOVA.Checked = True - chkModel.Checked = True - chkEstimates.Checked = True - chkPvalues.Enabled = True - chkPvalues.Checked = True - chkDisplayCLimits.Checked = False - lblDisplayCLevel.Enabled = False - nudDisplayCLevel.Enabled = False + 'chkANOVA.Checked = True + 'chkModel.Checked = True + 'chkEstimates.Checked = True + 'chkPvalues.Enabled = True + 'chkPvalues.Checked = True + 'chkDisplayCLimits.Checked = False + 'lblDisplayCLevel.Enabled = False + 'nudDisplayCLevel.Enabled = False End Sub Private Sub SaveTab() @@ -306,10 +350,10 @@ Public Class sdgSimpleRegOptions ucrResidualsColumnName.Enabled = False ucrStdResidualsColumnName.Enabled = False ucrLeverageColumnName.Enabled = False - chkFittedValues.Checked = False - chkLeverage.Checked = False - chkStdResiduals.Checked = False - chkResiduals.Checked = False + ucrChkFittedValues.Checked = False + ucrChkLeverage.Checked = False + ucrChkStdResiduals.Checked = False + ucrChkResiduals.Checked = False End Sub Private Sub GraphsTabDefaults() @@ -322,82 +366,82 @@ Public Class sdgSimpleRegOptions DisplayTabDefaults() SaveTab() GraphsTabDefaults() - chkFittedModel.Checked = False - chkMultiplePlots.Checked = False - chkIndividualPlots.Checked = False + ucrChkFittedModel.Checked = False + ucrChkMultiplePlots.Checked = False + ucrChkIndividualPlots.Checked = False End Sub Private Sub pvalues() - If (chkANOVA.Checked Or chkEstimates.Checked) Then + If (ucrChkANOVA.Checked Or ucrChkEstimates.Checked) Then chkPvalues.Enabled = True Else chkPvalues.Enabled = False End If End Sub - Private Sub chkanovatable_checkedchanged(sender As Object, e As EventArgs) Handles chkANOVA.CheckedChanged + Private Sub chkanovatable_checkedchanged(sender As Object, e As EventArgs) pvalues() End Sub - Private Sub chkestimates_checkedchanged(sender As Object, e As EventArgs) Handles chkEstimates.CheckedChanged + Private Sub chkestimates_checkedchanged(sender As Object, e As EventArgs) pvalues() End Sub Private Sub GraphFittedModel() - If (chkFittedModel.Checked) Then + If (ucrChkFittedModel.Checked) Then grpPlotType.Enabled = True grpScale.Enabled = True - nudDisplayCLevel.Enabled = True + ucrNudDisplayCLevel.Enabled = True nudWhiteSpace.Enabled = True - chkPartial.Enabled = True - chkRugs.Enabled = True - chkJitter.Enabled = True - chkConfIntervalband.Enabled = True - chkIndividualPlots.Checked = False - chkMultiplePlots.Checked = False + ucrChkPartial.Enabled = True + ucrChkRugs.Enabled = True + ucrChkJitter.Enabled = True + ucrChkConfIntervalband.Enabled = True + ucrChkIndividualPlots.Checked = False + ucrChkMultiplePlots.Checked = False Else grpPlotType.Enabled = False grpScale.Enabled = False - nudDisplayCLevel.Enabled = False + ucrNudDisplayCLevel.Enabled = False nudWhiteSpace.Enabled = False - chkPartial.Enabled = False - chkRugs.Enabled = False - chkJitter.Enabled = False - chkConfIntervalband.Enabled = False + ucrChkPartial.Enabled = False + ucrChkRugs.Enabled = False + ucrChkJitter.Enabled = False + ucrChkConfIntervalband.Enabled = False End If rdoConditional.Checked = True rdoLinear.Checked = True - nudDisplayCLevel.Value = 0.05 + ucrNudDisplayCLevel.Value = 0.05 nudWhiteSpace.Value = 0.2 rdoPartial.Checked = True - If chkRugs.Checked = True Then + If ucrChkRugs.Checked = True Then grpRugs.Enabled = True Else grpRugs.Enabled = False End If - If (chkDisplayCLimits.Checked) Then + If (ucrChkDisplayCLimits.Checked) Then lblDisplayCLevel.Enabled = True - nudDisplayCLevel.Enabled = True + ucrNudDisplayCLevel.Enabled = True Else lblDisplayCLevel.Enabled = False - nudDisplayCLevel.Enabled = False + ucrNudDisplayCLevel.Enabled = False End If End Sub - Private Sub chkFittedModel_CheckedChanged(sender As Object, e As EventArgs) Handles chkFittedModel.CheckedChanged + Private Sub chkFittedModel_CheckedChanged(sender As Object, e As EventArgs) GraphFittedModel() End Sub - Private Sub chkDisplayCLimits_CheckedChanged(sender As Object, e As EventArgs) Handles chkDisplayCLimits.CheckedChanged + Private Sub chkDisplayCLimits_CheckedChanged(sender As Object, e As EventArgs) GraphFittedModel() DisplayConfidence() End Sub Private Sub DisplayConfidence() - If (chkDisplayCLimits.Checked = True) Then - clsRCIFunction.AddParameter("level", nudDisplayCLevel.Value) - ElseIf (chkDisplayCLimits.Checked = False) Then + If (ucrChkDisplayCLimits.Checked = True) Then + clsRCIFunction.AddParameter("level", ucrNudDisplayCLevel.Value) + ElseIf (ucrChkDisplayCLimits.Checked = False) Then clsRCIFunction.AddParameter("level", "") Else clsRCIFunction.RemoveParameterByName("level") @@ -405,45 +449,45 @@ Public Class sdgSimpleRegOptions End Sub Public Sub RegOptions() - If (chkANOVA.Checked) Then + If (ucrChkANOVA.Checked) Then If (chkPvalues.Checked) Then AnovaTablePvalues() Else AnovaTable() End If End If - If (chkEstimates.Checked) Then + If (ucrChkEstimates.Checked) Then If (chkPvalues.Checked) Then EstimatesPvalues() Else Estimates() End If End If - If (chkModel.Checked) Then + If (ucrChkModel.Checked) Then Model() End If - If (chkDisplayCLimits.Checked) Then + If (ucrChkDisplayCLimits.Checked) Then ConfidenceInterval() End If If (rdoFourPlots.Checked Or rdoSixPlots2Rows.Checked Or rdoSixPlots3Rows.Checked Or rdoResidualsFitted.Checked Or rdoQQ.Checked Or rdoResidualsLeverage.Checked Or rdoScaleLocation.Checked Or rdoCooksDistance.Checked Or rdoCooksDistanceLeverage.Checked) Then frmMain.clsRLink.RunScript(clsRGraphics.GetScript, 3) End If - If (chkFittedModel.Checked) Then + If (ucrChkFittedModel.Checked) Then frmMain.clsRLink.RunScript(clsRggplotFunction.ToScript(), 3) End If - If chkFittedValues.Checked Then + If ucrChkFittedValues.Checked Then FittedValues() frmMain.clsRLink.RunScript(clsRWriteFitted.ToScript(), 3) End If - If chkResiduals.Checked Then + If ucrChkResiduals.Checked Then Residuals() frmMain.clsRLink.RunScript(clsRWriteResiduals.ToScript(), 3) End If - If chkStdResiduals.Checked Then + If ucrChkStdResiduals.Checked Then StdResiduals() frmMain.clsRLink.RunScript(clsRWriteStdResiduals.ToScript(), 3) End If - If chkLeverage.Checked Then + If ucrChkLeverage.Checked Then Leverage() frmMain.clsRLink.RunScript(clsRWriteLeverage.ToScript(), 3) End If @@ -501,32 +545,32 @@ Public Class sdgSimpleRegOptions clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) End Sub - Private Sub chkLeverage_CheckedChanged(sender As Object, e As EventArgs) Handles chkLeverage.CheckedChanged - If chkLeverage.Checked Then + Private Sub chkLeverage_CheckedChanged(sender As Object, e As EventArgs) + If ucrChkLeverage.Checked Then ucrLeverageColumnName.Enabled = True Else ucrLeverageColumnName.Enabled = False End If End Sub - Private Sub chkResiduals_CheckedChanged(sender As Object, e As EventArgs) Handles chkResiduals.CheckedChanged - If chkResiduals.Checked Then + Private Sub chkResiduals_CheckedChanged(sender As Object, e As EventArgs) + If ucrChkResiduals.Checked Then ucrResidualsColumnName.Enabled = True Else ucrResidualsColumnName.Enabled = False End If End Sub - Private Sub chkStdResiduals_CheckedChanged(sender As Object, e As EventArgs) Handles chkStdResiduals.CheckedChanged - If chkStdResiduals.Checked Then + Private Sub chkStdResiduals_CheckedChanged(sender As Object, e As EventArgs) + If ucrChkStdResiduals.Checked Then ucrStdResidualsColumnName.Enabled = True Else ucrStdResidualsColumnName.Enabled = False End If End Sub - Private Sub chkFittedValues_CheckedChanged(sender As Object, e As EventArgs) Handles chkFittedValues.CheckedChanged - If chkFittedValues.Checked Then + Private Sub chkFittedValues_CheckedChanged(sender As Object, e As EventArgs) + If ucrChkFittedValues.Checked Then ucrFittedColumnName.Enabled = True Else ucrFittedColumnName.Enabled = False From 7ee747a3ee8bf85c010e5bd3cce6aa0f146a9869 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Tue, 20 Jun 2017 22:21:45 +0100 Subject: [PATCH 117/201] corrected control set up for import dialog --- instat/clsRecentFiles.vb | 2 +- instat/dlgImportDataset.vb | 112 ++++++++++++++++++++----------------- 2 files changed, 63 insertions(+), 51 deletions(-) diff --git a/instat/clsRecentFiles.vb b/instat/clsRecentFiles.vb index 6ad1b96db76..b550ff44cf0 100644 --- a/instat/clsRecentFiles.vb +++ b/instat/clsRecentFiles.vb @@ -150,7 +150,7 @@ Public Class clsRecentFiles 'dlgImportDataset.SetFilePath(DirectCast(sender, ToolStripItem).Tag.ToString().Substring(4)) 'dlgImportDataset.SetDataName(Path.GetFileNameWithoutExtension(sender.ToString)) 'Not working as I would like because of the changes made to the Import Dataset - dlgImportDataset.strFilePathToUseOnLoad = DirectCast(sender, ToolStripItem).Tag.ToString().Substring(4) + dlgImportDataset.strFileToOpenOn = DirectCast(sender, ToolStripItem).Tag.ToString().Substring(4) dlgImportDataset.ShowDialog() Else iResult = MessageBox.Show(frmMain, "Error: File not accessible. It may have been renamed, moved or deleted." & Environment.NewLine & Environment.NewLine & "Would you like to remove this file from the list?", "Error accessing file", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 580b8ca7d0c..c97d5fcae81 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -22,6 +22,7 @@ Imports instat Public Class dlgImportDataset Private clsImportCSV, clsImportDAT, clsImportRDS, clsReadRDS, clsImportExcel, clsImport As RFunction + Private clsGetExcelSheetNames As RFunction Private bFirstLoad As Boolean Public bFromLibrary As Boolean Private strLibraryPath As String @@ -30,8 +31,10 @@ Public Class dlgImportDataset Private bReset As Boolean = True Private bComponentsInitialised As Boolean Public bStartOpenDialog As Boolean - Public strFilePathToUseOnLoad As String + Public strFilePathSystem As String + Public strFilePathR As String Public strCurrentDirectory As String + Public strFileToOpenOn As String Public Sub New() @@ -45,8 +48,9 @@ Public Class dlgImportDataset bCanImport = True bComponentsInitialised = True bStartOpenDialog = True - strFilePathToUseOnLoad = "" + strFilePathSystem = "" strCurrentDirectory = "" + strFileToOpenOn = "" End Sub Private Sub dlgImportDataset_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -57,14 +61,15 @@ Public Class dlgImportDataset SetDefaults() bFirstLoad = False End If - If strFilePathToUseOnLoad <> "" Then - SetControlsFromFile(strFilePathToUseOnLoad) + SetRCodeForControls(bReset) + If strFileToOpenOn <> "" Then + SetControlsFromFile(strFileToOpenOn) bStartOpenDialog = False + strFileToOpenOn = "" ElseIf bStartOpenDialog Then GetFileFromOpenDialog() bStartOpenDialog = False End If - SetRCodeForControls(bReset) bReset = False TestOkEnabled() End Sub @@ -80,7 +85,7 @@ Public Class dlgImportDataset 'Removes the Sheet Tab control grdDataPreview.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, False) grdDataPreview.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_AutoFormatCell, False) - + txtTextFilePreview.ReadOnly = True '############################################################## 'General Controls @@ -100,7 +105,7 @@ Public Class dlgImportDataset 'RDS Controls ucrChkImportChangesLogRDS.SetText("Import Changes log") - ucrChkImportChangesLogRDS.SetParameter(New RParameter("include_logs"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="") + ucrChkImportChangesLogRDS.SetParameter(New RParameter("include_logs"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") ucrChkImportChangesLogRDS.SetRDefault("TRUE") 'ucrChkImportChangesLog.AddParameterPresentCondition(True, frmMain.clsRLink.strInstatDataObject & "$import_RDS") 'ucrChkImportChangesLog.AddFunctionNamesCondition(False, frmMain.clsRLink.strInstatDataObject & "$import_RDS", False) @@ -239,6 +244,7 @@ Public Class dlgImportDataset clsImport = New RFunction clsReadRDS = New RFunction clsImportDAT = New RFunction + clsGetExcelSheetNames = New RFunction clsImportExcel.SetPackageName("rio") clsImportExcel.SetRCommand("import") @@ -259,6 +265,9 @@ Public Class dlgImportDataset clsReadRDS.SetRCommand("readRDS") clsReadRDS.SetAssignTo("new_RDS") + clsGetExcelSheetNames.SetPackageName("readxl") + clsGetExcelSheetNames.SetRCommand("excel_sheets") + clsImportRDS.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_RDS") grpCSV.Hide() @@ -340,11 +349,26 @@ Public Class dlgImportDataset End Sub Public Sub SetRCodeForControls(bReset As Boolean) - ucrInputSeparatorCSV.SetRCode(clsImportCSV, bReset) + ucrInputFilePath.AddAdditionalCodeParameterPair(clsImportCSV, New RParameter("file", 0), iAdditionalPairNo:=1) + ucrInputFilePath.AddAdditionalCodeParameterPair(clsImportDAT, New RParameter("file", 0), iAdditionalPairNo:=2) + ucrInputFilePath.AddAdditionalCodeParameterPair(clsImportExcel, New RParameter("file", 0), iAdditionalPairNo:=3) + ucrInputFilePath.AddAdditionalCodeParameterPair(clsReadRDS, New RParameter("file", 0), iAdditionalPairNo:=4) + ucrInputFilePath.AddAdditionalCodeParameterPair(clsGetExcelSheetNames, New RParameter("path", 0), iAdditionalPairNo:=5) + ucrInputFilePath.SetRCode(clsImport, bReset) + + ucrSaveFile.AddAdditionalRCode(clsImportCSV, iAdditionalPairNo:=1) + ucrSaveFile.AddAdditionalRCode(clsImportDAT, iAdditionalPairNo:=2) + ucrSaveFile.AddAdditionalRCode(clsImportExcel, iAdditionalPairNo:=3) + ucrSaveFile.SetRCode(clsImport, bReset) + + 'ucrInputSeparatorCSV.SetRCode(clsImportCSV, bReset) + 'ucrPnlRowNamesCSV.SetRCode(clsImportCSV, bReset) ucrInputHeadersCSV.SetRCode(clsImportCSV, bReset) ucrInputDecimalCSV.SetRCode(clsImportCSV, bReset) ucrInputEncodingCSV.SetRCode(clsImportCSV, bReset) - ucrPnlRowNamesCSV.SetRCode(clsImportCSV, bReset) + ucrChkStringsAsFactorsCSV.SetRCode(clsImportCSV, bReset) + ucrInputNAStringsCSV.SetRCode(clsImportCSV, bReset) + ucrChkImportChangesLogRDS.SetRCode(clsImportRDS, bReset) ucrChkKeepExistingDataRDS.SetRCode(clsImportRDS, bReset) ucrChkImportMetadataRDS.SetRCode(clsImportRDS, bReset) @@ -359,8 +383,6 @@ Public Class dlgImportDataset ucrInputSelectSheetExcel.SetRCode(clsImportExcel, bReset) ucrInputMissingValueStringExcel.SetRCode(clsImportExcel, bReset) ucrChkTrimWSExcel.SetRCode(clsImportExcel, bReset) - ucrChkStringsAsFactorsCSV.SetRCode(clsImportCSV, bReset) - ucrInputNAStringsCSV.SetRCode(clsImportCSV, bReset) End Sub Private Sub TextPreviewVisible(bVisible As Boolean) @@ -373,16 +395,21 @@ Public Class dlgImportDataset lblDataFrame.Visible = bVisible End Sub + Private Sub LinesToPreviewVisible(bVisible As Boolean) + lblLinesToPreview.Visible = bVisible + ucrNudPreviewLines.Visible = bVisible + End Sub + Public Sub SetControlsFromFile(strFilePath As String) Dim strFileExt As String Dim strFileName As String - Dim strFilePathForR As String strFileName = Path.GetFileNameWithoutExtension(strFilePath) strFileExt = Path.GetExtension(strFilePath).ToLower() - strFilePathForR = Replace(strFilePath, "\", "/") + strFilePathSystem = strFilePath + strFilePathR = Replace(strFilePath, "\", "/") - ucrInputFilePath.SetName(strFilePathForR) + ucrInputFilePath.SetName(strFilePathR) ucrSaveFile.Show() grpRDS.Hide() @@ -393,7 +420,6 @@ Public Class dlgImportDataset 'need to be able to detect RDS as data.frame/Instat Object If strFileExt = ".rds" Then strFileType = "RDS" - clsReadRDS.AddParameter("file", Chr(34) & strFilePathForR & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportRDS) clsImportRDS.AddParameter("data_RDS", clsRFunctionParameter:=clsReadRDS) grpRDS.Show() @@ -401,23 +427,17 @@ Public Class dlgImportDataset ElseIf strFileExt = ".csv" Then strFileType = "CSV" ucrBase.clsRsyntax.SetBaseRFunction(clsImportCSV) - clsImportCSV.AddParameter("file", Chr(34) & strFilePathForR & Chr(34)) - ucrSaveFile.SetName(strFileName, bSilent:=True) TextPreviewVisible(True) grpCSV.Show() ElseIf strFileExt = ".dat" Then - clsImportDAT.AddParameter("file", Chr(34) & strFilePathForR & Chr(34)) + clsImportDAT.AddParameter("file", Chr(34) & strFilePathR & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportDAT) - ucrSaveFile.SetName(strFileName, bSilent:=True) ElseIf strFileExt = ".xlsx" OrElse strFileExt = ".xls" Then - clsImportExcel.AddParameter("file", Chr(34) & strFilePathForR & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportExcel) grpExcel.Show() FillExcelSheets(strFilePath) - ucrSaveFile.SetName(strFileName, bSilent:=True) Else strFileType = strFileExt.Substring(1).ToUpper() - clsImport.AddParameter("file", Chr(34) & strFilePath & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImport) End If If strFileType <> "RDS" Then @@ -433,10 +453,10 @@ Public Class dlgImportDataset Public Sub RefreshFilePreview() Dim sReader As StreamReader - If strFileType = "CSV" AndAlso ucrInputFilePath.GetText() <> "" Then + If strFileType = "CSV" AndAlso strFilePathSystem <> "" Then TextPreviewVisible(True) Try - sReader = New StreamReader(ucrInputFilePath.GetText()) + sReader = New StreamReader(strFilePathSystem) txtTextFilePreview.Text = "" For i = 1 To ucrNudPreviewLines.Value + ucrNudLinesToSkipCSV.Value + 1 txtTextFilePreview.Text = txtTextFilePreview.Text & sReader.ReadLine() & Environment.NewLine @@ -444,8 +464,9 @@ Public Class dlgImportDataset Exit For End If Next + txtTextFilePreview.SelectedText = "" Catch ex As Exception - txtTextFilePreview.Text = "Cannot show text preview of file:" & ucrInputFilePath.GetText() & ". The file may be in use by another program. Close the file and select it again from the dialog to refresh the preview." + txtTextFilePreview.Text = "Cannot show text preview of file:" & strFilePathSystem & ". The file may be in use by another program. Close the file and select it again from the dialog to refresh the preview." bCanImport = False End Try Else @@ -476,6 +497,7 @@ Public Class dlgImportDataset clsTempImport = clsImportExcel.Clone() clsTempImport.AddParameter("n_max", ucrNudPreviewLines.Value) End If + clsTempImport.RemoveAssignTo() clsAsCharacterFunc.AddParameter("data", clsRFunctionParameter:=clsTempImport) expTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsAsCharacterFunc.ToScript(), bSilent:=True) If expTemp IsNot Nothing Then @@ -494,6 +516,7 @@ Public Class dlgImportDataset End If If bValid Then GridPreviewVisible(True) + LinesToPreviewVisible(True) Else lblCannotImport.Show() bCanImport = False @@ -503,6 +526,7 @@ Public Class dlgImportDataset lblCannotImport.Hide() lblNoPreview.Show() GridPreviewVisible(False) + LinesToPreviewVisible(False) End If Cursor = Cursors.Default TestOkEnabled() @@ -514,31 +538,19 @@ Public Class dlgImportDataset Private Sub FillExcelSheets(strFilePath As String) Dim i As Integer + Dim expSheet As SymbolicExpression Dim chrSheets As CharacterVector - 'Dim chrRegions As CharacterVector - Dim clsGetSheetNames As New RFunction - 'Dim clsGetNamedRegions As New RFunction - - clsGetSheetNames.SetPackageName("readxl") - clsGetSheetNames.SetRCommand("excel_sheets") - clsGetSheetNames.AddParameter("path", Chr(34) & ucrInputFilePath.GetText() & Chr(34)) - 'not needed now since not using openxlsx - ' temporary solutions until issue with getNamedRegions is resolved - ' https://github.com/awalker89/openxlsx/issues/174 - 'clsGetNamedRegions.SetPackageName("openxlsx") - 'clsGetNamedRegions.SetRCommand("getNamedRegions") - 'clsGetNamedRegions.SetRCommand("regmatches") - 'clsGetNamedRegions.AddParameter("xlsxFile", strTempWorkbookName) - 'clsGetNamedRegions.AddParameter("x", strTempWorkbookName & "$workbook$definedNames") - 'clsGetNamedRegions.AddParameter("m", "regexpr('(?<=name=" & Chr(34) & ")[^" & Chr(34) & "]+', " & strTempWorkbookName & "$workbook$definedNames" & ", perl = TRUE)") - chrSheets = frmMain.clsRLink.RunInternalScriptGetValue(clsGetSheetNames.ToScript()).AsCharacter - 'chrRegions = frmMain.clsRLink.RunInternalScriptGetValue(clsGetNamedRegions.ToScript()).AsCharacter - - ucrInputSelectSheetExcel.cboInput.Items.Clear() + + expSheet = frmMain.clsRLink.RunInternalScriptGetValue(clsGetExcelSheetNames.ToScript()) + If expSheet IsNot Nothing Then + chrSheets = expSheet.AsCharacter + Else + chrSheets = Nothing + End If + + ucrInputSelectSheetExcel.SetItems() If chrSheets IsNot Nothing AndAlso chrSheets.Count > 0 Then - For i = 0 To chrSheets.Count - 1 - ucrInputSelectSheetExcel.cboInput.Items.Add(chrSheets(i)) - Next + ucrInputSelectSheetExcel.SetItems(chrSheets.ToArray) ucrInputSelectSheetExcel.SetName(ucrInputSelectSheetExcel.cboInput.Items(0), bSilent:=True) Else ucrInputSelectSheetExcel.SetName("") @@ -615,9 +627,9 @@ Public Class dlgImportDataset Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk ' add the item to the MRU (Most Recently Used) list... 'Disabled until implemented correctly - frmMain.clsRecentItems.addToMenu(Replace(ucrInputFilePath.GetText(), "/", "\")) + frmMain.clsRecentItems.addToMenu(strFilePathSystem) If strFileType = "RDS" Then - frmMain.strSaveFilePath = ucrInputFilePath.GetText() + frmMain.strSaveFilePath = strFilePathSystem End If End Sub End Class \ No newline at end of file From b7a0325943eba535aece6042bf12d40ad96c14c2 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 21 Jun 2017 09:16:25 +0300 Subject: [PATCH 118/201] . --- instat/dlgRegressionSimple.Designer.vb | 18 +++++++++--------- instat/dlgRegressionSimple.vb | 22 ++++++++++++++++------ 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 2b789b746f1..5084cbfed74 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -62,9 +62,9 @@ Partial Class dlgRegressionSimple Me.ucrBase = New instat.ucrButtons() Me.ucrChkConvertToVariate = New instat.ucrCheck() Me.ucrSaveModels = New instat.ucrSave() + Me.ucrPnlModelType = New instat.UcrPanel() Me.rdoTwoSample = New System.Windows.Forms.RadioButton() Me.rdoGeneralCase = New System.Windows.Forms.RadioButton() - Me.ucrPnlModelType = New instat.UcrPanel() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -147,7 +147,6 @@ Partial Class dlgRegressionSimple Me.grpParameters.Controls.Add(Me.lblLevel1) Me.grpParameters.Controls.Add(Me.rdoKruskalTest) Me.grpParameters.Controls.Add(Me.rdoWilcoxonTest) - Me.grpParameters.Controls.Add(Me.ucrpnlKruskalWilcoxonTest) Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) Me.grpParameters.Controls.Add(Me.ucrNudCI) @@ -334,6 +333,11 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") Me.ucrSaveModels.Name = "ucrSaveModels" ' + 'ucrPnlModelType + ' + resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") + Me.ucrPnlModelType.Name = "ucrPnlModelType" + ' 'rdoTwoSample ' resources.ApplyResources(Me.rdoTwoSample, "rdoTwoSample") @@ -352,24 +356,20 @@ Partial Class dlgRegressionSimple Me.rdoGeneralCase.Name = "rdoGeneralCase" Me.rdoGeneralCase.UseVisualStyleBackColor = True ' - 'ucrPnlModelType - ' - resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") - Me.ucrPnlModelType.Name = "ucrPnlModelType" - ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.Controls.Add(Me.ucrSaveModels) Me.Controls.Add(Me.rdoTwoSample) Me.Controls.Add(Me.rdoGeneralCase) + Me.Controls.Add(Me.ucrSaveModels) Me.Controls.Add(Me.ucrPnlModelType) Me.Controls.Add(Me.ucrChkConvertToVariate) Me.Controls.Add(Me.grpParameters) Me.Controls.Add(Me.lblFactor) Me.Controls.Add(Me.lblNumeric) Me.Controls.Add(Me.ucrModelPreview) + Me.Controls.Add(Me.ucrpnlKruskalWilcoxonTest) Me.Controls.Add(Me.ucrExplanatory) Me.Controls.Add(Me.ucrResponse) Me.Controls.Add(Me.lblModelPreview) @@ -434,7 +434,7 @@ Partial Class dlgRegressionSimple Friend WithEvents ucrInputLevel1 As ucrInputComboBox Friend WithEvents Label1 As Label Friend WithEvents lblLevel1 As Label + Friend WithEvents ucrPnlModelType As UcrPanel Friend WithEvents rdoTwoSample As RadioButton Friend WithEvents rdoGeneralCase As RadioButton - Friend WithEvents ucrPnlModelType As UcrPanel End Class \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 452bfdbd5ed..74d35b713fc 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -39,6 +39,8 @@ Public Class dlgRegressionSimple End Sub Private Sub SetRCodeForControls(bReset) + ucrResponse.SetRCode(clsFormulaOperator, bReset) + ucrExplanatory.SetRCode(clsFormulaOperator, bReset) ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) ucrResponse.AddAdditionalCodeParameterPair(clsRConvert, New RParameter("x", 1)) @@ -54,6 +56,14 @@ Public Class dlgRegressionSimple ucrExplanatory.Selector = ucrSelectorSimpleReg ucrBase.iHelpTopicID = 366 + ucrResponse.SetParameter(New RParameter("y", 1)) + ucrResponse.SetParameterIsString() + ucrResponse.bWithQuotes = False + + ucrExplanatory.SetParameter(New RParameter("x", 1)) + ucrExplanatory.SetParameterIsString() + ucrExplanatory.bWithQuotes = False + ucrChkConvertToVariate.SetText("Convert to Variate") ucrSaveModels.SetPrefix("reg") @@ -146,11 +156,11 @@ Public Class dlgRegressionSimple DataTypeAccepted() clsFormulaOperator.SetOperation("~") - clsFormulaOperator.AddParameter("y", 1, iPosition:=0) - clsFormulaOperator.AddParameter("x", 1, iPosition:=1) + ' clsFormulaOperator.AddParameter("y", 1, iPosition:=0) + ' clsFormulaOperator.AddParameter("x", 1, iPosition:=1) clsRLmOrGLM.SetRCommand("lm") - clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator) + clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=0) clsRModelsFunction.SetPackageName("base") clsRModelsFunction.SetRCommand("formula") @@ -206,14 +216,13 @@ Public Class dlgRegressionSimple clsTFunc.SetRCommand("c") - frmMain.clsRLink.RunScript(clsRaovFunction.ToScript(), 2) - clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=ucrSaveModels.GetText, bAssignToIsPrefix:=True) ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) ucrBase.clsRsyntax.AddToAfterCodes(clsRaovFunction, iPosition:=0) ucrBase.clsRsyntax.AddToAfterCodes(clsRModelsFunction, iPosition:=1) ucrBase.clsRsyntax.AddToAfterCodes(clsRaovpvalFunction, iPosition:=2) ucrBase.clsRsyntax.AddToAfterCodes(clsRConfint, iPosition:=3) + clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=ucrSaveModels.GetText, bAssignToIsPrefix:=True) 'sdgSimpleRegOptions.SetDefaults() 'sdgModelOptions.SetDefaults() @@ -271,6 +280,7 @@ Public Class dlgRegressionSimple sdgSimpleRegOptions.ShowDialog() End Sub + Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged clsRYVariable = ucrResponse.GetVariables End Sub @@ -291,7 +301,7 @@ Public Class dlgRegressionSimple End Sub - Private Sub rdoTable_CheckedChanged(sender As Object, e As EventArgs) Handles rdoGeneralCase.CheckedChanged + Private Sub rdoTable_CheckedChanged(sender As Object, e As EventArgs) End Sub From e9377fe5d01961c414c7addcf48ec75845c83fbe Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 21 Jun 2017 10:31:13 +0300 Subject: [PATCH 119/201] Design edits --- instat/dlgRegressionSimple.Designer.vb | 164 ++--- instat/dlgRegressionSimple.resx | 880 ++++++++++--------------- instat/dlgRegressionSimple.vb | 53 +- 3 files changed, 437 insertions(+), 660 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 5084cbfed74..d4b76b1e0b7 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -34,26 +34,20 @@ Partial Class dlgRegressionSimple Me.lblModelPreview = New System.Windows.Forms.Label() Me.lblNumeric = New System.Windows.Forms.Label() Me.lblFactor = New System.Windows.Forms.Label() - Me.lblHyp1 = New System.Windows.Forms.Label() - Me.grpParameters = New System.Windows.Forms.GroupBox() - Me.ucrChkFunction = New instat.ucrCheck() - Me.ucrNudSuccess = New instat.ucrNud() - Me.lblSuccess = New System.Windows.Forms.Label() - Me.ucrInputLevel2 = New instat.ucrInputComboBox() - Me.ucrInputLevel1 = New instat.ucrInputComboBox() Me.Label1 = New System.Windows.Forms.Label() - Me.lblLevel1 = New System.Windows.Forms.Label() Me.rdoKruskalTest = New System.Windows.Forms.RadioButton() Me.rdoWilcoxonTest = New System.Windows.Forms.RadioButton() - Me.ucrpnlKruskalWilcoxonTest = New instat.UcrPanel() Me.ucrNudHypothesis = New instat.ucrNud() Me.ucrChkPairedTest = New instat.ucrCheck() Me.ucrNudCI = New instat.ucrNud() - Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() - Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() Me.ucrPnlMeansAndVariance = New instat.UcrPanel() Me.lblConfidenceInterval = New System.Windows.Forms.Label() Me.lblDifferenceInMeans = New System.Windows.Forms.Label() + Me.ucrChkFunction = New instat.ucrCheck() + Me.ucrNudSuccess = New instat.ucrNud() + Me.ucrInputLevel2 = New instat.ucrInputComboBox() + Me.ucrInputLevel1 = New instat.ucrInputComboBox() + Me.lblLevel1 = New System.Windows.Forms.Label() Me.ucrModelPreview = New instat.ucrInputTextBox() Me.ucrExplanatory = New instat.ucrReceiverSingle() Me.ucrResponse = New instat.ucrReceiverSingle() @@ -65,7 +59,6 @@ Partial Class dlgRegressionSimple Me.ucrPnlModelType = New instat.UcrPanel() Me.rdoTwoSample = New System.Windows.Forms.RadioButton() Me.rdoGeneralCase = New System.Windows.Forms.RadioButton() - Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' 'lblResidualMsg @@ -131,80 +124,11 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.lblFactor, "lblFactor") Me.lblFactor.Name = "lblFactor" ' - 'lblHyp1 - ' - resources.ApplyResources(Me.lblHyp1, "lblHyp1") - Me.lblHyp1.Name = "lblHyp1" - ' - 'grpParameters - ' - Me.grpParameters.Controls.Add(Me.ucrChkFunction) - Me.grpParameters.Controls.Add(Me.ucrNudSuccess) - Me.grpParameters.Controls.Add(Me.lblSuccess) - Me.grpParameters.Controls.Add(Me.ucrInputLevel2) - Me.grpParameters.Controls.Add(Me.ucrInputLevel1) - Me.grpParameters.Controls.Add(Me.Label1) - Me.grpParameters.Controls.Add(Me.lblLevel1) - Me.grpParameters.Controls.Add(Me.rdoKruskalTest) - Me.grpParameters.Controls.Add(Me.rdoWilcoxonTest) - Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) - Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) - Me.grpParameters.Controls.Add(Me.ucrNudCI) - Me.grpParameters.Controls.Add(Me.rdoCompareVariance) - Me.grpParameters.Controls.Add(Me.rdoCompareMeans) - Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) - Me.grpParameters.Controls.Add(Me.lblHyp1) - Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) - Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) - resources.ApplyResources(Me.grpParameters, "grpParameters") - Me.grpParameters.Name = "grpParameters" - Me.grpParameters.TabStop = False - ' - 'ucrChkFunction - ' - Me.ucrChkFunction.Checked = False - resources.ApplyResources(Me.ucrChkFunction, "ucrChkFunction") - Me.ucrChkFunction.Name = "ucrChkFunction" - ' - 'ucrNudSuccess - ' - Me.ucrNudSuccess.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSuccess.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - resources.ApplyResources(Me.ucrNudSuccess, "ucrNudSuccess") - Me.ucrNudSuccess.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudSuccess.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSuccess.Name = "ucrNudSuccess" - Me.ucrNudSuccess.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'lblSuccess - ' - resources.ApplyResources(Me.lblSuccess, "lblSuccess") - Me.lblSuccess.Name = "lblSuccess" - ' - 'ucrInputLevel2 - ' - Me.ucrInputLevel2.AddQuotesIfUnrecognised = True - Me.ucrInputLevel2.IsReadOnly = False - resources.ApplyResources(Me.ucrInputLevel2, "ucrInputLevel2") - Me.ucrInputLevel2.Name = "ucrInputLevel2" - ' - 'ucrInputLevel1 - ' - Me.ucrInputLevel1.AddQuotesIfUnrecognised = True - Me.ucrInputLevel1.IsReadOnly = False - resources.ApplyResources(Me.ucrInputLevel1, "ucrInputLevel1") - Me.ucrInputLevel1.Name = "ucrInputLevel1" - ' 'Label1 ' resources.ApplyResources(Me.Label1, "Label1") Me.Label1.Name = "Label1" ' - 'lblLevel1 - ' - resources.ApplyResources(Me.lblLevel1, "lblLevel1") - Me.lblLevel1.Name = "lblLevel1" - ' 'rdoKruskalTest ' resources.ApplyResources(Me.rdoKruskalTest, "rdoKruskalTest") @@ -219,11 +143,6 @@ Partial Class dlgRegressionSimple Me.rdoWilcoxonTest.TabStop = True Me.rdoWilcoxonTest.UseVisualStyleBackColor = True ' - 'ucrpnlKruskalWilcoxonTest - ' - resources.ApplyResources(Me.ucrpnlKruskalWilcoxonTest, "ucrpnlKruskalWilcoxonTest") - Me.ucrpnlKruskalWilcoxonTest.Name = "ucrpnlKruskalWilcoxonTest" - ' 'ucrNudHypothesis ' Me.ucrNudHypothesis.DecimalPlaces = New Decimal(New Integer() {2, 0, 0, 0}) @@ -250,20 +169,6 @@ Partial Class dlgRegressionSimple Me.ucrNudCI.Name = "ucrNudCI" Me.ucrNudCI.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'rdoCompareVariance - ' - resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") - Me.rdoCompareVariance.Name = "rdoCompareVariance" - Me.rdoCompareVariance.TabStop = True - Me.rdoCompareVariance.UseVisualStyleBackColor = True - ' - 'rdoCompareMeans - ' - resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") - Me.rdoCompareMeans.Name = "rdoCompareMeans" - Me.rdoCompareMeans.TabStop = True - Me.rdoCompareMeans.UseVisualStyleBackColor = True - ' 'ucrPnlMeansAndVariance ' resources.ApplyResources(Me.ucrPnlMeansAndVariance, "ucrPnlMeansAndVariance") @@ -279,6 +184,41 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.lblDifferenceInMeans, "lblDifferenceInMeans") Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" ' + 'ucrChkFunction + ' + Me.ucrChkFunction.Checked = False + resources.ApplyResources(Me.ucrChkFunction, "ucrChkFunction") + Me.ucrChkFunction.Name = "ucrChkFunction" + ' + 'ucrNudSuccess + ' + Me.ucrNudSuccess.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSuccess.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + resources.ApplyResources(Me.ucrNudSuccess, "ucrNudSuccess") + Me.ucrNudSuccess.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudSuccess.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudSuccess.Name = "ucrNudSuccess" + Me.ucrNudSuccess.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrInputLevel2 + ' + Me.ucrInputLevel2.AddQuotesIfUnrecognised = True + Me.ucrInputLevel2.IsReadOnly = False + resources.ApplyResources(Me.ucrInputLevel2, "ucrInputLevel2") + Me.ucrInputLevel2.Name = "ucrInputLevel2" + ' + 'ucrInputLevel1 + ' + Me.ucrInputLevel1.AddQuotesIfUnrecognised = True + Me.ucrInputLevel1.IsReadOnly = False + resources.ApplyResources(Me.ucrInputLevel1, "ucrInputLevel1") + Me.ucrInputLevel1.Name = "ucrInputLevel1" + ' + 'lblLevel1 + ' + resources.ApplyResources(Me.lblLevel1, "lblLevel1") + Me.lblLevel1.Name = "lblLevel1" + ' 'ucrModelPreview ' Me.ucrModelPreview.AddQuotesIfUnrecognised = True @@ -362,14 +302,26 @@ Partial Class dlgRegressionSimple Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.Controls.Add(Me.rdoTwoSample) Me.Controls.Add(Me.rdoGeneralCase) + Me.Controls.Add(Me.ucrNudCI) + Me.Controls.Add(Me.lblDifferenceInMeans) + Me.Controls.Add(Me.lblConfidenceInterval) + Me.Controls.Add(Me.ucrChkPairedTest) + Me.Controls.Add(Me.ucrNudHypothesis) + Me.Controls.Add(Me.rdoWilcoxonTest) + Me.Controls.Add(Me.rdoKruskalTest) + Me.Controls.Add(Me.Label1) + Me.Controls.Add(Me.ucrNudSuccess) + Me.Controls.Add(Me.ucrInputLevel1) + Me.Controls.Add(Me.lblLevel1) + Me.Controls.Add(Me.ucrInputLevel2) + Me.Controls.Add(Me.ucrChkFunction) Me.Controls.Add(Me.ucrSaveModels) + Me.Controls.Add(Me.ucrPnlMeansAndVariance) Me.Controls.Add(Me.ucrPnlModelType) Me.Controls.Add(Me.ucrChkConvertToVariate) - Me.Controls.Add(Me.grpParameters) Me.Controls.Add(Me.lblFactor) Me.Controls.Add(Me.lblNumeric) Me.Controls.Add(Me.ucrModelPreview) - Me.Controls.Add(Me.ucrpnlKruskalWilcoxonTest) Me.Controls.Add(Me.ucrExplanatory) Me.Controls.Add(Me.ucrResponse) Me.Controls.Add(Me.lblModelPreview) @@ -388,8 +340,6 @@ Partial Class dlgRegressionSimple Me.ShowIcon = False Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide Me.Tag = "Simple_Regression" - Me.grpParameters.ResumeLayout(False) - Me.grpParameters.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -412,14 +362,10 @@ Partial Class dlgRegressionSimple Friend WithEvents ucrModelPreview As ucrInputTextBox Friend WithEvents lblNumeric As Label Friend WithEvents lblFactor As Label - Friend WithEvents lblHyp1 As Label - Friend WithEvents grpParameters As GroupBox Friend WithEvents lblConfidenceInterval As Label Friend WithEvents lblDifferenceInMeans As Label Friend WithEvents ucrChkConvertToVariate As ucrCheck Friend WithEvents ucrChkPairedTest As ucrCheck - Friend WithEvents rdoCompareVariance As RadioButton - Friend WithEvents rdoCompareMeans As RadioButton Friend WithEvents ucrPnlMeansAndVariance As UcrPanel Friend WithEvents ucrSaveModels As ucrSave Friend WithEvents ucrNudCI As ucrNud @@ -427,9 +373,7 @@ Partial Class dlgRegressionSimple Friend WithEvents ucrChkFunction As ucrCheck Friend WithEvents rdoKruskalTest As RadioButton Friend WithEvents rdoWilcoxonTest As RadioButton - Friend WithEvents ucrpnlKruskalWilcoxonTest As UcrPanel Friend WithEvents ucrNudSuccess As ucrNud - Friend WithEvents lblSuccess As Label Friend WithEvents ucrInputLevel2 As ucrInputComboBox Friend WithEvents ucrInputLevel1 As ucrInputComboBox Friend WithEvents Label1 As Label diff --git a/instat/dlgRegressionSimple.resx b/instat/dlgRegressionSimple.resx index 052d28280cf..be05e4a9290 100644 --- a/instat/dlgRegressionSimple.resx +++ b/instat/dlgRegressionSimple.resx @@ -199,7 +199,7 @@ NoControl - 236, 55 + 264, 55 99, 13 @@ -220,7 +220,7 @@ $this - 18 + 30 True @@ -229,7 +229,7 @@ NoControl - 236, 117 + 264, 117 106, 13 @@ -250,13 +250,13 @@ $this - 17 + 29 NoControl - 297, 286 + 325, 286 110, 23 @@ -277,40 +277,13 @@ $this - 16 - - - NoControl - - - 10, 287 - - - 89, 24 - - - 13 - - - Save Model: - - - chkSaveModel - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 15 + 28 NoControl - 297, 259 + 325, 259 110, 23 @@ -331,67 +304,7 @@ $this - 14 - - - True - - - NoControl - - - 239, 158 - - - 76, 17 - - - 8 - - - Function... - - - chkFunction - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 13 - - - True - - - NoControl - - - 239, 92 - - - 111, 17 - - - 5 - - - Convert to Variate - - - chkConvertToVariate - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 9 + 27 True @@ -421,97 +334,7 @@ $this - 8 - - - True - - - NoControl - - - 9, 131 - - - 80, 17 - - - 5 - - - Paired Test - - - chkPaired - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - grpParameters - - - 10 - - - True - - - NoControl - - - 16, 16 - - - 89, 17 - - - 0 - - - General Case - - - rdoGeneral - - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - True - - - NoControl - - - 239, 17 - - - 84, 17 - - - 1 - - - Two Sample - - - rdoSpecific - - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 + 24 True @@ -520,7 +343,7 @@ NoControl - 236, 55 + 264, 55 98, 13 @@ -541,7 +364,7 @@ $this - 2 + 20 True @@ -550,7 +373,7 @@ NoControl - 236, 117 + 264, 117 81, 13 @@ -571,475 +394,472 @@ $this - 1 - - - 116, 14 - - - 44, 20 + 19 - - 1 + + 540, 255 - - nudCI + + 100, 23 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 5 - - grpParameters + + Label1 - - 8 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 116, 43 + + $this - - 44, 20 + + 9 - - 3 + + 554, 256 - - nudHypothesis + + 104, 24 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 10 - - grpParameters + + rdoKruskalTest - - 9 + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + $this - - NoControl + + 8 - - 6, 17 + + 554, 288 - - 102, 13 + + 104, 24 - - 0 + + 11 - - Confidence Interval: + + rdoWilcoxonTest - - lblCI + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - grpParameters + + 7 - - 6 + + 578, 220 - - True + + 50, 20 - - NoControl + + 13 - - 6, 47 + + ucrNudHypothesis - - 0, 13 + + instat.ucrNud, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - 2 + + $this - - lblHyp1 + + 6 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 489, 140 - - grpParameters + + 100, 20 - - 11 + + 14 - - ucrNud + + ucrChkPairedTest - - instat.ucrNud, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + instat.ucrCheck, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - grpParameters - - - 0 + + $this - - lblSuccessIf + + 5 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 554, 223 - - grpParameters + + 50, 20 - - 1 + + 15 - - ucrLevel2 + + ucrNudCI - - instat.ucrInputComboBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + instat.ucrNud, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - grpParameters + + $this - + 2 - - ucrLevel1 + + 489, 286 - - instat.ucrInputComboBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + 187, 76 - - grpParameters + + 17 - - 3 + + ucrPnlMeansAndVariance - - lblLevel2 + + instat.UcrPanel, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - grpParameters + + 16 - - 4 + + 589, 243 - - rdoCompareVar + + 100, 23 - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 18 - - grpParameters + + lblConfidenceInterval - - 5 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - lblLevel1 + + $this - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4 - - grpParameters + + 540, 256 - - 7 + + 100, 23 - - rdoCompareMeans + + 19 - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + lblDifferenceInMeans - - grpParameters + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 12 + + $this - - 239, 158 + + 3 - - 168, 153 + + 489, 86 - - 10 + + 100, 20 - - Parameters + + 0 - - grpParameters + + ucrChkFunction - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + instat.ucrCheck, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - + $this - - 0 + + 14 - - 116, 128 + + 570, 131 - - 44, 20 + + 50, 20 - - 8 + + 1 - - ucrNud + + ucrNudSuccess - + instat.ucrNud, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - grpParameters + + $this - - 0 + + 10 - - True + + 489, 181 - - NoControl + + 137, 21 - - 6, 131 + + 3 - - 75, 13 + + ucrInputLevel2 - - 7 + + instat.ucrInputComboBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - Success if X = + + $this - - lblSuccessIf + + 13 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 489, 208 - - grpParameters + + 137, 21 - - 1 + + 4 - - 57, 100 + + ucrInputLevel1 - - 103, 21 + + instat.ucrInputComboBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - 12 + + $this - - ucrLevel2 + + 11 - - instat.ucrInputComboBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + True - - grpParameters + + NoControl - - 2 + + 575, 264 - - 57, 71 + + 45, 13 - - 103, 21 + + 9 - - 10 + + Level 1: - - ucrLevel1 + + lblLevel1 - - instat.ucrInputComboBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - grpParameters + + $this - - 3 + + 12 - - True + + 92, 260 - - NoControl + + 204, 21 - - 6, 103 + + 12 - - 45, 13 + + ucrModelPreview - - 11 + + instat.ucrInputTextBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + $this - - Level 2: + + 21 - - lblLevel2 + + True + + + 6, 13 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 721, 372 - - grpParameters + + Button - - 4 + + Flat - - NoControl + + 249, 11 - - 9, 101 + + 100, 28 - - 154, 24 + + 21 - - 6 + + Two Sample + + + MiddleCenter - - rdoCompareVar + + rdoTwoSample - + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - grpParameters + + $this - - 5 + + 0 - - True + + Button - - NoControl + + Flat - - 6, 74 + + 151, 11 - - 45, 13 + + 100, 28 - - 9 + + 20 - - Level 1: + + General ase - - lblLevel1 + + MiddleCenter - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + rdoGeneralCase - - grpParameters + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 7 + + $this - - NoControl + + 1 - - 9, 73 + + 13, 288 - - 104, 24 + + 241, 24 - - 4 + + 0 - - rdoCompareMeans + + ucrSaveModels - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + instat.ucrSave, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - grpParameters + + $this - - 12 + + 15 - - 92, 260 + + 143, -5 - - 204, 21 + + 219, 54 - - 12 + + 3 - - ucrModelPreview + + ucrPnlModelType - - instat.ucrInputTextBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + instat.UcrPanel, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - + $this - - 5 + + 17 - - 239, 131 + + 267, 92 - - 0, 0, 0, 0 + + 100, 20 - - 120, 20 - - - 7 + + 4 - - ucrExplanatory + + ucrChkConvertToVariate - - instat.ucrReceiverSingle, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + instat.ucrCheck, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - + $this - - 6 + + 18 - 239, 69 + 267, 69 0, 0, 0, 0 @@ -1060,28 +880,7 @@ $this - 7 - - - 92, 288 - - - 141, 21 - - - 14 - - - ucrModelName - - - instat.ucrInputComboBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 10 + 23 10, 37 @@ -1105,7 +904,7 @@ $this - 11 + 25 9, 220 @@ -1126,7 +925,7 @@ $this - 12 + 26 9, 317 @@ -1147,16 +946,7 @@ $this - 19 - - - True - - - 6, 13 - - - 416, 372 + 31 CenterScreen @@ -1170,4 +960,28 @@ System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 267, 131 + + + 0, 0, 0, 0 + + + 120, 20 + + + 7 + + + ucrExplanatory + + + instat.ucrReceiverSingle, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + $this + + + 22 + \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 74d35b713fc..4b894974a18 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -41,9 +41,11 @@ Public Class dlgRegressionSimple Private Sub SetRCodeForControls(bReset) ucrResponse.SetRCode(clsFormulaOperator, bReset) ucrExplanatory.SetRCode(clsFormulaOperator, bReset) - ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) - ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) - ucrResponse.AddAdditionalCodeParameterPair(clsRConvert, New RParameter("x", 1)) + ucrSelectorSimpleReg.SetRCode(clsRLmOrGLM, bReset) + ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) + ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) + ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) + ' ucrResponse.AddAdditionalCodeParameterPair(clsRConvert, New RParameter("x", 1)) ucrNudCI.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("conf.int"), 1) ucrNudHypothesis.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("r"), 1) End Sub @@ -51,12 +53,11 @@ Public Class dlgRegressionSimple Private Sub InitialiseDialog() ucrBase.clsRsyntax.iCallType = 2 - ucrResponse.Selector = ucrSelectorSimpleReg ucrExplanatory.Selector = ucrSelectorSimpleReg ucrBase.iHelpTopicID = 366 - ucrResponse.SetParameter(New RParameter("y", 1)) + ucrResponse.SetParameter(New RParameter("y", 0)) ucrResponse.SetParameterIsString() ucrResponse.bWithQuotes = False @@ -100,11 +101,6 @@ Public Class dlgRegressionSimple ucrChkPairedTest.SetText("Paired Text") ucrChkPairedTest.Enabled = False 'for the time being - ucrResponse.SetParameter(New RParameter("y", 0)) - ucrResponse.SetParameterIsRFunction() - - ucrExplanatory.SetParameter(New RParameter("x", 2)) - ucrExplanatory.SetParameterIsRFunction() ucrSelectorSimpleReg.SetParameter(New RParameter("data", 0)) ucrSelectorSimpleReg.SetParameterIsrfunction() @@ -160,9 +156,9 @@ Public Class dlgRegressionSimple ' clsFormulaOperator.AddParameter("x", 1, iPosition:=1) clsRLmOrGLM.SetRCommand("lm") - clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=0) + clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) - clsRModelsFunction.SetPackageName("base") + clsRModelsFunction.SetPackageName("stats") clsRModelsFunction.SetRCommand("formula") clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) clsRModelsFunction.iCallType = 2 @@ -222,7 +218,7 @@ Public Class dlgRegressionSimple ucrBase.clsRsyntax.AddToAfterCodes(clsRModelsFunction, iPosition:=1) ucrBase.clsRsyntax.AddToAfterCodes(clsRaovpvalFunction, iPosition:=2) ucrBase.clsRsyntax.AddToAfterCodes(clsRConfint, iPosition:=3) - clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=ucrSaveModels.GetText, bAssignToIsPrefix:=True) + clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempModel:="last_model", bAssignToIsPrefix:=True) 'sdgSimpleRegOptions.SetDefaults() 'sdgModelOptions.SetDefaults() @@ -280,6 +276,29 @@ Public Class dlgRegressionSimple sdgSimpleRegOptions.ShowDialog() End Sub + Private Sub grpParameters_Enter(sender As Object, e As EventArgs) + + End Sub + + Private Sub rdoCompareVariance_CheckedChanged(sender As Object, e As EventArgs) + + End Sub + + Private Sub ucrInputLevel2_Load(sender As Object, e As EventArgs) Handles ucrInputLevel2.Load + + End Sub + + Private Sub ucrPnlModelType_Load_1(sender As Object, e As EventArgs) Handles ucrPnlModelType.Load + + End Sub + + Private Sub rdoTable_CheckedChanged_1(sender As Object, e As EventArgs) Handles rdoGeneralCase.CheckedChanged + + End Sub + + Private Sub ucrChkConvertToVariate_Load(sender As Object, e As EventArgs) Handles ucrChkConvertToVariate.Load + + End Sub Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged clsRYVariable = ucrResponse.GetVariables @@ -491,10 +510,10 @@ Public Class dlgRegressionSimple End Sub Private Sub SetRCode() - clsRPoisson.ClearParameters() - clsRBinomial.ClearParameters() - clsRTTest.ClearParameters() - clsRLmOrGLM.ClearParameters() + 'clsRPoisson.ClearParameters() + 'clsRBinomial.ClearParameters() + 'clsRTTest.ClearParameters() + 'clsRLmOrGLM.ClearParameters() If rdoGeneralCase.Checked Then If (ucrFamily.clsCurrDistribution.strNameTag = "Normal") Then ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) From cbb9a6dcb9a8dbb41bbef37c7aeef4cf137b5399 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 21 Jun 2017 10:35:24 +0300 Subject: [PATCH 120/201] Design changes --- instat/dlgRegressionSimple.Designer.vb | 221 +++++++++++++++---------- instat/dlgRegressionSimple.vb | 33 +--- 2 files changed, 141 insertions(+), 113 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index d4b76b1e0b7..09df035ca2e 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -27,13 +27,9 @@ Partial Class dlgRegressionSimple Me.lblDF = New System.Windows.Forms.Label() Me.txtResidualMsg = New System.Windows.Forms.TextBox() Me.txtdf = New System.Windows.Forms.TextBox() - Me.lblResponse = New System.Windows.Forms.Label() - Me.lblExplanatory = New System.Windows.Forms.Label() Me.cmdDisplayOptions = New System.Windows.Forms.Button() Me.cmdModelOptions = New System.Windows.Forms.Button() Me.lblModelPreview = New System.Windows.Forms.Label() - Me.lblNumeric = New System.Windows.Forms.Label() - Me.lblFactor = New System.Windows.Forms.Label() Me.Label1 = New System.Windows.Forms.Label() Me.rdoKruskalTest = New System.Windows.Forms.RadioButton() Me.rdoWilcoxonTest = New System.Windows.Forms.RadioButton() @@ -49,16 +45,26 @@ Partial Class dlgRegressionSimple Me.ucrInputLevel1 = New instat.ucrInputComboBox() Me.lblLevel1 = New System.Windows.Forms.Label() Me.ucrModelPreview = New instat.ucrInputTextBox() - Me.ucrExplanatory = New instat.ucrReceiverSingle() - Me.ucrResponse = New instat.ucrReceiverSingle() - Me.ucrSelectorSimpleReg = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrFamily = New instat.ucrDistributions() Me.ucrBase = New instat.ucrButtons() - Me.ucrChkConvertToVariate = New instat.ucrCheck() Me.ucrSaveModels = New instat.ucrSave() Me.ucrPnlModelType = New instat.UcrPanel() + Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() + Me.lblHyp1 = New System.Windows.Forms.Label() + Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() + Me.grpParameters = New System.Windows.Forms.GroupBox() Me.rdoTwoSample = New System.Windows.Forms.RadioButton() Me.rdoGeneralCase = New System.Windows.Forms.RadioButton() + Me.UcrPanel1 = New instat.UcrPanel() + Me.ucrChkConvertToVariate = New instat.ucrCheck() + Me.lblFactor = New System.Windows.Forms.Label() + Me.lblNumeric = New System.Windows.Forms.Label() + Me.ucrExplanatory = New instat.ucrReceiverSingle() + Me.ucrResponse = New instat.ucrReceiverSingle() + Me.ucrSelectorSimpleReg = New instat.ucrSelectorByDataFrameAddRemove() + Me.lblExplanatory = New System.Windows.Forms.Label() + Me.lblResponse = New System.Windows.Forms.Label() + Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' 'lblResidualMsg @@ -83,18 +89,6 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.txtdf, "txtdf") Me.txtdf.Name = "txtdf" ' - 'lblResponse - ' - resources.ApplyResources(Me.lblResponse, "lblResponse") - Me.lblResponse.Name = "lblResponse" - Me.lblResponse.Tag = "Response_Variable" - ' - 'lblExplanatory - ' - resources.ApplyResources(Me.lblExplanatory, "lblExplanatory") - Me.lblExplanatory.Name = "lblExplanatory" - Me.lblExplanatory.Tag = "Explanatory_Variable" - ' 'cmdDisplayOptions ' resources.ApplyResources(Me.cmdDisplayOptions, "cmdDisplayOptions") @@ -114,16 +108,6 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.lblModelPreview, "lblModelPreview") Me.lblModelPreview.Name = "lblModelPreview" ' - 'lblNumeric - ' - resources.ApplyResources(Me.lblNumeric, "lblNumeric") - Me.lblNumeric.Name = "lblNumeric" - ' - 'lblFactor - ' - resources.ApplyResources(Me.lblFactor, "lblFactor") - Me.lblFactor.Name = "lblFactor" - ' 'Label1 ' resources.ApplyResources(Me.Label1, "Label1") @@ -227,31 +211,6 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrModelPreview, "ucrModelPreview") Me.ucrModelPreview.Name = "ucrModelPreview" ' - 'ucrExplanatory - ' - Me.ucrExplanatory.frmParent = Me - resources.ApplyResources(Me.ucrExplanatory, "ucrExplanatory") - Me.ucrExplanatory.Name = "ucrExplanatory" - Me.ucrExplanatory.Selector = Nothing - Me.ucrExplanatory.strNcFilePath = "" - Me.ucrExplanatory.ucrSelector = Nothing - ' - 'ucrResponse - ' - Me.ucrResponse.frmParent = Me - resources.ApplyResources(Me.ucrResponse, "ucrResponse") - Me.ucrResponse.Name = "ucrResponse" - Me.ucrResponse.Selector = Nothing - Me.ucrResponse.strNcFilePath = "" - Me.ucrResponse.ucrSelector = Nothing - ' - 'ucrSelectorSimpleReg - ' - Me.ucrSelectorSimpleReg.bShowHiddenColumns = False - Me.ucrSelectorSimpleReg.bUseCurrentFilter = True - resources.ApplyResources(Me.ucrSelectorSimpleReg, "ucrSelectorSimpleReg") - Me.ucrSelectorSimpleReg.Name = "ucrSelectorSimpleReg" - ' 'ucrFamily ' resources.ApplyResources(Me.ucrFamily, "ucrFamily") @@ -262,12 +221,6 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrBase, "ucrBase") Me.ucrBase.Name = "ucrBase" ' - 'ucrChkConvertToVariate - ' - Me.ucrChkConvertToVariate.Checked = False - resources.ApplyResources(Me.ucrChkConvertToVariate, "ucrChkConvertToVariate") - Me.ucrChkConvertToVariate.Name = "ucrChkConvertToVariate" - ' 'ucrSaveModels ' resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") @@ -278,6 +231,43 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") Me.ucrPnlModelType.Name = "ucrPnlModelType" ' + 'rdoCompareVariance + ' + resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") + Me.rdoCompareVariance.Name = "rdoCompareVariance" + Me.rdoCompareVariance.TabStop = True + Me.rdoCompareVariance.UseVisualStyleBackColor = True + ' + 'lblHyp1 + ' + resources.ApplyResources(Me.lblHyp1, "lblHyp1") + Me.lblHyp1.Name = "lblHyp1" + ' + 'rdoCompareMeans + ' + resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") + Me.rdoCompareMeans.Name = "rdoCompareMeans" + Me.rdoCompareMeans.TabStop = True + Me.rdoCompareMeans.UseVisualStyleBackColor = True + ' + 'grpParameters + ' + Me.grpParameters.Controls.Add(Me.Label1) + Me.grpParameters.Controls.Add(Me.rdoKruskalTest) + Me.grpParameters.Controls.Add(Me.rdoWilcoxonTest) + Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) + Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) + Me.grpParameters.Controls.Add(Me.ucrNudCI) + Me.grpParameters.Controls.Add(Me.rdoCompareVariance) + Me.grpParameters.Controls.Add(Me.rdoCompareMeans) + Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) + Me.grpParameters.Controls.Add(Me.lblHyp1) + Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) + Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) + resources.ApplyResources(Me.grpParameters, "grpParameters") + Me.grpParameters.Name = "grpParameters" + Me.grpParameters.TabStop = False + ' 'rdoTwoSample ' resources.ApplyResources(Me.rdoTwoSample, "rdoTwoSample") @@ -296,41 +286,92 @@ Partial Class dlgRegressionSimple Me.rdoGeneralCase.Name = "rdoGeneralCase" Me.rdoGeneralCase.UseVisualStyleBackColor = True ' + 'UcrPanel1 + ' + resources.ApplyResources(Me.UcrPanel1, "UcrPanel1") + Me.UcrPanel1.Name = "UcrPanel1" + ' + 'ucrChkConvertToVariate + ' + Me.ucrChkConvertToVariate.Checked = False + resources.ApplyResources(Me.ucrChkConvertToVariate, "ucrChkConvertToVariate") + Me.ucrChkConvertToVariate.Name = "ucrChkConvertToVariate" + ' + 'lblFactor + ' + resources.ApplyResources(Me.lblFactor, "lblFactor") + Me.lblFactor.Name = "lblFactor" + ' + 'lblNumeric + ' + resources.ApplyResources(Me.lblNumeric, "lblNumeric") + Me.lblNumeric.Name = "lblNumeric" + ' + 'ucrExplanatory + ' + Me.ucrExplanatory.frmParent = Me + resources.ApplyResources(Me.ucrExplanatory, "ucrExplanatory") + Me.ucrExplanatory.Name = "ucrExplanatory" + Me.ucrExplanatory.Selector = Nothing + Me.ucrExplanatory.strNcFilePath = "" + Me.ucrExplanatory.ucrSelector = Nothing + ' + 'ucrResponse + ' + Me.ucrResponse.frmParent = Me + resources.ApplyResources(Me.ucrResponse, "ucrResponse") + Me.ucrResponse.Name = "ucrResponse" + Me.ucrResponse.Selector = Nothing + Me.ucrResponse.strNcFilePath = "" + Me.ucrResponse.ucrSelector = Nothing + ' + 'ucrSelectorSimpleReg + ' + Me.ucrSelectorSimpleReg.bShowHiddenColumns = False + Me.ucrSelectorSimpleReg.bUseCurrentFilter = True + resources.ApplyResources(Me.ucrSelectorSimpleReg, "ucrSelectorSimpleReg") + Me.ucrSelectorSimpleReg.Name = "ucrSelectorSimpleReg" + ' + 'lblExplanatory + ' + resources.ApplyResources(Me.lblExplanatory, "lblExplanatory") + Me.lblExplanatory.Name = "lblExplanatory" + Me.lblExplanatory.Tag = "Explanatory_Variable" + ' + 'lblResponse + ' + resources.ApplyResources(Me.lblResponse, "lblResponse") + Me.lblResponse.Name = "lblResponse" + Me.lblResponse.Tag = "Response_Variable" + ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.Controls.Add(Me.rdoTwoSample) Me.Controls.Add(Me.rdoGeneralCase) - Me.Controls.Add(Me.ucrNudCI) - Me.Controls.Add(Me.lblDifferenceInMeans) - Me.Controls.Add(Me.lblConfidenceInterval) - Me.Controls.Add(Me.ucrChkPairedTest) - Me.Controls.Add(Me.ucrNudHypothesis) - Me.Controls.Add(Me.rdoWilcoxonTest) - Me.Controls.Add(Me.rdoKruskalTest) - Me.Controls.Add(Me.Label1) + Me.Controls.Add(Me.UcrPanel1) + Me.Controls.Add(Me.ucrChkConvertToVariate) + Me.Controls.Add(Me.lblFactor) + Me.Controls.Add(Me.lblNumeric) + Me.Controls.Add(Me.ucrExplanatory) + Me.Controls.Add(Me.ucrResponse) + Me.Controls.Add(Me.ucrSelectorSimpleReg) + Me.Controls.Add(Me.lblExplanatory) + Me.Controls.Add(Me.lblResponse) Me.Controls.Add(Me.ucrNudSuccess) Me.Controls.Add(Me.ucrInputLevel1) Me.Controls.Add(Me.lblLevel1) Me.Controls.Add(Me.ucrInputLevel2) Me.Controls.Add(Me.ucrChkFunction) Me.Controls.Add(Me.ucrSaveModels) - Me.Controls.Add(Me.ucrPnlMeansAndVariance) Me.Controls.Add(Me.ucrPnlModelType) - Me.Controls.Add(Me.ucrChkConvertToVariate) - Me.Controls.Add(Me.lblFactor) - Me.Controls.Add(Me.lblNumeric) + Me.Controls.Add(Me.grpParameters) Me.Controls.Add(Me.ucrModelPreview) - Me.Controls.Add(Me.ucrExplanatory) - Me.Controls.Add(Me.ucrResponse) Me.Controls.Add(Me.lblModelPreview) - Me.Controls.Add(Me.ucrSelectorSimpleReg) Me.Controls.Add(Me.ucrFamily) Me.Controls.Add(Me.cmdModelOptions) Me.Controls.Add(Me.cmdDisplayOptions) - Me.Controls.Add(Me.lblExplanatory) - Me.Controls.Add(Me.lblResponse) Me.Controls.Add(Me.ucrBase) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.HelpButton = True @@ -340,6 +381,8 @@ Partial Class dlgRegressionSimple Me.ShowIcon = False Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide Me.Tag = "Simple_Regression" + Me.grpParameters.ResumeLayout(False) + Me.grpParameters.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -349,22 +392,13 @@ Partial Class dlgRegressionSimple Friend WithEvents lblDF As Label Friend WithEvents txtResidualMsg As TextBox Friend WithEvents txtdf As TextBox - - Friend WithEvents lblResponse As Label - Friend WithEvents lblExplanatory As Label Friend WithEvents cmdDisplayOptions As Button Friend WithEvents cmdModelOptions As Button Friend WithEvents ucrFamily As ucrDistributions - Friend WithEvents ucrSelectorSimpleReg As ucrSelectorByDataFrameAddRemove Friend WithEvents lblModelPreview As Label - Friend WithEvents ucrResponse As ucrReceiverSingle - Friend WithEvents ucrExplanatory As ucrReceiverSingle Friend WithEvents ucrModelPreview As ucrInputTextBox - Friend WithEvents lblNumeric As Label - Friend WithEvents lblFactor As Label Friend WithEvents lblConfidenceInterval As Label Friend WithEvents lblDifferenceInMeans As Label - Friend WithEvents ucrChkConvertToVariate As ucrCheck Friend WithEvents ucrChkPairedTest As ucrCheck Friend WithEvents ucrPnlMeansAndVariance As UcrPanel Friend WithEvents ucrSaveModels As ucrSave @@ -379,6 +413,19 @@ Partial Class dlgRegressionSimple Friend WithEvents Label1 As Label Friend WithEvents lblLevel1 As Label Friend WithEvents ucrPnlModelType As UcrPanel + Friend WithEvents grpParameters As GroupBox + Friend WithEvents rdoCompareVariance As RadioButton + Friend WithEvents rdoCompareMeans As RadioButton + Friend WithEvents lblHyp1 As Label Friend WithEvents rdoTwoSample As RadioButton Friend WithEvents rdoGeneralCase As RadioButton + Friend WithEvents UcrPanel1 As UcrPanel + Friend WithEvents ucrChkConvertToVariate As ucrCheck + Friend WithEvents lblFactor As Label + Friend WithEvents lblNumeric As Label + Friend WithEvents ucrExplanatory As ucrReceiverSingle + Friend WithEvents ucrResponse As ucrReceiverSingle + Friend WithEvents ucrSelectorSimpleReg As ucrSelectorByDataFrameAddRemove + Friend WithEvents lblExplanatory As Label + Friend WithEvents lblResponse As Label End Class \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 4b894974a18..63e3ed399ab 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -280,39 +280,20 @@ Public Class dlgRegressionSimple End Sub - Private Sub rdoCompareVariance_CheckedChanged(sender As Object, e As EventArgs) - End Sub - - Private Sub ucrInputLevel2_Load(sender As Object, e As EventArgs) Handles ucrInputLevel2.Load - - End Sub - - Private Sub ucrPnlModelType_Load_1(sender As Object, e As EventArgs) Handles ucrPnlModelType.Load - - End Sub - - Private Sub rdoTable_CheckedChanged_1(sender As Object, e As EventArgs) Handles rdoGeneralCase.CheckedChanged - - End Sub - - Private Sub ucrChkConvertToVariate_Load(sender As Object, e As EventArgs) Handles ucrChkConvertToVariate.Load - - End Sub - - Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged + Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) clsRYVariable = ucrResponse.GetVariables End Sub - Private Sub ucrSelectorSimpleReg_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSelectorSimpleReg.ControlContentsChanged + Private Sub ucrSelectorSimpleReg_ControlContentsChanged(ucrChangedControl As ucrCore) ConvertToVariate() TestOKEnabled() DataTypeAccepted() SetEnableDists() End Sub - Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged + Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) clsRXVariable = ucrExplanatory.GetVariables End Sub @@ -320,7 +301,7 @@ Public Class dlgRegressionSimple End Sub - Private Sub rdoTable_CheckedChanged(sender As Object, e As EventArgs) + Private Sub rdoGeneralCase_CheckedChanged(sender As Object, e As EventArgs) End Sub @@ -561,7 +542,7 @@ Public Class dlgRegressionSimple End If End Sub - Private Sub ucrSelectorSimpleReg_DataFrameChanged() Handles ucrSelectorSimpleReg.DataFrameChanged + Private Sub ucrSelectorSimpleReg_DataFrameChanged() AssignModelName() SetRCode() End Sub @@ -609,7 +590,7 @@ Public Class dlgRegressionSimple ucrFamily.Enabled = Not ucrResponse.IsEmpty End Sub - Private Sub ucrExplanatory_SelectionChanged(sender As Object, e As EventArgs) Handles ucrExplanatory.SelectionChanged + Private Sub ucrExplanatory_SelectionChanged(sender As Object, e As EventArgs) If Not ucrExplanatory.IsEmpty Then ' ucrLevel1.SetItems({ucrExplanatory.GetItemType("Levels")}) End If @@ -804,7 +785,7 @@ Public Class dlgRegressionSimple SetEnableDists() End Sub - Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlContentsChanged + Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) TestOKEnabled() End Sub End Class \ No newline at end of file From 1cac9138754b0568813264d0e388aa03fdf65ee2 Mon Sep 17 00:00:00 2001 From: Lily Date: Wed, 21 Jun 2017 09:34:57 +0100 Subject: [PATCH 121/201] Start of Rains --- instat/dlgStartofRains.vb | 47 ++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index a825b88dd58..5b2d0dc3257 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -316,7 +316,7 @@ Public Class dlgStartofRains clsTRWetSpell.AddParameter("function_exp", clsRFunctionParameter:=clsTRWetSpellFunction, iPosition:=1) clsTRWetSpellFunction.SetRCommand("quantile") clsTRWetSpellFunction.AddParameter("x", "roll_sum_Rain", iPosition:=0) - clsTRWetSpellFunction.AddParameter("probs", 0.8, iPosition:=1) ' do I write: 0.8 or "0.8"? + clsTRWetSpellFunction.AddParameter("probs", 0.8, iPosition:=1) clsTRWetSpellFunction.AddParameter("na.rm", "TRUE", iPosition:=2) clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34), iPosition:=2) clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList, iPosition:=5) ' check position @@ -341,11 +341,13 @@ Public Class dlgStartofRains clsRDRollingRainDaysFunction.AddParameter("width", 2, iPosition:=1) ' default = 2? clsRDRollingRainDaysFunction.AddParameter("FUN", "sum", iPosition:=2) clsRDRollingRainDaysFunction.AddParameter("na.rm", "FALSE", iPosition:=3) - clsRDRollingRainDaysFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) ' check this is chr(39) for ' + clsRDRollingRainDaysFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) clsRDRollingRainDaysFunction.AddParameter("fill", "NA", iPosition:=5) clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34), iPosition:=2) clsRDRollingRainDays.AddParameter("save", 0, iPosition:=6) clsRDRollingRainDays.SetAssignTo("Rolling_rain") + clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) + clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) clsRDParameter.SetArgument(clsRDRollingRainDays) @@ -380,6 +382,7 @@ Public Class dlgStartofRains clsDSParameter.SetArgument(clsDSDryPeriodTen) + 'DRY PERIOD clsDPRainInDaysFunctionLead.bToScriptAsRString = True clsDPOverallInterval.SetRCommand("instat_calculation$new") @@ -522,18 +525,15 @@ Public Class dlgStartofRains TotalRainyDays() End If - If ucrChkDrySpell.Checked Then - End If - If ucrChkDryPeriod.Checked Then - DryPeriod() End If + CombinedFilter() End Sub Private Sub RainDays() - clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")", iPosition:=5) ' is that meant to be True? + clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=5) End Sub Private Sub DayBoundaries() @@ -567,15 +567,17 @@ Public Class dlgStartofRains End Sub Private Sub TotalRainyDays() - clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) - clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) + 'clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) + 'clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) End Sub + 'issue with width = + Private Sub DrySpell() + clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) + clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList, iPosition:=5) clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub, iPosition:=4) clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList, iPosition:=5) - clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) End Sub Private Sub DryPeriod() @@ -601,6 +603,28 @@ Public Class dlgStartofRains Else 'clsCombinedList.RemoveParameterByName("sub3") End If + + Dim clsCombineOperatorTR = New ROperator + Dim clsCombineOperatorRD = New ROperator + Dim clsCombineOperatorDS = New ROperator + Dim clsCombineOperatorDP = New ROperator + + clsCombineOperatorTR.SetOperation("&") + clsCombineOperatorTR.AddParameter("TR", ) ' total rainall + clsCombineOperatorTR.AddParameter("Else", clsROperatorParameter:=clsCombineOperatorRD) ' others + + clsCombineOperatorRD.SetOperation("&") + clsCombineOperatorRD.AddParameter("RD", ) ' Rainy days + clsCombineOperatorRD.AddParameter("Else", clsROperatorParameter:=clsCombineOperatorDS) ' Rainy days + + clsCombineOperatorDS.SetOperation("&") + clsCombineOperatorDS.AddParameter("DS", ) 'Dry spells + clsCombineOperatorDS.AddParameter("Else", clsROperatorParameter:=clsCombineOperatorDP) + + clsCombineOperatorDP.SetOperation("&") + clsCombineOperatorDP.AddParameter("DP", ) ' Dry Period + clsCombineOperatorDP.AddParameter("Else", ) 'clsRFunctionParameter:=) + If ucrChkNumberOfRainyDays.Checked Then strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & ucrNudRDMinimumDays.Value & " & " ' clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) @@ -628,6 +652,7 @@ Public Class dlgStartofRains Private Sub ucrChkDryPeriod_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDryPeriod.ControlValueChanged, ucrChkDrySpell.ControlValueChanged, ucrChkNumberOfRainyDays.ControlValueChanged, ucrChkTotalRainfall.ControlValueChanged CombinedFilter() + End Sub From 79a61f2e6e70ca16cc284a17efe9abd2e17d9e46 Mon Sep 17 00:00:00 2001 From: Lily Date: Wed, 21 Jun 2017 09:48:50 +0100 Subject: [PATCH 122/201] update --- instat/dlgSpells.vb | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 796a085cac4..b4f702378d7 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -20,8 +20,8 @@ Public Class dlgSpells Private bReset As Boolean = True Private clsAddKey, clsSpellLength, clsMaxValueManipulation, clsSubSpellLength1 As New RFunction Private clsMaxValue, clsMaxValueList, clsMaxValueFunction As New RFunction - Private clsDayFromAndTo, clsGroupBy, clsAddKeyColName, clsDayFromAndToCalcFrom As New RFunction - Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator, clsDayFromAndToCalcFromOp As New ROperator + Private clsDayFromAndTo, clsGroupBy, clsAddKeyColName As New RFunction + Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator As New ROperator Private clsApplyInstatFunction, clsRRainday, clsRRaindayMatch As New RFunction Private clsRRaindayOperator, clsRRaindayAndOperator, clsRRaindayLowerOperator, clsRRaindayUpperOperator, clsAdditionalConditionReplaceOperator, clsAdditionalConditionReplaceOperator2 As New ROperator Private clsAdditionalCondition, clsAdditionalConditionList, clsSubSpellLength2, clsAdditionalConditionReplaceFunction As New RFunction @@ -162,11 +162,6 @@ Public Class dlgSpells clsDayFromAndToOperator.AddParameter("to", clsROperatorParameter:=clsDayToOperator, iPosition:=1) clsDayToOperator.SetOperation("<=") clsDayToOperator.AddParameter("to", 366) - clsDayFromAndToCalcFrom.SetRCommand("list") - clsDayFromAndToCalcFrom.AddParameter("x", clsROperatorParameter:=clsDayFromAndToCalcFromOp) - clsDayFromAndToCalcFromOp.SetOperation("=") - clsDayFromAndToCalcFromOp.AddParameter("x", strCurrDataName, iPosition:=0) - clsDayFromAndTo.AddParameter("calculated_from", clsRFunctionParameter:=clsDayFromAndToCalcFrom) ' group clsGroupBy.SetRCommand("instat_calculation$new") @@ -188,7 +183,7 @@ Public Class dlgSpells clsRRaindayLowerOperator.AddParameter("min", 0, iPosition:=1) clsRRaindayAndOperator.AddParameter("upper", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) clsRRaindayUpperOperator.SetOperation("<=") - clsRRaindayUpperOperator.AddParameter("max", 0.85, iPosition:=1) + clsRRaindayUpperOperator.AddParameter("max", 0.85, iPosition:=1) ' why 0.85? clsRRaindayMatch.AddParameter("table", "1", iPosition:=1) clsRRaindayMatch.AddParameter("nomatch", "0", iPosition:=2) @@ -224,6 +219,7 @@ Public Class dlgSpells clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34), iPosition:=3) clsMaxValue.AddParameter("save", 2, iPosition:=6) clsMaxValue.SetAssignTo(ucrSaveSpells.GetText) + clsMaxValue.SetAssignTo("Spells_Rain") clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) @@ -237,7 +233,6 @@ Public Class dlgSpells ucrNudFrom.AddAdditionalCodeParameterPair(clsAdditionalConditionReplaceOperator2, New RParameter("list", 0), iAdditionalPairNo:=1) 'For day: ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("doy", 0), iAdditionalPairNo:=1) - ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromAndToCalcFromOp, New RParameter("X", 1), iAdditionalPairNo:=2) ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) @@ -270,13 +265,13 @@ Public Class dlgSpells frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining column(s) as key") ' clsDayFromAndTo.SetAssignTo("Day_From_and_To") clsGroupBy.SetAssignTo("Grouping") ' TODO: When to do .SetAssignTo? - clsMaxValue.SetAssignTo("Spells_Rain") clsSpellLength.SetAssignTo("Dry_Spell") - If ucrChkConditional.Checked Then 'TODO: A more efficient way here? + If ucrChkConditional.Checked Then clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) + clsAdditionalCondition.AddParameter("function_exp", Chr(34) & clsAdditionalConditionReplaceFunction.ToScript & Chr(34)) clsAdditionalCondition.SetAssignTo("Additional_Condition") clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day2)-cummax((rain_day2==0)*cumsum(rain_day2))" & Chr(34)) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) @@ -292,13 +287,12 @@ Public Class dlgSpells End Sub Private Sub DayBoundaries() ' TODO: What to do about the calculated_from, sub1, etc - ' clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub Private Sub RainyDaysMethod() - clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) End Sub @@ -324,6 +318,7 @@ Public Class dlgSpells End Sub Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged + clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=4) clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False, iPosition:=0) RainyDaysMethod() @@ -342,6 +337,8 @@ Public Class dlgSpells Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged DayBoundaries() + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) + clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged From 0d82c986231fb49580574766d1956290ece645dc Mon Sep 17 00:00:00 2001 From: Lily Date: Wed, 21 Jun 2017 10:25:42 +0100 Subject: [PATCH 123/201] update --- instat/dlgSpells.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index b4f702378d7..4a89071488c 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -166,6 +166,7 @@ Public Class dlgSpells ' group clsGroupBy.SetRCommand("instat_calculation$new") clsGroupBy.AddParameter("type", Chr(34) & "by" & Chr(34)) + clsGroupBy.SetAssignTo("Grouping") ' rain_day clsRRaindayMatch.bToScriptAsRString = True @@ -193,6 +194,7 @@ Public Class dlgSpells clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsSpellLength.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) clsSpellLength.AddParameter("save", 0, iPosition:=6) + clsSpellLength.SetAssignTo("Dry_Spell") clsMaxValueManipulation.SetRCommand("list") @@ -264,8 +266,6 @@ Public Class dlgSpells Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining column(s) as key") ' clsDayFromAndTo.SetAssignTo("Day_From_and_To") - clsGroupBy.SetAssignTo("Grouping") ' TODO: When to do .SetAssignTo? - clsSpellLength.SetAssignTo("Dry_Spell") If ucrChkConditional.Checked Then clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) From 33f5f603bd226b10180d4881f25c6d81d5aa2c38 Mon Sep 17 00:00:00 2001 From: Lily Date: Wed, 21 Jun 2017 12:17:43 +0100 Subject: [PATCH 124/201] code update and fix --- instat/dlgStartofRains.vb | 123 +++++++++++++++++++++++--------------- 1 file changed, 76 insertions(+), 47 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 5b2d0dc3257..a8995b9eb03 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -18,7 +18,7 @@ Imports instat.Translations Public Class dlgStartofRains Public clsRainyDays, clsRainyDaysFunction, clsFirstDOYPerYear, clsManipulationFirstDOYPerYear, clsCombinedFilter, clsCombinedList As New RFunction Private clsDayFromAndTo, clsGroupBy, clsAddKey, clsAddKeyColName, clsApplyInstatFunction As New RFunction - Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator, clsRainyDaysOperator, clsFirstDOYPerYearOperator As New ROperator + Private clsDayFromAndToOperator, clsDayFromOperator, clsDayToOperator, clsRainyDaysOperator, clsFirstDOYPerYearOperator, clsCombineOperator, clsRainCombineOperator, clsTRCombineOperator, clsRDCombineOperator, clsDSCombineOperator, clsDPCombineOperator As New ROperator 'Total Rainfall classes Private clsTRRollingSum, clsTRRollingSumFunction, clsTRWetSpell, clsTRWetSpellList, clsTRWetSpellFunction As New RFunction 'Rainy Day classes @@ -103,10 +103,10 @@ Public Class dlgStartofRains ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) - clsTRParameter.SetArgumentName("sub3") - ucrChkTotalRainfall.SetParameter(clsTRParameter, bNewChangeParameterValue:=False) + 'clsTRParameter.SetArgumentName("sub3") + 'ucrChkTotalRainfall.SetParameter(clsTRParameter, bNewChangeParameterValue:=False) - ' ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 2, False)) + ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 2, False), False) ucrChkTotalRainfall.SetText("Total Rainfall") ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudTROverDays.SetLinkedDisplayControl(lblTROverDays) @@ -128,13 +128,14 @@ Public Class dlgStartofRains 'Number of Rainy days ' if checked, then it runs a function: instat_calculation$new TODO: How to do that? Do manually. - clsRDParameter.SetArgumentName("sub2") - ucrChkNumberOfRainyDays.SetParameter(clsRDParameter, bNewChangeParameterValue:=False) + ' clsRDParameter.SetArgumentName("sub2") + ' ucrChkNumberOfRainyDays.SetParameter(clsRDParameter, bNewChangeParameterValue:=False) + ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub2", clsTRRollingSum, 2, False), False) ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrNudRDMinimumDays.SetParameter(New RParameter("RDMin", 1)) ' TODO, sort this + ucrNudRDMinimumDays.SetParameter(New RParameter("RDMin", 1)) ucrNudRDMinimumDays.SetLinkedDisplayControl(lblRDMinimum) ucrNudRDOutOfDays.SetParameter(New RParameter("width", 1)) @@ -151,6 +152,7 @@ Public Class dlgStartofRains ucrNudDSLengthOfTime.SetLinkedDisplayControl(lblDSLengthofTime) ucrNudDSMaximumDays.SetLinkedDisplayControl(lblDSMaximumDays) ucrNudDSLengthOfTime.SetParameter(New RParameter("width", 1)) + ucrNudDSMaximumDays.SetParameter(New RParameter("DSMax", 1)) ' what is a min/max for this @@ -187,6 +189,9 @@ Public Class dlgStartofRains End Sub Private Sub SetDefaults() + + Dim strRollSumRain As String = "roll_sum_Rain" + clsAddKey = New RFunction clsAddKeyColName = New RFunction clsDayFromAndTo = New RFunction @@ -230,6 +235,13 @@ Public Class dlgStartofRains clsDPOverallIntervalFunctionOperatorRight = New ROperator clsApplyInstatFunction = New RFunction + 'Combine + clsCombineOperator = New ROperator + clsTRCombineOperator = New ROperator + clsRDCombineOperator = New ROperator + clsDSCombineOperator = New ROperator + clsDPCombineOperator = New ROperator + ucrReceiverDate.SetMeAsReceiver() ucrSaveStartofRains.Reset() ucrSelectorForStartofRains.Reset() @@ -295,7 +307,7 @@ Public Class dlgStartofRains clsTRRollingSumFunction.bToScriptAsRString = True clsTRRollingSum.SetRCommand("instat_calculation$new") clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - clsTRRollingSum.AddParameter("result_name", Chr(34) & "roll_sum_Rain" & Chr(34), iPosition:=2) + clsTRRollingSum.AddParameter("result_name", Chr(34) & strRollSumRain & Chr(34), iPosition:=2) clsTRRollingSum.AddParameter("function_exp", clsRFunctionParameter:=clsTRRollingSumFunction, iPosition:=1) clsTRRollingSumFunction.SetPackageName("zoo") clsTRRollingSumFunction.SetRCommand("rollapply") @@ -315,7 +327,7 @@ Public Class dlgStartofRains clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsTRWetSpell.AddParameter("function_exp", clsRFunctionParameter:=clsTRWetSpellFunction, iPosition:=1) clsTRWetSpellFunction.SetRCommand("quantile") - clsTRWetSpellFunction.AddParameter("x", "roll_sum_Rain", iPosition:=0) + clsTRWetSpellFunction.AddParameter("x", strRollSumRain, iPosition:=0) clsTRWetSpellFunction.AddParameter("probs", 0.8, iPosition:=1) clsTRWetSpellFunction.AddParameter("na.rm", "TRUE", iPosition:=2) clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34), iPosition:=2) @@ -323,10 +335,7 @@ Public Class dlgStartofRains clsTRWetSpell.AddParameter("save", "0", iPosition:=6) clsTRWetSpell.SetAssignTo("Wet_Spell") - clsTRParameter.SetArgument(clsTRRollingSum) - - ' What if amount is checked?? - ' move to approp. place + ' clsTRParameter.SetArgument(clsTRRollingSum) ' RAINY DAY @@ -346,8 +355,8 @@ Public Class dlgStartofRains clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34), iPosition:=2) clsRDRollingRainDays.AddParameter("save", 0, iPosition:=6) clsRDRollingRainDays.SetAssignTo("Rolling_rain") - clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) + clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) clsRDParameter.SetArgument(clsRDRollingRainDays) @@ -449,6 +458,39 @@ Public Class dlgStartofRains clsDPParameter.SetArgument(clsDPOverallInterval) + ' Combine Operator + clsCombineOperator.SetOperation("&") + clsCombineOperator.AddParameter("rainfall", clsROperatorParameter:=clsRainCombineOperator, iPosition:=0) + + ' run always + clsRainCombineOperator.SetOperation(">=") + clsRainCombineOperator.AddParameter("rainThreshold", 0.85, iPosition:=1) + + ' run if chkTR is checked + clsCombineOperator.AddParameter("totalrainfall", clsROperatorParameter:=clsTRCombineOperator, iPosition:=1) + clsTRCombineOperator.SetOperation(">") + clsTRCombineOperator.AddParameter("TRLeft", strRollSumRain, iPosition:=0) + + + ' run if chkRD is checked + clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) + clsRDCombineOperator.SetOperation(">=") + clsRDCombineOperator.AddParameter("RDleft", "Rolling_Rain_Days", iPosition:=0) + clsRDCombineOperator.AddParameter("RDMin", 2, iPosition:=1) + + ' run if chkDS is checked + clsCombineOperator.AddParameter("dryspell", clsROperatorParameter:=clsDSCombineOperator, iPosition:=3) + clsDSCombineOperator.SetOperation("<") + clsDSCombineOperator.AddParameter("DSleft", "Dry_Spell", iPosition:=0) + clsDSCombineOperator.AddParameter("DSMax", 10, iPosition:=1) + + ' run if chkDP is checked + ' issue here as everything is hard coded + clsCombineOperator.AddParameter("dryperiod", clsROperatorParameter:=clsDPCombineOperator, iPosition:=4) + clsDPCombineOperator.SetOperation("==") + clsDPCombineOperator.AddParameter("DPleft", "DP_Overall_Interval_Rain", iPosition:=0) + clsDPCombineOperator.AddParameter("DPMax", 0, iPosition:=1) + clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) @@ -472,6 +514,8 @@ Public Class dlgStartofRains ucrReceiverDOY.AddAdditionalCodeParameterPair(clsFirstDOYPerYearOperator, New RParameter("doy", 0), iAdditionalPairNo:=2) ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRainyDaysOperator, New RParameter("Rain", 1), iAdditionalPairNo:=1) ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsDPRainInDaysFunction, New RParameter("data", 0), iAdditionalPairNo:=2) + ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRainCombineOperator, New RParameter("rain", 0), iAdditionalPairNo:=3) + ucrNudThreshold.AddAdditionalCodeParameterPair(clsRainCombineOperator, New RParameter("rainThreshold", 1), iAdditionalPairNo:=1) ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ucrNudFrom.SetRCode(clsDayFromOperator, bReset) @@ -485,6 +529,8 @@ Public Class dlgStartofRains ucrReceiverRainfall.SetRCode(clsTRRollingSumFunction, bReset) + ucrSaveStartofRains.SetRCode(clsFirstDOYPerYear, bReset) + 'Total Rainfall ucrChkTotalRainfall.SetRCode(clsCombinedList, bReset) 'TODO: correct class ucrNudTROverDays.SetRCode(clsTRRollingSumFunction, bReset) @@ -495,22 +541,26 @@ Public Class dlgStartofRains ucrNudRDOutOfDays.SetRCode(clsRDRollingRainDaysFunction, bReset) 'DrySpell - ucrChkDrySpell.SetRCode(clsCombinedList, bReset) 'TODO: correct class + ucrChkDrySpell.SetRCode(clsCombinedList, bReset) ucrNudDSLengthOfTime.SetRCode(clsDSDryPeriodTenFunction, bReset) 'DryPeriod - ucrChkDryPeriod.SetRCode(clsCombinedList, bReset) 'TODO: correct class + ucrChkDryPeriod.SetRCode(clsCombinedList, bReset) ucrNudDPRainPeriod.AddAdditionalCodeParameterPair(clsDPOverallIntervalFunctionOperatorRight, New RParameter("Rain", 0), iAdditionalPairNo:=1) ucrNudDPRainPeriod.SetRCode(clsDPRainInDaysFunction, bReset) ucrNudDPMaxRain.SetRCode(clsDPRainFunctionOperator, bReset) ucrNudDPOverallInterval.SetRCode(clsDPOverallIntervalFunctionOperator, bReset) + + ' Combine + ucrNudRDMinimumDays.SetRCode(clsRDCombineOperator, bReset) + ucrNudDSMaximumDays.SetRCode(clsDSCombineOperator, bReset) + End Sub Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining column(s) as key") clsCombinedFilter.SetAssignTo("combined_filter") - clsFirstDOYPerYear.SetAssignTo("First_doy_per_year") clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear, iPosition:=5) ' if I run this in SetDefaults, will this update automatically @@ -567,8 +617,8 @@ Public Class dlgStartofRains End Sub Private Sub TotalRainyDays() - 'clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) - 'clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) + clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) + clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) End Sub 'issue with width = @@ -593,10 +643,10 @@ Public Class dlgStartofRains strTempFunExpression = strTempFunExpression & "roll_sum_Rain > " If rdoTRAmount.Checked Then strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value - clsCombinedList.RemoveParameterByName("sub4") + 'clsCombinedList.RemoveParameterByName("sub4") ElseIf rdoTRPercentile.Checked Then strTempFunExpression = strTempFunExpression & "wet_spell" - clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) + 'clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) End If strTempFunExpression = strTempFunExpression & " & " 'clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) @@ -604,48 +654,27 @@ Public Class dlgStartofRains 'clsCombinedList.RemoveParameterByName("sub3") End If - Dim clsCombineOperatorTR = New ROperator - Dim clsCombineOperatorRD = New ROperator - Dim clsCombineOperatorDS = New ROperator - Dim clsCombineOperatorDP = New ROperator - - clsCombineOperatorTR.SetOperation("&") - clsCombineOperatorTR.AddParameter("TR", ) ' total rainall - clsCombineOperatorTR.AddParameter("Else", clsROperatorParameter:=clsCombineOperatorRD) ' others - - clsCombineOperatorRD.SetOperation("&") - clsCombineOperatorRD.AddParameter("RD", ) ' Rainy days - clsCombineOperatorRD.AddParameter("Else", clsROperatorParameter:=clsCombineOperatorDS) ' Rainy days - - clsCombineOperatorDS.SetOperation("&") - clsCombineOperatorDS.AddParameter("DS", ) 'Dry spells - clsCombineOperatorDS.AddParameter("Else", clsROperatorParameter:=clsCombineOperatorDP) - - clsCombineOperatorDP.SetOperation("&") - clsCombineOperatorDP.AddParameter("DP", ) ' Dry Period - clsCombineOperatorDP.AddParameter("Else", ) 'clsRFunctionParameter:=) - If ucrChkNumberOfRainyDays.Checked Then - strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & ucrNudRDMinimumDays.Value & " & " + 'strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & ucrNudRDMinimumDays.Value & " & " ' clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) ' param name = sub2, setrcode(clscombinedlist) ' Else ' clsCombinedList.RemoveParameterByName("sub2") End If If ucrChkDrySpell.Checked Then - strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " + 'strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " ' clsCombinedList.AddParameter("sub1", clsRFunctionParameter:=clsDSDryPeriodTen, bIncludeArgumentName:=False) 'Else ' clsCombinedList.RemoveParameterByName("sub1") End If If ucrChkDryPeriod.Checked Then - strTempFunExpression = strTempFunExpression & "DP_Overall_Interval_Rain == 0 " & " & " + 'strTempFunExpression = strTempFunExpression & "DP_Overall_Interval_Rain == 0 " & " & " ' clsCombinedList.AddParameter("sub5", clsRFunctionParameter:=clsDPOverallInterval, bIncludeArgumentName:=False) 'Else ' clsCombinedList.RemoveParameterByName("sub5") End If - strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) + 'strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) End Sub @@ -840,7 +869,7 @@ Public Class dlgStartofRains ' 'If chkTotalRainfall.Checked AndAlso Not ucrReceiverRainfall.IsEmpty Then ' ' clsTRRollingSum.AddParameter("function_exp", Chr(34) & " zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudTROverDays.Value & ", FUN = sum, na.rm = FALSE, align='right', fill=NA)" & Chr(34)) ' ' clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' ' clsTRRollingSum.AddParameter("result_name", Chr(34) & "roll_sum_Rain" & Chr(34)) + ' ' clsTRRollingSum.AddParameter("result_name", Chr(34) & strRollSumRain & Chr(34)) ' ' clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") ' ' clsTRRollingSum.AddParameter("save", 0) ' 'Else From 9763b56abe3ed0f8b8203c0d729ae42397c8188e Mon Sep 17 00:00:00 2001 From: Lily Date: Wed, 21 Jun 2017 13:27:09 +0100 Subject: [PATCH 125/201] fixing string issues --- instat/clsRCodeStructure.vb | 19 ++++++++ instat/clsRFunction.vb | 6 +++ instat/clsROperator.vb | 6 +++ instat/dlgStartofRains.vb | 92 +++++++++++++++++++------------------ 4 files changed, 78 insertions(+), 45 deletions(-) diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index bacb6bfab5c..56a582cd93f 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -102,8 +102,13 @@ Public Class RCodeStructure strAssignToDataFrame = "" strAssignToColumn = "" strAssignToModel = "" + strAssignToGraph = "" + strAssignToTable = "" bToBeAssigned = False bIsAssigned = False + bAssignToIsPrefix = False + bAssignToColumnWithoutNames = False + bInsertColumnBefore = False End Sub Public Overridable Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String @@ -317,6 +322,7 @@ Public Class RCodeStructure 'It will be called only in places where it is necessary ie before ToScript or RemoveAdditionalParameters in ROperator. clsParameters.Sort(AddressOf CompareParametersPosition) End Sub + Private Function CompareParametersPosition(ByVal clsMain As RParameter, ByVal clsRelative As RParameter) As Integer 'Compares two RParameters according to their Position property. If x is "smaller" than y, then return -1, if they are "equal" return 0 else return 1. If clsMain.Position = clsRelative.Position Then @@ -377,8 +383,21 @@ Public Class RCodeStructure Return (clsParameters.FindIndex(Function(x) x.strArgumentName = strParameterName) <> -1) End Function + Public Overridable Sub Clear() + 'todo tidy up iPosition + iPosition = -1 + iCallType = 0 + bExcludeAssignedFunctionOutput = True + 'todo shouldn't this be true by default + bClearFromGlobal = False + bToScriptAsRString = False + RemoveAssignTo() + ClearParameters() + End Sub + Public Overridable Sub ClearParameters() clsParameters.Clear() + iNumberOfAddedParameters = 0 bIsAssigned = False OnParametersChanged() End Sub diff --git a/instat/clsRFunction.vb b/instat/clsRFunction.vb index 26f231a8e45..9dfbe807fae 100644 --- a/instat/clsRFunction.vb +++ b/instat/clsRFunction.vb @@ -83,6 +83,12 @@ Public Class RFunction Return Nothing End Function + Public Overrides Sub Clear() + SetRCommand("") + SetPackageName("") + MyBase.Clear() + End Sub + Public Overrides Sub ClearParameters() MyBase.ClearParameters() End Sub diff --git a/instat/clsROperator.vb b/instat/clsROperator.vb index 8e59e21a27d..1ca03ccc3d0 100644 --- a/instat/clsROperator.vb +++ b/instat/clsROperator.vb @@ -97,6 +97,12 @@ Public Class ROperator OnParametersChanged() End Sub + Public Overrides Sub Clear() + SetOperation("") + bForceIncludeOperation = False + MyBase.Clear() + End Sub + Public Overrides Function Clone() As RCodeStructure Dim clsTempROperator As New ROperator Dim clsRParam As RParameter diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index a8995b9eb03..9e218f6c703 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -130,7 +130,7 @@ Public Class dlgStartofRains ' if checked, then it runs a function: instat_calculation$new TODO: How to do that? Do manually. ' clsRDParameter.SetArgumentName("sub2") ' ucrChkNumberOfRainyDays.SetParameter(clsRDParameter, bNewChangeParameterValue:=False) - ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub2", clsTRRollingSum, 2, False), False) + ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub2", clsRDRollingRainDays, 2, True), False) ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -155,7 +155,6 @@ Public Class dlgStartofRains ucrNudDSMaximumDays.SetParameter(New RParameter("DSMax", 1)) ' what is a min/max for this - ' Dry Period clsDPParameter.SetArgumentName("sub5") ucrChkDryPeriod.SetParameter(clsDPParameter, bNewChangeParameterValue:=False) @@ -189,8 +188,14 @@ Public Class dlgStartofRains End Sub Private Sub SetDefaults() - Dim strRollSumRain As String = "roll_sum_Rain" + Dim strRainDay As String = "rain_day" + Dim strWetSpell As String = "wet_spell" + Dim strRollingRainDays As String = "Rolling_Rain_Days" + Dim strDrySpell As String = "Dry_Spell" + Dim strRainInDays As String = "Rain_in_Days" + Dim strAboveThreshold As String = "Above_Threshold" + Dim strDPOverallIntervalRain As String = "DP_Overall_Interval_Rain" clsAddKey = New RFunction clsAddKeyColName = New RFunction @@ -210,8 +215,8 @@ Public Class dlgStartofRains clsTRWetSpellList = New RFunction clsTRWetSpell = New RFunction clsTRWetSpellFunction = New RFunction - clsRDRollingRainDays = New RFunction - clsRDRollingRainDaysFunction = New RFunction + clsRDRollingRainDays.Clear() + clsRDRollingRainDaysFunction.Clear() clsRDRollingRainDaysSub = New RFunction clsDSDrySpell = New RFunction @@ -278,11 +283,11 @@ Public Class dlgStartofRains clsRainyDaysFunction.SetRCommand("match") clsRainyDaysFunction.AddParameter("x", clsROperatorParameter:=clsRainyDaysOperator, iPosition:=0) clsRainyDaysOperator.SetOperation(">=") - clsRainyDaysOperator.AddParameter("threshold", 0.85, iPosition:=1) ' rain + clsRainyDaysOperator.AddParameter("threshold", 0.85, iPosition:=1) clsRainyDaysFunction.AddParameter("table", "1", iPosition:=1) clsRainyDaysFunction.AddParameter("nomatch", "0", iPosition:=2) '"match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudThreshold.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) - clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=2) + clsRainyDays.AddParameter("result_name", Chr(34) & strRainDay & Chr(34), iPosition:=2) clsRainyDays.AddParameter("save", 0, iPosition:=6) ' First DOY @@ -293,7 +298,7 @@ Public Class dlgStartofRains clsFirstDOYPerYear.AddParameter("function_exp", clsROperatorParameter:=clsFirstDOYPerYearOperator, iPosition:=1) clsFirstDOYPerYearOperator.SetOperation("[") clsFirstDOYPerYearOperator.AddParameter("rightside", "1]", iPosition:=1) - clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34), iPosition:=2) + clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34), iPosition:=2) ' do this right. clsFirstDOYPerYear.AddParameter("save", 2, iPosition:=6) clsFirstDOYPerYear.SetAssignTo(ucrSaveStartofRains.ucrInputTextSave.GetText) @@ -330,7 +335,7 @@ Public Class dlgStartofRains clsTRWetSpellFunction.AddParameter("x", strRollSumRain, iPosition:=0) clsTRWetSpellFunction.AddParameter("probs", 0.8, iPosition:=1) clsTRWetSpellFunction.AddParameter("na.rm", "TRUE", iPosition:=2) - clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34), iPosition:=2) + clsTRWetSpell.AddParameter("result_name", Chr(34) & strWetSpell & Chr(34), iPosition:=2) clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList, iPosition:=5) ' check position clsTRWetSpell.AddParameter("save", "0", iPosition:=6) clsTRWetSpell.SetAssignTo("Wet_Spell") @@ -346,29 +351,29 @@ Public Class dlgStartofRains clsRDRollingRainDays.AddParameter("function_exp", clsRFunctionParameter:=clsRDRollingRainDaysFunction, iPosition:=1) clsRDRollingRainDaysFunction.SetPackageName("zoo") clsRDRollingRainDaysFunction.SetRCommand("rollapply") - clsRDRollingRainDaysFunction.AddParameter("data", "rain_day", iPosition:=0) + clsRDRollingRainDaysFunction.AddParameter("data", strRainDay, iPosition:=0) clsRDRollingRainDaysFunction.AddParameter("width", 2, iPosition:=1) ' default = 2? clsRDRollingRainDaysFunction.AddParameter("FUN", "sum", iPosition:=2) clsRDRollingRainDaysFunction.AddParameter("na.rm", "FALSE", iPosition:=3) clsRDRollingRainDaysFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) clsRDRollingRainDaysFunction.AddParameter("fill", "NA", iPosition:=5) - clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34), iPosition:=2) + clsRDRollingRainDays.AddParameter("result_name", Chr(34) & strRollingRainDays & Chr(34), iPosition:=2) clsRDRollingRainDays.AddParameter("save", 0, iPosition:=6) clsRDRollingRainDays.SetAssignTo("Rolling_rain") clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) - clsRDParameter.SetArgument(clsRDRollingRainDays) + ' clsRDParameter.SetArgument(clsRDRollingRainDays) 'DRY SPELL - clsDSDrySpell.SetRCommand("instat_calculation$new") - clsDSDryPeriodTen.SetRCommand("instat_calculation$new") + clsDSDrySpell.SetRCommand("instat_calculation$New") + clsDSDryPeriodTen.SetRCommand("instat_calculation$New") clsDSDryPeriodTenList.SetRCommand("list") clsDSDrySpellSub.SetRCommand("list") clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34), iPosition:=1) - clsDSDrySpell.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) + clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(" & strRainDay & "==0)-cummax((" & strRainDay & ")*cumsum(" & strRainDay & "== 0))" & Chr(34), iPosition:=1) + clsDSDrySpell.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34), iPosition:=2) clsDSDrySpell.AddParameter("save", 0, iPosition:=6) clsDSDrySpell.SetAssignTo("Dry_Spell") @@ -379,26 +384,27 @@ Public Class dlgStartofRains clsDSDryPeriodTenFunctionLead.AddParameter("x", clsRFunctionParameter:=clsDSDryPeriodTenFunction) clsDSDryPeriodTenFunction.SetPackageName("zoo") clsDSDryPeriodTenFunction.SetRCommand("rollapply") - clsDSDryPeriodTenFunction.AddParameter("data", "Dry_Spell", iPosition:=0) + clsDSDryPeriodTenFunction.AddParameter("data", strDrySpell, iPosition:=0) clsDSDryPeriodTenFunction.AddParameter("width", 30, iPosition:=1) clsDSDryPeriodTenFunction.AddParameter("FUN", "max", iPosition:=2) - clsDSDryPeriodTenFunction.AddParameter("na.rm", "FALSE", iPosition:=3) + clsDSDryPeriodTenFunction.AddParameter("na.rm", "False", iPosition:=3) clsDSDryPeriodTenFunction.AddParameter("align", Chr(39) & "left" & Chr(39), iPosition:=4) clsDSDryPeriodTenFunction.AddParameter("fill", "NA", iPosition:=5) - clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) + clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34), iPosition:=2) clsDSDryPeriodTen.AddParameter("save", 2, iPosition:=6) clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") clsDSParameter.SetArgument(clsDSDryPeriodTen) + 'DRY PERIOD clsDPRainInDaysFunctionLead.bToScriptAsRString = True - clsDPOverallInterval.SetRCommand("instat_calculation$new") + clsDPOverallInterval.SetRCommand("instat_calculation$New") clsDPOverallIntervalList.SetRCommand("list") clsDPRainList.SetRCommand("list") - clsDPRain.SetRCommand("instat_calculation$new") - clsDPRainInDays.SetRCommand("instat_calculation$new") + clsDPRain.SetRCommand("instat_calculation$New") + clsDPRainInDays.SetRCommand("instat_calculation$New") clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) 'width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) @@ -412,7 +418,7 @@ Public Class dlgStartofRains clsDPRainInDaysFunction.AddParameter("na.rm", "FALSE", iPosition:=3) clsDPRainInDaysFunction.AddParameter("align", Chr(39) & "left" & Chr(39), iPosition:=4) clsDPRainInDaysFunction.AddParameter("fill", "NA", iPosition:=5) - clsDPRainInDays.AddParameter("result_name", Chr(34) & "Rain_in_Days" & Chr(34), iPosition:=2) ' sub calc running? + clsDPRainInDays.AddParameter("result_name", Chr(34) & strRainInDays & Chr(34), iPosition:=2) ' sub calc running? clsDPRainInDays.AddParameter("save", "0", iPosition:=6) clsDPRainInDays.SetAssignTo("Rain_Period_Length") @@ -422,12 +428,12 @@ Public Class dlgStartofRains clsDPRainFunction.SetRCommand("match") clsDPRainFunction.AddParameter("x", clsROperatorParameter:=clsDPRainFunctionOperator) clsDPRainFunctionOperator.SetOperation("<=") - clsDPRainFunctionOperator.AddParameter("left", "Rain_in_Days", iPosition:=0) + clsDPRainFunctionOperator.AddParameter("left", strRainInDays, iPosition:=0) clsDPRainFunctionOperator.AddParameter("right", 40, iPosition:=1) clsDPRainFunction.AddParameter("table", 1, iPosition:=1) clsDPRainFunction.AddParameter("nomatch", 0, iPosition:=2) 'Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) - clsDPRain.AddParameter("result_name", Chr(34) & "Above_Threshold" & Chr(34), iPosition:=1) + clsDPRain.AddParameter("result_name", Chr(34) & strAboveThreshold & Chr(34), iPosition:=1) clsDPRain.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPRainList, iPosition:=4) clsDPRain.AddParameter("save", 0, iPosition:=6) clsDPRain.SetAssignTo("Above_Threshold") @@ -440,7 +446,7 @@ Public Class dlgStartofRains clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsDPOverallInterval.AddParameter("function_exp", clsRFunctionParameter:=clsDPOverallIntervalFunction, iPosition:=1) clsDPOverallIntervalFunction.SetRCommand("rollapply") - clsDPOverallIntervalFunction.AddParameter("data", "Above_Threshold", iPosition:=0) + clsDPOverallIntervalFunction.AddParameter("data", strAboveThreshold, iPosition:=0) ' data = Above_Threshold or = strAboveThreshold clsDPOverallIntervalFunction.AddParameter("width", clsROperatorParameter:=clsDPOverallIntervalFunctionOperator, iPosition:=1) clsDPOverallIntervalFunctionOperator.SetOperation("-") clsDPOverallIntervalFunctionOperator.AddParameter("Overall", 45, iPosition:=0) @@ -452,11 +458,11 @@ Public Class dlgStartofRains clsDPOverallIntervalFunction.AddParameter("na.rm", "FALSE", iPosition:=3) clsDPOverallIntervalFunction.AddParameter("align", Chr(39) & "left" & Chr(39), iPosition:=4) clsDPOverallIntervalFunction.AddParameter("fill", "NA", iPosition:=5) - clsDPOverallInterval.AddParameter("result_name", Chr(34) & "DP_Overall_Interval_Rain" & Chr(34), iPosition:=2) + clsDPOverallInterval.AddParameter("result_name", Chr(34) & strDPOverallIntervalRain & Chr(34), iPosition:=2) clsDPOverallInterval.AddParameter("save", "2", iPosition:=6) clsDPOverallInterval.SetAssignTo("Overall_Interval") - clsDPParameter.SetArgument(clsDPOverallInterval) + ' clsDPParameter.SetArgument(clsDPOverallInterval) ' Combine Operator clsCombineOperator.SetOperation("&") @@ -471,24 +477,23 @@ Public Class dlgStartofRains clsTRCombineOperator.SetOperation(">") clsTRCombineOperator.AddParameter("TRLeft", strRollSumRain, iPosition:=0) - ' run if chkRD is checked clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) clsRDCombineOperator.SetOperation(">=") - clsRDCombineOperator.AddParameter("RDleft", "Rolling_Rain_Days", iPosition:=0) + clsRDCombineOperator.AddParameter("RDleft", strRollingRainDays, iPosition:=0) clsRDCombineOperator.AddParameter("RDMin", 2, iPosition:=1) ' run if chkDS is checked clsCombineOperator.AddParameter("dryspell", clsROperatorParameter:=clsDSCombineOperator, iPosition:=3) clsDSCombineOperator.SetOperation("<") - clsDSCombineOperator.AddParameter("DSleft", "Dry_Spell", iPosition:=0) + clsDSCombineOperator.AddParameter("DSleft", strDrySpell, iPosition:=0) clsDSCombineOperator.AddParameter("DSMax", 10, iPosition:=1) ' run if chkDP is checked ' issue here as everything is hard coded clsCombineOperator.AddParameter("dryperiod", clsROperatorParameter:=clsDPCombineOperator, iPosition:=4) clsDPCombineOperator.SetOperation("==") - clsDPCombineOperator.AddParameter("DPleft", "DP_Overall_Interval_Rain", iPosition:=0) + clsDPCombineOperator.AddParameter("DPleft", strDPOverallIntervalRain, iPosition:=0) clsDPCombineOperator.AddParameter("DPMax", 0, iPosition:=1) clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") @@ -498,13 +503,10 @@ Public Class dlgStartofRains ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) 'ucrNudTRAmount.Value = 20 - 'ucrNudDSMaximumDays.Value = 10 'DefaultNudValue() End Sub - 'TODO: start of rains changes discussed with francis. leap() and also nud -1 for something and also left? - 'ine 399 in R-Instat: - 'Add in the lead, this Is because we want to count the NEXT x days with less than y days of rain. Without lead, we were counting the current day + ' in the lead, this Is because we want to count the NEXT x days with less than y days of rain. Without lead, we were counting the current day '2. If the user wishes to start from day 122, then the nud can say 122. BUT, the value that we call has to be 121. This can be fixed properly when we have more time, but for now will do ' does that start from 122 mess up the lead()?? ' add to start of rains to sort the order at the end @@ -645,7 +647,7 @@ Public Class dlgStartofRains strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value 'clsCombinedList.RemoveParameterByName("sub4") ElseIf rdoTRPercentile.Checked Then - strTempFunExpression = strTempFunExpression & "wet_spell" + ' strTempFunExpression = strTempFunExpression & strWetSpell 'clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) End If strTempFunExpression = strTempFunExpression & " & " @@ -655,7 +657,7 @@ Public Class dlgStartofRains End If If ucrChkNumberOfRainyDays.Checked Then - 'strTempFunExpression = strTempFunExpression & "Rolling_Rain_Days >= " & ucrNudRDMinimumDays.Value & " & " + 'strTempFunExpression = strTempFunExpression & strRollingRainDays >= & ucrNudRDMinimumDays.Value & " & " ' clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) ' param name = sub2, setrcode(clscombinedlist) ' Else @@ -858,7 +860,7 @@ Public Class dlgStartofRains ' If ((Not ucrReceiverRainfall.IsEmpty) AndAlso (ucrNudThreshold.Text <> "")) Then ' 'clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) ' 'clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudThreshold.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) - ' 'clsRainyDays.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34)) + ' 'clsRainyDays.AddParameter("result_name", Chr(34) & strRainDay & Chr(34)) ' 'clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")") ' 'clsRainyDays.AddParameter("save", 0) ' ' clsSubRainDays.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) @@ -886,7 +888,7 @@ Public Class dlgStartofRains ' 'If rdoTRPercentile.Checked Then ' ' clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) ' ' clsTRWetSpell.AddParameter("function_exp", Chr(34) & "quantile(roll_sum_Rain, c(" & nudTRPercentile.Value & "), na.rm=T)" & Chr(34)) - ' ' clsTRWetSpell.AddParameter("result_name", Chr(34) & "wet_spell" & Chr(34)) + ' ' clsTRWetSpell.AddParameter("result_name", Chr(34) & strWetSpell & Chr(34)) ' ' clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList) ' ' clsTRWetSpellList.AddParameter("sub1", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) ' ' clsTRWetSpell.AddParameter("save", "0") @@ -904,7 +906,7 @@ Public Class dlgStartofRains ' ' ' If rolling of rain days one is checked Then ' 'clsRDRollingRainDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) ' 'clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data=rain_day, width = " & nudRDOutOfDays.Value & ", FUN = sum, na.rm = FALSE, align = 'right', fill=NA)" & Chr(34)) - ' 'clsRDRollingRainDays.AddParameter("result_name", Chr(34) & "Rolling_Rain_Days" & Chr(34)) + ' 'clsRDRollingRainDays.AddParameter("result_name", Chr(34) & strRollingRainDays & Chr(34)) ' 'clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) ' 'clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) ' 'clsRDRollingRainDays.AddParameter("save", 0) @@ -914,13 +916,13 @@ Public Class dlgStartofRains ' 'If chkDrySpell.Checked Then ' ' clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) ' ' clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34)) - ' ' clsDSDrySpell.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) + ' ' clsDSDrySpell.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34)) ' ' clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub) ' ' clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) ' ' clsDSDrySpell.AddParameter("save", 0) ' ' clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34)) ' ' clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Dry_Spell, width=" & ucrNudDSLengthOfTime.Value & ", FUN=max, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - ' ' clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34)) + ' ' clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34)) ' ' clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList) ' ' clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) ' ' clsDSDryPeriodTen.AddParameter("save", 2) @@ -944,7 +946,7 @@ Public Class dlgStartofRains ' If ucrChkDryPeriod.Checked Then ' ' clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) ' ' clsDPRainInDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - ' ' clsDPRainInDays.AddParameter("result_name", Chr(34) & "Rain_in_Days" & Chr(34)) + ' ' clsDPRainInDays.AddParameter("result_name", Chr(34) & strRainInDays & Chr(34)) ' ' clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") ' ' clsDPRainInDays.AddParameter("save", "0") @@ -957,7 +959,7 @@ Public Class dlgStartofRains ' ' clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34)) ' ' clsDPOverallInterval.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Above_Threshold ,width = (" & nudDPOverallInterval.Value & "-" & nudDPRainPeriod.Value & "+ 1), FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - ' ' clsDPOverallInterval.AddParameter("result_name", Chr(34) & "DP_Overall_Interval_Rain" & Chr(34)) + ' ' clsDPOverallInterval.AddParameter("result_name", Chr(34) & strDPOverallIntervalRain & Chr(34)) ' ' clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList) ' ' clsDPOverallIntervalList.AddParameter("sub1", clsRFunctionParameter:=clsDPRain, bIncludeArgumentName:=False) ' ' clsDPOverallInterval.AddParameter("save", "2") From efa00d4719ffeb381a6e94168eaf425c13994675 Mon Sep 17 00:00:00 2001 From: Lily Date: Wed, 21 Jun 2017 15:54:23 +0100 Subject: [PATCH 126/201] update --- instat/dlgStartofRains.vb | 276 +++++++++++++++---------------- instat/ucrCore.vb | 8 +- instat/ucrGeom.vb | 2 +- instat/ucrSelectorByDataFrame.vb | 2 +- 4 files changed, 142 insertions(+), 146 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 9e218f6c703..a16eaad911a 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -45,7 +45,7 @@ Public Class dlgStartofRains SetRCodeForControls(bReset) bReset = False autoTranslate(Me) - ' TestOKEnabled() + TestOKEnabled() End Sub Private Sub InitialiseDialog() @@ -106,7 +106,8 @@ Public Class dlgStartofRains 'clsTRParameter.SetArgumentName("sub3") 'ucrChkTotalRainfall.SetParameter(clsTRParameter, bNewChangeParameterValue:=False) - ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 2, False), False) + ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 1, False), False) + ucrChkTotalRainfall.AddAdditionalCodeParameterPair(clsTRCombineOperator, New RParameter("totalrainfall", clsTRCombineOperator, 1, False), iAdditionalPairNo:=1) ucrChkTotalRainfall.SetText("Total Rainfall") ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudTROverDays.SetLinkedDisplayControl(lblTROverDays) @@ -130,7 +131,8 @@ Public Class dlgStartofRains ' if checked, then it runs a function: instat_calculation$new TODO: How to do that? Do manually. ' clsRDParameter.SetArgumentName("sub2") ' ucrChkNumberOfRainyDays.SetParameter(clsRDParameter, bNewChangeParameterValue:=False) - ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub2", clsRDRollingRainDays, 2, True), False) + ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub2", clsRDRollingRainDays, 2, False), False) + ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsRDCombineOperator, New RParameter("raindays", 2, False), iAdditionalPairNo:=1) ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -144,8 +146,10 @@ Public Class dlgStartofRains 'ucrNudRDOutOfDays.SetMinMax(1, 366) what is appropriate here? 'Dry Spell - clsDSParameter.SetArgumentName("sub1") - ucrChkDrySpell.SetParameter(clsDSParameter, bNewChangeParameterValue:=False) + 'clsDSParameter.SetArgumentName("sub1") + 'ucrChkDrySpell.SetParameter(clsDSParameter, bNewChangeParameterValue:=False) + ucrChkDrySpell.SetParameter(New RParameter("sub1", clsDSDryPeriodTen, 3, False), False) + ucrChkDrySpell.AddAdditionalCodeParameterPair(clsDSCombineOperator, New RParameter("dryspell", 3, False), iAdditionalPairNo:=1) ucrChkDrySpell.SetText("Dry Spell") ucrChkDrySpell.AddToLinkedControls(ucrNudDSLengthOfTime, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkDrySpell.AddToLinkedControls(ucrNudDSMaximumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -156,8 +160,10 @@ Public Class dlgStartofRains ' what is a min/max for this ' Dry Period - clsDPParameter.SetArgumentName("sub5") - ucrChkDryPeriod.SetParameter(clsDPParameter, bNewChangeParameterValue:=False) + ucrChkDryPeriod.SetParameter(New RParameter("sub5", clsDPOverallInterval, 3, False), False) + ucrChkDryPeriod.AddAdditionalCodeParameterPair(clsDPCombineOperator, New RParameter("dryperiod", 4, False), iAdditionalPairNo:=1) + 'clsDPParameter.SetArgumentName("sub5") + 'ucrChkDryPeriod.SetParameter(clsDPParameter, bNewChangeParameterValue:=False) ucrChkDryPeriod.SetText("Dry Period") ucrNudDPRainPeriod.SetParameter(New RParameter("width", 1)) @@ -174,7 +180,6 @@ Public Class dlgStartofRains ucrChkDryPeriod.AddToLinkedControls(ucrNudDPOverallInterval, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkDryPeriod.AddToLinkedControls(ucrNudDPRainPeriod, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrReceiverYear.Selector = ucrSelectorForStartofRains ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) ucrReceiverYear.bAutoFill = True @@ -197,55 +202,54 @@ Public Class dlgStartofRains Dim strAboveThreshold As String = "Above_Threshold" Dim strDPOverallIntervalRain As String = "DP_Overall_Interval_Rain" - clsAddKey = New RFunction - clsAddKeyColName = New RFunction - clsDayFromAndTo = New RFunction - clsDayFromAndToOperator = New ROperator - clsGroupBy = New RFunction - clsRainyDays = New RFunction - clsRainyDaysFunction = New RFunction - clsRainyDaysOperator = New ROperator - clsFirstDOYPerYear = New RFunction - clsFirstDOYPerYearOperator = New ROperator - clsCombinedFilter = New RFunction - clsCombinedList = New RFunction - - clsTRRollingSum = New RFunction - clsTRRollingSumFunction = New RFunction - clsTRWetSpellList = New RFunction - clsTRWetSpell = New RFunction - clsTRWetSpellFunction = New RFunction + clsAddKey.Clear() + clsAddKeyColName.Clear() + clsDayFromAndTo.Clear() + clsDayFromAndToOperator.Clear() + clsGroupBy.Clear() + clsRainyDays.Clear() + clsRainyDaysFunction.Clear() + clsRainyDaysOperator.Clear() + clsFirstDOYPerYear.Clear() + clsFirstDOYPerYearOperator.Clear() + clsCombinedFilter.Clear() + clsCombinedList.Clear() + + clsTRRollingSum.Clear() + clsTRRollingSumFunction.Clear() + clsTRWetSpellList.Clear() + clsTRWetSpell.Clear() + clsTRWetSpellFunction.Clear() clsRDRollingRainDays.Clear() clsRDRollingRainDaysFunction.Clear() - clsRDRollingRainDaysSub = New RFunction - - clsDSDrySpell = New RFunction - clsDSDryPeriodTenList = New RFunction - clsDSDryPeriodTen = New RFunction - clsDSDryPeriodTenFunction = New RFunction - clsDSDrySpellSub = New RFunction - clsDSDryPeriodTenFunctionLead = New RFunction - - clsDPRainInDays = New RFunction - clsDPRain = New RFunction - clsDPOverallIntervalList = New RFunction - clsDPOverallInterval = New RFunction - clsDPOverallIntervalFunction = New RFunction - clsDPRainInDaysFunctionLead = New RFunction - clsDPRainInDaysFunction = New RFunction - clsDPRainFunction = New RFunction - clsDPRainFunctionOperator = New ROperator - clsDPOverallIntervalFunction = New RFunction - clsDPOverallIntervalFunctionOperator = New ROperator - clsDPOverallIntervalFunctionOperatorRight = New ROperator - clsApplyInstatFunction = New RFunction - - 'Combine - clsCombineOperator = New ROperator - clsTRCombineOperator = New ROperator - clsRDCombineOperator = New ROperator - clsDSCombineOperator = New ROperator - clsDPCombineOperator = New ROperator + clsRDRollingRainDaysSub.Clear() + + clsDSDrySpell.Clear() + clsDSDryPeriodTenList.Clear() + clsDSDryPeriodTen.Clear() + clsDSDryPeriodTenFunction.Clear() + clsDSDrySpellSub.Clear() + clsDSDryPeriodTenFunctionLead.Clear() + + clsDPRainInDays.Clear() + clsDPRain.Clear() + clsDPOverallIntervalList.Clear() + clsDPOverallInterval.Clear() + clsDPOverallIntervalFunction.Clear() + clsDPRainInDaysFunctionLead.Clear() + clsDPRainInDaysFunction.Clear() + clsDPRainFunction.Clear() + clsDPRainFunctionOperator.Clear() + clsDPOverallIntervalFunction.Clear() + clsDPOverallIntervalFunctionOperator.Clear() + clsDPOverallIntervalFunctionOperatorRight.Clear() + clsApplyInstatFunction.Clear() + + clsCombineOperator.Clear() + clsTRCombineOperator.Clear() + clsRDCombineOperator.Clear() + clsDSCombineOperator.Clear() + clsDPCombineOperator.Clear() ucrReceiverDate.SetMeAsReceiver() ucrSaveStartofRains.Reset() @@ -290,24 +294,6 @@ Public Class dlgStartofRains clsRainyDays.AddParameter("result_name", Chr(34) & strRainDay & Chr(34), iPosition:=2) clsRainyDays.AddParameter("save", 0, iPosition:=6) - ' First DOY - clsFirstDOYPerYearOperator.bToScriptAsRString = True - clsFirstDOYPerYear.SetRCommand("instat_calculation$new") - clsManipulationFirstDOYPerYear.SetRCommand("list") - clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) - clsFirstDOYPerYear.AddParameter("function_exp", clsROperatorParameter:=clsFirstDOYPerYearOperator, iPosition:=1) - clsFirstDOYPerYearOperator.SetOperation("[") - clsFirstDOYPerYearOperator.AddParameter("rightside", "1]", iPosition:=1) - clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34), iPosition:=2) ' do this right. - clsFirstDOYPerYear.AddParameter("save", 2, iPosition:=6) - clsFirstDOYPerYear.SetAssignTo(ucrSaveStartofRains.ucrInputTextSave.GetText) - - ' Combined filter - clsCombinedList.SetRCommand("list") - clsCombinedFilter.SetRCommand("instat_calculation$new") - clsCombinedFilter.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) - clsCombinedFilter.AddParameter("sub_calculations", clsRFunctionParameter:=clsCombinedList) - 'TOTAL RAINFALL: associated with ucrChkTRTotalRainfall clsTRRollingSumFunction.bToScriptAsRString = True clsTRRollingSum.SetRCommand("instat_calculation$new") @@ -328,6 +314,7 @@ Public Class dlgStartofRains ' this function is associated with that rdo. clsTRWetSpellFunction.bToScriptAsRString = True clsTRWetSpellList.SetRCommand("list") + clsTRWetSpellList.AddParameter("sub1", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) clsTRWetSpell.SetRCommand("instat_calculation$new") clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsTRWetSpell.AddParameter("function_exp", clsRFunctionParameter:=clsTRWetSpellFunction, iPosition:=1) @@ -340,9 +327,6 @@ Public Class dlgStartofRains clsTRWetSpell.AddParameter("save", "0", iPosition:=6) clsTRWetSpell.SetAssignTo("Wet_Spell") - ' clsTRParameter.SetArgument(clsTRRollingSum) - - ' RAINY DAY clsRDRollingRainDaysFunction.bToScriptAsRString = True clsRDRollingRainDays.SetRCommand("instat_calculation$new") @@ -363,8 +347,6 @@ Public Class dlgStartofRains clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) - ' clsRDParameter.SetArgument(clsRDRollingRainDays) - 'DRY SPELL clsDSDrySpell.SetRCommand("instat_calculation$New") clsDSDryPeriodTen.SetRCommand("instat_calculation$New") @@ -372,6 +354,7 @@ Public Class dlgStartofRains clsDSDrySpellSub.SetRCommand("list") clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + 'TODO: Sort below code out clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(" & strRainDay & "==0)-cummax((" & strRainDay & ")*cumsum(" & strRainDay & "== 0))" & Chr(34), iPosition:=1) clsDSDrySpell.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34), iPosition:=2) clsDSDrySpell.AddParameter("save", 0, iPosition:=6) @@ -394,10 +377,6 @@ Public Class dlgStartofRains clsDSDryPeriodTen.AddParameter("save", 2, iPosition:=6) clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") - clsDSParameter.SetArgument(clsDSDryPeriodTen) - - - 'DRY PERIOD clsDPRainInDaysFunctionLead.bToScriptAsRString = True clsDPOverallInterval.SetRCommand("instat_calculation$New") @@ -461,40 +440,73 @@ Public Class dlgStartofRains clsDPOverallInterval.AddParameter("result_name", Chr(34) & strDPOverallIntervalRain & Chr(34), iPosition:=2) clsDPOverallInterval.AddParameter("save", "2", iPosition:=6) clsDPOverallInterval.SetAssignTo("Overall_Interval") - ' clsDPParameter.SetArgument(clsDPOverallInterval) - ' Combine Operator + ' Combined filter + clsCombinedList.SetRCommand("list") + clsCombinedFilter.SetRCommand("instat_calculation$new") + clsCombinedFilter.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) + clsCombinedFilter.AddParameter("sub_calculations", clsRFunctionParameter:=clsCombinedList, iPosition:=5) + clsCombinedFilter.SetAssignTo("combined_filter") + clsCombineOperator.bToScriptAsRString = True + clsCombinedFilter.AddParameter("function_exp", clsROperatorParameter:=clsCombineOperator) clsCombineOperator.SetOperation("&") - clsCombineOperator.AddParameter("rainfall", clsROperatorParameter:=clsRainCombineOperator, iPosition:=0) ' run always + ' clsCombineOperator.AddParameter("rainfall", clsROperatorParameter:=clsRainCombineOperator, iPosition:=0) clsRainCombineOperator.SetOperation(">=") clsRainCombineOperator.AddParameter("rainThreshold", 0.85, iPosition:=1) ' run if chkTR is checked - clsCombineOperator.AddParameter("totalrainfall", clsROperatorParameter:=clsTRCombineOperator, iPosition:=1) + ' clsCombineOperator.AddParameter("totalrainfall", clsROperatorParameter:=clsTRCombineOperator, iPosition:=1) clsTRCombineOperator.SetOperation(">") clsTRCombineOperator.AddParameter("TRLeft", strRollSumRain, iPosition:=0) + + + ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRPercentile, "TRRight", 20) + ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRAmount, "TRRight", strWetSpell) + + clsTRCombineOperator.AddParameter("TRRight", 20, iPosition:=1) ' ucrNudTRAmount + clsTRCombineOperator.AddParameter("TRRight", strWetSpell, iPosition:=1) + + + + 'If rdoTRAmount.Checked Then ucrNudTRAmount + 'ElseIf rdoTRPercentile.Checked Then strWetSpell + ' run if chkRD is checked - clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) + ' clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) clsRDCombineOperator.SetOperation(">=") clsRDCombineOperator.AddParameter("RDleft", strRollingRainDays, iPosition:=0) clsRDCombineOperator.AddParameter("RDMin", 2, iPosition:=1) ' run if chkDS is checked - clsCombineOperator.AddParameter("dryspell", clsROperatorParameter:=clsDSCombineOperator, iPosition:=3) + ' clsCombineOperator.AddParameter("dryspell", clsROperatorParameter:=clsDSCombineOperator, iPosition:=3) clsDSCombineOperator.SetOperation("<") clsDSCombineOperator.AddParameter("DSleft", strDrySpell, iPosition:=0) clsDSCombineOperator.AddParameter("DSMax", 10, iPosition:=1) ' run if chkDP is checked ' issue here as everything is hard coded - clsCombineOperator.AddParameter("dryperiod", clsROperatorParameter:=clsDPCombineOperator, iPosition:=4) - clsDPCombineOperator.SetOperation("==") - clsDPCombineOperator.AddParameter("DPleft", strDPOverallIntervalRain, iPosition:=0) - clsDPCombineOperator.AddParameter("DPMax", 0, iPosition:=1) + '' clsCombineOperator.AddParameter("dryperiod", clsROperatorParameter:=clsDPCombineOperator, iPosition:=4) + 'clsDPCombineOperator.SetOperation("==") + 'clsDPCombineOperator.AddParameter("DPleft", strDPOverallIntervalRain, iPosition:=0) + 'clsDPCombineOperator.AddParameter("DPMax", 0, iPosition:=1) + + + ' First DOY + clsFirstDOYPerYearOperator.bToScriptAsRString = True + clsFirstDOYPerYear.SetRCommand("instat_calculation$new") + clsManipulationFirstDOYPerYear.SetRCommand("list") + clsManipulationFirstDOYPerYear.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) + clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) + clsFirstDOYPerYear.AddParameter("function_exp", clsROperatorParameter:=clsFirstDOYPerYearOperator, iPosition:=1) + clsFirstDOYPerYearOperator.SetOperation("[") + clsFirstDOYPerYearOperator.AddParameter("rightside", "1]", iPosition:=1) + clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34), iPosition:=2) ' do this right. + clsFirstDOYPerYear.AddParameter("save", 2, iPosition:=6) + clsFirstDOYPerYear.SetAssignTo(ucrSaveStartofRains.ucrInputTextSave.GetText) clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) @@ -502,7 +514,6 @@ Public Class dlgStartofRains 'Base Function ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) - 'ucrNudTRAmount.Value = 20 'DefaultNudValue() End Sub @@ -519,7 +530,7 @@ Public Class dlgStartofRains ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRainCombineOperator, New RParameter("rain", 0), iAdditionalPairNo:=3) ucrNudThreshold.AddAdditionalCodeParameterPair(clsRainCombineOperator, New RParameter("rainThreshold", 1), iAdditionalPairNo:=1) - ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) + ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ' false in these brackets, when in initialise ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) @@ -529,14 +540,11 @@ Public Class dlgStartofRains ucrReceiverDate.SetRCode(clsAddKeyColName, bReset) ucrSelectorForStartofRains.SetRCode(clsAddKey, bReset) - ucrReceiverRainfall.SetRCode(clsTRRollingSumFunction, bReset) - - ucrSaveStartofRains.SetRCode(clsFirstDOYPerYear, bReset) - 'Total Rainfall ucrChkTotalRainfall.SetRCode(clsCombinedList, bReset) 'TODO: correct class ucrNudTROverDays.SetRCode(clsTRRollingSumFunction, bReset) ucrNudTRPercentile.SetRCode(clsTRWetSpellFunction, bReset) + ucrReceiverRainfall.SetRCode(clsTRRollingSumFunction, bReset) 'Rain Days ucrChkNumberOfRainyDays.SetRCode(clsCombinedList, bReset) @@ -561,14 +569,12 @@ Public Class dlgStartofRains Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining column(s) as key") - clsCombinedFilter.SetAssignTo("combined_filter") clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear, iPosition:=5) ' if I run this in SetDefaults, will this update automatically + clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear, iPosition:=5) clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")", iPosition:=4) clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear, iPosition:=0) - If ucrChkTotalRainfall.Checked Then TotalRainfall() End If @@ -580,8 +586,6 @@ Public Class dlgStartofRains If ucrChkDryPeriod.Checked Then DryPeriod() End If - - CombinedFilter() End Sub Private Sub RainDays() @@ -594,8 +598,6 @@ Public Class dlgStartofRains Private Sub TotalRainfall() clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=0) - ' if quantiles checked: - clsTRWetSpellList.AddParameter("sub1", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) End Sub Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged @@ -605,13 +607,11 @@ Public Class dlgStartofRains End Sub Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged - ' does this update if I change the data name? If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") Else clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") End If - clsManipulationFirstDOYPerYear.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) End Sub Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForStartofRains.ControlContentsChanged @@ -624,7 +624,6 @@ Public Class dlgStartofRains End Sub 'issue with width = - Private Sub DrySpell() clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList, iPosition:=5) @@ -639,22 +638,22 @@ Public Class dlgStartofRains Private Sub CombinedFilter() Dim strTempFunExpression As String = Chr(34) - clsCombinedFilter.RemoveParameterByName("function_exp") - - If ucrChkTotalRainfall.Checked Then - strTempFunExpression = strTempFunExpression & "roll_sum_Rain > " - If rdoTRAmount.Checked Then - strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value - 'clsCombinedList.RemoveParameterByName("sub4") - ElseIf rdoTRPercentile.Checked Then - ' strTempFunExpression = strTempFunExpression & strWetSpell - 'clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) - End If - strTempFunExpression = strTempFunExpression & " & " - 'clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) - Else - 'clsCombinedList.RemoveParameterByName("sub3") - End If + 'clsCombinedFilter.RemoveParameterByName("function_exp") + + 'If ucrChkTotalRainfall.Checked Then + ' strTempFunExpression = strTempFunExpression & "roll_sum_Rain > " + ' If rdoTRAmount.Checked Then + ' strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value + ' 'clsCombinedList.RemoveParameterByName("sub4") + ' ElseIf rdoTRPercentile.Checked Then + ' ' strTempFunExpression = strTempFunExpression & strWetSpell + 'clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) + 'End If + ' strTempFunExpression = strTempFunExpression & " & " + ' 'clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) + 'Else + ' 'clsCombinedList.RemoveParameterByName("sub3") + 'End If If ucrChkNumberOfRainyDays.Checked Then 'strTempFunExpression = strTempFunExpression & strRollingRainDays >= & ucrNudRDMinimumDays.Value & " & " @@ -678,14 +677,22 @@ Public Class dlgStartofRains 'strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) - clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) + 'clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) End Sub - Private Sub ucrChkDryPeriod_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDryPeriod.ControlValueChanged, ucrChkDrySpell.ControlValueChanged, ucrChkNumberOfRainyDays.ControlValueChanged, ucrChkTotalRainfall.ControlValueChanged - CombinedFilter() - + Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset + SetDefaults() + SetRCodeForControls(True) + TestOKEnabled() End Sub + Private Sub TestOKEnabled() + ' 'If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.Text <> "" AndAlso ucrNudFrom.Text = "" AndAlso ucrNudTo.Text = "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.Text <> "" AndAlso ucrNudRDOutOfDays.Text <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso Not ucrNudTROverDays.GetText = "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.Text <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.Text = ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((chkDrySpell.Checked AndAlso nudDSMaximumDays.Text <> "" AndAlso ucrNudDSLengthOfTime.Text <> "") OrElse Not chkDrySpell.Checked) AndAlso ((chkDryPeriod.Checked AndAlso nudDPMaxRain.Text <> "" AndAlso nudDPRainPeriod.Text <> "" AndAlso nudDPOverallInterval.Text <> "") OrElse Not chkDryPeriod.Checked) Then + ' ' ucrBase.OKEnabled(True) + ' 'Else + ' ' ucrBase.OKEnabled(False) + ' 'End If + End Sub @@ -713,19 +720,6 @@ Public Class dlgStartofRains 'End Sub - 'Private Sub TestOKEnabled() - ' 'If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.Text <> "" AndAlso ucrNudFrom.Text = "" AndAlso ucrNudTo.Text = "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.Text <> "" AndAlso ucrNudRDOutOfDays.Text <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso Not ucrNudTROverDays.GetText = "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.Text <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.Text = ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((chkDrySpell.Checked AndAlso nudDSMaximumDays.Text <> "" AndAlso ucrNudDSLengthOfTime.Text <> "") OrElse Not chkDrySpell.Checked) AndAlso ((chkDryPeriod.Checked AndAlso nudDPMaxRain.Text <> "" AndAlso nudDPRainPeriod.Text <> "" AndAlso nudDPOverallInterval.Text <> "") OrElse Not chkDryPeriod.Checked) Then - ' ' ucrBase.OKEnabled(True) - ' 'Else - ' ' ucrBase.OKEnabled(False) - ' 'End If - 'End Sub ' ucrNudDPRainPeriod, ucrNudDPMaxRain, ucrNudDPOverallInterval - - 'Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - ' SetDefaults() - ' SetRCodeForControls(True) - ' TestOKEnabled() - 'End Sub 'Private Sub grpRainParameters_Enter(sender As Object, e As EventArgs) ' RainyDaysMethod() diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index 9c073f826c9..b11332e4bfe 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -221,14 +221,16 @@ Public Class ucrCore UpdateLinkedControls(bReset) End Sub - Public Overridable Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False) + Public Overridable Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True) If clsRCode Is Nothing OrElse Not clsRCode.Equals(clsNewCodeStructure) Then clsRCode = clsNewCodeStructure - If bUpdateRCodeFromControl AndAlso CanUpdate() Then + If bUpdateRCodeFromControl AndAlso CanUpdate() Then 'andalso bUpdate? UpdateRCode(bReset) End If End If - UpdateControl(bReset) + If bUpdate Then + UpdateControl(bReset) + End If End Sub 'TODO in future may want to set RCode and RSyntax together if both needed for conditions diff --git a/instat/ucrGeom.vb b/instat/ucrGeom.vb index f6a2d6558cd..0a7813b9699 100644 --- a/instat/ucrGeom.vb +++ b/instat/ucrGeom.vb @@ -42,7 +42,7 @@ Public Class ucrGeom CreateGeomList() End Sub - Public Overrides Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False) + Public Overrides Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True) Dim clsTempFunc As RFunction Dim iGeomIndex As Integer diff --git a/instat/ucrSelectorByDataFrame.vb b/instat/ucrSelectorByDataFrame.vb index 1b1630fed81..286efdd6c82 100644 --- a/instat/ucrSelectorByDataFrame.vb +++ b/instat/ucrSelectorByDataFrame.vb @@ -132,7 +132,7 @@ Public Class ucrSelectorByDataFrame End If End Function - Public Overrides Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False) + Public Overrides Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True) MyBase.SetRCode(clsNewCodeStructure, bReset) ucrAvailableDataFrames.SetRCode(clsNewCodeStructure, bReset) End Sub From 3f572bd1050b687240a6e41ea499e11c90c8cf4c Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Wed, 21 Jun 2017 16:21:26 +0100 Subject: [PATCH 127/201] fixed bugs in refreshing grid in import dialog fixed directory bugs fixed bug in ucrSave auto sizing fixed bug in ucrNud's IsRDefault() --- instat/dlgImportDataset.Designer.vb | 10 --- instat/dlgImportDataset.vb | 131 +++++++++++++++++++++------- instat/ucrCore.vb | 2 +- instat/ucrNud.vb | 17 ++++ instat/ucrSave.vb | 15 ++-- 5 files changed, 122 insertions(+), 53 deletions(-) diff --git a/instat/dlgImportDataset.Designer.vb b/instat/dlgImportDataset.Designer.vb index 4e648a0c582..48e8084b819 100644 --- a/instat/dlgImportDataset.Designer.vb +++ b/instat/dlgImportDataset.Designer.vb @@ -415,7 +415,6 @@ Partial Class dlgImportDataset ' 'ucrInputMaxRowsExcel ' - Me.ucrInputMaxRowsExcel.AddQuotesIfUnrecognised = True Me.ucrInputMaxRowsExcel.IsMultiline = False Me.ucrInputMaxRowsExcel.IsReadOnly = False Me.ucrInputMaxRowsExcel.Location = New System.Drawing.Point(6, 194) @@ -425,7 +424,6 @@ Partial Class dlgImportDataset ' 'ucrInputMissingValueStringExcel ' - Me.ucrInputMissingValueStringExcel.AddQuotesIfUnrecognised = True Me.ucrInputMissingValueStringExcel.IsMultiline = False Me.ucrInputMissingValueStringExcel.IsReadOnly = False Me.ucrInputMissingValueStringExcel.Location = New System.Drawing.Point(10, 90) @@ -435,7 +433,6 @@ Partial Class dlgImportDataset ' 'ucrInputNamedRegions ' - Me.ucrInputNamedRegions.AddQuotesIfUnrecognised = True Me.ucrInputNamedRegions.IsReadOnly = False Me.ucrInputNamedRegions.Location = New System.Drawing.Point(10, 90) Me.ucrInputNamedRegions.Name = "ucrInputNamedRegions" @@ -444,7 +441,6 @@ Partial Class dlgImportDataset ' 'ucrInputSelectSheetExcel ' - Me.ucrInputSelectSheetExcel.AddQuotesIfUnrecognised = True Me.ucrInputSelectSheetExcel.IsReadOnly = False Me.ucrInputSelectSheetExcel.Location = New System.Drawing.Point(6, 43) Me.ucrInputSelectSheetExcel.Name = "ucrInputSelectSheetExcel" @@ -543,7 +539,6 @@ Partial Class dlgImportDataset ' 'ucrInputHeadersCSV ' - Me.ucrInputHeadersCSV.AddQuotesIfUnrecognised = True Me.ucrInputHeadersCSV.IsReadOnly = False Me.ucrInputHeadersCSV.Location = New System.Drawing.Point(9, 82) Me.ucrInputHeadersCSV.Name = "ucrInputHeadersCSV" @@ -552,7 +547,6 @@ Partial Class dlgImportDataset ' 'ucrInputNAStringsCSV ' - Me.ucrInputNAStringsCSV.AddQuotesIfUnrecognised = True Me.ucrInputNAStringsCSV.IsMultiline = False Me.ucrInputNAStringsCSV.IsReadOnly = False Me.ucrInputNAStringsCSV.Location = New System.Drawing.Point(117, 236) @@ -562,7 +556,6 @@ Partial Class dlgImportDataset ' 'ucrInputDecimalCSV ' - Me.ucrInputDecimalCSV.AddQuotesIfUnrecognised = True Me.ucrInputDecimalCSV.IsReadOnly = False Me.ucrInputDecimalCSV.Location = New System.Drawing.Point(74, 196) Me.ucrInputDecimalCSV.Name = "ucrInputDecimalCSV" @@ -571,7 +564,6 @@ Partial Class dlgImportDataset ' 'ucrInputSeparatorCSV ' - Me.ucrInputSeparatorCSV.AddQuotesIfUnrecognised = True Me.ucrInputSeparatorCSV.IsReadOnly = False Me.ucrInputSeparatorCSV.Location = New System.Drawing.Point(74, 154) Me.ucrInputSeparatorCSV.Name = "ucrInputSeparatorCSV" @@ -580,7 +572,6 @@ Partial Class dlgImportDataset ' 'ucrInputEncodingCSV ' - Me.ucrInputEncodingCSV.AddQuotesIfUnrecognised = True Me.ucrInputEncodingCSV.IsReadOnly = False Me.ucrInputEncodingCSV.Location = New System.Drawing.Point(62, 25) Me.ucrInputEncodingCSV.Name = "ucrInputEncodingCSV" @@ -589,7 +580,6 @@ Partial Class dlgImportDataset ' 'ucrInputFilePath ' - Me.ucrInputFilePath.AddQuotesIfUnrecognised = True Me.ucrInputFilePath.IsMultiline = False Me.ucrInputFilePath.IsReadOnly = False Me.ucrInputFilePath.Location = New System.Drawing.Point(39, 23) diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index c97d5fcae81..7cdbb28193e 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -63,13 +63,25 @@ Public Class dlgImportDataset End If SetRCodeForControls(bReset) If strFileToOpenOn <> "" Then - SetControlsFromFile(strFileToOpenOn) + If Not File.Exists(strFileToOpenOn) Then + MsgBox("File no longer exists: " & strFileToOpenOn) + SetControlsFromFile("") + Else + SetControlsFromFile(strFileToOpenOn) + End If bStartOpenDialog = False strFileToOpenOn = "" ElseIf bStartOpenDialog Then GetFileFromOpenDialog() bStartOpenDialog = False + Else + If Not File.Exists(strFilePathSystem) Then + MsgBox("File no longer exists: " & strFilePathSystem, MsgBoxStyle.Information, "File No Longer Exists") + SetControlsFromFile("") + End If End If + RefreshFilePreview() + RefreshFrameView() bReset = False TestOkEnabled() End Sub @@ -156,8 +168,7 @@ Public Class dlgImportDataset ucrChkStringsAsFactorsCSV.SetText("Convert Strings to Factor Columns") ucrChkStringsAsFactorsCSV.SetParameter(New RParameter("stringsAsFactors"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkStringsAsFactorsCSV.AddFunctionNamesCondition(True, "import") - ucrChkStringsAsFactorsCSV.AddFunctionNamesCondition(False, "import", False) + ucrChkStringsAsFactorsCSV.SetRDefault("FALSE") ucrInputNAStringsCSV.SetParameter(New RParameter("na.strings")) ucrInputNAStringsCSV.SetRDefault(Chr(34) & "NA" & Chr(34)) @@ -176,16 +187,16 @@ Public Class dlgImportDataset dctucrInputSeparatorCSV.Add("Whitespace", Chr(34) & " " & Chr(34)) dctucrInputSeparatorCSV.Add("Colon(:)", Chr(34) & ":" & Chr(34)) dctucrInputSeparatorCSV.Add("Semi-Colon(;)", Chr(34) & ";" & Chr(34)) - dctucrInputSeparatorCSV.Add("Vertcal-Line", Chr(34) & "|" & Chr(34)) - dctucrInputSeparatorCSV.Add("Power", Chr(34) & "^" & Chr(34)) + dctucrInputSeparatorCSV.Add("Vertcal-Line(|)", Chr(34) & "|" & Chr(34)) + dctucrInputSeparatorCSV.Add("Caret(^)", Chr(34) & "^" & Chr(34)) ucrInputSeparatorCSV.SetItems(dctucrInputSeparatorCSV) ucrInputSeparatorCSV.SetRDefault(Chr(34) & "auto" & Chr(34)) ucrInputSeparatorCSV.bAllowNonConditionValues = True ucrInputHeadersCSV.SetParameter(New RParameter("header")) dctucrInputHeadersCSV.Add("Automatic", Chr(34) & "auto" & Chr(34)) - dctucrInputHeadersCSV.Add("Yes", Chr(34) & "TRUE" & Chr(34)) - dctucrInputHeadersCSV.Add("No", Chr(34) & "FALSE" & Chr(34)) + dctucrInputHeadersCSV.Add("Yes", "TRUE") + dctucrInputHeadersCSV.Add("No", "FALSE") ucrInputHeadersCSV.SetItems(dctucrInputHeadersCSV) ucrInputHeadersCSV.SetRDefault(Chr(34) & "auto" & Chr(34)) ucrInputHeadersCSV.SetDropDownStyleAsNonEditable() @@ -226,11 +237,12 @@ Public Class dlgImportDataset ucrNudRowsToSkipExcel.SetRDefault(0) ucrChkMaxRowsExcel.SetText("Maximum Rows To Import") - ucrInputMaxRowsExcel.SetParameter(New RParameter("n_max")) + ucrChkMaxRowsExcel.AddParameterPresentCondition(True, "n_max", True) ucrChkMaxRowsExcel.AddParameterPresentCondition(False, "n_max", False) - ucrInputMaxRowsExcel.AddQuotesIfUnrecognised = False + ucrChkMaxRowsExcel.AddToLinkedControls(ucrInputMaxRowsExcel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1000000) - ucrChkMaxRowsExcel.AddToLinkedControls(ucrInputMaxRowsExcel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=100000) + ucrInputMaxRowsExcel.SetParameter(New RParameter("n_max")) + ucrInputMaxRowsExcel.AddQuotesIfUnrecognised = False 'hide since no longer using openxlsx package ucrInputNamedRegions.Hide() @@ -251,6 +263,7 @@ Public Class dlgImportDataset clsImportCSV.SetPackageName("rio") clsImportCSV.SetRCommand("import") + clsImportCSV.AddParameter("stringsAsFactors", "TRUE") clsImport.SetPackageName("rio") clsImport.SetRCommand("import") @@ -270,6 +283,8 @@ Public Class dlgImportDataset clsImportRDS.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$import_RDS") + ucrNudPreviewLines.Value = 10 + grpCSV.Hide() grpRDS.Hide() grpExcel.Hide() @@ -279,6 +294,7 @@ Public Class dlgImportDataset lblCannotImport.Hide() lblDataFrame.Hide() grdDataPreview.Hide() + ucrSaveFile.Hide() End Sub 'Private Sub ucrInputName_NameChanged() Handles ucrInputName.ControlValueChanged @@ -316,7 +332,7 @@ Public Class dlgImportDataset Else dlgOpen.Title = "Open Data from file" If strCurrentDirectory <> "" Then - dlgOpen.InitialDirectory = Path.GetDirectoryName(strCurrentDirectory) + dlgOpen.InitialDirectory = strCurrentDirectory Else dlgOpen.InitialDirectory = frmMain.clsInstatOptions.strWorkingDirectory End If @@ -368,6 +384,7 @@ Public Class dlgImportDataset ucrInputEncodingCSV.SetRCode(clsImportCSV, bReset) ucrChkStringsAsFactorsCSV.SetRCode(clsImportCSV, bReset) ucrInputNAStringsCSV.SetRCode(clsImportCSV, bReset) + ucrNudLinesToSkipCSV.SetRCode(clsImportCSV, bReset) ucrChkImportChangesLogRDS.SetRCode(clsImportRDS, bReset) ucrChkKeepExistingDataRDS.SetRCode(clsImportRDS, bReset) @@ -403,11 +420,20 @@ Public Class dlgImportDataset Public Sub SetControlsFromFile(strFilePath As String) Dim strFileExt As String Dim strFileName As String - - strFileName = Path.GetFileNameWithoutExtension(strFilePath) - strFileExt = Path.GetExtension(strFilePath).ToLower() - strFilePathSystem = strFilePath - strFilePathR = Replace(strFilePath, "\", "/") + Dim strValidName As String + + If strFilePath <> "" Then + strFileName = Path.GetFileNameWithoutExtension(strFilePath) + strFileExt = Path.GetExtension(strFilePath).ToLower() + strFilePathSystem = strFilePath + strFilePathR = Replace(strFilePath, "\", "/") + strCurrentDirectory = Path.GetDirectoryName(strFilePath) + Else + strFileName = "" + strFileExt = "" + strFilePathSystem = "" + strFilePathR = "" + End If ucrInputFilePath.SetName(strFilePathR) @@ -430,19 +456,28 @@ Public Class dlgImportDataset TextPreviewVisible(True) grpCSV.Show() ElseIf strFileExt = ".dat" Then + strFileType = "DAT" clsImportDAT.AddParameter("file", Chr(34) & strFilePathR & Chr(34)) ucrBase.clsRsyntax.SetBaseRFunction(clsImportDAT) ElseIf strFileExt = ".xlsx" OrElse strFileExt = ".xls" Then + If strFileExt = ".xlsx" Then + strFileType = "XLSX" + Else + strFileType = "XLS" + End If ucrBase.clsRsyntax.SetBaseRFunction(clsImportExcel) grpExcel.Show() FillExcelSheets(strFilePath) - Else + ElseIf strFileExt <> "" Then strFileType = strFileExt.Substring(1).ToUpper() ucrBase.clsRsyntax.SetBaseRFunction(clsImport) + Else + strFileType = "" End If - If strFileType <> "RDS" Then + If strFileType <> "" AndAlso strFileType <> "RDS" Then ucrSaveFile.Visible = True - ucrSaveFile.SetName(strFileName, bSilent:=True) + strValidName = frmMain.clsRLink.MakeValidText(strFileName) + ucrSaveFile.SetName(strValidName, bSilent:=True) Else ucrSaveFile.Visible = False End If @@ -451,22 +486,21 @@ Public Class dlgImportDataset End Sub Public Sub RefreshFilePreview() - Dim sReader As StreamReader If strFileType = "CSV" AndAlso strFilePathSystem <> "" Then TextPreviewVisible(True) Try - sReader = New StreamReader(strFilePathSystem) - txtTextFilePreview.Text = "" - For i = 1 To ucrNudPreviewLines.Value + ucrNudLinesToSkipCSV.Value + 1 - txtTextFilePreview.Text = txtTextFilePreview.Text & sReader.ReadLine() & Environment.NewLine - If sReader.Peek() = -1 Then - Exit For - End If - Next - txtTextFilePreview.SelectedText = "" + Using sReader As New StreamReader(strFilePathSystem) + txtTextFilePreview.Text = "" + For i = 1 To ucrNudPreviewLines.Value + ucrNudLinesToSkipCSV.Value + 1 + txtTextFilePreview.Text = txtTextFilePreview.Text & sReader.ReadLine() & Environment.NewLine + If sReader.Peek() = -1 Then + Exit For + End If + Next + End Using Catch ex As Exception - txtTextFilePreview.Text = "Cannot show text preview of file:" & strFilePathSystem & ". The file may be in use by another program. Close the file and select it again from the dialog to refresh the preview." + txtTextFilePreview.Text = "Cannot show text preview of file:" & strFilePathSystem & ". The file may have moved or be in use by another program. Close the file and select it again from the dialog to refresh the preview." bCanImport = False End Try Else @@ -481,21 +515,33 @@ Public Class dlgImportDataset Dim bValid As Boolean Dim clsAsCharacterFunc As New RFunction Dim clsTempImport As New RFunction + Dim iTemp As Integer + Dim strRowMaxParamName As String = "" Cursor = Cursors.WaitCursor ucrBase.OKEnabled(False) clsAsCharacterFunc.SetRCommand("convert_to_character_matrix") strTempDataFrameName = "temp" grdDataPreview.Worksheets.Clear() + grdDataPreview.Enabled = False lblCannotImport.Hide() bValid = False If {"CSV", "XLSX", "XLS"}.Contains(strFileType) AndAlso Not ucrInputFilePath.IsEmpty() Then If strFileType = "CSV" Then clsTempImport = clsImportCSV.Clone() - clsTempImport.AddParameter("nrows", ucrNudPreviewLines.Value) + strRowMaxParamName = "nrows" ElseIf strFileType = "XLSX" OrElse strFileType = "XLS" Then clsTempImport = clsImportExcel.Clone() - clsTempImport.AddParameter("n_max", ucrNudPreviewLines.Value) + strRowMaxParamName = "n_max" + End If + If clsTempImport.ContainsParameter(strRowMaxParamName) Then + If Integer.TryParse(clsTempImport.GetParameter(strRowMaxParamName).strArgumentValue, iTemp) Then + clsTempImport.AddParameter(strRowMaxParamName, Math.Min(iTemp, ucrNudPreviewLines.Value)) + Else + clsTempImport.AddParameter(strRowMaxParamName, ucrNudPreviewLines.Value) + End If + Else + clsTempImport.AddParameter(strRowMaxParamName, ucrNudPreviewLines.Value) End If clsTempImport.RemoveAssignTo() clsAsCharacterFunc.AddParameter("data", clsRFunctionParameter:=clsTempImport) @@ -507,6 +553,7 @@ Public Class dlgImportDataset frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False) grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_DragSelectionToMoveCells, False) grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_Readonly, True) + grdDataPreview.Enabled = True bValid = True bCanImport = True Catch @@ -517,10 +564,17 @@ Public Class dlgImportDataset If bValid Then GridPreviewVisible(True) LinesToPreviewVisible(True) + lblNoPreview.Hide() Else lblCannotImport.Show() bCanImport = False End If + ElseIf ucrInputFilePath.IsEmpty() Then + bCanImport = False + lblCannotImport.Hide() + lblNoPreview.Hide() + GridPreviewVisible(False) + LinesToPreviewVisible(False) Else bCanImport = True lblCannotImport.Hide() @@ -632,4 +686,17 @@ Public Class dlgImportDataset frmMain.strSaveFilePath = strFilePathSystem End If End Sub + + Private Sub CSVControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrChkStringsAsFactorsCSV.ControlValueChanged, ucrInputNAStringsCSV.ControlValueChanged, ucrInputEncodingCSV.ControlValueChanged, ucrInputSeparatorCSV.ControlValueChanged, ucrInputHeadersCSV.ControlValueChanged, ucrInputDecimalCSV.ControlValueChanged, ucrNudLinesToSkipCSV.ControlValueChanged, ucrPnlRowNamesCSV.ControlValueChanged + RefreshFrameView() + End Sub + + Private Sub ucrNudPreviewLines_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudPreviewLines.ControlContentsChanged + RefreshFilePreview() + RefreshFrameView() + End Sub + + Private Sub ExcelControls_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputMaxRowsExcel.ControlValueChanged, ucrChkTrimWSExcel.ControlValueChanged, ucrNudRowsToSkipExcel.ControlValueChanged, ucrChkMaxRowsExcel.ControlValueChanged, ucrInputMaxRowsExcel.ControlValueChanged, ucrInputMissingValueStringExcel.ControlValueChanged + RefreshFrameView() + End Sub End Class \ No newline at end of file diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index 9c073f826c9..11613e513b2 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -351,7 +351,7 @@ Public Class ucrCore End Function Public Overridable Function IsRDefault() As Boolean - Return clsParameter IsNot Nothing AndAlso objRDefault IsNot Nothing AndAlso objRDefault.Equals(clsParameter.strArgumentValue) + Return clsParameter IsNot Nothing AndAlso clsParameter.strArgumentValue IsNot Nothing AndAlso objRDefault IsNot Nothing AndAlso objRDefault.Equals(clsParameter.strArgumentValue) End Function Public Overridable Function CanAddParameter() As Boolean diff --git a/instat/ucrNud.vb b/instat/ucrNud.vb index 004d7fe56cd..7461a46a85b 100644 --- a/instat/ucrNud.vb +++ b/instat/ucrNud.vb @@ -45,6 +45,23 @@ Public Class ucrNud End If End Sub + Public Overrides Function IsRDefault() As Boolean + Dim clsParam As RParameter + Dim dTempParamValue As Decimal + Dim dTempRDefault As Decimal + + clsParam = GetParameter() + If clsParam IsNot Nothing AndAlso clsParam.strArgumentValue IsNot Nothing AndAlso objRDefault IsNot Nothing Then + If Decimal.TryParse(clsParam.strArgumentValue, dTempParamValue) AndAlso Decimal.TryParse(objRDefault, dTempRDefault) Then + Return dTempRDefault = dTempParamValue + Else + Return False + End If + Else + Return False + End If + End Function + Public Property Minimum As Decimal Get Return nudUpDown.Minimum diff --git a/instat/ucrSave.vb b/instat/ucrSave.vb index 9e83a964669..c7fc0c59b59 100644 --- a/instat/ucrSave.vb +++ b/instat/ucrSave.vb @@ -48,16 +48,11 @@ Public Class ucrSave bShowLabel = True bShowCheckBox = False LabelOrCheckboxSettings() - If bIsComboBox Then - iTemp = lblSaveText.Location.X + lblSaveText.Size.Width - ucrInputComboSave.Location.X - If iTemp > 0 Then - ucrInputComboSave.Width = ucrInputComboSave.Size.Width - iTemp - End If - Else - iTemp = lblSaveText.Location.X + lblSaveText.Size.Width - ucrInputTextSave.Location.X - If iTemp > 0 Then - ucrInputTextSave.Width = ucrInputComboSave.Size.Width - iTemp - End If + 'Do for both in case text/combo not set yet, or will change at run time + iTemp = lblSaveText.Location.X + lblSaveText.Size.Width - ucrInputComboSave.Location.X + If iTemp > 0 Then + ucrInputComboSave.Width = ucrInputComboSave.Size.Width - iTemp + ucrInputTextSave.Width = ucrInputComboSave.Width End If End Sub From 8d54e9fb3cf8da7e68b8d3dd415c99373f44d2d5 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Wed, 21 Jun 2017 16:56:16 +0100 Subject: [PATCH 128/201] added column limit to grid preview --- instat/clsGridLink.vb | 18 ++++++++++++------ instat/dlgImportDataset.vb | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/instat/clsGridLink.vb b/instat/clsGridLink.vb index 009c14227fe..042929721f6 100644 --- a/instat/clsGridLink.vb +++ b/instat/clsGridLink.vb @@ -106,7 +106,7 @@ Public Class clsGridLink dfTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsGetDataFrame.ToScript()).AsDataFrame clsFilterApplied.AddParameter("data_name", Chr(34) & strDataName & Chr(34)) If frmMain.clsRLink.RunInternalScriptGetValue(clsFilterApplied.ToScript()).AsLogical(0) Then - FillSheet(dfTemp, strDataName, grdData, bInstatObjectDataFrame:=True, bIncludeDataTypes:=True, iNewPosition:=i, bFilterApplied:=True, bCheckFreezeColumns:=True) + FillSheet(dfTemp, strDataName, grdData, bInstatObjectDataFrame:=True, bIncludeDataTypes:=True, iNewPosition:=i, bFilterApplied:=True, bCheckFreezeColumns:=True, iRowMax:=iMaxRows, iColMax:=iMaxCols) Else FillSheet(dfTemp, strDataName, grdData, bInstatObjectDataFrame:=True, bIncludeDataTypes:=True, iNewPosition:=i, bFilterApplied:=False, bCheckFreezeColumns:=True) End If @@ -121,7 +121,8 @@ Public Class clsGridLink expVarMetadata = frmMain.clsRLink.RunInternalScriptGetValue(clsGetVariablesMetadata.ToScript()) If expVarMetadata IsNot Nothing AndAlso expVarMetadata.Type <> Internals.SymbolicExpressionType.Null Then dfTemp = expVarMetadata.AsDataFrame() - FillSheet(dfTemp, strDataName, grdVariablesMetadata) + 'TODO test if column limit is needed for stability in metadata grids + FillSheet(dfTemp, strDataName, grdVariablesMetadata, iColMax:=iMaxCols) clsSetVariablesMetadataChanged.AddParameter("data_name", Chr(34) & strDataName & Chr(34)) clsSetVariablesMetadataChanged.AddParameter("new_val", "TRUE") frmMain.clsRLink.RunInternalScript(clsSetVariablesMetadataChanged.ToScript()) @@ -175,8 +176,9 @@ Public Class clsGridLink If bGrdMetadataExists And (bGrdMetadataChanged Or bRMetadataChanged) Then clsGetCombinedMetadata.AddParameter("convert_to_character", "TRUE") - dfTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsGetCombinedMetadata.ToScript()).AsDataFrame() - FillSheet(dfTemp, "metadata", grdMetadata) + dfTemp = frmMain.clsRLink.RunInternalScriptGetValue(clsGetCombinedMetadata.ToScript()).AsDataFrame() + 'TODO test if column limit is needed for stability in metadata grids + FillSheet(dfTemp, "metadata", grdMetadata, iColMax:=iMaxCols) clsSetMetadataChanged.AddParameter("new_val", "TRUE") frmMain.clsRLink.RunInternalScript(clsSetMetadataChanged.ToScript()) End If @@ -239,7 +241,7 @@ Public Class clsGridLink UpdateGrids() End Sub - Public Sub FillSheet(dfTemp As DataFrame, strName As String, grdCurr As ReoGridControl, Optional bInstatObjectDataFrame As Boolean = False, Optional bIncludeDataTypes As Boolean = False, Optional iNewPosition As Integer = -1, Optional bFilterApplied As Boolean = False, Optional bCheckFreezeColumns As Boolean = False, Optional iRowMax As Integer = -1) + Public Sub FillSheet(dfTemp As DataFrame, strName As String, grdCurr As ReoGridControl, Optional bInstatObjectDataFrame As Boolean = False, Optional bIncludeDataTypes As Boolean = False, Optional iNewPosition As Integer = -1, Optional bFilterApplied As Boolean = False, Optional bCheckFreezeColumns As Boolean = False, Optional iRowMax As Integer = -1, Optional iColMax As Integer = -1) Dim bFoundWorksheet As Boolean = False Dim tempWorkSheet As Worksheet Dim fillWorkSheet As Worksheet @@ -283,7 +285,11 @@ Public Class clsGridLink grdCurr.MoveWorksheet(fillWorkSheet, iNewPosition) End If 'replaced this to fill columns with the iMaxCols - fillWorkSheet.Columns = Math.Min(iMaxCols, dfTemp.ColumnCount) + If iColMax <> -1 Then + fillWorkSheet.Columns = Math.Min(iColMax, dfTemp.ColumnCount) + Else + fillWorkSheet.Columns = dfTemp.ColumnCount + End If strColumnNames = dfTemp.ColumnNames If dfTemp.RowCount = 0 Then fillWorkSheet.Rows = 1 diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index 7cdbb28193e..e8ac45cc5f5 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -550,7 +550,7 @@ Public Class dlgImportDataset dfTemp = expTemp.AsDataFrame If dfTemp IsNot Nothing Then Try - frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False) + frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False, iColMax:=frmMain.clsInstatOptions.iMaxCols) grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_DragSelectionToMoveCells, False) grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_Readonly, True) grdDataPreview.Enabled = True From 73ab76e4257b7fce9948bc1b9ce88610fc9d5206 Mon Sep 17 00:00:00 2001 From: Lily Date: Wed, 21 Jun 2017 18:00:31 +0100 Subject: [PATCH 129/201] fixed bug --- instat/dlgStartofRains.vb | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index a16eaad911a..4e4b436d76c 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -453,7 +453,7 @@ Public Class dlgStartofRains clsCombineOperator.SetOperation("&") ' run always - ' clsCombineOperator.AddParameter("rainfall", clsROperatorParameter:=clsRainCombineOperator, iPosition:=0) + clsCombineOperator.AddParameter("rainfall", clsROperatorParameter:=clsRainCombineOperator, iPosition:=0) clsRainCombineOperator.SetOperation(">=") clsRainCombineOperator.AddParameter("rainThreshold", 0.85, iPosition:=1) @@ -462,21 +462,17 @@ Public Class dlgStartofRains clsTRCombineOperator.SetOperation(">") clsTRCombineOperator.AddParameter("TRLeft", strRollSumRain, iPosition:=0) + 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRPercentile, "TRRight", 20) + 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRAmount, "TRRight", strWetSpell) - - ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRPercentile, "TRRight", 20) - ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRAmount, "TRRight", strWetSpell) - - clsTRCombineOperator.AddParameter("TRRight", 20, iPosition:=1) ' ucrNudTRAmount - clsTRCombineOperator.AddParameter("TRRight", strWetSpell, iPosition:=1) - - + 'clsTRCombineOperator.AddParameter("TRRight", 20, iPosition:=1) ' ucrNudTRAmount + 'clsTRCombineOperator.AddParameter("TRRight", strWetSpell, iPosition:=1) 'If rdoTRAmount.Checked Then ucrNudTRAmount 'ElseIf rdoTRPercentile.Checked Then strWetSpell ' run if chkRD is checked - ' clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) + ' clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) clsRDCombineOperator.SetOperation(">=") clsRDCombineOperator.AddParameter("RDleft", strRollingRainDays, iPosition:=0) clsRDCombineOperator.AddParameter("RDMin", 2, iPosition:=1) @@ -489,12 +485,10 @@ Public Class dlgStartofRains ' run if chkDP is checked ' issue here as everything is hard coded - '' clsCombineOperator.AddParameter("dryperiod", clsROperatorParameter:=clsDPCombineOperator, iPosition:=4) - 'clsDPCombineOperator.SetOperation("==") - 'clsDPCombineOperator.AddParameter("DPleft", strDPOverallIntervalRain, iPosition:=0) - 'clsDPCombineOperator.AddParameter("DPMax", 0, iPosition:=1) - - + ' clsCombineOperator.AddParameter("dryperiod", clsROperatorParameter:=clsDPCombineOperator, iPosition:=4) + clsDPCombineOperator.SetOperation("==") + clsDPCombineOperator.AddParameter("DPleft", strDPOverallIntervalRain, iPosition:=0) + clsDPCombineOperator.AddParameter("DPMax", 0, iPosition:=1) ' First DOY clsFirstDOYPerYearOperator.bToScriptAsRString = True clsFirstDOYPerYear.SetRCommand("instat_calculation$new") @@ -564,7 +558,6 @@ Public Class dlgStartofRains ' Combine ucrNudRDMinimumDays.SetRCode(clsRDCombineOperator, bReset) ucrNudDSMaximumDays.SetRCode(clsDSCombineOperator, bReset) - End Sub Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk @@ -692,7 +685,7 @@ Public Class dlgStartofRains ' 'Else ' ' ucrBase.OKEnabled(False) ' 'End If - End Sub + End Sub ' ucrNudDPRainPeriod, ucrNudDPMaxRain, ucrNudDPOverallInterval From 26010b80de0b1441d5a57aecb9a2e1dfe7b160ea Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 22 Jun 2017 06:49:29 +0300 Subject: [PATCH 130/201] Display tab implemented --- instat/clsRegressionDefaults.vb | 115 +++++++ instat/dlgRegressionSimple.Designer.vb | 47 ++- instat/dlgRegressionSimple.vb | 140 ++++---- instat/instat.vbproj | 1 + instat/sdgSimpleRegOptions.Designer.vb | 422 +++++++++++-------------- instat/sdgSimpleRegOptions.vb | 409 ++++++++++++++---------- 6 files changed, 644 insertions(+), 490 deletions(-) create mode 100644 instat/clsRegressionDefaults.vb diff --git a/instat/clsRegressionDefaults.vb b/instat/clsRegressionDefaults.vb new file mode 100644 index 00000000000..4db1ea33ca6 --- /dev/null +++ b/instat/clsRegressionDefaults.vb @@ -0,0 +1,115 @@ +Public Class clsRegressionDefaults + Public Shared ReadOnly Property clsDefaultFitted As RFunction + Get + Dim clsRFittedValues As New RFunction + Dim clsRWriteFitted, clsRModelFunction As New RFunction + + 'ucrSave (sdgSimpleRegOptions) Fitted Values + clsRFittedValues.SetRCommand("fitted") + clsRModelFunction.SetRCommand("") + clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsDefaultRLmOrGLM) + clsRWriteFitted.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) + Return clsRWriteFitted + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRLmOrGLM As RFunction + Get + + Dim clsRModelFunction As New RFunction + + + clsRModelFunction.SetRCommand("lm") + 'clsRModelFunction.AddParameter("formula", clsROperatorParameter:=clsDefaultFormulaOperator, iPosition:=1) + Return clsRModelFunction + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRGraphicsOperator As ROperator + Get + + Dim clsRGraphicsOperator As New ROperator + + clsRGraphicsOperator.SetOperation("+") + Return clsRGraphicsOperator + End Get + End Property + + Public Shared ReadOnly Property clsDefaultFormulaOperator As ROperator + Get + + Dim clsFormulaOperator As New ROperator + + clsFormulaOperator.SetOperation("~") + Return clsFormulaOperator + End Get + End Property + + + Public Shared ReadOnly Property clsDefaultSummary As RFunction + Get + Dim clsDefaultRestpvalFunction As New RFunction + + clsDefaultRestpvalFunction.SetPackageName("base") + clsDefaultRestpvalFunction.SetRCommand("summary") + Return clsDefaultRestpvalFunction + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRConfinterval As RFunction + Get + Dim clsDefaultRConfint As New RFunction + clsDefaultRConfint.SetPackageName("stats") + clsDefaultRConfint.SetRCommand("confint") + Return clsDefaultRConfint + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRaovPValueFunction As RFunction + Get + Dim clsDefaultRaovpvalFunction As New RFunction + clsDefaultRaovpvalFunction.SetPackageName("stats") + clsDefaultRaovpvalFunction.SetRCommand("anova") + Return clsDefaultRaovpvalFunction + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRanovaFunction As RFunction + Get + Dim clsDefaultRaovFunction As New RFunction + clsDefaultRaovFunction.SetPackageName("stats") + clsDefaultRaovFunction.SetRCommand("anova") + Return clsDefaultRaovFunction + End Get + End Property + + + Public Shared ReadOnly Property clsDefaultModel As RFunction + Get + Dim clsDefaultRModelsFunction As New RFunction + clsDefaultRModelsFunction.SetPackageName("stats") + clsDefaultRModelsFunction.SetRCommand("formula") + Return clsDefaultRModelsFunction + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRResidualPlots As RFunction + Get + Dim clsDefaultRResidualPlotsFunction As New RFunction + clsDefaultRResidualPlotsFunction.SetPackageName("ggplot2") + clsDefaultRResidualPlotsFunction.SetRCommand("autoplot") + Return clsDefaultRResidualPlotsFunction + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRgeom_pointFunction As RFunction + Get + Dim clsDefaultRgeom_point As New RFunction + clsDefaultRgeom_point.SetPackageName("ggplot2") + clsDefaultRgeom_point.SetRCommand("geom_point") + Return clsDefaultRgeom_point + End Get + End Property + +End Class diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 09df035ca2e..543b246752c 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -49,13 +49,10 @@ Partial Class dlgRegressionSimple Me.ucrBase = New instat.ucrButtons() Me.ucrSaveModels = New instat.ucrSave() Me.ucrPnlModelType = New instat.UcrPanel() - Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() Me.lblHyp1 = New System.Windows.Forms.Label() - Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() Me.grpParameters = New System.Windows.Forms.GroupBox() Me.rdoTwoSample = New System.Windows.Forms.RadioButton() Me.rdoGeneralCase = New System.Windows.Forms.RadioButton() - Me.UcrPanel1 = New instat.UcrPanel() Me.ucrChkConvertToVariate = New instat.ucrCheck() Me.lblFactor = New System.Windows.Forms.Label() Me.lblNumeric = New System.Windows.Forms.Label() @@ -64,6 +61,8 @@ Partial Class dlgRegressionSimple Me.ucrSelectorSimpleReg = New instat.ucrSelectorByDataFrameAddRemove() Me.lblExplanatory = New System.Windows.Forms.Label() Me.lblResponse = New System.Windows.Forms.Label() + Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() + Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -231,34 +230,20 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") Me.ucrPnlModelType.Name = "ucrPnlModelType" ' - 'rdoCompareVariance - ' - resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") - Me.rdoCompareVariance.Name = "rdoCompareVariance" - Me.rdoCompareVariance.TabStop = True - Me.rdoCompareVariance.UseVisualStyleBackColor = True - ' 'lblHyp1 ' resources.ApplyResources(Me.lblHyp1, "lblHyp1") Me.lblHyp1.Name = "lblHyp1" ' - 'rdoCompareMeans - ' - resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") - Me.rdoCompareMeans.Name = "rdoCompareMeans" - Me.rdoCompareMeans.TabStop = True - Me.rdoCompareMeans.UseVisualStyleBackColor = True - ' 'grpParameters ' + Me.grpParameters.Controls.Add(Me.rdoCompareVariance) Me.grpParameters.Controls.Add(Me.Label1) Me.grpParameters.Controls.Add(Me.rdoKruskalTest) Me.grpParameters.Controls.Add(Me.rdoWilcoxonTest) Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) Me.grpParameters.Controls.Add(Me.ucrNudCI) - Me.grpParameters.Controls.Add(Me.rdoCompareVariance) Me.grpParameters.Controls.Add(Me.rdoCompareMeans) Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) Me.grpParameters.Controls.Add(Me.lblHyp1) @@ -286,11 +271,6 @@ Partial Class dlgRegressionSimple Me.rdoGeneralCase.Name = "rdoGeneralCase" Me.rdoGeneralCase.UseVisualStyleBackColor = True ' - 'UcrPanel1 - ' - resources.ApplyResources(Me.UcrPanel1, "UcrPanel1") - Me.UcrPanel1.Name = "UcrPanel1" - ' 'ucrChkConvertToVariate ' Me.ucrChkConvertToVariate.Checked = False @@ -344,13 +324,26 @@ Partial Class dlgRegressionSimple Me.lblResponse.Name = "lblResponse" Me.lblResponse.Tag = "Response_Variable" ' + 'rdoCompareMeans + ' + resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") + Me.rdoCompareMeans.Name = "rdoCompareMeans" + Me.rdoCompareMeans.TabStop = True + Me.rdoCompareMeans.UseVisualStyleBackColor = True + ' + 'rdoCompareVariance + ' + resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") + Me.rdoCompareVariance.Name = "rdoCompareVariance" + Me.rdoCompareVariance.TabStop = True + Me.rdoCompareVariance.UseVisualStyleBackColor = True + ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.Controls.Add(Me.rdoTwoSample) Me.Controls.Add(Me.rdoGeneralCase) - Me.Controls.Add(Me.UcrPanel1) Me.Controls.Add(Me.ucrChkConvertToVariate) Me.Controls.Add(Me.lblFactor) Me.Controls.Add(Me.lblNumeric) @@ -382,7 +375,6 @@ Partial Class dlgRegressionSimple Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide Me.Tag = "Simple_Regression" Me.grpParameters.ResumeLayout(False) - Me.grpParameters.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -414,12 +406,9 @@ Partial Class dlgRegressionSimple Friend WithEvents lblLevel1 As Label Friend WithEvents ucrPnlModelType As UcrPanel Friend WithEvents grpParameters As GroupBox - Friend WithEvents rdoCompareVariance As RadioButton - Friend WithEvents rdoCompareMeans As RadioButton Friend WithEvents lblHyp1 As Label Friend WithEvents rdoTwoSample As RadioButton Friend WithEvents rdoGeneralCase As RadioButton - Friend WithEvents UcrPanel1 As UcrPanel Friend WithEvents ucrChkConvertToVariate As ucrCheck Friend WithEvents lblFactor As Label Friend WithEvents lblNumeric As Label @@ -428,4 +417,6 @@ Partial Class dlgRegressionSimple Friend WithEvents ucrSelectorSimpleReg As ucrSelectorByDataFrameAddRemove Friend WithEvents lblExplanatory As Label Friend WithEvents lblResponse As Label + Friend WithEvents rdoCompareMeans As RadioButton + Friend WithEvents rdoCompareVariance As RadioButton End Class \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 63e3ed399ab..19215d89cf1 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -19,7 +19,7 @@ Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True Public clsModel, clsFormulaOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator - Public clsRPoisson, clsRModelsFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsRYVariable, clsRXVariable, clsTFunc, clsRLength As New RFunction + Public clsRPoisson, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsRYVariable, clsRXVariable, clsTFunc, clsRLength As New RFunction Private bReset As Boolean = True Public bResetSubDialog As Boolean = False @@ -46,8 +46,8 @@ Public Class dlgRegressionSimple ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) ' ucrResponse.AddAdditionalCodeParameterPair(clsRConvert, New RParameter("x", 1)) - ucrNudCI.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("conf.int"), 1) - ucrNudHypothesis.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("r"), 1) + 'ucrNudCI.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("conf.int"), 1) + 'ucrNudHypothesis.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("r"), 1) End Sub Private Sub InitialiseDialog() @@ -72,6 +72,7 @@ Public Class dlgRegressionSimple ucrSaveModels.SetDataFrameSelector(ucrSelectorSimpleReg.ucrAvailableDataFrames) ucrSaveModels.SetSaveTypeAsModel() + ucrModelPreview.IsReadOnly = True ucrPnlModelType.AddRadioButton(rdoGeneralCase) @@ -114,6 +115,7 @@ Public Class dlgRegressionSimple ucrPnlMeansAndVariance.AddToLinkedControls(ucrNudHypothesis, {rdoCompareVariance}, bNewLinkedDisabledIfParameterMissing:=True) + ' sdgSimpleRegOptions.SetRModelFunction(clsRLmOrGLM) 'sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) 'sdgSimpleRegOptions.SetRYVariable(ucrResponse) @@ -142,6 +144,12 @@ Public Class dlgRegressionSimple clsRaovFunction = New RFunction clsRaovpvalFunction = New RFunction clsRConfint = New RFunction + clsRestpvalFunction = New RFunction + clsRFittedValues = New RFunction + clsRWriteFitted = New RFunction + clsRSummaryFunction = New RFunction + clsRanovaFunction = New RFunction + 'clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone ucrSelectorSimpleReg.Reset() ucrResponse.SetMeAsReceiver() @@ -151,17 +159,17 @@ Public Class dlgRegressionSimple DataTypeAccepted() - clsFormulaOperator.SetOperation("~") + clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator + + 'clsFormulaOperator.SetOperation("~") ' clsFormulaOperator.AddParameter("y", 1, iPosition:=0) ' clsFormulaOperator.AddParameter("x", 1, iPosition:=1) - clsRLmOrGLM.SetRCommand("lm") + clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmOrGLM.Clone clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) - clsRModelsFunction.SetPackageName("stats") - clsRModelsFunction.SetRCommand("formula") - clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) - clsRModelsFunction.iCallType = 2 + + clsRaovFunction.SetPackageName("stats") @@ -169,17 +177,40 @@ Public Class dlgRegressionSimple clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) clsRaovFunction.iCallType = 2 - clsRaovpvalFunction.SetPackageName("stats") - clsRaovpvalFunction.SetRCommand("anova") - clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) - ' clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) - clsRaovpvalFunction.iCallType = 2 - clsRConfint.SetPackageName("stats") - clsRConfint.SetRCommand("confint") - clsRConfint.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) + clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) + + 'Model + clsRModelsFunction = clsRegressionDefaults.clsDefaultModel.Clone + clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRModelsFunction.iCallType = 2 + + 'Summary + clsRSummaryFunction = clsRegressionDefaults.clsDefaultSummary.Clone + clsRSummaryFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRSummaryFunction.iCallType = 2 + + 'ANOVA + clsRanovaFunction = clsRegressionDefaults.clsDefaultRanovaFunction.Clone + clsRanovaFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRanovaFunction.iCallType = 2 + + 'Confidence Interval + clsRConfint = clsRegressionDefaults.clsDefaultRConfinterval.Clone + clsRConfint.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) clsRConfint.iCallType = 2 + 'Anova + Pvalue + clsRestpvalFunction = clsRegressionDefaults.clsDefaultRaovPValueFunction.Clone + clsRestpvalFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + ' clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRestpvalFunction.iCallType = 2 + + 'ucrSave (sdgSimpleRegOptions) Fitted Values + clsRFittedValues.SetRCommand("fitted") + clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + clsRWriteFitted.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) clsRConvert.SetRCommand("as.numeric") @@ -214,10 +245,7 @@ Public Class dlgRegressionSimple ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) - ucrBase.clsRsyntax.AddToAfterCodes(clsRaovFunction, iPosition:=0) - ucrBase.clsRsyntax.AddToAfterCodes(clsRModelsFunction, iPosition:=1) - ucrBase.clsRsyntax.AddToAfterCodes(clsRaovpvalFunction, iPosition:=2) - ucrBase.clsRsyntax.AddToAfterCodes(clsRConfint, iPosition:=3) + clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempModel:="last_model", bAssignToIsPrefix:=True) 'sdgSimpleRegOptions.SetDefaults() @@ -229,7 +257,7 @@ Public Class dlgRegressionSimple 'sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True rdoCompareMeans.Checked = True - SetEnableDists() + 'SetEnableDists() TestOKEnabled() bResetSubDialog = True bResetOptionsSubDialog = True @@ -271,7 +299,7 @@ Public Class dlgRegressionSimple Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click Display() - sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsRLmOrGLM, clsRModelFunction, clsRXVariable, clsRYVariable, bResetOptionsSubDialog) + sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRConfint:=clsRConfint, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsRLmOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) bResetOptionsSubDialog = False sdgSimpleRegOptions.ShowDialog() End Sub @@ -281,29 +309,23 @@ Public Class dlgRegressionSimple End Sub - Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) + + Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged clsRYVariable = ucrResponse.GetVariables End Sub - Private Sub ucrSelectorSimpleReg_ControlContentsChanged(ucrChangedControl As ucrCore) + Private Sub ucrSelectorSimpleReg_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSelectorSimpleReg.ControlValueChanged ConvertToVariate() TestOKEnabled() DataTypeAccepted() - SetEnableDists() + ' SetEnableDists() End Sub - Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) + Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged clsRXVariable = ucrExplanatory.GetVariables End Sub - Private Sub ucrPnlModelType_Load(sender As Object, e As EventArgs) - - End Sub - - Private Sub rdoGeneralCase_CheckedChanged(sender As Object, e As EventArgs) - - End Sub Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click sdgModelOptions.ShowDialog() @@ -542,7 +564,7 @@ Public Class dlgRegressionSimple End If End Sub - Private Sub ucrSelectorSimpleReg_DataFrameChanged() + Private Sub ucrSelectorSimpleReg_DataFrameChanged() Handles ucrSelectorSimpleReg.ControlValueChanged AssignModelName() SetRCode() End Sub @@ -586,17 +608,17 @@ Public Class dlgRegressionSimple TestOKEnabled() End Sub - Public Sub SetEnableDists() - ucrFamily.Enabled = Not ucrResponse.IsEmpty - End Sub + 'Public Sub SetEnableDists() + ' ucrFamily.Enabled = Not ucrResponse.IsEmpty + 'End Sub - Private Sub ucrExplanatory_SelectionChanged(sender As Object, e As EventArgs) + Private Sub ucrExplanatory_SelectionChanged(sender As Object, e As EventArgs) Handles ucrExplanatory.SelectionChanged If Not ucrExplanatory.IsEmpty Then ' ucrLevel1.SetItems({ucrExplanatory.GetItemType("Levels")}) End If End Sub - Private Sub chkConvertToVariate_CheckedChanged(sender As Object, e As EventArgs) + Private Sub ucrchkConvertToVariate_CheckedChanged() Handles ucrChkConvertToVariate.ControlValueChanged SetRCode() ConvertToVariate() TestOKEnabled() @@ -622,7 +644,7 @@ Public Class dlgRegressionSimple End If End Sub - Private Sub ucrExplanatory_SelectionChanged() Handles ucrExplanatory.SelectionChanged + Private Sub ucrExplanatory_SelectionChanged() Handles ucrExplanatory.ControlValueChanged ExplanatoryFunctionSelect() SetRCode() TestOKEnabled() @@ -765,27 +787,27 @@ Public Class dlgRegressionSimple End Sub Private Sub rdoTop_CheckedChanged(sender As Object, e As EventArgs) - 'If rdoGeneral.Checked Then - ' ucrFamily.SetGLMDistributions() - 'Else - ' ucrFamily.SetExactDistributions() - 'End If - 'ucrFamily.ucrInputDistributions.SetName("") - 'Display() - 'SetRCode() - 'TestOKEnabled() - 'DataTypeAccepted() - 'AssignModelName() - 'ConvertToVariate() - End Sub - - Private Sub ucrFamily_EnabledChanged(sender As Object, e As EventArgs) Handles ucrFamily.EnabledChanged - DataTypeAccepted() + If rdoGeneralCase.Checked Then + ucrFamily.SetGLMDistributions() + Else + ucrFamily.SetExactDistributions() + End If + ucrFamily.ucrInputDistributions.SetName("") + Display() + SetRCode() TestOKEnabled() - SetEnableDists() + DataTypeAccepted() + AssignModelName() + ConvertToVariate() End Sub - Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) + 'Private Sub ucrFamily_EnabledChanged(sender As Object, e As EventArgs) Handles ucrFamily.EnabledChanged + ' DataTypeAccepted() + ' TestOKEnabled() + ' SetEnableDists() + 'End Sub + + Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged TestOKEnabled() End Sub End Class \ No newline at end of file diff --git a/instat/instat.vbproj b/instat/instat.vbproj index 539f10bdaba..007b9b0bfd3 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -149,6 +149,7 @@ + dlgAddComment.vb diff --git a/instat/sdgSimpleRegOptions.Designer.vb b/instat/sdgSimpleRegOptions.Designer.vb index c870478f8d8..5ce434b1a9a 100644 --- a/instat/sdgSimpleRegOptions.Designer.vb +++ b/instat/sdgSimpleRegOptions.Designer.vb @@ -48,8 +48,21 @@ Partial Class sdgSimpleRegOptions Me.rdoConditional = New System.Windows.Forms.RadioButton() Me.ucrPnlPlotType = New instat.UcrPanel() Me.tbResiduals = New System.Windows.Forms.TabPage() + Me.rdoCooksDistanceLeverage = New System.Windows.Forms.RadioButton() + Me.rdoCooksDistance = New System.Windows.Forms.RadioButton() + Me.rdoResidualsLeverage = New System.Windows.Forms.RadioButton() + Me.rdoScaleLocation = New System.Windows.Forms.RadioButton() + Me.rdoQQ = New System.Windows.Forms.RadioButton() + Me.rdoResidualsFitted = New System.Windows.Forms.RadioButton() Me.grpIndividualPlots = New System.Windows.Forms.GroupBox() Me.grpMultiplePlots = New System.Windows.Forms.GroupBox() + Me.rdoSixPlots3Rows = New System.Windows.Forms.RadioButton() + Me.rdoFourPlots = New System.Windows.Forms.RadioButton() + Me.rdoSixPlots2Rows = New System.Windows.Forms.RadioButton() + Me.ucrPnlMutiplePlots = New instat.UcrPanel() + Me.ucrPnlIndividualPlots = New instat.UcrPanel() + Me.ucrChkIndividualPlots = New instat.ucrCheck() + Me.ucrChkMultiplePlots = New instat.ucrCheck() Me.tbDisplay = New System.Windows.Forms.TabPage() Me.ucrNudDisplayCLevel = New instat.ucrNud() Me.ucrChkPvalues = New instat.ucrCheck() @@ -60,28 +73,11 @@ Partial Class sdgSimpleRegOptions Me.lblDisplayCLevel = New System.Windows.Forms.Label() Me.tbRegOptions = New System.Windows.Forms.TabControl() Me.tbSave = New System.Windows.Forms.TabPage() - Me.ucrChkLeverage = New instat.ucrCheck() - Me.ucrChkStdResiduals = New instat.ucrCheck() - Me.ucrChkResiduals = New instat.ucrCheck() - Me.ucrChkFittedValues = New instat.ucrCheck() - Me.ucrLeverageColumnName = New instat.ucrInputComboBox() - Me.ucrStdResidualsColumnName = New instat.ucrInputComboBox() - Me.ucrResidualsColumnName = New instat.ucrInputComboBox() - Me.ucrFittedColumnName = New instat.ucrInputComboBox() + Me.ucrSaveLeverageColumnName = New instat.ucrSave() + Me.ucrSaveStdResidualsColumnName = New instat.ucrSave() + Me.ucrSaveResidualsColumnName = New instat.ucrSave() + Me.ucrSaveFittedColumnName = New instat.ucrSave() Me.ucrSdgButtons = New instat.ucrButtonsSubdialogue() - Me.ucrChkMultiplePlots = New instat.ucrCheck() - Me.ucrChkIndividualPlots = New instat.ucrCheck() - Me.ucrPnlIndividualPlots = New instat.UcrPanel() - Me.rdoCooksDistanceLeverage = New System.Windows.Forms.RadioButton() - Me.rdoCooksDistance = New System.Windows.Forms.RadioButton() - Me.rdoResidualsLeverage = New System.Windows.Forms.RadioButton() - Me.rdoScaleLocation = New System.Windows.Forms.RadioButton() - Me.rdoQQ = New System.Windows.Forms.RadioButton() - Me.rdoResidualsFitted = New System.Windows.Forms.RadioButton() - Me.rdoSixPlots3Rows = New System.Windows.Forms.RadioButton() - Me.rdoFourPlots = New System.Windows.Forms.RadioButton() - Me.rdoSixPlots2Rows = New System.Windows.Forms.RadioButton() - Me.ucrPnlMutiplePlots = New instat.UcrPanel() Me.tbGraphics.SuspendLayout() Me.tcGraphics.SuspendLayout() Me.tbModel.SuspendLayout() @@ -374,11 +370,11 @@ Partial Class sdgSimpleRegOptions Me.tbResiduals.Controls.Add(Me.rdoScaleLocation) Me.tbResiduals.Controls.Add(Me.rdoQQ) Me.tbResiduals.Controls.Add(Me.rdoResidualsFitted) + Me.tbResiduals.Controls.Add(Me.grpIndividualPlots) + Me.tbResiduals.Controls.Add(Me.grpMultiplePlots) Me.tbResiduals.Controls.Add(Me.ucrPnlIndividualPlots) Me.tbResiduals.Controls.Add(Me.ucrChkIndividualPlots) Me.tbResiduals.Controls.Add(Me.ucrChkMultiplePlots) - Me.tbResiduals.Controls.Add(Me.grpIndividualPlots) - Me.tbResiduals.Controls.Add(Me.grpMultiplePlots) Me.tbResiduals.Location = New System.Drawing.Point(4, 22) Me.tbResiduals.Name = "tbResiduals" Me.tbResiduals.Padding = New System.Windows.Forms.Padding(3) @@ -388,6 +384,78 @@ Partial Class sdgSimpleRegOptions Me.tbResiduals.Text = "Residuals" Me.tbResiduals.UseVisualStyleBackColor = True ' + 'rdoCooksDistanceLeverage + ' + Me.rdoCooksDistanceLeverage.AutoSize = True + Me.rdoCooksDistanceLeverage.Location = New System.Drawing.Point(25, 212) + Me.rdoCooksDistanceLeverage.Name = "rdoCooksDistanceLeverage" + Me.rdoCooksDistanceLeverage.Size = New System.Drawing.Size(159, 17) + Me.rdoCooksDistanceLeverage.TabIndex = 35 + Me.rdoCooksDistanceLeverage.TabStop = True + Me.rdoCooksDistanceLeverage.Tag = "Cook's_Distance_v_Leverage" + Me.rdoCooksDistanceLeverage.Text = "Cook's Distance v Leverage" + Me.rdoCooksDistanceLeverage.UseVisualStyleBackColor = True + ' + 'rdoCooksDistance + ' + Me.rdoCooksDistance.AutoSize = True + Me.rdoCooksDistance.Location = New System.Drawing.Point(189, 212) + Me.rdoCooksDistance.Name = "rdoCooksDistance" + Me.rdoCooksDistance.Size = New System.Drawing.Size(102, 17) + Me.rdoCooksDistance.TabIndex = 34 + Me.rdoCooksDistance.TabStop = True + Me.rdoCooksDistance.Tag = "Cook's_Distance" + Me.rdoCooksDistance.Text = "Cook's Distance" + Me.rdoCooksDistance.UseVisualStyleBackColor = True + ' + 'rdoResidualsLeverage + ' + Me.rdoResidualsLeverage.AutoSize = True + Me.rdoResidualsLeverage.Location = New System.Drawing.Point(25, 189) + Me.rdoResidualsLeverage.Name = "rdoResidualsLeverage" + Me.rdoResidualsLeverage.Size = New System.Drawing.Size(128, 17) + Me.rdoResidualsLeverage.TabIndex = 33 + Me.rdoResidualsLeverage.TabStop = True + Me.rdoResidualsLeverage.Tag = "Residuals_v_Leverage" + Me.rdoResidualsLeverage.Text = "Residuals v Leverage" + Me.rdoResidualsLeverage.UseVisualStyleBackColor = True + ' + 'rdoScaleLocation + ' + Me.rdoScaleLocation.AutoSize = True + Me.rdoScaleLocation.Location = New System.Drawing.Point(189, 189) + Me.rdoScaleLocation.Name = "rdoScaleLocation" + Me.rdoScaleLocation.Size = New System.Drawing.Size(96, 17) + Me.rdoScaleLocation.TabIndex = 32 + Me.rdoScaleLocation.TabStop = True + Me.rdoScaleLocation.Tag = "Scale-Location" + Me.rdoScaleLocation.Text = "Scale-Location" + Me.rdoScaleLocation.UseVisualStyleBackColor = True + ' + 'rdoQQ + ' + Me.rdoQQ.AutoSize = True + Me.rdoQQ.Location = New System.Drawing.Point(189, 166) + Me.rdoQQ.Name = "rdoQQ" + Me.rdoQQ.Size = New System.Drawing.Size(44, 17) + Me.rdoQQ.TabIndex = 31 + Me.rdoQQ.TabStop = True + Me.rdoQQ.Tag = "Q-Q" + Me.rdoQQ.Text = "Q-Q" + Me.rdoQQ.UseVisualStyleBackColor = True + ' + 'rdoResidualsFitted + ' + Me.rdoResidualsFitted.AutoSize = True + Me.rdoResidualsFitted.Location = New System.Drawing.Point(25, 166) + Me.rdoResidualsFitted.Name = "rdoResidualsFitted" + Me.rdoResidualsFitted.Size = New System.Drawing.Size(109, 17) + Me.rdoResidualsFitted.TabIndex = 30 + Me.rdoResidualsFitted.TabStop = True + Me.rdoResidualsFitted.Tag = "Residuals_v_Fitted" + Me.rdoResidualsFitted.Text = "Residuals v Fitted" + Me.rdoResidualsFitted.UseVisualStyleBackColor = True + ' 'grpIndividualPlots ' Me.grpIndividualPlots.Location = New System.Drawing.Point(10, 149) @@ -410,6 +478,72 @@ Partial Class sdgSimpleRegOptions Me.grpMultiplePlots.TabStop = False Me.grpMultiplePlots.Tag = "" ' + 'rdoSixPlots3Rows + ' + Me.rdoSixPlots3Rows.AutoSize = True + Me.rdoSixPlots3Rows.Location = New System.Drawing.Point(173, 18) + Me.rdoSixPlots3Rows.Name = "rdoSixPlots3Rows" + Me.rdoSixPlots3Rows.Size = New System.Drawing.Size(102, 17) + Me.rdoSixPlots3Rows.TabIndex = 43 + Me.rdoSixPlots3Rows.TabStop = True + Me.rdoSixPlots3Rows.Tag = "Six_Plots(3 rows)" + Me.rdoSixPlots3Rows.Text = "Six Plots(3 rows)" + Me.rdoSixPlots3Rows.UseVisualStyleBackColor = True + ' + 'rdoFourPlots + ' + Me.rdoFourPlots.AutoSize = True + Me.rdoFourPlots.Location = New System.Drawing.Point(9, 18) + Me.rdoFourPlots.Name = "rdoFourPlots" + Me.rdoFourPlots.Size = New System.Drawing.Size(72, 17) + Me.rdoFourPlots.TabIndex = 42 + Me.rdoFourPlots.TabStop = True + Me.rdoFourPlots.Tag = "Four_Plots" + Me.rdoFourPlots.Text = "Four Plots" + Me.rdoFourPlots.UseVisualStyleBackColor = True + ' + 'rdoSixPlots2Rows + ' + Me.rdoSixPlots2Rows.AutoSize = True + Me.rdoSixPlots2Rows.Location = New System.Drawing.Point(9, 41) + Me.rdoSixPlots2Rows.Name = "rdoSixPlots2Rows" + Me.rdoSixPlots2Rows.Size = New System.Drawing.Size(105, 17) + Me.rdoSixPlots2Rows.TabIndex = 41 + Me.rdoSixPlots2Rows.TabStop = True + Me.rdoSixPlots2Rows.Tag = "Six_Plots(2 rows)" + Me.rdoSixPlots2Rows.Text = "Six_Plots(2 rows)" + Me.rdoSixPlots2Rows.UseVisualStyleBackColor = True + ' + 'ucrPnlMutiplePlots + ' + Me.ucrPnlMutiplePlots.Location = New System.Drawing.Point(4, 12) + Me.ucrPnlMutiplePlots.Name = "ucrPnlMutiplePlots" + Me.ucrPnlMutiplePlots.Size = New System.Drawing.Size(268, 56) + Me.ucrPnlMutiplePlots.TabIndex = 40 + ' + 'ucrPnlIndividualPlots + ' + Me.ucrPnlIndividualPlots.Location = New System.Drawing.Point(20, 164) + Me.ucrPnlIndividualPlots.Name = "ucrPnlIndividualPlots" + Me.ucrPnlIndividualPlots.Size = New System.Drawing.Size(268, 68) + Me.ucrPnlIndividualPlots.TabIndex = 29 + ' + 'ucrChkIndividualPlots + ' + Me.ucrChkIndividualPlots.Checked = False + Me.ucrChkIndividualPlots.Location = New System.Drawing.Point(6, 123) + Me.ucrChkIndividualPlots.Name = "ucrChkIndividualPlots" + Me.ucrChkIndividualPlots.Size = New System.Drawing.Size(113, 20) + Me.ucrChkIndividualPlots.TabIndex = 23 + ' + 'ucrChkMultiplePlots + ' + Me.ucrChkMultiplePlots.Checked = False + Me.ucrChkMultiplePlots.Location = New System.Drawing.Point(6, 7) + Me.ucrChkMultiplePlots.Name = "ucrChkMultiplePlots" + Me.ucrChkMultiplePlots.Size = New System.Drawing.Size(113, 20) + Me.ucrChkMultiplePlots.TabIndex = 22 + ' 'tbDisplay ' Me.tbDisplay.Controls.Add(Me.ucrNudDisplayCLevel) @@ -503,14 +637,10 @@ Partial Class sdgSimpleRegOptions ' 'tbSave ' - Me.tbSave.Controls.Add(Me.ucrChkLeverage) - Me.tbSave.Controls.Add(Me.ucrChkStdResiduals) - Me.tbSave.Controls.Add(Me.ucrChkResiduals) - Me.tbSave.Controls.Add(Me.ucrChkFittedValues) - Me.tbSave.Controls.Add(Me.ucrLeverageColumnName) - Me.tbSave.Controls.Add(Me.ucrStdResidualsColumnName) - Me.tbSave.Controls.Add(Me.ucrResidualsColumnName) - Me.tbSave.Controls.Add(Me.ucrFittedColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveLeverageColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveStdResidualsColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveResidualsColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveFittedColumnName) Me.tbSave.Location = New System.Drawing.Point(4, 22) Me.tbSave.Name = "tbSave" Me.tbSave.Padding = New System.Windows.Forms.Padding(3) @@ -520,73 +650,33 @@ Partial Class sdgSimpleRegOptions Me.tbSave.Text = "Save" Me.tbSave.UseVisualStyleBackColor = True ' - 'ucrChkLeverage - ' - Me.ucrChkLeverage.Checked = False - Me.ucrChkLeverage.Location = New System.Drawing.Point(6, 91) - Me.ucrChkLeverage.Name = "ucrChkLeverage" - Me.ucrChkLeverage.Size = New System.Drawing.Size(113, 20) - Me.ucrChkLeverage.TabIndex = 23 - ' - 'ucrChkStdResiduals - ' - Me.ucrChkStdResiduals.Checked = False - Me.ucrChkStdResiduals.Location = New System.Drawing.Point(6, 65) - Me.ucrChkStdResiduals.Name = "ucrChkStdResiduals" - Me.ucrChkStdResiduals.Size = New System.Drawing.Size(113, 20) - Me.ucrChkStdResiduals.TabIndex = 22 - ' - 'ucrChkResiduals + 'ucrSaveLeverageColumnName ' - Me.ucrChkResiduals.Checked = False - Me.ucrChkResiduals.Location = New System.Drawing.Point(6, 39) - Me.ucrChkResiduals.Name = "ucrChkResiduals" - Me.ucrChkResiduals.Size = New System.Drawing.Size(113, 20) - Me.ucrChkResiduals.TabIndex = 21 + Me.ucrSaveLeverageColumnName.Location = New System.Drawing.Point(6, 90) + Me.ucrSaveLeverageColumnName.Name = "ucrSaveLeverageColumnName" + Me.ucrSaveLeverageColumnName.Size = New System.Drawing.Size(255, 24) + Me.ucrSaveLeverageColumnName.TabIndex = 27 ' - 'ucrChkFittedValues + 'ucrSaveStdResidualsColumnName ' - Me.ucrChkFittedValues.Checked = False - Me.ucrChkFittedValues.Location = New System.Drawing.Point(6, 13) - Me.ucrChkFittedValues.Name = "ucrChkFittedValues" - Me.ucrChkFittedValues.Size = New System.Drawing.Size(113, 20) - Me.ucrChkFittedValues.TabIndex = 20 + Me.ucrSaveStdResidualsColumnName.Location = New System.Drawing.Point(6, 60) + Me.ucrSaveStdResidualsColumnName.Name = "ucrSaveStdResidualsColumnName" + Me.ucrSaveStdResidualsColumnName.Size = New System.Drawing.Size(255, 24) + Me.ucrSaveStdResidualsColumnName.TabIndex = 26 ' - 'ucrLeverageColumnName + 'ucrSaveResidualsColumnName ' - Me.ucrLeverageColumnName.AddQuotesIfUnrecognised = True - Me.ucrLeverageColumnName.IsReadOnly = False - Me.ucrLeverageColumnName.Location = New System.Drawing.Point(128, 93) - Me.ucrLeverageColumnName.Name = "ucrLeverageColumnName" - Me.ucrLeverageColumnName.Size = New System.Drawing.Size(115, 21) - Me.ucrLeverageColumnName.TabIndex = 19 + Me.ucrSaveResidualsColumnName.Location = New System.Drawing.Point(6, 30) + Me.ucrSaveResidualsColumnName.Name = "ucrSaveResidualsColumnName" + Me.ucrSaveResidualsColumnName.Size = New System.Drawing.Size(255, 24) + Me.ucrSaveResidualsColumnName.TabIndex = 25 ' - 'ucrStdResidualsColumnName + 'ucrSaveFittedColumnName ' - Me.ucrStdResidualsColumnName.AddQuotesIfUnrecognised = True - Me.ucrStdResidualsColumnName.IsReadOnly = False - Me.ucrStdResidualsColumnName.Location = New System.Drawing.Point(128, 66) - Me.ucrStdResidualsColumnName.Name = "ucrStdResidualsColumnName" - Me.ucrStdResidualsColumnName.Size = New System.Drawing.Size(115, 21) - Me.ucrStdResidualsColumnName.TabIndex = 17 - ' - 'ucrResidualsColumnName - ' - Me.ucrResidualsColumnName.AddQuotesIfUnrecognised = True - Me.ucrResidualsColumnName.IsReadOnly = False - Me.ucrResidualsColumnName.Location = New System.Drawing.Point(128, 39) - Me.ucrResidualsColumnName.Name = "ucrResidualsColumnName" - Me.ucrResidualsColumnName.Size = New System.Drawing.Size(115, 21) - Me.ucrResidualsColumnName.TabIndex = 15 - ' - 'ucrFittedColumnName - ' - Me.ucrFittedColumnName.AddQuotesIfUnrecognised = True - Me.ucrFittedColumnName.IsReadOnly = False - Me.ucrFittedColumnName.Location = New System.Drawing.Point(128, 12) - Me.ucrFittedColumnName.Name = "ucrFittedColumnName" - Me.ucrFittedColumnName.Size = New System.Drawing.Size(115, 21) - Me.ucrFittedColumnName.TabIndex = 13 + Me.ucrSaveFittedColumnName.Location = New System.Drawing.Point(6, 9) + Me.ucrSaveFittedColumnName.Name = "ucrSaveFittedColumnName" + Me.ucrSaveFittedColumnName.Size = New System.Drawing.Size(255, 24) + Me.ucrSaveFittedColumnName.TabIndex = 24 ' 'ucrSdgButtons ' @@ -595,144 +685,6 @@ Partial Class sdgSimpleRegOptions Me.ucrSdgButtons.Size = New System.Drawing.Size(142, 30) Me.ucrSdgButtons.TabIndex = 0 ' - 'ucrChkMultiplePlots - ' - Me.ucrChkMultiplePlots.Checked = False - Me.ucrChkMultiplePlots.Location = New System.Drawing.Point(6, 7) - Me.ucrChkMultiplePlots.Name = "ucrChkMultiplePlots" - Me.ucrChkMultiplePlots.Size = New System.Drawing.Size(113, 20) - Me.ucrChkMultiplePlots.TabIndex = 22 - ' - 'ucrChkIndividualPlots - ' - Me.ucrChkIndividualPlots.Checked = False - Me.ucrChkIndividualPlots.Location = New System.Drawing.Point(6, 123) - Me.ucrChkIndividualPlots.Name = "ucrChkIndividualPlots" - Me.ucrChkIndividualPlots.Size = New System.Drawing.Size(113, 20) - Me.ucrChkIndividualPlots.TabIndex = 23 - ' - 'ucrPnlIndividualPlots - ' - Me.ucrPnlIndividualPlots.Location = New System.Drawing.Point(20, 164) - Me.ucrPnlIndividualPlots.Name = "ucrPnlIndividualPlots" - Me.ucrPnlIndividualPlots.Size = New System.Drawing.Size(268, 68) - Me.ucrPnlIndividualPlots.TabIndex = 29 - ' - 'rdoCooksDistanceLeverage - ' - Me.rdoCooksDistanceLeverage.AutoSize = True - Me.rdoCooksDistanceLeverage.Location = New System.Drawing.Point(25, 212) - Me.rdoCooksDistanceLeverage.Name = "rdoCooksDistanceLeverage" - Me.rdoCooksDistanceLeverage.Size = New System.Drawing.Size(159, 17) - Me.rdoCooksDistanceLeverage.TabIndex = 35 - Me.rdoCooksDistanceLeverage.TabStop = True - Me.rdoCooksDistanceLeverage.Tag = "Cook's_Distance_v_Leverage" - Me.rdoCooksDistanceLeverage.Text = "Cook's Distance v Leverage" - Me.rdoCooksDistanceLeverage.UseVisualStyleBackColor = True - ' - 'rdoCooksDistance - ' - Me.rdoCooksDistance.AutoSize = True - Me.rdoCooksDistance.Location = New System.Drawing.Point(189, 212) - Me.rdoCooksDistance.Name = "rdoCooksDistance" - Me.rdoCooksDistance.Size = New System.Drawing.Size(102, 17) - Me.rdoCooksDistance.TabIndex = 34 - Me.rdoCooksDistance.TabStop = True - Me.rdoCooksDistance.Tag = "Cook's_Distance" - Me.rdoCooksDistance.Text = "Cook's Distance" - Me.rdoCooksDistance.UseVisualStyleBackColor = True - ' - 'rdoResidualsLeverage - ' - Me.rdoResidualsLeverage.AutoSize = True - Me.rdoResidualsLeverage.Location = New System.Drawing.Point(25, 189) - Me.rdoResidualsLeverage.Name = "rdoResidualsLeverage" - Me.rdoResidualsLeverage.Size = New System.Drawing.Size(128, 17) - Me.rdoResidualsLeverage.TabIndex = 33 - Me.rdoResidualsLeverage.TabStop = True - Me.rdoResidualsLeverage.Tag = "Residuals_v_Leverage" - Me.rdoResidualsLeverage.Text = "Residuals v Leverage" - Me.rdoResidualsLeverage.UseVisualStyleBackColor = True - ' - 'rdoScaleLocation - ' - Me.rdoScaleLocation.AutoSize = True - Me.rdoScaleLocation.Location = New System.Drawing.Point(189, 189) - Me.rdoScaleLocation.Name = "rdoScaleLocation" - Me.rdoScaleLocation.Size = New System.Drawing.Size(96, 17) - Me.rdoScaleLocation.TabIndex = 32 - Me.rdoScaleLocation.TabStop = True - Me.rdoScaleLocation.Tag = "Scale-Location" - Me.rdoScaleLocation.Text = "Scale-Location" - Me.rdoScaleLocation.UseVisualStyleBackColor = True - ' - 'rdoQQ - ' - Me.rdoQQ.AutoSize = True - Me.rdoQQ.Location = New System.Drawing.Point(189, 166) - Me.rdoQQ.Name = "rdoQQ" - Me.rdoQQ.Size = New System.Drawing.Size(44, 17) - Me.rdoQQ.TabIndex = 31 - Me.rdoQQ.TabStop = True - Me.rdoQQ.Tag = "Q-Q" - Me.rdoQQ.Text = "Q-Q" - Me.rdoQQ.UseVisualStyleBackColor = True - ' - 'rdoResidualsFitted - ' - Me.rdoResidualsFitted.AutoSize = True - Me.rdoResidualsFitted.Location = New System.Drawing.Point(25, 166) - Me.rdoResidualsFitted.Name = "rdoResidualsFitted" - Me.rdoResidualsFitted.Size = New System.Drawing.Size(109, 17) - Me.rdoResidualsFitted.TabIndex = 30 - Me.rdoResidualsFitted.TabStop = True - Me.rdoResidualsFitted.Tag = "Residuals_v_Fitted" - Me.rdoResidualsFitted.Text = "Residuals v Fitted" - Me.rdoResidualsFitted.UseVisualStyleBackColor = True - ' - 'rdoSixPlots3Rows - ' - Me.rdoSixPlots3Rows.AutoSize = True - Me.rdoSixPlots3Rows.Location = New System.Drawing.Point(173, 18) - Me.rdoSixPlots3Rows.Name = "rdoSixPlots3Rows" - Me.rdoSixPlots3Rows.Size = New System.Drawing.Size(102, 17) - Me.rdoSixPlots3Rows.TabIndex = 43 - Me.rdoSixPlots3Rows.TabStop = True - Me.rdoSixPlots3Rows.Tag = "Six_Plots(3 rows)" - Me.rdoSixPlots3Rows.Text = "Six Plots(3 rows)" - Me.rdoSixPlots3Rows.UseVisualStyleBackColor = True - ' - 'rdoFourPlots - ' - Me.rdoFourPlots.AutoSize = True - Me.rdoFourPlots.Location = New System.Drawing.Point(9, 18) - Me.rdoFourPlots.Name = "rdoFourPlots" - Me.rdoFourPlots.Size = New System.Drawing.Size(72, 17) - Me.rdoFourPlots.TabIndex = 42 - Me.rdoFourPlots.TabStop = True - Me.rdoFourPlots.Tag = "Four_Plots" - Me.rdoFourPlots.Text = "Four Plots" - Me.rdoFourPlots.UseVisualStyleBackColor = True - ' - 'rdoSixPlots2Rows - ' - Me.rdoSixPlots2Rows.AutoSize = True - Me.rdoSixPlots2Rows.Location = New System.Drawing.Point(9, 41) - Me.rdoSixPlots2Rows.Name = "rdoSixPlots2Rows" - Me.rdoSixPlots2Rows.Size = New System.Drawing.Size(105, 17) - Me.rdoSixPlots2Rows.TabIndex = 41 - Me.rdoSixPlots2Rows.TabStop = True - Me.rdoSixPlots2Rows.Tag = "Six_Plots(2 rows)" - Me.rdoSixPlots2Rows.Text = "Six_Plots(2 rows)" - Me.rdoSixPlots2Rows.UseVisualStyleBackColor = True - ' - 'ucrPnlMutiplePlots - ' - Me.ucrPnlMutiplePlots.Location = New System.Drawing.Point(4, 12) - Me.ucrPnlMutiplePlots.Name = "ucrPnlMutiplePlots" - Me.ucrPnlMutiplePlots.Size = New System.Drawing.Size(268, 56) - Me.ucrPnlMutiplePlots.TabIndex = 40 - ' 'sdgSimpleRegOptions ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -779,10 +731,6 @@ Partial Class sdgSimpleRegOptions Friend WithEvents chkPvalues As CheckBox Friend WithEvents tbRegOptions As TabControl Friend WithEvents tbSave As TabPage - Friend WithEvents ucrFittedColumnName As ucrInputComboBox - Friend WithEvents ucrLeverageColumnName As ucrInputComboBox - Friend WithEvents ucrStdResidualsColumnName As ucrInputComboBox - Friend WithEvents ucrResidualsColumnName As ucrInputComboBox Friend WithEvents grpPlotType As GroupBox Friend WithEvents grpScale As GroupBox Friend WithEvents nudWhiteSpace As NumericUpDown @@ -798,10 +746,6 @@ Partial Class sdgSimpleRegOptions Friend WithEvents ucrChkModel As ucrCheck Friend WithEvents ucrNudDisplayCLevel As ucrNud Friend WithEvents ucrChkPvalues As ucrCheck - Friend WithEvents ucrChkLeverage As ucrCheck - Friend WithEvents ucrChkStdResiduals As ucrCheck - Friend WithEvents ucrChkResiduals As ucrCheck - Friend WithEvents ucrChkFittedValues As ucrCheck Friend WithEvents ucrChkRugs As ucrCheck Friend WithEvents ucrChkJitter As ucrCheck Friend WithEvents ucrChkPartial As ucrCheck @@ -832,4 +776,8 @@ Partial Class sdgSimpleRegOptions Friend WithEvents rdoFourPlots As RadioButton Friend WithEvents rdoSixPlots2Rows As RadioButton Friend WithEvents ucrPnlMutiplePlots As UcrPanel + Friend WithEvents ucrSaveFittedColumnName As ucrSave + Friend WithEvents ucrSaveLeverageColumnName As ucrSave + Friend WithEvents ucrSaveStdResidualsColumnName As ucrSave + Friend WithEvents ucrSaveResidualsColumnName As ucrSave End Class diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 0bf89b1633d..7aca913c64b 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -13,12 +13,15 @@ ' ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class sdgSimpleRegOptions Public clsRModelFunction As RFunction Public clsRDataFrame As ucrDataFrame - Public clsRYVariable, clsRXVariable As RFunction + Public clsRGraphicsOperator As ROperator + Public clsRYVariable, clsRXVariable, clsRSummaryFunction, clsRanovaFunction, clsRConfint, clsRLmOrGLM As RFunction Public clsRGraphics As New RSyntax + Private clsRSyntax As RSyntax Public clsRaovFunction, clsRaovpvalFunction, clsRestpvalFunction, clsRResidualPlotsFunction, clsRgeom_point, clsRPredFunction, clsRDFFunction, clsRFittedValues, clsRWriteFitted, clsRResiduals, clsRWriteResiduals, clsRStdResiduals, clsRWriteStdResiduals, clsRLeverage, clsRWriteLeverage As New RFunction Public clsRggplotFunction, clsRaesFunction, clsRStat_smooth, clsRModelsFunction, clsRCIFunction, clsR_ribbon, clsRaes_ribbon As New RFunction Public bControlsInitialised As Boolean = False @@ -35,7 +38,7 @@ Public Class sdgSimpleRegOptions ucrChkANOVA.AddRSyntaxContainsFunctionNamesCondition(True, {"anova"}) ucrChkEstimates.SetText("Estimates") - ucrChkEstimates.AddRSyntaxContainsFunctionNamesCondition(True, {"anova"}) + ucrChkEstimates.AddRSyntaxContainsFunctionNamesCondition(True, {"summary"}) ucrChkDisplayCLimits.SetText("Confidence Limits") ucrChkDisplayCLimits.AddRSyntaxContainsFunctionNamesCondition(True, {"confint"}) @@ -46,15 +49,15 @@ Public Class sdgSimpleRegOptions ucrChkPvalues.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) - ucrChkFittedValues.SetText("Fitted Values") - ucrChkResiduals.SetText("Residuals") - ucrChkStdResiduals.SetText("Std Residuals") - ucrChkLeverage.SetText("Leverage") + ' ucrChkFittedValues.SetText("Fitted Values") + ' ucrChkResiduals.SetText("Residuals") + ' ucrChkStdResiduals.SetText("Std Residuals") + 'ucrChkLeverage.SetText("Leverage") - ucrChkFittedValues.AddToLinkedControls(ucrFittedColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ucrChkResiduals.AddToLinkedControls(ucrResidualsColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ucrChkStdResiduals.AddToLinkedControls(ucrStdResidualsColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ucrChkLeverage.AddToLinkedControls(ucrLeverageColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ' ucrChkFittedValues.AddToLinkedControls(ucrFittedColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ' ucrChkResiduals.AddToLinkedControls(ucrResidualsColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ' ucrChkStdResiduals.AddToLinkedControls(ucrStdResidualsColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ' ucrChkLeverage.AddToLinkedControls(ucrLeverageColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) ucrChkMultiplePlots.SetText("Multiple Plots") ucrChkIndividualPlots.SetText("Individual Plots") @@ -64,18 +67,122 @@ Public Class sdgSimpleRegOptions ucrChkJitter.SetText("Jitter") ucrChkConfIntervalband.SetText("C.I band") + ucrSaveFittedColumnName.SetPrefix("Fitted") + ucrSaveFittedColumnName.SetSaveTypeAsColumn() + ucrSaveFittedColumnName.SetIsComboBox() + ucrSaveFittedColumnName.SetCheckBoxText("Fitted Values") + ucrSaveFittedColumnName.SetDataFrameSelector(clsRDataFrame) + ucrSaveFittedColumnName.SetAssignToIfUncheckedValue("last_Fitted") + + ucrSaveResidualsColumnName.SetPrefix("Resids") + ucrSaveResidualsColumnName.SetSaveTypeAsColumn() + ucrSaveResidualsColumnName.SetIsComboBox() + ucrSaveResidualsColumnName.SetDataFrameSelector(clsRDataFrame) + ucrSaveResidualsColumnName.SetAssignToIfUncheckedValue("last_Resids") + + ucrSaveStdResidualsColumnName.SetPrefix("Sresids") + ucrSaveStdResidualsColumnName.SetSaveTypeAsColumn() + ucrSaveStdResidualsColumnName.SetIsComboBox() + ucrSaveStdResidualsColumnName.SetDataFrameSelector(clsRDataFrame) + ucrSaveStdResidualsColumnName.SetAssignToIfUncheckedValue("last_Sresids") + + ucrSaveLeverageColumnName.SetPrefix("Lever") + ucrSaveLeverageColumnName.SetSaveTypeAsColumn() + ucrSaveLeverageColumnName.SetIsComboBox() + ucrSaveLeverageColumnName.SetDataFrameSelector(clsRDataFrame) + ucrSaveLeverageColumnName.SetAssignToIfUncheckedValue("last_Lever") + + 'Graphics Model + ucrChkMultiplePlots.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkMultiplePlots.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkMultiplePlots.AddToLinkedControls(ucrChkPartial, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkMultiplePlots.AddToLinkedControls(ucrChkRugs, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkMultiplePlots.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkMultiplePlots.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + + 'grpPlotType.Enabled = True + 'grpScale.Enabled = True + 'ucrNudDisplayCLevel.Enabled = True + 'ucrNudWhiteSpace.Enabled = True + ' ucrChkPartial.Enabled = True + ' ucrChkRugs.Enabled = True + 'ucrChkJitter.Enabled = True + ' ucrChkConfIntervalband.Enabled = True + 'ucrChkIndividualPlots.Checked = False + 'ucrChkMultiplePlots.Checked = False bControlsInitialised = True End Sub - Public Sub SetRCode(clsNewRSyntax As RSyntax, clsNewRLmOrGLM As RFunction, clsNewRModelFunction As RFunction, clsNewRXVariable As RFunction, clsNewRYVariable As RFunction, Optional bReset As Boolean = False) + ' Optional clsRGraphicsOperator As RFunction = Nothing, + Public Sub SetRCode(clsNewRSyntax As RSyntax, Optional clsNewRanovaFunction As RFunction = Nothing, Optional clsNewRSummaryFunction As RFunction = Nothing, Optional clsNewRConfint As RFunction = Nothing, Optional clsNewRModelsFunction As RFunction = Nothing, Optional clsNewRaovpvalFunction As RFunction = Nothing, Optional clsNewRgeom_point As RFunction = Nothing, Optional clsNewRResidualPlots As RFunction = Nothing, Optional clsNewRestpvalFunction As RFunction = Nothing, Optional clsNewRLmOrGLM As RFunction = Nothing, Optional clsNewRModelFunction As RFunction = Nothing, Optional clsNewRXVariable As RFunction = Nothing, Optional clsNewRYVariable As RFunction = Nothing, Optional clsNewRWriteFitted As RFunction = Nothing, Optional clsNewRFittedValues As RFunction = Nothing, Optional clsNewRGraphicsOperator As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If + clsRSyntax = clsNewRSyntax + clsRGraphicsOperator = clsNewRGraphicsOperator + clsRLmOrGLM = clsNewRLmOrGLM + clsRestpvalFunction = clsNewRestpvalFunction clsRModelFunction = clsNewRModelFunction clsRXVariable = clsNewRXVariable clsRYVariable = clsNewRYVariable + clsRWriteFitted = clsNewRWriteFitted + clsRFittedValues = clsNewRFittedValues + clsRaovpvalFunction = clsNewRaovpvalFunction + clsRModelsFunction = clsNewRModelsFunction + clsRSummaryFunction = clsNewRSummaryFunction + clsRConfint = clsNewRConfint + clsRanovaFunction = clsNewRanovaFunction + clsRgeom_point = clsNewRgeom_point + clsRResidualPlotsFunction = clsNewRResidualPlots + + ucrChkModel.SetRSyntax(clsRSyntax, bReset) + ucrChkEstimates.SetRSyntax(clsRSyntax, bReset) + ucrChkANOVA.SetRSyntax(clsRSyntax, bReset) + ucrChkDisplayCLimits.SetRSyntax(clsRSyntax, bReset) + ucrChkPvalues.SetRSyntax(clsRSyntax, bReset) + + End Sub + + Private Sub ucrChkANOVA_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkANOVA.ControlValueChanged + If ucrChkANOVA.Checked Then + clsRSyntax.AddToAfterCodes(clsRanovaFunction, iPosition:=0) + Else + clsRSyntax.RemoveFromAfterCodes(clsRanovaFunction) + End If + End Sub + + Private Sub ucrChkEstimates_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkEstimates.ControlValueChanged + If ucrChkEstimates.Checked Then + clsRSyntax.AddToAfterCodes(clsRSummaryFunction, iPosition:=1) + Else + clsRSyntax.RemoveFromAfterCodes(clsRSummaryFunction) + End If + End Sub + + + Private Sub ucrChkModel_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkModel.ControlValueChanged + If ucrChkModel.Checked Then + clsRSyntax.AddToAfterCodes(clsRModelsFunction, iPosition:=2) + Else + clsRSyntax.RemoveFromAfterCodes(clsRModelsFunction) + End If + End Sub + + Private Sub ucrChkDisplayCLimits_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplayCLimits.ControlValueChanged + If ucrChkDisplayCLimits.Checked Then + clsRSyntax.AddToAfterCodes(clsRConfint, iPosition:=4) + Else + clsRSyntax.RemoveFromAfterCodes(clsRConfint) + End If End Sub + Private Sub ucrChkPvalues_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkPvalues.ControlValueChanged + If ucrChkPvalues.Checked Then + clsRSyntax.AddToAfterCodes(clsRestpvalFunction, iPosition:=5) + Else + clsRSyntax.RemoveFromAfterCodes(clsRestpvalFunction) + End If + End Sub 'Public Sub SetRModelFunction(clsRModelFunc As RFunction) ' clsRModelFunction = clsRModelFunc 'End Sub @@ -91,44 +198,13 @@ Public Class sdgSimpleRegOptions ' clsRXVariable = clsRXVar 'End Sub - Public Sub AnovaTable() - 'p-values should be false here - 'clsRaovFunction.SetRCommand("anova") - 'clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) - 'frmMain.clsRLink.RunScript(clsRaovFunction.ToScript(), 2) - End Sub - - Private Sub AnovaTablePvalues() - 'clsRaovpvalFunction.SetRCommand("anova") - 'clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) - 'clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) - - 'frmMain.clsRLink.RunScript(clsRaovpvalFunction.ToScript(), 2) - End Sub - - Private Sub Estimates() - 'p-values should be false here - frmMain.clsRLink.RunScript(clsRModelFunction.ToScript(), 2) - End Sub - - Private Sub EstimatesPvalues() - clsRestpvalFunction.SetRCommand("summary") - clsRestpvalFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) - frmMain.clsRLink.RunScript(clsRestpvalFunction.ToScript(), 2) - End Sub - - Private Sub Model() - ' clsRModelsFunction.SetRCommand("formula") - ' clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRModelFunction) - 'frmMain.clsRLink.RunScript(clsRModelsFunction.ToScript(), 2) - End Sub Public Sub ResidualPlots() - clsRGraphics.SetOperation("+") - clsRResidualPlotsFunction.SetPackageName("ggplot2") - clsRResidualPlotsFunction.SetRCommand("autoplot") - clsRResidualPlotsFunction.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) - clsRgeom_point.SetRCommand("geom_point") + 'clsRGraphics.SetOperation("+") + 'clsRResidualPlotsFunction.SetPackageName("ggplot2") + 'clsRResidualPlotsFunction.SetRCommand("autoplot") + 'clsRResidualPlotsFunction.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) + 'clsRgeom_point.SetRCommand("geom_point") End Sub Private Sub FittedModel() @@ -242,22 +318,18 @@ Public Class sdgSimpleRegOptions Private Sub chkIndividualPlots_CheckedChanged(sender As Object, e As EventArgs) GraphIndividualPlots() End Sub - - Private Sub rdoMultiplePlots(sender As Object, e As EventArgs) - ResidualPlots() + Private Sub ucrPnlMutiplePlots_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlMutiplePlots.ControlValueChanged If rdoFourPlots.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 2) clsRResidualPlotsFunction.RemoveParameterByName("which") clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) - End If - If rdoSixPlots2Rows.Checked Then + ElseIf rdoSixPlots2Rows.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 3) clsRResidualPlotsFunction.AddParameter("which", "1:6") clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) - End If - If rdoSixPlots3Rows.Checked Then + ElseIf rdoSixPlots3Rows.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 2) clsRResidualPlotsFunction.AddParameter("which", "1:6") clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) @@ -265,11 +337,12 @@ Public Class sdgSimpleRegOptions End If End Sub + Private Sub rdoQQ_CheckedChanged(sender As Object, e As EventArgs) clsRResidualPlotsFunction.RemoveParameterByName("ncol") clsRResidualPlotsFunction.AddParameter("which", 2) - clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) + ' clsRGraphics.AddParameter(True, clsRFunc:=clsRResidualPlotsFunction) + clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) End Sub Private Sub rdoResidualsFitted_CheckedChanged(sender As Object, e As EventArgs) clsRResidualPlotsFunction.RemoveParameterByName("ncol") @@ -326,34 +399,36 @@ Public Class sdgSimpleRegOptions End Sub Private Sub SaveTab() - ucrFittedColumnName.SetPrefix("Fitted") - ucrFittedColumnName.SetItemsTypeAsColumns() - ucrFittedColumnName.SetDefaultTypeAsColumn() - ucrFittedColumnName.SetDataFrameSelector(clsRDataFrame) - ucrFittedColumnName.SetValidationTypeAsRVariable() - ucrResidualsColumnName.SetPrefix("Resids") - ucrResidualsColumnName.SetItemsTypeAsColumns() - ucrResidualsColumnName.SetDefaultTypeAsColumn() - ucrResidualsColumnName.SetDataFrameSelector(clsRDataFrame) - ucrResidualsColumnName.SetValidationTypeAsRVariable() - ucrStdResidualsColumnName.SetPrefix("Sresids") - ucrStdResidualsColumnName.SetItemsTypeAsColumns() - ucrStdResidualsColumnName.SetDefaultTypeAsColumn() - ucrStdResidualsColumnName.SetDataFrameSelector(clsRDataFrame) - ucrStdResidualsColumnName.SetValidationTypeAsRVariable() - ucrLeverageColumnName.SetPrefix("Lever") - ucrLeverageColumnName.SetItemsTypeAsColumns() - ucrLeverageColumnName.SetDefaultTypeAsColumn() - ucrLeverageColumnName.SetDataFrameSelector(clsRDataFrame) - ucrLeverageColumnName.SetValidationTypeAsRVariable() - ucrFittedColumnName.Enabled = False - ucrResidualsColumnName.Enabled = False - ucrStdResidualsColumnName.Enabled = False - ucrLeverageColumnName.Enabled = False - ucrChkFittedValues.Checked = False - ucrChkLeverage.Checked = False - ucrChkStdResiduals.Checked = False - ucrChkResiduals.Checked = False + 'ucrFittedColumnName.SetPrefix("Fitted") + 'ucrFittedColumnName.SetItemsTypeAsColumns() + 'ucrFittedColumnName.SetDefaultTypeAsColumn() + 'ucrFittedColumnName.SetDataFrameSelector(clsRDataFrame) + 'ucrFittedColumnName.SetValidationTypeAsRVariable() + + 'ucrResidualsColumnName.SetPrefix("Resids") + 'ucrResidualsColumnName.SetItemsTypeAsColumns() + 'ucrResidualsColumnName.SetDefaultTypeAsColumn() + 'ucrResidualsColumnName.SetDataFrameSelector(clsRDataFrame) + 'ucrResidualsColumnName.SetValidationTypeAsRVariable() + + 'ucrStdResidualsColumnName.SetPrefix("Sresids") + 'ucrStdResidualsColumnName.SetItemsTypeAsColumns() + 'ucrStdResidualsColumnName.SetDefaultTypeAsColumn() + 'ucrStdResidualsColumnName.SetDataFrameSelector(clsRDataFrame) + 'ucrStdResidualsColumnName.SetValidationTypeAsRVariable() + 'ucrLeverageColumnName.SetPrefix("Lever") + 'ucrLeverageColumnName.SetItemsTypeAsColumns() + 'ucrLeverageColumnName.SetDefaultTypeAsColumn() + 'ucrLeverageColumnName.SetDataFrameSelector(clsRDataFrame) + 'ucrLeverageColumnName.SetValidationTypeAsRVariable() + 'ucrSaveFittedColumnName.Enabled = False + ' ucrResidualsColumnName.Enabled = False + 'ucrStdResidualsColumnName.Enabled = False + ' ucrLeverageColumnName.Enabled = False + 'ucrChkFittedValues.Checked = False + 'ucrChkLeverage.Checked = False + ' ucrChkStdResiduals.Checked = False + 'ucrChkResiduals.Checked = False End Sub Private Sub GraphsTabDefaults() @@ -449,23 +524,23 @@ Public Class sdgSimpleRegOptions End Sub Public Sub RegOptions() - If (ucrChkANOVA.Checked) Then - If (chkPvalues.Checked) Then - AnovaTablePvalues() - Else - AnovaTable() - End If - End If - If (ucrChkEstimates.Checked) Then - If (chkPvalues.Checked) Then - EstimatesPvalues() - Else - Estimates() - End If - End If - If (ucrChkModel.Checked) Then - Model() - End If + 'If (ucrChkANOVA.Checked) Then + ' If (chkPvalues.Checked) Then + ' AnovaTablePvalues() + ' Else + ' AnovaTable() + ' End If + 'End If + 'If (ucrChkEstimates.Checked) Then + ' If (chkPvalues.Checked) Then + ' EstimatesPvalues() + ' Else + ' Estimates() + ' End If + 'End If + 'If (ucrChkModel.Checked) Then + ' Model() + 'End If If (ucrChkDisplayCLimits.Checked) Then ConfidenceInterval() End If @@ -475,105 +550,107 @@ Public Class sdgSimpleRegOptions If (ucrChkFittedModel.Checked) Then frmMain.clsRLink.RunScript(clsRggplotFunction.ToScript(), 3) End If - If ucrChkFittedValues.Checked Then - FittedValues() - frmMain.clsRLink.RunScript(clsRWriteFitted.ToScript(), 3) - End If - If ucrChkResiduals.Checked Then - Residuals() - frmMain.clsRLink.RunScript(clsRWriteResiduals.ToScript(), 3) - End If - If ucrChkStdResiduals.Checked Then - StdResiduals() - frmMain.clsRLink.RunScript(clsRWriteStdResiduals.ToScript(), 3) - End If - If ucrChkLeverage.Checked Then - Leverage() - frmMain.clsRLink.RunScript(clsRWriteLeverage.ToScript(), 3) - End If - End Sub - - Private Sub ucrFittedColumnName_NameChanged() Handles ucrFittedColumnName.NameChanged + 'If ucrChkFittedValues.Checked Then + ' FittedValues() + ' frmMain.clsRLink.RunScript(clsRWriteFitted.ToScript(), 3) + 'End If + 'If ucrChkResiduals.Checked Then + ' Residuals() + ' frmMain.clsRLink.RunScript(clsRWriteResiduals.ToScript(), 3) + 'End If + 'If ucrChkStdResiduals.Checked Then + ' StdResiduals() + ' frmMain.clsRLink.RunScript(clsRWriteStdResiduals.ToScript(), 3) + 'End If + 'If ucrChkLeverage.Checked Then + ' Leverage() + ' frmMain.clsRLink.RunScript(clsRWriteLeverage.ToScript(), 3) + 'End If + End Sub + + Private Sub ucrFittedColumnName_NameChanged() FittedValues() End Sub Private Sub FittedValues() - clsRFittedValues.SetRCommand("fitted") - clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) - clsRWriteFitted.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + ' clsRFittedValues.SetRCommand("fitted") + 'clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) + ' clsRWriteFitted.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") clsRWriteFitted.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - clsRWriteFitted.AddParameter("col_name", Chr(34) & ucrFittedColumnName.GetText & Chr(34)) - clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) + clsRWriteFitted.AddParameter("col_name", Chr(34) & ucrSaveFittedColumnName.GetText & Chr(34)) + 'clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) End Sub - Private Sub ucrResidualsColumnName_NameChanged() Handles ucrResidualsColumnName.NameChanged + Private Sub ucrResidualsColumnName_NameChanged() Residuals() End Sub Private Sub Residuals() - clsRResiduals.SetRCommand("resid") - clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) - clsRWriteResiduals.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - clsRWriteResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - clsRWriteResiduals.AddParameter("col_name", Chr(34) & ucrResidualsColumnName.GetText & Chr(34)) - clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) + 'clsRResiduals.SetRCommand("resid") + 'clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) + 'clsRWriteResiduals.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + 'clsRWriteResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) + 'clsRWriteResiduals.AddParameter("col_name", Chr(34) & ucrResidualsColumnName.GetText & Chr(34)) + 'clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) End Sub - Private Sub ucrStdResidualsColumnName_NameChanged() Handles ucrStdResidualsColumnName.NameChanged + Private Sub ucrStdResidualsColumnName_NameChanged() StdResiduals() End Sub Private Sub StdResiduals() - clsRStdResiduals.SetRCommand("rstandard") - clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRModelFunction) - clsRWriteStdResiduals.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - clsRWriteStdResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - clsRWriteStdResiduals.AddParameter("col_name", Chr(34) & ucrStdResidualsColumnName.GetText & Chr(34)) - clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) + ' clsRStdResiduals.SetRCommand("rstandard") + ' clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRModelFunction) + ' clsRWriteStdResiduals.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + ' clsRWriteStdResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) + ' clsRWriteStdResiduals.AddParameter("col_name", Chr(34) & ucrStdResidualsColumnName.GetText & Chr(34)) + ' clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) End Sub - Private Sub ucrLeverageColumnName_NameChanged() Handles ucrLeverageColumnName.NameChanged + Private Sub ucrLeverageColumnName_NameChanged() Leverage() End Sub Private Sub Leverage() - clsRLeverage.SetRCommand("hatvalues") - clsRLeverage.AddParameter("model", clsRFunctionParameter:=clsRModelFunction) - clsRWriteLeverage.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - clsRWriteLeverage.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - clsRWriteLeverage.AddParameter("col_name", Chr(34) & ucrLeverageColumnName.GetText & Chr(34)) - clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) + 'clsRLeverage.SetRCommand("hatvalues") + 'clsRLeverage.AddParameter("model", clsRFunctionParameter:=clsRModelFunction) + 'clsRWriteLeverage.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + 'clsRWriteLeverage.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) + 'clsRWriteLeverage.AddParameter("col_name", Chr(34) & ucrLeverageColumnName.GetText & Chr(34)) + 'clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) End Sub Private Sub chkLeverage_CheckedChanged(sender As Object, e As EventArgs) - If ucrChkLeverage.Checked Then - ucrLeverageColumnName.Enabled = True - Else - ucrLeverageColumnName.Enabled = False - End If + 'If ucrChkLeverage.Checked Then + ' ucrLeverageColumnName.Enabled = True + 'Else + ' ucrLeverageColumnName.Enabled = False + 'End If End Sub Private Sub chkResiduals_CheckedChanged(sender As Object, e As EventArgs) - If ucrChkResiduals.Checked Then - ucrResidualsColumnName.Enabled = True - Else - ucrResidualsColumnName.Enabled = False - End If + 'If ucrChkResiduals.Checked Then + ' ucrResidualsColumnName.Enabled = True + 'Else + ' ucrResidualsColumnName.Enabled = False + 'End If End Sub Private Sub chkStdResiduals_CheckedChanged(sender As Object, e As EventArgs) - If ucrChkStdResiduals.Checked Then - ucrStdResidualsColumnName.Enabled = True - Else - ucrStdResidualsColumnName.Enabled = False - End If + 'If ucrChkStdResiduals.Checked Then + ' ucrStdResidualsColumnName.Enabled = True + 'Else + ' ucrStdResidualsColumnName.Enabled = False + 'End If End Sub Private Sub chkFittedValues_CheckedChanged(sender As Object, e As EventArgs) - If ucrChkFittedValues.Checked Then - ucrFittedColumnName.Enabled = True - Else - ucrFittedColumnName.Enabled = False - End If + 'If ucrChkFittedValues.Checked Then + ' ucrSaveFittedColumnName.Enabled = True + 'Else + ' ucrSaveFittedColumnName.Enabled = False + 'End If End Sub + + End Class \ No newline at end of file From d600fafe2be92047725f38919e6ddee874c13d18 Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 22 Jun 2017 06:53:22 +0300 Subject: [PATCH 131/201] sdg edits --- instat/dlgRegressionSimple.vb | 11 ----------- instat/sdgSimpleRegOptions.vb | 36 ++++++++++++++++++----------------- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 19215d89cf1..bef183f12b4 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -161,25 +161,14 @@ Public Class dlgRegressionSimple clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator - 'clsFormulaOperator.SetOperation("~") - ' clsFormulaOperator.AddParameter("y", 1, iPosition:=0) - ' clsFormulaOperator.AddParameter("x", 1, iPosition:=1) - clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmOrGLM.Clone clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) - - - - clsRaovFunction.SetPackageName("stats") clsRaovFunction.SetRCommand("anova") clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) clsRaovFunction.iCallType = 2 - - clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) - 'Model clsRModelsFunction = clsRegressionDefaults.clsDefaultModel.Clone clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 7aca913c64b..d0095e4ac3e 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -100,16 +100,10 @@ Public Class sdgSimpleRegOptions ucrChkMultiplePlots.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkMultiplePlots.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - 'grpPlotType.Enabled = True - 'grpScale.Enabled = True - 'ucrNudDisplayCLevel.Enabled = True - 'ucrNudWhiteSpace.Enabled = True - ' ucrChkPartial.Enabled = True - ' ucrChkRugs.Enabled = True - 'ucrChkJitter.Enabled = True - ' ucrChkConfIntervalband.Enabled = True - 'ucrChkIndividualPlots.Checked = False - 'ucrChkMultiplePlots.Checked = False + + ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) + ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) + ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) bControlsInitialised = True End Sub @@ -140,7 +134,7 @@ Public Class sdgSimpleRegOptions ucrChkANOVA.SetRSyntax(clsRSyntax, bReset) ucrChkDisplayCLimits.SetRSyntax(clsRSyntax, bReset) ucrChkPvalues.SetRSyntax(clsRSyntax, bReset) - + ' ucrPnlMutiplePlots.SetRSyntax(clsRSyntax) End Sub Private Sub ucrChkANOVA_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkANOVA.ControlValueChanged @@ -322,18 +316,26 @@ Public Class sdgSimpleRegOptions If rdoFourPlots.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 2) clsRResidualPlotsFunction.RemoveParameterByName("which") - clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction) + clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) + 'clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) ElseIf rdoSixPlots2Rows.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 3) clsRResidualPlotsFunction.AddParameter("which", "1:6") - clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction) + clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) + 'clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=7) ElseIf rdoSixPlots3Rows.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 2) clsRResidualPlotsFunction.AddParameter("which", "1:6") - clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction) + clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) + ' clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=8) + Else + ' clsRSyntax.RemoveFromAfterCodes(clsRGraphicsOperator) + End If + If (rdoFourPlots.Checked Or rdoSixPlots2Rows.Checked Or rdoSixPlots3Rows.Checked Or rdoResidualsFitted.Checked Or rdoQQ.Checked Or rdoResidualsLeverage.Checked Or rdoScaleLocation.Checked Or rdoCooksDistance.Checked Or rdoCooksDistanceLeverage.Checked) Then + 'clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) End If End Sub From ee296c04c4e76f712cf0217ec58500642c9a4a12 Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 22 Jun 2017 07:03:36 +0300 Subject: [PATCH 132/201] multiple plots-sdg --- instat/dlgRegressionSimple.vb | 26 ++++++++++++++++++++++---- instat/sdgSimpleRegOptions.vb | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index bef183f12b4..b30949639cd 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -18,8 +18,8 @@ Imports instat Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True - Public clsModel, clsFormulaOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator - Public clsRPoisson, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsRYVariable, clsRXVariable, clsTFunc, clsRLength As New RFunction + Public clsModel, clsFormulaOperator, clsRGraphicsOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator + Public clsRPoisson, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsRYVariable, clsRXVariable, clsTFunc, clsRLength As New RFunction Private bReset As Boolean = True Public bResetSubDialog As Boolean = False @@ -77,6 +77,10 @@ Public Class dlgRegressionSimple ucrPnlModelType.AddRadioButton(rdoGeneralCase) ucrPnlModelType.AddRadioButton(rdoTwoSample) + ucrPnlModelType.AddFunctionNamesCondition(rdoTwoSample, "t.test") + ucrPnlModelType.AddFunctionNamesCondition(rdoTwoSample, "lm", False) + ucrPnlModelType.AddFunctionNamesCondition(rdoGeneralCase, "lm") + ucrPnlModelType.AddToLinkedControls(ucrModelPreview, {rdoGeneralCase}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True) ucrModelPreview.SetLinkedDisplayControl(lblModelPreview) @@ -128,6 +132,7 @@ Public Class dlgRegressionSimple Private Sub SetDefaults() clsFormulaOperator = New ROperator clsPoissonOperation = New ROperator + clsRGraphicsOperator = New ROperator clsRLmOrGLM = New RFunction clsGLM = New RFunction @@ -149,6 +154,8 @@ Public Class dlgRegressionSimple clsRWriteFitted = New RFunction clsRSummaryFunction = New RFunction clsRanovaFunction = New RFunction + clsRResidualPlots = New RFunction + clsRgeom_point = New RFunction 'clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone ucrSelectorSimpleReg.Reset() @@ -157,18 +164,29 @@ Public Class dlgRegressionSimple ucrModelPreview.Reset() + DataTypeAccepted() - clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator + clsRGraphicsOperator = clsRegressionDefaults.clsDefaultRGraphicsOperator.Clone + clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone + clsRGraphicsOperator.iCallType = 3 clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmOrGLM.Clone clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) + 'Residual Plots + clsRResidualPlots = clsRegressionDefaults.clsDefaultRResidualPlots.Clone + clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + + clsRgeom_point = clsRegressionDefaults.clsDefaultRgeom_pointFunction.Clone + + clsRaovFunction.SetPackageName("stats") clsRaovFunction.SetRCommand("anova") clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) clsRaovFunction.iCallType = 2 + 'Model clsRModelsFunction = clsRegressionDefaults.clsDefaultModel.Clone clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) @@ -288,7 +306,7 @@ Public Class dlgRegressionSimple Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click Display() - sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRConfint:=clsRConfint, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsRLmOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) + sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRGraphicsOperator:=clsRGraphicsOperator, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRgeom_point:=clsRgeom_point, clsNewRResidualPlots:=clsRResidualPlots, clsNewRConfint:=clsRConfint, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsRLmOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) bResetOptionsSubDialog = False sdgSimpleRegOptions.ShowDialog() End Sub diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index d0095e4ac3e..ff7441d528e 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -335,7 +335,7 @@ Public Class sdgSimpleRegOptions ' clsRSyntax.RemoveFromAfterCodes(clsRGraphicsOperator) End If If (rdoFourPlots.Checked Or rdoSixPlots2Rows.Checked Or rdoSixPlots3Rows.Checked Or rdoResidualsFitted.Checked Or rdoQQ.Checked Or rdoResidualsLeverage.Checked Or rdoScaleLocation.Checked Or rdoCooksDistance.Checked Or rdoCooksDistanceLeverage.Checked) Then - 'clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) + clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) End If End Sub From 0acd637d8b5afd38052a566a4ca4f39f4cb96ce6 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Thu, 22 Jun 2017 10:45:03 +0300 Subject: [PATCH 133/201] Updating dlgImportfromLibrary --- instat/dlgFromLibrary.Designer.vb | 153 ++++++++++++++--------------- instat/dlgFromLibrary.vb | 154 ++++++++++++++++++++++-------- 2 files changed, 189 insertions(+), 118 deletions(-) diff --git a/instat/dlgFromLibrary.Designer.vb b/instat/dlgFromLibrary.Designer.vb index aaf17f01f63..d0c5fe1e56e 100644 --- a/instat/dlgFromLibrary.Designer.vb +++ b/instat/dlgFromLibrary.Designer.vb @@ -1,46 +1,45 @@ - -Partial Class dlgFromLibrary - 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() + +Partial Class dlgFromLibrary + 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.cmdLibraryCollection = New System.Windows.Forms.Button() Me.lstCollection = New System.Windows.Forms.ListView() Me.clmDatasets = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) Me.clmDesc = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) - Me.cboPackages = New System.Windows.Forms.ComboBox() Me.rdoDefaultDatasets = New System.Windows.Forms.RadioButton() Me.rdoInstatCollection = New System.Windows.Forms.RadioButton() Me.lblFromPackage = New System.Windows.Forms.Label() - Me.grpCollection = New System.Windows.Forms.GroupBox() - Me.ucrBase = New instat.ucrButtons() Me.cmdHelp = New System.Windows.Forms.Button() - Me.grpCollection.SuspendLayout() + Me.ucrInputPackages = New instat.ucrInputComboBox() + Me.ucrBase = New instat.ucrButtons() + Me.ucrPnlOptions = New instat.UcrPanel() Me.SuspendLayout() ' 'cmdLibraryCollection ' - Me.cmdLibraryCollection.Location = New System.Drawing.Point(6, 19) + Me.cmdLibraryCollection.Location = New System.Drawing.Point(129, 33) Me.cmdLibraryCollection.Name = "cmdLibraryCollection" - Me.cmdLibraryCollection.Size = New System.Drawing.Size(142, 23) + Me.cmdLibraryCollection.Size = New System.Drawing.Size(117, 23) Me.cmdLibraryCollection.TabIndex = 2 Me.cmdLibraryCollection.Text = "Browse" Me.cmdLibraryCollection.UseVisualStyleBackColor = True @@ -54,7 +53,7 @@ Partial Class dlgFromLibrary Me.lstCollection.Name = "lstCollection" Me.lstCollection.ShowGroups = False Me.lstCollection.ShowItemToolTips = True - Me.lstCollection.Size = New System.Drawing.Size(415, 173) + Me.lstCollection.Size = New System.Drawing.Size(397, 173) Me.lstCollection.Sorting = System.Windows.Forms.SortOrder.Ascending Me.lstCollection.TabIndex = 4 Me.lstCollection.UseCompatibleStateImageBehavior = False @@ -70,19 +69,10 @@ Partial Class dlgFromLibrary Me.clmDesc.Text = "Description" Me.clmDesc.Width = 266 ' - 'cboPackages - ' - Me.cboPackages.FormattingEnabled = True - Me.cboPackages.Location = New System.Drawing.Point(97, 33) - Me.cboPackages.Name = "cboPackages" - Me.cboPackages.Size = New System.Drawing.Size(121, 21) - Me.cboPackages.Sorted = True - Me.cboPackages.TabIndex = 14 - ' 'rdoDefaultDatasets ' Me.rdoDefaultDatasets.AutoSize = True - Me.rdoDefaultDatasets.Location = New System.Drawing.Point(10, 10) + Me.rdoDefaultDatasets.Location = New System.Drawing.Point(10, 9) Me.rdoDefaultDatasets.Name = "rdoDefaultDatasets" Me.rdoDefaultDatasets.Size = New System.Drawing.Size(83, 17) Me.rdoDefaultDatasets.TabIndex = 12 @@ -93,7 +83,7 @@ Partial Class dlgFromLibrary 'rdoInstatCollection ' Me.rdoInstatCollection.AutoSize = True - Me.rdoInstatCollection.Location = New System.Drawing.Point(10, 242) + Me.rdoInstatCollection.Location = New System.Drawing.Point(129, 10) Me.rdoInstatCollection.Name = "rdoInstatCollection" Me.rdoInstatCollection.Size = New System.Drawing.Size(149, 17) Me.rdoInstatCollection.TabIndex = 6 @@ -104,75 +94,80 @@ Partial Class dlgFromLibrary 'lblFromPackage ' Me.lblFromPackage.AutoSize = True - Me.lblFromPackage.Location = New System.Drawing.Point(12, 37) + Me.lblFromPackage.Location = New System.Drawing.Point(7, 33) Me.lblFromPackage.Name = "lblFromPackage" Me.lblFromPackage.Size = New System.Drawing.Size(79, 13) Me.lblFromPackage.TabIndex = 15 Me.lblFromPackage.Text = "From Package:" ' - 'grpCollection + 'cmdHelp + ' + Me.cmdHelp.Location = New System.Drawing.Point(332, 239) + Me.cmdHelp.Name = "cmdHelp" + Me.cmdHelp.Size = New System.Drawing.Size(75, 23) + Me.cmdHelp.TabIndex = 17 + Me.cmdHelp.Text = "Help" + Me.cmdHelp.UseVisualStyleBackColor = True + ' + 'ucrInputPackages ' - Me.grpCollection.AutoSize = True - Me.grpCollection.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink - Me.grpCollection.Controls.Add(Me.cmdLibraryCollection) - Me.grpCollection.Location = New System.Drawing.Point(11, 259) - Me.grpCollection.Name = "grpCollection" - Me.grpCollection.Size = New System.Drawing.Size(154, 61) - Me.grpCollection.TabIndex = 16 - Me.grpCollection.TabStop = False + Me.ucrInputPackages.AddQuotesIfUnrecognised = True + Me.ucrInputPackages.IsReadOnly = False + Me.ucrInputPackages.Location = New System.Drawing.Point(92, 33) + Me.ucrInputPackages.Name = "ucrInputPackages" + Me.ucrInputPackages.Size = New System.Drawing.Size(137, 21) + Me.ucrInputPackages.TabIndex = 18 ' 'ucrBase ' Me.ucrBase.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _ Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.ucrBase.Location = New System.Drawing.Point(10, 325) + Me.ucrBase.Location = New System.Drawing.Point(7, 266) Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(406, 53) + Me.ucrBase.Size = New System.Drawing.Size(400, 53) Me.ucrBase.TabIndex = 0 ' - 'cmdHelp + 'ucrPnlOptions ' - Me.cmdHelp.Location = New System.Drawing.Point(350, 239) - Me.cmdHelp.Name = "cmdHelp" - Me.cmdHelp.Size = New System.Drawing.Size(75, 23) - Me.cmdHelp.TabIndex = 17 - Me.cmdHelp.Text = "Help" - Me.cmdHelp.UseVisualStyleBackColor = True + Me.ucrPnlOptions.Location = New System.Drawing.Point(5, 2) + Me.ucrPnlOptions.Name = "ucrPnlOptions" + Me.ucrPnlOptions.Size = New System.Drawing.Size(278, 28) + Me.ucrPnlOptions.TabIndex = 19 ' 'dlgFromLibrary ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(437, 382) + Me.ClientSize = New System.Drawing.Size(431, 325) + Me.Controls.Add(Me.cmdLibraryCollection) + Me.Controls.Add(Me.ucrInputPackages) Me.Controls.Add(Me.cmdHelp) - Me.Controls.Add(Me.grpCollection) Me.Controls.Add(Me.lblFromPackage) - Me.Controls.Add(Me.cboPackages) Me.Controls.Add(Me.rdoDefaultDatasets) Me.Controls.Add(Me.rdoInstatCollection) Me.Controls.Add(Me.lstCollection) Me.Controls.Add(Me.ucrBase) + Me.Controls.Add(Me.ucrPnlOptions) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "dlgFromLibrary" Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Text = "Open Dataset from Library" - Me.grpCollection.ResumeLayout(False) Me.ResumeLayout(False) Me.PerformLayout() - End Sub - - Friend WithEvents ucrBase As ucrButtons - Friend WithEvents cmdLibraryCollection As Button - Friend WithEvents lstCollection As ListView - Friend WithEvents clmDatasets As ColumnHeader - Friend WithEvents clmDesc As ColumnHeader - Friend WithEvents rdoDefaultDatasets As RadioButton - Friend WithEvents cboPackages As ComboBox - Friend WithEvents rdoInstatCollection As RadioButton - Friend WithEvents lblFromPackage As Label - Friend WithEvents grpCollection As GroupBox - Friend WithEvents cmdHelp As Button -End Class + End Sub + + Friend WithEvents ucrBase As ucrButtons + Friend WithEvents cmdLibraryCollection As Button + Friend WithEvents lstCollection As ListView + Friend WithEvents clmDatasets As ColumnHeader + Friend WithEvents clmDesc As ColumnHeader + Friend WithEvents rdoDefaultDatasets As RadioButton + Friend WithEvents rdoInstatCollection As RadioButton + Friend WithEvents lblFromPackage As Label + Friend WithEvents cmdHelp As Button + Friend WithEvents ucrInputPackages As ucrInputComboBox + Friend WithEvents ucrPnlOptions As UcrPanel +End Class \ No newline at end of file diff --git a/instat/dlgFromLibrary.vb b/instat/dlgFromLibrary.vb index b0373974380..a2700d6dee0 100644 --- a/instat/dlgFromLibrary.vb +++ b/instat/dlgFromLibrary.vb @@ -14,49 +14,67 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . Imports instat.Translations -Imports System.IO Imports RDotNet Public Class dlgFromLibrary - Dim strLibraryTemp As String = "dfLibrary" - Dim strPackages As String = "dfPackagesList" - Dim strLibraryPath As String = frmMain.strStaticPath & "\" & "Library" - Dim bFirstLoad As Boolean = True - Dim clsDataFunction As New RFunction - + Private strLibraryTemp As String = "dfLibrary" + Private strPackages As String = "dfPackagesList" + Private strLibraryPath As String = frmMain.strStaticPath & "\" & "Library" + Private bFirstLoad As Boolean = True + Private bReset As Boolean = True + Private clsDataFunction As New RFunction + Private dctPackages As New Dictionary(Of String, String) Private Sub dlgFromLibrary_Load(sender As Object, e As EventArgs) Handles Me.Load autoTranslate(Me) If bFirstLoad Then InitialiseDialog() - ' - SetDefaults() bFirstLoad = False End If + If bReset Then + SetDefaults() + End If + SetRCodeforControls(bReset) + bReset = False TestOkEnabled() End Sub - + Private Sub SetRCodeforControls(bReset As Boolean) + ucrInputPackages.SetRCode(clsDataFunction, bReset) + ucrPnlOptions.SetRCode(clsDataFunction, bReset) + End Sub Private Sub SetDefaults() - rdoDefaultDatasets.Checked = True - cboPackages.SelectedItem = "datasets" - loadDatasets(cboPackages.SelectedItem.ToString) + loadDatasets(ucrInputPackages.GetText) + ucrInputPackages.SetName("datasets") EnableHelp() + cmdLibraryCollection.Visible = False + clsDataFunction.SetPackageName("utils") + clsDataFunction.SetRCommand("data") + clsDataFunction.AddParameter("package", Chr(34) & "datasets" & Chr(34)) + ucrBase.clsRsyntax.SetBaseRFunction(clsDataFunction) End Sub Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 156 - 'fills the combo box - clsDataFunction.SetPackageName("utils") - clsDataFunction.SetRCommand("data") + ucrInputPackages.SetParameter(New RParameter("package")) FillPackagesCombo() - 'TODO remove once control is updated - cboPackages.DropDownStyle = ComboBoxStyle.DropDownList - cboPackages.AutoCompleteMode = AutoCompleteMode.None - cboPackages.AutoCompleteSource = AutoCompleteSource.None lstCollection.HideSelection = False + ucrInputPackages.cboInput.DropDownStyle = ComboBoxStyle.DropDownList + ucrInputPackages.cboInput.AutoCompleteMode = AutoCompleteMode.None + ucrInputPackages.cboInput.AutoCompleteSource = AutoCompleteSource.None + + ucrInputPackages.SetDropDownStyleAsNonEditable() + ucrPnlOptions.AddRadioButton(rdoDefaultDatasets) + ucrPnlOptions.AddRadioButton(rdoInstatCollection) + ucrPnlOptions.bAllowNonConditionValues = True + ucrPnlOptions.AddParameterPresentCondition(rdoDefaultDatasets, "package", True) + ucrPnlOptions.AddParameterPresentCondition(rdoInstatCollection, "package", False) + ucrPnlOptions.AddToLinkedControls(ucrInputPackages, {rdoDefaultDatasets}, bNewLinkedHideIfParameterMissing:=True, bNewLinkedAddRemoveParameter:=True) + ucrInputPackages.SetLinkedDisplayControl(lblFromPackage) End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() + SetRCodeforControls(bReset) + TestOkEnabled() End Sub Private Sub cmdLibraryCollection_Click(sender As Object, e As EventArgs) Handles cmdLibraryCollection.Click @@ -66,19 +84,18 @@ Public Class dlgFromLibrary Me.Hide() End Sub - Private Sub rdoDefaultDatasets_CheckedChanged(sender As Object, e As EventArgs) Handles rdoDefaultDatasets.CheckedChanged, rdoInstatCollection.CheckedChanged + Private Sub rdoDefaultDatasets_CheckedChanged() Handles ucrPnlOptions.ControlValueChanged + 'this is done manually as because lstCollection doesnt inherit from core If rdoDefaultDatasets.Checked Then - cboPackages.Enabled = True + ucrInputPackages.Enabled = True lstCollection.Enabled = True - grpCollection.Enabled = False If Not bFirstLoad Then - loadDatasets(cboPackages.SelectedItem.ToString) + loadDatasets(ucrInputPackages.GetText.ToString) + ElseIf rdoInstatCollection.Checked Then + lstCollection.Items.Clear() + lstCollection.Enabled = False + ucrInputPackages.Enabled = False End If - ElseIf rdoInstatCollection.Checked Then - lstCollection.Items.Clear() - lstCollection.Enabled = False - cboPackages.Enabled = False - grpCollection.Enabled = True End If TestOkEnabled() End Sub @@ -87,20 +104,72 @@ Public Class dlgFromLibrary Dim strTempHolder As String = "lsPackagesHolder" Dim i As Integer Dim lstAvailablePackages As String() - cboPackages.Items.Clear() + ucrInputPackages.Reset() 'This is now a static list because lstAvailablePackages = {"datasets", "reshape2", "lubridate", "plyr", "dplyr", "rtf", "openxlsx", "ggplot2", "extRemes", "GGally", "agridat", "DAAG", "FactoMineR", "plotrix", "candisc", "R6", "openair", "circular", "survival", "Evapotranspiration", "clifro", "devtools", "factoextra", "circlize", "CircStats", "gridExtra", "ggfortify", "rio", "readxl", "lme4", "dummies", "ggthemes", "lazyeval", "stringr", "httr", "jsonlite", "fitdistrplus", "visreg", "climdex.pcic", "mosaic", "ncdf4", "getPass", "RMySQL", "DBI", "EnvStats", "signmedian.test", "sjPlot", "sjmisc", "plotly", "svglite", "htmlTable", "rje", "faraway"} - 'lstAvailablePackages = frmMain.clsRLink.RunInternalScriptGetValue(strPackages & "<-(.packages())").AsCharacter + ''lstAvailablePackages = frmMain.clsRLink.RunInternalScriptGetValue(strPackages & "<-(.packages())").AsCharacter + For i = 0 To lstAvailablePackages.Length - 1 Try If frmMain.clsRLink.RunInternalScriptGetValue("nrow(data(package = " & Chr(34) & lstAvailablePackages(i) & Chr(34) & ")$results)").AsInteger(0) > 0 Then - cboPackages.Items.Add(lstAvailablePackages(i)) + ucrInputPackages.SetItems({lstAvailablePackages(i)}) End If Catch ex As Exception End Try Next + dctPackages.Add("datasets", Chr(34) & "datasets" & Chr(34)) + dctPackages.Add("reshape2", Chr(34) & "reshape2" & Chr(34)) + dctPackages.Add("lubridate", Chr(34) & "lubridate" & Chr(34)) + dctPackages.Add("plyr", Chr(34) & "plyr" & Chr(34)) + dctPackages.Add("dplyr", Chr(34) & "dplyr" & Chr(34)) + dctPackages.Add("rtf", Chr(34) & "rtf" & Chr(34)) + dctPackages.Add("openxlsx", Chr(34) & "openxlsx" & Chr(34)) + dctPackages.Add("ggplot2", Chr(34) & "ggplot2" & Chr(34)) + dctPackages.Add("extRemes", Chr(34) & "extRemes" & Chr(34)) + dctPackages.Add("GGally", Chr(34) & "GGally" & Chr(34)) + dctPackages.Add("agridat", Chr(34) & "agridat" & Chr(34)) + dctPackages.Add("DAAG", Chr(34) & "DAAG" & Chr(34)) + dctPackages.Add("FactoMineR", Chr(34) & "FactoMineR" & Chr(34)) + dctPackages.Add("plotrix", Chr(34) & "plotrix" & Chr(34)) + dctPackages.Add("candisc", Chr(34) & "candisc" & Chr(34)) + dctPackages.Add("R6", Chr(34) & "R6" & Chr(34)) + dctPackages.Add("openair", Chr(34) & "openair" & Chr(34)) + dctPackages.Add("circular", Chr(34) & "circular" & Chr(34)) + dctPackages.Add("survival", Chr(34) & "survival" & Chr(34)) + dctPackages.Add("Evapotranspiration", Chr(34) & "Evapotranspiration" & Chr(34)) + dctPackages.Add("clifro", Chr(34) & "clifro" & Chr(34)) + dctPackages.Add("devtools", Chr(34) & "devtools" & Chr(34)) + dctPackages.Add("factoextra", Chr(34) & "factoextra" & Chr(34)) + dctPackages.Add("circlize", Chr(34) & "circlize" & Chr(34)) + dctPackages.Add("CircStats", Chr(34) & "CircStats" & Chr(34)) + dctPackages.Add("gridExtra", Chr(34) & "gridExtra" & Chr(34)) + dctPackages.Add("rio", Chr(34) & "rio" & Chr(34)) + dctPackages.Add("readxl", Chr(34) & "readxl" & Chr(34)) + dctPackages.Add("lme4", Chr(34) & "lme4" & Chr(34)) + dctPackages.Add("dummies", Chr(34) & "dummies" & Chr(34)) + dctPackages.Add("ggthemes", Chr(34) & "ggthemes" & Chr(34)) + dctPackages.Add("lazyeval", Chr(34) & "lazyeval" & Chr(34)) + dctPackages.Add("stringr", Chr(34) & "stringr" & Chr(34)) + dctPackages.Add("httr", Chr(34) & "httr" & Chr(34)) + dctPackages.Add("jsonlite", Chr(34) & "jsonlite" & Chr(34)) + dctPackages.Add("fitdistrplus", Chr(34) & "fitdistrplus" & Chr(34)) + dctPackages.Add("visreg", Chr(34) & "visreg" & Chr(34)) + dctPackages.Add("climdex.pcic", Chr(34) & "climdex.pcic" & Chr(34)) + dctPackages.Add("mosaic", Chr(34) & "mosaic" & Chr(34)) + dctPackages.Add("ncdf4", Chr(34) & "ncdf4" & Chr(34)) + dctPackages.Add("getPass", Chr(34) & "getPass" & Chr(34)) + dctPackages.Add("RMySQL", Chr(34) & "RMySQL" & Chr(34)) + dctPackages.Add("DBI", Chr(34) & "DBI" & Chr(34)) + dctPackages.Add("sjmisc", Chr(34) & "sjmisc" & Chr(34)) + dctPackages.Add("plotly", Chr(34) & "plotly" & Chr(34)) + dctPackages.Add("svglite", Chr(34) & "svglite" & Chr(34)) + dctPackages.Add("htmlTable", Chr(34) & "htmlTable" & Chr(34)) + dctPackages.Add("rje", Chr(34) & "rje" & Chr(34)) + dctPackages.Add("faraway", Chr(34) & "faraway" & Chr(34)) + ucrInputPackages.SetItems(dctPackages) + ucrInputPackages.SetDropDownStyleAsNonEditable() End Sub Private Sub FillListView(dfDataframe As DataFrame) @@ -127,18 +196,15 @@ Public Class dlgFromLibrary End Sub - Private Sub cboPackages_SelectedValueChanged(sender As Object, e As EventArgs) Handles cboPackages.SelectedValueChanged - loadDatasets(cboPackages.SelectedItem.ToString) - clsDataFunction.AddParameter("package", Chr(34) & cboPackages.SelectedItem.ToString & Chr(34)) + Private Sub cboPackages_SelectedValueChanged() Handles ucrInputPackages.ControlValueChanged + loadDatasets(ucrInputPackages.GetText()) TestOkEnabled() End Sub Private Sub lstCollection_Click(sender As Object, e As EventArgs) Handles lstCollection.Click ucrBase.clsRsyntax.SetCommandString(chkString(lstCollection.SelectedItems(0).SubItems(0).Text)) ucrBase.clsRsyntax.SetAssignTo(chkString(lstCollection.SelectedItems(0).SubItems(0).Text), strTempDataframe:=chkString(lstCollection.SelectedItems(0).SubItems(0).Text)) - 'ucrBase.clsRsyntax.AddParameter("x", chkString(lstCollection.SelectedItems(0).SubItems(0).Text)) clsDataFunction.AddParameter("X", chkString(lstCollection.SelectedItems(0).SubItems(0).Text)) - TestOkEnabled() End Sub @@ -162,6 +228,7 @@ Public Class dlgFromLibrary End Function Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk + 'i leave this this way, because we dont have an option of adding strComment on AddToBeforeCodes Dim bChecked As Boolean bChecked = ucrBase.chkComment.Checked If bChecked Then @@ -176,11 +243,10 @@ Public Class dlgFromLibrary clsHelp.SetPackageName("utils") clsHelp.SetRCommand("help") clsHelp.AddParameter("topic", Chr(34) & lstCollection.SelectedItems(0).Text & Chr(34)) - clsHelp.AddParameter("package", Chr(34) & cboPackages.SelectedItem & Chr(34)) + clsHelp.AddParameter("package", Chr(34) & ucrInputPackages.cboInput.SelectedItem & Chr(34)) clsHelp.AddParameter("help_type", Chr(34) & "html" & Chr(34)) frmMain.clsRLink.RunScript(clsHelp.ToScript, strComment:=" dlgOpenFromLibrary Opening help page for" & " " & lstCollection.SelectedItems(0).Text & " " & "dataset") End Sub - Private Sub EnableHelp() If rdoDefaultDatasets.Checked AndAlso lstCollection.SelectedItems.Count > 0 Then cmdHelp.Enabled = True @@ -189,4 +255,14 @@ Public Class dlgFromLibrary End If End Sub + Private Sub ucrPnlOptions_ControlValueChanged() Handles ucrPnlOptions.ControlValueChanged + 'lstCollection and cmdLibraryCollection are not core so have to be shown manually + If rdoDefaultDatasets.Checked Then + lstCollection.Visible = True + cmdLibraryCollection.Visible = False + Else + lstCollection.Visible = False + cmdLibraryCollection.Visible = True + End If + End Sub End Class \ No newline at end of file From fe789a6a35c20fd2290458187798d3dcb30fc3bd Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 09:56:43 +0100 Subject: [PATCH 134/201] SoR fixes, ucrGeom fix --- instat/dlgStartofRains.vb | 129 +++++++++++++++++++------------------- instat/ucrGeom.vb | 2 +- 2 files changed, 66 insertions(+), 65 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 4e4b436d76c..74d4bc56522 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -348,8 +348,8 @@ Public Class dlgStartofRains clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) 'DRY SPELL - clsDSDrySpell.SetRCommand("instat_calculation$New") - clsDSDryPeriodTen.SetRCommand("instat_calculation$New") + clsDSDrySpell.SetRCommand("instat_calculation$new") + clsDSDryPeriodTen.SetRCommand("instat_calculation$new") clsDSDryPeriodTenList.SetRCommand("list") clsDSDrySpellSub.SetRCommand("list") @@ -370,20 +370,25 @@ Public Class dlgStartofRains clsDSDryPeriodTenFunction.AddParameter("data", strDrySpell, iPosition:=0) clsDSDryPeriodTenFunction.AddParameter("width", 30, iPosition:=1) clsDSDryPeriodTenFunction.AddParameter("FUN", "max", iPosition:=2) - clsDSDryPeriodTenFunction.AddParameter("na.rm", "False", iPosition:=3) + clsDSDryPeriodTenFunction.AddParameter("na.rm", "FALSE", iPosition:=3) clsDSDryPeriodTenFunction.AddParameter("align", Chr(39) & "left" & Chr(39), iPosition:=4) clsDSDryPeriodTenFunction.AddParameter("fill", "NA", iPosition:=5) clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34), iPosition:=2) clsDSDryPeriodTen.AddParameter("save", 2, iPosition:=6) clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") + clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) + clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub, iPosition:=4) + clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) + clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList, iPosition:=5) + 'DRY PERIOD clsDPRainInDaysFunctionLead.bToScriptAsRString = True - clsDPOverallInterval.SetRCommand("instat_calculation$New") + clsDPOverallInterval.SetRCommand("instat_calculation$new") clsDPOverallIntervalList.SetRCommand("list") clsDPRainList.SetRCommand("list") - clsDPRain.SetRCommand("instat_calculation$New") - clsDPRainInDays.SetRCommand("instat_calculation$New") + clsDPRain.SetRCommand("instat_calculation$new") + clsDPRainInDays.SetRCommand("instat_calculation$new") clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) 'width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) @@ -401,9 +406,10 @@ Public Class dlgStartofRains clsDPRainInDays.AddParameter("save", "0", iPosition:=6) clsDPRainInDays.SetAssignTo("Rain_Period_Length") + clsDPRainFunction.bToScriptAsRString = True clsDPRain.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) ' clsDPRain.AddParameter("function_exp", Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) - clsDPRain.AddParameter("function_exp", Chr(34) & clsDPRainFunction.ToScript & Chr(34)) + clsDPRain.AddParameter("function_exp", clsRFunctionParameter:=clsDPRainFunction) clsDPRainFunction.SetRCommand("match") clsDPRainFunction.AddParameter("x", clsROperatorParameter:=clsDPRainFunctionOperator) clsDPRainFunctionOperator.SetOperation("<=") @@ -424,6 +430,7 @@ Public Class dlgStartofRains clsDPOverallIntervalFunction.bToScriptAsRString = True clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsDPOverallInterval.AddParameter("function_exp", clsRFunctionParameter:=clsDPOverallIntervalFunction, iPosition:=1) + clsDPOverallIntervalFunction.SetPackageName("zoo") clsDPOverallIntervalFunction.SetRCommand("rollapply") clsDPOverallIntervalFunction.AddParameter("data", strAboveThreshold, iPosition:=0) ' data = Above_Threshold or = strAboveThreshold clsDPOverallIntervalFunction.AddParameter("width", clsROperatorParameter:=clsDPOverallIntervalFunctionOperator, iPosition:=1) @@ -440,7 +447,6 @@ Public Class dlgStartofRains clsDPOverallInterval.AddParameter("result_name", Chr(34) & strDPOverallIntervalRain & Chr(34), iPosition:=2) clsDPOverallInterval.AddParameter("save", "2", iPosition:=6) clsDPOverallInterval.SetAssignTo("Overall_Interval") - ' clsDPParameter.SetArgument(clsDPOverallInterval) ' Combined filter clsCombinedList.SetRCommand("list") @@ -465,8 +471,8 @@ Public Class dlgStartofRains 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRPercentile, "TRRight", 20) 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRAmount, "TRRight", strWetSpell) - 'clsTRCombineOperator.AddParameter("TRRight", 20, iPosition:=1) ' ucrNudTRAmount - 'clsTRCombineOperator.AddParameter("TRRight", strWetSpell, iPosition:=1) + ' clsTRCombineOperator.AddParameter("TRAmount", 20, iPosition:=1) ' ucrNudTRAmount + clsTRCombineOperator.AddParameter("TRPerc", strWetSpell, iPosition:=1) 'If rdoTRAmount.Checked Then ucrNudTRAmount 'ElseIf rdoTRPercentile.Checked Then strWetSpell @@ -484,7 +490,6 @@ Public Class dlgStartofRains clsDSCombineOperator.AddParameter("DSMax", 10, iPosition:=1) ' run if chkDP is checked - ' issue here as everything is hard coded ' clsCombineOperator.AddParameter("dryperiod", clsROperatorParameter:=clsDPCombineOperator, iPosition:=4) clsDPCombineOperator.SetOperation("==") clsDPCombineOperator.AddParameter("DPleft", strDPOverallIntervalRain, iPosition:=0) @@ -522,6 +527,7 @@ Public Class dlgStartofRains ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRainyDaysOperator, New RParameter("Rain", 1), iAdditionalPairNo:=1) ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsDPRainInDaysFunction, New RParameter("data", 0), iAdditionalPairNo:=2) ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRainCombineOperator, New RParameter("rain", 0), iAdditionalPairNo:=3) + ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsTRRollingSumFunction, New RParameter("data", 0), iAdditionalPairNo:=4) ucrNudThreshold.AddAdditionalCodeParameterPair(clsRainCombineOperator, New RParameter("rainThreshold", 1), iAdditionalPairNo:=1) ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ' false in these brackets, when in initialise @@ -535,7 +541,7 @@ Public Class dlgStartofRains ucrSelectorForStartofRains.SetRCode(clsAddKey, bReset) 'Total Rainfall - ucrChkTotalRainfall.SetRCode(clsCombinedList, bReset) 'TODO: correct class + ucrChkTotalRainfall.SetRCode(clsCombinedList, bReset) ucrNudTROverDays.SetRCode(clsTRRollingSumFunction, bReset) ucrNudTRPercentile.SetRCode(clsTRWetSpellFunction, bReset) ucrReceiverRainfall.SetRCode(clsTRRollingSumFunction, bReset) @@ -616,63 +622,15 @@ Public Class dlgStartofRains clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) End Sub - 'issue with width = - Private Sub DrySpell() - clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) - clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList, iPosition:=5) - clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub, iPosition:=4) - clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - End Sub + 'issue with width = not changing + ' when to call sub_calculations + ' sort calculated_from + ' help with set up of the rdo option Private Sub DryPeriod() clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=5) End Sub - Private Sub CombinedFilter() - Dim strTempFunExpression As String = Chr(34) - - 'clsCombinedFilter.RemoveParameterByName("function_exp") - - 'If ucrChkTotalRainfall.Checked Then - ' strTempFunExpression = strTempFunExpression & "roll_sum_Rain > " - ' If rdoTRAmount.Checked Then - ' strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value - ' 'clsCombinedList.RemoveParameterByName("sub4") - ' ElseIf rdoTRPercentile.Checked Then - ' ' strTempFunExpression = strTempFunExpression & strWetSpell - 'clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) - 'End If - ' strTempFunExpression = strTempFunExpression & " & " - ' 'clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) - 'Else - ' 'clsCombinedList.RemoveParameterByName("sub3") - 'End If - - If ucrChkNumberOfRainyDays.Checked Then - 'strTempFunExpression = strTempFunExpression & strRollingRainDays >= & ucrNudRDMinimumDays.Value & " & " - ' clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) - ' param name = sub2, setrcode(clscombinedlist) - ' Else - ' clsCombinedList.RemoveParameterByName("sub2") - End If - If ucrChkDrySpell.Checked Then - 'strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " - ' clsCombinedList.AddParameter("sub1", clsRFunctionParameter:=clsDSDryPeriodTen, bIncludeArgumentName:=False) - 'Else - ' clsCombinedList.RemoveParameterByName("sub1") - End If - If ucrChkDryPeriod.Checked Then - 'strTempFunExpression = strTempFunExpression & "DP_Overall_Interval_Rain == 0 " & " & " - ' clsCombinedList.AddParameter("sub5", clsRFunctionParameter:=clsDPOverallInterval, bIncludeArgumentName:=False) - 'Else - ' clsCombinedList.RemoveParameterByName("sub5") - End If - - 'strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) - - 'clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) - End Sub - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() SetRCodeForControls(True) @@ -696,7 +654,50 @@ Public Class dlgStartofRains + 'Private Sub CombinedFilter() + ' Dim strTempFunExpression As String = Chr(34) + + ' clsCombinedFilter.RemoveParameterByName("function_exp") + + ' If ucrChkTotalRainfall.Checked Then + ' strTempFunExpression = strTempFunExpression & "roll_sum_Rain > " + ' If rdoTRAmount.Checked Then + ' strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value + ' clsCombinedList.RemoveParameterByName("sub4") + ' ElseIf rdoTRPercentile.Checked Then + ' strTempFunExpression = strTempFunExpression & strWetSpell + ' clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) + ' End If + ' strTempFunExpression = strTempFunExpression & " & " + ' clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) + ' Else + ' clsCombinedList.RemoveParameterByName("sub3") + ' End If + ' If ucrChkNumberOfRainyDays.Checked Then + ' strTempFunExpression = strTempFunExpression & strRollingRainDays >= & ucrNudRDMinimumDays.Value & " & " + ' clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) + ' param Name = sub2, SetRCode(clsCombinedList) + ' Else + ' clsCombinedList.RemoveParameterByName("sub2") + ' End If + ' If ucrChkDrySpell.Checked Then + ' strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " + ' clsCombinedList.AddParameter("sub1", clsRFunctionParameter:=clsDSDryPeriodTen, bIncludeArgumentName:=False) + ' Else + ' clsCombinedList.RemoveParameterByName("sub1") + ' End If + ' If ucrChkDryPeriod.Checked Then + ' strTempFunExpression = strTempFunExpression & "DP_Overall_Interval_Rain == 0 " & " & " + ' clsCombinedList.AddParameter("sub5", clsRFunctionParameter:=clsDPOverallInterval, bIncludeArgumentName:=False) + ' Else + ' clsCombinedList.RemoveParameterByName("sub5") + ' End If + + ' strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) + + ' clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) + 'End Sub 'Private Sub ucrReceiverDOY_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDOY.SelectionChanged ' firstDayofTheYear() diff --git a/instat/ucrGeom.vb b/instat/ucrGeom.vb index 0a7813b9699..de20075aef1 100644 --- a/instat/ucrGeom.vb +++ b/instat/ucrGeom.vb @@ -46,7 +46,7 @@ Public Class ucrGeom Dim clsTempFunc As RFunction Dim iGeomIndex As Integer - MyBase.SetRCode(clsNewCodeStructure, bReset) + MyBase.SetRCode(clsNewCodeStructure, bReset, bUpdate = True) If clsNewCodeStructure IsNot Nothing AndAlso TypeOf (clsNewCodeStructure) Is RFunction Then clsTempFunc = TryCast(clsNewCodeStructure, RFunction) If clsTempFunc IsNot Nothing AndAlso clsTempFunc.strRCommand IsNot Nothing Then From cbfa8f798f93bb7761d924b815bf87275d7ce792 Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 09:57:34 +0100 Subject: [PATCH 135/201] addition to ucrCore --- instat/ucrCore.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index b11332e4bfe..524140b8f63 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -224,7 +224,7 @@ Public Class ucrCore Public Overridable Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True) If clsRCode Is Nothing OrElse Not clsRCode.Equals(clsNewCodeStructure) Then clsRCode = clsNewCodeStructure - If bUpdateRCodeFromControl AndAlso CanUpdate() Then 'andalso bUpdate? + If bUpdateRCodeFromControl AndAlso CanUpdate() AndAlso bUpdate Then UpdateRCode(bReset) End If End If From 84838981d3cf0b081fd937d90aa5001867c28df0 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Thu, 22 Jun 2017 10:28:50 +0100 Subject: [PATCH 136/201] moved calls to R into one method --- instat/clsRLink.vb | 107 ++++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 54 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index e5e1e9ad49d..85215574a18 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -233,13 +233,14 @@ Public Class RLink Public Sub RunScript(strScript As String, Optional iCallType As Integer = 0, Optional strComment As String = "") Dim strCapturedScript As String - Dim temp As RDotNet.SymbolicExpression - Dim strTemp As String + Dim expTemp As RDotNet.SymbolicExpression + Dim strTemp As String = "" Dim strOutput As String Dim strScriptWithComment As String Dim strSplitScript As String Dim strTempGraphsDirectory As String Dim clsPNGFunction As New RFunction + Dim strTempAssignTo As String = ".temp_val" strTempGraphsDirectory = System.IO.Path.Combine(System.IO.Path.GetTempPath() & "R_Instat_Temp_Graphs") strOutput = "" @@ -275,18 +276,19 @@ Public Class RLink 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) - clsEngine.Evaluate(clsPNGFunction.ToScript()) + Evaluate(clsPNGFunction.ToScript()) 'need to boost resolution of the devices, it's not as good as with ggsave. End If End If - clsEngine.Evaluate(strScript) + Evaluate(strScript) If iCallType = 3 Then If strGraphDisplayOption = "view_output_window" OrElse strGraphDisplayOption = "view_separate_window" Then '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 - clsEngine.Evaluate("graphics.off()") 'not quite sure if this would work, otherwise find the right way to close the appropriate devices. + Evaluate("graphics.off()") '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. @@ -322,14 +324,15 @@ 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 iCallType = 1 OrElse iCallType = 4 Then Try - temp = clsEngine.Evaluate(strScript) - strTemp = String.Join(Environment.NewLine, temp.AsCharacter()) - strOutput = strOutput & strTemp & Environment.NewLine - If iCallType = 4 Then - + 'TODO check this is valid syntax in all cases + ' i.e. this is potentially: x <- y <- 1 + Evaluate(strTempAssignTo & " <- " & strScript) + 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)") @@ -341,7 +344,7 @@ Public Class RLink strSplitScript = Left(strScript, strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray)) If strSplitScript <> "" Then Try - clsEngine.Evaluate(strSplitScript) + Evaluate(strSplitScript) 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 @@ -350,9 +353,12 @@ Public Class RLink strCapturedScript = "capture.output(" & strSplitScript & ")" End If Try - temp = clsEngine.Evaluate(strCapturedScript) - strTemp = String.Join(Environment.NewLine, temp.AsCharacter()) - strOutput = strOutput & strTemp & Environment.NewLine + Evaluate(strTempAssignTo & " <- " & strCapturedScript) + 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 @@ -370,31 +376,12 @@ Public Class RLink Public Function RunInternalScriptGetValue(strScript As String, Optional strVariableName As String = ".temp_value", Optional bSilent As Boolean = False) As SymbolicExpression Dim expTemp As SymbolicExpression Dim strCommand As String - 'Dim iSplitIndex As Integer - 'Dim iRemaining As Integer - 'Dim iStartPoint As Integer expTemp = Nothing strCommand = strVariableName & "<-" & strScript - 'If strCommand.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 clsEngine IsNot Nothing Then - Try - 'iRemaining = strScript.Length - 'iStartPoint = 1000 - 'While iRemaining > 1000 - ' iSplitIndex = strScript.Substring(iStartPoint).IndexOf(",") + iStartPoint - ' iRemaining = strScript.Length - iSplitIndex - ' strScript = strScript.Insert(iSplitIndex + 1, Environment.NewLine) - ' iStartPoint = iSplitIndex + 1000 - 'End While - clsEngine.Evaluate(strCommand) - expTemp = clsEngine.GetSymbol(strVariableName) - Catch ex As Exception - If Not bSilent Then - MsgBox(ex.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 If - End Try + Evaluate(strCommand, bSilent:=bSilent) + expTemp = GetSymbol(strVariableName, bSilent:=bSilent) End If Return expTemp End Function @@ -416,27 +403,26 @@ Public Class RLink End Function Public Function RunInternalScript(strScript As String, Optional strVariableName As String = "", Optional bSilent As Boolean = False) As Boolean - 'Dim iSplitIndex As Integer - 'Dim iRemaining As Integer Dim strCommand As String + Dim bReturn As Boolean - strCommand = strVariableName & "<-" & strScript - 'If strCommand.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") - ' Return False + If strVariableName <> "" Then + strCommand = strVariableName & "<-" & strScript + Else + strCommand = strScript + End If + If clsEngine IsNot Nothing Then + bReturn = Evaluate(strCommand, bSilent:=bSilent) + Return bReturn + Else + Return False + End If + End Function + + Private Function Evaluate(strScript As String, Optional bSilent As Boolean = False) As Boolean If clsEngine IsNot Nothing Then Try - 'iRemaining = strScript.Length - 'While iRemaining > 1000 - ' iSplitIndex = strScript.Substring(1000).IndexOf(",") - ' iRemaining = strScript.Length - iSplitIndex - ' strScript = strScript.Insert(iSplitIndex + 1, Environment.NewLine) - 'End While - If strVariableName <> "" Then - clsEngine.Evaluate(strVariableName & "<-" & strScript) - Else - clsEngine.Evaluate(strScript) - End If + clsEngine.Evaluate(strScript) Return True Catch ex As Exception If Not bSilent Then @@ -446,9 +432,22 @@ Public Class RLink End Try Else Return False - End If + End If End Function + Private Function GetSymbol(strSymbol As String, Optional bSilent As Boolean = False) As SymbolicExpression + Dim expTemp As SymbolicExpression + + Try + expTemp = clsEngine.GetSymbol(strSymbol) + Catch ex As Exception + If Not bSilent Then + MsgBox(ex.Message & Environment.NewLine & "The error occurred in attempting to retrieve:" & strSymbol, MsgBoxStyle.Critical, "Error retrieving R variable") + End If + expTemp = Nothing + End Try + Return expTemp + End Function Public Function GetDefaultDataFrameName(strPrefix As String, Optional iStartIndex As Integer = 1, Optional bIncludeIndex As Boolean = True) As String Dim strTemp As String From 7c2069319f1ff019c723707c888e889933b98730 Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 10:44:26 +0100 Subject: [PATCH 137/201] code update --- instat/dlgStartofRains.vb | 50 ++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 74d4bc56522..5eb0a76be6f 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -94,7 +94,6 @@ Public Class dlgStartofRains ucrNudThreshold.DecimalPlaces = 2 'Total Rainfall - ' set up panel correctly! ucrPnlTRCalculateBy.AddRadioButton(rdoTRAmount) ucrPnlTRCalculateBy.AddRadioButton(rdoTRPercentile) ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "sub4", False) @@ -102,22 +101,22 @@ Public Class dlgStartofRains ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) + 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRPercentile, "TRPerc", strWetSpell, False) + 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRAmount, "TRPerc", strWetSpell) + ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "TRAmount") + ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "TRPerc") + + ucrNudTRAmount.SetParameter(New RParameter("TRAmount", 1, False), False) 'clsTRParameter.SetArgumentName("sub3") 'ucrChkTotalRainfall.SetParameter(clsTRParameter, bNewChangeParameterValue:=False) - ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 1, False), False) - ucrChkTotalRainfall.AddAdditionalCodeParameterPair(clsTRCombineOperator, New RParameter("totalrainfall", clsTRCombineOperator, 1, False), iAdditionalPairNo:=1) + ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("totalrainfall", clsTRCombineOperator, 1, False), iAdditionalPairNo:=1) ucrChkTotalRainfall.SetText("Total Rainfall") ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudTROverDays.SetLinkedDisplayControl(lblTROverDays) ucrChkTotalRainfall.AddToLinkedControls(ucrPnlTRCalculateBy, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - 'ucrChkTotalRainfall.AddParameterPresentCondition(ucrNudTROverDays, {True}) - 'ucrChkTotalRainfall.AddParameterPresentCondition(ucrPnlTRCalculateBy, {True}) - - ' pecentile adds a function, check for amount. - ' nud ucrNudTROverDays.SetParameter(New RParameter("width", 1)) ucrNudTROverDays.SetMinMax(1, 366) ' I think? ' don't allow quotes around it @@ -128,11 +127,10 @@ Public Class dlgStartofRains ucrNudTRPercentile.Increment = 0.1 'Number of Rainy days - ' if checked, then it runs a function: instat_calculation$new TODO: How to do that? Do manually. ' clsRDParameter.SetArgumentName("sub2") ' ucrChkNumberOfRainyDays.SetParameter(clsRDParameter, bNewChangeParameterValue:=False) ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub2", clsRDRollingRainDays, 2, False), False) - ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsRDCombineOperator, New RParameter("raindays", 2, False), iAdditionalPairNo:=1) + ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("raindays", clsRDCombineOperator, 2, False), iAdditionalPairNo:=1) ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -149,7 +147,7 @@ Public Class dlgStartofRains 'clsDSParameter.SetArgumentName("sub1") 'ucrChkDrySpell.SetParameter(clsDSParameter, bNewChangeParameterValue:=False) ucrChkDrySpell.SetParameter(New RParameter("sub1", clsDSDryPeriodTen, 3, False), False) - ucrChkDrySpell.AddAdditionalCodeParameterPair(clsDSCombineOperator, New RParameter("dryspell", 3, False), iAdditionalPairNo:=1) + ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryspell", clsDSCombineOperator, 3, False), iAdditionalPairNo:=1) ucrChkDrySpell.SetText("Dry Spell") ucrChkDrySpell.AddToLinkedControls(ucrNudDSLengthOfTime, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkDrySpell.AddToLinkedControls(ucrNudDSMaximumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -161,7 +159,7 @@ Public Class dlgStartofRains ' Dry Period ucrChkDryPeriod.SetParameter(New RParameter("sub5", clsDPOverallInterval, 3, False), False) - ucrChkDryPeriod.AddAdditionalCodeParameterPair(clsDPCombineOperator, New RParameter("dryperiod", 4, False), iAdditionalPairNo:=1) + ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryperiod", clsDPCombineOperator, 4, False), iAdditionalPairNo:=1) 'clsDPParameter.SetArgumentName("sub5") 'ucrChkDryPeriod.SetParameter(clsDPParameter, bNewChangeParameterValue:=False) ucrChkDryPeriod.SetText("Dry Period") @@ -468,17 +466,14 @@ Public Class dlgStartofRains clsTRCombineOperator.SetOperation(">") clsTRCombineOperator.AddParameter("TRLeft", strRollSumRain, iPosition:=0) - 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRPercentile, "TRRight", 20) - 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRAmount, "TRRight", strWetSpell) - - ' clsTRCombineOperator.AddParameter("TRAmount", 20, iPosition:=1) ' ucrNudTRAmount + clsTRCombineOperator.AddParameter("TRAmount", 20, iPosition:=1) ' ucrNudTRAmount clsTRCombineOperator.AddParameter("TRPerc", strWetSpell, iPosition:=1) 'If rdoTRAmount.Checked Then ucrNudTRAmount 'ElseIf rdoTRPercentile.Checked Then strWetSpell ' run if chkRD is checked - ' clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) + ' clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) clsRDCombineOperator.SetOperation(">=") clsRDCombineOperator.AddParameter("RDleft", strRollingRainDays, iPosition:=0) clsRDCombineOperator.AddParameter("RDMin", 2, iPosition:=1) @@ -564,6 +559,7 @@ Public Class dlgStartofRains ' Combine ucrNudRDMinimumDays.SetRCode(clsRDCombineOperator, bReset) ucrNudDSMaximumDays.SetRCode(clsDSCombineOperator, bReset) + ucrNudTRAmount.SetRCode(clsTRCombineOperator, bReset) End Sub Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk @@ -622,7 +618,7 @@ Public Class dlgStartofRains clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) End Sub - 'issue with width = not changing + ' issue with width = not changing ' when to call sub_calculations ' sort calculated_from ' help with set up of the rdo option @@ -638,12 +634,18 @@ Public Class dlgStartofRains End Sub Private Sub TestOKEnabled() - ' 'If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.Text <> "" AndAlso ucrNudFrom.Text = "" AndAlso ucrNudTo.Text = "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.Text <> "" AndAlso ucrNudRDOutOfDays.Text <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso Not ucrNudTROverDays.GetText = "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.Text <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.Text = ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((chkDrySpell.Checked AndAlso nudDSMaximumDays.Text <> "" AndAlso ucrNudDSLengthOfTime.Text <> "") OrElse Not chkDrySpell.Checked) AndAlso ((chkDryPeriod.Checked AndAlso nudDPMaxRain.Text <> "" AndAlso nudDPRainPeriod.Text <> "" AndAlso nudDPOverallInterval.Text <> "") OrElse Not chkDryPeriod.Checked) Then - ' ' ucrBase.OKEnabled(True) - ' 'Else - ' ' ucrBase.OKEnabled(False) - ' 'End If - End Sub ' ucrNudDPRainPeriod, ucrNudDPMaxRain, ucrNudDPOverallInterval + ' If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.GetText <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.GetText <> "" AndAlso ucrNudRDOutOfDays.GetText <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso ucrNudTROverDays.GetText <> "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.GetText <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.GetText <> ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((ucrChkDrySpell.Checked AndAlso ucrNudDSMaximumDays.GetText <> "" AndAlso ucrNudDSLengthOfTime.GetText <> "") OrElse Not ucrChkDrySpell.Checked) AndAlso ((ucrChkDryPeriod.Checked AndAlso ucrNudDPMaxRain.GetText <> "" AndAlso ucrNudDPRainPeriod.GetText <> "" AndAlso ucrNudDPOverallInterval.GetText <> "") OrElse Not ucrChkDryPeriod.Checked) Then + ucrBase.OKEnabled(True) + ' Else + ' ucrBase.OKEnabled(False) + ' End If + End Sub + + Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlContentsChanged, ucrSaveStartofRains.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrNudThreshold.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrChkNumberOfRainyDays.ControlContentsChanged, ucrNudRDMinimumDays.ControlContentsChanged, ucrNudRDOutOfDays.ControlContentsChanged, ucrChkTotalRainfall.ControlContentsChanged, ucrNudTROverDays.ControlContentsChanged, ucrPnlTRCalculateBy.ControlContentsChanged, ucrNudTRAmount.ControlContentsChanged, ucrNudTRPercentile.ControlContentsChanged, ucrChkDrySpell.ControlContentsChanged, ucrNudDSMaximumDays.ControlContentsChanged, ucrNudDSLengthOfTime.ControlContentsChanged, ucrChkDryPeriod.ControlContentsChanged, ucrNudDPMaxRain.ControlContentsChanged, ucrNudDPRainPeriod.ControlContentsChanged, ucrNudDPOverallInterval.ControlContentsChanged + TestOKEnabled() + End Sub + + From 94a4e986680cbde3539d299bd5a4c6cd7211d797 Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 10:53:26 +0100 Subject: [PATCH 138/201] update --- instat/dlgSpells.vb | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 4a89071488c..578c323d87f 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -117,6 +117,10 @@ Public Class dlgSpells End Sub Private Sub SetDefaults() + Dim strRainDay As String = "rain_day" + Dim strDrySpell As String = "Dry_Spell" + Dim strRainDay2 As String = "rain_day2" + clsApplyInstatFunction = New RFunction clsMaxValueManipulation = New RFunction clsDayFromAndTo = New RFunction @@ -172,7 +176,7 @@ Public Class dlgSpells clsRRaindayMatch.bToScriptAsRString = True clsRRainday.SetRCommand("instat_calculation$new") clsRRainday.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - clsRRainday.AddParameter("result_name", Chr(34) & "rain_day" & Chr(34), iPosition:=2) + clsRRainday.AddParameter("result_name", Chr(34) & strRainDay & Chr(34), iPosition:=2) clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=3) clsRRainday.AddParameter("save", "0", iPosition:=6) clsRRainday.AddParameter("function_exp", clsRFunctionParameter:=clsRRaindayMatch, iPosition:=1) @@ -192,9 +196,9 @@ Public Class dlgSpells ' Spell Length clsSpellLength.SetRCommand("instat_calculation$new") clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - clsSpellLength.AddParameter("result_name", Chr(34) & "Dry_Spell" & Chr(34), iPosition:=2) + clsSpellLength.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34), iPosition:=2) clsSpellLength.AddParameter("save", 0, iPosition:=6) - clsSpellLength.SetAssignTo("Dry_Spell") + clsSpellLength.SetAssignTo(strDrySpell) clsMaxValueManipulation.SetRCommand("list") @@ -203,10 +207,10 @@ Public Class dlgSpells clsAdditionalCondition.SetRCommand("instat_calculation$new") clsAdditionalCondition.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsAdditionalCondition.AddParameter("function_exp", clsRFunctionParameter:=clsAdditionalConditionReplaceFunction, iPosition:=1) - clsAdditionalCondition.AddParameter("result_name", Chr(34) & "rain_day2" & Chr(34), iPosition:=2) + clsAdditionalCondition.AddParameter("result_name", Chr(34) & strRainDay2 & Chr(34), iPosition:=2) clsAdditionalCondition.AddParameter("save", 0, iPosition:=6) clsAdditionalConditionReplaceFunction.SetRCommand("replace") - clsAdditionalConditionReplaceFunction.AddParameter("x", "rain_day", iPosition:=0) + clsAdditionalConditionReplaceFunction.AddParameter("x", strRainDay, iPosition:=0) clsAdditionalConditionReplaceFunction.AddParameter("list", ucrNudFrom.Value - 1, iPosition:=1) clsAdditionalConditionReplaceFunction.AddParameter("values", "0", iPosition:=2) clsAdditionalConditionList.SetRCommand("list") @@ -217,15 +221,15 @@ Public Class dlgSpells clsMaxValue.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) clsMaxValue.AddParameter("function_exp", clsRFunctionParameter:=clsMaxValueFunction, iPosition:=1) clsMaxValueFunction.SetRCommand("max") - clsMaxValueFunction.AddParameter("x", "Dry_Spell") + clsMaxValueFunction.AddParameter("x", strDrySpell) clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34), iPosition:=3) clsMaxValue.AddParameter("save", 2, iPosition:=6) clsMaxValue.SetAssignTo(ucrSaveSpells.GetText) clsMaxValue.SetAssignTo("Spells_Rain") clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") - clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=0) + clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) 'Base Function ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) @@ -267,23 +271,24 @@ Public Class dlgSpells frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining column(s) as key") ' clsDayFromAndTo.SetAssignTo("Day_From_and_To") + + ' conditional is checked: + ' clsSpellLength has a different function expression. Can't it have the same? And strRainDay2 = strRainDay1 and overwrites itself + If ucrChkConditional.Checked Then clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) clsAdditionalCondition.AddParameter("function_exp", Chr(34) & clsAdditionalConditionReplaceFunction.ToScript & Chr(34)) clsAdditionalCondition.SetAssignTo("Additional_Condition") - clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day2)-cummax((rain_day2==0)*cumsum(rain_day2))" & Chr(34)) + clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(" & strRainDay2 & ")-cummax((" & strRainDay2 & "==0)*cumsum(" & strRainDay2 & "))" & Chr(34)) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsAdditionalCondition, bIncludeArgumentName:=False) Else - clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(rain_day)-cummax((rain_day==0)*cumsum(rain_day))" & Chr(34), iPosition:=1) + clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(" & strRainDay & ")-cummax((" & strRainDay & "==0)*cumsum(" & strRainDay & "))" & Chr(34)) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) End If - - clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=1) - ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) End Sub Private Sub DayBoundaries() ' TODO: What to do about the calculated_from, sub1, etc From f8d5dcf372569cb26e50c980f956741d435eb8cb Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 11:15:08 +0100 Subject: [PATCH 139/201] spells update --- instat/dlgSpells.vb | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 578c323d87f..cb843277d4a 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -107,7 +107,12 @@ Public Class dlgSpells ucrInputCondition.SetItems({"<= Amount of Rain", "Between", ">= Amount of Rain"}) ucrInputCondition.SetDropDownStyleAsNonEditable() - ucrChkConditional.SetText("Conditional on Rain at Start of Spell") ' todo: set default + ucrChkConditional.SetText("Conditional on Rain at Start of Spell") + ucrChkConditional.SetParameter(New RParameter("sub1", 1, False), False) + + 'TODO with new system + 'ValueIfChecked:=clsAdditionalCondition + 'ValueIfUnchecked:=clsRRainday ucrSaveSpells.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) ucrSaveSpells.SetLabelText("New Column Name:") @@ -119,8 +124,8 @@ Public Class dlgSpells Private Sub SetDefaults() Dim strRainDay As String = "rain_day" Dim strDrySpell As String = "Dry_Spell" - Dim strRainDay2 As String = "rain_day2" + 'TODO: make these .clear clsApplyInstatFunction = New RFunction clsMaxValueManipulation = New RFunction clsDayFromAndTo = New RFunction @@ -166,6 +171,7 @@ Public Class dlgSpells clsDayFromAndToOperator.AddParameter("to", clsROperatorParameter:=clsDayToOperator, iPosition:=1) clsDayToOperator.SetOperation("<=") clsDayToOperator.AddParameter("to", 366) + clsDayFromAndTo.SetAssignTo("Day_From_and_To") ' group clsGroupBy.SetRCommand("instat_calculation$new") @@ -198,6 +204,8 @@ Public Class dlgSpells clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsSpellLength.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34), iPosition:=2) clsSpellLength.AddParameter("save", 0, iPosition:=6) + clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(" & strRainDay & ")-cummax((" & strRainDay & "==0)*cumsum(" & strRainDay & "))" & Chr(34)) + clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) clsSpellLength.SetAssignTo(strDrySpell) clsMaxValueManipulation.SetRCommand("list") @@ -207,13 +215,16 @@ Public Class dlgSpells clsAdditionalCondition.SetRCommand("instat_calculation$new") clsAdditionalCondition.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsAdditionalCondition.AddParameter("function_exp", clsRFunctionParameter:=clsAdditionalConditionReplaceFunction, iPosition:=1) - clsAdditionalCondition.AddParameter("result_name", Chr(34) & strRainDay2 & Chr(34), iPosition:=2) + clsAdditionalCondition.AddParameter("result_name", Chr(34) & strRainDay & Chr(34), iPosition:=2) clsAdditionalCondition.AddParameter("save", 0, iPosition:=6) + clsAdditionalCondition.SetAssignTo("Additional_Condition") clsAdditionalConditionReplaceFunction.SetRCommand("replace") clsAdditionalConditionReplaceFunction.AddParameter("x", strRainDay, iPosition:=0) clsAdditionalConditionReplaceFunction.AddParameter("list", ucrNudFrom.Value - 1, iPosition:=1) clsAdditionalConditionReplaceFunction.AddParameter("values", "0", iPosition:=2) clsAdditionalConditionList.SetRCommand("list") + clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) + clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) 'Max Value clsMaxValueFunction.bToScriptAsRString = True @@ -269,24 +280,11 @@ Public Class dlgSpells Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining column(s) as key") - ' clsDayFromAndTo.SetAssignTo("Day_From_and_To") - ' conditional is checked: - ' clsSpellLength has a different function expression. Can't it have the same? And strRainDay2 = strRainDay1 and overwrites itself - If ucrChkConditional.Checked Then - clsAdditionalConditionList.AddParameter("sub1", clsRFunctionParameter:=clsRRainday) - clsAdditionalCondition.AddParameter("sub_calculation", clsRFunctionParameter:=clsAdditionalConditionList) - - clsAdditionalCondition.AddParameter("function_exp", Chr(34) & clsAdditionalConditionReplaceFunction.ToScript & Chr(34)) - clsAdditionalCondition.SetAssignTo("Additional_Condition") - clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(" & strRainDay2 & ")-cummax((" & strRainDay2 & "==0)*cumsum(" & strRainDay2 & "))" & Chr(34)) - clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsAdditionalCondition, bIncludeArgumentName:=False) Else - clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(" & strRainDay & ")-cummax((" & strRainDay & "==0)*cumsum(" & strRainDay & "))" & Chr(34)) - clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) End If End Sub From 6b3b54b52fdce5062c1de778eca667e9c4618613 Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 11:30:29 +0100 Subject: [PATCH 140/201] bug fix --- instat/dlgStartofRains.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 5eb0a76be6f..6e56bd81a1a 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -147,7 +147,7 @@ Public Class dlgStartofRains 'clsDSParameter.SetArgumentName("sub1") 'ucrChkDrySpell.SetParameter(clsDSParameter, bNewChangeParameterValue:=False) ucrChkDrySpell.SetParameter(New RParameter("sub1", clsDSDryPeriodTen, 3, False), False) - ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryspell", clsDSCombineOperator, 3, False), iAdditionalPairNo:=1) + ucrChkDrySpell.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryspell", clsDSCombineOperator, 3, False), iAdditionalPairNo:=1) ucrChkDrySpell.SetText("Dry Spell") ucrChkDrySpell.AddToLinkedControls(ucrNudDSLengthOfTime, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrChkDrySpell.AddToLinkedControls(ucrNudDSMaximumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) @@ -159,7 +159,7 @@ Public Class dlgStartofRains ' Dry Period ucrChkDryPeriod.SetParameter(New RParameter("sub5", clsDPOverallInterval, 3, False), False) - ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryperiod", clsDPCombineOperator, 4, False), iAdditionalPairNo:=1) + ucrChkDryPeriod.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryperiod", clsDPCombineOperator, 4, False), iAdditionalPairNo:=1) 'clsDPParameter.SetArgumentName("sub5") 'ucrChkDryPeriod.SetParameter(clsDPParameter, bNewChangeParameterValue:=False) ucrChkDryPeriod.SetText("Dry Period") From 5ec78dbde9f97d3d784dc2fc347a61c206914b82 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Thu, 22 Jun 2017 12:19:37 +0100 Subject: [PATCH 141/201] fixed bugs with open from library fixed bug with selector right click --- instat/dlgFromLibrary.vb | 238 ++++++++++++++----------------------- instat/ucrInputComboBox.vb | 2 +- instat/ucrSelector.vb | 2 +- 3 files changed, 88 insertions(+), 154 deletions(-) diff --git a/instat/dlgFromLibrary.vb b/instat/dlgFromLibrary.vb index a2700d6dee0..e82a0c9b106 100644 --- a/instat/dlgFromLibrary.vb +++ b/instat/dlgFromLibrary.vb @@ -24,6 +24,8 @@ Public Class dlgFromLibrary Private bReset As Boolean = True Private clsDataFunction As New RFunction Private dctPackages As New Dictionary(Of String, String) + Private lstAvailablePackages As List(Of String) + Private Sub dlgFromLibrary_Load(sender As Object, e As EventArgs) Handles Me.Load autoTranslate(Me) If bFirstLoad Then @@ -37,38 +39,60 @@ Public Class dlgFromLibrary bReset = False TestOkEnabled() End Sub - Private Sub SetRCodeforControls(bReset As Boolean) - ucrInputPackages.SetRCode(clsDataFunction, bReset) - ucrPnlOptions.SetRCode(clsDataFunction, bReset) - End Sub - Private Sub SetDefaults() - loadDatasets(ucrInputPackages.GetText) - ucrInputPackages.SetName("datasets") - EnableHelp() - cmdLibraryCollection.Visible = False - clsDataFunction.SetPackageName("utils") - clsDataFunction.SetRCommand("data") - clsDataFunction.AddParameter("package", Chr(34) & "datasets" & Chr(34)) - ucrBase.clsRsyntax.SetBaseRFunction(clsDataFunction) - End Sub Private Sub InitialiseDialog() + Dim expPackageData As SymbolicExpression + Dim iDataSets As Integer = 0 + ucrBase.iHelpTopicID = 156 - ucrInputPackages.SetParameter(New RParameter("package")) - FillPackagesCombo() + lstCollection.HideSelection = False - ucrInputPackages.cboInput.DropDownStyle = ComboBoxStyle.DropDownList - ucrInputPackages.cboInput.AutoCompleteMode = AutoCompleteMode.None - ucrInputPackages.cboInput.AutoCompleteSource = AutoCompleteSource.None + 'This is now a static list because packages are not loaded in R. + lstAvailablePackages = {"agridat", "candisc", "CircStats", "circular", "climdex.pcic", "DAAG", "datasets", "dplyr", "EnvStats", "Evapotranspiration", "extRemes", "factoextra", "FactoMineR", "faraway", "fitdistrplus", "GGally", "ggplot2", "ggthemes", "htmlTable", "lme4", "lubridate", "openair", "plotly", "plotrix", "plyr", "reshape2", "sjmisc", "stringr", "survival"}.ToList() + 'TODO possibly don't want to be running this much R code in initialse. + ' alternatively have to make sure all packages have some data + For i = lstAvailablePackages.Count - 1 To 0 Step -1 + Try + expPackageData = frmMain.clsRLink.RunInternalScriptGetValue("nrow(data(package = " & Chr(34) & lstAvailablePackages(i) & Chr(34) & ")$results)", bSilent:=True) + If expPackageData IsNot Nothing Then + iDataSets = expPackageData.AsInteger(0) + End If + If iDataSets = 0 Then + lstAvailablePackages.RemoveAt(i) + End If + Catch ex As Exception + lstAvailablePackages.RemoveAt(i) + End Try + Next + lstAvailablePackages.Sort() + + ucrInputPackages.SetParameter(New RParameter("package")) + ucrInputPackages.SetItems(lstAvailablePackages.ToArray(), bAddConditions:=True) ucrInputPackages.SetDropDownStyleAsNonEditable() + ucrInputPackages.SetLinkedDisplayControl(lblFromPackage) + ucrPnlOptions.AddRadioButton(rdoDefaultDatasets) ucrPnlOptions.AddRadioButton(rdoInstatCollection) - ucrPnlOptions.bAllowNonConditionValues = True - ucrPnlOptions.AddParameterPresentCondition(rdoDefaultDatasets, "package", True) - ucrPnlOptions.AddParameterPresentCondition(rdoInstatCollection, "package", False) - ucrPnlOptions.AddToLinkedControls(ucrInputPackages, {rdoDefaultDatasets}, bNewLinkedHideIfParameterMissing:=True, bNewLinkedAddRemoveParameter:=True) - ucrInputPackages.SetLinkedDisplayControl(lblFromPackage) + ucrPnlOptions.AddRSyntaxContainsFunctionNamesCondition(rdoDefaultDatasets, {"data"}) + ucrPnlOptions.AddRSyntaxContainsFunctionNamesCondition(rdoInstatCollection, {"data"}, False) + ucrPnlOptions.AddToLinkedControls(ucrInputPackages, {rdoDefaultDatasets}, bNewLinkedHideIfParameterMissing:=True) + End Sub + + Private Sub SetDefaults() + 'TODO this should be the new clear method + clsDataFunction.ClearParameters() + + clsDataFunction.SetPackageName("utils") + clsDataFunction.SetRCommand("data") + clsDataFunction.AddParameter("package", Chr(34) & "datasets" & Chr(34)) + + ucrBase.clsRsyntax.AddToBeforeCodes(clsDataFunction) + End Sub + + Private Sub SetRCodeforControls(bReset As Boolean) + ucrInputPackages.SetRCode(clsDataFunction, bReset) + ucrPnlOptions.SetRSyntax(ucrBase.clsRsyntax, bReset) End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -84,127 +108,59 @@ Public Class dlgFromLibrary Me.Hide() End Sub - Private Sub rdoDefaultDatasets_CheckedChanged() Handles ucrPnlOptions.ControlValueChanged + Private Sub ucrPnlOptions_ControlValueChanged() Handles ucrPnlOptions.ControlValueChanged 'this is done manually as because lstCollection doesnt inherit from core If rdoDefaultDatasets.Checked Then - ucrInputPackages.Enabled = True - lstCollection.Enabled = True - If Not bFirstLoad Then - loadDatasets(ucrInputPackages.GetText.ToString) - ElseIf rdoInstatCollection.Checked Then - lstCollection.Items.Clear() - lstCollection.Enabled = False - ucrInputPackages.Enabled = False - End If + lstCollection.Visible = True + cmdLibraryCollection.Visible = False + ucrBase.clsRsyntax.AddToBeforeCodes(clsDataFunction) + Else + lstCollection.Visible = False + cmdLibraryCollection.Visible = True + ucrBase.clsRsyntax.RemoveFromBeforeCodes(clsDataFunction) End If TestOkEnabled() End Sub - Private Sub FillPackagesCombo() - Dim strTempHolder As String = "lsPackagesHolder" - Dim i As Integer - Dim lstAvailablePackages As String() - ucrInputPackages.Reset() - 'This is now a static list because - lstAvailablePackages = {"datasets", "reshape2", "lubridate", "plyr", "dplyr", "rtf", "openxlsx", "ggplot2", "extRemes", "GGally", "agridat", "DAAG", "FactoMineR", "plotrix", "candisc", "R6", "openair", "circular", "survival", "Evapotranspiration", "clifro", "devtools", "factoextra", "circlize", "CircStats", "gridExtra", "ggfortify", "rio", "readxl", "lme4", "dummies", "ggthemes", "lazyeval", "stringr", "httr", "jsonlite", "fitdistrplus", "visreg", "climdex.pcic", "mosaic", "ncdf4", "getPass", "RMySQL", "DBI", "EnvStats", "signmedian.test", "sjPlot", "sjmisc", "plotly", "svglite", "htmlTable", "rje", "faraway"} - - ''lstAvailablePackages = frmMain.clsRLink.RunInternalScriptGetValue(strPackages & "<-(.packages())").AsCharacter - - For i = 0 To lstAvailablePackages.Length - 1 - Try - If frmMain.clsRLink.RunInternalScriptGetValue("nrow(data(package = " & Chr(34) & lstAvailablePackages(i) & Chr(34) & ")$results)").AsInteger(0) > 0 Then - ucrInputPackages.SetItems({lstAvailablePackages(i)}) - End If - Catch ex As Exception - - End Try - Next - dctPackages.Add("datasets", Chr(34) & "datasets" & Chr(34)) - dctPackages.Add("reshape2", Chr(34) & "reshape2" & Chr(34)) - dctPackages.Add("lubridate", Chr(34) & "lubridate" & Chr(34)) - dctPackages.Add("plyr", Chr(34) & "plyr" & Chr(34)) - dctPackages.Add("dplyr", Chr(34) & "dplyr" & Chr(34)) - dctPackages.Add("rtf", Chr(34) & "rtf" & Chr(34)) - dctPackages.Add("openxlsx", Chr(34) & "openxlsx" & Chr(34)) - dctPackages.Add("ggplot2", Chr(34) & "ggplot2" & Chr(34)) - dctPackages.Add("extRemes", Chr(34) & "extRemes" & Chr(34)) - dctPackages.Add("GGally", Chr(34) & "GGally" & Chr(34)) - dctPackages.Add("agridat", Chr(34) & "agridat" & Chr(34)) - dctPackages.Add("DAAG", Chr(34) & "DAAG" & Chr(34)) - dctPackages.Add("FactoMineR", Chr(34) & "FactoMineR" & Chr(34)) - dctPackages.Add("plotrix", Chr(34) & "plotrix" & Chr(34)) - dctPackages.Add("candisc", Chr(34) & "candisc" & Chr(34)) - dctPackages.Add("R6", Chr(34) & "R6" & Chr(34)) - dctPackages.Add("openair", Chr(34) & "openair" & Chr(34)) - dctPackages.Add("circular", Chr(34) & "circular" & Chr(34)) - dctPackages.Add("survival", Chr(34) & "survival" & Chr(34)) - dctPackages.Add("Evapotranspiration", Chr(34) & "Evapotranspiration" & Chr(34)) - dctPackages.Add("clifro", Chr(34) & "clifro" & Chr(34)) - dctPackages.Add("devtools", Chr(34) & "devtools" & Chr(34)) - dctPackages.Add("factoextra", Chr(34) & "factoextra" & Chr(34)) - dctPackages.Add("circlize", Chr(34) & "circlize" & Chr(34)) - dctPackages.Add("CircStats", Chr(34) & "CircStats" & Chr(34)) - dctPackages.Add("gridExtra", Chr(34) & "gridExtra" & Chr(34)) - dctPackages.Add("rio", Chr(34) & "rio" & Chr(34)) - dctPackages.Add("readxl", Chr(34) & "readxl" & Chr(34)) - dctPackages.Add("lme4", Chr(34) & "lme4" & Chr(34)) - dctPackages.Add("dummies", Chr(34) & "dummies" & Chr(34)) - dctPackages.Add("ggthemes", Chr(34) & "ggthemes" & Chr(34)) - dctPackages.Add("lazyeval", Chr(34) & "lazyeval" & Chr(34)) - dctPackages.Add("stringr", Chr(34) & "stringr" & Chr(34)) - dctPackages.Add("httr", Chr(34) & "httr" & Chr(34)) - dctPackages.Add("jsonlite", Chr(34) & "jsonlite" & Chr(34)) - dctPackages.Add("fitdistrplus", Chr(34) & "fitdistrplus" & Chr(34)) - dctPackages.Add("visreg", Chr(34) & "visreg" & Chr(34)) - dctPackages.Add("climdex.pcic", Chr(34) & "climdex.pcic" & Chr(34)) - dctPackages.Add("mosaic", Chr(34) & "mosaic" & Chr(34)) - dctPackages.Add("ncdf4", Chr(34) & "ncdf4" & Chr(34)) - dctPackages.Add("getPass", Chr(34) & "getPass" & Chr(34)) - dctPackages.Add("RMySQL", Chr(34) & "RMySQL" & Chr(34)) - dctPackages.Add("DBI", Chr(34) & "DBI" & Chr(34)) - dctPackages.Add("sjmisc", Chr(34) & "sjmisc" & Chr(34)) - dctPackages.Add("plotly", Chr(34) & "plotly" & Chr(34)) - dctPackages.Add("svglite", Chr(34) & "svglite" & Chr(34)) - dctPackages.Add("htmlTable", Chr(34) & "htmlTable" & Chr(34)) - dctPackages.Add("rje", Chr(34) & "rje" & Chr(34)) - dctPackages.Add("faraway", Chr(34) & "faraway" & Chr(34)) - ucrInputPackages.SetItems(dctPackages) - ucrInputPackages.SetDropDownStyleAsNonEditable() - End Sub - Private Sub FillListView(dfDataframe As DataFrame) Dim lstItem As New ListViewItem - 'clears the listview before loading + lstCollection.Items.Clear() - 'Fills the list - For i As Integer = 0 To dfDataframe.RowCount - 1 - lstItem = lstCollection.Items.Add(dfDataframe(i, 0)) - lstItem.SubItems.Add(dfDataframe(i, 1)) - Next + If dfDataframe IsNot Nothing Then + For i As Integer = 0 To dfDataframe.RowCount - 1 + lstItem = lstCollection.Items.Add(dfDataframe(i, 0)) + lstItem.SubItems.Add(dfDataframe(i, 1)) + Next + End If End Sub - Private Sub loadDatasets(strPackage As String) - Try - Dim dfPackage As DataFrame - dfPackage = frmMain.clsRLink.RunInternalScriptGetValue("data.frame(data(package =" & Chr(34) & strPackage & Chr(34) & ")$results[1:nrow(data(package =" & Chr(34) & strPackage & Chr(34) & ")$results),3:4])").AsDataFrame - If dfPackage.RowCount > 1 Then - FillListView(dfDataframe:=dfPackage) - End If - Catch ex As Exception - 'lstCollection.Items.Clear() - End Try + Private Sub LoadDatasets(strPackage As String) + Dim expTemp As SymbolicExpression + Dim dfPackage As DataFrame = Nothing + If strPackage IsNot Nothing Then + expTemp = frmMain.clsRLink.RunInternalScriptGetValue("data.frame(data(package =" & Chr(34) & strPackage & Chr(34) & ")$results[1:nrow(data(package =" & Chr(34) & strPackage & Chr(34) & ")$results),3:4])", bSilent:=True) + If expTemp IsNot Nothing Then + dfPackage = expTemp.AsDataFrame + End If + End If + FillListView(dfDataframe:=dfPackage) End Sub - Private Sub cboPackages_SelectedValueChanged() Handles ucrInputPackages.ControlValueChanged - loadDatasets(ucrInputPackages.GetText()) + Private Sub ucrInputPackages_ControlValueChanged() Handles ucrInputPackages.ControlValueChanged + LoadDatasets(ucrInputPackages.GetText()) TestOkEnabled() End Sub - Private Sub lstCollection_Click(sender As Object, e As EventArgs) Handles lstCollection.Click - ucrBase.clsRsyntax.SetCommandString(chkString(lstCollection.SelectedItems(0).SubItems(0).Text)) - ucrBase.clsRsyntax.SetAssignTo(chkString(lstCollection.SelectedItems(0).SubItems(0).Text), strTempDataframe:=chkString(lstCollection.SelectedItems(0).SubItems(0).Text)) - clsDataFunction.AddParameter("X", chkString(lstCollection.SelectedItems(0).SubItems(0).Text)) + Private Sub lstCollection_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstCollection.SelectedIndexChanged + Dim strDataName As String + + If lstCollection.SelectedItems.Count > 0 Then + strDataName = CheckString(lstCollection.SelectedItems(0).SubItems(0).Text) + ucrBase.clsRsyntax.SetCommandString(strDataName) + ucrBase.clsRsyntax.SetAssignTo(strDataName, strTempDataframe:=strDataName) + clsDataFunction.AddParameter("X", strDataName) + End If TestOkEnabled() End Sub @@ -214,11 +170,10 @@ Public Class dlgFromLibrary Else ucrBase.OKEnabled(False) End If - EnableHelp() End Sub - Private Function chkString(ByVal strValue As String) + Private Function CheckString(ByVal strValue As String) Dim strLength As Integer = strValue.IndexOf(" ") If strLength = -1 Then Return strValue @@ -227,17 +182,6 @@ Public Class dlgFromLibrary End If End Function - Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk - 'i leave this this way, because we dont have an option of adding strComment on AddToBeforeCodes - Dim bChecked As Boolean - bChecked = ucrBase.chkComment.Checked - If bChecked Then - frmMain.clsRLink.RunScript(clsDataFunction.ToScript(), strComment:=ucrBase.strComment) - Else - frmMain.clsRLink.RunScript(clsDataFunction.ToScript()) - End If - End Sub - Private Sub cmdHelp_Click(sender As Object, e As EventArgs) Handles cmdHelp.Click Dim clsHelp As New RFunction clsHelp.SetPackageName("utils") @@ -247,6 +191,7 @@ Public Class dlgFromLibrary clsHelp.AddParameter("help_type", Chr(34) & "html" & Chr(34)) frmMain.clsRLink.RunScript(clsHelp.ToScript, strComment:=" dlgOpenFromLibrary Opening help page for" & " " & lstCollection.SelectedItems(0).Text & " " & "dataset") End Sub + Private Sub EnableHelp() If rdoDefaultDatasets.Checked AndAlso lstCollection.SelectedItems.Count > 0 Then cmdHelp.Enabled = True @@ -254,15 +199,4 @@ Public Class dlgFromLibrary cmdHelp.Enabled = False End If End Sub - - Private Sub ucrPnlOptions_ControlValueChanged() Handles ucrPnlOptions.ControlValueChanged - 'lstCollection and cmdLibraryCollection are not core so have to be shown manually - If rdoDefaultDatasets.Checked Then - lstCollection.Visible = True - cmdLibraryCollection.Visible = False - Else - lstCollection.Visible = False - cmdLibraryCollection.Visible = True - End If - End Sub End Class \ No newline at end of file diff --git a/instat/ucrInputComboBox.vb b/instat/ucrInputComboBox.vb index a260c2a713d..ba07920ad20 100644 --- a/instat/ucrInputComboBox.vb +++ b/instat/ucrInputComboBox.vb @@ -146,7 +146,7 @@ Public Class ucrInputComboBox Dim dctValues As New Dictionary(Of String, String) If bAddConditions Then For Each strTemp As String In strItems - dctValues.Add(strTemp, strTemp) + dctValues.Add(strTemp, Chr(34) & strTemp & Chr(34)) Next SetItems(dctValues, bClearExisting) Else diff --git a/instat/ucrSelector.vb b/instat/ucrSelector.vb index 5b12b0f0442..1a9fe76cb54 100644 --- a/instat/ucrSelector.vb +++ b/instat/ucrSelector.vb @@ -122,7 +122,7 @@ Public Class ucrSelector End Sub Public Sub AddAll() - If CurrentReceiver IsNot Nothing AndAlso (lstAvailableVariable.SelectedItems.Count > 0) Then + If CurrentReceiver IsNot Nothing Then SelectAll() Add() End If From 8c15f374b80b986fb7570463cb228bdb05e3face Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 22 Jun 2017 14:29:47 +0300 Subject: [PATCH 142/201] edits --- instat/dlgRegressionSimple.Designer.vb | 93 +++++++----------------- instat/dlgRegressionSimple.vb | 99 +++++++++++++++----------- instat/sdgSimpleRegOptions.vb | 7 +- instat/sdgVariableTransformations.vb | 52 +++++++++----- 4 files changed, 120 insertions(+), 131 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 543b246752c..26426d66d33 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -40,17 +40,14 @@ Partial Class dlgRegressionSimple Me.lblConfidenceInterval = New System.Windows.Forms.Label() Me.lblDifferenceInMeans = New System.Windows.Forms.Label() Me.ucrChkFunction = New instat.ucrCheck() - Me.ucrNudSuccess = New instat.ucrNud() - Me.ucrInputLevel2 = New instat.ucrInputComboBox() - Me.ucrInputLevel1 = New instat.ucrInputComboBox() - Me.lblLevel1 = New System.Windows.Forms.Label() Me.ucrModelPreview = New instat.ucrInputTextBox() Me.ucrFamily = New instat.ucrDistributions() Me.ucrBase = New instat.ucrButtons() - Me.ucrSaveModels = New instat.ucrSave() Me.ucrPnlModelType = New instat.UcrPanel() Me.lblHyp1 = New System.Windows.Forms.Label() Me.grpParameters = New System.Windows.Forms.GroupBox() + Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() + Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() Me.rdoTwoSample = New System.Windows.Forms.RadioButton() Me.rdoGeneralCase = New System.Windows.Forms.RadioButton() Me.ucrChkConvertToVariate = New instat.ucrCheck() @@ -61,8 +58,7 @@ Partial Class dlgRegressionSimple Me.ucrSelectorSimpleReg = New instat.ucrSelectorByDataFrameAddRemove() Me.lblExplanatory = New System.Windows.Forms.Label() Me.lblResponse = New System.Windows.Forms.Label() - Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() - Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() + Me.ucrSaveModels = New instat.ucrSave() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -173,35 +169,6 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrChkFunction, "ucrChkFunction") Me.ucrChkFunction.Name = "ucrChkFunction" ' - 'ucrNudSuccess - ' - Me.ucrNudSuccess.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSuccess.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - resources.ApplyResources(Me.ucrNudSuccess, "ucrNudSuccess") - Me.ucrNudSuccess.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudSuccess.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudSuccess.Name = "ucrNudSuccess" - Me.ucrNudSuccess.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrInputLevel2 - ' - Me.ucrInputLevel2.AddQuotesIfUnrecognised = True - Me.ucrInputLevel2.IsReadOnly = False - resources.ApplyResources(Me.ucrInputLevel2, "ucrInputLevel2") - Me.ucrInputLevel2.Name = "ucrInputLevel2" - ' - 'ucrInputLevel1 - ' - Me.ucrInputLevel1.AddQuotesIfUnrecognised = True - Me.ucrInputLevel1.IsReadOnly = False - resources.ApplyResources(Me.ucrInputLevel1, "ucrInputLevel1") - Me.ucrInputLevel1.Name = "ucrInputLevel1" - ' - 'lblLevel1 - ' - resources.ApplyResources(Me.lblLevel1, "lblLevel1") - Me.lblLevel1.Name = "lblLevel1" - ' 'ucrModelPreview ' Me.ucrModelPreview.AddQuotesIfUnrecognised = True @@ -220,11 +187,6 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrBase, "ucrBase") Me.ucrBase.Name = "ucrBase" ' - 'ucrSaveModels - ' - resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") - Me.ucrSaveModels.Name = "ucrSaveModels" - ' 'ucrPnlModelType ' resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") @@ -237,22 +199,32 @@ Partial Class dlgRegressionSimple ' 'grpParameters ' - Me.grpParameters.Controls.Add(Me.rdoCompareVariance) Me.grpParameters.Controls.Add(Me.Label1) Me.grpParameters.Controls.Add(Me.rdoKruskalTest) Me.grpParameters.Controls.Add(Me.rdoWilcoxonTest) Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) Me.grpParameters.Controls.Add(Me.ucrNudCI) - Me.grpParameters.Controls.Add(Me.rdoCompareMeans) - Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) - Me.grpParameters.Controls.Add(Me.lblHyp1) Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) resources.ApplyResources(Me.grpParameters, "grpParameters") Me.grpParameters.Name = "grpParameters" Me.grpParameters.TabStop = False ' + 'rdoCompareVariance + ' + resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") + Me.rdoCompareVariance.Name = "rdoCompareVariance" + Me.rdoCompareVariance.TabStop = True + Me.rdoCompareVariance.UseVisualStyleBackColor = True + ' + 'rdoCompareMeans + ' + resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") + Me.rdoCompareMeans.Name = "rdoCompareMeans" + Me.rdoCompareMeans.TabStop = True + Me.rdoCompareMeans.UseVisualStyleBackColor = True + ' 'rdoTwoSample ' resources.ApplyResources(Me.rdoTwoSample, "rdoTwoSample") @@ -324,40 +296,31 @@ Partial Class dlgRegressionSimple Me.lblResponse.Name = "lblResponse" Me.lblResponse.Tag = "Response_Variable" ' - 'rdoCompareMeans - ' - resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") - Me.rdoCompareMeans.Name = "rdoCompareMeans" - Me.rdoCompareMeans.TabStop = True - Me.rdoCompareMeans.UseVisualStyleBackColor = True - ' - 'rdoCompareVariance + 'ucrSaveModels ' - resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") - Me.rdoCompareVariance.Name = "rdoCompareVariance" - Me.rdoCompareVariance.TabStop = True - Me.rdoCompareVariance.UseVisualStyleBackColor = True + resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") + Me.ucrSaveModels.Name = "ucrSaveModels" ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.Controls.Add(Me.rdoCompareVariance) + Me.Controls.Add(Me.ucrSaveModels) Me.Controls.Add(Me.rdoTwoSample) Me.Controls.Add(Me.rdoGeneralCase) Me.Controls.Add(Me.ucrChkConvertToVariate) Me.Controls.Add(Me.lblFactor) Me.Controls.Add(Me.lblNumeric) + Me.Controls.Add(Me.rdoCompareMeans) + Me.Controls.Add(Me.lblHyp1) Me.Controls.Add(Me.ucrExplanatory) + Me.Controls.Add(Me.ucrPnlMeansAndVariance) Me.Controls.Add(Me.ucrResponse) Me.Controls.Add(Me.ucrSelectorSimpleReg) Me.Controls.Add(Me.lblExplanatory) Me.Controls.Add(Me.lblResponse) - Me.Controls.Add(Me.ucrNudSuccess) - Me.Controls.Add(Me.ucrInputLevel1) - Me.Controls.Add(Me.lblLevel1) - Me.Controls.Add(Me.ucrInputLevel2) Me.Controls.Add(Me.ucrChkFunction) - Me.Controls.Add(Me.ucrSaveModels) Me.Controls.Add(Me.ucrPnlModelType) Me.Controls.Add(Me.grpParameters) Me.Controls.Add(Me.ucrModelPreview) @@ -393,17 +356,12 @@ Partial Class dlgRegressionSimple Friend WithEvents lblDifferenceInMeans As Label Friend WithEvents ucrChkPairedTest As ucrCheck Friend WithEvents ucrPnlMeansAndVariance As UcrPanel - Friend WithEvents ucrSaveModels As ucrSave Friend WithEvents ucrNudCI As ucrNud Friend WithEvents ucrNudHypothesis As ucrNud Friend WithEvents ucrChkFunction As ucrCheck Friend WithEvents rdoKruskalTest As RadioButton Friend WithEvents rdoWilcoxonTest As RadioButton - Friend WithEvents ucrNudSuccess As ucrNud - Friend WithEvents ucrInputLevel2 As ucrInputComboBox - Friend WithEvents ucrInputLevel1 As ucrInputComboBox Friend WithEvents Label1 As Label - Friend WithEvents lblLevel1 As Label Friend WithEvents ucrPnlModelType As UcrPanel Friend WithEvents grpParameters As GroupBox Friend WithEvents lblHyp1 As Label @@ -419,4 +377,5 @@ Partial Class dlgRegressionSimple Friend WithEvents lblResponse As Label Friend WithEvents rdoCompareMeans As RadioButton Friend WithEvents rdoCompareVariance As RadioButton + Friend WithEvents ucrSaveModels As ucrSave End Class \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index b30949639cd..c046350750e 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -14,14 +14,20 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . -Imports instat Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True Public clsModel, clsFormulaOperator, clsRGraphicsOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator - Public clsRPoisson, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsRYVariable, clsRXVariable, clsTFunc, clsRLength As New RFunction + Public clsRPoisson, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsTFunc, clsRLength As New RFunction + Public clsRYVariable, clsRXVariable As String + + Private Sub ucrExplanatory_Load() Handles ucrExplanatory.ControlValueChanged + + End Sub Private bReset As Boolean = True + + Public bResetSubDialog As Boolean = False Public bResetOptionsSubDialog As Boolean = False Private Sub dlgRegressionSimple_Load(sender As Object, e As EventArgs) Handles Me.Load @@ -42,6 +48,8 @@ Public Class dlgRegressionSimple ucrResponse.SetRCode(clsFormulaOperator, bReset) ucrExplanatory.SetRCode(clsFormulaOperator, bReset) ucrSelectorSimpleReg.SetRCode(clsRLmOrGLM, bReset) + ucrPnlModelType.SetRCode(clsRLmOrGLM, bReset) + ucrSaveModels.SetRCode(clsRLmOrGLM, bReset) ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) @@ -53,6 +61,8 @@ Public Class dlgRegressionSimple Private Sub InitialiseDialog() ucrBase.clsRsyntax.iCallType = 2 + cmdModelOptions.Enabled = False + ucrResponse.Selector = ucrSelectorSimpleReg ucrExplanatory.Selector = ucrSelectorSimpleReg ucrBase.iHelpTopicID = 366 @@ -68,11 +78,16 @@ Public Class dlgRegressionSimple ucrChkConvertToVariate.SetText("Convert to Variate") ucrSaveModels.SetPrefix("reg") - ucrSaveModels.SetText("Save Models") - ucrSaveModels.SetDataFrameSelector(ucrSelectorSimpleReg.ucrAvailableDataFrames) ucrSaveModels.SetSaveTypeAsModel() + ucrSaveModels.SetDataFrameSelector(ucrSelectorSimpleReg.ucrAvailableDataFrames) + ucrSaveModels.SetCheckBoxText("Save Model") + ucrSaveModels.SetIsComboBox() + + ucrPnlMeansAndVariance.AddRadioButton(rdoCompareMeans) + ucrPnlMeansAndVariance.AddRadioButton(rdoCompareVariance) + ucrModelPreview.IsReadOnly = True ucrPnlModelType.AddRadioButton(rdoGeneralCase) @@ -110,7 +125,7 @@ Public Class dlgRegressionSimple ucrSelectorSimpleReg.SetParameter(New RParameter("data", 0)) ucrSelectorSimpleReg.SetParameterIsrfunction() - ucrPnlModelType.AddToLinkedControls(ucrChkFunction, {rdoCompareMeans}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=True) + 'ucrPnlModelType.AddToLinkedControls(ucrChkFunction, {rdoge}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=True) ucrChkFunction.SetText("Function") ucrNudCI.SetParameter(New RParameter("conf.level")) @@ -264,7 +279,7 @@ Public Class dlgRegressionSimple 'sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True rdoCompareMeans.Checked = True - 'SetEnableDists() + SetEnableDists() TestOKEnabled() bResetSubDialog = True bResetOptionsSubDialog = True @@ -298,8 +313,9 @@ Public Class dlgRegressionSimple Private Sub ucrChkFunction_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkFunction.ControlValueChanged If ucrChkFunction.Checked Then - 'sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsRLmOrGLM, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel, clsNewFunction:=clsRCIFunction) + sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsRLmOrGLM, clsNewFormulaOperator:=clsFormulaOperator, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel, clsNewFunction:=clsRCIFunction) sdgVariableTransformations.ShowDialog() + ExplanatoryFunctionSelect() bResetSubDialog = False End If End Sub @@ -318,7 +334,7 @@ Public Class dlgRegressionSimple Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged - clsRYVariable = ucrResponse.GetVariables + clsRYVariable = ucrResponse.GetVariableNames(bWithQuotes:=False) End Sub @@ -326,19 +342,19 @@ Public Class dlgRegressionSimple ConvertToVariate() TestOKEnabled() DataTypeAccepted() - ' SetEnableDists() + SetEnableDists() End Sub Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged - clsRXVariable = ucrExplanatory.GetVariables + clsRXVariable = ucrExplanatory.GetVariableNames(bWithQuotes:=False) End Sub - Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click - sdgModelOptions.ShowDialog() - ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) - Display() - End Sub + 'Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click + ' sdgModelOptions.ShowDialog() + ' ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) + ' Display() + 'End Sub Private Sub SetTTest() @@ -554,7 +570,7 @@ Public Class dlgRegressionSimple Private Sub TestOKEnabled() ' If Not ucrResponse.IsEmpty() AndAlso Not ucrExplanatory.IsEmpty() AndAlso ucrFamily.Enabled AndAlso Not ucrFamily.ucrInputDistributions.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then - 'ucrModelPreview.SetName(clsModel.ToScript) + 'ucrModelPreview.SetName(clsRLmOrGLM.ToScript) ' If rdoSpecific.Checked AndAlso (ucrFamily.clsCurrDistribution.strNameTag = "Poisson" OrElse ucrFamily.clsCurrDistribution.strNameTag = "Binomial") AndAlso Not (ucrLevel1.IsEmpty OrElse ucrLevel2.IsEmpty) Then 'ucrBase.OKEnabled(True) ' Else @@ -615,9 +631,9 @@ Public Class dlgRegressionSimple TestOKEnabled() End Sub - 'Public Sub SetEnableDists() - ' ucrFamily.Enabled = Not ucrResponse.IsEmpty - 'End Sub + Public Sub SetEnableDists() + ucrFamily.Enabled = Not ucrResponse.IsEmpty + End Sub Private Sub ucrExplanatory_SelectionChanged(sender As Object, e As EventArgs) Handles ucrExplanatory.SelectionChanged If Not ucrExplanatory.IsEmpty Then @@ -637,24 +653,23 @@ Public Class dlgRegressionSimple If Not ucrExplanatory.IsEmpty AndAlso rdoGeneralCase.Checked Then strExplanatoryType = frmMain.clsRLink.GetDataType(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrExplanatory.GetVariableNames(bWithQuotes:=False)) If rdoGeneralCase.Checked AndAlso (strExplanatoryType = "numeric" OrElse strExplanatoryType = "positive integer" OrElse strExplanatoryType = "integer") Then - 'chkFunction.Visible = True + ucrChkFunction.Visible = True + Else + ucrChkFunction.Checked = False + ucrChkFunction.Visible = False + End If + If ucrChkFunction.Checked Then + sdgVariableTransformations.ModelFunction(False) Else - ' chkFunction.Checked = False - ' chkFunction.Visible = False + sdgVariableTransformations.rdoIdentity.Checked = True + 'clsRLmOrGLM.AddParameter(strParameterValue:=ucrExplanatory.GetVariableNames(bWithQuotes:=False)) End If - 'If chkFunction.Checked Then - ' sdgVariableTransformations.ModelFunction(False) - 'Else - ' sdgVariableTransformations.rdoIdentity.Checked = True - ' clsModel.AddParameter(strParameterValue:=ucrExplanatory.GetVariableNames(bWithQuotes:=False)) - 'End If End If End Sub Private Sub ucrExplanatory_SelectionChanged() Handles ucrExplanatory.ControlValueChanged - ExplanatoryFunctionSelect() + ' ExplanatoryFunctionSelect() SetRCode() - TestOKEnabled() DataTypeAccepted() End Sub @@ -697,13 +712,11 @@ Public Class dlgRegressionSimple 'End If End Sub - Private Sub chkFunction_CheckedChanged(sender As Object, e As EventArgs) - 'If chkFunction.Checked Then - ' sdgVariableTransformations.ShowDialog() - 'End If - 'ExplanatoryFunctionSelect() - 'TestOKEnabled() - 'Display() + Private Sub chkFunction_CheckedChanged() Handles ucrChkFunction.ControlValueChanged + If ucrChkFunction.Checked Then + ExplanatoryFunctionSelect() + End If + Display() End Sub Private Sub Display() @@ -788,7 +801,7 @@ Public Class dlgRegressionSimple Private Sub chkboxes_VisibleChanged(sender As Object, e As EventArgs) Display() - ExplanatoryFunctionSelect() + ' ExplanatoryFunctionSelect() ConvertToVariate() TestOKEnabled() End Sub @@ -808,11 +821,11 @@ Public Class dlgRegressionSimple ConvertToVariate() End Sub - 'Private Sub ucrFamily_EnabledChanged(sender As Object, e As EventArgs) Handles ucrFamily.EnabledChanged - ' DataTypeAccepted() - ' TestOKEnabled() - ' SetEnableDists() - 'End Sub + Private Sub ucrFamily_EnabledChanged(sender As Object, e As EventArgs) Handles ucrFamily.EnabledChanged + DataTypeAccepted() + TestOKEnabled() + SetEnableDists() + End Sub Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged TestOKEnabled() diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index ff7441d528e..be850c181d3 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -19,7 +19,8 @@ Public Class sdgSimpleRegOptions Public clsRModelFunction As RFunction Public clsRDataFrame As ucrDataFrame Public clsRGraphicsOperator As ROperator - Public clsRYVariable, clsRXVariable, clsRSummaryFunction, clsRanovaFunction, clsRConfint, clsRLmOrGLM As RFunction + Public clsRYVariable, clsRXVariable As String + Public clsRSummaryFunction, clsRanovaFunction, clsRConfint, clsRLmOrGLM As RFunction Public clsRGraphics As New RSyntax Private clsRSyntax As RSyntax Public clsRaovFunction, clsRaovpvalFunction, clsRestpvalFunction, clsRResidualPlotsFunction, clsRgeom_point, clsRPredFunction, clsRDFFunction, clsRFittedValues, clsRWriteFitted, clsRResiduals, clsRWriteResiduals, clsRStdResiduals, clsRWriteStdResiduals, clsRLeverage, clsRWriteLeverage As New RFunction @@ -108,7 +109,7 @@ Public Class sdgSimpleRegOptions End Sub ' Optional clsRGraphicsOperator As RFunction = Nothing, - Public Sub SetRCode(clsNewRSyntax As RSyntax, Optional clsNewRanovaFunction As RFunction = Nothing, Optional clsNewRSummaryFunction As RFunction = Nothing, Optional clsNewRConfint As RFunction = Nothing, Optional clsNewRModelsFunction As RFunction = Nothing, Optional clsNewRaovpvalFunction As RFunction = Nothing, Optional clsNewRgeom_point As RFunction = Nothing, Optional clsNewRResidualPlots As RFunction = Nothing, Optional clsNewRestpvalFunction As RFunction = Nothing, Optional clsNewRLmOrGLM As RFunction = Nothing, Optional clsNewRModelFunction As RFunction = Nothing, Optional clsNewRXVariable As RFunction = Nothing, Optional clsNewRYVariable As RFunction = Nothing, Optional clsNewRWriteFitted As RFunction = Nothing, Optional clsNewRFittedValues As RFunction = Nothing, Optional clsNewRGraphicsOperator As ROperator = Nothing, Optional bReset As Boolean = False) + Public Sub SetRCode(clsNewRSyntax As RSyntax, Optional clsNewRanovaFunction As RFunction = Nothing, Optional clsNewRSummaryFunction As RFunction = Nothing, Optional clsNewRConfint As RFunction = Nothing, Optional clsNewRModelsFunction As RFunction = Nothing, Optional clsNewRaovpvalFunction As RFunction = Nothing, Optional clsNewRgeom_point As RFunction = Nothing, Optional clsNewRResidualPlots As RFunction = Nothing, Optional clsNewRestpvalFunction As RFunction = Nothing, Optional clsNewRLmOrGLM As RFunction = Nothing, Optional clsNewRModelFunction As RFunction = Nothing, Optional clsNewRXVariable As String = Nothing, Optional clsNewRYVariable As String = Nothing, Optional clsNewRWriteFitted As RFunction = Nothing, Optional clsNewRFittedValues As RFunction = Nothing, Optional clsNewRGraphicsOperator As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If @@ -134,7 +135,7 @@ Public Class sdgSimpleRegOptions ucrChkANOVA.SetRSyntax(clsRSyntax, bReset) ucrChkDisplayCLimits.SetRSyntax(clsRSyntax, bReset) ucrChkPvalues.SetRSyntax(clsRSyntax, bReset) - ' ucrPnlMutiplePlots.SetRSyntax(clsRSyntax) + ' ucrPnlMutiplePlots.SetRSyntax(clsRSyntax) End Sub Private Sub ucrChkANOVA_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkANOVA.ControlValueChanged diff --git a/instat/sdgVariableTransformations.vb b/instat/sdgVariableTransformations.vb index ef18821dabf..812c0e1f786 100644 --- a/instat/sdgVariableTransformations.vb +++ b/instat/sdgVariableTransformations.vb @@ -13,12 +13,13 @@ ' ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class sdgVariableTransformations Public clsRCIFunction As RFunction Public clsRToFunction, clsLMorGLM As New RFunction - Public clsRYVariable, clsRXVariable As ucrReceiverSingle - Public clsRModel, clsRModel1 As ROperator + Public clsRYVariable, clsRXVariable As String + Public clsRModel, clsRModel1, clsFormulaOperator As ROperator Public clsModel0 As New ROperator Public bControlsInitialised As Boolean = True Private Sub sdgVariableTransformations_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -26,29 +27,33 @@ Public Class sdgVariableTransformations End Sub Public Sub InitialiseControls() - ucrPnlGenerateFunctions.AddRadioButton(rdoIdentity) - ucrPnlGenerateFunctions.AddRadioButton(rdoLogBase10) - ucrPnlGenerateFunctions.AddRadioButton(rdoNaturallog) - ucrPnlGenerateFunctions.AddRadioButton(rdoPower) - ucrPnlGenerateFunctions.AddRadioButton(rdoSquareroot) + 'ucrPnlGenerateFunctions.AddRadioButton(rdoIdentity) + 'ucrPnlGenerateFunctions.AddRadioButton(rdoLogBase10) + 'ucrPnlGenerateFunctions.AddRadioButton(rdoNaturallog) + 'ucrPnlGenerateFunctions.AddRadioButton(rdoPower) + 'ucrPnlGenerateFunctions.AddRadioButton(rdoSquareroot) - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoLogBase10, "log10") - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoSquareroot, "sqrt") - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoNaturallog, "log") - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoIdentity, {"log10", "power", "log", "sqrt"}, False) - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoPower, "power") + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoLogBase10, "log10") + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoSquareroot, "sqrt") + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoNaturallog, "log") + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoIdentity, {"log10", "power", "log", "sqrt"}, False) + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoPower, "power") bControlsInitialised = True End Sub - Public Sub SetRCodeForControls(clsNewLMorGLM As RFunction, clsNewFunction As RFunction, clsRModelNew As ROperator, clsRYVariableNew As RFunction, clsRXVariableNew As RFunction, Optional bReset As Boolean = False) + Public Sub SetRCodeForControls(clsNewLMorGLM As RFunction, clsNewFunction As RFunction, clsNewFormulaOperator As ROperator, clsRModelNew As ROperator, clsRYVariableNew As String, clsRXVariableNew As String, Optional bReset As Boolean = False) If bControlsInitialised Then InitialiseControls() End If clsLMorGLM = clsNewLMorGLM + clsRXVariable = clsRXVariableNew + clsRYVariable = clsRYVariableNew clsRModel = clsRModelNew + clsFormulaOperator = clsNewFormulaOperator clsRCIFunction = clsNewFunction ucrPnlGenerateFunctions.SetRCode(clsLMorGLM, bReset) + End Sub Private Sub ExplanatoryFunction(strFunctionName As String, strPower As String, Optional choice As Boolean = False) @@ -63,15 +68,26 @@ Public Class sdgVariableTransformations 'clsRModel.AddParameter(False, strParameterValue:=clsRYVariable.GetVariableNames(bWithQuotes:=False)) clsModel0.SetOperation("^") clsModel0.bBrackets = False - clsModel0.AddParameter(iPosition:=0, strParameterValue:=clsRXVariable.GetVariableNames(bWithQuotes:=False)) + 'clsModel0.AddParameter(iPosition:=0, strParameterValue:=clsRXVariable.GetVariableNames(bWithQuotes:=False)) clsModel0.AddParameter(strParameterValue:=strPower) - clsRModel.AddParameter(iPosition:=i, clsROperatorParameter:=clsModel0.Clone()) + clsModel0.AddParameter("x", clsRXVariable, bIncludeArgumentName:=False) + clsFormulaOperator.AddParameter(iPosition:=i, clsROperatorParameter:=clsModel0) End If - Else + ElseIf rdoLogBase10.Checked Then clsRToFunction.SetRCommand(strFunctionName) - clsRToFunction.AddParameter("x", clsRXVariable.GetVariableNames(bWithQuotes:=False)) - clsRModel.AddParameter(iPosition:=i, clsRFunctionParameter:=clsRToFunction.Clone()) + clsRToFunction.AddParameter("x", clsRXVariable, bIncludeArgumentName:=False) + clsFormulaOperator.AddParameter(iPosition:=i, strParameterValue:="x", clsRFunctionParameter:=clsRToFunction) + 'clsLMorGLM.AddParameter(iPosition:=1, clsRFunctionParameter:=clsRToFunction) End If + + End Sub + + Private Sub ucrPnlGenerateFunctions_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlGenerateFunctions.ControlValueChanged + 'If rdoLogBase10.Checked Then + ' clsRToFunction.SetRCommand("log10") + ' clsRToFunction.AddParameter("x", clsRXVariable, bIncludeArgumentName:=False) + ' clsFormulaOperator.AddParameter("x", clsRFunctionParameter:=clsRToFunction) + 'End If End Sub Public Sub ModelFunction(Optional choice As Boolean = False) From 1ae768d5e26e98b7515cdbb63b34dd91fcf0b8be Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Thu, 22 Jun 2017 14:21:04 +0100 Subject: [PATCH 143/201] fixes #3452 --- instat/static/InstatObject/R/data_object_R6.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/static/InstatObject/R/data_object_R6.R b/instat/static/InstatObject/R/data_object_R6.R index 2a1cbf275e5..a1bb170cc58 100644 --- a/instat/static/InstatObject/R/data_object_R6.R +++ b/instat/static/InstatObject/R/data_object_R6.R @@ -1184,9 +1184,9 @@ data_object$set("public", "set_factor_levels", function(col_name, new_labels, ne } else if(set_new_labels && self$is_variables_metadata(labels_label, col_name)) { labels_list <- self$get_variables_metadata(property = labels_label, column = col_name, direct_from_attributes = TRUE) - names(labels_list) <- as.character(new_labels[1:length(old_levels)]) + names(labels_list) <- as.character(new_labels[1:length(old_labels)]) if(length(new_labels) > length(old_lables)) { - extra_labels <- seq(from = max(labels_list) + 1, length.out = (length(new_labels) - length(old_levels))) + extra_labels <- seq(from = max(labels_list) + 1, length.out = (length(new_labels) - length(old_labels))) names(extra_labels) <- new_labels[!new_labels %in% names(labels_list)] labels_list <- c(labels_list, extra_labels) } From bc6a9d34d7c90535e6c5174052046c47dcf4ab67 Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 15:19:33 +0100 Subject: [PATCH 144/201] Updates --- instat/dlgStartofRains.vb | 108 +++++++++++++++++-------------- instat/sdgPlots.vb | 32 ++++----- instat/ucrAxes.vb | 48 +++++++------- instat/ucrCore.vb | 31 +++++---- instat/ucrDataFrame.vb | 4 +- instat/ucrGeom.vb | 4 +- instat/ucrInputComboBox.vb | 4 +- instat/ucrSave.vb | 2 +- instat/ucrSelector.vb | 4 +- instat/ucrSelectorByDataFrame.vb | 8 +-- 10 files changed, 132 insertions(+), 113 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 6e56bd81a1a..fa48102936b 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -13,6 +13,7 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class dlgStartofRains @@ -28,10 +29,10 @@ Public Class dlgStartofRains 'Dry Period classes Private clsDPOverallInterval, clsDPOverallIntervalList, clsDPRain, clsDPRainList, clsDPRainInDays, clsDPRainInDaysFunctionLead, clsDPRainInDaysFunction, clsDPRainFunction, clsDPOverallIntervalFunction As New RFunction Private clsDPRainFunctionOperator, clsDPOverallIntervalFunctionOperator, clsDPOverallIntervalFunctionOperatorRight As New ROperator - Private clsTRParameter, clsRDParameter, clsDSParameter, clsDPParameter As New RParameter Private strCurrDataName As String = "" Public bFirstLoad As Boolean = True Private bReset As Boolean = True + Private strWetSpell As String = "wet_spell" Private Sub dlgStartofRains_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) @@ -101,10 +102,9 @@ Public Class dlgStartofRains ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) - 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRPercentile, "TRPerc", strWetSpell, False) - 'ucrPnlTRCalculateBy.AddParameterValuesCondition(rdoTRAmount, "TRPerc", strWetSpell) - ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "TRAmount") + 'Question ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "TRPerc") + ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "TRAmount") ucrNudTRAmount.SetParameter(New RParameter("TRAmount", 1, False), False) @@ -132,8 +132,6 @@ Public Class dlgStartofRains ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub2", clsRDRollingRainDays, 2, False), False) ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("raindays", clsRDCombineOperator, 2, False), iAdditionalPairNo:=1) ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") - ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudRDMinimumDays.SetParameter(New RParameter("RDMin", 1)) ucrNudRDMinimumDays.SetLinkedDisplayControl(lblRDMinimum) @@ -141,6 +139,8 @@ Public Class dlgStartofRains ucrNudRDOutOfDays.SetParameter(New RParameter("width", 1)) ucrNudRDOutOfDays.SetLinkedDisplayControl(lblRDWidth) + ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) 'ucrNudRDOutOfDays.SetMinMax(1, 366) what is appropriate here? 'Dry Spell @@ -193,7 +193,6 @@ Public Class dlgStartofRains Private Sub SetDefaults() Dim strRollSumRain As String = "roll_sum_Rain" Dim strRainDay As String = "rain_day" - Dim strWetSpell As String = "wet_spell" Dim strRollingRainDays As String = "Rolling_Rain_Days" Dim strDrySpell As String = "Dry_Spell" Dim strRainInDays As String = "Rain_in_Days" @@ -466,12 +465,6 @@ Public Class dlgStartofRains clsTRCombineOperator.SetOperation(">") clsTRCombineOperator.AddParameter("TRLeft", strRollSumRain, iPosition:=0) - clsTRCombineOperator.AddParameter("TRAmount", 20, iPosition:=1) ' ucrNudTRAmount - clsTRCombineOperator.AddParameter("TRPerc", strWetSpell, iPosition:=1) - - 'If rdoTRAmount.Checked Then ucrNudTRAmount - 'ElseIf rdoTRPercentile.Checked Then strWetSpell - ' run if chkRD is checked ' clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) clsRDCombineOperator.SetOperation(">=") @@ -497,7 +490,7 @@ Public Class dlgStartofRains clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) clsFirstDOYPerYear.AddParameter("function_exp", clsROperatorParameter:=clsFirstDOYPerYearOperator, iPosition:=1) clsFirstDOYPerYearOperator.SetOperation("[") - clsFirstDOYPerYearOperator.AddParameter("rightside", "1]", iPosition:=1) + clsFirstDOYPerYearOperator.AddParameter("rightside", "1 ]", iPosition:=1) clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34), iPosition:=2) ' do this right. clsFirstDOYPerYear.AddParameter("save", 2, iPosition:=6) clsFirstDOYPerYear.SetAssignTo(ucrSaveStartofRains.ucrInputTextSave.GetText) @@ -562,6 +555,20 @@ Public Class dlgStartofRains ucrNudTRAmount.SetRCode(clsTRCombineOperator, bReset) End Sub + Private Sub TestOKEnabled() + ' If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.GetText <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.GetText <> "" AndAlso ucrNudRDOutOfDays.GetText <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso ucrNudTROverDays.GetText <> "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.GetText <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.GetText <> ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((ucrChkDrySpell.Checked AndAlso ucrNudDSMaximumDays.GetText <> "" AndAlso ucrNudDSLengthOfTime.GetText <> "") OrElse Not ucrChkDrySpell.Checked) AndAlso ((ucrChkDryPeriod.Checked AndAlso ucrNudDPMaxRain.GetText <> "" AndAlso ucrNudDPRainPeriod.GetText <> "" AndAlso ucrNudDPOverallInterval.GetText <> "") OrElse Not ucrChkDryPeriod.Checked) Then + ucrBase.OKEnabled(True) + ' Else + ' ucrBase.OKEnabled(False) + ' 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 ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining column(s) as key") @@ -583,30 +590,16 @@ Public Class dlgStartofRains End If End Sub - Private Sub RainDays() - clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=5) - End Sub - Private Sub DayBoundaries() clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") End Sub - Private Sub TotalRainfall() - clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=0) - End Sub - - Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged - DayBoundaries() - ' clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) - ' clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + Private Sub RainDays() + clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=5) End Sub - Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged - If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") - Else - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") - End If + Private Sub TotalRainfall() + clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=0) End Sub Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForStartofRains.ControlContentsChanged @@ -618,33 +611,54 @@ Public Class dlgStartofRains clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) End Sub - ' issue with width = not changing - ' when to call sub_calculations - ' sort calculated_from - ' help with set up of the rdo option - Private Sub DryPeriod() clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=5) End Sub - Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset - SetDefaults() - SetRCodeForControls(True) - TestOKEnabled() + Private Sub CombinedFilter() + If ucrChkTotalRainfall.Checked Then + If rdoTRAmount.Checked Then + clsCombinedList.RemoveParameterByName("sub4") + clsTRCombineOperator.AddParameter("TRAmount", strParameterValue:=ucrNudTRAmount.Value, iPosition:=1) + Else + clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) + clsTRCombineOperator.AddParameter("TRPerc", strParameterValue:=strWetSpell, iPosition:=1) + End If + Else + clsCombinedList.RemoveParameterByName("sub4") + clsTRCombineOperator.RemoveParameterByName("TRPerc") + clsTRCombineOperator.RemoveParameterByName("TRAmount") + End If End Sub - Private Sub TestOKEnabled() - ' If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.GetText <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.GetText <> "" AndAlso ucrNudRDOutOfDays.GetText <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso ucrNudTROverDays.GetText <> "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.GetText <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.GetText <> ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((ucrChkDrySpell.Checked AndAlso ucrNudDSMaximumDays.GetText <> "" AndAlso ucrNudDSLengthOfTime.GetText <> "") OrElse Not ucrChkDrySpell.Checked) AndAlso ((ucrChkDryPeriod.Checked AndAlso ucrNudDPMaxRain.GetText <> "" AndAlso ucrNudDPRainPeriod.GetText <> "" AndAlso ucrNudDPOverallInterval.GetText <> "") OrElse Not ucrChkDryPeriod.Checked) Then - ucrBase.OKEnabled(True) - ' Else - ' ucrBase.OKEnabled(False) - ' End If + Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged + DayBoundaries() + End Sub + + Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged + If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") + Else + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + End If End Sub Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlContentsChanged, ucrSaveStartofRains.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrNudThreshold.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrChkNumberOfRainyDays.ControlContentsChanged, ucrNudRDMinimumDays.ControlContentsChanged, ucrNudRDOutOfDays.ControlContentsChanged, ucrChkTotalRainfall.ControlContentsChanged, ucrNudTROverDays.ControlContentsChanged, ucrPnlTRCalculateBy.ControlContentsChanged, ucrNudTRAmount.ControlContentsChanged, ucrNudTRPercentile.ControlContentsChanged, ucrChkDrySpell.ControlContentsChanged, ucrNudDSMaximumDays.ControlContentsChanged, ucrNudDSLengthOfTime.ControlContentsChanged, ucrChkDryPeriod.ControlContentsChanged, ucrNudDPMaxRain.ControlContentsChanged, ucrNudDPRainPeriod.ControlContentsChanged, ucrNudDPOverallInterval.ControlContentsChanged TestOKEnabled() End Sub + Private Sub ucrChkTotalRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkTotalRainfall.ControlValueChanged, ucrPnlTRCalculateBy.ControlValueChanged + CombinedFilter() + End Sub + + + + + + + + + diff --git a/instat/sdgPlots.vb b/instat/sdgPlots.vb index a47cb7f8605..9933cef9820 100644 --- a/instat/sdgPlots.vb +++ b/instat/sdgPlots.vb @@ -247,27 +247,27 @@ Public Class sdgPlots clsBaseOperator.AddParameter(GgplotDefaults.clsDefaultThemeParameter.Clone()) End If - ucrInputGraphTitle.SetRCode(clsLabsFunction, bReset) - ucrInputGraphSubTitle.SetRCode(clsLabsFunction, bReset) - ucrInputGraphCaption.SetRCode(clsLabsFunction, bReset) - urChkSelectTheme.SetRCode(clsBaseOperator, bReset) - ucrInputThemes.SetRCode(clsBaseOperator, bReset) + ucrInputGraphTitle.SetRCode(clsLabsFunction, bReset, bCloneIfNeeded:=True) + ucrInputGraphSubTitle.SetRCode(clsLabsFunction, bReset, bCloneIfNeeded:=True) + ucrInputGraphCaption.SetRCode(clsLabsFunction, bReset, bCloneIfNeeded:=True) + urChkSelectTheme.SetRCode(clsBaseOperator, bReset, bCloneIfNeeded:=True) + ucrInputThemes.SetRCode(clsBaseOperator, bReset, bCloneIfNeeded:=True) 'ucrInputLegend.SetRCode(clsNewLabsFunction, bReset) - ucrPnlHorizonatalVertical.SetRCode(clsFacetFunction, bReset) - ucr1stFactorReceiver.SetRCode(clsFacetVariablesOperator, bReset) - ucr2ndFactorReceiver.SetRCode(clsFacetVariablesOperator, bReset) + ucrPnlHorizonatalVertical.SetRCode(clsFacetFunction, bReset, bCloneIfNeeded:=True) + ucr1stFactorReceiver.SetRCode(clsFacetVariablesOperator, bReset, bCloneIfNeeded:=True) + ucr2ndFactorReceiver.SetRCode(clsFacetVariablesOperator, bReset, bCloneIfNeeded:=True) - ucrChkMargin.SetRCode(clsFacetFunction, bReset) - ucrChkFreeSpace.SetRCode(clsFacetFunction, bReset) - ucrChkFreeScalesX.SetRCode(clsFacetFunction, bReset) - ucrChkFreeScalesY.SetRCode(clsFacetFunction, bReset) - ucrNudNumberofRows.SetRCode(clsFacetFunction, bReset) - ucrChkIncludeFacets.SetRCode(clsBaseOperator, bReset) + ucrChkMargin.SetRCode(clsFacetFunction, bReset, bCloneIfNeeded:=True) + ucrChkFreeSpace.SetRCode(clsFacetFunction, bReset, bCloneIfNeeded:=True) + ucrChkFreeScalesX.SetRCode(clsFacetFunction, bReset, bCloneIfNeeded:=True) + ucrChkFreeScalesY.SetRCode(clsFacetFunction, bReset, bCloneIfNeeded:=True) + ucrNudNumberofRows.SetRCode(clsFacetFunction, bReset, bCloneIfNeeded:=True) + ucrChkIncludeFacets.SetRCode(clsBaseOperator, bReset, bCloneIfNeeded:=True) 'axis controls - ucrXAxis.SetRCodeForControl(bIsXAxis:=True, strNewAxisType:=GetAxisType(True), clsNewXYlabTitleFunction:=clsXLabFunction, clsNewXYScaleContinuousFunction:=clsXScalecontinuousFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) - ucrYAxis.SetRCodeForControl(bIsXAxis:=False, strNewAxisType:=GetAxisType(False), clsNewXYlabTitleFunction:=clsYLabFunction, clsNewXYScaleContinuousFunction:=clsYScalecontinuousFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset) + ucrXAxis.SetRCodeForControl(bIsXAxis:=True, strNewAxisType:=GetAxisType(True), clsNewXYlabTitleFunction:=clsXLabFunction, clsNewXYScaleContinuousFunction:=clsXScalecontinuousFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset, bCloneIfNeeded:=True) + ucrYAxis.SetRCodeForControl(bIsXAxis:=False, strNewAxisType:=GetAxisType(False), clsNewXYlabTitleFunction:=clsYLabFunction, clsNewXYScaleContinuousFunction:=clsYScalecontinuousFunction, clsNewBaseOperator:=clsBaseOperator, bReset:=bReset, bCloneIfNeeded:=True) bRCodeSet = True diff --git a/instat/ucrAxes.vb b/instat/ucrAxes.vb index 5790f73b95c..97551e47fa6 100644 --- a/instat/ucrAxes.vb +++ b/instat/ucrAxes.vb @@ -186,7 +186,7 @@ Public Class ucrAxes bControlsInitialised = True End Sub - Public Sub SetRCodeForControl(bIsXAxis As Boolean, Optional strNewAxisType As String = "Continuous", Optional clsNewXYScaleContinuousFunction As RFunction = Nothing, Optional clsNewXYlabTitleFunction As RFunction = Nothing, Optional clsNewBaseOperator As ROperator = Nothing, Optional bReset As Boolean = False) + Public Sub SetRCodeForControl(bIsXAxis As Boolean, Optional strNewAxisType As String = "Continuous", Optional clsNewXYScaleContinuousFunction As RFunction = Nothing, Optional clsNewXYlabTitleFunction As RFunction = Nothing, Optional clsNewBaseOperator As ROperator = Nothing, Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) Dim clsTempBreaksParam As RParameter Dim clsTempMinorBreaksParam As RParameter @@ -255,40 +255,40 @@ Public Class ucrAxes clsMinorBreaksSeqFunction.SetRCommand("seq") End If - ucrPnlAxisTitle.SetRCode(clsXYlabTitleFunction, bReset) - ucrInputTitle.SetRCode(clsXYlabTitleFunction, bReset) + ucrPnlAxisTitle.SetRCode(clsXYlabTitleFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputTitle.SetRCode(clsXYlabTitleFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) 'scales functions - ucrPnlScales.SetRCode(clsXYScaleContinuousFunction, bReset) - ucrInputLowerLimit.SetRCode(clsLimitsFunction, bReset) - ucrInputUpperLimit.SetRCode(clsLimitsFunction, bReset) + ucrPnlScales.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputLowerLimit.SetRCode(clsLimitsFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputUpperLimit.SetRCode(clsLimitsFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) - ucrInputPosition.SetRCode(clsXYScaleContinuousFunction, bReset) - ucrChkPosition.SetRCode(clsXYScaleContinuousFunction, bReset) + ucrInputPosition.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrChkPosition.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) - ucrChkNaValue.SetRCode(clsXYScaleContinuousFunction, bReset) - ucrInputRelaceMissingvalues.SetRCode(clsXYScaleContinuousFunction, bReset) + ucrChkNaValue.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputRelaceMissingvalues.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) - ucrChkTransformation.SetRCode(clsXYScaleContinuousFunction, bReset) - ucrInputTransformation.SetRCode(clsXYScaleContinuousFunction, bReset) + ucrChkTransformation.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputTransformation.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) - ucrChkExpand.SetRCode(clsXYScaleContinuousFunction, bReset) + ucrChkExpand.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) - ucrPnlMajorBreaks.SetRCode(clsXYScaleContinuousFunction, bReset) - ucrInputMajorBreaksCustom.SetRCode(clsXYScaleContinuousFunction, bReset) - ucrInputMajorBreaksLabels.SetRCode(clsXYScaleContinuousFunction, bReset) + ucrPnlMajorBreaks.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputMajorBreaksCustom.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputMajorBreaksLabels.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) 'Temp disabled, not yet implemented - ucrInputMajorBreaksInStepsOf.SetRCode(clsMajorBreaksSeqFunction, bReset) - ucrInputMajorBreaksTo.SetRCode(clsMajorBreaksSeqFunction, bReset) - ucrInputMajorBreaksFrom.SetRCode(clsMajorBreaksSeqFunction, bReset) + ucrInputMajorBreaksInStepsOf.SetRCode(clsMajorBreaksSeqFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputMajorBreaksTo.SetRCode(clsMajorBreaksSeqFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputMajorBreaksFrom.SetRCode(clsMajorBreaksSeqFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) - ucrPnlMinorBreaks.SetRCode(clsXYScaleContinuousFunction, bReset) - ucrInputMinorBreaksFrom.SetRCode(clsMinorBreaksSeqFunction, bReset) - ucrInputMinorBreaksTo.SetRCode(clsMinorBreaksSeqFunction, bReset) - ucrInputMinorBreaksInStepsOf.SetRCode(clsMinorBreaksSeqFunction, bReset) + ucrPnlMinorBreaks.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputMinorBreaksFrom.SetRCode(clsMinorBreaksSeqFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputMinorBreaksTo.SetRCode(clsMinorBreaksSeqFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) + ucrInputMinorBreaksInStepsOf.SetRCode(clsMinorBreaksSeqFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) - ucrChkLabels.SetRCode(clsXYScaleContinuousFunction, bReset) + ucrChkLabels.SetRCode(clsXYScaleContinuousFunction, bReset, bCloneIfNeeded:=bCloneIfNeeded) bRCodeSet = True SetLabel() AddRemoveContinuousXYScales() diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index 524140b8f63..daff22ec29d 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -94,7 +94,7 @@ Public Class ucrCore 'Update the control based on the code in RCodeStructure 'bReset : should the control reset to the default value if the parameter is not present in the code - Public Overridable Sub UpdateControl(Optional bReset As Boolean = False) + Public Overridable Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) Dim clsTempRCode As RCodeStructure Dim clsTempRParameter As RParameter Dim clsTempCloneParameter As RParameter @@ -113,21 +113,26 @@ Public Class ucrCore 'Not an issue if controls do not need to share parameters 'This is needed so that if this parameter is contained in functions in multiple dialogs, 'the parameter only changes the functions in the currently open dialog - clsTempCloneParameter = GetParameter(i).Clone() - If Not bUpdateRCodeFromControl AndAlso bChangeParameterValue Then - clsTempCloneParameter.ClearAllArguments() + If bCloneIfNeeded Then + clsTempCloneParameter = GetParameter(i).Clone() + Else + clsTempCloneParameter = GetParameter(i) End If - SetParameter(clsTempCloneParameter, i) - 'If the control has a default state then it's linked control will set the value and we should not set to R default - If objDefaultState Is Nothing Then - If objRDefault IsNot Nothing Then - SetToRDefault() + If Not bUpdateRCodeFromControl AndAlso bChangeParameterValue Then + clsTempCloneParameter.ClearAllArguments() + End If + SetParameter(clsTempCloneParameter, i) + + 'If the control has a default state then it's linked control will set the value and we should not set to R default + If objDefaultState Is Nothing Then + If objRDefault IsNot Nothing Then + SetToRDefault() + End If + 'If there is no R default the value should remain nothing and SetControlValue() will set an apppropriate "empty" value End If - 'If there is no R default the value should remain nothing and SetControlValue() will set an apppropriate "empty" value End If End If - End If Else End If Else @@ -221,7 +226,7 @@ Public Class ucrCore UpdateLinkedControls(bReset) End Sub - Public Overridable Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True) + Public Overridable Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True, Optional bCloneIfNeeded As Boolean = False) If clsRCode Is Nothing OrElse Not clsRCode.Equals(clsNewCodeStructure) Then clsRCode = clsNewCodeStructure If bUpdateRCodeFromControl AndAlso CanUpdate() AndAlso bUpdate Then @@ -229,7 +234,7 @@ Public Class ucrCore End If End If If bUpdate Then - UpdateControl(bReset) + UpdateControl(bReset:=bReset, bCloneIfNeeded:=bCloneIfNeeded) End If End Sub diff --git a/instat/ucrDataFrame.vb b/instat/ucrDataFrame.vb index 8ff432c81dd..0be994fcf61 100644 --- a/instat/ucrDataFrame.vb +++ b/instat/ucrDataFrame.vb @@ -172,12 +172,12 @@ Public Class ucrDataFrame Clipboard.SetText(cboAvailableDataFrames.SelectedText) End Sub - Public Overrides Sub UpdateControl(Optional bReset As Boolean = False) + Public Overrides Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) Dim clsTempDataParameter As RParameter Dim strDataFrameName As String = "" Dim clsMainParameter As RParameter - MyBase.UpdateControl() + MyBase.UpdateControl(bReset:=bReset, bCloneIfNeeded:=bCloneIfNeeded) clsMainParameter = GetParameter() If clsMainParameter IsNot Nothing Then diff --git a/instat/ucrGeom.vb b/instat/ucrGeom.vb index de20075aef1..d8f772e2c5a 100644 --- a/instat/ucrGeom.vb +++ b/instat/ucrGeom.vb @@ -42,11 +42,11 @@ Public Class ucrGeom CreateGeomList() End Sub - Public Overrides Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True) + Public Overrides Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True, Optional bCloneIfNeeded As Boolean = False) Dim clsTempFunc As RFunction Dim iGeomIndex As Integer - MyBase.SetRCode(clsNewCodeStructure, bReset, bUpdate = True) + MyBase.SetRCode(clsNewCodeStructure, bReset, bUpdate, bCloneIfNeeded) If clsNewCodeStructure IsNot Nothing AndAlso TypeOf (clsNewCodeStructure) Is RFunction Then clsTempFunc = TryCast(clsNewCodeStructure, RFunction) If clsTempFunc IsNot Nothing AndAlso clsTempFunc.strRCommand IsNot Nothing Then diff --git a/instat/ucrInputComboBox.vb b/instat/ucrInputComboBox.vb index a260c2a713d..09492911e72 100644 --- a/instat/ucrInputComboBox.vb +++ b/instat/ucrInputComboBox.vb @@ -258,8 +258,8 @@ Public Class ucrInputComboBox cboCurrent.DropDownWidth = iWidth End Sub - Public Overrides Sub UpdateControl(Optional bReset As Boolean = False) - MyBase.UpdateControl(bReset) + 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() diff --git a/instat/ucrSave.vb b/instat/ucrSave.vb index 9e83a964669..15da6e4f988 100644 --- a/instat/ucrSave.vb +++ b/instat/ucrSave.vb @@ -285,7 +285,7 @@ Public Class ucrSave OnControlContentsChanged() End Sub - Public Overrides Sub UpdateControl(Optional bReset As Boolean = False) + Public Overrides Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) Dim clsMainRCode As RCodeStructure clsMainRCode = GetRCode() diff --git a/instat/ucrSelector.vb b/instat/ucrSelector.vb index 5b12b0f0442..b96cda46696 100644 --- a/instat/ucrSelector.vb +++ b/instat/ucrSelector.vb @@ -339,9 +339,9 @@ Public Class ucrSelector lstAvailableVariable.EndUpdate() End Sub - Public Overrides Sub UpdateControl(Optional bReset As Boolean = False) + Public Overrides Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) If bHasOwnParameter Then - MyBase.UpdateControl(bReset) + MyBase.UpdateControl(bReset:=bReset, bCloneIfNeeded:=bCloneIfNeeded) End If End Sub diff --git a/instat/ucrSelectorByDataFrame.vb b/instat/ucrSelectorByDataFrame.vb index 286efdd6c82..05310e76a7e 100644 --- a/instat/ucrSelectorByDataFrame.vb +++ b/instat/ucrSelectorByDataFrame.vb @@ -87,8 +87,8 @@ Public Class ucrSelectorByDataFrame OnControlValueChanged() End Sub - Public Overrides Sub UpdateControl(Optional bReset As Boolean = False) - MyBase.UpdateControl(bReset) + Public Overrides Sub UpdateControl(Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) + MyBase.UpdateControl(bReset, bCloneIfNeeded) ucrAvailableDataFrames.UpdateControl(bReset) End Sub @@ -132,8 +132,8 @@ Public Class ucrSelectorByDataFrame End If End Function - Public Overrides Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True) - MyBase.SetRCode(clsNewCodeStructure, bReset) + Public Overrides Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True, Optional bCloneIfNeeded As Boolean = False) + MyBase.SetRCode(clsNewCodeStructure, bReset, bUpdate, bCloneIfNeeded) ucrAvailableDataFrames.SetRCode(clsNewCodeStructure, bReset) End Sub From 25786c720438196aac0b2f121199a336855c34df Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Thu, 22 Jun 2017 15:49:59 +0100 Subject: [PATCH 145/201] fixed bug in factor control --- instat/clsRLink.vb | 13 ++++++------- instat/dlgLabels.vb | 2 +- instat/mdlCoreControl.vb | 1 + instat/static/InstatObject/R/data_object_R6.R | 8 +++++--- instat/ucrFactor.vb | 11 ++++++++--- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 85215574a18..2f5f5c7971a 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -806,13 +806,12 @@ Public Class RLink Dim clsGetColumnType As New RFunction Dim expDateType As SymbolicExpression - clsGetColumnType.SetRCommand(strInstatDataObject & "$get_variables_metadata") + clsGetColumnType.SetRCommand(strInstatDataObject & "$get_column_data_types") clsGetColumnType.AddParameter("data_name", Chr(34) & strDataName & Chr(34)) - clsGetColumnType.AddParameter("column", Chr(34) & strColumnName & Chr(34)) - clsGetColumnType.AddParameter("property", Chr(34) & "class" & Chr(34)) + clsGetColumnType.AddParameter("columns", Chr(34) & strColumnName & Chr(34)) expDateType = RunInternalScriptGetValue(clsGetColumnType.ToScript(), bSilent:=True) - If expDateType IsNot Nothing AndAlso Not expDateType.Type = Internals.SymbolicExpressionType.Null Then - strDataType = expDateType.AsCharacter(0) + If expDateType IsNot Nothing AndAlso expDateType.Type <> Internals.SymbolicExpressionType.Null Then + strDataType = String.Join(",", expDateType.AsCharacter) Else strDataType = "" End If @@ -907,8 +906,8 @@ Public Class RLink clsIsVarMetadata.AddParameter("column", Chr(34) & strColumn & Chr(34)) End If clsIsVarMetadata.AddParameter("property", Chr(34) & strProperty & Chr(34)) - expIsVar = RunInternalScriptGetValue(clsIsVarMetadata.ToScript()) - If expIsVar IsNot Nothing AndAlso expIsVar.Type = Internals.SymbolicExpressionType.Null Then + expIsVar = RunInternalScriptGetValue(clsIsVarMetadata.ToScript(), bSilent:=True) + If expIsVar IsNot Nothing AndAlso expIsVar.Type <> Internals.SymbolicExpressionType.Null Then bIsVarMetadata = expIsVar.AsLogical(0) Else bIsVarMetadata = False diff --git a/instat/dlgLabels.vb b/instat/dlgLabels.vb index 2d32de4f6c8..afc86ab4084 100644 --- a/instat/dlgLabels.vb +++ b/instat/dlgLabels.vb @@ -73,7 +73,7 @@ Public Class dlgLabels ucrSelectorForLabels.SetParameter(New RParameter("data_name", 0)) ucrSelectorForLabels.SetParameterIsString() - ucrChkAddLevels.SetText("Add Levels") + ucrChkAddLevels.SetText("Add Level Numbers") End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset diff --git a/instat/mdlCoreControl.vb b/instat/mdlCoreControl.vb index 6e7772231d4..cb9c4c4e6f9 100644 --- a/instat/mdlCoreControl.vb +++ b/instat/mdlCoreControl.vb @@ -94,6 +94,7 @@ Module mdlCoreControl Return bTemp End Function + 'TODO This fails when items in the list contain "," as it splits values inside Public Function ExtractItemsFromRList(strTemp As String) As String() Dim lstVariables As String() If strTemp.StartsWith("c(") Then diff --git a/instat/static/InstatObject/R/data_object_R6.R b/instat/static/InstatObject/R/data_object_R6.R index a1bb170cc58..232cfb88a0d 100644 --- a/instat/static/InstatObject/R/data_object_R6.R +++ b/instat/static/InstatObject/R/data_object_R6.R @@ -1073,17 +1073,19 @@ data_object$set("public", "convert_column_to_type", function(col_names = c(), to else stop("If specified, 'factor_values' must be either 'force_ordinals' or 'force_values'") } else if(to_type %in% c("factor", "ordered_factor")) { - ordered <- (to_type == "ordered_factor") + make_ordered <- (to_type == "ordered_factor") if(set_decimals) curr_col <- round(curr_col, digits = set_digits) if(ignore_labels) { - new_col <- factor(curr_col, ordered = ordered) + new_col <- factor(curr_col, ordered = make_ordered) } else { if(self$is_variables_metadata(labels_label, col_name)) { new_col <- sjmisc::to_label(curr_col, add.non.labelled = TRUE) + #TODO work out how to do ordered correctly + #if(make_ordered) new_col <- ordered(new_col) } else { - new_col <- factor(curr_col, ordered = ordered) + new_col <- factor(curr_col, ordered = make_ordered) if(is.numeric(curr_col) && !self$is_variables_metadata(labels_label, col_name)) { labs <- sort(unique(curr_col)) names(labs) <- labs diff --git a/instat/ucrFactor.vb b/instat/ucrFactor.vb index 83505382a8d..d97ddf15e37 100644 --- a/instat/ucrFactor.vb +++ b/instat/ucrFactor.vb @@ -68,6 +68,7 @@ Public Class ucrFactor Private Sub ucrFactor_Load(sender As Object, e As EventArgs) Handles MyBase.Load grdFactorData.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, False) + 'TODO possibly don't need to do this now as linking will fill the grid (but counts etc. need to be updated) RefreshFactorData() End Sub @@ -457,13 +458,17 @@ Public Class ucrFactor End If End Sub - Public Sub SetColumn(strValues As String(), iColumnIndex As Integer) + Public Sub SetColumn(strValues As String(), iColumnIndex As Integer, Optional bSilent As Boolean = True) Dim i As Integer If shtCurrSheet IsNot Nothing Then If strValues.Count <> shtCurrSheet.RowCount Then - MsgBox("Developer error: Cannot set value of control " & Name & " because the list of values does not match the number of levels.") + If Not bSilent Then + MsgBox("Developer error: Cannot set value of control " & Name & " because the list of values does not match the number of levels.") + End If ElseIf iColumnIndex < 0 OrElse iColumnIndex >= shtCurrSheet.ColumnCount Then - MsgBox("Developer error: Cannot set value of control " & Name & " because there is no column at index " & iColumnIndex & " in the grid.") + If Not bSilent Then + MsgBox("Developer error: Cannot set value of control " & Name & " because there is no column at index " & iColumnIndex & " in the grid.") + End If Else For i = 0 To shtCurrSheet.RowCount - 1 shtCurrSheet(i, iColumnIndex) = strValues(i) From daf3f147b8eb750d6d22c1608590705ea2b60847 Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 17:18:07 +0100 Subject: [PATCH 146/201] bug fix --- instat/dlgStartofRains.vb | 501 +++++--------------------------------- instat/ucrCore.vb | 22 +- 2 files changed, 75 insertions(+), 448 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index fa48102936b..3d5105a68ea 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -33,12 +33,15 @@ Public Class dlgStartofRains Public bFirstLoad As Boolean = True Private bReset As Boolean = True Private strWetSpell As String = "wet_spell" + Private strRollSumRain As String = "roll_sum_Rain" Private Sub dlgStartofRains_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) If bFirstLoad Then InitialiseDialog() bFirstLoad = False + Else + ReopenDialog() End If If bReset Then SetDefaults() @@ -49,6 +52,10 @@ Public Class dlgStartofRains TestOKEnabled() End Sub + Private Sub ReopenDialog() + SetRCodeForControls(bReset) + End Sub + Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 199 @@ -99,27 +106,23 @@ Public Class dlgStartofRains ucrPnlTRCalculateBy.AddRadioButton(rdoTRPercentile) ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "sub4", False) ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "sub4") - ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.85) + ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=20) ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) - 'Question ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "TRPerc") ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "TRAmount") ucrNudTRAmount.SetParameter(New RParameter("TRAmount", 1, False), False) - 'clsTRParameter.SetArgumentName("sub3") - 'ucrChkTotalRainfall.SetParameter(clsTRParameter, bNewChangeParameterValue:=False) ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 1, False), False) ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("totalrainfall", clsTRCombineOperator, 1, False), iAdditionalPairNo:=1) ucrChkTotalRainfall.SetText("Total Rainfall") - ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=2) ucrNudTROverDays.SetLinkedDisplayControl(lblTROverDays) - ucrChkTotalRainfall.AddToLinkedControls(ucrPnlTRCalculateBy, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkTotalRainfall.AddToLinkedControls(ucrPnlTRCalculateBy, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoTRAmount) ucrNudTROverDays.SetParameter(New RParameter("width", 1)) - ucrNudTROverDays.SetMinMax(1, 366) ' I think? - ' don't allow quotes around it + ucrNudTROverDays.SetMinMax(1, 366) ucrNudTRPercentile.SetParameter(New RParameter("probs", 1)) ucrNudTRPercentile.SetMinMax(0, 1) @@ -127,8 +130,6 @@ Public Class dlgStartofRains ucrNudTRPercentile.Increment = 0.1 'Number of Rainy days - ' clsRDParameter.SetArgumentName("sub2") - ' ucrChkNumberOfRainyDays.SetParameter(clsRDParameter, bNewChangeParameterValue:=False) ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub2", clsRDRollingRainDays, 2, False), False) ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("raindays", clsRDCombineOperator, 2, False), iAdditionalPairNo:=1) ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") @@ -139,18 +140,16 @@ Public Class dlgStartofRains ucrNudRDOutOfDays.SetParameter(New RParameter("width", 1)) ucrNudRDOutOfDays.SetLinkedDisplayControl(lblRDWidth) - ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) + ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=2) 'ucrNudRDOutOfDays.SetMinMax(1, 366) what is appropriate here? 'Dry Spell - 'clsDSParameter.SetArgumentName("sub1") - 'ucrChkDrySpell.SetParameter(clsDSParameter, bNewChangeParameterValue:=False) ucrChkDrySpell.SetParameter(New RParameter("sub1", clsDSDryPeriodTen, 3, False), False) ucrChkDrySpell.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryspell", clsDSCombineOperator, 3, False), iAdditionalPairNo:=1) ucrChkDrySpell.SetText("Dry Spell") - ucrChkDrySpell.AddToLinkedControls(ucrNudDSLengthOfTime, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkDrySpell.AddToLinkedControls(ucrNudDSMaximumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkDrySpell.AddToLinkedControls(ucrNudDSLengthOfTime, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=30) + ucrChkDrySpell.AddToLinkedControls(ucrNudDSMaximumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=9) ucrNudDSLengthOfTime.SetLinkedDisplayControl(lblDSLengthofTime) ucrNudDSMaximumDays.SetLinkedDisplayControl(lblDSMaximumDays) ucrNudDSLengthOfTime.SetParameter(New RParameter("width", 1)) @@ -160,8 +159,6 @@ Public Class dlgStartofRains ' Dry Period ucrChkDryPeriod.SetParameter(New RParameter("sub5", clsDPOverallInterval, 3, False), False) ucrChkDryPeriod.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryperiod", clsDPCombineOperator, 4, False), iAdditionalPairNo:=1) - 'clsDPParameter.SetArgumentName("sub5") - 'ucrChkDryPeriod.SetParameter(clsDPParameter, bNewChangeParameterValue:=False) ucrChkDryPeriod.SetText("Dry Period") ucrNudDPRainPeriod.SetParameter(New RParameter("width", 1)) @@ -174,9 +171,9 @@ Public Class dlgStartofRains ucrNudDPOverallInterval.SetLinkedDisplayControl(lblDPOverallInterval) ' minmax? - ucrChkDryPeriod.AddToLinkedControls(ucrNudDPMaxRain, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkDryPeriod.AddToLinkedControls(ucrNudDPOverallInterval, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) - ucrChkDryPeriod.AddToLinkedControls(ucrNudDPRainPeriod, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrChkDryPeriod.AddToLinkedControls(ucrNudDPMaxRain, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=40) + ucrChkDryPeriod.AddToLinkedControls(ucrNudDPOverallInterval, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=45) + ucrChkDryPeriod.AddToLinkedControls(ucrNudDPRainPeriod, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=30) ucrReceiverYear.Selector = ucrSelectorForStartofRains ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) @@ -191,7 +188,6 @@ Public Class dlgStartofRains End Sub Private Sub SetDefaults() - Dim strRollSumRain As String = "roll_sum_Rain" Dim strRainDay As String = "rain_day" Dim strRollingRainDays As String = "Rolling_Rain_Days" Dim strDrySpell As String = "Dry_Spell" @@ -333,7 +329,7 @@ Public Class dlgStartofRains clsRDRollingRainDaysFunction.SetPackageName("zoo") clsRDRollingRainDaysFunction.SetRCommand("rollapply") clsRDRollingRainDaysFunction.AddParameter("data", strRainDay, iPosition:=0) - clsRDRollingRainDaysFunction.AddParameter("width", 2, iPosition:=1) ' default = 2? + clsRDRollingRainDaysFunction.AddParameter("width", 2, iPosition:=1) clsRDRollingRainDaysFunction.AddParameter("FUN", "sum", iPosition:=2) clsRDRollingRainDaysFunction.AddParameter("na.rm", "FALSE", iPosition:=3) clsRDRollingRainDaysFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) @@ -466,22 +462,20 @@ Public Class dlgStartofRains clsTRCombineOperator.AddParameter("TRLeft", strRollSumRain, iPosition:=0) ' run if chkRD is checked - ' clsCombineOperator.AddParameter("raindays", clsROperatorParameter:=clsRDCombineOperator, iPosition:=2) clsRDCombineOperator.SetOperation(">=") clsRDCombineOperator.AddParameter("RDleft", strRollingRainDays, iPosition:=0) - clsRDCombineOperator.AddParameter("RDMin", 2, iPosition:=1) + clsRDCombineOperator.AddParameter("RDMin", 1, iPosition:=1) ' run if chkDS is checked - ' clsCombineOperator.AddParameter("dryspell", clsROperatorParameter:=clsDSCombineOperator, iPosition:=3) clsDSCombineOperator.SetOperation("<") clsDSCombineOperator.AddParameter("DSleft", strDrySpell, iPosition:=0) - clsDSCombineOperator.AddParameter("DSMax", 10, iPosition:=1) + clsDSCombineOperator.AddParameter("DSMax", 9, iPosition:=1) ' run if chkDP is checked - ' clsCombineOperator.AddParameter("dryperiod", clsROperatorParameter:=clsDPCombineOperator, iPosition:=4) clsDPCombineOperator.SetOperation("==") clsDPCombineOperator.AddParameter("DPleft", strDPOverallIntervalRain, iPosition:=0) clsDPCombineOperator.AddParameter("DPMax", 0, iPosition:=1) + ' First DOY clsFirstDOYPerYearOperator.bToScriptAsRString = True clsFirstDOYPerYear.SetRCommand("instat_calculation$new") @@ -517,6 +511,7 @@ Public Class dlgStartofRains ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRainCombineOperator, New RParameter("rain", 0), iAdditionalPairNo:=3) ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsTRRollingSumFunction, New RParameter("data", 0), iAdditionalPairNo:=4) ucrNudThreshold.AddAdditionalCodeParameterPair(clsRainCombineOperator, New RParameter("rainThreshold", 1), iAdditionalPairNo:=1) + ucrNudDPRainPeriod.AddAdditionalCodeParameterPair(clsDPOverallIntervalFunctionOperatorRight, New RParameter("Rain", 0), iAdditionalPairNo:=1) ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ' false in these brackets, when in initialise ucrNudFrom.SetRCode(clsDayFromOperator, bReset) @@ -544,7 +539,6 @@ Public Class dlgStartofRains 'DryPeriod ucrChkDryPeriod.SetRCode(clsCombinedList, bReset) - ucrNudDPRainPeriod.AddAdditionalCodeParameterPair(clsDPOverallIntervalFunctionOperatorRight, New RParameter("Rain", 0), iAdditionalPairNo:=1) ucrNudDPRainPeriod.SetRCode(clsDPRainInDaysFunction, bReset) ucrNudDPMaxRain.SetRCode(clsDPRainFunctionOperator, bReset) ucrNudDPOverallInterval.SetRCode(clsDPOverallIntervalFunctionOperator, bReset) @@ -581,268 +575,47 @@ Public Class dlgStartofRains TotalRainfall() End If - If ucrChkNumberOfRainyDays.Checked Then - TotalRainyDays() - End If - If ucrChkDryPeriod.Checked Then DryPeriod() End If End Sub - Private Sub DayBoundaries() - clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - End Sub - - Private Sub RainDays() - clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=5) - End Sub - - Private Sub TotalRainfall() - clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=0) - End Sub - - Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForStartofRains.ControlContentsChanged - strCurrDataName = Chr(34) & ucrSelectorForStartofRains.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - End Sub - - Private Sub TotalRainyDays() - clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) - clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) - End Sub - - Private Sub DryPeriod() - clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=5) - End Sub - Private Sub CombinedFilter() + clsCombineOperator.AddParameter("totalrainfall", clsROperatorParameter:=clsTRCombineOperator, iPosition:=1) If ucrChkTotalRainfall.Checked Then If rdoTRAmount.Checked Then clsCombinedList.RemoveParameterByName("sub4") + clsTRCombineOperator.RemoveParameterByName("TRPerc") clsTRCombineOperator.AddParameter("TRAmount", strParameterValue:=ucrNudTRAmount.Value, iPosition:=1) Else clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) + clsTRCombineOperator.RemoveParameterByName("TRAmount") clsTRCombineOperator.AddParameter("TRPerc", strParameterValue:=strWetSpell, iPosition:=1) End If Else clsCombinedList.RemoveParameterByName("sub4") + clsCombineOperator.RemoveParameterByName("totalrainfall") clsTRCombineOperator.RemoveParameterByName("TRPerc") clsTRCombineOperator.RemoveParameterByName("TRAmount") End If End Sub - Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged - DayBoundaries() + Private Sub DayBoundaries() + clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") End Sub - Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged - If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") - Else - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") - End If + Private Sub RainDays() + clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=5) End Sub - Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlContentsChanged, ucrSaveStartofRains.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrNudThreshold.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrChkNumberOfRainyDays.ControlContentsChanged, ucrNudRDMinimumDays.ControlContentsChanged, ucrNudRDOutOfDays.ControlContentsChanged, ucrChkTotalRainfall.ControlContentsChanged, ucrNudTROverDays.ControlContentsChanged, ucrPnlTRCalculateBy.ControlContentsChanged, ucrNudTRAmount.ControlContentsChanged, ucrNudTRPercentile.ControlContentsChanged, ucrChkDrySpell.ControlContentsChanged, ucrNudDSMaximumDays.ControlContentsChanged, ucrNudDSLengthOfTime.ControlContentsChanged, ucrChkDryPeriod.ControlContentsChanged, ucrNudDPMaxRain.ControlContentsChanged, ucrNudDPRainPeriod.ControlContentsChanged, ucrNudDPOverallInterval.ControlContentsChanged - TestOKEnabled() + Private Sub TotalRainfall() + clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=0) End Sub - Private Sub ucrChkTotalRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkTotalRainfall.ControlValueChanged, ucrPnlTRCalculateBy.ControlValueChanged - CombinedFilter() + Private Sub DryPeriod() + clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=5) End Sub - - - - - - - - - - - - - - - - - - - - 'Private Sub CombinedFilter() - ' Dim strTempFunExpression As String = Chr(34) - - ' clsCombinedFilter.RemoveParameterByName("function_exp") - - ' If ucrChkTotalRainfall.Checked Then - ' strTempFunExpression = strTempFunExpression & "roll_sum_Rain > " - ' If rdoTRAmount.Checked Then - ' strTempFunExpression = strTempFunExpression & ucrNudTRAmount.Value - ' clsCombinedList.RemoveParameterByName("sub4") - ' ElseIf rdoTRPercentile.Checked Then - ' strTempFunExpression = strTempFunExpression & strWetSpell - ' clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) - ' End If - ' strTempFunExpression = strTempFunExpression & " & " - ' clsCombinedList.AddParameter("sub3", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) - ' Else - ' clsCombinedList.RemoveParameterByName("sub3") - ' End If - - ' If ucrChkNumberOfRainyDays.Checked Then - ' strTempFunExpression = strTempFunExpression & strRollingRainDays >= & ucrNudRDMinimumDays.Value & " & " - ' clsCombinedList.AddParameter("sub2", clsRFunctionParameter:=clsRDRollingRainDays, bIncludeArgumentName:=False) - ' param Name = sub2, SetRCode(clsCombinedList) - ' Else - ' clsCombinedList.RemoveParameterByName("sub2") - ' End If - ' If ucrChkDrySpell.Checked Then - ' strTempFunExpression = strTempFunExpression & "Dry_Spell < " & ucrNudDSMaximumDays.Value & " & " - ' clsCombinedList.AddParameter("sub1", clsRFunctionParameter:=clsDSDryPeriodTen, bIncludeArgumentName:=False) - ' Else - ' clsCombinedList.RemoveParameterByName("sub1") - ' End If - ' If ucrChkDryPeriod.Checked Then - ' strTempFunExpression = strTempFunExpression & "DP_Overall_Interval_Rain == 0 " & " & " - ' clsCombinedList.AddParameter("sub5", clsRFunctionParameter:=clsDPOverallInterval, bIncludeArgumentName:=False) - ' Else - ' clsCombinedList.RemoveParameterByName("sub5") - ' End If - - ' strTempFunExpression = strTempFunExpression & ucrReceiverRainfall.GetVariableNames(False) & ">=" & ucrNudThreshold.Value & Chr(34) - - ' clsCombinedFilter.AddParameter("function_exp", strTempFunExpression) - 'End Sub - - 'Private Sub ucrReceiverDOY_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverDOY.SelectionChanged - ' firstDayofTheYear() - ' FirstDOYPerYear() - ' TestOKEnabled() - 'End Sub - - 'Private Sub ucrSelectorForStartofRains_DataFrameChanged() Handles ucrSelectorForStartofRains.DataFrameChanged - ' strCurrDataName = Chr(34) & ucrSelectorForStartofRains.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - ' firstDayofTheYear() - 'End Sub - - 'Private Sub ReopenDialog() - - 'End Sub - - - 'Private Sub grpRainParameters_Enter(sender As Object, e As EventArgs) - ' RainyDaysMethod() - ' nudValues() - ' CombinedFilter() - ' TestOKEnabled() - 'End Sub - - 'Private Sub DryPeriod(sender As Object, e As EventArgs) - ' CheckBoxesSetting() - ' DryPeriodOld() - ' nudValues() - ' TestOKEnabled() - 'End Sub - - 'Private Sub TotalRainfall(sender As Object, e As EventArgs) Handles rdoTRAmount.CheckedChanged, rdoTRPercentile.CheckedChanged - ' CheckBoxesSetting() - ' CombinedFilter() - ' RollingSumMethod() - ' TotalRainPercentileWetSpell() - ' nudValues() ' new - ' 'DefaultNudValue() - ' TestOKEnabled() - 'End Sub - - 'Private Sub TotalRainfallNuds(sender As Object, e As EventArgs) - ' CombinedFilter() - ' TestOKEnabled() - 'End Sub - - 'Private Sub RainyDays(sender As Object, e As EventArgs) - ' CheckBoxesSetting() - ' RollingOfRainDays() - ' nudValues() - ' CombinedFilter() - ' TestOKEnabled() - 'End Sub - - 'Private Sub DrySpell_Spe(sender As Object, e As EventArgs) - ' CheckBoxesSetting() - ' DrySpellOld() - ' nudValues() - ' CombinedFilter() - ' TestOKEnabled() - 'End Sub - - - ''Private Sub grpConditionsForStartofRains_Enter(sender As Object, e As EventArgs) Handles nudTRAmount.TextChanged, nudTRPercentile.TextChanged, nudRDMinimum.TextChanged, nudDSMaximumDays.TextChanged, nudDSLengthofTime.TextChanged, nudTROverDays.TextChanged, nudRDOutOfDays.TextChanged - '' RainyDaysMethod() - '' DayFromAndToMethod() - '' CombinedFilter() - '' RollingOfRainDays() - '' DrySpellOld() - '' RollingSumMethod() - '' TotalRainPercentileWetSpell() - '' nudValues() - '' TestOKEnabled() - ''End Sub - - ''Private Sub grpConditionsForStartofRains1_Enter(sender As Object, e As EventArgs) Handles chkConsecutiveRainyDays.CheckedChanged, chkTotalRainfall.CheckedChanged, chkDrySpell.CheckedChanged, chkDryPeriod.CheckedChanged - '' CheckBoxesSetting() - '' DrySpell() - '' RainyDaysMethod() - '' CombinedFilter() - '' FirstDOYPerYear() - '' TestOKEnabled() - '' nudValues() - ''End Sub - - '' yep - 'Private Sub ucrReceiverRainfall_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverRainfall.SelectionChanged - ' RainyDaysMethod() - ' RollingSumMethod() - ' DryPeriodOld() - ' TestOKEnabled() - 'End Sub - - 'Private Sub CheckBoxesSetting() - ' 'If chkTotalRainfall.Checked Then - ' ' pnlTotalRainfall.Visible = True - ' ' nudTRAmount.Visible = False - ' ' ' nudTRPercentile.Visible = False - ' ' If rdoTRAmount.Checked Then - ' ' nudTRAmount.Visible = True - ' ' nudTRPercentile.Visible = False - ' ' ElseIf rdoTRPercentile.Checked Then - ' ' nudTRAmount.Visible = False - ' ' nudTRPercentile.Visible = True - ' ' Else - ' ' nudTRAmount.Visible = False - ' ' nudTRPercentile.Visible = False - ' ' End If - ' 'Else - ' ' pnlTotalRainfall.Visible = False - ' 'End If - ' 'If chkDrySpell.Checked Then - ' ' pnlDrySpell.Visible = True - ' 'Else - ' ' pnlDrySpell.Visible = False - ' 'End If - ' 'If chkConsecutiveRainyDays.Checked Then - ' ' pnlConsecutiveRainyDays.Visible = True - ' 'Else - ' ' pnlConsecutiveRainyDays.Visible = False - ' 'End If - ' 'If chkDryPeriod.Checked Then - ' ' pnlDryPeriod.Visible = True - ' 'Else - ' ' pnlDryPeriod.Visible = False - ' 'End If - 'End Sub - - '' nud max and mins. 'Private Sub nudValues() ' ' nudFrom.Maximum = nudTo.Value - 1 ' ' nudTo.Minimum = nudFrom.Value + 1 @@ -858,184 +631,38 @@ Public Class dlgStartofRains ' ' nudDPRainPeriod.Maximum = nudDPOverallInterval.Value - 1 ' ' nudDPOverallInterval.Minimum = nudDPRainPeriod.Value + 1 ' 'End If - 'End Sub - - 'Private Sub RainyDaysMethod() - ' If ((Not ucrReceiverRainfall.IsEmpty) AndAlso (ucrNudThreshold.Text <> "")) Then - ' 'clsRainyDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' 'clsRainyDays.AddParameter("function_exp", Chr(34) & "match(" & ucrReceiverRainfall.GetVariableNames(False) & ">=" & nudThreshold.Value & "," & "1, nomatch = 0" & ")" & Chr(34)) - ' 'clsRainyDays.AddParameter("result_name", Chr(34) & strRainDay & Chr(34)) - ' 'clsRainyDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames(True) & ")") - ' 'clsRainyDays.AddParameter("save", 0) - ' ' clsSubRainDays.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - ' End If - 'End Sub - - 'Private Sub RollingSumMethod() - ' 'If chkTotalRainfall.Checked AndAlso Not ucrReceiverRainfall.IsEmpty Then - ' ' clsTRRollingSum.AddParameter("function_exp", Chr(34) & " zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudTROverDays.Value & ", FUN = sum, na.rm = FALSE, align='right', fill=NA)" & Chr(34)) - ' ' clsTRRollingSum.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' ' clsTRRollingSum.AddParameter("result_name", Chr(34) & strRollSumRain & Chr(34)) - ' ' clsTRRollingSum.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") - ' ' clsTRRollingSum.AddParameter("save", 0) - ' 'Else - ' ' clsTRRollingSum.RemoveParameterByName("function_exp") - ' ' clsTRRollingSum.RemoveParameterByName("type") - ' ' clsTRRollingSum.RemoveParameterByName("result_name") - ' ' clsTRRollingSum.RemoveParameterByName("calculated_from") - ' ' clsTRRollingSum.RemoveParameterByName("save") - ' 'End If - 'End Sub - - '' If we have 'Percentile' checked - 'Private Sub TotalRainPercentileWetSpell() - ' 'If rdoTRPercentile.Checked Then - ' ' clsTRWetSpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' ' clsTRWetSpell.AddParameter("function_exp", Chr(34) & "quantile(roll_sum_Rain, c(" & nudTRPercentile.Value & "), na.rm=T)" & Chr(34)) - ' ' clsTRWetSpell.AddParameter("result_name", Chr(34) & strWetSpell & Chr(34)) - ' ' clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList) - ' ' clsTRWetSpellList.AddParameter("sub1", clsRFunctionParameter:=clsTRRollingSum, bIncludeArgumentName:=False) - ' ' clsTRWetSpell.AddParameter("save", "0") - ' 'Else - ' ' clsTRWetSpell.RemoveParameterByName("type") - ' ' clsTRWetSpell.RemoveParameterByName("function_exp") - ' ' clsTRWetSpell.RemoveParameterByName("result_name") - ' ' clsTRWetSpell.RemoveParameterByName("sub_calculations") - ' ' clsTRWetSpellList.RemoveParameterByName("sub1") - ' ' clsTRWetSpell.RemoveParameterByName("save") - ' 'End If - 'End Sub - - 'Private Sub RollingOfRainDays() - ' ' ' If rolling of rain days one is checked Then - ' 'clsRDRollingRainDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' 'clsRDRollingRainDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data=rain_day, width = " & nudRDOutOfDays.Value & ", FUN = sum, na.rm = FALSE, align = 'right', fill=NA)" & Chr(34)) - ' 'clsRDRollingRainDays.AddParameter("result_name", Chr(34) & strRollingRainDays & Chr(34)) - ' 'clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) - ' 'clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - ' 'clsRDRollingRainDays.AddParameter("save", 0) - 'End Sub - - 'Private Sub DrySpellOld() - ' 'If chkDrySpell.Checked Then - ' ' clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' ' clsDSDrySpell.AddParameter("function_exp", Chr(34) & "cumsum(rain_day==0)-cummax((rain_day)*cumsum(rain_day==0))" & Chr(34)) - ' ' clsDSDrySpell.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34)) - ' ' clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub) - ' ' clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) - ' ' clsDSDrySpell.AddParameter("save", 0) - ' ' clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' ' clsDSDryPeriodTen.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Dry_Spell, width=" & ucrNudDSLengthOfTime.Value & ", FUN=max, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - ' ' clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34)) - ' ' clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList) - ' ' clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) - ' ' clsDSDryPeriodTen.AddParameter("save", 2) - ' 'Else - ' ' clsDSDrySpell.RemoveParameterByName("type") - ' ' clsDSDrySpell.RemoveParameterByName("function_exp") - ' ' clsDSDrySpell.RemoveParameterByName("result_name") - ' ' clsDSDrySpell.RemoveParameterByName("sub_calculations") - ' ' clsDSDrySpellSub.RemoveParameterByName("sub1") - ' ' clsDSDrySpell.RemoveParameterByName("save") - ' ' clsDSDryPeriodTen.RemoveParameterByName("type") - ' ' clsDSDryPeriodTen.RemoveParameterByName("function_exp") - ' ' clsDSDryPeriodTen.RemoveParameterByName("sub_calculations") - ' ' clsDSDryPeriodTen.RemoveParameterByName("result_name") - ' ' clsDSDryPeriodTen.RemoveParameterByName("save") - ' ' clsDSDryPeriodTenList.RemoveParameterByName("sub1") - ' 'End If - 'End Sub - - 'Private Sub DryPeriodOld() - ' If ucrChkDryPeriod.Checked Then - ' ' clsDPRainInDays.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' ' clsDPRainInDays.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = " & ucrReceiverRainfall.GetVariableNames(False) & " ,width = " & nudDPRainPeriod.Value & ", FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - ' ' clsDPRainInDays.AddParameter("result_name", Chr(34) & strRainInDays & Chr(34)) - ' ' clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")") - ' ' clsDPRainInDays.AddParameter("save", "0") - - ' ' clsDPRain.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' ' clsDPRain.AddParameter("function_exp", Chr(34) & "match( Rain_in_Days <= " & nudDPMaxRain.Value & ", 1, nomatch = 0)" & Chr(34)) - ' ' clsDPRain.AddParameter("result_name", Chr(34) & "Above_Threshold" & Chr(34)) - ' ' clsDPRain.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPRainList) - ' ' clsDPRainList.AddParameter("sub1", clsRFunctionParameter:=clsDPRainInDays, bIncludeArgumentName:=False) - ' ' clsDPRain.AddParameter("save", 0) - - ' ' clsDPOverallInterval.AddParameter("type", Chr(34) & "calculation" & Chr(34)) - ' ' clsDPOverallInterval.AddParameter("function_exp", Chr(34) & "zoo::rollapply(data = Above_Threshold ,width = (" & nudDPOverallInterval.Value & "-" & nudDPRainPeriod.Value & "+ 1), FUN = sum, na.rm = FALSE, align='left', fill=NA)" & Chr(34)) - ' ' clsDPOverallInterval.AddParameter("result_name", Chr(34) & strDPOverallIntervalRain & Chr(34)) - ' ' clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList) - ' ' clsDPOverallIntervalList.AddParameter("sub1", clsRFunctionParameter:=clsDPRain, bIncludeArgumentName:=False) - ' ' clsDPOverallInterval.AddParameter("save", "2") - ' 'Else - ' ' clsDPRainInDays.RemoveParameterByName("type") - ' ' clsDPRainInDays.RemoveParameterByName("function_exp") - ' ' clsDPRainInDays.RemoveParameterByName("result_name") - ' ' clsDPRainInDays.RemoveParameterByName("calculated_from") - ' ' clsDPRainInDays.RemoveParameterByName("save") - ' ' clsDPRain.RemoveParameterByName("type") - ' ' clsDPRain.RemoveParameterByName("function_exp") - ' ' clsDPRain.RemoveParameterByName("result_name") - ' ' clsDPRain.RemoveParameterByName("sub_calculations") - ' ' clsDPRainList.RemoveParameterByName("sub1") - ' ' clsDPRain.RemoveParameterByName("save") - ' ' clsDPOverallInterval.RemoveParameterByName("type") - ' ' clsDPOverallInterval.RemoveParameterByName("function_exp") - ' ' clsDPOverallInterval.RemoveParameterByName("result_name") - ' ' clsDPOverallInterval.RemoveParameterByName("sub_calculations") - ' ' clsDPOverallInterval.RemoveParameterByName("sub1") - ' ' clsDPOverallInterval.RemoveParameterByName("save") - ' End If - 'End Sub - - 'Private Sub FirstDOYPerYear() - ' '' run these when things are checked - ' 'If Not ucrReceiverDOY.IsEmpty Then - - ' ' clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) - ' ' clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) - - ' ' clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) - ' ' clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & "[" & 1 & "]" & Chr(34)) - ' ' clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - ' ' clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear) - ' ' clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34)) - ' ' clsFirstDOYPerYear.AddParameter("save", 2) - - ' 'Else - ' ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub1") - ' ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub2") - ' ' clsManipulationFirstDOYPerYear.RemoveParameterByName("sub3") - ' ' clsFirstDOYPerYear.RemoveParameterByName("type") - ' ' clsFirstDOYPerYear.RemoveParameterByName("function_exp") - ' ' clsFirstDOYPerYear.RemoveParameterByName("calculated_from") - ' ' clsFirstDOYPerYear.RemoveParameterByName("manipulations") - ' 'End If - 'End Sub - 'Private Sub firstDayofTheYear() - ' 'clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) - ' 'clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + Private Sub ucrChkTotalRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkTotalRainfall.ControlValueChanged, ucrPnlTRCalculateBy.ControlValueChanged + CombinedFilter() + End Sub - ' 'clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34)) - ' 'clsFirstDOYPerYear.AddParameter("function_exp", Chr(34) & ucrReceiverDOY.GetVariableNames(False) & "[" & 1 & "]" & Chr(34)) - ' 'clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - ' 'clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear) - ' 'clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34)) - ' 'clsFirstDOYPerYear.AddParameter("save", 2) + Private Sub ucrSelectorForStartofRains_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorForStartofRains.ControlValueChanged + strCurrDataName = Chr(34) & ucrSelectorForStartofRains.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) + DayBoundaries() + RainDays() + TotalRainfall() + DryPeriod() + End Sub - ' 'ucrBase.clsRsyntax.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear) - 'End Sub + Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged + DayBoundaries() + End Sub - ''Private Sub ucrSaveStartofRains_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlContentsChanged - '' TestOKEnabled() - ''End Sub + Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged + RainDays() + TotalRainfall() + DryPeriod() + End Sub - ''Private Sub ucrSaveStartofRains_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStartofRains.ControlValueChanged - '' FirstDOYPerYear() - ''End Sub + Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged + If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") + Else + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + End If + End Sub - ''Private Sub DefaultNudValue() - '' nudRDOutOfDays.Value = nudTROverDays.Value ' crashes if I go to 100+, can crash upon a reset, also what if I change the nudOverDays then the nudOutofDays - then I lose my nudOverDays value I put in - ''End Sub + Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlContentsChanged, ucrSaveStartofRains.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrNudThreshold.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrChkNumberOfRainyDays.ControlContentsChanged, ucrNudRDMinimumDays.ControlContentsChanged, ucrNudRDOutOfDays.ControlContentsChanged, ucrChkTotalRainfall.ControlContentsChanged, ucrNudTROverDays.ControlContentsChanged, ucrPnlTRCalculateBy.ControlContentsChanged, ucrNudTRAmount.ControlContentsChanged, ucrNudTRPercentile.ControlContentsChanged, ucrChkDrySpell.ControlContentsChanged, ucrNudDSMaximumDays.ControlContentsChanged, ucrNudDSLengthOfTime.ControlContentsChanged, ucrChkDryPeriod.ControlContentsChanged, ucrNudDPMaxRain.ControlContentsChanged, ucrNudDPRainPeriod.ControlContentsChanged, ucrNudDPOverallInterval.ControlContentsChanged + TestOKEnabled() + End Sub End Class \ No newline at end of file diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index daff22ec29d..423551608f1 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -119,20 +119,20 @@ Public Class ucrCore clsTempCloneParameter = GetParameter(i) End If - If Not bUpdateRCodeFromControl AndAlso bChangeParameterValue Then - clsTempCloneParameter.ClearAllArguments() - End If - SetParameter(clsTempCloneParameter, i) - - 'If the control has a default state then it's linked control will set the value and we should not set to R default - If objDefaultState Is Nothing Then - If objRDefault IsNot Nothing Then - SetToRDefault() - End If - 'If there is no R default the value should remain nothing and SetControlValue() will set an apppropriate "empty" value + If Not bUpdateRCodeFromControl AndAlso bChangeParameterValue AndAlso objDefaultState Is Nothing Then + clsTempCloneParameter.ClearAllArguments() + End If + SetParameter(clsTempCloneParameter, i) + + 'If the control has a default state then it's linked control will set the value and we should not set to R default + If objDefaultState Is Nothing Then + If objRDefault IsNot Nothing Then + SetToRDefault() End If + 'If there is no R default the value should remain nothing and SetControlValue() will set an apppropriate "empty" value End If End If + End If Else End If Else From d30f7cbc8ba8ab9d9ca32668d191e2a2f6a2815c Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 18:27:31 +0100 Subject: [PATCH 147/201] Start of rains update --- instat/dlgStartofRains.Designer.vb | 555 ++++++++++++++--------------- instat/dlgStartofRains.vb | 13 +- 2 files changed, 261 insertions(+), 307 deletions(-) diff --git a/instat/dlgStartofRains.Designer.vb b/instat/dlgStartofRains.Designer.vb index 7f4b51d4efd..07b0770d4bb 100644 --- a/instat/dlgStartofRains.Designer.vb +++ b/instat/dlgStartofRains.Designer.vb @@ -24,32 +24,32 @@ Partial Class dlgStartofRains Private Sub InitializeComponent() Me.lblRainfall = New System.Windows.Forms.Label() Me.grpConditionsForSatrtofRains = New System.Windows.Forms.GroupBox() - Me.ucrChkNumberOfRainyDays = New instat.ucrCheck() - Me.ucrChkTotalRainfall = New instat.ucrCheck() - Me.ucrNudTRAmount = New instat.ucrNud() - Me.lblTROverDays = New System.Windows.Forms.Label() - Me.ucrNudTROverDays = New instat.ucrNud() - Me.ucrNudTRPercentile = New instat.ucrNud() - Me.lblTRVal = New System.Windows.Forms.Label() - Me.rdoTRPercentile = New System.Windows.Forms.RadioButton() - Me.rdoTRAmount = New System.Windows.Forms.RadioButton() - Me.pnlDrySpell = New System.Windows.Forms.Panel() + Me.ucrNudDPOverallInterval = New instat.ucrNud() Me.ucrNudDSMaximumDays = New instat.ucrNud() Me.ucrNudDSLengthOfTime = New instat.ucrNud() - Me.lblDSMaximumDays = New System.Windows.Forms.Label() - Me.lblDSLengthofTime = New System.Windows.Forms.Label() - Me.pnlConsecutiveRainyDays = New System.Windows.Forms.Panel() + Me.lblDPOverallInterval = New System.Windows.Forms.Label() Me.ucrNudRDMinimumDays = New instat.ucrNud() + Me.ucrNudDPRainPeriod = New instat.ucrNud() + Me.lblDPLength = New System.Windows.Forms.Label() + Me.ucrChkDryPeriod = New instat.ucrCheck() + Me.lblDSLengthofTime = New System.Windows.Forms.Label() + Me.lblDPMaxRain = New System.Windows.Forms.Label() Me.ucrNudRDOutOfDays = New instat.ucrNud() + Me.ucrNudDPMaxRain = New instat.ucrNud() + Me.ucrChkDrySpell = New instat.ucrCheck() + Me.lblDSMaximumDays = New System.Windows.Forms.Label() Me.lblRDMinimum = New System.Windows.Forms.Label() + Me.lblTROverDays = New System.Windows.Forms.Label() Me.lblRDWidth = New System.Windows.Forms.Label() - Me.pnlDryPeriod = New System.Windows.Forms.Panel() - Me.ucrNudDPOverallInterval = New instat.ucrNud() - Me.lblDPMaxRain = New System.Windows.Forms.Label() - Me.ucrNudDPMaxRain = New instat.ucrNud() - Me.lblDPLength = New System.Windows.Forms.Label() - Me.ucrNudDPRainPeriod = New instat.ucrNud() - Me.lblDPOverallInterval = New System.Windows.Forms.Label() + Me.ucrChkNumberOfRainyDays = New instat.ucrCheck() + Me.ucrNudTROverDays = New instat.ucrNud() + Me.ucrNudTRAmount = New instat.ucrNud() + Me.lblTRVal = New System.Windows.Forms.Label() + Me.ucrChkTotalRainfall = New instat.ucrCheck() + Me.ucrNudTRPercentile = New instat.ucrNud() + Me.rdoTRAmount = New System.Windows.Forms.RadioButton() + Me.rdoTRPercentile = New System.Windows.Forms.RadioButton() + Me.ucrPnlTRCalculateBy = New instat.UcrPanel() Me.grpRainParameters = New System.Windows.Forms.GroupBox() Me.ucrNudThreshold = New instat.ucrNud() Me.ucrNudTo = New instat.ucrNud() @@ -63,329 +63,322 @@ Partial Class dlgStartofRains Me.ucrBase = New instat.ucrButtons() Me.ucrSaveStartofRains = New instat.ucrSave() Me.lblStation = New System.Windows.Forms.Label() - Me.ucrChkDrySpell = New instat.ucrCheck() - Me.ucrChkDryPeriod = New instat.ucrCheck() Me.ucrReceiverStation = New instat.ucrReceiverSingle() Me.ucrReceiverYear = New instat.ucrReceiverSingle() Me.ucrReceiverDate = New instat.ucrReceiverSingle() Me.ucrReceiverDOY = New instat.ucrReceiverSingle() - Me.ucrPnlTRCalculateBy = New instat.UcrPanel() Me.ucrReceiverRainfall = New instat.ucrReceiverSingle() Me.ucrSelectorForStartofRains = New instat.ucrSelectorByDataFrameAddRemove() Me.grpConditionsForSatrtofRains.SuspendLayout() - Me.pnlDrySpell.SuspendLayout() - Me.pnlConsecutiveRainyDays.SuspendLayout() - Me.pnlDryPeriod.SuspendLayout() Me.grpRainParameters.SuspendLayout() Me.SuspendLayout() ' 'lblRainfall ' Me.lblRainfall.AutoSize = True - Me.lblRainfall.Location = New System.Drawing.Point(246, 70) + Me.lblRainfall.Location = New System.Drawing.Point(246, 113) Me.lblRainfall.Name = "lblRainfall" Me.lblRainfall.Size = New System.Drawing.Size(70, 13) - Me.lblRainfall.TabIndex = 3 + Me.lblRainfall.TabIndex = 5 Me.lblRainfall.Text = "Rain Column:" ' 'grpConditionsForSatrtofRains ' + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudDPOverallInterval) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudDSMaximumDays) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudDSLengthOfTime) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblDPOverallInterval) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudRDMinimumDays) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudDPRainPeriod) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblDPLength) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkDryPeriod) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblDSLengthofTime) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblDPMaxRain) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudRDOutOfDays) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudDPMaxRain) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkDrySpell) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblDSMaximumDays) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblRDMinimum) Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblTROverDays) + Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblRDWidth) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkNumberOfRainyDays) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudTROverDays) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudTRAmount) Me.grpConditionsForSatrtofRains.Controls.Add(Me.lblTRVal) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrChkTotalRainfall) - Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlDrySpell) - Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlConsecutiveRainyDays) - Me.grpConditionsForSatrtofRains.Controls.Add(Me.pnlDryPeriod) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrNudTRPercentile) Me.grpConditionsForSatrtofRains.Controls.Add(Me.rdoTRAmount) Me.grpConditionsForSatrtofRains.Controls.Add(Me.rdoTRPercentile) Me.grpConditionsForSatrtofRains.Controls.Add(Me.ucrPnlTRCalculateBy) - Me.grpConditionsForSatrtofRains.Location = New System.Drawing.Point(9, 238) + Me.grpConditionsForSatrtofRains.Location = New System.Drawing.Point(9, 284) Me.grpConditionsForSatrtofRains.Name = "grpConditionsForSatrtofRains" - Me.grpConditionsForSatrtofRains.Size = New System.Drawing.Size(579, 160) - Me.grpConditionsForSatrtofRains.TabIndex = 10 + Me.grpConditionsForSatrtofRains.Size = New System.Drawing.Size(679, 174) + Me.grpConditionsForSatrtofRains.TabIndex = 12 Me.grpConditionsForSatrtofRains.TabStop = False Me.grpConditionsForSatrtofRains.Text = "Conditions for Start of Rains" ' - 'ucrChkNumberOfRainyDays - ' - Me.ucrChkNumberOfRainyDays.Checked = False - Me.ucrChkNumberOfRainyDays.Location = New System.Drawing.Point(7, 69) - Me.ucrChkNumberOfRainyDays.Name = "ucrChkNumberOfRainyDays" - Me.ucrChkNumberOfRainyDays.Size = New System.Drawing.Size(143, 20) - Me.ucrChkNumberOfRainyDays.TabIndex = 10 - ' - 'ucrChkTotalRainfall - ' - Me.ucrChkTotalRainfall.Checked = False - Me.ucrChkTotalRainfall.Location = New System.Drawing.Point(7, 22) - Me.ucrChkTotalRainfall.Name = "ucrChkTotalRainfall" - Me.ucrChkTotalRainfall.Size = New System.Drawing.Size(131, 20) - Me.ucrChkTotalRainfall.TabIndex = 8 - ' - 'ucrNudTRAmount - ' - Me.ucrNudTRAmount.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudTRAmount.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudTRAmount.Location = New System.Drawing.Point(503, 17) - Me.ucrNudTRAmount.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudTRAmount.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudTRAmount.Name = "ucrNudTRAmount" - Me.ucrNudTRAmount.Size = New System.Drawing.Size(50, 20) - Me.ucrNudTRAmount.TabIndex = 8 - Me.ucrNudTRAmount.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'lblTROverDays - ' - Me.lblTROverDays.AutoSize = True - Me.lblTROverDays.Location = New System.Drawing.Point(142, 19) - Me.lblTROverDays.Name = "lblTROverDays" - Me.lblTROverDays.Size = New System.Drawing.Size(60, 13) - Me.lblTROverDays.TabIndex = 0 - Me.lblTROverDays.Tag = "" - Me.lblTROverDays.Text = "Over Days:" - ' - 'ucrNudTROverDays - ' - Me.ucrNudTROverDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudTROverDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudTROverDays.Location = New System.Drawing.Point(206, 17) - Me.ucrNudTROverDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudTROverDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudTROverDays.Name = "ucrNudTROverDays" - Me.ucrNudTROverDays.Size = New System.Drawing.Size(50, 20) - Me.ucrNudTROverDays.TabIndex = 7 - Me.ucrNudTROverDays.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudTRPercentile - ' - Me.ucrNudTRPercentile.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudTRPercentile.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudTRPercentile.Location = New System.Drawing.Point(503, 40) - Me.ucrNudTRPercentile.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudTRPercentile.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudTRPercentile.Name = "ucrNudTRPercentile" - Me.ucrNudTRPercentile.Size = New System.Drawing.Size(50, 20) - Me.ucrNudTRPercentile.TabIndex = 6 - Me.ucrNudTRPercentile.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'lblTRVal - ' - Me.lblTRVal.AutoSize = True - Me.lblTRVal.Location = New System.Drawing.Point(283, 21) - Me.lblTRVal.Name = "lblTRVal" - Me.lblTRVal.Size = New System.Drawing.Size(136, 13) - Me.lblTRVal.TabIndex = 2 - Me.lblTRVal.Text = "Calculate Rainfall Value by:" - ' - 'rdoTRPercentile - ' - Me.rdoTRPercentile.AutoSize = True - Me.rdoTRPercentile.Location = New System.Drawing.Point(425, 40) - Me.rdoTRPercentile.Name = "rdoTRPercentile" - Me.rdoTRPercentile.Size = New System.Drawing.Size(72, 17) - Me.rdoTRPercentile.TabIndex = 5 - Me.rdoTRPercentile.TabStop = True - Me.rdoTRPercentile.Text = "Percentile" - Me.rdoTRPercentile.UseVisualStyleBackColor = True - ' - 'rdoTRAmount - ' - Me.rdoTRAmount.AutoSize = True - Me.rdoTRAmount.Location = New System.Drawing.Point(425, 19) - Me.rdoTRAmount.Name = "rdoTRAmount" - Me.rdoTRAmount.Size = New System.Drawing.Size(61, 17) - Me.rdoTRAmount.TabIndex = 3 - Me.rdoTRAmount.TabStop = True - Me.rdoTRAmount.Text = "Amount" - Me.rdoTRAmount.UseVisualStyleBackColor = True - ' - 'pnlDrySpell + 'ucrNudDPOverallInterval ' - Me.pnlDrySpell.Controls.Add(Me.ucrNudDSMaximumDays) - Me.pnlDrySpell.Controls.Add(Me.ucrNudDSLengthOfTime) - Me.pnlDrySpell.Controls.Add(Me.lblDSMaximumDays) - Me.pnlDrySpell.Controls.Add(Me.lblDSLengthofTime) - Me.pnlDrySpell.Location = New System.Drawing.Point(96, 95) - Me.pnlDrySpell.Name = "pnlDrySpell" - Me.pnlDrySpell.Size = New System.Drawing.Size(421, 24) - Me.pnlDrySpell.TabIndex = 5 + Me.ucrNudDPOverallInterval.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPOverallInterval.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDPOverallInterval.Location = New System.Drawing.Point(620, 144) + Me.ucrNudDPOverallInterval.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDPOverallInterval.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPOverallInterval.Name = "ucrNudDPOverallInterval" + Me.ucrNudDPOverallInterval.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDPOverallInterval.TabIndex = 25 + Me.ucrNudDPOverallInterval.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'ucrNudDSMaximumDays ' Me.ucrNudDSMaximumDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudDSMaximumDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudDSMaximumDays.Location = New System.Drawing.Point(109, 2) + Me.ucrNudDSMaximumDays.Location = New System.Drawing.Point(248, 113) Me.ucrNudDSMaximumDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudDSMaximumDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudDSMaximumDays.Name = "ucrNudDSMaximumDays" Me.ucrNudDSMaximumDays.Size = New System.Drawing.Size(50, 20) - Me.ucrNudDSMaximumDays.TabIndex = 12 + Me.ucrNudDSMaximumDays.TabIndex = 16 Me.ucrNudDSMaximumDays.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'ucrNudDSLengthOfTime ' Me.ucrNudDSLengthOfTime.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudDSLengthOfTime.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudDSLengthOfTime.Location = New System.Drawing.Point(291, 3) + Me.ucrNudDSLengthOfTime.Location = New System.Drawing.Point(428, 113) Me.ucrNudDSLengthOfTime.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudDSLengthOfTime.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudDSLengthOfTime.Name = "ucrNudDSLengthOfTime" Me.ucrNudDSLengthOfTime.Size = New System.Drawing.Size(50, 20) - Me.ucrNudDSLengthOfTime.TabIndex = 11 + Me.ucrNudDSLengthOfTime.TabIndex = 18 Me.ucrNudDSLengthOfTime.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'lblDSMaximumDays - ' - Me.lblDSMaximumDays.AutoSize = True - Me.lblDSMaximumDays.Location = New System.Drawing.Point(3, 5) - Me.lblDSMaximumDays.Name = "lblDSMaximumDays" - Me.lblDSMaximumDays.Size = New System.Drawing.Size(100, 13) - Me.lblDSMaximumDays.TabIndex = 0 - Me.lblDSMaximumDays.Text = "Maximum Dry Days:" - ' - 'lblDSLengthofTime - ' - Me.lblDSLengthofTime.AutoSize = True - Me.lblDSLengthofTime.Location = New System.Drawing.Point(168, 5) - Me.lblDSLengthofTime.Name = "lblDSLengthofTime" - Me.lblDSLengthofTime.Size = New System.Drawing.Size(117, 13) - Me.lblDSLengthofTime.TabIndex = 2 - Me.lblDSLengthofTime.Text = "Overall Interval Length:" - ' - 'pnlConsecutiveRainyDays + 'lblDPOverallInterval ' - Me.pnlConsecutiveRainyDays.Controls.Add(Me.ucrNudRDMinimumDays) - Me.pnlConsecutiveRainyDays.Controls.Add(Me.ucrNudRDOutOfDays) - Me.pnlConsecutiveRainyDays.Controls.Add(Me.lblRDMinimum) - Me.pnlConsecutiveRainyDays.Controls.Add(Me.lblRDWidth) - Me.pnlConsecutiveRainyDays.Location = New System.Drawing.Point(144, 62) - Me.pnlConsecutiveRainyDays.Name = "pnlConsecutiveRainyDays" - Me.pnlConsecutiveRainyDays.Size = New System.Drawing.Size(258, 32) - Me.pnlConsecutiveRainyDays.TabIndex = 1 + Me.lblDPOverallInterval.AutoSize = True + Me.lblDPOverallInterval.Location = New System.Drawing.Point(497, 146) + Me.lblDPOverallInterval.Name = "lblDPOverallInterval" + Me.lblDPOverallInterval.Size = New System.Drawing.Size(117, 13) + Me.lblDPOverallInterval.TabIndex = 24 + Me.lblDPOverallInterval.Text = "Overall Interval Length:" ' 'ucrNudRDMinimumDays ' Me.ucrNudRDMinimumDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudRDMinimumDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudRDMinimumDays.Location = New System.Drawing.Point(61, 7) + Me.ucrNudRDMinimumDays.Location = New System.Drawing.Point(248, 79) Me.ucrNudRDMinimumDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudRDMinimumDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudRDMinimumDays.Name = "ucrNudRDMinimumDays" Me.ucrNudRDMinimumDays.Size = New System.Drawing.Size(50, 20) - Me.ucrNudRDMinimumDays.TabIndex = 9 + Me.ucrNudRDMinimumDays.TabIndex = 11 Me.ucrNudRDMinimumDays.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' + 'ucrNudDPRainPeriod + ' + Me.ucrNudDPRainPeriod.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPRainPeriod.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDPRainPeriod.Location = New System.Drawing.Point(428, 145) + Me.ucrNudDPRainPeriod.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDPRainPeriod.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPRainPeriod.Name = "ucrNudDPRainPeriod" + Me.ucrNudDPRainPeriod.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDPRainPeriod.TabIndex = 23 + Me.ucrNudDPRainPeriod.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'lblDPLength + ' + Me.lblDPLength.AutoSize = True + Me.lblDPLength.Location = New System.Drawing.Point(311, 146) + Me.lblDPLength.Name = "lblDPLength" + Me.lblDPLength.Size = New System.Drawing.Size(100, 13) + Me.lblDPLength.TabIndex = 22 + Me.lblDPLength.Text = "Maximum Dry Days:" + ' + 'ucrChkDryPeriod + ' + Me.ucrChkDryPeriod.Checked = False + Me.ucrChkDryPeriod.Location = New System.Drawing.Point(7, 145) + Me.ucrChkDryPeriod.Name = "ucrChkDryPeriod" + Me.ucrChkDryPeriod.Size = New System.Drawing.Size(94, 20) + Me.ucrChkDryPeriod.TabIndex = 19 + ' + 'lblDSLengthofTime + ' + Me.lblDSLengthofTime.AutoSize = True + Me.lblDSLengthofTime.Location = New System.Drawing.Point(311, 116) + Me.lblDSLengthofTime.Name = "lblDSLengthofTime" + Me.lblDSLengthofTime.Size = New System.Drawing.Size(117, 13) + Me.lblDSLengthofTime.TabIndex = 17 + Me.lblDSLengthofTime.Text = "Overall Interval Length:" + ' + 'lblDPMaxRain + ' + Me.lblDPMaxRain.AutoSize = True + Me.lblDPMaxRain.Location = New System.Drawing.Point(142, 146) + Me.lblDPMaxRain.Name = "lblDPMaxRain" + Me.lblDPMaxRain.Size = New System.Drawing.Size(79, 13) + Me.lblDPMaxRain.TabIndex = 20 + Me.lblDPMaxRain.Text = "Maximum Rain:" + ' 'ucrNudRDOutOfDays ' Me.ucrNudRDOutOfDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudRDOutOfDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudRDOutOfDays.Location = New System.Drawing.Point(186, 7) + Me.ucrNudRDOutOfDays.Location = New System.Drawing.Point(428, 79) Me.ucrNudRDOutOfDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudRDOutOfDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudRDOutOfDays.Name = "ucrNudRDOutOfDays" Me.ucrNudRDOutOfDays.Size = New System.Drawing.Size(50, 20) - Me.ucrNudRDOutOfDays.TabIndex = 10 + Me.ucrNudRDOutOfDays.TabIndex = 13 Me.ucrNudRDOutOfDays.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' + 'ucrNudDPMaxRain + ' + Me.ucrNudDPMaxRain.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPMaxRain.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudDPMaxRain.Location = New System.Drawing.Point(248, 144) + Me.ucrNudDPMaxRain.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudDPMaxRain.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudDPMaxRain.Name = "ucrNudDPMaxRain" + Me.ucrNudDPMaxRain.Size = New System.Drawing.Size(50, 20) + Me.ucrNudDPMaxRain.TabIndex = 21 + Me.ucrNudDPMaxRain.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkDrySpell + ' + Me.ucrChkDrySpell.Checked = False + Me.ucrChkDrySpell.Location = New System.Drawing.Point(7, 112) + Me.ucrChkDrySpell.Name = "ucrChkDrySpell" + Me.ucrChkDrySpell.Size = New System.Drawing.Size(94, 20) + Me.ucrChkDrySpell.TabIndex = 14 + ' + 'lblDSMaximumDays + ' + Me.lblDSMaximumDays.AutoSize = True + Me.lblDSMaximumDays.Location = New System.Drawing.Point(142, 116) + Me.lblDSMaximumDays.Name = "lblDSMaximumDays" + Me.lblDSMaximumDays.Size = New System.Drawing.Size(100, 13) + Me.lblDSMaximumDays.TabIndex = 15 + Me.lblDSMaximumDays.Text = "Maximum Dry Days:" + ' 'lblRDMinimum ' Me.lblRDMinimum.AutoSize = True - Me.lblRDMinimum.Location = New System.Drawing.Point(4, 11) + Me.lblRDMinimum.Location = New System.Drawing.Point(142, 83) Me.lblRDMinimum.Name = "lblRDMinimum" Me.lblRDMinimum.Size = New System.Drawing.Size(51, 13) - Me.lblRDMinimum.TabIndex = 0 + Me.lblRDMinimum.TabIndex = 10 Me.lblRDMinimum.Text = "Minimum:" ' + 'lblTROverDays + ' + Me.lblTROverDays.AutoSize = True + Me.lblTROverDays.Location = New System.Drawing.Point(142, 26) + Me.lblTROverDays.Name = "lblTROverDays" + Me.lblTROverDays.Size = New System.Drawing.Size(60, 13) + Me.lblTROverDays.TabIndex = 1 + Me.lblTROverDays.Tag = "" + Me.lblTROverDays.Text = "Over Days:" + ' 'lblRDWidth ' Me.lblRDWidth.AutoSize = True - Me.lblRDWidth.Location = New System.Drawing.Point(120, 11) + Me.lblRDWidth.Location = New System.Drawing.Point(311, 83) Me.lblRDWidth.Name = "lblRDWidth" Me.lblRDWidth.Size = New System.Drawing.Size(66, 13) - Me.lblRDWidth.TabIndex = 2 + Me.lblRDWidth.TabIndex = 12 Me.lblRDWidth.Text = "Out of Days:" ' - 'pnlDryPeriod + 'ucrChkNumberOfRainyDays ' - Me.pnlDryPeriod.Controls.Add(Me.ucrNudDPOverallInterval) - Me.pnlDryPeriod.Controls.Add(Me.lblDPMaxRain) - Me.pnlDryPeriod.Controls.Add(Me.ucrNudDPMaxRain) - Me.pnlDryPeriod.Controls.Add(Me.lblDPLength) - Me.pnlDryPeriod.Controls.Add(Me.ucrNudDPRainPeriod) - Me.pnlDryPeriod.Controls.Add(Me.lblDPOverallInterval) - Me.pnlDryPeriod.Location = New System.Drawing.Point(96, 120) - Me.pnlDryPeriod.Name = "pnlDryPeriod" - Me.pnlDryPeriod.Size = New System.Drawing.Size(480, 34) - Me.pnlDryPeriod.TabIndex = 7 + Me.ucrChkNumberOfRainyDays.Checked = False + Me.ucrChkNumberOfRainyDays.Location = New System.Drawing.Point(7, 79) + Me.ucrChkNumberOfRainyDays.Name = "ucrChkNumberOfRainyDays" + Me.ucrChkNumberOfRainyDays.Size = New System.Drawing.Size(143, 20) + Me.ucrChkNumberOfRainyDays.TabIndex = 9 ' - 'ucrNudDPOverallInterval + 'ucrNudTROverDays ' - Me.ucrNudDPOverallInterval.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDPOverallInterval.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudDPOverallInterval.Location = New System.Drawing.Point(427, 5) - Me.ucrNudDPOverallInterval.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudDPOverallInterval.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDPOverallInterval.Name = "ucrNudDPOverallInterval" - Me.ucrNudDPOverallInterval.Size = New System.Drawing.Size(50, 20) - Me.ucrNudDPOverallInterval.TabIndex = 13 - Me.ucrNudDPOverallInterval.Value = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTROverDays.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTROverDays.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudTROverDays.Location = New System.Drawing.Point(248, 22) + Me.ucrNudTROverDays.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudTROverDays.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTROverDays.Name = "ucrNudTROverDays" + Me.ucrNudTROverDays.Size = New System.Drawing.Size(50, 20) + Me.ucrNudTROverDays.TabIndex = 2 + Me.ucrNudTROverDays.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'lblDPMaxRain + 'ucrNudTRAmount ' - Me.lblDPMaxRain.AutoSize = True - Me.lblDPMaxRain.Location = New System.Drawing.Point(3, 6) - Me.lblDPMaxRain.Name = "lblDPMaxRain" - Me.lblDPMaxRain.Size = New System.Drawing.Size(79, 13) - Me.lblDPMaxRain.TabIndex = 1 - Me.lblDPMaxRain.Text = "Maximum Rain:" + Me.ucrNudTRAmount.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTRAmount.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudTRAmount.Location = New System.Drawing.Point(539, 22) + Me.ucrNudTRAmount.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudTRAmount.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTRAmount.Name = "ucrNudTRAmount" + Me.ucrNudTRAmount.Size = New System.Drawing.Size(50, 20) + Me.ucrNudTRAmount.TabIndex = 6 + Me.ucrNudTRAmount.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'ucrNudDPMaxRain + 'lblTRVal ' - Me.ucrNudDPMaxRain.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDPMaxRain.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudDPMaxRain.Location = New System.Drawing.Point(83, 3) - Me.ucrNudDPMaxRain.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudDPMaxRain.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDPMaxRain.Name = "ucrNudDPMaxRain" - Me.ucrNudDPMaxRain.Size = New System.Drawing.Size(50, 20) - Me.ucrNudDPMaxRain.TabIndex = 15 - Me.ucrNudDPMaxRain.Value = New Decimal(New Integer() {0, 0, 0, 0}) + Me.lblTRVal.AutoSize = True + Me.lblTRVal.Location = New System.Drawing.Point(311, 26) + Me.lblTRVal.Name = "lblTRVal" + Me.lblTRVal.Size = New System.Drawing.Size(136, 13) + Me.lblTRVal.TabIndex = 3 + Me.lblTRVal.Text = "Calculate Rainfall Value by:" ' - 'lblDPLength + 'ucrChkTotalRainfall ' - Me.lblDPLength.AutoSize = True - Me.lblDPLength.Location = New System.Drawing.Point(139, 7) - Me.lblDPLength.Name = "lblDPLength" - Me.lblDPLength.Size = New System.Drawing.Size(100, 13) - Me.lblDPLength.TabIndex = 3 - Me.lblDPLength.Text = "Maximum Dry Days:" + Me.ucrChkTotalRainfall.Checked = False + Me.ucrChkTotalRainfall.Location = New System.Drawing.Point(7, 22) + Me.ucrChkTotalRainfall.Name = "ucrChkTotalRainfall" + Me.ucrChkTotalRainfall.Size = New System.Drawing.Size(131, 20) + Me.ucrChkTotalRainfall.TabIndex = 0 ' - 'ucrNudDPRainPeriod + 'ucrNudTRPercentile ' - Me.ucrNudDPRainPeriod.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDPRainPeriod.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudDPRainPeriod.Location = New System.Drawing.Point(245, 3) - Me.ucrNudDPRainPeriod.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudDPRainPeriod.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDPRainPeriod.Name = "ucrNudDPRainPeriod" - Me.ucrNudDPRainPeriod.Size = New System.Drawing.Size(50, 20) - Me.ucrNudDPRainPeriod.TabIndex = 14 - Me.ucrNudDPRainPeriod.Value = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTRPercentile.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTRPercentile.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudTRPercentile.Location = New System.Drawing.Point(539, 48) + Me.ucrNudTRPercentile.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudTRPercentile.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudTRPercentile.Name = "ucrNudTRPercentile" + Me.ucrNudTRPercentile.Size = New System.Drawing.Size(50, 20) + Me.ucrNudTRPercentile.TabIndex = 8 + Me.ucrNudTRPercentile.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'lblDPOverallInterval + 'rdoTRAmount ' - Me.lblDPOverallInterval.AutoSize = True - Me.lblDPOverallInterval.Location = New System.Drawing.Point(304, 7) - Me.lblDPOverallInterval.Name = "lblDPOverallInterval" - Me.lblDPOverallInterval.Size = New System.Drawing.Size(117, 13) - Me.lblDPOverallInterval.TabIndex = 5 - Me.lblDPOverallInterval.Text = "Overall Interval Length:" + Me.rdoTRAmount.AutoSize = True + Me.rdoTRAmount.Location = New System.Drawing.Point(461, 24) + Me.rdoTRAmount.Name = "rdoTRAmount" + Me.rdoTRAmount.Size = New System.Drawing.Size(61, 17) + Me.rdoTRAmount.TabIndex = 5 + Me.rdoTRAmount.TabStop = True + Me.rdoTRAmount.Text = "Amount" + Me.rdoTRAmount.UseVisualStyleBackColor = True + ' + 'rdoTRPercentile + ' + Me.rdoTRPercentile.AutoSize = True + Me.rdoTRPercentile.Location = New System.Drawing.Point(461, 48) + Me.rdoTRPercentile.Name = "rdoTRPercentile" + Me.rdoTRPercentile.Size = New System.Drawing.Size(72, 17) + Me.rdoTRPercentile.TabIndex = 7 + Me.rdoTRPercentile.TabStop = True + Me.rdoTRPercentile.Text = "Percentile" + Me.rdoTRPercentile.UseVisualStyleBackColor = True + ' + 'ucrPnlTRCalculateBy + ' + Me.ucrPnlTRCalculateBy.Location = New System.Drawing.Point(458, 17) + Me.ucrPnlTRCalculateBy.Name = "ucrPnlTRCalculateBy" + Me.ucrPnlTRCalculateBy.Size = New System.Drawing.Size(165, 62) + Me.ucrPnlTRCalculateBy.TabIndex = 4 ' 'grpRainParameters ' @@ -395,10 +388,10 @@ Partial Class dlgStartofRains Me.grpRainParameters.Controls.Add(Me.lblThreshold) Me.grpRainParameters.Controls.Add(Me.lblFrom) Me.grpRainParameters.Controls.Add(Me.lblTo) - Me.grpRainParameters.Location = New System.Drawing.Point(9, 192) + Me.grpRainParameters.Location = New System.Drawing.Point(9, 238) Me.grpRainParameters.Name = "grpRainParameters" Me.grpRainParameters.Size = New System.Drawing.Size(380, 40) - Me.grpRainParameters.TabIndex = 9 + Me.grpRainParameters.TabIndex = 11 Me.grpRainParameters.TabStop = False ' 'ucrNudThreshold @@ -410,7 +403,7 @@ Partial Class dlgStartofRains Me.ucrNudThreshold.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudThreshold.Name = "ucrNudThreshold" Me.ucrNudThreshold.Size = New System.Drawing.Size(50, 20) - Me.ucrNudThreshold.TabIndex = 10 + Me.ucrNudThreshold.TabIndex = 1 Me.ucrNudThreshold.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'ucrNudTo @@ -422,7 +415,7 @@ Partial Class dlgStartofRains Me.ucrNudTo.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudTo.Name = "ucrNudTo" Me.ucrNudTo.Size = New System.Drawing.Size(50, 20) - Me.ucrNudTo.TabIndex = 9 + Me.ucrNudTo.TabIndex = 5 Me.ucrNudTo.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'ucrNudFrom @@ -434,7 +427,7 @@ Partial Class dlgStartofRains Me.ucrNudFrom.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudFrom.Name = "ucrNudFrom" Me.ucrNudFrom.Size = New System.Drawing.Size(50, 20) - Me.ucrNudFrom.TabIndex = 8 + Me.ucrNudFrom.TabIndex = 3 Me.ucrNudFrom.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'lblThreshold @@ -469,134 +462,111 @@ Partial Class dlgStartofRains 'lblDOY ' Me.lblDOY.AutoSize = True - Me.lblDOY.Location = New System.Drawing.Point(247, 154) + Me.lblDOY.Location = New System.Drawing.Point(246, 197) Me.lblDOY.Name = "lblDOY" Me.lblDOY.Size = New System.Drawing.Size(66, 13) - Me.lblDOY.TabIndex = 7 + Me.lblDOY.TabIndex = 9 Me.lblDOY.Text = "Day of Year:" ' 'lblDate ' Me.lblDate.AutoSize = True - Me.lblDate.Location = New System.Drawing.Point(247, 28) + Me.lblDate.Location = New System.Drawing.Point(246, 71) Me.lblDate.Name = "lblDate" Me.lblDate.Size = New System.Drawing.Size(33, 13) - Me.lblDate.TabIndex = 1 + Me.lblDate.TabIndex = 3 Me.lblDate.Text = "Date:" ' 'lblYear ' Me.lblYear.AutoSize = True - Me.lblYear.Location = New System.Drawing.Point(248, 113) + Me.lblYear.Location = New System.Drawing.Point(246, 156) Me.lblYear.Name = "lblYear" Me.lblYear.Size = New System.Drawing.Size(32, 13) - Me.lblYear.TabIndex = 5 + Me.lblYear.TabIndex = 7 Me.lblYear.Text = "Year:" ' 'ucrBase ' - Me.ucrBase.Location = New System.Drawing.Point(9, 434) + Me.ucrBase.Location = New System.Drawing.Point(9, 494) Me.ucrBase.Name = "ucrBase" Me.ucrBase.Size = New System.Drawing.Size(405, 52) - Me.ucrBase.TabIndex = 11 + Me.ucrBase.TabIndex = 14 ' 'ucrSaveStartofRains ' - Me.ucrSaveStartofRains.Location = New System.Drawing.Point(9, 404) + Me.ucrSaveStartofRains.Location = New System.Drawing.Point(9, 464) Me.ucrSaveStartofRains.Name = "ucrSaveStartofRains" Me.ucrSaveStartofRains.Size = New System.Drawing.Size(316, 24) - Me.ucrSaveStartofRains.TabIndex = 12 + Me.ucrSaveStartofRains.TabIndex = 13 ' 'lblStation ' Me.lblStation.AutoSize = True - Me.lblStation.Location = New System.Drawing.Point(419, 28) + Me.lblStation.Location = New System.Drawing.Point(246, 27) Me.lblStation.Name = "lblStation" Me.lblStation.Size = New System.Drawing.Size(43, 13) - Me.lblStation.TabIndex = 13 + Me.lblStation.TabIndex = 1 Me.lblStation.Text = "Station:" ' - 'ucrChkDrySpell - ' - Me.ucrChkDrySpell.Checked = False - Me.ucrChkDrySpell.Location = New System.Drawing.Point(7, 100) - Me.ucrChkDrySpell.Name = "ucrChkDrySpell" - Me.ucrChkDrySpell.Size = New System.Drawing.Size(94, 20) - Me.ucrChkDrySpell.TabIndex = 11 - ' - 'ucrChkDryPeriod - ' - Me.ucrChkDryPeriod.Checked = False - Me.ucrChkDryPeriod.Location = New System.Drawing.Point(7, 126) - Me.ucrChkDryPeriod.Name = "ucrChkDryPeriod" - Me.ucrChkDryPeriod.Size = New System.Drawing.Size(94, 20) - Me.ucrChkDryPeriod.TabIndex = 12 - ' 'ucrReceiverStation ' Me.ucrReceiverStation.frmParent = Me - Me.ucrReceiverStation.Location = New System.Drawing.Point(418, 43) + Me.ucrReceiverStation.Location = New System.Drawing.Point(246, 42) Me.ucrReceiverStation.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverStation.Name = "ucrReceiverStation" Me.ucrReceiverStation.Selector = Nothing Me.ucrReceiverStation.Size = New System.Drawing.Size(143, 20) Me.ucrReceiverStation.strNcFilePath = "" - Me.ucrReceiverStation.TabIndex = 14 + Me.ucrReceiverStation.TabIndex = 2 Me.ucrReceiverStation.ucrSelector = Nothing ' 'ucrReceiverYear ' Me.ucrReceiverYear.frmParent = Me - Me.ucrReceiverYear.Location = New System.Drawing.Point(246, 128) + Me.ucrReceiverYear.Location = New System.Drawing.Point(246, 171) Me.ucrReceiverYear.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverYear.Name = "ucrReceiverYear" Me.ucrReceiverYear.Selector = Nothing Me.ucrReceiverYear.Size = New System.Drawing.Size(143, 20) Me.ucrReceiverYear.strNcFilePath = "" - Me.ucrReceiverYear.TabIndex = 6 + Me.ucrReceiverYear.TabIndex = 8 Me.ucrReceiverYear.ucrSelector = Nothing ' 'ucrReceiverDate ' Me.ucrReceiverDate.frmParent = Me - Me.ucrReceiverDate.Location = New System.Drawing.Point(246, 43) + Me.ucrReceiverDate.Location = New System.Drawing.Point(246, 86) Me.ucrReceiverDate.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverDate.Name = "ucrReceiverDate" Me.ucrReceiverDate.Selector = Nothing Me.ucrReceiverDate.Size = New System.Drawing.Size(143, 20) Me.ucrReceiverDate.strNcFilePath = "" - Me.ucrReceiverDate.TabIndex = 2 + Me.ucrReceiverDate.TabIndex = 4 Me.ucrReceiverDate.ucrSelector = Nothing ' 'ucrReceiverDOY ' Me.ucrReceiverDOY.frmParent = Me - Me.ucrReceiverDOY.Location = New System.Drawing.Point(246, 169) + Me.ucrReceiverDOY.Location = New System.Drawing.Point(246, 212) Me.ucrReceiverDOY.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverDOY.Name = "ucrReceiverDOY" Me.ucrReceiverDOY.Selector = Nothing Me.ucrReceiverDOY.Size = New System.Drawing.Size(143, 20) Me.ucrReceiverDOY.strNcFilePath = "" - Me.ucrReceiverDOY.TabIndex = 8 + Me.ucrReceiverDOY.TabIndex = 10 Me.ucrReceiverDOY.ucrSelector = Nothing ' - 'ucrPnlTRCalculateBy - ' - Me.ucrPnlTRCalculateBy.Location = New System.Drawing.Point(409, 10) - Me.ucrPnlTRCalculateBy.Name = "ucrPnlTRCalculateBy" - Me.ucrPnlTRCalculateBy.Size = New System.Drawing.Size(165, 50) - Me.ucrPnlTRCalculateBy.TabIndex = 9 - ' 'ucrReceiverRainfall ' Me.ucrReceiverRainfall.frmParent = Me - Me.ucrReceiverRainfall.Location = New System.Drawing.Point(246, 85) + Me.ucrReceiverRainfall.Location = New System.Drawing.Point(246, 128) Me.ucrReceiverRainfall.Margin = New System.Windows.Forms.Padding(0) Me.ucrReceiverRainfall.Name = "ucrReceiverRainfall" Me.ucrReceiverRainfall.Selector = Nothing Me.ucrReceiverRainfall.Size = New System.Drawing.Size(143, 20) Me.ucrReceiverRainfall.strNcFilePath = "" - Me.ucrReceiverRainfall.TabIndex = 4 + Me.ucrReceiverRainfall.TabIndex = 6 Me.ucrReceiverRainfall.ucrSelector = Nothing ' 'ucrSelectorForStartofRains @@ -613,7 +583,7 @@ Partial Class dlgStartofRains ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(594, 488) + Me.ClientSize = New System.Drawing.Size(696, 550) Me.Controls.Add(Me.lblStation) Me.Controls.Add(Me.ucrReceiverStation) Me.Controls.Add(Me.ucrSaveStartofRains) @@ -638,12 +608,6 @@ Partial Class dlgStartofRains Me.Text = "Start of Rains" Me.grpConditionsForSatrtofRains.ResumeLayout(False) Me.grpConditionsForSatrtofRains.PerformLayout() - Me.pnlDrySpell.ResumeLayout(False) - Me.pnlDrySpell.PerformLayout() - Me.pnlConsecutiveRainyDays.ResumeLayout(False) - Me.pnlConsecutiveRainyDays.PerformLayout() - Me.pnlDryPeriod.ResumeLayout(False) - Me.pnlDryPeriod.PerformLayout() Me.grpRainParameters.ResumeLayout(False) Me.grpRainParameters.PerformLayout() Me.ResumeLayout(False) @@ -677,9 +641,6 @@ Partial Class dlgStartofRains Friend WithEvents lblDPOverallInterval As Label Friend WithEvents lblDPLength As Label Friend WithEvents lblDPMaxRain As Label - Friend WithEvents pnlConsecutiveRainyDays As Panel - Friend WithEvents pnlDryPeriod As Panel - Friend WithEvents pnlDrySpell As Panel Friend WithEvents ucrSaveStartofRains As ucrSave Friend WithEvents ucrNudTROverDays As ucrNud Friend WithEvents ucrNudTRPercentile As ucrNud diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 3d5105a68ea..b87f7f5c3c0 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -13,7 +13,6 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . -Imports instat Imports instat.Translations Public Class dlgStartofRains @@ -33,7 +32,6 @@ Public Class dlgStartofRains Public bFirstLoad As Boolean = True Private bReset As Boolean = True Private strWetSpell As String = "wet_spell" - Private strRollSumRain As String = "roll_sum_Rain" Private Sub dlgStartofRains_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) @@ -106,7 +104,7 @@ Public Class dlgStartofRains ucrPnlTRCalculateBy.AddRadioButton(rdoTRPercentile) ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "sub4", False) ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "sub4") - ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.85) + ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.8) ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=20) ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "TRPerc") @@ -194,6 +192,7 @@ Public Class dlgStartofRains Dim strRainInDays As String = "Rain_in_Days" Dim strAboveThreshold As String = "Above_Threshold" Dim strDPOverallIntervalRain As String = "DP_Overall_Interval_Rain" + Dim strRollSumRain As String = "roll_sum_Rain" clsAddKey.Clear() clsAddKeyColName.Clear() @@ -457,7 +456,6 @@ Public Class dlgStartofRains clsRainCombineOperator.AddParameter("rainThreshold", 0.85, iPosition:=1) ' run if chkTR is checked - ' clsCombineOperator.AddParameter("totalrainfall", clsROperatorParameter:=clsTRCombineOperator, iPosition:=1) clsTRCombineOperator.SetOperation(">") clsTRCombineOperator.AddParameter("TRLeft", strRollSumRain, iPosition:=0) @@ -498,11 +496,6 @@ Public Class dlgStartofRains 'DefaultNudValue() End Sub - ' in the lead, this Is because we want to count the NEXT x days with less than y days of rain. Without lead, we were counting the current day - '2. If the user wishes to start from day 122, then the nud can say 122. BUT, the value that we call has to be 121. This can be fixed properly when we have more time, but for now will do - ' does that start from 122 mess up the lead()?? - ' add to start of rains to sort the order at the end - Private Sub SetRCodeForControls(bReset As Boolean) ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("doy", 0), iAdditionalPairNo:=1) ucrReceiverDOY.AddAdditionalCodeParameterPair(clsFirstDOYPerYearOperator, New RParameter("doy", 0), iAdditionalPairNo:=2) @@ -513,7 +506,7 @@ Public Class dlgStartofRains ucrNudThreshold.AddAdditionalCodeParameterPair(clsRainCombineOperator, New RParameter("rainThreshold", 1), iAdditionalPairNo:=1) ucrNudDPRainPeriod.AddAdditionalCodeParameterPair(clsDPOverallIntervalFunctionOperatorRight, New RParameter("Rain", 0), iAdditionalPairNo:=1) - ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ' false in these brackets, when in initialise + ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) From 047cfc0e70dfc31d547994f48dc0ac50ebcc7cfd Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 18:38:58 +0100 Subject: [PATCH 148/201] Adding min/max values --- instat/dlgStartofRains.vb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index b87f7f5c3c0..927439d7024 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -111,6 +111,7 @@ Public Class dlgStartofRains ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "TRAmount") ucrNudTRAmount.SetParameter(New RParameter("TRAmount", 1, False), False) + ucrNudTRAmount.SetMinMax(1, Integer.MaxValue) ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 1, False), False) ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("totalrainfall", clsTRCombineOperator, 1, False), iAdditionalPairNo:=1) @@ -134,13 +135,14 @@ Public Class dlgStartofRains ucrNudRDMinimumDays.SetParameter(New RParameter("RDMin", 1)) ucrNudRDMinimumDays.SetLinkedDisplayControl(lblRDMinimum) + ucrNudRDMinimumDays.SetMinMax(1, 366) ucrNudRDOutOfDays.SetParameter(New RParameter("width", 1)) ucrNudRDOutOfDays.SetLinkedDisplayControl(lblRDWidth) + ucrNudRDOutOfDays.SetMinMax(1, 366) ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDMinimumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=2) - 'ucrNudRDOutOfDays.SetMinMax(1, 366) what is appropriate here? 'Dry Spell ucrChkDrySpell.SetParameter(New RParameter("sub1", clsDSDryPeriodTen, 3, False), False) @@ -150,9 +152,12 @@ Public Class dlgStartofRains ucrChkDrySpell.AddToLinkedControls(ucrNudDSMaximumDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=9) ucrNudDSLengthOfTime.SetLinkedDisplayControl(lblDSLengthofTime) ucrNudDSMaximumDays.SetLinkedDisplayControl(lblDSMaximumDays) + ucrNudDSLengthOfTime.SetParameter(New RParameter("width", 1)) + ucrNudDSLengthOfTime.SetMinMax(1, 366) + ucrNudDSMaximumDays.SetParameter(New RParameter("DSMax", 1)) - ' what is a min/max for this + ucrNudDSMaximumDays.SetMinMax(1, 366) ' Dry Period ucrChkDryPeriod.SetParameter(New RParameter("sub5", clsDPOverallInterval, 3, False), False) @@ -161,14 +166,16 @@ Public Class dlgStartofRains ucrNudDPRainPeriod.SetParameter(New RParameter("width", 1)) ucrNudDPRainPeriod.SetLinkedDisplayControl(lblDPLength) + ucrNudDPRainPeriod.SetMinMax(1, 366) ucrNudDPMaxRain.SetParameter(New RParameter("right", 1)) ucrNudDPMaxRain.SetLinkedDisplayControl(lblDPMaxRain) + ucrNudDPMaxRain.SetMinMax(1, Integer.MaxValue) ucrNudDPOverallInterval.SetParameter(New RParameter("Overall", 0)) ucrNudDPOverallInterval.SetLinkedDisplayControl(lblDPOverallInterval) + ucrNudDPOverallInterval.SetMinMax(1, 366) - ' minmax? ucrChkDryPeriod.AddToLinkedControls(ucrNudDPMaxRain, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=40) ucrChkDryPeriod.AddToLinkedControls(ucrNudDPOverallInterval, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=45) ucrChkDryPeriod.AddToLinkedControls(ucrNudDPRainPeriod, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=30) From 43ef791021e4c1833c930e45fbbfd76590c08535 Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 19:06:57 +0100 Subject: [PATCH 149/201] testOK and maximum nud fix --- instat/dlgStartofRains.Designer.vb | 12 +++++----- instat/dlgStartofRains.vb | 36 ++++++++++++------------------ 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/instat/dlgStartofRains.Designer.vb b/instat/dlgStartofRains.Designer.vb index 07b0770d4bb..40fba41802e 100644 --- a/instat/dlgStartofRains.Designer.vb +++ b/instat/dlgStartofRains.Designer.vb @@ -156,7 +156,7 @@ Partial Class dlgStartofRains 'lblDPOverallInterval ' Me.lblDPOverallInterval.AutoSize = True - Me.lblDPOverallInterval.Location = New System.Drawing.Point(497, 146) + Me.lblDPOverallInterval.Location = New System.Drawing.Point(502, 146) Me.lblDPOverallInterval.Name = "lblDPOverallInterval" Me.lblDPOverallInterval.Size = New System.Drawing.Size(117, 13) Me.lblDPOverallInterval.TabIndex = 24 @@ -189,7 +189,7 @@ Partial Class dlgStartofRains 'lblDPLength ' Me.lblDPLength.AutoSize = True - Me.lblDPLength.Location = New System.Drawing.Point(311, 146) + Me.lblDPLength.Location = New System.Drawing.Point(327, 147) Me.lblDPLength.Name = "lblDPLength" Me.lblDPLength.Size = New System.Drawing.Size(100, 13) Me.lblDPLength.TabIndex = 22 @@ -215,7 +215,7 @@ Partial Class dlgStartofRains 'lblDPMaxRain ' Me.lblDPMaxRain.AutoSize = True - Me.lblDPMaxRain.Location = New System.Drawing.Point(142, 146) + Me.lblDPMaxRain.Location = New System.Drawing.Point(159, 146) Me.lblDPMaxRain.Name = "lblDPMaxRain" Me.lblDPMaxRain.Size = New System.Drawing.Size(79, 13) Me.lblDPMaxRain.TabIndex = 20 @@ -265,7 +265,7 @@ Partial Class dlgStartofRains 'lblRDMinimum ' Me.lblRDMinimum.AutoSize = True - Me.lblRDMinimum.Location = New System.Drawing.Point(142, 83) + Me.lblRDMinimum.Location = New System.Drawing.Point(187, 82) Me.lblRDMinimum.Name = "lblRDMinimum" Me.lblRDMinimum.Size = New System.Drawing.Size(51, 13) Me.lblRDMinimum.TabIndex = 10 @@ -274,7 +274,7 @@ Partial Class dlgStartofRains 'lblTROverDays ' Me.lblTROverDays.AutoSize = True - Me.lblTROverDays.Location = New System.Drawing.Point(142, 26) + Me.lblTROverDays.Location = New System.Drawing.Point(182, 26) Me.lblTROverDays.Name = "lblTROverDays" Me.lblTROverDays.Size = New System.Drawing.Size(60, 13) Me.lblTROverDays.TabIndex = 1 @@ -284,7 +284,7 @@ Partial Class dlgStartofRains 'lblRDWidth ' Me.lblRDWidth.AutoSize = True - Me.lblRDWidth.Location = New System.Drawing.Point(311, 83) + Me.lblRDWidth.Location = New System.Drawing.Point(361, 82) Me.lblRDWidth.Name = "lblRDWidth" Me.lblRDWidth.Size = New System.Drawing.Size(66, 13) Me.lblRDWidth.TabIndex = 12 diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 927439d7024..6899bd4b99b 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -550,11 +550,11 @@ Public Class dlgStartofRains End Sub Private Sub TestOKEnabled() - ' If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.GetText <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.GetText <> "" AndAlso ucrNudRDOutOfDays.GetText <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso ucrNudTROverDays.GetText <> "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.GetText <> "") OrElse (rdoTRPercentile.Checked AndAlso Not ucrNudTRPercentile.GetText <> ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((ucrChkDrySpell.Checked AndAlso ucrNudDSMaximumDays.GetText <> "" AndAlso ucrNudDSLengthOfTime.GetText <> "") OrElse Not ucrChkDrySpell.Checked) AndAlso ((ucrChkDryPeriod.Checked AndAlso ucrNudDPMaxRain.GetText <> "" AndAlso ucrNudDPRainPeriod.GetText <> "" AndAlso ucrNudDPOverallInterval.GetText <> "") OrElse Not ucrChkDryPeriod.Checked) Then - ucrBase.OKEnabled(True) - ' Else - ' ucrBase.OKEnabled(False) - ' End If + If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.GetText <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.GetText <> "" AndAlso ucrNudRDOutOfDays.GetText <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso ucrNudTROverDays.GetText <> "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.GetText <> "") OrElse (rdoTRPercentile.Checked AndAlso ucrNudTRPercentile.GetText <> ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((ucrChkDrySpell.Checked AndAlso ucrNudDSMaximumDays.GetText <> "" AndAlso ucrNudDSLengthOfTime.GetText <> "") OrElse Not ucrChkDrySpell.Checked) AndAlso ((ucrChkDryPeriod.Checked AndAlso ucrNudDPMaxRain.GetText <> "" AndAlso ucrNudDPRainPeriod.GetText <> "" AndAlso ucrNudDPOverallInterval.GetText <> "") OrElse Not ucrChkDryPeriod.Checked) Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -616,22 +616,6 @@ Public Class dlgStartofRains clsDPRainInDays.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames & ")", iPosition:=5) End Sub - 'Private Sub nudValues() - ' ' nudFrom.Maximum = nudTo.Value - 1 - ' ' nudTo.Minimum = nudFrom.Value + 1 - ' 'If chkConsecutiveRainyDays.Checked Then - ' ' nudRDMinimum.Maximum = nudRDOutOfDays.Value - 1 - ' ' nudRDOutOfDays.Minimum = nudRDMinimum.Value + 1 - ' 'End If - ' 'If chkDrySpell.Checked Then - ' ' nudDSMaximumDays.Maximum = nudDSLengthofTime.Value - 1 - ' ' nudDSLengthofTime.Minimum = nudDSMaximumDays.Value + 1 - ' 'End If - ' 'If chkDryPeriod.Checked Then - ' ' nudDPRainPeriod.Maximum = nudDPOverallInterval.Value - 1 - ' ' nudDPOverallInterval.Minimum = nudDPRainPeriod.Value + 1 - ' 'End If - Private Sub ucrChkTotalRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkTotalRainfall.ControlValueChanged, ucrPnlTRCalculateBy.ControlValueChanged CombinedFilter() End Sub @@ -662,7 +646,15 @@ Public Class dlgStartofRains End If End Sub - Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlContentsChanged, ucrSaveStartofRains.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrNudThreshold.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrChkNumberOfRainyDays.ControlContentsChanged, ucrNudRDMinimumDays.ControlContentsChanged, ucrNudRDOutOfDays.ControlContentsChanged, ucrChkTotalRainfall.ControlContentsChanged, ucrNudTROverDays.ControlContentsChanged, ucrPnlTRCalculateBy.ControlContentsChanged, ucrNudTRAmount.ControlContentsChanged, ucrNudTRPercentile.ControlContentsChanged, ucrChkDrySpell.ControlContentsChanged, ucrNudDSMaximumDays.ControlContentsChanged, ucrNudDSLengthOfTime.ControlContentsChanged, ucrChkDryPeriod.ControlContentsChanged, ucrNudDPMaxRain.ControlContentsChanged, ucrNudDPRainPeriod.ControlContentsChanged, ucrNudDPOverallInterval.ControlContentsChanged + Private Sub MaximumValuesControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrChkDryPeriod.ControlContentsChanged, ucrNudDPRainPeriod.ControlContentsChanged, ucrNudDPOverallInterval.ControlContentsChanged + If ucrChkDryPeriod.Checked Then + ucrNudDPRainPeriod.Maximum = ucrNudDPOverallInterval.Value + ucrNudDPOverallInterval.Minimum = ucrNudDPRainPeriod.Value + End If + TestOKEnabled() + End Sub + + Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlContentsChanged, ucrSaveStartofRains.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrNudThreshold.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrChkNumberOfRainyDays.ControlContentsChanged, ucrNudRDMinimumDays.ControlContentsChanged, ucrNudRDOutOfDays.ControlContentsChanged, ucrChkTotalRainfall.ControlContentsChanged, ucrNudTROverDays.ControlContentsChanged, ucrPnlTRCalculateBy.ControlContentsChanged, ucrNudTRAmount.ControlContentsChanged, ucrNudTRPercentile.ControlContentsChanged, ucrChkDrySpell.ControlContentsChanged, ucrNudDSMaximumDays.ControlContentsChanged, ucrNudDSLengthOfTime.ControlContentsChanged, ucrNudDPMaxRain.ControlContentsChanged TestOKEnabled() End Sub End Class \ No newline at end of file From 9125e66ad993e6bf8f1159f975c7ce12952c4d68 Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 22 Jun 2017 21:22:09 +0300 Subject: [PATCH 150/201] Save tab rewrite --- instat/clsRegressionDefaults.vb | 45 ++++ instat/dlgRegressionSimple.vb | 55 ++-- instat/sdgSimpleRegOptions.Designer.vb | 20 +- instat/sdgSimpleRegOptions.vb | 349 +++++++------------------ instat/sdgVariableTransformations.vb | 38 ++- 5 files changed, 207 insertions(+), 300 deletions(-) diff --git a/instat/clsRegressionDefaults.vb b/instat/clsRegressionDefaults.vb index 4db1ea33ca6..929d8c7c5b2 100644 --- a/instat/clsRegressionDefaults.vb +++ b/instat/clsRegressionDefaults.vb @@ -112,4 +112,49 @@ End Get End Property + Public Shared ReadOnly Property clsDefaultRggplot As RFunction + Get + Dim clsDefaultRggplotFunction As New RFunction + clsDefaultRggplotFunction.SetPackageName("visreg") + clsDefaultRggplotFunction.SetRCommand("visreg") + Return clsDefaultRggplotFunction + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRWriteFitted As RFunction + Get + Dim clsDefaultRWriteFittedFunction As New RFunction + + clsDefaultRWriteFittedFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + Return clsDefaultRWriteFittedFunction + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRWriteResiduals As RFunction + Get + Dim clsDefaultRWriteResidualsFunc As New RFunction + + clsDefaultRWriteResidualsFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + Return clsDefaultRWriteResidualsFunc + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRWriteStdResiduals As RFunction + Get + Dim clsDefaultRWriteStdResidualsFunc As New RFunction + + clsDefaultRWriteStdResidualsFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + Return clsDefaultRWriteStdResidualsFunc + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRWriteLeverage As RFunction + Get + Dim clsDefaultRWriteLeverageFunc As New RFunction + + clsDefaultRWriteLeverageFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + Return clsDefaultRWriteLeverageFunc + End Get + End Property + End Class diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index c046350750e..7b8bd225e3f 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -18,7 +18,7 @@ Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True Public clsModel, clsFormulaOperator, clsRGraphicsOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator - Public clsRPoisson, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsTFunc, clsRLength As New RFunction + Public clsRPoisson, clsRggplotFunction, clsRLeverage, clsRWriteLeverage, clsRResiduals, clsRStdResiduals, clsRWriteResiduals, clsRWriteStdResiduals, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsTFunc, clsRLength As New RFunction Public clsRYVariable, clsRXVariable As String Private Sub ucrExplanatory_Load() Handles ucrExplanatory.ControlValueChanged @@ -166,11 +166,18 @@ Public Class dlgRegressionSimple clsRConfint = New RFunction clsRestpvalFunction = New RFunction clsRFittedValues = New RFunction + clsRResiduals = New RFunction + clsRStdResiduals = New RFunction + clsRWriteResiduals = New RFunction + clsRWriteLeverage = New RFunction + clsRLeverage = New RFunction + clsRWriteStdResiduals = New RFunction clsRWriteFitted = New RFunction clsRSummaryFunction = New RFunction clsRanovaFunction = New RFunction clsRResidualPlots = New RFunction clsRgeom_point = New RFunction + clsRggplotFunction = New RFunction 'clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone ucrSelectorSimpleReg.Reset() @@ -201,6 +208,10 @@ Public Class dlgRegressionSimple clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) clsRaovFunction.iCallType = 2 + 'FitModel + clsRggplotFunction = clsRegressionDefaults.clsDefaultRggplot.Clone + clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsRLmOrGLM) + clsRggplotFunction.iCallType = 3 'Model clsRModelsFunction = clsRegressionDefaults.clsDefaultModel.Clone @@ -229,10 +240,36 @@ Public Class dlgRegressionSimple clsRestpvalFunction.iCallType = 2 'ucrSave (sdgSimpleRegOptions) Fitted Values + clsRFittedValues.SetPackageName("stats") clsRFittedValues.SetRCommand("fitted") clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteFitted.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + clsRWriteFitted = clsRegressionDefaults.clsDefaultRWriteFitted.Clone clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) + clsRWriteFitted.iCallType = 3 + + 'ucrSave (sdgSimpleRegOptions) Residuals + clsRResiduals.SetPackageName("stats") + clsRResiduals.SetRCommand("resid") + clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + clsRWriteResiduals = clsRegressionDefaults.clsDefaultRWriteResiduals.Clone + clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) + clsRWriteResiduals.iCallType = 3 + + 'ucrSave (sdgSimpleRegOptions) StdResiduals + clsRStdResiduals.SetPackageName("stats") + clsRStdResiduals.SetRCommand("rstandard") + clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) + clsRWriteStdResiduals = clsRegressionDefaults.clsDefaultRWriteStdResiduals.Clone + clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) + clsRWriteStdResiduals.iCallType = 3 + + 'ucrSave (sdgSimpleRegOptions) Leverage + clsRLeverage.SetPackageName("stats") + clsRLeverage.SetRCommand("hatvalues") + clsRLeverage.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) + clsRWriteLeverage = clsRegressionDefaults.clsDefaultRWriteLeverage.Clone + clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) + clsRWriteLeverage.iCallType = 3 clsRConvert.SetRCommand("as.numeric") @@ -291,7 +328,6 @@ Public Class dlgRegressionSimple sdgModelOptions.RestrictLink() ExplanatoryFunctionSelect() SetRCode() - Display() DataTypeAccepted() End Sub @@ -321,8 +357,7 @@ Public Class dlgRegressionSimple End Sub Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click - Display() - sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRGraphicsOperator:=clsRGraphicsOperator, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRgeom_point:=clsRgeom_point, clsNewRResidualPlots:=clsRResidualPlots, clsNewRConfint:=clsRConfint, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsRLmOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) + sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRGraphicsOperator:=clsRGraphicsOperator, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRgeom_point:=clsRgeom_point, clsNewRResidualPlots:=clsRResidualPlots, clsNewRggplotFunction:=clsRggplotFunction, clsNewRConfint:=clsRConfint, clsNewRWriteResiduals:=clsRWriteResiduals, clsNewRWriteStdResiduals:=clsRWriteStdResiduals, clsNewRWriteLeverage:=clsRWriteLeverage, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsRLmOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) bResetOptionsSubDialog = False sdgSimpleRegOptions.ShowDialog() End Sub @@ -353,7 +388,6 @@ Public Class dlgRegressionSimple 'Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click ' sdgModelOptions.ShowDialog() ' ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) - ' Display() 'End Sub Private Sub SetTTest() @@ -644,8 +678,6 @@ Public Class dlgRegressionSimple Private Sub ucrchkConvertToVariate_CheckedChanged() Handles ucrChkConvertToVariate.ControlValueChanged SetRCode() ConvertToVariate() - TestOKEnabled() - Display() End Sub Private Sub ExplanatoryFunctionSelect() @@ -716,7 +748,6 @@ Public Class dlgRegressionSimple If ucrChkFunction.Checked Then ExplanatoryFunctionSelect() End If - Display() End Sub Private Sub Display() @@ -795,12 +826,7 @@ Public Class dlgRegressionSimple ' End If End Sub - Private Sub nuds_TextChanged(sender As Object, e As EventArgs) - SetRCode() - End Sub - Private Sub chkboxes_VisibleChanged(sender As Object, e As EventArgs) - Display() ' ExplanatoryFunctionSelect() ConvertToVariate() TestOKEnabled() @@ -813,7 +839,6 @@ Public Class dlgRegressionSimple ucrFamily.SetExactDistributions() End If ucrFamily.ucrInputDistributions.SetName("") - Display() SetRCode() TestOKEnabled() DataTypeAccepted() diff --git a/instat/sdgSimpleRegOptions.Designer.vb b/instat/sdgSimpleRegOptions.Designer.vb index 5ce434b1a9a..14117c639b4 100644 --- a/instat/sdgSimpleRegOptions.Designer.vb +++ b/instat/sdgSimpleRegOptions.Designer.vb @@ -141,24 +141,24 @@ Partial Class sdgSimpleRegOptions ' Me.ucrNudWhiteSpace.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudWhiteSpace.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudWhiteSpace.Location = New System.Drawing.Point(115, 147) + Me.ucrNudWhiteSpace.Location = New System.Drawing.Point(112, 150) Me.ucrNudWhiteSpace.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudWhiteSpace.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudWhiteSpace.Name = "ucrNudWhiteSpace" Me.ucrNudWhiteSpace.Size = New System.Drawing.Size(50, 20) - Me.ucrNudWhiteSpace.TabIndex = 27 + Me.ucrNudWhiteSpace.TabIndex = 29 Me.ucrNudWhiteSpace.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'ucrNudGraphicsCLevel ' Me.ucrNudGraphicsCLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudGraphicsCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudGraphicsCLevel.Location = New System.Drawing.Point(115, 121) + Me.ucrNudGraphicsCLevel.Location = New System.Drawing.Point(112, 124) Me.ucrNudGraphicsCLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudGraphicsCLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudGraphicsCLevel.Name = "ucrNudGraphicsCLevel" Me.ucrNudGraphicsCLevel.Size = New System.Drawing.Size(50, 20) - Me.ucrNudGraphicsCLevel.TabIndex = 26 + Me.ucrNudGraphicsCLevel.TabIndex = 28 Me.ucrNudGraphicsCLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'ucrChkRugs @@ -652,28 +652,28 @@ Partial Class sdgSimpleRegOptions ' 'ucrSaveLeverageColumnName ' - Me.ucrSaveLeverageColumnName.Location = New System.Drawing.Point(6, 90) + Me.ucrSaveLeverageColumnName.Location = New System.Drawing.Point(9, 92) Me.ucrSaveLeverageColumnName.Name = "ucrSaveLeverageColumnName" Me.ucrSaveLeverageColumnName.Size = New System.Drawing.Size(255, 24) Me.ucrSaveLeverageColumnName.TabIndex = 27 ' 'ucrSaveStdResidualsColumnName ' - Me.ucrSaveStdResidualsColumnName.Location = New System.Drawing.Point(6, 60) + Me.ucrSaveStdResidualsColumnName.Location = New System.Drawing.Point(9, 65) Me.ucrSaveStdResidualsColumnName.Name = "ucrSaveStdResidualsColumnName" Me.ucrSaveStdResidualsColumnName.Size = New System.Drawing.Size(255, 24) Me.ucrSaveStdResidualsColumnName.TabIndex = 26 ' 'ucrSaveResidualsColumnName ' - Me.ucrSaveResidualsColumnName.Location = New System.Drawing.Point(6, 30) + Me.ucrSaveResidualsColumnName.Location = New System.Drawing.Point(9, 38) Me.ucrSaveResidualsColumnName.Name = "ucrSaveResidualsColumnName" Me.ucrSaveResidualsColumnName.Size = New System.Drawing.Size(255, 24) Me.ucrSaveResidualsColumnName.TabIndex = 25 ' 'ucrSaveFittedColumnName ' - Me.ucrSaveFittedColumnName.Location = New System.Drawing.Point(6, 9) + Me.ucrSaveFittedColumnName.Location = New System.Drawing.Point(9, 11) Me.ucrSaveFittedColumnName.Name = "ucrSaveFittedColumnName" Me.ucrSaveFittedColumnName.Size = New System.Drawing.Size(255, 24) Me.ucrSaveFittedColumnName.TabIndex = 24 @@ -754,8 +754,6 @@ Partial Class sdgSimpleRegOptions Friend WithEvents rdoResponse As RadioButton Friend WithEvents rdoLinear As RadioButton Friend WithEvents ucrPnlScale As UcrPanel - Friend WithEvents ucrNudWhiteSpace As ucrNud - Friend WithEvents ucrNudGraphicsCLevel As ucrNud Friend WithEvents rdoContrast As RadioButton Friend WithEvents rdoConditional As RadioButton Friend WithEvents ucrPnlPlotType As UcrPanel @@ -780,4 +778,6 @@ Partial Class sdgSimpleRegOptions Friend WithEvents ucrSaveLeverageColumnName As ucrSave Friend WithEvents ucrSaveStdResidualsColumnName As ucrSave Friend WithEvents ucrSaveResidualsColumnName As ucrSave + Friend WithEvents ucrNudWhiteSpace As ucrNud + Friend WithEvents ucrNudGraphicsCLevel As ucrNud End Class diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index be850c181d3..0c1e1b0958a 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -63,10 +63,9 @@ Public Class sdgSimpleRegOptions ucrChkMultiplePlots.SetText("Multiple Plots") ucrChkIndividualPlots.SetText("Individual Plots") ucrChkFittedModel.SetText("Fitted Model") - ucrChkPartial.SetText("Partial") - ucrChkRugs.SetText("Rugs") - ucrChkJitter.SetText("Jitter") - ucrChkConfIntervalband.SetText("C.I band") + + + ucrSaveFittedColumnName.SetPrefix("Fitted") ucrSaveFittedColumnName.SetSaveTypeAsColumn() @@ -98,6 +97,7 @@ Public Class sdgSimpleRegOptions ucrChkMultiplePlots.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkMultiplePlots.AddToLinkedControls(ucrChkPartial, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkMultiplePlots.AddToLinkedControls(ucrChkRugs, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkRugs.AddToLinkedControls(ucrPnlPartial12, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkMultiplePlots.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkMultiplePlots.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) @@ -105,11 +105,75 @@ Public Class sdgSimpleRegOptions ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) + + ucrPnlPlotType.SetParameter(New RParameter("type")) + ucrPnlPlotType.AddRadioButton(rdoContrast, Chr(34) & "conditional" & Chr(34)) + ucrPnlPlotType.AddRadioButton(rdoConditional, Chr(34) & "contrast" & Chr(34)) + + ucrPnlScale.SetParameter(New RParameter("scale")) + ucrPnlScale.AddRadioButton(rdoLinear, Chr(34) & "linear" & Chr(34)) + ucrPnlScale.AddRadioButton(rdoResponse, Chr(34) & "response" & Chr(34)) + + ucrChkRugs.SetText("Rugs") + ucrPnlPartial12.SetParameter(New RParameter("rug")) + ucrPnlPartial12.AddRadioButton(rdo1, "1") + ucrPnlPartial12.AddRadioButton(rdo2, "2") + ucrPnlPartial12.AddRadioButton(rdoPartial, "TRUE") 'To obtain partial: to be produced rug=T & partial=T(Default of partial is TRUE) + + ucrChkJitter.SetText("Jitter") + ucrChkJitter.SetParameter(New RParameter("jitter"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkJitter.SetRDefault("FALSE") + + ucrNudGraphicsCLevel.SetParameter(New RParameter("alpha")) + ucrNudWhiteSpace.SetParameter(New RParameter("whitespace")) + + ucrChkPartial.SetText("Partial") + ucrChkPartial.SetParameter(New RParameter("partial"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkPartial.SetRDefault("TRUE") + + ucrChkConfIntervalband.SetText("C.I band") + ucrChkConfIntervalband.SetParameter(New RParameter("band"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") + ucrChkPartial.SetRDefault("TRUE") + + 'Save Plots (Save tab) + 'Save Fitted Column Names + ucrSaveFittedColumnName.SetPrefix("Fitted") + ucrSaveFittedColumnName.SetSaveTypeAsDataFrame() + ucrSaveFittedColumnName.SetCheckBoxText("Fitted Values") + ucrSaveFittedColumnName.SetIsComboBox() + ucrSaveFittedColumnName.SetAssignToIfUncheckedValue("last_fitted") + ucrSaveFittedColumnName.Enabled = False ' disabled until working + + 'Save Residuals Column Names + ucrSaveResidualsColumnName.SetPrefix("Resids") + ucrSaveResidualsColumnName.SetSaveTypeAsDataFrame() + ucrSaveResidualsColumnName.SetCheckBoxText("Residuals") + ucrSaveResidualsColumnName.SetIsComboBox() + ucrSaveResidualsColumnName.SetAssignToIfUncheckedValue("last_residual") + ucrSaveResidualsColumnName.Enabled = False ' disabled until working + + 'Save StdResiduals Column Names + ucrSaveStdResidualsColumnName.SetPrefix("Sresids") + ucrSaveStdResidualsColumnName.SetSaveTypeAsDataFrame() + ucrSaveStdResidualsColumnName.SetCheckBoxText("Std Residuals") + ucrSaveStdResidualsColumnName.SetIsComboBox() + ucrSaveStdResidualsColumnName.SetAssignToIfUncheckedValue("last_stdresidual") + ucrSaveStdResidualsColumnName.Enabled = False ' disabled until working + + 'Save Leverage Column Names + ucrSaveLeverageColumnName.SetPrefix("Lever") + ucrSaveLeverageColumnName.SetSaveTypeAsDataFrame() + ucrSaveLeverageColumnName.SetCheckBoxText("Leverage") + ucrSaveLeverageColumnName.SetIsComboBox() + ucrSaveLeverageColumnName.SetAssignToIfUncheckedValue("last_leverage") + ucrSaveLeverageColumnName.Enabled = False ' disabled until working + bControlsInitialised = True End Sub - ' Optional clsRGraphicsOperator As RFunction = Nothing, - Public Sub SetRCode(clsNewRSyntax As RSyntax, Optional clsNewRanovaFunction As RFunction = Nothing, Optional clsNewRSummaryFunction As RFunction = Nothing, Optional clsNewRConfint As RFunction = Nothing, Optional clsNewRModelsFunction As RFunction = Nothing, Optional clsNewRaovpvalFunction As RFunction = Nothing, Optional clsNewRgeom_point As RFunction = Nothing, Optional clsNewRResidualPlots As RFunction = Nothing, Optional clsNewRestpvalFunction As RFunction = Nothing, Optional clsNewRLmOrGLM As RFunction = Nothing, Optional clsNewRModelFunction As RFunction = Nothing, Optional clsNewRXVariable As String = Nothing, Optional clsNewRYVariable As String = Nothing, Optional clsNewRWriteFitted As RFunction = Nothing, Optional clsNewRFittedValues As RFunction = Nothing, Optional clsNewRGraphicsOperator As ROperator = Nothing, Optional bReset As Boolean = False) + 'Optional clsNewRWriteLeverage As RFunction = Nothing, + 'Optional clsRWriteResiduals As RFunction = Nothing, + Public Sub SetRCode(clsNewRSyntax As RSyntax, Optional clsNewRanovaFunction As RFunction = Nothing, Optional clsNewRSummaryFunction As RFunction = Nothing, Optional clsNewRConfint As RFunction = Nothing, Optional clsNewRggplotFunction As RFunction = Nothing, Optional clsNewRModelsFunction As RFunction = Nothing, Optional clsNewRaovpvalFunction As RFunction = Nothing, Optional clsNewRgeom_point As RFunction = Nothing, Optional clsNewRWriteResiduals As RFunction = Nothing, Optional clsNewRResidualPlots As RFunction = Nothing, Optional clsNewRestpvalFunction As RFunction = Nothing, Optional clsNewRWriteLeverage As RFunction = Nothing, Optional clsNewRWriteStdResiduals As RFunction = Nothing, Optional clsNewRLmOrGLM As RFunction = Nothing, Optional clsNewRModelFunction As RFunction = Nothing, Optional clsNewRXVariable As String = Nothing, Optional clsNewRYVariable As String = Nothing, Optional clsNewRWriteFitted As RFunction = Nothing, Optional clsNewRFittedValues As RFunction = Nothing, Optional clsNewRGraphicsOperator As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If @@ -129,12 +193,23 @@ Public Class sdgSimpleRegOptions clsRanovaFunction = clsNewRanovaFunction clsRgeom_point = clsNewRgeom_point clsRResidualPlotsFunction = clsNewRResidualPlots + clsRggplotFunction = clsNewRggplotFunction + clsRWriteResiduals = clsNewRWriteResiduals + clsRWriteStdResiduals = clsNewRWriteStdResiduals + clsRWriteLeverage = clsNewRWriteLeverage ucrChkModel.SetRSyntax(clsRSyntax, bReset) ucrChkEstimates.SetRSyntax(clsRSyntax, bReset) ucrChkANOVA.SetRSyntax(clsRSyntax, bReset) ucrChkDisplayCLimits.SetRSyntax(clsRSyntax, bReset) ucrChkPvalues.SetRSyntax(clsRSyntax, bReset) + ucrPnlScale.SetRSyntax(clsRSyntax, bReset) + ucrPnlPlotType.SetRSyntax(clsRSyntax, bReset) + ucrChkJitter.SetRCode(clsRggplotFunction, bReset) + ucrNudGraphicsCLevel.SetRCode(clsRggplotFunction, bReset) + ucrNudWhiteSpace.SetRCode(clsRggplotFunction, bReset) + ucrChkPartial.SetRCode(clsRggplotFunction, bReset) + ucrPnlPartial12.SetRCode(clsRggplotFunction, bReset) ' ucrPnlMutiplePlots.SetRSyntax(clsRSyntax) End Sub @@ -178,21 +253,20 @@ Public Class sdgSimpleRegOptions clsRSyntax.RemoveFromAfterCodes(clsRestpvalFunction) End If End Sub - 'Public Sub SetRModelFunction(clsRModelFunc As RFunction) - ' clsRModelFunction = clsRModelFunc - 'End Sub + + Private Sub ucrChkFittedModel_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkFittedModel.ControlValueChanged + If ucrChkFittedModel.Checked Then + clsRggplotFunction.AddParameter("gg", "TRUE") + clsRSyntax.AddToAfterCodes(clsRggplotFunction, iPosition:=6) + Else + clsRSyntax.RemoveFromAfterCodes(clsRggplotFunction) + End If + End Sub Public Sub SetRDataFrame(clsRDataFr As ucrDataFrame) clsRDataFrame = clsRDataFr End Sub - 'Public Sub SetRYVariable(clsRYVar As ucrReceiverSingle) - ' clsRYVariable = clsRYVar - 'End Sub - 'Public Sub SetRXVariable(clsRXVar As ucrReceiverSingle) - ' clsRXVariable = clsRXVar - 'End Sub - Public Sub ResidualPlots() 'clsRGraphics.SetOperation("+") @@ -202,49 +276,6 @@ Public Class sdgSimpleRegOptions 'clsRgeom_point.SetRCommand("geom_point") End Sub - Private Sub FittedModel() - clsRggplotFunction.SetPackageName("visreg") - clsRggplotFunction.SetRCommand("visreg") - clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsRModelFunction) - If rdoConditional.Checked Then - clsRggplotFunction.AddParameter("type", Chr(34) & "conditional" & Chr(34)) - ElseIf rdoContrast.Checked Then - clsRggplotFunction.AddParameter("type", Chr(34) & "contrast" & Chr(34)) - End If - If rdoLinear.Checked Then - clsRggplotFunction.AddParameter("scale", Chr(34) & "linear" & Chr(34)) - ElseIf rdoResponse.Checked Then - clsRggplotFunction.AddParameter("scale", Chr(34) & "response" & Chr(34)) - End If - If ucrChkJitter.Checked Then - clsRggplotFunction.AddParameter("jitter", "TRUE") - Else - clsRggplotFunction.RemoveParameterByName("jitter") - End If - clsRggplotFunction.AddParameter("alpha", nudGraphicsCLevel.Value) - clsRggplotFunction.AddParameter("whitespace", nudWhiteSpace.Value) - If ucrChkPartial.Checked Then - clsRggplotFunction.AddParameter("partial", "TRUE") - Else - clsRggplotFunction.AddParameter("partial", "FALSE") - End If - If ucrChkConfIntervalband.Checked = False Then - clsRggplotFunction.AddParameter("band", "FALSE") - Else - clsRggplotFunction.RemoveParameterByName("band") - End If - If ucrChkRugs.Checked Then - If rdo1.Checked Then - clsRggplotFunction.AddParameter("rug", 1) - ElseIf rdo2.Checked Then - clsRggplotFunction.AddParameter("rug", 2) - End If - Else - clsRggplotFunction.RemoveParameterByName("rug") - End If - clsRggplotFunction.AddParameter("gg", "TRUE") - End Sub - Private Sub ConfidenceInterval() clsRCIFunction.SetRCommand("confint") clsRCIFunction.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) @@ -252,37 +283,6 @@ Public Class sdgSimpleRegOptions frmMain.clsRLink.RunScript(clsRCIFunction.ToScript(), 2) End Sub - Private Sub chkPartial_CheckedChanged(sender As Object, e As EventArgs) - FittedModel() - End Sub - - Private Sub chkRugs_CheckedChanged(sender As Object, e As EventArgs) - If ucrChkRugs.Checked Then - grpRugs.Enabled = True - rdoPartial.Checked = True - End If - FittedModel() - End Sub - - Private Sub rdoPartial_CheckedChanged(sender As Object, e As EventArgs) - FittedModel() - End Sub - - Private Sub rdo1_CheckedChanged(sender As Object, e As EventArgs) - FittedModel() - End Sub - - Private Sub rdo2_CheckedChanged(sender As Object, e As EventArgs) - FittedModel() - End Sub - - Private Sub rdoConditional_CheckedChanged(sender As Object, e As EventArgs) - FittedModel() - End Sub - - Private Sub rdoContrast_CheckedChanged(sender As Object, e As EventArgs) - FittedModel() - End Sub Private Sub chkMultiplePlots_CheckedChanged(sender As Object, e As EventArgs) GraphMultiplePlots() @@ -382,140 +382,19 @@ Public Class sdgSimpleRegOptions clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) End Sub - Private Sub FittedModel_CheckedChanged(sender As Object, e As EventArgs) Handles rdoContrast.CheckedChanged, rdoConditional.CheckedChanged, rdoPartial.CheckedChanged, rdo1.CheckedChanged, rdo2.CheckedChanged - FittedModel() - End Sub - - Private Sub CheckRugs_CheckedChanged(sender As Object, e As EventArgs) - GraphFittedModel() - End Sub - - Private Sub DisplayTabDefaults() - 'chkANOVA.Checked = True - 'chkModel.Checked = True - 'chkEstimates.Checked = True - 'chkPvalues.Enabled = True - 'chkPvalues.Checked = True - 'chkDisplayCLimits.Checked = False - 'lblDisplayCLevel.Enabled = False - 'nudDisplayCLevel.Enabled = False - End Sub - - Private Sub SaveTab() - 'ucrFittedColumnName.SetPrefix("Fitted") - 'ucrFittedColumnName.SetItemsTypeAsColumns() - 'ucrFittedColumnName.SetDefaultTypeAsColumn() - 'ucrFittedColumnName.SetDataFrameSelector(clsRDataFrame) - 'ucrFittedColumnName.SetValidationTypeAsRVariable() - - 'ucrResidualsColumnName.SetPrefix("Resids") - 'ucrResidualsColumnName.SetItemsTypeAsColumns() - 'ucrResidualsColumnName.SetDefaultTypeAsColumn() - 'ucrResidualsColumnName.SetDataFrameSelector(clsRDataFrame) - 'ucrResidualsColumnName.SetValidationTypeAsRVariable() - - 'ucrStdResidualsColumnName.SetPrefix("Sresids") - 'ucrStdResidualsColumnName.SetItemsTypeAsColumns() - 'ucrStdResidualsColumnName.SetDefaultTypeAsColumn() - 'ucrStdResidualsColumnName.SetDataFrameSelector(clsRDataFrame) - 'ucrStdResidualsColumnName.SetValidationTypeAsRVariable() - 'ucrLeverageColumnName.SetPrefix("Lever") - 'ucrLeverageColumnName.SetItemsTypeAsColumns() - 'ucrLeverageColumnName.SetDefaultTypeAsColumn() - 'ucrLeverageColumnName.SetDataFrameSelector(clsRDataFrame) - 'ucrLeverageColumnName.SetValidationTypeAsRVariable() - 'ucrSaveFittedColumnName.Enabled = False - ' ucrResidualsColumnName.Enabled = False - 'ucrStdResidualsColumnName.Enabled = False - ' ucrLeverageColumnName.Enabled = False - 'ucrChkFittedValues.Checked = False - 'ucrChkLeverage.Checked = False - ' ucrChkStdResiduals.Checked = False - 'ucrChkResiduals.Checked = False - End Sub - Private Sub GraphsTabDefaults() - GraphFittedModel() + GraphMultiplePlots() GraphIndividualPlots() End Sub Public Sub SetDefaults() - DisplayTabDefaults() - SaveTab() GraphsTabDefaults() ucrChkFittedModel.Checked = False ucrChkMultiplePlots.Checked = False ucrChkIndividualPlots.Checked = False End Sub - Private Sub pvalues() - If (ucrChkANOVA.Checked Or ucrChkEstimates.Checked) Then - chkPvalues.Enabled = True - Else - chkPvalues.Enabled = False - End If - End Sub - - Private Sub chkanovatable_checkedchanged(sender As Object, e As EventArgs) - pvalues() - End Sub - - Private Sub chkestimates_checkedchanged(sender As Object, e As EventArgs) - pvalues() - End Sub - - Private Sub GraphFittedModel() - If (ucrChkFittedModel.Checked) Then - grpPlotType.Enabled = True - grpScale.Enabled = True - ucrNudDisplayCLevel.Enabled = True - nudWhiteSpace.Enabled = True - ucrChkPartial.Enabled = True - ucrChkRugs.Enabled = True - ucrChkJitter.Enabled = True - ucrChkConfIntervalband.Enabled = True - ucrChkIndividualPlots.Checked = False - ucrChkMultiplePlots.Checked = False - Else - grpPlotType.Enabled = False - grpScale.Enabled = False - ucrNudDisplayCLevel.Enabled = False - nudWhiteSpace.Enabled = False - ucrChkPartial.Enabled = False - ucrChkRugs.Enabled = False - ucrChkJitter.Enabled = False - ucrChkConfIntervalband.Enabled = False - End If - rdoConditional.Checked = True - rdoLinear.Checked = True - ucrNudDisplayCLevel.Value = 0.05 - nudWhiteSpace.Value = 0.2 - rdoPartial.Checked = True - If ucrChkRugs.Checked = True Then - grpRugs.Enabled = True - Else - grpRugs.Enabled = False - End If - If (ucrChkDisplayCLimits.Checked) Then - lblDisplayCLevel.Enabled = True - ucrNudDisplayCLevel.Enabled = True - Else - lblDisplayCLevel.Enabled = False - ucrNudDisplayCLevel.Enabled = False - End If - - End Sub - - Private Sub chkFittedModel_CheckedChanged(sender As Object, e As EventArgs) - GraphFittedModel() - End Sub - - Private Sub chkDisplayCLimits_CheckedChanged(sender As Object, e As EventArgs) - GraphFittedModel() - DisplayConfidence() - End Sub - Private Sub DisplayConfidence() If (ucrChkDisplayCLimits.Checked = True) Then clsRCIFunction.AddParameter("level", ucrNudDisplayCLevel.Value) @@ -527,48 +406,14 @@ Public Class sdgSimpleRegOptions End Sub Public Sub RegOptions() - 'If (ucrChkANOVA.Checked) Then - ' If (chkPvalues.Checked) Then - ' AnovaTablePvalues() - ' Else - ' AnovaTable() - ' End If - 'End If - 'If (ucrChkEstimates.Checked) Then - ' If (chkPvalues.Checked) Then - ' EstimatesPvalues() - ' Else - ' Estimates() - ' End If - 'End If - 'If (ucrChkModel.Checked) Then - ' Model() - 'End If If (ucrChkDisplayCLimits.Checked) Then ConfidenceInterval() End If If (rdoFourPlots.Checked Or rdoSixPlots2Rows.Checked Or rdoSixPlots3Rows.Checked Or rdoResidualsFitted.Checked Or rdoQQ.Checked Or rdoResidualsLeverage.Checked Or rdoScaleLocation.Checked Or rdoCooksDistance.Checked Or rdoCooksDistanceLeverage.Checked) Then frmMain.clsRLink.RunScript(clsRGraphics.GetScript, 3) End If - If (ucrChkFittedModel.Checked) Then - frmMain.clsRLink.RunScript(clsRggplotFunction.ToScript(), 3) - End If - 'If ucrChkFittedValues.Checked Then - ' FittedValues() - ' frmMain.clsRLink.RunScript(clsRWriteFitted.ToScript(), 3) - 'End If - 'If ucrChkResiduals.Checked Then - ' Residuals() - ' frmMain.clsRLink.RunScript(clsRWriteResiduals.ToScript(), 3) - 'End If - 'If ucrChkStdResiduals.Checked Then - ' StdResiduals() - ' frmMain.clsRLink.RunScript(clsRWriteStdResiduals.ToScript(), 3) - 'End If - 'If ucrChkLeverage.Checked Then - ' Leverage() - ' frmMain.clsRLink.RunScript(clsRWriteLeverage.ToScript(), 3) - 'End If + + End Sub Private Sub ucrFittedColumnName_NameChanged() @@ -592,8 +437,8 @@ Public Class sdgSimpleRegOptions 'clsRResiduals.SetRCommand("resid") 'clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) 'clsRWriteResiduals.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - 'clsRWriteResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - 'clsRWriteResiduals.AddParameter("col_name", Chr(34) & ucrResidualsColumnName.GetText & Chr(34)) + clsRWriteResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) + clsRWriteResiduals.AddParameter("col_name", Chr(34) & ucrSaveResidualsColumnName.GetText & Chr(34)) 'clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) End Sub @@ -605,8 +450,8 @@ Public Class sdgSimpleRegOptions ' clsRStdResiduals.SetRCommand("rstandard") ' clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRModelFunction) ' clsRWriteStdResiduals.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - ' clsRWriteStdResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - ' clsRWriteStdResiduals.AddParameter("col_name", Chr(34) & ucrStdResidualsColumnName.GetText & Chr(34)) + clsRWriteStdResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) + clsRWriteStdResiduals.AddParameter("col_name", Chr(34) & ucrSaveStdResidualsColumnName.GetText & Chr(34)) ' clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) End Sub diff --git a/instat/sdgVariableTransformations.vb b/instat/sdgVariableTransformations.vb index 812c0e1f786..7bfdc641ba8 100644 --- a/instat/sdgVariableTransformations.vb +++ b/instat/sdgVariableTransformations.vb @@ -27,17 +27,17 @@ Public Class sdgVariableTransformations End Sub Public Sub InitialiseControls() - 'ucrPnlGenerateFunctions.AddRadioButton(rdoIdentity) - 'ucrPnlGenerateFunctions.AddRadioButton(rdoLogBase10) - 'ucrPnlGenerateFunctions.AddRadioButton(rdoNaturallog) - 'ucrPnlGenerateFunctions.AddRadioButton(rdoPower) - 'ucrPnlGenerateFunctions.AddRadioButton(rdoSquareroot) + ucrPnlGenerateFunctions.AddRadioButton(rdoIdentity) + ucrPnlGenerateFunctions.AddRadioButton(rdoLogBase10) + ucrPnlGenerateFunctions.AddRadioButton(rdoNaturallog) + ucrPnlGenerateFunctions.AddRadioButton(rdoPower) + ucrPnlGenerateFunctions.AddRadioButton(rdoSquareroot) - 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoLogBase10, "log10") - 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoSquareroot, "sqrt") - 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoNaturallog, "log") - 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoIdentity, {"log10", "power", "log", "sqrt"}, False) - 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoPower, "power") + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoLogBase10, "log10") + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoSquareroot, "sqrt") + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoNaturallog, "log") + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoIdentity, {"log10", "power", "log", "sqrt"}, False) + ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoPower, "power") bControlsInitialised = True End Sub @@ -68,28 +68,19 @@ Public Class sdgVariableTransformations 'clsRModel.AddParameter(False, strParameterValue:=clsRYVariable.GetVariableNames(bWithQuotes:=False)) clsModel0.SetOperation("^") clsModel0.bBrackets = False - 'clsModel0.AddParameter(iPosition:=0, strParameterValue:=clsRXVariable.GetVariableNames(bWithQuotes:=False)) clsModel0.AddParameter(strParameterValue:=strPower) clsModel0.AddParameter("x", clsRXVariable, bIncludeArgumentName:=False) - clsFormulaOperator.AddParameter(iPosition:=i, clsROperatorParameter:=clsModel0) + clsFormulaOperator.AddParameter("x", clsROperatorParameter:=clsModel0, iPosition:=1) End If - ElseIf rdoLogBase10.Checked Then + + Else clsRToFunction.SetRCommand(strFunctionName) clsRToFunction.AddParameter("x", clsRXVariable, bIncludeArgumentName:=False) - clsFormulaOperator.AddParameter(iPosition:=i, strParameterValue:="x", clsRFunctionParameter:=clsRToFunction) - 'clsLMorGLM.AddParameter(iPosition:=1, clsRFunctionParameter:=clsRToFunction) + clsFormulaOperator.AddParameter("x", clsRFunctionParameter:=clsRToFunction, iPosition:=1) End If End Sub - Private Sub ucrPnlGenerateFunctions_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlGenerateFunctions.ControlValueChanged - 'If rdoLogBase10.Checked Then - ' clsRToFunction.SetRCommand("log10") - ' clsRToFunction.AddParameter("x", clsRXVariable, bIncludeArgumentName:=False) - ' clsFormulaOperator.AddParameter("x", clsRFunctionParameter:=clsRToFunction) - 'End If - End Sub - Public Sub ModelFunction(Optional choice As Boolean = False) If rdoLogBase10.Checked Then ExplanatoryFunction("log10", 1, choice) @@ -104,4 +95,5 @@ Public Class sdgVariableTransformations ExplanatoryFunction("power", ucrNudPower.Value, choice) End If End Sub + End Class \ No newline at end of file From e403842b4dd858e787d92c8285638327bd7538b9 Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 19:33:00 +0100 Subject: [PATCH 151/201] spells update --- instat/dlgSpells.vb | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index cb843277d4a..7d97272160b 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -52,7 +52,6 @@ Public Class dlgSpells ucrReceiverRainfall.SetParameter(New RParameter("rain", 0)) ucrReceiverRainfall.SetParameterIsRFunction() ucrReceiverRainfall.bWithQuotes = False - ' ucrReceiverRainfall.SetParameterIncludeArgumentName(False) ucrReceiverRainfall.Selector = ucrSelectorForSpells ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) ucrReceiverRainfall.bAutoFill = True @@ -194,7 +193,7 @@ Public Class dlgSpells clsRRaindayLowerOperator.AddParameter("min", 0, iPosition:=1) clsRRaindayAndOperator.AddParameter("upper", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) clsRRaindayUpperOperator.SetOperation("<=") - clsRRaindayUpperOperator.AddParameter("max", 0.85, iPosition:=1) ' why 0.85? + clsRRaindayUpperOperator.AddParameter("max", 0.85, iPosition:=1) clsRRaindayMatch.AddParameter("table", "1", iPosition:=1) clsRRaindayMatch.AddParameter("nomatch", "0", iPosition:=2) @@ -207,7 +206,6 @@ Public Class dlgSpells clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(" & strRainDay & ")-cummax((" & strRainDay & "==0)*cumsum(" & strRainDay & "))" & Chr(34)) clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) clsSpellLength.SetAssignTo(strDrySpell) - clsMaxValueManipulation.SetRCommand("list") ' Additional Checkbox @@ -237,6 +235,8 @@ Public Class dlgSpells clsMaxValue.AddParameter("save", 2, iPosition:=6) clsMaxValue.SetAssignTo(ucrSaveSpells.GetText) clsMaxValue.SetAssignTo("Spells_Rain") + clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=4) + clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False, iPosition:=0) clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=0) @@ -295,11 +295,6 @@ Public Class dlgSpells clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub - Private Sub RainyDaysMethod() - clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) - clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) - End Sub - Private Sub ucrInputSpellLower_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputSpellLower.ControlValueChanged, ucrInputSpellUpper.ControlValueChanged, ucrInputCondition.ControlValueChanged Select Case ucrInputCondition.GetText Case "<= Amount of Rain" @@ -322,9 +317,6 @@ Public Class dlgSpells Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) - clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=4) - clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False, iPosition:=0) - RainyDaysMethod() End Sub Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForSpells.ControlContentsChanged @@ -332,8 +324,6 @@ Public Class dlgSpells End Sub Private Sub nudValues() - ' nudFrom.Maximum = ucrNudTo.Value - 1 - ' ucrNudTo.Minimum = nudFrom.Value + 1 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 End Sub From 0408f500c703711f8c0cab287d9777cc9709d578 Mon Sep 17 00:00:00 2001 From: Lily Date: Thu, 22 Jun 2017 19:36:18 +0100 Subject: [PATCH 152/201] fix --- instat/dlgStartofRains.vb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index 6899bd4b99b..be015ed87e4 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -486,6 +486,8 @@ Public Class dlgStartofRains clsFirstDOYPerYear.SetRCommand("instat_calculation$new") clsManipulationFirstDOYPerYear.SetRCommand("list") clsManipulationFirstDOYPerYear.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) + clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) + clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) clsFirstDOYPerYear.AddParameter("function_exp", clsROperatorParameter:=clsFirstDOYPerYearOperator, iPosition:=1) clsFirstDOYPerYearOperator.SetOperation("[") @@ -566,18 +568,9 @@ Public Class dlgStartofRains Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining column(s) as key") - clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) - clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear, iPosition:=5) clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")", iPosition:=4) clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear, iPosition:=0) - If ucrChkTotalRainfall.Checked Then - TotalRainfall() - End If - - If ucrChkDryPeriod.Checked Then - DryPeriod() - End If End Sub Private Sub CombinedFilter() From 2972424ddf64f6193b4f1b884c29faad9a6f73cd Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 22 Jun 2017 22:09:40 +0300 Subject: [PATCH 153/201] more edits --- instat/clsRegressionDefaults.vb | 28 +++++------- instat/dlgRegressionSimple.vb | 10 +++-- instat/sdgSimpleRegOptions.vb | 77 ++------------------------------- 3 files changed, 20 insertions(+), 95 deletions(-) diff --git a/instat/clsRegressionDefaults.vb b/instat/clsRegressionDefaults.vb index 929d8c7c5b2..9ac63f2c229 100644 --- a/instat/clsRegressionDefaults.vb +++ b/instat/clsRegressionDefaults.vb @@ -1,27 +1,10 @@ Public Class clsRegressionDefaults - Public Shared ReadOnly Property clsDefaultFitted As RFunction - Get - Dim clsRFittedValues As New RFunction - Dim clsRWriteFitted, clsRModelFunction As New RFunction - - 'ucrSave (sdgSimpleRegOptions) Fitted Values - clsRFittedValues.SetRCommand("fitted") - clsRModelFunction.SetRCommand("") - clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsDefaultRLmOrGLM) - clsRWriteFitted.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) - Return clsRWriteFitted - End Get - End Property - Public Shared ReadOnly Property clsDefaultRLmOrGLM As RFunction Get Dim clsRModelFunction As New RFunction - clsRModelFunction.SetRCommand("lm") - 'clsRModelFunction.AddParameter("formula", clsROperatorParameter:=clsDefaultFormulaOperator, iPosition:=1) Return clsRModelFunction End Get End Property @@ -121,6 +104,17 @@ End Get End Property + Public Shared ReadOnly Property clsDefaultFitted As RFunction + Get + Dim clsRFittedValues As New RFunction + Dim clsRWriteFitted, clsRModelFunction As New RFunction + + clsRWriteFitted.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + Return clsRWriteFitted + End Get + End Property + + Public Shared ReadOnly Property clsDefaultRWriteFitted As RFunction Get Dim clsDefaultRWriteFittedFunction As New RFunction diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 7b8bd225e3f..57134889549 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -189,10 +189,6 @@ Public Class dlgRegressionSimple DataTypeAccepted() - clsRGraphicsOperator = clsRegressionDefaults.clsDefaultRGraphicsOperator.Clone - clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone - clsRGraphicsOperator.iCallType = 3 - clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmOrGLM.Clone clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) @@ -200,7 +196,13 @@ Public Class dlgRegressionSimple clsRResidualPlots = clsRegressionDefaults.clsDefaultRResidualPlots.Clone clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + + + clsRGraphicsOperator = clsRegressionDefaults.clsDefaultRGraphicsOperator.Clone + clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone clsRgeom_point = clsRegressionDefaults.clsDefaultRgeom_pointFunction.Clone + clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) + clsRGraphicsOperator.iCallType = 3 clsRaovFunction.SetPackageName("stats") diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 0c1e1b0958a..3d884be0231 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -318,22 +318,14 @@ Public Class sdgSimpleRegOptions clsRResidualPlotsFunction.AddParameter("ncol", 2) clsRResidualPlotsFunction.RemoveParameterByName("which") clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction) - clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) - 'clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) ElseIf rdoSixPlots2Rows.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 3) clsRResidualPlotsFunction.AddParameter("which", "1:6") clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction) - clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) - 'clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=7) ElseIf rdoSixPlots3Rows.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 2) clsRResidualPlotsFunction.AddParameter("which", "1:6") clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction) - clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) - ' clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=8) - Else - ' clsRSyntax.RemoveFromAfterCodes(clsRGraphicsOperator) End If If (rdoFourPlots.Checked Or rdoSixPlots2Rows.Checked Or rdoSixPlots3Rows.Checked Or rdoResidualsFitted.Checked Or rdoQQ.Checked Or rdoResidualsLeverage.Checked Or rdoScaleLocation.Checked Or rdoCooksDistance.Checked Or rdoCooksDistanceLeverage.Checked) Then clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) @@ -416,89 +408,26 @@ Public Class sdgSimpleRegOptions End Sub - Private Sub ucrFittedColumnName_NameChanged() - FittedValues() - End Sub + ' disabled until working Private Sub FittedValues() - ' clsRFittedValues.SetRCommand("fitted") - 'clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) - ' clsRWriteFitted.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") clsRWriteFitted.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) clsRWriteFitted.AddParameter("col_name", Chr(34) & ucrSaveFittedColumnName.GetText & Chr(34)) - 'clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) - End Sub - - Private Sub ucrResidualsColumnName_NameChanged() - Residuals() End Sub Private Sub Residuals() - 'clsRResiduals.SetRCommand("resid") - 'clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) - 'clsRWriteResiduals.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") clsRWriteResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) clsRWriteResiduals.AddParameter("col_name", Chr(34) & ucrSaveResidualsColumnName.GetText & Chr(34)) - 'clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) - End Sub - - Private Sub ucrStdResidualsColumnName_NameChanged() - StdResiduals() End Sub Private Sub StdResiduals() - ' clsRStdResiduals.SetRCommand("rstandard") - ' clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRModelFunction) - ' clsRWriteStdResiduals.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") clsRWriteStdResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) clsRWriteStdResiduals.AddParameter("col_name", Chr(34) & ucrSaveStdResidualsColumnName.GetText & Chr(34)) - ' clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) - End Sub - - Private Sub ucrLeverageColumnName_NameChanged() - Leverage() End Sub Private Sub Leverage() - 'clsRLeverage.SetRCommand("hatvalues") - 'clsRLeverage.AddParameter("model", clsRFunctionParameter:=clsRModelFunction) - 'clsRWriteLeverage.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - 'clsRWriteLeverage.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - 'clsRWriteLeverage.AddParameter("col_name", Chr(34) & ucrLeverageColumnName.GetText & Chr(34)) - 'clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) + clsRWriteLeverage.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) + clsRWriteLeverage.AddParameter("col_name", Chr(34) & ucrSaveLeverageColumnName.GetText & Chr(34)) End Sub - Private Sub chkLeverage_CheckedChanged(sender As Object, e As EventArgs) - 'If ucrChkLeverage.Checked Then - ' ucrLeverageColumnName.Enabled = True - 'Else - ' ucrLeverageColumnName.Enabled = False - 'End If - End Sub - - Private Sub chkResiduals_CheckedChanged(sender As Object, e As EventArgs) - 'If ucrChkResiduals.Checked Then - ' ucrResidualsColumnName.Enabled = True - 'Else - ' ucrResidualsColumnName.Enabled = False - 'End If - End Sub - - Private Sub chkStdResiduals_CheckedChanged(sender As Object, e As EventArgs) - 'If ucrChkStdResiduals.Checked Then - ' ucrStdResidualsColumnName.Enabled = True - 'Else - ' ucrStdResidualsColumnName.Enabled = False - 'End If - End Sub - - Private Sub chkFittedValues_CheckedChanged(sender As Object, e As EventArgs) - 'If ucrChkFittedValues.Checked Then - ' ucrSaveFittedColumnName.Enabled = True - 'Else - ' ucrSaveFittedColumnName.Enabled = False - 'End If - End Sub - - End Class \ No newline at end of file From 6e9c92cdf229b69e220b78dc79cf9b887408de50 Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 22 Jun 2017 22:12:27 +0300 Subject: [PATCH 154/201] bug fix --- instat/dlgRegressionSimple.vb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 57134889549..7b8bd225e3f 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -189,6 +189,10 @@ Public Class dlgRegressionSimple DataTypeAccepted() + clsRGraphicsOperator = clsRegressionDefaults.clsDefaultRGraphicsOperator.Clone + clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone + clsRGraphicsOperator.iCallType = 3 + clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmOrGLM.Clone clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) @@ -196,13 +200,7 @@ Public Class dlgRegressionSimple clsRResidualPlots = clsRegressionDefaults.clsDefaultRResidualPlots.Clone clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - - - clsRGraphicsOperator = clsRegressionDefaults.clsDefaultRGraphicsOperator.Clone - clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone clsRgeom_point = clsRegressionDefaults.clsDefaultRgeom_pointFunction.Clone - clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) - clsRGraphicsOperator.iCallType = 3 clsRaovFunction.SetPackageName("stats") From 4c795385cb56f3f3eb2bc927e9881ba15b5cdecd Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Thu, 22 Jun 2017 20:38:18 +0100 Subject: [PATCH 155/201] adding separate threads for R code --- instat/clsRLink.vb | 74 ++++++++++++++++++++++++++------ instat/frmOutputWindow.vb | 14 +++--- instat/ucrOutputWindow.vb | 14 +++--- instat/ucrWPFRichTextBox.xaml.vb | 34 +++++++-------- 4 files changed, 91 insertions(+), 45 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 2f5f5c7971a..eef3b6d4a26 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -419,33 +419,79 @@ Public Class RLink End If End Function - Private Function Evaluate(strScript As String, Optional bSilent As Boolean = False) As Boolean + Private Function Evaluate(strScript As String, Optional bSilent As Boolean = False, Optional bSeparateThread As Boolean = True) As Boolean + Dim thrRScript As Threading.Thread + Dim thrDelay As Threading.Thread + Dim thrWaitDisplay As Threading.Thread + Dim evtWaitHandleWaitDisplayDone As New System.Threading.AutoResetEvent(False) + Dim evtWaitHandleDelayDone As New System.Threading.AutoResetEvent(False) + Dim bReturn As Boolean = True + If clsEngine IsNot Nothing Then Try - clsEngine.Evaluate(strScript) - Return True + If bSeparateThread Then + thrRScript = New Threading.Thread(Sub() + Try + clsEngine.Evaluate(strScript) + Catch ex As Exception + If Not bSilent Then + MsgBox(ex.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 If + bReturn = False + End Try + End Sub) + thrDelay = New Threading.Thread(Sub() + Dim t As New Stopwatch + t.Start() + While t.ElapsedMilliseconds < 500 AndAlso thrRScript.IsAlive + Threading.Thread.Sleep(50) + Console.WriteLine(t.ElapsedMilliseconds) + End While + evtWaitHandleDelayDone.Set() + End Sub) + thrWaitDisplay = New Threading.Thread(Sub() + 'frmWaiting.Show() + While thrRScript.IsAlive + Threading.Thread.Sleep(50) + Application.DoEvents() + End While + 'frmWaiting.Hide() + evtWaitHandleWaitDisplayDone.Set() + End Sub) + thrRScript.Start() + thrDelay.Start() + evtWaitHandleDelayDone.WaitOne() + If thrRScript.IsAlive Then + thrWaitDisplay.Start() + evtWaitHandleWaitDisplayDone.WaitOne() + End If + Else + clsEngine.Evaluate(strScript) + End If Catch ex As Exception If Not bSilent Then MsgBox(ex.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 If - Return False + bReturn = False End Try Else - Return False + bReturn = False End If + Return bReturn End Function Private Function GetSymbol(strSymbol As String, Optional bSilent As Boolean = False) As SymbolicExpression - Dim expTemp As SymbolicExpression + Dim expTemp As SymbolicExpression = Nothing - Try - expTemp = clsEngine.GetSymbol(strSymbol) - Catch ex As Exception - If Not bSilent Then - MsgBox(ex.Message & Environment.NewLine & "The error occurred in attempting to retrieve:" & strSymbol, MsgBoxStyle.Critical, "Error retrieving R variable") - End If - expTemp = Nothing - End Try + If clsEngine IsNot Nothing Then + Try + expTemp = clsEngine.GetSymbol(strSymbol) + Catch ex As Exception + If Not bSilent Then + MsgBox(ex.Message & Environment.NewLine & "The error occurred in attempting to retrieve:" & strSymbol, MsgBoxStyle.Critical, "Error retrieving R variable") + End If + End Try + End If Return expTemp End Function diff --git a/instat/frmOutputWindow.vb b/instat/frmOutputWindow.vb index 667eaa369ce..96d44b2ce52 100644 --- a/instat/frmOutputWindow.vb +++ b/instat/frmOutputWindow.vb @@ -44,8 +44,8 @@ Public Class frmOutputWindow Private Sub mnuContextRTB_Opening(sender As Object, e As CancelEventArgs) Handles mnuContextRTB.Opening 'This sub checks whether or not Copy Image should be enabled. It is enabled if one of the selected block is an "1 image paragraph". 'Could add SaveImageRTB enabled when it exists. - For Each block As Windows.Documents.Block In ucrRichTextBox.rtbOutput.Document.Blocks - If ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentStart) AndAlso ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentEnd) AndAlso TypeOf (block) Is Windows.Documents.Paragraph AndAlso CType(block, Windows.Documents.Paragraph).Inlines.Count = 1 AndAlso TypeOf (CType(block, Windows.Documents.Paragraph).Inlines.FirstInline) Is Windows.Documents.InlineUIContainer Then + For Each block As System.Windows.Documents.Block In ucrRichTextBox.rtbOutput.Document.Blocks + If ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentStart) AndAlso ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentEnd) AndAlso TypeOf (block) Is System.Windows.Documents.Paragraph AndAlso CType(block, System.Windows.Documents.Paragraph).Inlines.Count = 1 AndAlso TypeOf (CType(block, System.Windows.Documents.Paragraph).Inlines.FirstInline) Is System.Windows.Documents.InlineUIContainer Then CopyImageRTB.Enabled = True Exit Sub End If @@ -65,12 +65,12 @@ Public Class frmOutputWindow Private Sub CopyImageRTB_Click(sender As Object, e As EventArgs) Handles CopyImageRTB.Click 'Copies the first selected image into the clipboard. - Dim prphTemp As Windows.Documents.Paragraph - Dim conImage As Windows.Documents.InlineUIContainer - For Each block As Windows.Documents.Block In ucrRichTextBox.rtbOutput.Document.Blocks - If TypeOf (block) Is Windows.Documents.Paragraph Then + Dim prphTemp As System.Windows.Documents.Paragraph + Dim conImage As System.Windows.Documents.InlineUIContainer + For Each block As System.Windows.Documents.Block In ucrRichTextBox.rtbOutput.Document.Blocks + If TypeOf (block) Is System.Windows.Documents.Paragraph Then prphTemp = block - If ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentStart) AndAlso prphTemp.Inlines.Count = 1 AndAlso TypeOf (prphTemp.Inlines.FirstInline) Is Windows.Documents.InlineUIContainer Then + If ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentStart) AndAlso prphTemp.Inlines.Count = 1 AndAlso TypeOf (prphTemp.Inlines.FirstInline) Is System.Windows.Documents.InlineUIContainer Then conImage = prphTemp.Inlines.FirstInline ucrRichTextBox.CopyUIElementToClipboard(conImage.Child) Exit Sub diff --git a/instat/ucrOutputWindow.vb b/instat/ucrOutputWindow.vb index a231ea27533..aaeb0231583 100644 --- a/instat/ucrOutputWindow.vb +++ b/instat/ucrOutputWindow.vb @@ -55,8 +55,8 @@ Public Class ucrOutputWindow Private Sub mnuContextRTB_Opening(sender As Object, e As CancelEventArgs) Handles mnuContextRTB.Opening 'This sub checks whether or not Copy Image should be enabled. It is enabled if one of the selected block is an "1 image paragraph". 'Could add SaveImageRTB enabled when it exists. - For Each block As Windows.Documents.Block In ucrRichTextBox.rtbOutput.Document.Blocks - If ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentStart) AndAlso ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentEnd) AndAlso TypeOf (block) Is Windows.Documents.Paragraph AndAlso CType(block, Windows.Documents.Paragraph).Inlines.Count = 1 AndAlso TypeOf (CType(block, Windows.Documents.Paragraph).Inlines.FirstInline) Is Windows.Documents.InlineUIContainer Then + For Each block As System.Windows.Documents.Block In ucrRichTextBox.rtbOutput.Document.Blocks + If ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentStart) AndAlso ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentEnd) AndAlso TypeOf (block) Is System.Windows.Documents.Paragraph AndAlso CType(block, System.Windows.Documents.Paragraph).Inlines.Count = 1 AndAlso TypeOf (CType(block, System.Windows.Documents.Paragraph).Inlines.FirstInline) Is System.Windows.Documents.InlineUIContainer Then CopyImageRTB.Enabled = True Exit Sub End If @@ -76,12 +76,12 @@ Public Class ucrOutputWindow Private Sub CopyImageRTB_Click(sender As Object, e As EventArgs) Handles CopyImageRTB.Click 'Copies the first selected image into the clipboard. - Dim prphTemp As Windows.Documents.Paragraph - Dim conImage As Windows.Documents.InlineUIContainer - For Each block As Windows.Documents.Block In ucrRichTextBox.rtbOutput.Document.Blocks - If TypeOf (block) Is Windows.Documents.Paragraph Then + Dim prphTemp As System.Windows.Documents.Paragraph + Dim conImage As System.Windows.Documents.InlineUIContainer + For Each block As System.Windows.Documents.Block In ucrRichTextBox.rtbOutput.Document.Blocks + If TypeOf (block) Is System.Windows.Documents.Paragraph Then prphTemp = block - If ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentStart) AndAlso prphTemp.Inlines.Count = 1 AndAlso TypeOf (prphTemp.Inlines.FirstInline) Is Windows.Documents.InlineUIContainer Then + If ucrRichTextBox.rtbOutput.Selection.Contains(block.ContentStart) AndAlso prphTemp.Inlines.Count = 1 AndAlso TypeOf (prphTemp.Inlines.FirstInline) Is System.Windows.Documents.InlineUIContainer Then conImage = prphTemp.Inlines.FirstInline ucrRichTextBox.CopyUIElementToClipboard(conImage.Child) Exit Sub diff --git a/instat/ucrWPFRichTextBox.xaml.vb b/instat/ucrWPFRichTextBox.xaml.vb index ebcc52701b3..8099da41508 100644 --- a/instat/ucrWPFRichTextBox.xaml.vb +++ b/instat/ucrWPFRichTextBox.xaml.vb @@ -86,27 +86,27 @@ Public Class ucrWPFRichTextBox Public Sub DisplayGraph(strImageLocation As String) 'Adds a graph to the output window. Dim blkParagraph As Documents.Paragraph - Dim conImage As Windows.Documents.InlineUIContainer - Dim UIEimage As New Windows.Controls.Image() - Dim bimg As New Windows.Media.Imaging.BitmapImage() - Dim thickness As New Windows.Thickness(1) + Dim conImage As System.Windows.Documents.InlineUIContainer + Dim UIEimage As New System.Windows.Controls.Image() + Dim bimg As New System.Windows.Media.Imaging.BitmapImage() + Dim thickness As New System.Windows.Thickness(1) Using fstream As New IO.FileStream(strImageLocation, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) bimg.BeginInit() - bimg.CacheOption = Windows.Media.Imaging.BitmapCacheOption.OnLoad + bimg.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad bimg.StreamSource = fstream bimg.EndInit() End Using bimg.Freeze() UIEimage.Source = bimg - UIEimage.Stretch = Windows.Media.Stretch.Uniform - UIEimage.StretchDirection = Windows.Controls.StretchDirection.DownOnly - conImage = New Windows.Documents.InlineUIContainer(UIEimage) + UIEimage.Stretch = System.Windows.Media.Stretch.Uniform + UIEimage.StretchDirection = System.Windows.Controls.StretchDirection.DownOnly + conImage = New System.Windows.Documents.InlineUIContainer(UIEimage) blkParagraph = New Documents.Paragraph(conImage) blkParagraph.BorderThickness = thickness - blkParagraph.BorderBrush = Windows.Media.Brushes.Black + blkParagraph.BorderBrush = System.Windows.Media.Brushes.Black blkParagraph.Padding = thickness rtbOutput.Document.Blocks.Add(blkParagraph) - rtbOutput.Document.Blocks.Add(New Windows.Documents.Paragraph) + rtbOutput.Document.Blocks.Add(New System.Windows.Documents.Paragraph) rtbOutput.ScrollToEnd() 'TESTING TO BE REMOVED 'Dim strStargazer As String = " @@ -164,19 +164,19 @@ Public Class ucrWPFRichTextBox End If End Sub - Public Sub CopyUIElementToClipboard(element As Windows.FrameworkElement) + Public Sub CopyUIElementToClipboard(element As System.Windows.FrameworkElement) 'This sub is used to copy the image in a UIElement to the clipboard. It is called within the CopyImage sub on the frmOutputWindow. Dim width As Double = element.ActualWidth Dim Height As Double = element.ActualHeight - Dim bmpCopied As Windows.Media.Imaging.RenderTargetBitmap = New Windows.Media.Imaging.RenderTargetBitmap(Convert.ToInt32(width), Convert.ToInt32(Height), 96, 96, Windows.Media.PixelFormats.Default) - Dim drawingVisual As Windows.Media.DrawingVisual = New Windows.Media.DrawingVisual() + Dim bmpCopied As System.Windows.Media.Imaging.RenderTargetBitmap = New System.Windows.Media.Imaging.RenderTargetBitmap(Convert.ToInt32(width), Convert.ToInt32(Height), 96, 96, System.Windows.Media.PixelFormats.Default) + Dim drawingVisual As System.Windows.Media.DrawingVisual = New System.Windows.Media.DrawingVisual() - Using drawingContext As Windows.Media.DrawingContext = drawingVisual.RenderOpen() - Dim visualBrush As New Windows.Media.VisualBrush(element) - drawingContext.DrawRectangle(visualBrush, Nothing, New Windows.Rect(New Windows.Point(), New Windows.Size(width, Height))) + Using drawingContext As System.Windows.Media.DrawingContext = drawingVisual.RenderOpen() + Dim visualBrush As New System.Windows.Media.VisualBrush(element) + drawingContext.DrawRectangle(visualBrush, Nothing, New System.Windows.Rect(New System.Windows.Point(), New System.Windows.Size(width, Height))) End Using bmpCopied.Render(drawingVisual) - Windows.Clipboard.SetImage(bmpCopied) + System.Windows.Clipboard.SetImage(bmpCopied) End Sub Public Sub SaveRtf(ByVal strFileName As String) From 49cfadf179eed46f7a1d1ed9545729b82febfbcb Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 23 Jun 2017 08:51:33 +0300 Subject: [PATCH 156/201] deletions --- instat/dlgRegressionSimple.vb | 2 +- instat/sdgSimpleRegOptions.vb | 26 ++++++++------------------ 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 7b8bd225e3f..1bda30bfcf4 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -199,8 +199,8 @@ Public Class dlgRegressionSimple 'Residual Plots clsRResidualPlots = clsRegressionDefaults.clsDefaultRResidualPlots.Clone clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - clsRgeom_point = clsRegressionDefaults.clsDefaultRgeom_pointFunction.Clone + clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point, iPosition:=1) clsRaovFunction.SetPackageName("stats") diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 3d884be0231..56e09d68f53 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -50,23 +50,11 @@ Public Class sdgSimpleRegOptions ucrChkPvalues.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) - ' ucrChkFittedValues.SetText("Fitted Values") - ' ucrChkResiduals.SetText("Residuals") - ' ucrChkStdResiduals.SetText("Std Residuals") - 'ucrChkLeverage.SetText("Leverage") - - ' ucrChkFittedValues.AddToLinkedControls(ucrFittedColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ' ucrChkResiduals.AddToLinkedControls(ucrResidualsColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ' ucrChkStdResiduals.AddToLinkedControls(ucrStdResidualsColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ' ucrChkLeverage.AddToLinkedControls(ucrLeverageColumnName, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) ucrChkMultiplePlots.SetText("Multiple Plots") ucrChkIndividualPlots.SetText("Individual Plots") ucrChkFittedModel.SetText("Fitted Model") - - - ucrSaveFittedColumnName.SetPrefix("Fitted") ucrSaveFittedColumnName.SetSaveTypeAsColumn() ucrSaveFittedColumnName.SetIsComboBox() @@ -101,10 +89,12 @@ Public Class sdgSimpleRegOptions ucrChkMultiplePlots.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkMultiplePlots.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - - ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) - ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) + ucrPnlMutiplePlots.AddRadioButton(rdoFourPlots) + ucrPnlMutiplePlots.AddRadioButton(rdoSixPlots2Rows) + ucrPnlMutiplePlots.AddRadioButton(rdoSixPlots3Rows) ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) + ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoSixPlots2Rows, {"autoplot"}) + ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoSixPlots3Rows, {"autoplot"}) ucrPnlPlotType.SetParameter(New RParameter("type")) ucrPnlPlotType.AddRadioButton(rdoContrast, Chr(34) & "conditional" & Chr(34)) @@ -317,15 +307,15 @@ Public Class sdgSimpleRegOptions If rdoFourPlots.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 2) clsRResidualPlotsFunction.RemoveParameterByName("which") - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction,iPosition:=0) ElseIf rdoSixPlots2Rows.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 3) clsRResidualPlotsFunction.AddParameter("which", "1:6") - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) ElseIf rdoSixPlots3Rows.Checked Then clsRResidualPlotsFunction.AddParameter("ncol", 2) clsRResidualPlotsFunction.AddParameter("which", "1:6") - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) End If If (rdoFourPlots.Checked Or rdoSixPlots2Rows.Checked Or rdoSixPlots3Rows.Checked Or rdoResidualsFitted.Checked Or rdoQQ.Checked Or rdoResidualsLeverage.Checked Or rdoScaleLocation.Checked Or rdoCooksDistance.Checked Or rdoCooksDistanceLeverage.Checked) Then clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) From 1416fc2d27a1a3a8a19a5a9ea7dac716eb9672c9 Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 23 Jun 2017 09:18:50 +0100 Subject: [PATCH 157/201] fixes --- instat/dlgSpells.vb | 98 +++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 7d97272160b..18b3b36b21c 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -124,30 +124,29 @@ Public Class dlgSpells Dim strRainDay As String = "rain_day" Dim strDrySpell As String = "Dry_Spell" - 'TODO: make these .clear - clsApplyInstatFunction = New RFunction - clsMaxValueManipulation = New RFunction - clsDayFromAndTo = New RFunction - clsGroupBy = New RFunction - clsAddKey = New RFunction - clsAddKeyColName = New RFunction - clsRRainday = New RFunction - clsSpellLength = New RFunction - clsMaxValue = New RFunction - clsDayFromAndToOperator = New ROperator - clsDayFromOperator = New ROperator - clsDayToOperator = New ROperator - clsRRaindayOperator = New ROperator - clsRRaindayAndOperator = New ROperator - clsRRaindayLowerOperator = New ROperator - clsRRaindayUpperOperator = New ROperator - clsMaxValueFunction = New RFunction - clsAdditionalCondition = New RFunction - clsAdditionalConditionList = New RFunction - clsSubSpellLength2 = New RFunction - clsAdditionalConditionReplaceFunction = New RFunction - clsAdditionalConditionReplaceOperator2 = New ROperator - clsAdditionalConditionReplaceOperator = New ROperator + clsApplyInstatFunction.Clear() + clsMaxValueManipulation.Clear() + clsDayFromAndTo.Clear() + clsGroupBy.Clear() + clsAddKey.Clear() + clsAddKeyColName.Clear() + clsRRainday.Clear() + clsSpellLength.Clear() + clsMaxValue.Clear() + clsDayFromAndToOperator.Clear() + clsDayFromOperator.Clear() + clsDayToOperator.Clear() + clsRRaindayOperator.Clear() + clsRRaindayAndOperator.Clear() + clsRRaindayLowerOperator.Clear() + clsRRaindayUpperOperator.Clear() + clsMaxValueFunction.Clear() + clsAdditionalCondition.Clear() + clsAdditionalConditionList.Clear() + clsSubSpellLength2.Clear() + clsAdditionalConditionReplaceFunction.Clear() + clsAdditionalConditionReplaceOperator2.Clear() + clsAdditionalConditionReplaceOperator.Clear() ucrSelectorForSpells.Reset() ucrReceiverDate.SetMeAsReceiver() @@ -237,6 +236,8 @@ Public Class dlgSpells clsMaxValue.SetAssignTo("Spells_Rain") clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=4) clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False, iPosition:=0) + clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) + clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=0) @@ -248,13 +249,13 @@ Public Class dlgSpells Private Sub SetRCodeForControls(bReset As Boolean) ucrNudFrom.AddAdditionalCodeParameterPair(clsAdditionalConditionReplaceOperator2, New RParameter("list", 0), iAdditionalPairNo:=1) - 'For day: ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("doy", 0), iAdditionalPairNo:=1) + ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRRaindayLowerOperator, New RParameter("rain", 0), iAdditionalPairNo:=1) + ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) - ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRRaindayLowerOperator, New RParameter("rain", 0), iAdditionalPairNo:=1) ucrReceiverRainfall.SetRCode(clsRRaindayUpperOperator, bReset) ucrInputSpellLower.SetRCode(clsRRaindayLowerOperator, bReset) ucrInputSpellUpper.SetRCode(clsRRaindayUpperOperator, bReset) @@ -281,6 +282,8 @@ Public Class dlgSpells Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining column(s) as key") + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) 'TODO: move/fix this + ' conditional is checked: If ucrChkConditional.Checked Then clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsAdditionalCondition, bIncludeArgumentName:=False) @@ -289,12 +292,23 @@ Public Class dlgSpells End If End Sub - Private Sub DayBoundaries() ' TODO: What to do about the calculated_from, sub1, etc + Private Sub DayBoundaries() clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) - clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) End Sub + Private Sub RainDays() + clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) + End Sub + + Private Sub TotalRainfall() + End Sub + + Private Sub DryPeriod() + End Sub + + + + Private Sub ucrInputSpellLower_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputSpellLower.ControlValueChanged, ucrInputSpellUpper.ControlValueChanged, ucrInputCondition.ControlValueChanged Select Case ucrInputCondition.GetText Case "<= Amount of Rain" @@ -316,22 +330,16 @@ Public Class dlgSpells End Sub Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged - clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) - End Sub - - Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForSpells.ControlContentsChanged - strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - End Sub - - Private Sub nudValues() - 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 - 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 + RainDays() End Sub Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged DayBoundaries() - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) - clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + End Sub + + Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForSpells.ControlContentsChanged + strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) + RainDays() End Sub Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged @@ -341,8 +349,12 @@ Public Class dlgSpells Else clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") End If - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) - clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) + End Sub + + + Private Sub nudValues() + 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 + 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 End Sub Private Sub ucrNudFrom_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudFrom.ControlValueChanged From 0ea5ad4b315ed668676fa0f68318d16f31c080e6 Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 23 Jun 2017 09:31:44 +0100 Subject: [PATCH 158/201] naming conventions --- instat/dlgStartofRains.vb | 99 +++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index be015ed87e4..d7e8771b6a7 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -24,7 +24,7 @@ Public Class dlgStartofRains 'Rainy Day classes Private clsRDRollingRainDays, clsRDRollingRainDaysFunction, clsRDRollingRainDaysSub As New RFunction 'Dry Spell classes - Private clsDSDryPeriodTen, clsDSDrySpell, clsDSDryPeriodTenFunctionLead, clsDSDryPeriodTenFunction, clsDSDryPeriodTenList, clsDSDrySpellSub As New RFunction + Private clsDSDrySpellPeriod, clsDSDrySpell, clsDSDrySpellPeriodFunctionLead, clsDSDrySpellFunction, clsDSDrySpellList, clsDSDrySpellSub As New RFunction 'Dry Period classes Private clsDPOverallInterval, clsDPOverallIntervalList, clsDPRain, clsDPRainList, clsDPRainInDays, clsDPRainInDaysFunctionLead, clsDPRainInDaysFunction, clsDPRainFunction, clsDPOverallIntervalFunction As New RFunction Private clsDPRainFunctionOperator, clsDPOverallIntervalFunctionOperator, clsDPOverallIntervalFunctionOperatorRight As New ROperator @@ -102,8 +102,8 @@ Public Class dlgStartofRains 'Total Rainfall ucrPnlTRCalculateBy.AddRadioButton(rdoTRAmount) ucrPnlTRCalculateBy.AddRadioButton(rdoTRPercentile) - ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "sub4", False) - ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "sub4") + ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRAmount, "TRPercSub", False) + ucrPnlTRCalculateBy.AddParameterPresentCondition(rdoTRPercentile, "TRPercSub") ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRPercentile, {rdoTRPercentile}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.8) ucrPnlTRCalculateBy.AddToLinkedControls(ucrNudTRAmount, {rdoTRAmount}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=20) ucrPnlTRCalculateBy.SetLinkedDisplayControl(lblTRVal) @@ -113,8 +113,8 @@ Public Class dlgStartofRains ucrNudTRAmount.SetParameter(New RParameter("TRAmount", 1, False), False) ucrNudTRAmount.SetMinMax(1, Integer.MaxValue) - ucrChkTotalRainfall.SetParameter(New RParameter("sub3", clsTRRollingSum, 1, False), False) - ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("totalrainfall", clsTRCombineOperator, 1, False), iAdditionalPairNo:=1) + ucrChkTotalRainfall.SetParameter(New RParameter("TRSub", clsTRRollingSum, 1, False), False) + ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("TotalRainfall", clsTRCombineOperator, 1, False), iAdditionalPairNo:=1) ucrChkTotalRainfall.SetText("Total Rainfall") ucrChkTotalRainfall.AddToLinkedControls(ucrNudTROverDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=2) ucrNudTROverDays.SetLinkedDisplayControl(lblTROverDays) @@ -129,7 +129,7 @@ Public Class dlgStartofRains ucrNudTRPercentile.Increment = 0.1 'Number of Rainy days - ucrChkNumberOfRainyDays.SetParameter(New RParameter("sub2", clsRDRollingRainDays, 2, False), False) + ucrChkNumberOfRainyDays.SetParameter(New RParameter("RDSub", clsRDRollingRainDays, 2, False), False) ucrChkNumberOfRainyDays.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("raindays", clsRDCombineOperator, 2, False), iAdditionalPairNo:=1) ucrChkNumberOfRainyDays.SetText("Number of Rainy Days") @@ -145,7 +145,7 @@ Public Class dlgStartofRains ucrChkNumberOfRainyDays.AddToLinkedControls(ucrNudRDOutOfDays, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=2) 'Dry Spell - ucrChkDrySpell.SetParameter(New RParameter("sub1", clsDSDryPeriodTen, 3, False), False) + ucrChkDrySpell.SetParameter(New RParameter("DSSub", clsDSDrySpellPeriod, 3, False), False) ucrChkDrySpell.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryspell", clsDSCombineOperator, 3, False), iAdditionalPairNo:=1) ucrChkDrySpell.SetText("Dry Spell") ucrChkDrySpell.AddToLinkedControls(ucrNudDSLengthOfTime, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=30) @@ -160,7 +160,7 @@ Public Class dlgStartofRains ucrNudDSMaximumDays.SetMinMax(1, 366) ' Dry Period - ucrChkDryPeriod.SetParameter(New RParameter("sub5", clsDPOverallInterval, 3, False), False) + ucrChkDryPeriod.SetParameter(New RParameter("DPSub", clsDPOverallInterval, 3, False), False) ucrChkDryPeriod.AddAdditionalCodeParameterPair(clsCombineOperator, New RParameter("dryperiod", clsDPCombineOperator, 4, False), iAdditionalPairNo:=1) ucrChkDryPeriod.SetText("Dry Period") @@ -224,11 +224,11 @@ Public Class dlgStartofRains clsRDRollingRainDaysSub.Clear() clsDSDrySpell.Clear() - clsDSDryPeriodTenList.Clear() - clsDSDryPeriodTen.Clear() - clsDSDryPeriodTenFunction.Clear() + clsDSDrySpellList.Clear() + clsDSDrySpellPeriod.Clear() + clsDSDrySpellFunction.Clear() clsDSDrySpellSub.Clear() - clsDSDryPeriodTenFunctionLead.Clear() + clsDSDrySpellPeriodFunctionLead.Clear() clsDPRainInDays.Clear() clsDPRain.Clear() @@ -307,7 +307,7 @@ Public Class dlgStartofRains clsTRRollingSumFunction.AddParameter("align", Chr(39) & "right" & Chr(39), iPosition:=4) clsTRRollingSumFunction.AddParameter("fill", "NA", iPosition:=5) clsTRRollingSum.AddParameter("save", 0, iPosition:=6) - clsTRRollingSum.SetAssignTo("rolling_sum_day") + clsTRRollingSum.SetAssignTo("Total_Rainfall_Rolling_Day") ' Quantile checked: ' this function is associated with that rdo. @@ -324,7 +324,7 @@ Public Class dlgStartofRains clsTRWetSpell.AddParameter("result_name", Chr(34) & strWetSpell & Chr(34), iPosition:=2) clsTRWetSpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsTRWetSpellList, iPosition:=5) ' check position clsTRWetSpell.AddParameter("save", "0", iPosition:=6) - clsTRWetSpell.SetAssignTo("Wet_Spell") + clsTRWetSpell.SetAssignTo("Total_Rainfall_Wet_Spell") ' RAINY DAY clsRDRollingRainDaysFunction.bToScriptAsRString = True @@ -342,14 +342,14 @@ Public Class dlgStartofRains clsRDRollingRainDaysFunction.AddParameter("fill", "NA", iPosition:=5) clsRDRollingRainDays.AddParameter("result_name", Chr(34) & strRollingRainDays & Chr(34), iPosition:=2) clsRDRollingRainDays.AddParameter("save", 0, iPosition:=6) - clsRDRollingRainDays.SetAssignTo("Rolling_rain") + clsRDRollingRainDays.SetAssignTo("Rain_Day_Rolling_Rain") clsRDRollingRainDaysSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False, iPosition:=0) clsRDRollingRainDays.AddParameter("sub_calculations", clsRFunctionParameter:=clsRDRollingRainDaysSub) 'DRY SPELL clsDSDrySpell.SetRCommand("instat_calculation$new") - clsDSDryPeriodTen.SetRCommand("instat_calculation$new") - clsDSDryPeriodTenList.SetRCommand("list") + clsDSDrySpellPeriod.SetRCommand("instat_calculation$new") + clsDSDrySpellList.SetRCommand("list") clsDSDrySpellSub.SetRCommand("list") clsDSDrySpell.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) @@ -359,27 +359,27 @@ Public Class dlgStartofRains clsDSDrySpell.AddParameter("save", 0, iPosition:=6) clsDSDrySpell.SetAssignTo("Dry_Spell") - clsDSDryPeriodTenFunctionLead.bToScriptAsRString = True - clsDSDryPeriodTen.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) - clsDSDryPeriodTen.AddParameter("function_exp", clsRFunctionParameter:=clsDSDryPeriodTenFunctionLead) - clsDSDryPeriodTenFunctionLead.SetRCommand("lead") - clsDSDryPeriodTenFunctionLead.AddParameter("x", clsRFunctionParameter:=clsDSDryPeriodTenFunction) - clsDSDryPeriodTenFunction.SetPackageName("zoo") - clsDSDryPeriodTenFunction.SetRCommand("rollapply") - clsDSDryPeriodTenFunction.AddParameter("data", strDrySpell, iPosition:=0) - clsDSDryPeriodTenFunction.AddParameter("width", 30, iPosition:=1) - clsDSDryPeriodTenFunction.AddParameter("FUN", "max", iPosition:=2) - clsDSDryPeriodTenFunction.AddParameter("na.rm", "FALSE", iPosition:=3) - clsDSDryPeriodTenFunction.AddParameter("align", Chr(39) & "left" & Chr(39), iPosition:=4) - clsDSDryPeriodTenFunction.AddParameter("fill", "NA", iPosition:=5) - clsDSDryPeriodTen.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34), iPosition:=2) - clsDSDryPeriodTen.AddParameter("save", 2, iPosition:=6) - clsDSDryPeriodTen.SetAssignTo("Dry_Period_10") + clsDSDrySpellPeriodFunctionLead.bToScriptAsRString = True + clsDSDrySpellPeriod.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) + clsDSDrySpellPeriod.AddParameter("function_exp", clsRFunctionParameter:=clsDSDrySpellPeriodFunctionLead) + clsDSDrySpellPeriodFunctionLead.SetRCommand("lead") + clsDSDrySpellPeriodFunctionLead.AddParameter("x", clsRFunctionParameter:=clsDSDrySpellFunction) + clsDSDrySpellFunction.SetPackageName("zoo") + clsDSDrySpellFunction.SetRCommand("rollapply") + clsDSDrySpellFunction.AddParameter("data", strDrySpell, iPosition:=0) + clsDSDrySpellFunction.AddParameter("width", 30, iPosition:=1) + clsDSDrySpellFunction.AddParameter("FUN", "max", iPosition:=2) + clsDSDrySpellFunction.AddParameter("na.rm", "FALSE", iPosition:=3) + clsDSDrySpellFunction.AddParameter("align", Chr(39) & "left" & Chr(39), iPosition:=4) + clsDSDrySpellFunction.AddParameter("fill", "NA", iPosition:=5) + clsDSDrySpellPeriod.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34), iPosition:=2) + clsDSDrySpellPeriod.AddParameter("save", 2, iPosition:=6) + clsDSDrySpellPeriod.SetAssignTo("Dry_Spell_Period") clsDSDrySpellSub.AddParameter("sub1", clsRFunctionParameter:=clsRainyDays, bIncludeArgumentName:=False) clsDSDrySpell.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellSub, iPosition:=4) - clsDSDryPeriodTenList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) - clsDSDryPeriodTen.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDryPeriodTenList, iPosition:=5) + clsDSDrySpellList.AddParameter("sub1", clsRFunctionParameter:=clsDSDrySpell, bIncludeArgumentName:=False) + clsDSDrySpellPeriod.AddParameter("sub_calculations", clsRFunctionParameter:=clsDSDrySpellList, iPosition:=5) 'DRY PERIOD clsDPRainInDaysFunctionLead.bToScriptAsRString = True @@ -403,7 +403,7 @@ Public Class dlgStartofRains clsDPRainInDaysFunction.AddParameter("fill", "NA", iPosition:=5) clsDPRainInDays.AddParameter("result_name", Chr(34) & strRainInDays & Chr(34), iPosition:=2) ' sub calc running? clsDPRainInDays.AddParameter("save", "0", iPosition:=6) - clsDPRainInDays.SetAssignTo("Rain_Period_Length") + clsDPRainInDays.SetAssignTo("Dry_Period_Rolling_Rain") clsDPRainFunction.bToScriptAsRString = True clsDPRain.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) @@ -420,7 +420,7 @@ Public Class dlgStartofRains clsDPRain.AddParameter("result_name", Chr(34) & strAboveThreshold & Chr(34), iPosition:=1) clsDPRain.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPRainList, iPosition:=4) clsDPRain.AddParameter("save", 0, iPosition:=6) - clsDPRain.SetAssignTo("Above_Threshold") + clsDPRain.SetAssignTo("Dry_Period_Above_Threshold") clsDPRainList.AddParameter("sub1", clsRFunctionParameter:=clsDPRainInDays, bIncludeArgumentName:=False) clsDPOverallInterval.AddParameter("sub_calculations", clsRFunctionParameter:=clsDPOverallIntervalList, iPosition:=4) @@ -445,14 +445,14 @@ Public Class dlgStartofRains clsDPOverallIntervalFunction.AddParameter("fill", "NA", iPosition:=5) clsDPOverallInterval.AddParameter("result_name", Chr(34) & strDPOverallIntervalRain & Chr(34), iPosition:=2) clsDPOverallInterval.AddParameter("save", "2", iPosition:=6) - clsDPOverallInterval.SetAssignTo("Overall_Interval") + clsDPOverallInterval.SetAssignTo("Dry_Period_Overall_Interval") ' Combined filter clsCombinedList.SetRCommand("list") clsCombinedFilter.SetRCommand("instat_calculation$new") clsCombinedFilter.AddParameter("type", Chr(34) & "filter" & Chr(34), iPosition:=0) clsCombinedFilter.AddParameter("sub_calculations", clsRFunctionParameter:=clsCombinedList, iPosition:=5) - clsCombinedFilter.SetAssignTo("combined_filter") + clsCombinedFilter.SetAssignTo("Overall_Combined_Filter") clsCombineOperator.bToScriptAsRString = True clsCombinedFilter.AddParameter("function_exp", clsROperatorParameter:=clsCombineOperator) clsCombineOperator.SetOperation("&") @@ -486,8 +486,9 @@ Public Class dlgStartofRains clsFirstDOYPerYear.SetRCommand("instat_calculation$new") clsManipulationFirstDOYPerYear.SetRCommand("list") clsManipulationFirstDOYPerYear.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) - clsManipulationFirstDOYPerYear.AddParameter("sub1", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) + clsManipulationFirstDOYPerYear.AddParameter("DrySpellSub", clsRFunctionParameter:=clsCombinedFilter, bIncludeArgumentName:=False) clsManipulationFirstDOYPerYear.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear, iPosition:=5) clsFirstDOYPerYear.AddParameter("type", Chr(34) & "summary" & Chr(34), iPosition:=0) clsFirstDOYPerYear.AddParameter("function_exp", clsROperatorParameter:=clsFirstDOYPerYearOperator, iPosition:=1) clsFirstDOYPerYearOperator.SetOperation("[") @@ -498,6 +499,7 @@ Public Class dlgStartofRains clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) + clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear, iPosition:=0) 'Base Function ucrBase.clsRsyntax.SetBaseRFunction(clsApplyInstatFunction) @@ -537,7 +539,7 @@ Public Class dlgStartofRains 'DrySpell ucrChkDrySpell.SetRCode(clsCombinedList, bReset) - ucrNudDSLengthOfTime.SetRCode(clsDSDryPeriodTenFunction, bReset) + ucrNudDSLengthOfTime.SetRCode(clsDSDrySpellFunction, bReset) 'DryPeriod ucrChkDryPeriod.SetRCode(clsCombinedList, bReset) @@ -567,27 +569,23 @@ Public Class dlgStartofRains Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Start of Rains: Defining column(s) as key") - - clsFirstDOYPerYear.AddParameter("manipulations", clsRFunctionParameter:=clsManipulationFirstDOYPerYear, iPosition:=5) - clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")", iPosition:=4) - clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsFirstDOYPerYear, iPosition:=0) End Sub Private Sub CombinedFilter() - clsCombineOperator.AddParameter("totalrainfall", clsROperatorParameter:=clsTRCombineOperator, iPosition:=1) + clsCombineOperator.AddParameter("TotalRainfall", clsROperatorParameter:=clsTRCombineOperator, iPosition:=1) If ucrChkTotalRainfall.Checked Then If rdoTRAmount.Checked Then - clsCombinedList.RemoveParameterByName("sub4") + clsCombinedList.RemoveParameterByName("TRPercSub") clsTRCombineOperator.RemoveParameterByName("TRPerc") clsTRCombineOperator.AddParameter("TRAmount", strParameterValue:=ucrNudTRAmount.Value, iPosition:=1) Else - clsCombinedList.AddParameter("sub4", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) + clsCombinedList.AddParameter("TRPercSub", clsRFunctionParameter:=clsTRWetSpell, bIncludeArgumentName:=False) clsTRCombineOperator.RemoveParameterByName("TRAmount") clsTRCombineOperator.AddParameter("TRPerc", strParameterValue:=strWetSpell, iPosition:=1) End If Else - clsCombinedList.RemoveParameterByName("sub4") - clsCombineOperator.RemoveParameterByName("totalrainfall") + clsCombinedList.RemoveParameterByName("TRPercSub") + clsCombineOperator.RemoveParameterByName("TotalRainfall") clsTRCombineOperator.RemoveParameterByName("TRPerc") clsTRCombineOperator.RemoveParameterByName("TRAmount") End If @@ -595,6 +593,7 @@ Public Class dlgStartofRains Private Sub DayBoundaries() clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") + clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")", iPosition:=4) End Sub Private Sub RainDays() From 7cb2721b4c2f093b692a6abc0a029acbc85b8814 Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 23 Jun 2017 12:17:22 +0300 Subject: [PATCH 159/201] Model Preview fix --- instat/dlgRegressionSimple.vb | 64 +++++++++-------- instat/sdgSimpleRegOptions.vb | 131 ++++++++++++++-------------------- 2 files changed, 90 insertions(+), 105 deletions(-) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 1bda30bfcf4..bfc771ebc15 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -14,20 +14,14 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True Public clsModel, clsFormulaOperator, clsRGraphicsOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator Public clsRPoisson, clsRggplotFunction, clsRLeverage, clsRWriteLeverage, clsRResiduals, clsRStdResiduals, clsRWriteResiduals, clsRWriteStdResiduals, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsTFunc, clsRLength As New RFunction - Public clsRYVariable, clsRXVariable As String - - Private Sub ucrExplanatory_Load() Handles ucrExplanatory.ControlValueChanged - - End Sub - + Public clsRYVariable, clsRXVariable, ModelPreview As String Private bReset As Boolean = True - - Public bResetSubDialog As Boolean = False Public bResetOptionsSubDialog As Boolean = False Private Sub dlgRegressionSimple_Load(sender As Object, e As EventArgs) Handles Me.Load @@ -58,6 +52,14 @@ Public Class dlgRegressionSimple 'ucrNudHypothesis.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("r"), 1) End Sub + Private Sub Preview() + Dim ResponseVar As String + Dim ExplanatoryVar As String + ResponseVar = ucrResponse.GetVariableNames(bWithQuotes:=False) + ExplanatoryVar = ucrExplanatory.GetVariableNames(bWithQuotes:=False) + ModelPreview = ResponseVar & "~" & ExplanatoryVar + End Sub + Private Sub InitialiseDialog() ucrBase.clsRsyntax.iCallType = 2 @@ -83,8 +85,6 @@ Public Class dlgRegressionSimple ucrSaveModels.SetCheckBoxText("Save Model") ucrSaveModels.SetIsComboBox() - - ucrPnlMeansAndVariance.AddRadioButton(rdoCompareMeans) ucrPnlMeansAndVariance.AddRadioButton(rdoCompareVariance) @@ -196,6 +196,7 @@ Public Class dlgRegressionSimple clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmOrGLM.Clone clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) + 'Residual Plots clsRResidualPlots = clsRegressionDefaults.clsDefaultRResidualPlots.Clone clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) @@ -210,6 +211,9 @@ Public Class dlgRegressionSimple 'FitModel clsRggplotFunction = clsRegressionDefaults.clsDefaultRggplot.Clone + clsRggplotFunction.AddParameter("type", Chr(34) & "conditional" & Chr(34)) + clsRggplotFunction.AddParameter("scale", Chr(34) & "linear" & Chr(34)) + clsRggplotFunction.AddParameter("rug", "TRUE") clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsRLmOrGLM) clsRggplotFunction.iCallType = 3 @@ -370,6 +374,7 @@ Public Class dlgRegressionSimple Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged clsRYVariable = ucrResponse.GetVariableNames(bWithQuotes:=False) + Preview() End Sub @@ -382,6 +387,7 @@ Public Class dlgRegressionSimple Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged clsRXVariable = ucrExplanatory.GetVariableNames(bWithQuotes:=False) + Preview() End Sub @@ -570,10 +576,6 @@ Public Class dlgRegressionSimple End Sub Private Sub SetRCode() - 'clsRPoisson.ClearParameters() - 'clsRBinomial.ClearParameters() - 'clsRTTest.ClearParameters() - 'clsRLmOrGLM.ClearParameters() If rdoGeneralCase.Checked Then If (ucrFamily.clsCurrDistribution.strNameTag = "Normal") Then ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) @@ -603,22 +605,23 @@ Public Class dlgRegressionSimple End Sub Private Sub TestOKEnabled() - ' If Not ucrResponse.IsEmpty() AndAlso Not ucrExplanatory.IsEmpty() AndAlso ucrFamily.Enabled AndAlso Not ucrFamily.ucrInputDistributions.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then - 'ucrModelPreview.SetName(clsRLmOrGLM.ToScript) - ' If rdoSpecific.Checked AndAlso (ucrFamily.clsCurrDistribution.strNameTag = "Poisson" OrElse ucrFamily.clsCurrDistribution.strNameTag = "Binomial") AndAlso Not (ucrLevel1.IsEmpty OrElse ucrLevel2.IsEmpty) Then - 'ucrBase.OKEnabled(True) - ' Else - ' ucrBase.OKEnabled(False) - ' End If - 'If rdoGeneralCase.Checked Then - 'ucrBase.clsRsyntax.AddParameter("formula", clsROperatorParameter:=clsModel) - 'End If - 'Else - 'ucrBase.OKEnabled(False) - ' End If - If Not ucrResponse.IsEmpty() Then + If Not ucrResponse.IsEmpty() AndAlso Not ucrExplanatory.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then + ucrModelPreview.SetName(ModelPreview) + 'If rdoSpecific.Checked AndAlso (ucrFamily.clsCurrDistribution.strNameTag = "Poisson" OrElse ucrFamily.clsCurrDistribution.strNameTag = "Binomial") AndAlso Not (ucrLevel1.IsEmpty OrElse ucrLevel2.IsEmpty) Then + ' ucrBase.OKEnabled(True) + 'Else + ' ucrBase.OKEnabled(False) + 'End If + 'If rdoGeneralCase.Checked Then + ' ucrBase.clsRsyntax.AddParameter("formula", clsROperatorParameter:=clsModel) + 'End If ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) End If + 'If Not ucrResponse.IsEmpty() Then + ' ucrBase.OKEnabled(True) + 'End If End Sub Private Sub ucrSelectorSimpleReg_DataFrameChanged() Handles ucrSelectorSimpleReg.ControlValueChanged @@ -662,7 +665,6 @@ Public Class dlgRegressionSimple ucrFamily.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrResponse.GetVariableNames(bWithQuotes:=False)) End If End If - TestOKEnabled() End Sub Public Sub SetEnableDists() @@ -855,4 +857,8 @@ Public Class dlgRegressionSimple Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged TestOKEnabled() End Sub + + Private Sub ucrPnlModelType_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlModelType.ControlValueChanged + SetRCode() + End Sub End Class \ No newline at end of file diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 56e09d68f53..856b96d0353 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -97,8 +97,8 @@ Public Class sdgSimpleRegOptions ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoSixPlots3Rows, {"autoplot"}) ucrPnlPlotType.SetParameter(New RParameter("type")) - ucrPnlPlotType.AddRadioButton(rdoContrast, Chr(34) & "conditional" & Chr(34)) - ucrPnlPlotType.AddRadioButton(rdoConditional, Chr(34) & "contrast" & Chr(34)) + ucrPnlPlotType.AddRadioButton(rdoConditional, Chr(34) & "conditional" & Chr(34)) + ucrPnlPlotType.AddRadioButton(rdoContrast, Chr(34) & "contrast" & Chr(34)) ucrPnlScale.SetParameter(New RParameter("scale")) ucrPnlScale.AddRadioButton(rdoLinear, Chr(34) & "linear" & Chr(34)) @@ -109,6 +109,7 @@ Public Class sdgSimpleRegOptions ucrPnlPartial12.AddRadioButton(rdo1, "1") ucrPnlPartial12.AddRadioButton(rdo2, "2") ucrPnlPartial12.AddRadioButton(rdoPartial, "TRUE") 'To obtain partial: to be produced rug=T & partial=T(Default of partial is TRUE) + ucrPnlPartial12.SetRDefault("TRUE") ucrChkJitter.SetText("Jitter") ucrChkJitter.SetParameter(New RParameter("jitter"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") @@ -193,8 +194,8 @@ Public Class sdgSimpleRegOptions ucrChkANOVA.SetRSyntax(clsRSyntax, bReset) ucrChkDisplayCLimits.SetRSyntax(clsRSyntax, bReset) ucrChkPvalues.SetRSyntax(clsRSyntax, bReset) - ucrPnlScale.SetRSyntax(clsRSyntax, bReset) - ucrPnlPlotType.SetRSyntax(clsRSyntax, bReset) + ucrPnlScale.SetRCode(clsRggplotFunction, bReset) + ucrPnlPlotType.SetRCode(clsRggplotFunction, bReset) ucrChkJitter.SetRCode(clsRggplotFunction, bReset) ucrNudGraphicsCLevel.SetRCode(clsRggplotFunction, bReset) ucrNudWhiteSpace.SetRCode(clsRggplotFunction, bReset) @@ -303,80 +304,60 @@ Public Class sdgSimpleRegOptions Private Sub chkIndividualPlots_CheckedChanged(sender As Object, e As EventArgs) GraphIndividualPlots() End Sub - Private Sub ucrPnlMutiplePlots_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlMutiplePlots.ControlValueChanged - If rdoFourPlots.Checked Then - clsRResidualPlotsFunction.AddParameter("ncol", 2) - clsRResidualPlotsFunction.RemoveParameterByName("which") - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction,iPosition:=0) - ElseIf rdoSixPlots2Rows.Checked Then - clsRResidualPlotsFunction.AddParameter("ncol", 3) - clsRResidualPlotsFunction.AddParameter("which", "1:6") - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - ElseIf rdoSixPlots3Rows.Checked Then - clsRResidualPlotsFunction.AddParameter("ncol", 2) - clsRResidualPlotsFunction.AddParameter("which", "1:6") - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + Private Sub ucrPnlMutiplePlots_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlMutiplePlots.ControlValueChanged, ucrPnlIndividualPlots.ControlValueChanged + 'Multiple Plots + If ucrChkMultiplePlots.Checked Then + If rdoFourPlots.Checked Then + clsRResidualPlotsFunction.AddParameter("ncol", 2) + clsRResidualPlotsFunction.RemoveParameterByName("which") + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + ElseIf rdoSixPlots2Rows.Checked Then + clsRResidualPlotsFunction.AddParameter("ncol", 3) + clsRResidualPlotsFunction.AddParameter("which", "1:6") + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + ElseIf rdoSixPlots3Rows.Checked Then + clsRResidualPlotsFunction.AddParameter("ncol", 2) + clsRResidualPlotsFunction.AddParameter("which", "1:6") + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + End If + If (rdoFourPlots.Checked OrElse rdoSixPlots2Rows.Checked OrElse rdoSixPlots3Rows.Checked) Then + clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) + End If End If - If (rdoFourPlots.Checked Or rdoSixPlots2Rows.Checked Or rdoSixPlots3Rows.Checked Or rdoResidualsFitted.Checked Or rdoQQ.Checked Or rdoResidualsLeverage.Checked Or rdoScaleLocation.Checked Or rdoCooksDistance.Checked Or rdoCooksDistanceLeverage.Checked) Then - clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) + 'Individual Plots + If ucrChkIndividualPlots.Checked Then + If rdoQQ.Checked Then + clsRResidualPlotsFunction.RemoveParameterByName("ncol") + clsRResidualPlotsFunction.AddParameter("which", 2) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + ElseIf rdoResidualsFitted.Checked Then + clsRResidualPlotsFunction.RemoveParameterByName("ncol") + clsRResidualPlotsFunction.AddParameter("which", 1) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) + ElseIf rdoResidualsLeverage.Checked Then + clsRResidualPlotsFunction.RemoveParameterByName("ncol") + clsRResidualPlotsFunction.AddParameter("which", 5) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + ElseIf rdoCooksDistanceLeverage.Checked Then + clsRResidualPlotsFunction.RemoveParameterByName("ncol") + clsRResidualPlotsFunction.AddParameter("which", 6) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + ElseIf rdoCooksDistance.Checked Then + clsRResidualPlotsFunction.RemoveParameterByName("ncol") + clsRResidualPlotsFunction.AddParameter("which", 4) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + ElseIf rdoScaleLocation.Checked Then + clsRResidualPlotsFunction.RemoveParameterByName("ncol") + clsRResidualPlotsFunction.AddParameter("which", 3) + clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) + End If + If (rdoResidualsFitted.Checked OrElse rdoQQ.Checked OrElse rdoResidualsLeverage.Checked OrElse rdoScaleLocation.Checked OrElse rdoCooksDistance.Checked OrElse rdoCooksDistanceLeverage.Checked) Then + clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=7) + End If End If End Sub - - Private Sub rdoQQ_CheckedChanged(sender As Object, e As EventArgs) - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 2) - ' clsRGraphics.AddParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point) - End Sub - Private Sub rdoResidualsFitted_CheckedChanged(sender As Object, e As EventArgs) - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 1) - clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) - End Sub - - Private Sub rdoResidualsLeverage_CheckedChanged(sender As Object, e As EventArgs) - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 5) - clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) - End Sub - - Private Sub rdoCooksDistanceLeverage_CheckedChanged(sender As Object, e As EventArgs) - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 6) - clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) - End Sub - - Private Sub rdoCooksDistance_CheckedChanged(sender As Object, e As EventArgs) - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 4) - clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) - End Sub - - Private Sub rdoScaleLocation_CheckedChanged(sender As Object, e As EventArgs) - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 3) - clsRGraphics.SetOperatorParameter(True, clsRFunc:=clsRResidualPlotsFunction) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) - End Sub - - Private Sub GraphsTabDefaults() - - GraphMultiplePlots() - GraphIndividualPlots() - End Sub - - Public Sub SetDefaults() - GraphsTabDefaults() - ucrChkFittedModel.Checked = False - ucrChkMultiplePlots.Checked = False - ucrChkIndividualPlots.Checked = False - End Sub - Private Sub DisplayConfidence() If (ucrChkDisplayCLimits.Checked = True) Then clsRCIFunction.AddParameter("level", ucrNudDisplayCLevel.Value) @@ -394,8 +375,6 @@ Public Class sdgSimpleRegOptions If (rdoFourPlots.Checked Or rdoSixPlots2Rows.Checked Or rdoSixPlots3Rows.Checked Or rdoResidualsFitted.Checked Or rdoQQ.Checked Or rdoResidualsLeverage.Checked Or rdoScaleLocation.Checked Or rdoCooksDistance.Checked Or rdoCooksDistanceLeverage.Checked) Then frmMain.clsRLink.RunScript(clsRGraphics.GetScript, 3) End If - - End Sub ' disabled until working From f4730ebc5767711e1152d92eeac87cd21c23a32e Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 23 Jun 2017 11:54:56 +0100 Subject: [PATCH 160/201] Update to spells --- instat/dlgSpells.Designer.vb | 37 ++++++--- instat/dlgSpells.vb | 148 ++++++++++++++++------------------- 2 files changed, 94 insertions(+), 91 deletions(-) diff --git a/instat/dlgSpells.Designer.vb b/instat/dlgSpells.Designer.vb index 96ed52659dc..5c865b56588 100644 --- a/instat/dlgSpells.Designer.vb +++ b/instat/dlgSpells.Designer.vb @@ -37,7 +37,6 @@ Partial Class dlgSpells Me.ucrInputSpellUpper = New instat.ucrInputTextBox() Me.lblStation = New System.Windows.Forms.Label() Me.ucrReceiverStation = New instat.ucrReceiverSingle() - Me.ucrSaveSpells = New instat.ucrSave() Me.ucrReceiverDOY = New instat.ucrReceiverSingle() Me.ucrReceiverYear = New instat.ucrReceiverSingle() Me.ucrReceiverDate = New instat.ucrReceiverSingle() @@ -45,6 +44,8 @@ Partial Class dlgSpells Me.ucrSelectorForSpells = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrBase = New instat.ucrButtons() Me.ucrChkConditional = New instat.ucrCheck() + Me.ucrInputNewColumnName = New instat.ucrInputTextBox() + Me.lblNewColumnName = New System.Windows.Forms.Label() Me.grpRainParameters.SuspendLayout() Me.SuspendLayout() ' @@ -203,13 +204,6 @@ Partial Class dlgSpells Me.ucrReceiverStation.TabIndex = 16 Me.ucrReceiverStation.ucrSelector = Nothing ' - 'ucrSaveSpells - ' - Me.ucrSaveSpells.Location = New System.Drawing.Point(9, 349) - Me.ucrSaveSpells.Name = "ucrSaveSpells" - Me.ucrSaveSpells.Size = New System.Drawing.Size(290, 24) - Me.ucrSaveSpells.TabIndex = 14 - ' 'ucrReceiverDOY ' Me.ucrReceiverDOY.frmParent = Me @@ -283,15 +277,35 @@ Partial Class dlgSpells Me.ucrChkConditional.Size = New System.Drawing.Size(193, 20) Me.ucrChkConditional.TabIndex = 17 ' + 'ucrInputNewColumnName + ' + Me.ucrInputNewColumnName.AddQuotesIfUnrecognised = True + Me.ucrInputNewColumnName.IsMultiline = False + Me.ucrInputNewColumnName.IsReadOnly = False + Me.ucrInputNewColumnName.Location = New System.Drawing.Point(113, 350) + Me.ucrInputNewColumnName.Name = "ucrInputNewColumnName" + Me.ucrInputNewColumnName.Size = New System.Drawing.Size(187, 21) + Me.ucrInputNewColumnName.TabIndex = 18 + ' + 'lblNewColumnName + ' + Me.lblNewColumnName.AutoSize = True + Me.lblNewColumnName.Location = New System.Drawing.Point(6, 352) + Me.lblNewColumnName.Name = "lblNewColumnName" + Me.lblNewColumnName.Size = New System.Drawing.Size(101, 13) + Me.lblNewColumnName.TabIndex = 21 + Me.lblNewColumnName.Text = "New Column Name:" + ' 'dlgSpells ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(414, 431) + Me.ClientSize = New System.Drawing.Size(412, 428) + Me.Controls.Add(Me.lblNewColumnName) + Me.Controls.Add(Me.ucrInputNewColumnName) Me.Controls.Add(Me.ucrChkConditional) Me.Controls.Add(Me.lblStation) Me.Controls.Add(Me.ucrReceiverStation) - Me.Controls.Add(Me.ucrSaveSpells) Me.Controls.Add(Me.ucrReceiverDOY) Me.Controls.Add(Me.ucrReceiverYear) Me.Controls.Add(Me.lblYear) @@ -332,7 +346,6 @@ Partial Class dlgSpells Friend WithEvents lblThreshold As Label Friend WithEvents lblFrom As Label Friend WithEvents lblTo As Label - Friend WithEvents ucrSaveSpells As ucrSave Friend WithEvents lblStation As Label Friend WithEvents ucrReceiverStation As ucrReceiverSingle Friend WithEvents ucrInputSpellLower As ucrInputTextBox @@ -340,4 +353,6 @@ Partial Class dlgSpells Friend WithEvents ucrNudTo As ucrNud Friend WithEvents ucrNudFrom As ucrNud Friend WithEvents ucrChkConditional As ucrCheck + Friend WithEvents lblNewColumnName As Label + Friend WithEvents ucrInputNewColumnName As ucrInputTextBox End Class diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 18b3b36b21c..0c7f4684743 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -56,7 +56,7 @@ Public Class dlgSpells ucrReceiverRainfall.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "rain" & Chr(34)}) ucrReceiverRainfall.bAutoFill = True - ucrReceiverStation.SetParameter(New RParameter("station", 1)) + ucrReceiverStation.SetParameter(New RParameter("station", 1, False)) ucrReceiverStation.SetParameterIsString() ucrReceiverStation.Selector = ucrSelectorForSpells ucrReceiverStation.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "station" & Chr(34)}) @@ -66,7 +66,7 @@ Public Class dlgSpells ucrReceiverYear.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "year" & Chr(34)}) ucrReceiverYear.bAutoFill = True - ucrReceiverDate.SetParameter(New RParameter("date", 0)) + ucrReceiverDate.SetParameter(New RParameter("date", 0, False)) ucrReceiverDate.SetParameterIsString() ucrReceiverDate.Selector = ucrSelectorForSpells ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) @@ -96,28 +96,17 @@ Public Class dlgSpells ucrInputSpellUpper.SetValidationTypeAsNumeric() ucrInputSpellUpper.AddQuotesIfUnrecognised = False - 'ucrInputCondition.SetParameter(New RParameter("")) - 'Dim dctCondition As New Dictionary(Of String, String) - 'dctCondition.Add("Between", "between") - 'dctCondition.Add("Less than", Chr(34) & "<" & Chr(34)) - 'dctCondition.Add("Greater than", Chr(34) & ">" & Chr(34)) - 'ucrInputCondition.SetItems(dctCondition) - ucrInputCondition.SetItems({"<= Amount of Rain", "Between", ">= Amount of Rain"}) ucrInputCondition.SetDropDownStyleAsNonEditable() ucrChkConditional.SetText("Conditional on Rain at Start of Spell") - ucrChkConditional.SetParameter(New RParameter("sub1", 1, False), False) - - 'TODO with new system - 'ValueIfChecked:=clsAdditionalCondition - 'ValueIfUnchecked:=clsRRainday + ucrChkConditional.AddFunctionNamesCondition({True}, "sub1") + ucrChkConditional.AddFunctionNamesCondition({False}, "sub1") - ucrSaveSpells.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) - ucrSaveSpells.SetLabelText("New Column Name:") - ucrSaveSpells.SetIsTextBox() - ucrSaveSpells.SetPrefix("Spells") - ucrSaveSpells.SetSaveTypeAsColumn() + ucrInputNewColumnName.SetParameter(New RParameter("result_name", 2)) + ucrInputNewColumnName.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) + ucrInputNewColumnName.SetName("Spells") + ' ucrInputNewColumnName.SetSaveTypeAsColumn() End Sub Private Sub SetDefaults() @@ -150,7 +139,7 @@ Public Class dlgSpells ucrSelectorForSpells.Reset() ucrReceiverDate.SetMeAsReceiver() - ucrInputCondition.SetName("<= Amount of Rain") 'TODO1: set item/name as this + ucrInputCondition.SetName("Between") 'TODO1: set item/name as this ' key clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") @@ -181,9 +170,9 @@ Public Class dlgSpells clsRRainday.SetRCommand("instat_calculation$new") clsRRainday.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsRRainday.AddParameter("result_name", Chr(34) & strRainDay & Chr(34), iPosition:=2) - clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=3) clsRRainday.AddParameter("save", "0", iPosition:=6) clsRRainday.AddParameter("function_exp", clsRFunctionParameter:=clsRRaindayMatch, iPosition:=1) + clsRRaindayMatch.SetRCommand("match") clsRRaindayMatch.AddParameter("x", clsROperatorParameter:=clsRRaindayAndOperator) clsRRaindayAndOperator.SetOperation("&") @@ -201,10 +190,11 @@ Public Class dlgSpells clsSpellLength.SetRCommand("instat_calculation$new") clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) clsSpellLength.AddParameter("result_name", Chr(34) & strDrySpell & Chr(34), iPosition:=2) - clsSpellLength.AddParameter("save", 0, iPosition:=6) clsSpellLength.AddParameter("function_exp", Chr(34) & "cumsum(" & strRainDay & ")-cummax((" & strRainDay & "==0)*cumsum(" & strRainDay & "))" & Chr(34)) - clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1) - clsSpellLength.SetAssignTo(strDrySpell) + clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1, iPosition:=5) + clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) + clsSpellLength.AddParameter("save", 0, iPosition:=6) + clsSpellLength.SetAssignTo("Spell_Length") clsMaxValueManipulation.SetRCommand("list") ' Additional Checkbox @@ -230,14 +220,14 @@ Public Class dlgSpells clsMaxValue.AddParameter("function_exp", clsRFunctionParameter:=clsMaxValueFunction, iPosition:=1) clsMaxValueFunction.SetRCommand("max") clsMaxValueFunction.AddParameter("x", strDrySpell) - clsMaxValue.AddParameter("result_name", Chr(34) & ucrSaveSpells.GetText() & Chr(34), iPosition:=3) clsMaxValue.AddParameter("save", 2, iPosition:=6) - clsMaxValue.SetAssignTo(ucrSaveSpells.GetText) - clsMaxValue.SetAssignTo("Spells_Rain") + clsMaxValue.AddParameter("result_name", Chr(34) & ucrInputNewColumnName.GetText() & Chr(34), iPosition:=3) clsMaxValue.AddParameter("sub_calculations", clsRFunctionParameter:=clsMaxValueList, iPosition:=4) + clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) clsMaxValueList.AddParameter("sub1", clsRFunctionParameter:=clsSpellLength, bIncludeArgumentName:=False, iPosition:=0) clsMaxValueManipulation.AddParameter("sub2", clsRFunctionParameter:=clsGroupBy, bIncludeArgumentName:=False) clsMaxValueManipulation.AddParameter("sub3", clsRFunctionParameter:=clsDayFromAndTo, bIncludeArgumentName:=False) + clsMaxValue.SetAssignTo("Spells") clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("calc", clsRFunctionParameter:=clsMaxValue, iPosition:=0) @@ -252,6 +242,10 @@ Public Class dlgSpells ucrReceiverDOY.AddAdditionalCodeParameterPair(clsDayFromOperator, New RParameter("doy", 0), iAdditionalPairNo:=1) ucrReceiverRainfall.AddAdditionalCodeParameterPair(clsRRaindayLowerOperator, New RParameter("rain", 0), iAdditionalPairNo:=1) + ucrSelectorForSpells.SetRCode(clsAddKey, bReset) + ucrReceiverStation.SetRCode(clsAddKeyColName, bReset) + ucrReceiverDate.SetRCode(clsAddKeyColName, bReset) + ucrReceiverDOY.SetRCode(clsDayToOperator, bReset) ucrNudFrom.SetRCode(clsDayFromOperator, bReset) ucrNudTo.SetRCode(clsDayToOperator, bReset) @@ -259,14 +253,12 @@ Public Class dlgSpells ucrReceiverRainfall.SetRCode(clsRRaindayUpperOperator, bReset) ucrInputSpellLower.SetRCode(clsRRaindayLowerOperator, bReset) ucrInputSpellUpper.SetRCode(clsRRaindayUpperOperator, bReset) - - ucrReceiverStation.SetRCode(clsAddKeyColName, bReset) - ucrReceiverDate.SetRCode(clsAddKeyColName, bReset) - ucrSelectorForSpells.SetRCode(clsAddKey, bReset) + ucrInputNewColumnName.SetRCode(clsMaxValue, bReset) + ' ucrChkConditional.SetRCode(clsSubSpellLength1, bReset) End Sub - Private Sub TestOKEnabled() 'TODO2: check this sub works and everything is calling - If Not ucrReceiverRainfall.IsEmpty AndAlso ucrSaveSpells.IsComplete AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ucrInputSpellUpper.Text <> "" Then + Private Sub TestOKEnabled() + If Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrInputNewColumnName.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrInputSpellLower.Text <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ((ucrInputCondition.GetText = "Between" AndAlso ucrInputSpellUpper.Text <> "") OrElse ucrInputCondition.GetText <> "Between") Then ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) @@ -281,69 +273,43 @@ Public Class dlgSpells Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk frmMain.clsRLink.RunScript(clsAddKey.ToScript, strComment:="Spells: Defining column(s) as key") - - clsMaxValue.AddParameter("manipulations", clsRFunctionParameter:=clsMaxValueManipulation, iPosition:=5) 'TODO: move/fix this - - ' conditional is checked: - If ucrChkConditional.Checked Then - clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsAdditionalCondition, bIncludeArgumentName:=False) - Else - clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) - End If End Sub - Private Sub DayBoundaries() - clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") - End Sub - - Private Sub RainDays() - clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) - End Sub - - Private Sub TotalRainfall() - End Sub - - Private Sub DryPeriod() - End Sub - - - - Private Sub ucrInputSpellLower_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrInputSpellLower.ControlValueChanged, ucrInputSpellUpper.ControlValueChanged, ucrInputCondition.ControlValueChanged Select Case ucrInputCondition.GetText Case "<= Amount of Rain" ucrInputSpellUpper.Visible = False - clsRRaindayOperator.RemoveParameterByName("upper_operators") - clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") + clsRRaindayAndOperator.RemoveParameterByName("upper") + clsRRaindayUpperOperator.RemoveParameterByName("max") + clsRRaindayAndOperator.AddParameter("lower", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) + clsRRaindayLowerOperator.AddParameter("min", ucrInputSpellLower.GetText, iPosition:=1) clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) Case "Between" ' match(Rain>=LEFT & Rain<=RIGHT, 1, nomatch = 0) ucrInputSpellUpper.Visible = True - clsRRaindayOperator.RemoveParameterByName("upper_operators") - clsRRaindayOperator.RemoveParameterByName("lower_operators") + clsRRaindayAndOperator.AddParameter("lower", clsROperatorParameter:=clsRRaindayLowerOperator, iPosition:=0) + clsRRaindayLowerOperator.AddParameter("min", ucrInputSpellLower.GetText, iPosition:=1) + clsRRaindayAndOperator.AddParameter("upper", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) + clsRRaindayUpperOperator.AddParameter("max", ucrInputSpellUpper.GetText, iPosition:=1) clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayAndOperator, iPosition:=0) Case Else ucrInputSpellUpper.Visible = False - clsRRaindayOperator.RemoveParameterByName("lower_operators") - clsRRaindayOperator.RemoveParameterByName("lower_upper_operators") + clsRRaindayAndOperator.RemoveParameterByName("lower") + clsRRaindayLowerOperator.RemoveParameterByName("min") + clsRRaindayAndOperator.AddParameter("upper", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) + clsRRaindayUpperOperator.AddParameter("max", ucrInputSpellLower.GetText, iPosition:=1) clsRRaindayOperator.AddParameter("x", clsROperatorParameter:=clsRRaindayUpperOperator, iPosition:=0) End Select End Sub - Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged - RainDays() - End Sub - - Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged - DayBoundaries() + Private Sub DayBoundaries() + clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") End Sub - Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrSelectorForSpells.ControlContentsChanged - strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) - RainDays() + Private Sub RainDays() + clsRRainday.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverRainfall.GetVariableNames() & ")", iPosition:=0) End Sub - Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged - ' does this update if I change the data name? + Private Sub GroupByOptions() If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") Else @@ -351,17 +317,39 @@ Public Class dlgSpells End If End Sub + Private Sub ucrChkConditional_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrChkConditional.ControlContentsChanged + If ucrChkConditional.Checked Then + clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsAdditionalCondition, bIncludeArgumentName:=False) + Else + clsSubSpellLength1.AddParameter("sub1", clsRFunctionParameter:=clsRRainday, bIncludeArgumentName:=False) + End If + clsSpellLength.AddParameter("sub_calculations", clsRFunctionParameter:=clsSubSpellLength1, iPosition:=5) + End Sub + + Private Sub ucrSelectorForSpells_ControlContentsChanged(ucrchangedControl As ucrCore) Handles ucrSelectorForSpells.ControlContentsChanged + strCurrDataName = Chr(34) & ucrSelectorForSpells.ucrAvailableDataFrames.cboAvailableDataFrames.SelectedItem & Chr(34) + DayBoundaries() + RainDays() + GroupByOptions() + End Sub - Private Sub nudValues() - 'nudMaximumDays.Maximum = nudLengthofTime.Value - 1 - 'nudLengthofTime.Minimum = nudMaximumDays.Value + 1 + Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged + GroupByOptions() + End Sub + + Private Sub ucrReceiverRainfall_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlValueChanged + RainDays() + End Sub + + Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged + DayBoundaries() End Sub Private Sub ucrNudFrom_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudFrom.ControlValueChanged clsAdditionalConditionReplaceFunction.AddParameter("list", ucrNudFrom.Value - 1, iPosition:=1) End Sub - Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSaveSpells.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrNudTo.ControlContentsChanged, ucrInputSpellLower.ControlContentsChanged, ucrInputSpellUpper.ControlContentsChanged + Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverRainfall.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrInputNewColumnName.ControlContentsChanged, ucrInputCondition.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrNudTo.ControlContentsChanged, ucrInputSpellLower.ControlContentsChanged, ucrInputSpellUpper.ControlContentsChanged TestOKEnabled() End Sub End Class \ No newline at end of file From b15cfbc4a4bf6c49e662914b675c2b6c3cae17ac Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 23 Jun 2017 11:58:02 +0100 Subject: [PATCH 161/201] removing comments --- instat/dlgSpells.vb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/instat/dlgSpells.vb b/instat/dlgSpells.vb index 0c7f4684743..9d848934b72 100644 --- a/instat/dlgSpells.vb +++ b/instat/dlgSpells.vb @@ -43,7 +43,6 @@ Public Class dlgSpells Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 200 - Dim dctInputSumPairs As New Dictionary(Of String, String) ucrSelectorForSpells.SetParameter(New RParameter("data_name", 0)) ucrSelectorForSpells.SetParameterIsString() @@ -106,7 +105,6 @@ Public Class dlgSpells ucrInputNewColumnName.SetParameter(New RParameter("result_name", 2)) ucrInputNewColumnName.SetDataFrameSelector(ucrSelectorForSpells.ucrAvailableDataFrames) ucrInputNewColumnName.SetName("Spells") - ' ucrInputNewColumnName.SetSaveTypeAsColumn() End Sub Private Sub SetDefaults() @@ -139,7 +137,7 @@ Public Class dlgSpells ucrSelectorForSpells.Reset() ucrReceiverDate.SetMeAsReceiver() - ucrInputCondition.SetName("Between") 'TODO1: set item/name as this + ucrInputCondition.SetName("Between") ' key clsAddKey.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_key") @@ -185,7 +183,6 @@ Public Class dlgSpells clsRRaindayMatch.AddParameter("table", "1", iPosition:=1) clsRRaindayMatch.AddParameter("nomatch", "0", iPosition:=2) - ' We have: match(Rain >= LOWER & Rain <= UPPER, 1, nomatch = 0) ' Spell Length clsSpellLength.SetRCommand("instat_calculation$new") clsSpellLength.AddParameter("type", Chr(34) & "calculation" & Chr(34), iPosition:=0) From 8b7639f81f74d848179dccd54285e84e9884b8c0 Mon Sep 17 00:00:00 2001 From: Lily Date: Fri, 23 Jun 2017 12:13:01 +0100 Subject: [PATCH 162/201] Start of Rains bug fixes --- instat/dlgStartofRains.Designer.vb | 35 ++++++++++++++++++++--------- instat/dlgStartofRains.vb | 36 ++++++++++++++++-------------- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/instat/dlgStartofRains.Designer.vb b/instat/dlgStartofRains.Designer.vb index 40fba41802e..d3e20be8c94 100644 --- a/instat/dlgStartofRains.Designer.vb +++ b/instat/dlgStartofRains.Designer.vb @@ -61,7 +61,6 @@ Partial Class dlgStartofRains Me.lblDate = New System.Windows.Forms.Label() Me.lblYear = New System.Windows.Forms.Label() Me.ucrBase = New instat.ucrButtons() - Me.ucrSaveStartofRains = New instat.ucrSave() Me.lblStation = New System.Windows.Forms.Label() Me.ucrReceiverStation = New instat.ucrReceiverSingle() Me.ucrReceiverYear = New instat.ucrReceiverSingle() @@ -69,6 +68,8 @@ Partial Class dlgStartofRains Me.ucrReceiverDOY = New instat.ucrReceiverSingle() Me.ucrReceiverRainfall = New instat.ucrReceiverSingle() Me.ucrSelectorForStartofRains = New instat.ucrSelectorByDataFrameAddRemove() + Me.lblNewColumnName = New System.Windows.Forms.Label() + Me.ucrInputNewColumnName = New instat.ucrInputTextBox() Me.grpConditionsForSatrtofRains.SuspendLayout() Me.grpRainParameters.SuspendLayout() Me.SuspendLayout() @@ -493,13 +494,6 @@ Partial Class dlgStartofRains Me.ucrBase.Size = New System.Drawing.Size(405, 52) Me.ucrBase.TabIndex = 14 ' - 'ucrSaveStartofRains - ' - Me.ucrSaveStartofRains.Location = New System.Drawing.Point(9, 464) - Me.ucrSaveStartofRains.Name = "ucrSaveStartofRains" - Me.ucrSaveStartofRains.Size = New System.Drawing.Size(316, 24) - Me.ucrSaveStartofRains.TabIndex = 13 - ' 'lblStation ' Me.lblStation.AutoSize = True @@ -579,14 +573,34 @@ Partial Class dlgStartofRains Me.ucrSelectorForStartofRains.Size = New System.Drawing.Size(210, 180) Me.ucrSelectorForStartofRains.TabIndex = 0 ' + 'lblNewColumnName + ' + Me.lblNewColumnName.AutoSize = True + Me.lblNewColumnName.Location = New System.Drawing.Point(6, 472) + Me.lblNewColumnName.Name = "lblNewColumnName" + Me.lblNewColumnName.Size = New System.Drawing.Size(101, 13) + Me.lblNewColumnName.TabIndex = 23 + Me.lblNewColumnName.Text = "New Column Name:" + ' + 'ucrInputNewColumnName + ' + Me.ucrInputNewColumnName.AddQuotesIfUnrecognised = True + Me.ucrInputNewColumnName.IsMultiline = False + Me.ucrInputNewColumnName.IsReadOnly = False + Me.ucrInputNewColumnName.Location = New System.Drawing.Point(113, 470) + Me.ucrInputNewColumnName.Name = "ucrInputNewColumnName" + Me.ucrInputNewColumnName.Size = New System.Drawing.Size(187, 21) + Me.ucrInputNewColumnName.TabIndex = 22 + ' 'dlgStartofRains ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(696, 550) + Me.Controls.Add(Me.lblNewColumnName) + Me.Controls.Add(Me.ucrInputNewColumnName) Me.Controls.Add(Me.lblStation) Me.Controls.Add(Me.ucrReceiverStation) - Me.Controls.Add(Me.ucrSaveStartofRains) Me.Controls.Add(Me.ucrReceiverYear) Me.Controls.Add(Me.lblYear) Me.Controls.Add(Me.lblDate) @@ -641,7 +655,6 @@ Partial Class dlgStartofRains Friend WithEvents lblDPOverallInterval As Label Friend WithEvents lblDPLength As Label Friend WithEvents lblDPMaxRain As Label - Friend WithEvents ucrSaveStartofRains As ucrSave Friend WithEvents ucrNudTROverDays As ucrNud Friend WithEvents ucrNudTRPercentile As ucrNud Friend WithEvents lblStation As Label @@ -662,4 +675,6 @@ Partial Class dlgStartofRains Friend WithEvents ucrNudDPMaxRain As ucrNud Friend WithEvents ucrChkDrySpell As ucrCheck Friend WithEvents ucrChkDryPeriod As ucrCheck + Friend WithEvents lblNewColumnName As Label + Friend WithEvents ucrInputNewColumnName As ucrInputTextBox End Class \ No newline at end of file diff --git a/instat/dlgStartofRains.vb b/instat/dlgStartofRains.vb index d7e8771b6a7..7779893cc64 100644 --- a/instat/dlgStartofRains.vb +++ b/instat/dlgStartofRains.vb @@ -62,13 +62,13 @@ Public Class dlgStartofRains ucrSelectorForStartofRains.SetParameterIsString() ' setting receivers - ucrReceiverStation.SetParameter(New RParameter("station", 1)) + ucrReceiverStation.SetParameter(New RParameter("station", 1, False)) ucrReceiverStation.SetParameterIsString() ucrReceiverStation.Selector = ucrSelectorForStartofRains ucrReceiverStation.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "station" & Chr(34)}) ucrReceiverStation.bAutoFill = True - ucrReceiverDate.SetParameter(New RParameter("date", 0)) + ucrReceiverDate.SetParameter(New RParameter("date", 0, False)) ucrReceiverDate.SetParameterIsString() ucrReceiverDate.Selector = ucrSelectorForStartofRains ucrReceiverDate.AddIncludedMetadataProperty("Climatic_Type", {Chr(34) & "date" & Chr(34)}) @@ -185,11 +185,8 @@ Public Class dlgStartofRains ucrReceiverYear.bAutoFill = True 'save - ucrSaveStartofRains.SetDataFrameSelector(ucrSelectorForStartofRains.ucrAvailableDataFrames) - ucrSaveStartofRains.SetLabelText("New Column Name:") - ucrSaveStartofRains.SetIsTextBox() - ucrSaveStartofRains.SetPrefix("Start_of_Rains") - ucrSaveStartofRains.SetSaveTypeAsColumn() + ucrInputNewColumnName.SetDataFrameSelector(ucrSelectorForStartofRains.ucrAvailableDataFrames) + ucrInputNewColumnName.SetName("Start_of_Rains") End Sub Private Sub SetDefaults() @@ -251,7 +248,7 @@ Public Class dlgStartofRains clsDPCombineOperator.Clear() ucrReceiverDate.SetMeAsReceiver() - ucrSaveStartofRains.Reset() + ucrInputNewColumnName.Reset() ucrSelectorForStartofRains.Reset() ' Adding a key @@ -493,9 +490,9 @@ Public Class dlgStartofRains clsFirstDOYPerYear.AddParameter("function_exp", clsROperatorParameter:=clsFirstDOYPerYearOperator, iPosition:=1) clsFirstDOYPerYearOperator.SetOperation("[") clsFirstDOYPerYearOperator.AddParameter("rightside", "1 ]", iPosition:=1) - clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrSaveStartofRains.GetText() & Chr(34), iPosition:=2) ' do this right. + clsFirstDOYPerYear.AddParameter("result_name", Chr(34) & ucrInputNewColumnName.GetText() & Chr(34), iPosition:=2) clsFirstDOYPerYear.AddParameter("save", 2, iPosition:=6) - clsFirstDOYPerYear.SetAssignTo(ucrSaveStartofRains.ucrInputTextSave.GetText) + clsFirstDOYPerYear.SetAssignTo("Start_of_Rains") clsApplyInstatFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$run_instat_calculation") clsApplyInstatFunction.AddParameter("display", "FALSE", iPosition:=1) @@ -554,7 +551,7 @@ Public Class dlgStartofRains End Sub Private Sub TestOKEnabled() - If ucrSaveStartofRains.IsComplete AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.GetText <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.GetText <> "" AndAlso ucrNudRDOutOfDays.GetText <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso ucrNudTROverDays.GetText <> "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.GetText <> "") OrElse (rdoTRPercentile.Checked AndAlso ucrNudTRPercentile.GetText <> ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((ucrChkDrySpell.Checked AndAlso ucrNudDSMaximumDays.GetText <> "" AndAlso ucrNudDSLengthOfTime.GetText <> "") OrElse Not ucrChkDrySpell.Checked) AndAlso ((ucrChkDryPeriod.Checked AndAlso ucrNudDPMaxRain.GetText <> "" AndAlso ucrNudDPRainPeriod.GetText <> "" AndAlso ucrNudDPOverallInterval.GetText <> "") OrElse Not ucrChkDryPeriod.Checked) Then + If Not ucrInputNewColumnName.IsEmpty AndAlso Not ucrReceiverRainfall.IsEmpty AndAlso Not ucrReceiverDate.IsEmpty AndAlso Not ucrReceiverDOY.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty AndAlso ucrNudThreshold.GetText <> "" AndAlso ucrNudFrom.GetText <> "" AndAlso ucrNudTo.GetText <> "" AndAlso ((ucrChkNumberOfRainyDays.Checked AndAlso ucrNudRDMinimumDays.GetText <> "" AndAlso ucrNudRDOutOfDays.GetText <> "") OrElse Not ucrChkNumberOfRainyDays.Checked) AndAlso (((ucrChkTotalRainfall.Checked AndAlso ucrNudTROverDays.GetText <> "") AndAlso ((rdoTRAmount.Checked AndAlso ucrNudTRAmount.GetText <> "") OrElse (rdoTRPercentile.Checked AndAlso ucrNudTRPercentile.GetText <> ""))) OrElse Not ucrChkTotalRainfall.Checked) AndAlso ((ucrChkDrySpell.Checked AndAlso ucrNudDSMaximumDays.GetText <> "" AndAlso ucrNudDSLengthOfTime.GetText <> "") OrElse Not ucrChkDrySpell.Checked) AndAlso ((ucrChkDryPeriod.Checked AndAlso ucrNudDPMaxRain.GetText <> "" AndAlso ucrNudDPRainPeriod.GetText <> "" AndAlso ucrNudDPOverallInterval.GetText <> "") OrElse Not ucrChkDryPeriod.Checked) Then ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) @@ -591,6 +588,14 @@ Public Class dlgStartofRains End If End Sub + Private Sub GroupByOptions() + If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") + Else + clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") + End If + End Sub + Private Sub DayBoundaries() clsDayFromAndTo.AddParameter("calculated_from", " list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")") clsFirstDOYPerYear.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverDOY.GetVariableNames() & ")", iPosition:=4) @@ -618,6 +623,7 @@ Public Class dlgStartofRains RainDays() TotalRainfall() DryPeriod() + GroupByOptions() End Sub Private Sub ucrReceiverDOY_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverDOY.ControlValueChanged @@ -631,11 +637,7 @@ Public Class dlgStartofRains End Sub Private Sub ucrReceiverYear_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverYear.ControlValueChanged, ucrReceiverStation.ControlValueChanged - If Not ucrReceiverStation.IsEmpty AndAlso Not ucrReceiverYear.IsEmpty Then - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & "," & strCurrDataName & "=" & ucrReceiverStation.GetVariableNames & ")") - Else - clsGroupBy.AddParameter("calculated_from", "list(" & strCurrDataName & "=" & ucrReceiverYear.GetVariableNames & ")") - End If + GroupByOptions() End Sub Private Sub MaximumValuesControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrChkDryPeriod.ControlContentsChanged, ucrNudDPRainPeriod.ControlContentsChanged, ucrNudDPOverallInterval.ControlContentsChanged @@ -646,7 +648,7 @@ Public Class dlgStartofRains TestOKEnabled() End Sub - Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlContentsChanged, ucrSaveStartofRains.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrNudThreshold.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrChkNumberOfRainyDays.ControlContentsChanged, ucrNudRDMinimumDays.ControlContentsChanged, ucrNudRDOutOfDays.ControlContentsChanged, ucrChkTotalRainfall.ControlContentsChanged, ucrNudTROverDays.ControlContentsChanged, ucrPnlTRCalculateBy.ControlContentsChanged, ucrNudTRAmount.ControlContentsChanged, ucrNudTRPercentile.ControlContentsChanged, ucrChkDrySpell.ControlContentsChanged, ucrNudDSMaximumDays.ControlContentsChanged, ucrNudDSLengthOfTime.ControlContentsChanged, ucrNudDPMaxRain.ControlContentsChanged + Private Sub CoreControls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudTo.ControlContentsChanged, ucrReceiverRainfall.ControlContentsChanged, ucrInputNewColumnName.ControlContentsChanged, ucrReceiverDate.ControlContentsChanged, ucrReceiverDOY.ControlContentsChanged, ucrReceiverYear.ControlContentsChanged, ucrNudThreshold.ControlContentsChanged, ucrNudFrom.ControlContentsChanged, ucrChkNumberOfRainyDays.ControlContentsChanged, ucrNudRDMinimumDays.ControlContentsChanged, ucrNudRDOutOfDays.ControlContentsChanged, ucrChkTotalRainfall.ControlContentsChanged, ucrNudTROverDays.ControlContentsChanged, ucrPnlTRCalculateBy.ControlContentsChanged, ucrNudTRAmount.ControlContentsChanged, ucrNudTRPercentile.ControlContentsChanged, ucrChkDrySpell.ControlContentsChanged, ucrNudDSMaximumDays.ControlContentsChanged, ucrNudDSLengthOfTime.ControlContentsChanged, ucrNudDPMaxRain.ControlContentsChanged TestOKEnabled() End Sub End Class \ No newline at end of file From 3676e1d2ddc9b3904eabb65c49e5f0648ed74711 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Fri, 23 Jun 2017 13:47:33 +0100 Subject: [PATCH 163/201] implementing threading option and implemented for pop ups added timer for frmMain --- instat/clsRLink.vb | 71 +++++++++++++++++++++++++++++++++---------- instat/clsRSyntax.vb | 2 ++ instat/dlgView.vb | 2 ++ instat/frmMain.vb | 21 +++++++++++-- instat/ucrButtons.vb | 9 +++--- instat/ucrDataView.vb | 2 +- 6 files changed, 84 insertions(+), 23 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index eef3b6d4a26..89a4c13b8f9 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -16,13 +16,19 @@ Imports RDotNet Imports unvell.ReoGrid +Imports System.IO Public Class RLink ' R interface class. Each instance of the class has its own REngine instance Dim strClimateObjectPath As String = "/ClimateObject/R" 'new climateobject path Public strClimateObject As String = "ClimateObject" Dim strInstatObjectPath As String = "/InstatObject/R" 'path to the Instat object - Public strInstatDataObject As String = "InstatDataObject" + Public strInstatDataObject As String = "InstatDataObject" + + Private strLogFilePath As String = Path.Combine(Path.GetTempPath, "R-Instat_debug_log.txt") + Private bFirstRCode As Boolean = True + Private bDebugLogExists As Boolean = False + Public clsEngine As REngine Public rtbOutput As New ucrWPFRichTextBox Public txtLog As New TextBox @@ -231,7 +237,7 @@ Public Class RLink Return strNextDefault End Function - Public Sub RunScript(strScript As String, Optional iCallType As Integer = 0, Optional strComment As String = "") + Public Sub RunScript(strScript As String, Optional iCallType As Integer = 0, Optional strComment As String = "", Optional bSeparateThread As Boolean = True) Dim strCapturedScript As String Dim expTemp As RDotNet.SymbolicExpression Dim strTemp As String = "" @@ -284,11 +290,11 @@ Public Class RLink 'need to boost resolution of the devices, it's not as good as with ggsave. End If End If - Evaluate(strScript) + Evaluate(strScript, bSilent:=False, bSeparateThread:=bSeparateThread) If iCallType = 3 Then If strGraphDisplayOption = "view_output_window" OrElse strGraphDisplayOption = "view_separate_window" Then '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()") 'not quite sure if this would work, otherwise find the right way to close the appropriate devices. + Evaluate("graphics.off()", bSilent:=False, bSeparateThread:=bSeparateThread) '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. @@ -328,7 +334,7 @@ Public Class RLink Try 'TODO check this is valid syntax in all cases ' i.e. this is potentially: x <- y <- 1 - Evaluate(strTempAssignTo & " <- " & strScript) + Evaluate(strTempAssignTo & " <- " & strScript, bSilent:=False, bSeparateThread:=bSeparateThread) expTemp = GetSymbol(strTempAssignTo) If expTemp IsNot Nothing Then strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) @@ -344,7 +350,7 @@ Public Class RLink strSplitScript = Left(strScript, strScript.Trim(Environment.NewLine.ToCharArray).LastIndexOf(Environment.NewLine.ToCharArray)) If strSplitScript <> "" Then Try - Evaluate(strSplitScript) + Evaluate(strSplitScript, bSilent:=False, bSeparateThread:=bSeparateThread) 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 @@ -353,7 +359,7 @@ Public Class RLink strCapturedScript = "capture.output(" & strSplitScript & ")" End If Try - Evaluate(strTempAssignTo & " <- " & strCapturedScript) + Evaluate(strTempAssignTo & " <- " & strCapturedScript, bSilent:=False, bSeparateThread:=bSeparateThread) expTemp = GetSymbol(strTempAssignTo) If expTemp IsNot Nothing Then strTemp = String.Join(Environment.NewLine, expTemp.AsCharacter()) @@ -373,24 +379,24 @@ Public Class RLink frmMain.clsGrids.UpdateGrids() End Sub - Public Function RunInternalScriptGetValue(strScript As String, Optional strVariableName As String = ".temp_value", Optional bSilent As Boolean = False) As SymbolicExpression + Public Function RunInternalScriptGetValue(strScript As String, Optional strVariableName As String = ".temp_value", Optional bSilent As Boolean = False, Optional bSeparateThread As Boolean = True) As SymbolicExpression Dim expTemp As SymbolicExpression Dim strCommand As String expTemp = Nothing strCommand = strVariableName & "<-" & strScript If clsEngine IsNot Nothing Then - Evaluate(strCommand, bSilent:=bSilent) + Evaluate(strCommand, bSilent:=bSilent, bSeparateThread:=bSeparateThread) expTemp = GetSymbol(strVariableName, bSilent:=bSilent) End If Return expTemp End Function - Public Function RunInternalScriptGetOutput(strScript As String, Optional bSilent As Boolean = False) As CharacterVector + Public Function RunInternalScriptGetOutput(strScript As String, Optional bSilent As Boolean = False, Optional bSeparateThread As Boolean = True) As CharacterVector Dim chrTemp As CharacterVector Dim expTemp As SymbolicExpression - expTemp = RunInternalScriptGetValue("capture.output(" & strScript & ")", bSilent:=bSilent) + expTemp = RunInternalScriptGetValue("capture.output(" & strScript & ")", bSilent:=bSilent, bSeparateThread:=bSeparateThread) Try chrTemp = expTemp.AsCharacter() Catch ex As Exception @@ -402,7 +408,7 @@ Public Class RLink Return chrTemp End Function - Public Function RunInternalScript(strScript As String, Optional strVariableName As String = "", Optional bSilent As Boolean = False) As Boolean + Public Function RunInternalScript(strScript As String, Optional strVariableName As String = "", Optional bSilent As Boolean = False, Optional bSeparateThread As Boolean = True) As Boolean Dim strCommand As String Dim bReturn As Boolean @@ -412,7 +418,7 @@ Public Class RLink strCommand = strScript End If If clsEngine IsNot Nothing Then - bReturn = Evaluate(strCommand, bSilent:=bSilent) + bReturn = Evaluate(strCommand, bSilent:=bSilent, bSeparateThread:=bSeparateThread) Return bReturn Else Return False @@ -428,6 +434,40 @@ Public Class RLink Dim bReturn As Boolean = True If clsEngine IsNot Nothing Then + If bFirstRCode Then + Try + File.WriteAllText(strLogFilePath, "") + Using w As StreamWriter = File.AppendText(strLogFilePath) + w.WriteLine("****************************") + w.WriteLine("R-Instat debugging log file") + w.WriteLine("****************************") + w.WriteLine("Version: " & My.Application.Info.Version.ToString()) + w.WriteLine("****************************") + w.WriteLine("Created on: " & DateTime.Now) + w.WriteLine("User: " & Environment.UserName) + w.WriteLine("****************************") + End Using + bDebugLogExists = True + Catch ex As Exception + MsgBox("Could not create debug log file at:" & strLogFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") + bDebugLogExists = False + Finally + bFirstRCode = False + End Try + End If + Try + If bDebugLogExists Then + Dim ts As New Stopwatch + ts.Start() + Using w As StreamWriter = File.AppendText(strLogFilePath) + w.WriteLine(strScript) + End Using + ts.Stop() + Console.WriteLine(ts.ElapsedMilliseconds) + End If + Catch ex As Exception + MsgBox("Could not add text to debug log file at:" & strLogFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") + End Try Try If bSeparateThread Then thrRScript = New Threading.Thread(Sub() @@ -444,15 +484,14 @@ Public Class RLink Dim t As New Stopwatch t.Start() While t.ElapsedMilliseconds < 500 AndAlso thrRScript.IsAlive - Threading.Thread.Sleep(50) - Console.WriteLine(t.ElapsedMilliseconds) + Threading.Thread.Sleep(5) End While evtWaitHandleDelayDone.Set() End Sub) thrWaitDisplay = New Threading.Thread(Sub() 'frmWaiting.Show() While thrRScript.IsAlive - Threading.Thread.Sleep(50) + Threading.Thread.Sleep(5) Application.DoEvents() End While 'frmWaiting.Hide() diff --git a/instat/clsRSyntax.vb b/instat/clsRSyntax.vb index 9f09eaf9249..2a7012e5d48 100644 --- a/instat/clsRSyntax.vb +++ b/instat/clsRSyntax.vb @@ -41,6 +41,8 @@ Public Class RSyntax Public i As Integer Public bExcludeAssignedFunctionOutput As Boolean = True + Public bSeparateThread As Boolean = True + Public Sub SetFunction(strFunctionName As String) 'Warning: confusing name clsBaseFunction.SetRCommand(strFunctionName) diff --git a/instat/dlgView.vb b/instat/dlgView.vb index 5b02f4ca216..809b3367f00 100644 --- a/instat/dlgView.vb +++ b/instat/dlgView.vb @@ -37,6 +37,8 @@ Public Class dlgView Private Sub InitialiseDialog() ucrBase.iHelpTopicID = 32 + 'Needed because window may pop up window which will disappear in a separate thread + ucrBase.clsRsyntax.bSeparateThread = False ucrReceiverView.SetParameter(New RParameter("x", 0)) ucrReceiverView.SetParameterIsRFunction() diff --git a/instat/frmMain.vb b/instat/frmMain.vb index d392df5657a..97054e0e078 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -22,7 +22,6 @@ Imports System.ComponentModel Imports System.Runtime.Serialization.Formatters.Binary Public Class frmMain - Public clsRLink As New RLink Public clsGrids As New clsGridLink Public strStaticPath As String @@ -36,6 +35,7 @@ Public Class frmMain Public strSaveFilePath As String Private mnuItems As New List(Of Form) Private ctrActive As Control + Private WithEvents timer As New System.Windows.Forms.Timer 'This is the default data frame to appear in the data frame selector 'If "" the current worksheet will be used @@ -43,9 +43,18 @@ Public Class frmMain ' User can choose a default data frame or set the default as the current worksheet Public strDefaultDataFrame As String = "" + Public Sub New() + + ' This call is required by the designer. + InitializeComponent() + + ' Add any initialization after the InitializeComponent() call. + End Sub + Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load InitialiseOutputWindow() - + timer.Interval = 5000 + timer.Start() mnuHelpAboutRInstat.Visible = False clsGrids.SetDataViewer(ucrDataViewer) @@ -1413,6 +1422,14 @@ Public Class frmMain dlgCumulativeDistribution.ShowDialog() End Sub + Private Sub timer_Tick(sender As Object, e As EventArgs) Handles timer.Tick + timer.Stop() + 'Check if idle + + 'Save file + timer.Start() + End Sub + 'Private Sub TESTToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles TESTToolStripMenuItem.Click ' 'TEST temporary diff --git a/instat/ucrButtons.vb b/instat/ucrButtons.vb index 9805a5b62a7..1ec7b8474a7 100644 --- a/instat/ucrButtons.vb +++ b/instat/ucrButtons.vb @@ -114,7 +114,7 @@ Public Class ucrButtons strComment = "" End If If bRun Then - frmMain.clsRLink.RunScript(lstBeforeScripts(i), iCallType:=lstBeforeCodes(i).iCallType, strComment:=strComment) + frmMain.clsRLink.RunScript(lstBeforeScripts(i), iCallType:=lstBeforeCodes(i).iCallType, strComment:=strComment, bSeparateThread:=clsRsyntax.bSeparateThread) Else frmMain.AddToScriptWindow(lstBeforeScripts(i)) End If @@ -123,11 +123,12 @@ Public Class ucrButtons 'Run base code from RSyntax If bRun Then If bFirstCode Then - frmMain.clsRLink.RunScript(clsRsyntax.GetScript(), clsRsyntax.iCallType, strComment:=strComments) + strComment = strComments bFirstCode = False Else - frmMain.clsRLink.RunScript(clsRsyntax.GetScript(), clsRsyntax.iCallType, strComment:="") + strComment = "" End If + frmMain.clsRLink.RunScript(clsRsyntax.GetScript(), clsRsyntax.iCallType, strComment:=strComment, bSeparateThread:=clsRsyntax.bSeparateThread) Else frmMain.AddToScriptWindow(clsRsyntax.GetScript()) End If @@ -147,7 +148,7 @@ Public Class ucrButtons Else strComment = "" End If - frmMain.clsRLink.RunScript(lstAfterScripts(i), iCallType:=lstAfterCodes(i).iCallType, strComment:=strComment) + frmMain.clsRLink.RunScript(lstAfterScripts(i), iCallType:=lstAfterCodes(i).iCallType, strComment:=strComment, bSeparateThread:=clsRsyntax.bSeparateThread) Else frmMain.AddToScriptWindow(lstAfterScripts(i)) End If diff --git a/instat/ucrDataView.vb b/instat/ucrDataView.vb index 5a5eeb63ed5..87f8e6a01c7 100644 --- a/instat/ucrDataView.vb +++ b/instat/ucrDataView.vb @@ -659,7 +659,7 @@ Public Class ucrDataView Private Sub ViewSheet_Click(sender As Object, e As EventArgs) Handles ViewSheet.Click clsViewDataFrame.AddParameter("x", clsRFunctionParameter:=clsGetDataFrame) clsViewDataFrame.AddParameter("title", Chr(34) & grdCurrSheet.Name & Chr(34)) - frmMain.clsRLink.RunScript(clsViewDataFrame.ToScript, strComment:="Right Click Menu: View R Data Frame") + frmMain.clsRLink.RunScript(clsViewDataFrame.ToScript, strComment:="Right Click Menu: View R Data Frame", bSeparateThread:=False) End Sub Private Sub mnuConvertDate_Click(sender As Object, e As EventArgs) Handles mnuConvertToDate.Click From 9da8b1ec20edb0d663fdb2988c061473360df5da Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 23 Jun 2017 16:12:45 +0300 Subject: [PATCH 164/201] Setting up linking --- instat/dlgRegressionSimple.vb | 81 ++++++++----------- instat/sdgSimpleRegOptions.Designer.vb | 2 +- instat/sdgSimpleRegOptions.vb | 105 ++++++++++++++++--------- instat/sdgVariableTransformations.vb | 3 +- 4 files changed, 100 insertions(+), 91 deletions(-) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index bfc771ebc15..5569212d8ae 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -41,10 +41,12 @@ Public Class dlgRegressionSimple Private Sub SetRCodeForControls(bReset) ucrResponse.SetRCode(clsFormulaOperator, bReset) ucrExplanatory.SetRCode(clsFormulaOperator, bReset) - ucrSelectorSimpleReg.SetRCode(clsRLmOrGLM, bReset) + ucrSelectorSimpleReg.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) ucrPnlModelType.SetRCode(clsRLmOrGLM, bReset) - ucrSaveModels.SetRCode(clsRLmOrGLM, bReset) - ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) + ucrSaveModels.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + ' ucrResponse.AddAdditionalCodeParameterPair(clsGLM, ucrResponse.GetParameter, iAdditionalPairNo:=1) + ' ucrExplanatory.AddAdditionalCodeParameterPair(clsGLM, ucrExplanatory.GetParameter, iAdditionalPairNo:=1) + 'ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, New RParameter("data"), iAdditionalPairNo:=1) ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) ' ucrResponse.AddAdditionalCodeParameterPair(clsRConvert, New RParameter("x", 1)) @@ -63,7 +65,7 @@ Public Class dlgRegressionSimple Private Sub InitialiseDialog() ucrBase.clsRsyntax.iCallType = 2 - cmdModelOptions.Enabled = False + ' cmdModelOptions.Enabled = False ucrResponse.Selector = ucrSelectorSimpleReg ucrExplanatory.Selector = ucrSelectorSimpleReg @@ -139,7 +141,7 @@ Public Class dlgRegressionSimple 'sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) 'sdgSimpleRegOptions.SetRYVariable(ucrResponse) ' sdgSimpleRegOptions.SetRXVariable(ucrExplanatory) - ' sdgModelOptions.SetRCIFunction(clsRCIFunction) + sdgModelOptions.SetRCIFunction(clsRCIFunction) End Sub @@ -195,6 +197,8 @@ Public Class dlgRegressionSimple clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmOrGLM.Clone clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) + clsGLM.SetRCommand("glm") + clsGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) 'Residual Plots @@ -212,8 +216,8 @@ Public Class dlgRegressionSimple 'FitModel clsRggplotFunction = clsRegressionDefaults.clsDefaultRggplot.Clone clsRggplotFunction.AddParameter("type", Chr(34) & "conditional" & Chr(34)) - clsRggplotFunction.AddParameter("scale", Chr(34) & "linear" & Chr(34)) - clsRggplotFunction.AddParameter("rug", "TRUE") + ' clsRggplotFunction.AddParameter("scale", Chr(34) & "linear" & Chr(34)) + ' clsRggplotFunction.AddParameter("rug", "TRUE") clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsRLmOrGLM) clsRggplotFunction.iCallType = 3 @@ -287,9 +291,6 @@ Public Class dlgRegressionSimple clsRPoisson.SetPackageName("stats") clsRPoisson.SetRCommand("poisson.test") - clsGLM.SetRCommand("glm") - clsGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator) - clsRFTest.SetPackageName("stats") clsRFTest.SetRCommand("var.test") @@ -312,7 +313,7 @@ Public Class dlgRegressionSimple clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempModel:="last_model", bAssignToIsPrefix:=True) 'sdgSimpleRegOptions.SetDefaults() - 'sdgModelOptions.SetDefaults() + sdgModelOptions.SetDefaults() ucrModelPreview.SetName("") SetRCode() ucrFamily.SetGLMDistributions() @@ -353,7 +354,7 @@ Public Class dlgRegressionSimple Private Sub ucrChkFunction_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkFunction.ControlValueChanged If ucrChkFunction.Checked Then - sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsRLmOrGLM, clsNewFormulaOperator:=clsFormulaOperator, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel, clsNewFunction:=clsRCIFunction) + sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsRLmOrGLM, clsNewFormulaOperator:=clsFormulaOperator, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel) sdgVariableTransformations.ShowDialog() ExplanatoryFunctionSelect() bResetSubDialog = False @@ -375,6 +376,7 @@ Public Class dlgRegressionSimple Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged clsRYVariable = ucrResponse.GetVariableNames(bWithQuotes:=False) Preview() + SetEnableDists() End Sub @@ -382,7 +384,6 @@ Public Class dlgRegressionSimple ConvertToVariate() TestOKEnabled() DataTypeAccepted() - SetEnableDists() End Sub Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged @@ -391,10 +392,10 @@ Public Class dlgRegressionSimple End Sub - 'Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click - ' sdgModelOptions.ShowDialog() - ' ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) - 'End Sub + Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click + sdgModelOptions.ShowDialog() + ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) + End Sub Private Sub SetTTest() @@ -625,7 +626,6 @@ Public Class dlgRegressionSimple End Sub Private Sub ucrSelectorSimpleReg_DataFrameChanged() Handles ucrSelectorSimpleReg.ControlValueChanged - AssignModelName() SetRCode() End Sub @@ -655,7 +655,7 @@ Public Class dlgRegressionSimple Else If ucrFamily.lstCurrentDistributions.Count = 0 OrElse ucrResponse.IsEmpty() Then ucrFamily.ucrInputDistributions.SetName("") - cmdModelOptions.Enabled = False + ' cmdModelOptions.Enabled = False Else cmdModelOptions.Enabled = True End If @@ -709,10 +709,7 @@ Public Class dlgRegressionSimple Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset SetDefaults() - End Sub - - Private Sub ucrModelName_NameChanged() - AssignModelName() + SetRCodeForControls(True) TestOKEnabled() End Sub @@ -728,24 +725,9 @@ Public Class dlgRegressionSimple 'Else ' ucrModelName.Visible = False 'End If - AssignModelName() TestOKEnabled() End Sub - Private Sub AssignModelName() - 'If chkSaveModel.Checked AndAlso Not ucrModelName.IsEmpty Then - ' ucrBase.clsRsyntax.SetAssignTo(ucrModelName.GetText, strTempModel:=ucrModelName.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text) - ' If rdoGeneral.Checked Then - ' ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = True - ' Else - ' ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False - ' End If - 'Else - ' ucrBase.clsRsyntax.SetAssignTo("last_model", strTempModel:="last_model", strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text) - ' ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False - 'End If - End Sub - Private Sub chkFunction_CheckedChanged() Handles ucrChkFunction.ControlValueChanged If ucrChkFunction.Checked Then ExplanatoryFunctionSelect() @@ -835,20 +817,10 @@ Public Class dlgRegressionSimple End Sub Private Sub rdoTop_CheckedChanged(sender As Object, e As EventArgs) - If rdoGeneralCase.Checked Then - ucrFamily.SetGLMDistributions() - Else - ucrFamily.SetExactDistributions() - End If - ucrFamily.ucrInputDistributions.SetName("") - SetRCode() - TestOKEnabled() - DataTypeAccepted() - AssignModelName() - ConvertToVariate() + End Sub - Private Sub ucrFamily_EnabledChanged(sender As Object, e As EventArgs) Handles ucrFamily.EnabledChanged + Private Sub ucrFamily_EnabledChanged() Handles ucrFamily.EnabledChanged DataTypeAccepted() TestOKEnabled() SetEnableDists() @@ -859,6 +831,15 @@ Public Class dlgRegressionSimple End Sub Private Sub ucrPnlModelType_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlModelType.ControlValueChanged + If rdoGeneralCase.Checked Then + ucrFamily.SetGLMDistributions() + Else + ucrFamily.SetExactDistributions() + End If + ucrFamily.ucrInputDistributions.SetName("") SetRCode() + TestOKEnabled() + DataTypeAccepted() + ConvertToVariate() End Sub End Class \ No newline at end of file diff --git a/instat/sdgSimpleRegOptions.Designer.vb b/instat/sdgSimpleRegOptions.Designer.vb index 14117c639b4..5cb3ded3d53 100644 --- a/instat/sdgSimpleRegOptions.Designer.vb +++ b/instat/sdgSimpleRegOptions.Designer.vb @@ -370,11 +370,11 @@ Partial Class sdgSimpleRegOptions Me.tbResiduals.Controls.Add(Me.rdoScaleLocation) Me.tbResiduals.Controls.Add(Me.rdoQQ) Me.tbResiduals.Controls.Add(Me.rdoResidualsFitted) - Me.tbResiduals.Controls.Add(Me.grpIndividualPlots) Me.tbResiduals.Controls.Add(Me.grpMultiplePlots) Me.tbResiduals.Controls.Add(Me.ucrPnlIndividualPlots) Me.tbResiduals.Controls.Add(Me.ucrChkIndividualPlots) Me.tbResiduals.Controls.Add(Me.ucrChkMultiplePlots) + Me.tbResiduals.Controls.Add(Me.grpIndividualPlots) Me.tbResiduals.Location = New System.Drawing.Point(4, 22) Me.tbResiduals.Name = "tbResiduals" Me.tbResiduals.Padding = New System.Windows.Forms.Padding(3) diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 856b96d0353..e1edcb9c758 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -51,8 +51,8 @@ Public Class sdgSimpleRegOptions ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) - ucrChkMultiplePlots.SetText("Multiple Plots") - ucrChkIndividualPlots.SetText("Individual Plots") + + ucrChkFittedModel.SetText("Fitted Model") ucrSaveFittedColumnName.SetPrefix("Fitted") @@ -80,15 +80,7 @@ Public Class sdgSimpleRegOptions ucrSaveLeverageColumnName.SetDataFrameSelector(clsRDataFrame) ucrSaveLeverageColumnName.SetAssignToIfUncheckedValue("last_Lever") - 'Graphics Model - ucrChkMultiplePlots.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkMultiplePlots.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkMultiplePlots.AddToLinkedControls(ucrChkPartial, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkMultiplePlots.AddToLinkedControls(ucrChkRugs, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkRugs.AddToLinkedControls(ucrPnlPartial12, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkMultiplePlots.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkMultiplePlots.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - + 'Multiple Plots (Autoplot function) ucrPnlMutiplePlots.AddRadioButton(rdoFourPlots) ucrPnlMutiplePlots.AddRadioButton(rdoSixPlots2Rows) ucrPnlMutiplePlots.AddRadioButton(rdoSixPlots3Rows) @@ -96,13 +88,52 @@ Public Class sdgSimpleRegOptions ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoSixPlots2Rows, {"autoplot"}) ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoSixPlots3Rows, {"autoplot"}) + ucrChkMultiplePlots.AddFunctionNamesCondition(False, "autoplot") + ucrChkMultiplePlots.SetText("Multiple Plots") + ucrChkMultiplePlots.AddToLinkedControls(ucrPnlMutiplePlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoFourPlots) + ' ucrPnlMutiplePlots.SetLinkedDisplayControl(grpMultiplePlots) + + 'Individual Plots (Autoplot function) + ucrPnlIndividualPlots.AddRadioButton(rdoResidualsFitted) + ucrPnlIndividualPlots.AddRadioButton(rdoQQ) + ucrPnlIndividualPlots.AddRadioButton(rdoResidualsLeverage) + ucrPnlIndividualPlots.AddRadioButton(rdoScaleLocation) + ucrPnlIndividualPlots.AddRadioButton(rdoCooksDistanceLeverage) + ucrPnlIndividualPlots.AddRadioButton(rdoCooksDistance) + ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoResidualsFitted, {"autoplot"}) + ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoQQ, {"autoplot"}) + ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoResidualsLeverage, {"autoplot"}) + ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoScaleLocation, {"autoplot"}) + ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoCooksDistanceLeverage, {"autoplot"}) + ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoCooksDistance, {"autoplot"}) + + ucrChkIndividualPlots.AddFunctionNamesCondition(False, "autoplot") + ucrChkIndividualPlots.SetText("Individual Plots") + ucrChkIndividualPlots.AddToLinkedControls(ucrPnlIndividualPlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoResidualsFitted) + 'ucrPnlIndividualPlots.SetLinkedDisplayControl(grpIndividualPlots) + + 'Fitting Models Plots (Visreg) + ucrChkFittedModel.AddFunctionNamesCondition(False, "visreg") + ''type ucrPnlPlotType.SetParameter(New RParameter("type")) ucrPnlPlotType.AddRadioButton(rdoConditional, Chr(34) & "conditional" & Chr(34)) ucrPnlPlotType.AddRadioButton(rdoContrast, Chr(34) & "contrast" & Chr(34)) + ucrChkFittedModel.AddToLinkedControls(ucrPnlPlotType, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ''scale ucrPnlScale.SetParameter(New RParameter("scale")) ucrPnlScale.AddRadioButton(rdoLinear, Chr(34) & "linear" & Chr(34)) ucrPnlScale.AddRadioButton(rdoResponse, Chr(34) & "response" & Chr(34)) + ucrChkFittedModel.AddToLinkedControls(ucrPnlScale, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrPnlScale.SetRDefault(Chr(34) & "linear" & Chr(34)) + + ucrChkFittedModel.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrChkPartial, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrChkRugs, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkRugs.AddToLinkedControls(ucrPnlPartial12, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkRugs.SetText("Rugs") ucrPnlPartial12.SetParameter(New RParameter("rug")) @@ -116,6 +147,9 @@ Public Class sdgSimpleRegOptions ucrChkJitter.SetRDefault("FALSE") ucrNudGraphicsCLevel.SetParameter(New RParameter("alpha")) + ucrNudGraphicsCLevel.DecimalPlaces = 2 + ucrNudGraphicsCLevel.Increment = 0.01 + ucrNudGraphicsCLevel.SetMinMax(0, 1) ucrNudWhiteSpace.SetParameter(New RParameter("whitespace")) ucrChkPartial.SetText("Partial") @@ -201,7 +235,11 @@ Public Class sdgSimpleRegOptions ucrNudWhiteSpace.SetRCode(clsRggplotFunction, bReset) ucrChkPartial.SetRCode(clsRggplotFunction, bReset) ucrPnlPartial12.SetRCode(clsRggplotFunction, bReset) - ' ucrPnlMutiplePlots.SetRSyntax(clsRSyntax) + ucrChkIndividualPlots.SetRCode(clsRResidualPlotsFunction, bReset) + ucrPnlIndividualPlots.SetRCode(clsRResidualPlotsFunction, bReset) + ucrChkMultiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) + ucrPnlMutiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) + ucrChkFittedModel.SetRCode(clsRggplotFunction, bReset) End Sub Private Sub ucrChkANOVA_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkANOVA.ControlValueChanged @@ -258,15 +296,6 @@ Public Class sdgSimpleRegOptions clsRDataFrame = clsRDataFr End Sub - - Public Sub ResidualPlots() - 'clsRGraphics.SetOperation("+") - 'clsRResidualPlotsFunction.SetPackageName("ggplot2") - 'clsRResidualPlotsFunction.SetRCommand("autoplot") - 'clsRResidualPlotsFunction.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) - 'clsRgeom_point.SetRCommand("geom_point") - End Sub - Private Sub ConfidenceInterval() clsRCIFunction.SetRCommand("confint") clsRCIFunction.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) @@ -276,29 +305,29 @@ Public Class sdgSimpleRegOptions Private Sub chkMultiplePlots_CheckedChanged(sender As Object, e As EventArgs) - GraphMultiplePlots() + 'GraphMultiplePlots() End Sub Private Sub GraphMultiplePlots() - If ucrChkMultiplePlots.Checked Then - ucrChkFittedModel.Checked = False - ucrChkIndividualPlots.Checked = False - grpMultiplePlots.Enabled = True - rdoFourPlots.Checked = True - Else - grpMultiplePlots.Enabled = False - End If + 'If ucrChkMultiplePlots.Checked Then + ' ucrChkFittedModel.Checked = False + ' ucrChkIndividualPlots.Checked = False + ' grpMultiplePlots.Enabled = True + ' rdoFourPlots.Checked = True + 'Else + ' grpMultiplePlots.Enabled = False + 'End If End Sub Private Sub GraphIndividualPlots() - If ucrChkIndividualPlots.Checked Then - ucrChkFittedModel.Checked = False - ucrChkMultiplePlots.Checked = False - grpIndividualPlots.Enabled = True - rdoResidualsFitted.Checked = True - Else - grpIndividualPlots.Enabled = False - End If + 'If ucrChkIndividualPlots.Checked Then + ' ucrChkFittedModel.Checked = False + ' ucrChkMultiplePlots.Checked = False + ' grpIndividualPlots.Enabled = True + ' rdoResidualsFitted.Checked = True + 'Else + ' grpIndividualPlots.Enabled = False + 'End If End Sub Private Sub chkIndividualPlots_CheckedChanged(sender As Object, e As EventArgs) diff --git a/instat/sdgVariableTransformations.vb b/instat/sdgVariableTransformations.vb index 7bfdc641ba8..0df7d6aa7a7 100644 --- a/instat/sdgVariableTransformations.vb +++ b/instat/sdgVariableTransformations.vb @@ -42,7 +42,7 @@ Public Class sdgVariableTransformations bControlsInitialised = True End Sub - Public Sub SetRCodeForControls(clsNewLMorGLM As RFunction, clsNewFunction As RFunction, clsNewFormulaOperator As ROperator, clsRModelNew As ROperator, clsRYVariableNew As String, clsRXVariableNew As String, Optional bReset As Boolean = False) + Public Sub SetRCodeForControls(clsNewLMorGLM As RFunction, clsNewFormulaOperator As ROperator, clsRModelNew As ROperator, clsRYVariableNew As String, clsRXVariableNew As String, Optional bReset As Boolean = False) If bControlsInitialised Then InitialiseControls() End If @@ -51,7 +51,6 @@ Public Class sdgVariableTransformations clsRYVariable = clsRYVariableNew clsRModel = clsRModelNew clsFormulaOperator = clsNewFormulaOperator - clsRCIFunction = clsNewFunction ucrPnlGenerateFunctions.SetRCode(clsLMorGLM, bReset) End Sub From d94050e312e904a9441ff6a7580ad7d1283091d5 Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 23 Jun 2017 17:26:18 +0300 Subject: [PATCH 165/201] Display setrcode change and more changes --- instat/dlgRegressionSimple.vb | 2 +- instat/sdgSimpleRegOptions.Designer.vb | 12 ++++---- instat/sdgSimpleRegOptions.vb | 41 ++++++++++++++++---------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 5569212d8ae..2d20619972a 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -216,8 +216,8 @@ Public Class dlgRegressionSimple 'FitModel clsRggplotFunction = clsRegressionDefaults.clsDefaultRggplot.Clone clsRggplotFunction.AddParameter("type", Chr(34) & "conditional" & Chr(34)) - ' clsRggplotFunction.AddParameter("scale", Chr(34) & "linear" & Chr(34)) ' clsRggplotFunction.AddParameter("rug", "TRUE") + clsRggplotFunction.AddParameter("alpha", clsRFunctionParameter:=clsRLmOrGLM) clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsRLmOrGLM) clsRggplotFunction.iCallType = 3 diff --git a/instat/sdgSimpleRegOptions.Designer.vb b/instat/sdgSimpleRegOptions.Designer.vb index 5cb3ded3d53..5435514a6be 100644 --- a/instat/sdgSimpleRegOptions.Designer.vb +++ b/instat/sdgSimpleRegOptions.Designer.vb @@ -126,8 +126,8 @@ Partial Class sdgSimpleRegOptions Me.tbModel.Controls.Add(Me.grpRugs) Me.tbModel.Controls.Add(Me.lblWhiteSpace) Me.tbModel.Controls.Add(Me.lblGraphicsSignLevel) - Me.tbModel.Controls.Add(Me.grpScale) Me.tbModel.Controls.Add(Me.grpPlotType) + Me.tbModel.Controls.Add(Me.grpScale) Me.tbModel.Location = New System.Drawing.Point(4, 22) Me.tbModel.Name = "tbModel" Me.tbModel.Padding = New System.Windows.Forms.Padding(3) @@ -577,7 +577,7 @@ Partial Class sdgSimpleRegOptions 'ucrChkPvalues ' Me.ucrChkPvalues.Checked = False - Me.ucrChkPvalues.Location = New System.Drawing.Point(142, 45) + Me.ucrChkPvalues.Location = New System.Drawing.Point(147, 35) Me.ucrChkPvalues.Name = "ucrChkPvalues" Me.ucrChkPvalues.Size = New System.Drawing.Size(113, 20) Me.ucrChkPvalues.TabIndex = 11 @@ -585,7 +585,7 @@ Partial Class sdgSimpleRegOptions 'ucrChkEstimates ' Me.ucrChkEstimates.Checked = False - Me.ucrChkEstimates.Location = New System.Drawing.Point(10, 65) + Me.ucrChkEstimates.Location = New System.Drawing.Point(10, 59) Me.ucrChkEstimates.Name = "ucrChkEstimates" Me.ucrChkEstimates.Size = New System.Drawing.Size(113, 20) Me.ucrChkEstimates.TabIndex = 10 @@ -593,7 +593,7 @@ Partial Class sdgSimpleRegOptions 'ucrChkDisplayCLimits ' Me.ucrChkDisplayCLimits.Checked = False - Me.ucrChkDisplayCLimits.Location = New System.Drawing.Point(10, 88) + Me.ucrChkDisplayCLimits.Location = New System.Drawing.Point(10, 83) Me.ucrChkDisplayCLimits.Name = "ucrChkDisplayCLimits" Me.ucrChkDisplayCLimits.Size = New System.Drawing.Size(113, 20) Me.ucrChkDisplayCLimits.TabIndex = 9 @@ -601,7 +601,7 @@ Partial Class sdgSimpleRegOptions 'ucrChkANOVA ' Me.ucrChkANOVA.Checked = False - Me.ucrChkANOVA.Location = New System.Drawing.Point(10, 38) + Me.ucrChkANOVA.Location = New System.Drawing.Point(10, 35) Me.ucrChkANOVA.Name = "ucrChkANOVA" Me.ucrChkANOVA.Size = New System.Drawing.Size(113, 20) Me.ucrChkANOVA.TabIndex = 8 @@ -609,7 +609,7 @@ Partial Class sdgSimpleRegOptions 'ucrChkModel ' Me.ucrChkModel.Checked = False - Me.ucrChkModel.Location = New System.Drawing.Point(10, 15) + Me.ucrChkModel.Location = New System.Drawing.Point(10, 11) Me.ucrChkModel.Name = "ucrChkModel" Me.ucrChkModel.Size = New System.Drawing.Size(113, 20) Me.ucrChkModel.TabIndex = 7 diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index e1edcb9c758..6fc4a88c294 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -33,24 +33,28 @@ Public Class sdgSimpleRegOptions Private Sub InitialiseControls() ucrChkModel.SetText("Model") - ucrChkModel.AddRSyntaxContainsFunctionNamesCondition(True, {"formula"}) + ucrChkModel.AddFunctionNamesCondition(True, "formula") ucrChkANOVA.SetText("ANOVA") - ucrChkANOVA.AddRSyntaxContainsFunctionNamesCondition(True, {"anova"}) + ucrChkANOVA.AddFunctionNamesCondition(True, "anova") ucrChkEstimates.SetText("Estimates") - ucrChkEstimates.AddRSyntaxContainsFunctionNamesCondition(True, {"summary"}) + ucrChkEstimates.AddFunctionNamesCondition(True, "summary") ucrChkDisplayCLimits.SetText("Confidence Limits") - ucrChkDisplayCLimits.AddRSyntaxContainsFunctionNamesCondition(True, {"confint"}) + ucrChkDisplayCLimits.AddFunctionNamesCondition(True, "confint") ucrChkPvalues.SetText("P-Values") - ucrChkPvalues.AddRSyntaxContainsFunctionNamesCondition(True, {"anova"}) - - ucrChkPvalues.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) + ucrChkPvalues.AddFunctionNamesCondition(True, "anova") + ucrNudDisplayCLevel.SetParameter(New RParameter("level")) + ucrNudDisplayCLevel.DecimalPlaces = 2 + ucrNudDisplayCLevel.Increment = 0.01 + ucrNudDisplayCLevel.SetMinMax(0, 1) + ucrChkDisplayCLimits.AddParameterPresentCondition(False, "level") + ucrChkDisplayCLimits.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) ucrChkFittedModel.SetText("Fitted Model") @@ -91,7 +95,6 @@ Public Class sdgSimpleRegOptions ucrChkMultiplePlots.AddFunctionNamesCondition(False, "autoplot") ucrChkMultiplePlots.SetText("Multiple Plots") ucrChkMultiplePlots.AddToLinkedControls(ucrPnlMutiplePlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoFourPlots) - ' ucrPnlMutiplePlots.SetLinkedDisplayControl(grpMultiplePlots) 'Individual Plots (Autoplot function) ucrPnlIndividualPlots.AddRadioButton(rdoResidualsFitted) @@ -110,7 +113,6 @@ Public Class sdgSimpleRegOptions ucrChkIndividualPlots.AddFunctionNamesCondition(False, "autoplot") ucrChkIndividualPlots.SetText("Individual Plots") ucrChkIndividualPlots.AddToLinkedControls(ucrPnlIndividualPlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoResidualsFitted) - 'ucrPnlIndividualPlots.SetLinkedDisplayControl(grpIndividualPlots) 'Fitting Models Plots (Visreg) ucrChkFittedModel.AddFunctionNamesCondition(False, "visreg") @@ -127,7 +129,8 @@ Public Class sdgSimpleRegOptions ucrChkFittedModel.AddToLinkedControls(ucrPnlScale, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrPnlScale.SetRDefault(Chr(34) & "linear" & Chr(34)) - ucrChkFittedModel.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.2) + ucrNudWhiteSpace.SetLinkedDisplayControl(lblWhiteSpace) ucrChkFittedModel.AddToLinkedControls(ucrChkPartial, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkFittedModel.AddToLinkedControls(ucrChkRugs, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkRugs.AddToLinkedControls(ucrPnlPartial12, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) @@ -150,7 +153,11 @@ Public Class sdgSimpleRegOptions ucrNudGraphicsCLevel.DecimalPlaces = 2 ucrNudGraphicsCLevel.Increment = 0.01 ucrNudGraphicsCLevel.SetMinMax(0, 1) + ucrNudWhiteSpace.SetParameter(New RParameter("whitespace")) + ucrNudWhiteSpace.DecimalPlaces = 1 + ucrNudWhiteSpace.Increment = 0.1 + ucrNudWhiteSpace.SetMinMax(0, 1) ucrChkPartial.SetText("Partial") ucrChkPartial.SetParameter(New RParameter("partial"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") @@ -223,11 +230,12 @@ Public Class sdgSimpleRegOptions clsRWriteStdResiduals = clsNewRWriteStdResiduals clsRWriteLeverage = clsNewRWriteLeverage - ucrChkModel.SetRSyntax(clsRSyntax, bReset) - ucrChkEstimates.SetRSyntax(clsRSyntax, bReset) - ucrChkANOVA.SetRSyntax(clsRSyntax, bReset) - ucrChkDisplayCLimits.SetRSyntax(clsRSyntax, bReset) - ucrChkPvalues.SetRSyntax(clsRSyntax, bReset) + ucrChkModel.SetRCode(clsRModelsFunction, bReset) + ucrChkEstimates.SetRCode(clsRSummaryFunction, bReset) + ucrChkANOVA.SetRCode(clsRanovaFunction, bReset) + ucrChkDisplayCLimits.SetRCode(clsRCIFunction, bReset) + ucrNudDisplayCLevel.SetRCode(clsRCIFunction, bReset) + ucrChkPvalues.SetRCode(clsRestpvalFunction, bReset) ucrPnlScale.SetRCode(clsRggplotFunction, bReset) ucrPnlPlotType.SetRCode(clsRggplotFunction, bReset) ucrChkJitter.SetRCode(clsRggplotFunction, bReset) @@ -240,6 +248,7 @@ Public Class sdgSimpleRegOptions ucrChkMultiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) ucrPnlMutiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) ucrChkFittedModel.SetRCode(clsRggplotFunction, bReset) + End Sub Private Sub ucrChkANOVA_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkANOVA.ControlValueChanged From daa96756d6fb3bbb3277cce219aa716ef5bb4225 Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 23 Jun 2017 18:24:08 +0300 Subject: [PATCH 166/201] edits --- instat/dlgRegressionSimple.vb | 2 +- instat/sdgSimpleRegOptions.vb | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 2d20619972a..2d368632aed 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -217,7 +217,7 @@ Public Class dlgRegressionSimple clsRggplotFunction = clsRegressionDefaults.clsDefaultRggplot.Clone clsRggplotFunction.AddParameter("type", Chr(34) & "conditional" & Chr(34)) ' clsRggplotFunction.AddParameter("rug", "TRUE") - clsRggplotFunction.AddParameter("alpha", clsRFunctionParameter:=clsRLmOrGLM) + clsRggplotFunction.AddParameter("alpha", 0.05) clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsRLmOrGLM) clsRggplotFunction.iCallType = 3 diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 6fc4a88c294..5de76742b4f 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -47,6 +47,9 @@ Public Class sdgSimpleRegOptions ucrChkPvalues.SetText("P-Values") ucrChkPvalues.AddFunctionNamesCondition(True, "anova") + ucrChkPvalues.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) + ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) + ucrNudDisplayCLevel.SetParameter(New RParameter("level")) ucrNudDisplayCLevel.DecimalPlaces = 2 ucrNudDisplayCLevel.Increment = 0.01 @@ -57,6 +60,8 @@ Public Class sdgSimpleRegOptions ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) + + ucrChkFittedModel.SetText("Fitted Model") ucrSaveFittedColumnName.SetPrefix("Fitted") @@ -95,6 +100,7 @@ Public Class sdgSimpleRegOptions ucrChkMultiplePlots.AddFunctionNamesCondition(False, "autoplot") ucrChkMultiplePlots.SetText("Multiple Plots") ucrChkMultiplePlots.AddToLinkedControls(ucrPnlMutiplePlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoFourPlots) + ' ucrPnlMutiplePlots.SetLinkedDisplayControl(grpMultiplePlots) 'Individual Plots (Autoplot function) ucrPnlIndividualPlots.AddRadioButton(rdoResidualsFitted) @@ -113,6 +119,7 @@ Public Class sdgSimpleRegOptions ucrChkIndividualPlots.AddFunctionNamesCondition(False, "autoplot") ucrChkIndividualPlots.SetText("Individual Plots") ucrChkIndividualPlots.AddToLinkedControls(ucrPnlIndividualPlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoResidualsFitted) + 'ucrPnlIndividualPlots.SetLinkedDisplayControl(grpIndividualPlots) 'Fitting Models Plots (Visreg) ucrChkFittedModel.AddFunctionNamesCondition(False, "visreg") @@ -129,8 +136,7 @@ Public Class sdgSimpleRegOptions ucrChkFittedModel.AddToLinkedControls(ucrPnlScale, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrPnlScale.SetRDefault(Chr(34) & "linear" & Chr(34)) - ucrChkFittedModel.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.2) - ucrNudWhiteSpace.SetLinkedDisplayControl(lblWhiteSpace) + ucrChkFittedModel.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkFittedModel.AddToLinkedControls(ucrChkPartial, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkFittedModel.AddToLinkedControls(ucrChkRugs, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkRugs.AddToLinkedControls(ucrPnlPartial12, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) @@ -230,6 +236,7 @@ Public Class sdgSimpleRegOptions clsRWriteStdResiduals = clsNewRWriteStdResiduals clsRWriteLeverage = clsNewRWriteLeverage + ucrChkModel.SetRCode(clsRModelsFunction, bReset) ucrChkEstimates.SetRCode(clsRSummaryFunction, bReset) ucrChkANOVA.SetRCode(clsRanovaFunction, bReset) @@ -248,7 +255,6 @@ Public Class sdgSimpleRegOptions ucrChkMultiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) ucrPnlMutiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) ucrChkFittedModel.SetRCode(clsRggplotFunction, bReset) - End Sub Private Sub ucrChkANOVA_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkANOVA.ControlValueChanged From 2496736a5025de773e98aa608d35805e46a00298 Mon Sep 17 00:00:00 2001 From: Steven Date: Sat, 24 Jun 2017 08:15:53 +0300 Subject: [PATCH 167/201] saving objects --- instat/dlgRegressionSimple.Designer.vb | 4 +- instat/dlgRegressionSimple.vb | 5 +- instat/sdgSimpleRegOptions.Designer.vb | 120 ++++++++++++------------- instat/sdgSimpleRegOptions.vb | 115 ++++++++++++++---------- 4 files changed, 133 insertions(+), 111 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 26426d66d33..5cbd9244d4f 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -207,6 +207,8 @@ Partial Class dlgRegressionSimple Me.grpParameters.Controls.Add(Me.ucrNudCI) Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) + Me.grpParameters.Controls.Add(Me.lblHyp1) + Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) resources.ApplyResources(Me.grpParameters, "grpParameters") Me.grpParameters.Name = "grpParameters" Me.grpParameters.TabStop = False @@ -313,9 +315,7 @@ Partial Class dlgRegressionSimple Me.Controls.Add(Me.lblFactor) Me.Controls.Add(Me.lblNumeric) Me.Controls.Add(Me.rdoCompareMeans) - Me.Controls.Add(Me.lblHyp1) Me.Controls.Add(Me.ucrExplanatory) - Me.Controls.Add(Me.ucrPnlMeansAndVariance) Me.Controls.Add(Me.ucrResponse) Me.Controls.Add(Me.ucrSelectorSimpleReg) Me.Controls.Add(Me.lblExplanatory) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 2d368632aed..e2b46f8df09 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -248,18 +248,19 @@ Public Class dlgRegressionSimple clsRestpvalFunction.iCallType = 2 'ucrSave (sdgSimpleRegOptions) Fitted Values + clsRWriteFitted = clsRegressionDefaults.clsDefaultRWriteFitted.Clone clsRFittedValues.SetPackageName("stats") clsRFittedValues.SetRCommand("fitted") clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteFitted = clsRegressionDefaults.clsDefaultRWriteFitted.Clone clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) + clsRWriteFitted.iCallType = 3 'ucrSave (sdgSimpleRegOptions) Residuals + clsRWriteResiduals = clsRegressionDefaults.clsDefaultRWriteResiduals.Clone clsRResiduals.SetPackageName("stats") clsRResiduals.SetRCommand("resid") clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteResiduals = clsRegressionDefaults.clsDefaultRWriteResiduals.Clone clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) clsRWriteResiduals.iCallType = 3 diff --git a/instat/sdgSimpleRegOptions.Designer.vb b/instat/sdgSimpleRegOptions.Designer.vb index 5435514a6be..2b0dac51150 100644 --- a/instat/sdgSimpleRegOptions.Designer.vb +++ b/instat/sdgSimpleRegOptions.Designer.vb @@ -39,14 +39,14 @@ Partial Class sdgSimpleRegOptions Me.ucrPnlPartial12 = New instat.UcrPanel() Me.lblWhiteSpace = New System.Windows.Forms.Label() Me.lblGraphicsSignLevel = New System.Windows.Forms.Label() - Me.grpScale = New System.Windows.Forms.GroupBox() - Me.rdoResponse = New System.Windows.Forms.RadioButton() - Me.rdoLinear = New System.Windows.Forms.RadioButton() - Me.ucrPnlScale = New instat.UcrPanel() Me.grpPlotType = New System.Windows.Forms.GroupBox() Me.rdoContrast = New System.Windows.Forms.RadioButton() Me.rdoConditional = New System.Windows.Forms.RadioButton() Me.ucrPnlPlotType = New instat.UcrPanel() + Me.grpScale = New System.Windows.Forms.GroupBox() + Me.rdoResponse = New System.Windows.Forms.RadioButton() + Me.rdoLinear = New System.Windows.Forms.RadioButton() + Me.ucrPnlScale = New instat.UcrPanel() Me.tbResiduals = New System.Windows.Forms.TabPage() Me.rdoCooksDistanceLeverage = New System.Windows.Forms.RadioButton() Me.rdoCooksDistance = New System.Windows.Forms.RadioButton() @@ -54,12 +54,12 @@ Partial Class sdgSimpleRegOptions Me.rdoScaleLocation = New System.Windows.Forms.RadioButton() Me.rdoQQ = New System.Windows.Forms.RadioButton() Me.rdoResidualsFitted = New System.Windows.Forms.RadioButton() - Me.grpIndividualPlots = New System.Windows.Forms.GroupBox() Me.grpMultiplePlots = New System.Windows.Forms.GroupBox() Me.rdoSixPlots3Rows = New System.Windows.Forms.RadioButton() Me.rdoFourPlots = New System.Windows.Forms.RadioButton() Me.rdoSixPlots2Rows = New System.Windows.Forms.RadioButton() Me.ucrPnlMutiplePlots = New instat.UcrPanel() + Me.grpIndividualPlots = New System.Windows.Forms.GroupBox() Me.ucrPnlIndividualPlots = New instat.UcrPanel() Me.ucrChkIndividualPlots = New instat.ucrCheck() Me.ucrChkMultiplePlots = New instat.ucrCheck() @@ -82,8 +82,8 @@ Partial Class sdgSimpleRegOptions Me.tcGraphics.SuspendLayout() Me.tbModel.SuspendLayout() Me.grpRugs.SuspendLayout() - Me.grpScale.SuspendLayout() Me.grpPlotType.SuspendLayout() + Me.grpScale.SuspendLayout() Me.tbResiduals.SuspendLayout() Me.grpMultiplePlots.SuspendLayout() Me.tbDisplay.SuspendLayout() @@ -276,6 +276,48 @@ Partial Class sdgSimpleRegOptions Me.lblGraphicsSignLevel.Tag = "Significance_Level:" Me.lblGraphicsSignLevel.Text = "Significance Level:" ' + 'grpPlotType + ' + Me.grpPlotType.Controls.Add(Me.rdoContrast) + Me.grpPlotType.Controls.Add(Me.rdoConditional) + Me.grpPlotType.Controls.Add(Me.ucrPnlPlotType) + Me.grpPlotType.Location = New System.Drawing.Point(10, 33) + Me.grpPlotType.Name = "grpPlotType" + Me.grpPlotType.Size = New System.Drawing.Size(111, 75) + Me.grpPlotType.TabIndex = 5 + Me.grpPlotType.TabStop = False + Me.grpPlotType.Tag = "Plot_type" + Me.grpPlotType.Text = "Plot type" + ' + 'rdoContrast + ' + Me.rdoContrast.AutoSize = True + Me.rdoContrast.Location = New System.Drawing.Point(9, 42) + Me.rdoContrast.Name = "rdoContrast" + Me.rdoContrast.Size = New System.Drawing.Size(64, 17) + Me.rdoContrast.TabIndex = 33 + Me.rdoContrast.Tag = "Contrast" + Me.rdoContrast.Text = "Contrast" + Me.rdoContrast.UseVisualStyleBackColor = True + ' + 'rdoConditional + ' + Me.rdoConditional.AutoSize = True + Me.rdoConditional.Location = New System.Drawing.Point(9, 19) + Me.rdoConditional.Name = "rdoConditional" + Me.rdoConditional.Size = New System.Drawing.Size(77, 17) + Me.rdoConditional.TabIndex = 32 + Me.rdoConditional.Tag = "Conditional" + Me.rdoConditional.Text = "Conditional" + Me.rdoConditional.UseVisualStyleBackColor = True + ' + 'ucrPnlPlotType + ' + Me.ucrPnlPlotType.Location = New System.Drawing.Point(9, 19) + Me.ucrPnlPlotType.Name = "ucrPnlPlotType" + Me.ucrPnlPlotType.Size = New System.Drawing.Size(77, 43) + Me.ucrPnlPlotType.TabIndex = 31 + ' 'grpScale ' Me.grpScale.Controls.Add(Me.rdoResponse) @@ -320,48 +362,6 @@ Partial Class sdgSimpleRegOptions Me.ucrPnlScale.Size = New System.Drawing.Size(94, 43) Me.ucrPnlScale.TabIndex = 28 ' - 'grpPlotType - ' - Me.grpPlotType.Controls.Add(Me.rdoContrast) - Me.grpPlotType.Controls.Add(Me.rdoConditional) - Me.grpPlotType.Controls.Add(Me.ucrPnlPlotType) - Me.grpPlotType.Location = New System.Drawing.Point(10, 33) - Me.grpPlotType.Name = "grpPlotType" - Me.grpPlotType.Size = New System.Drawing.Size(111, 75) - Me.grpPlotType.TabIndex = 5 - Me.grpPlotType.TabStop = False - Me.grpPlotType.Tag = "Plot_type" - Me.grpPlotType.Text = "Plot type" - ' - 'rdoContrast - ' - Me.rdoContrast.AutoSize = True - Me.rdoContrast.Location = New System.Drawing.Point(9, 42) - Me.rdoContrast.Name = "rdoContrast" - Me.rdoContrast.Size = New System.Drawing.Size(64, 17) - Me.rdoContrast.TabIndex = 33 - Me.rdoContrast.Tag = "Contrast" - Me.rdoContrast.Text = "Contrast" - Me.rdoContrast.UseVisualStyleBackColor = True - ' - 'rdoConditional - ' - Me.rdoConditional.AutoSize = True - Me.rdoConditional.Location = New System.Drawing.Point(9, 19) - Me.rdoConditional.Name = "rdoConditional" - Me.rdoConditional.Size = New System.Drawing.Size(77, 17) - Me.rdoConditional.TabIndex = 32 - Me.rdoConditional.Tag = "Conditional" - Me.rdoConditional.Text = "Conditional" - Me.rdoConditional.UseVisualStyleBackColor = True - ' - 'ucrPnlPlotType - ' - Me.ucrPnlPlotType.Location = New System.Drawing.Point(9, 19) - Me.ucrPnlPlotType.Name = "ucrPnlPlotType" - Me.ucrPnlPlotType.Size = New System.Drawing.Size(77, 43) - Me.ucrPnlPlotType.TabIndex = 31 - ' 'tbResiduals ' Me.tbResiduals.Controls.Add(Me.rdoCooksDistanceLeverage) @@ -371,10 +371,10 @@ Partial Class sdgSimpleRegOptions Me.tbResiduals.Controls.Add(Me.rdoQQ) Me.tbResiduals.Controls.Add(Me.rdoResidualsFitted) Me.tbResiduals.Controls.Add(Me.grpMultiplePlots) + Me.tbResiduals.Controls.Add(Me.grpIndividualPlots) Me.tbResiduals.Controls.Add(Me.ucrPnlIndividualPlots) Me.tbResiduals.Controls.Add(Me.ucrChkIndividualPlots) Me.tbResiduals.Controls.Add(Me.ucrChkMultiplePlots) - Me.tbResiduals.Controls.Add(Me.grpIndividualPlots) Me.tbResiduals.Location = New System.Drawing.Point(4, 22) Me.tbResiduals.Name = "tbResiduals" Me.tbResiduals.Padding = New System.Windows.Forms.Padding(3) @@ -456,15 +456,6 @@ Partial Class sdgSimpleRegOptions Me.rdoResidualsFitted.Text = "Residuals v Fitted" Me.rdoResidualsFitted.UseVisualStyleBackColor = True ' - 'grpIndividualPlots - ' - Me.grpIndividualPlots.Location = New System.Drawing.Point(10, 149) - Me.grpIndividualPlots.Name = "grpIndividualPlots" - Me.grpIndividualPlots.Size = New System.Drawing.Size(278, 89) - Me.grpIndividualPlots.TabIndex = 1 - Me.grpIndividualPlots.TabStop = False - Me.grpIndividualPlots.Tag = "" - ' 'grpMultiplePlots ' Me.grpMultiplePlots.Controls.Add(Me.rdoSixPlots3Rows) @@ -521,6 +512,15 @@ Partial Class sdgSimpleRegOptions Me.ucrPnlMutiplePlots.Size = New System.Drawing.Size(268, 56) Me.ucrPnlMutiplePlots.TabIndex = 40 ' + 'grpIndividualPlots + ' + Me.grpIndividualPlots.Location = New System.Drawing.Point(10, 149) + Me.grpIndividualPlots.Name = "grpIndividualPlots" + Me.grpIndividualPlots.Size = New System.Drawing.Size(278, 89) + Me.grpIndividualPlots.TabIndex = 1 + Me.grpIndividualPlots.TabStop = False + Me.grpIndividualPlots.Tag = "" + ' 'ucrPnlIndividualPlots ' Me.ucrPnlIndividualPlots.Location = New System.Drawing.Point(20, 164) @@ -705,10 +705,10 @@ Partial Class sdgSimpleRegOptions Me.tbModel.PerformLayout() Me.grpRugs.ResumeLayout(False) Me.grpRugs.PerformLayout() - Me.grpScale.ResumeLayout(False) - Me.grpScale.PerformLayout() Me.grpPlotType.ResumeLayout(False) Me.grpPlotType.PerformLayout() + Me.grpScale.ResumeLayout(False) + Me.grpScale.PerformLayout() Me.tbResiduals.ResumeLayout(False) Me.tbResiduals.PerformLayout() Me.grpMultiplePlots.ResumeLayout(False) diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 5de76742b4f..83e8b522812 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -25,6 +25,7 @@ Public Class sdgSimpleRegOptions Private clsRSyntax As RSyntax Public clsRaovFunction, clsRaovpvalFunction, clsRestpvalFunction, clsRResidualPlotsFunction, clsRgeom_point, clsRPredFunction, clsRDFFunction, clsRFittedValues, clsRWriteFitted, clsRResiduals, clsRWriteResiduals, clsRStdResiduals, clsRWriteStdResiduals, clsRLeverage, clsRWriteLeverage As New RFunction Public clsRggplotFunction, clsRaesFunction, clsRStat_smooth, clsRModelsFunction, clsRCIFunction, clsR_ribbon, clsRaes_ribbon As New RFunction + Public bControlsInitialised As Boolean = False Private Sub sdgSimpleRegOptions_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -171,40 +172,40 @@ Public Class sdgSimpleRegOptions ucrChkConfIntervalband.SetText("C.I band") ucrChkConfIntervalband.SetParameter(New RParameter("band"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") - ucrChkPartial.SetRDefault("TRUE") - - 'Save Plots (Save tab) - 'Save Fitted Column Names - ucrSaveFittedColumnName.SetPrefix("Fitted") - ucrSaveFittedColumnName.SetSaveTypeAsDataFrame() - ucrSaveFittedColumnName.SetCheckBoxText("Fitted Values") - ucrSaveFittedColumnName.SetIsComboBox() - ucrSaveFittedColumnName.SetAssignToIfUncheckedValue("last_fitted") - ucrSaveFittedColumnName.Enabled = False ' disabled until working - - 'Save Residuals Column Names - ucrSaveResidualsColumnName.SetPrefix("Resids") - ucrSaveResidualsColumnName.SetSaveTypeAsDataFrame() - ucrSaveResidualsColumnName.SetCheckBoxText("Residuals") - ucrSaveResidualsColumnName.SetIsComboBox() - ucrSaveResidualsColumnName.SetAssignToIfUncheckedValue("last_residual") - ucrSaveResidualsColumnName.Enabled = False ' disabled until working - - 'Save StdResiduals Column Names - ucrSaveStdResidualsColumnName.SetPrefix("Sresids") - ucrSaveStdResidualsColumnName.SetSaveTypeAsDataFrame() - ucrSaveStdResidualsColumnName.SetCheckBoxText("Std Residuals") - ucrSaveStdResidualsColumnName.SetIsComboBox() - ucrSaveStdResidualsColumnName.SetAssignToIfUncheckedValue("last_stdresidual") - ucrSaveStdResidualsColumnName.Enabled = False ' disabled until working - - 'Save Leverage Column Names - ucrSaveLeverageColumnName.SetPrefix("Lever") - ucrSaveLeverageColumnName.SetSaveTypeAsDataFrame() - ucrSaveLeverageColumnName.SetCheckBoxText("Leverage") - ucrSaveLeverageColumnName.SetIsComboBox() - ucrSaveLeverageColumnName.SetAssignToIfUncheckedValue("last_leverage") - ucrSaveLeverageColumnName.Enabled = False ' disabled until working + ucrChkConfIntervalband.SetRDefault("TRUE") + + ''Save Plots (Save tab) + ''Save Fitted Column Names + 'ucrSaveFittedColumnName.SetPrefix("Fitted") + 'ucrSaveFittedColumnName.SetSaveTypeAsDataFrame() + 'ucrSaveFittedColumnName.SetCheckBoxText("Fitted Values") + 'ucrSaveFittedColumnName.SetIsComboBox() + 'ucrSaveFittedColumnName.SetAssignToIfUncheckedValue("last_fitted") + '' ucrSaveFittedColumnName.Enabled = False ' disabled until working + + ''Save Residuals Column Names + 'ucrSaveResidualsColumnName.SetPrefix("Resids") + 'ucrSaveResidualsColumnName.SetSaveTypeAsDataFrame() + 'ucrSaveResidualsColumnName.SetCheckBoxText("Residuals") + 'ucrSaveResidualsColumnName.SetIsComboBox() + 'ucrSaveResidualsColumnName.SetAssignToIfUncheckedValue("last_residual") + ''ucrSaveResidualsColumnName.Enabled = False ' disabled until working + + ''Save StdResiduals Column Names + 'ucrSaveStdResidualsColumnName.SetPrefix("Sresids") + 'ucrSaveStdResidualsColumnName.SetSaveTypeAsDataFrame() + 'ucrSaveStdResidualsColumnName.SetCheckBoxText("Std Residuals") + 'ucrSaveStdResidualsColumnName.SetIsComboBox() + 'ucrSaveStdResidualsColumnName.SetAssignToIfUncheckedValue("last_stdresidual") + ''ucrSaveStdResidualsColumnName.Enabled = False ' disabled until working + + ''Save Leverage Column Names + 'ucrSaveLeverageColumnName.SetPrefix("Lever") + 'ucrSaveLeverageColumnName.SetSaveTypeAsDataFrame() + 'ucrSaveLeverageColumnName.SetCheckBoxText("Leverage") + 'ucrSaveLeverageColumnName.SetIsComboBox() + 'ucrSaveLeverageColumnName.SetAssignToIfUncheckedValue("last_leverage") + '' ucrSaveLeverageColumnName.Enabled = False ' disabled until working bControlsInitialised = True End Sub @@ -249,12 +250,19 @@ Public Class sdgSimpleRegOptions ucrNudGraphicsCLevel.SetRCode(clsRggplotFunction, bReset) ucrNudWhiteSpace.SetRCode(clsRggplotFunction, bReset) ucrChkPartial.SetRCode(clsRggplotFunction, bReset) + ucrChkConfIntervalband.SetRCode(clsRggplotFunction, bReset) ucrPnlPartial12.SetRCode(clsRggplotFunction, bReset) ucrChkIndividualPlots.SetRCode(clsRResidualPlotsFunction, bReset) ucrPnlIndividualPlots.SetRCode(clsRResidualPlotsFunction, bReset) ucrChkMultiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) ucrPnlMutiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) ucrChkFittedModel.SetRCode(clsRggplotFunction, bReset) + + 'ucrSaveFittedColumnName.SetRCode(clsRWriteFitted, bReset) + 'ucrSaveResidualsColumnName.SetRCode(clsRWriteResiduals, bReset) + 'ucrSaveStdResidualsColumnName.SetRCode(clsRWriteStdResiduals, bReset) + 'ucrSaveLeverageColumnName.SetRCode(clsRWriteLeverage, bReset) + End Sub Private Sub ucrChkANOVA_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkANOVA.ControlValueChanged @@ -416,31 +424,44 @@ Public Class sdgSimpleRegOptions If (ucrChkDisplayCLimits.Checked) Then ConfidenceInterval() End If - If (rdoFourPlots.Checked Or rdoSixPlots2Rows.Checked Or rdoSixPlots3Rows.Checked Or rdoResidualsFitted.Checked Or rdoQQ.Checked Or rdoResidualsLeverage.Checked Or rdoScaleLocation.Checked Or rdoCooksDistance.Checked Or rdoCooksDistanceLeverage.Checked) Then - frmMain.clsRLink.RunScript(clsRGraphics.GetScript, 3) - End If End Sub ' disabled until working - Private Sub FittedValues() + Private Sub ucrSaveFittedColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveFittedColumnName.ControlValueChanged clsRWriteFitted.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) clsRWriteFitted.AddParameter("col_name", Chr(34) & ucrSaveFittedColumnName.GetText & Chr(34)) + clsRSyntax.AddToAfterCodes(clsRWriteFitted, iPosition:=8) + clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) + clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) + clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) End Sub - Private Sub Residuals() - clsRWriteResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - clsRWriteResiduals.AddParameter("col_name", Chr(34) & ucrSaveResidualsColumnName.GetText & Chr(34)) + Private Sub ucrSaveResidualsColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveResidualsColumnName.ControlValueChanged + 'clsRWriteResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) + 'clsRWriteResiduals.AddParameter("col_name", Chr(34) & ucrSaveResidualsColumnName.GetText & Chr(34)) + 'clsRSyntax.AddToAfterCodes(clsRWriteResiduals, iPosition:=9) + 'clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) + 'clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) + 'clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) End Sub - Private Sub StdResiduals() - clsRWriteStdResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - clsRWriteStdResiduals.AddParameter("col_name", Chr(34) & ucrSaveStdResidualsColumnName.GetText & Chr(34)) + Private Sub ucrSaveStdResidualsColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStdResidualsColumnName.ControlValueChanged + 'clsRWriteStdResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) + 'clsRWriteStdResiduals.AddParameter("col_name", Chr(34) & ucrSaveStdResidualsColumnName.GetText & Chr(34)) + 'clsRSyntax.AddToAfterCodes(clsRWriteStdResiduals, iPosition:=10) + 'clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) + 'clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) + 'clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) End Sub - Private Sub Leverage() - clsRWriteLeverage.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - clsRWriteLeverage.AddParameter("col_name", Chr(34) & ucrSaveLeverageColumnName.GetText & Chr(34)) + Private Sub ucrSaveLeverageColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveLeverageColumnName.ControlValueChanged + 'clsRWriteLeverage.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) + 'clsRWriteLeverage.AddParameter("col_name", Chr(34) & ucrSaveLeverageColumnName.GetText & Chr(34)) + 'clsRSyntax.AddToAfterCodes(clsRWriteLeverage, iPosition:=11) + 'clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) + 'clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) + 'clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) End Sub End Class \ No newline at end of file From e040cf90dbffe21109c4315e80ee17c3e93b9ba8 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sat, 24 Jun 2017 10:57:39 +0100 Subject: [PATCH 168/201] fixed #3475 fixed bug in open from library packages display added auto save feature in frmMain --- instat/clsRLink.vb | 9 ++++++- instat/dlgFromLibrary.vb | 6 ++++- instat/dlgImportDataset.vb | 1 + instat/frmMain.vb | 51 ++++++++++++++++++++++++++++++++------ 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 89a4c13b8f9..985702954b9 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -25,10 +25,12 @@ Public Class RLink Dim strInstatObjectPath As String = "/InstatObject/R" 'path to the Instat object Public strInstatDataObject As String = "InstatDataObject" - Private strLogFilePath As String = Path.Combine(Path.GetTempPath, "R-Instat_debug_log.txt") + Private strLogFilePath As String = Path.Combine(Path.GetTempPath, "R-Instat_debug_log.txt") Private bFirstRCode As Boolean = True Private bDebugLogExists As Boolean = False + Public bRCodeRunning As Boolean = False + Public clsEngine As REngine Public rtbOutput As New ucrWPFRichTextBox Public txtLog As New TextBox @@ -433,6 +435,10 @@ Public Class RLink Dim evtWaitHandleDelayDone As New System.Threading.AutoResetEvent(False) Dim bReturn As Boolean = True + While bRCodeRunning + Threading.Thread.Sleep(5) + End While + bRCodeRunning = True If clsEngine IsNot Nothing Then If bFirstRCode Then Try @@ -516,6 +522,7 @@ Public Class RLink Else bReturn = False End If + bRCodeRunning = False Return bReturn End Function diff --git a/instat/dlgFromLibrary.vb b/instat/dlgFromLibrary.vb index e82a0c9b106..9cdab327dec 100644 --- a/instat/dlgFromLibrary.vb +++ b/instat/dlgFromLibrary.vb @@ -129,7 +129,11 @@ Public Class dlgFromLibrary If dfDataframe IsNot Nothing Then For i As Integer = 0 To dfDataframe.RowCount - 1 lstItem = lstCollection.Items.Add(dfDataframe(i, 0)) - lstItem.SubItems.Add(dfDataframe(i, 1)) + If dfDataframe.ColumnCount > 1 Then + lstItem.SubItems.Add(dfDataframe(i, 1)) + Else + lstItem.SubItems.Add("") + End If Next End If End Sub diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index e8ac45cc5f5..c3f2aa15071 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -260,6 +260,7 @@ Public Class dlgImportDataset clsImportExcel.SetPackageName("rio") clsImportExcel.SetRCommand("import") + clsImportExcel.AddParameter("guess_max", "Inf") clsImportCSV.SetPackageName("rio") clsImportCSV.SetRCommand("import") diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 97054e0e078..864e3bcc656 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -36,6 +36,8 @@ Public Class frmMain Private mnuItems As New List(Of Form) Private ctrActive As Control Private WithEvents timer As New System.Windows.Forms.Timer + Private iAutoSaveTime As Integer = 300000 + Private strAutoSaveDataFilePath As String = Path.Combine(Path.GetTempPath, "R-Instat_auto_save.rds") 'This is the default data frame to appear in the data frame selector 'If "" the current worksheet will be used @@ -53,8 +55,7 @@ Public Class frmMain Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load InitialiseOutputWindow() - timer.Interval = 5000 - timer.Start() + mnuHelpAboutRInstat.Visible = False clsGrids.SetDataViewer(ucrDataViewer) @@ -76,6 +77,11 @@ Public Class frmMain 'Do this before setting up R Link becuase setup edits Output window which is changed by Options LoadInstatOptions() + 'Do this after loading options because interval depends on options + timer.Interval = iAutoSaveTime + timer.Start() + AddHandler System.Windows.Forms.Application.Idle, AddressOf Application_Idle + 'Sets up R source files clsRLink.RSetup() @@ -85,6 +91,18 @@ Public Class frmMain clsRecentItems.checkOnLoad() End Sub + Private Sub Application_Idle(sender As Object, e As EventArgs) + If Not timer.Enabled AndAlso (ActiveForm Is Nothing OrElse ActiveForm.Equals(Me)) AndAlso Not clsRLink.bRCodeRunning Then + AutoSaveData() + timer.Start() + End If + End Sub + + Private Sub CheckAutoSave() + If File.Exists(strAutoSaveDataFilePath) Then + End If + End Sub + Private Sub InitialiseOutputWindow() clsRLink.SetOutput(ucrOutput.ucrRichTextBox) 'TEST temporary : creating the temporary graphs @@ -771,6 +789,7 @@ Public Class frmMain End If clsRecentItems.saveOnClose() SaveInstatOptions(Path.Combine(strAppDataPath, strInstatOptionsFile)) + DeleteAutoSaveData() 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 @@ -779,6 +798,29 @@ Public Class frmMain End If End Sub + Public Sub AutoSaveData() + Dim clsSaveRDS As New RFunction + + If clsRLink.bInstatObjectExists Then + clsSaveRDS.SetRCommand("saveRDS") + clsSaveRDS.AddParameter("object", clsRLink.strInstatDataObject) + clsSaveRDS.AddParameter("file", Chr(34) & strAutoSaveDataFilePath.Replace("\", "/") & Chr(34)) + Dim t As New Stopwatch + t.Start() + clsRLink.RunInternalScript(clsSaveRDS.ToScript()) + t.Stop() + Console.WriteLine("save time: " & t.ElapsedMilliseconds) + End If + End Sub + + Public Sub DeleteAutoSaveData() + Try + File.Delete(strAutoSaveDataFilePath) + Catch ex As Exception + MsgBox("Could not delete auto save data file at: " & strAutoSaveDataFilePath & Environment.NewLine & ex.Message) + End Try + End Sub + Private Sub mnuOrganiseDataObjectHideDataframes_Click(sender As Object, e As EventArgs) Handles mnuPrepareDataObjectHideDataframes.Click dlgHideDataframes.ShowDialog() End Sub @@ -1424,13 +1466,8 @@ Public Class frmMain Private Sub timer_Tick(sender As Object, e As EventArgs) Handles timer.Tick timer.Stop() - 'Check if idle - - 'Save file - timer.Start() End Sub - 'Private Sub TESTToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles TESTToolStripMenuItem.Click ' 'TEST temporary ' 'TESTING TO BE ERASED !!!!!!! From 1ae4de40876ce1d188d25ff49ce072d74aa2378c Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sat, 24 Jun 2017 18:57:14 +0100 Subject: [PATCH 169/201] implementing auto recover --- instat/clsRCodeStructure.vb | 3 - instat/clsRLink.vb | 142 +++++++++--- instat/dlgAutoSaveRecovery.Designer.vb | 292 +++++++++++++++++++++++++ instat/dlgAutoSaveRecovery.resx | 120 ++++++++++ instat/dlgAutoSaveRecovery.vb | 138 ++++++++++++ instat/frmMain.vb | 66 +++++- instat/instat.vbproj | 9 + 7 files changed, 725 insertions(+), 45 deletions(-) create mode 100644 instat/dlgAutoSaveRecovery.Designer.vb create mode 100644 instat/dlgAutoSaveRecovery.resx create mode 100644 instat/dlgAutoSaveRecovery.vb diff --git a/instat/clsRCodeStructure.vb b/instat/clsRCodeStructure.vb index bacb6bfab5c..52ffec81ce3 100644 --- a/instat/clsRCodeStructure.vb +++ b/instat/clsRCodeStructure.vb @@ -124,9 +124,6 @@ Public Class RCodeStructure End If If bToBeAssigned Then - If Not frmMain.clsRLink.bInstatObjectExists Then - frmMain.clsRLink.CreateNewInstatObject() - End If strScript = strScript & strAssignTo & " <- " & strTemp & Environment.NewLine If Not strAssignToDataFrame = "" AndAlso (Not strAssignToColumn = "" OrElse bAssignToColumnWithoutNames) Then clsAddColumns.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 985702954b9..0aad1dbf84a 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -25,13 +25,15 @@ Public Class RLink Dim strInstatObjectPath As String = "/InstatObject/R" 'path to the Instat object Public strInstatDataObject As String = "InstatDataObject" - Private strLogFilePath As String = Path.Combine(Path.GetTempPath, "R-Instat_debug_log.txt") + Private strDebugLogFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_debug_logs") Private bFirstRCode As Boolean = True Private bDebugLogExists As Boolean = False - + Private bAutoSaveLogExists As Boolean = False + Private bFirstLogCode As Boolean = True Public bRCodeRunning As Boolean = False Public clsEngine As REngine + Public bREngineInitialised As Boolean = False Public rtbOutput As New ucrWPFRichTextBox Public txtLog As New TextBox Public bLog As Boolean = False @@ -54,26 +56,50 @@ Public Class RLink Public strGraphDisplayOption As String = "view_output_window" Private grdDataView As ReoGridControl - - Public Sub New(Optional bWithInstatObj As Boolean = False, Optional bWithClimsoft As Boolean = False) - - End Sub - Public Sub SetEngine() + Public Sub StartREngine(Optional strScript As String = "", Optional iCallType As Integer = 0, Optional strComment As String = "", Optional bSeparateThread As Boolean = True) Try REngine.SetEnvironmentVariables() Catch ex As Exception - MsgBox(ex.Message & Environment.NewLine & "Ensure that the correct version of R is installed and restart the program.", MsgBoxStyle.Critical, "Cannot initialise R Link.") + MsgBox(ex.Message & Environment.NewLine & "Ensure that the correct version of R is installed and restart the program.", MsgBoxStyle.Critical, "Cannot initialise R connection.") Application.Exit() End Try Try clsEngine = REngine.GetInstance() Catch ex As Exception - MsgBox(ex.Message & Environment.NewLine & "Ensure that the correct version of R is installed and restart the program.", MsgBoxStyle.Critical, "Cannot initialise R Link.") + MsgBox(ex.Message & Environment.NewLine & "Ensure that the correct version of R is installed and restart the program.", MsgBoxStyle.Critical, "Cannot initialise R connection.") Application.Exit() End Try clsEngine.Initialize() - End Sub + If strScript = "" Then + strScript = GetRSetupScript() + iCallType = 0 + strComment = "" + bSeparateThread = True + End If + RunScript(strScript:=strScript, iCallType:=iCallType, strComment:=strComment, bSeparateThread:=bSeparateThread) + 'TODO is this ok to set here? + bInstatObjectExists = True + End Sub + + Public Sub CloseREngine() + If clsEngine IsNot Nothing Then + Try + clsEngine.Dispose() + Catch ex As Exception + MsgBox("Could not dispose for the connection to R" & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Cannot close R connection.") + End Try + End If + End Sub + + Public Sub LoadInstatDataObjectFromFile(strFile As String, Optional strComment As String = "") + Dim clsReadRDS As New RFunction + + clsReadRDS.SetRCommand("readRDS") + clsReadRDS.AddParameter("file", strFile.Replace("\", "/")) + RunScript(clsReadRDS.ToScript(), strComment:=strComment) + bInstatObjectExists = True + End Sub Public Sub SetDataViewGrid(grdNewDataGrid As ReoGridControl) grdDataView = grdNewDataGrid @@ -239,6 +265,44 @@ Public Class RLink Return strNextDefault End Function + Private Sub AppendToAutoSaveLog(strScript As String) + Try + If bFirstLogCode Then + 'File.WriteAllText(frmMain.strAutoSaveLogFilePath, "") + bAutoSaveLogExists = True + End If + If bAutoSaveLogExists Then + 'Using w As StreamWriter = File.AppendText(frmMain.strAutoSaveLogFilePath) + 'w.WriteLine(strScript) + 'End Using + End If + Catch ex As Exception + 'MsgBox("Could not add script to auto save log file at:" & frmMain.strAutoSaveLogFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Auot save Log File") + bAutoSaveLogExists = False + Finally + bFirstLogCode = False + End Try + End Sub + + Public Sub RunLogFile(strFilePath As String, Optional bDeleteFile As Boolean = False) + Dim strLines() As String + Dim strScript As String + + Try + If File.Exists(strFilePath) Then + strLines = File.ReadAllLines(strFilePath) + strScript = String.Join(Environment.NewLine, strLines) + 'Delete before running in case this is an auto save + If bDeleteFile Then + File.Delete(strFilePath) + End If + RunScript(strScript) + End If + Catch ex As Exception + MsgBox("Could not read log file at:" & strFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Cannot Read Log File") + End Try + End Sub + Public Sub RunScript(strScript As String, Optional iCallType As Integer = 0, Optional strComment As String = "", Optional bSeparateThread As Boolean = True) Dim strCapturedScript As String Dim expTemp As RDotNet.SymbolicExpression @@ -261,6 +325,7 @@ Public Class RLink End If If bLog Then txtLog.Text = txtLog.Text & strScriptWithComment & Environment.NewLine + AppendToAutoSaveLog(strScriptWithComment & Environment.NewLine) End If If bOutput Then If strComment <> "" AndAlso bShowCommands Then @@ -442,20 +507,20 @@ Public Class RLink If clsEngine IsNot Nothing Then If bFirstRCode Then Try - File.WriteAllText(strLogFilePath, "") - Using w As StreamWriter = File.AppendText(strLogFilePath) - w.WriteLine("****************************") - w.WriteLine("R-Instat debugging log file") - w.WriteLine("****************************") - w.WriteLine("Version: " & My.Application.Info.Version.ToString()) - w.WriteLine("****************************") - w.WriteLine("Created on: " & DateTime.Now) - w.WriteLine("User: " & Environment.UserName) - w.WriteLine("****************************") + File.WriteAllText(strDebugLogFolderPath, "") + Using w As StreamWriter = File.AppendText(strDebugLogFolderPath) + w.WriteLine("# ****************************") + w.WriteLine("# R-Instat debugging log file") + w.WriteLine("# ****************************") + w.WriteLine("# Version: " & My.Application.Info.Version.ToString()) + w.WriteLine("# ****************************") + w.WriteLine("# Created on: " & DateTime.Now) + w.WriteLine("# User: " & Environment.UserName) + w.WriteLine("# ****************************") End Using bDebugLogExists = True Catch ex As Exception - MsgBox("Could not create debug log file at:" & strLogFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") + MsgBox("Could not create debug log file at:" & strDebugLogFolderPath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") bDebugLogExists = False Finally bFirstRCode = False @@ -465,14 +530,14 @@ Public Class RLink If bDebugLogExists Then Dim ts As New Stopwatch ts.Start() - Using w As StreamWriter = File.AppendText(strLogFilePath) + Using w As StreamWriter = File.AppendText(strDebugLogFolderPath) w.WriteLine(strScript) End Using ts.Stop() Console.WriteLine(ts.ElapsedMilliseconds) End If Catch ex As Exception - MsgBox("Could not add text to debug log file at:" & strLogFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") + MsgBox("Could not add text to debug log file at:" & strDebugLogFolderPath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") End Try Try If bSeparateThread Then @@ -566,16 +631,27 @@ Public Class RLink Return strTemp End Function - Public Sub RSetup() - 'run script to load libraries - frmMain.Cursor = Cursors.WaitCursor - frmSetupLoading.Show() - RunScript("setwd('" & frmMain.strStaticPath.Replace("\", "/") & strInstatObjectPath & "')", strComment:="Setting the working directory") 'This is bad the wd should be flexible and not automatically set to the instat object directory - RunScript("source(" & Chr(34) & "Rsetup.R" & Chr(34) & ")", strComment:="Sourcing the Instat Object R code") - CreateNewInstatObject() - frmSetupLoading.Close() - frmMain.Cursor = Cursors.Default - End Sub + Public Function GetRSetupScript() As String + Dim clsSetWd As New RFunction + Dim clsSource As New RFunction + Dim clsCreateIO As New ROperator + Dim strScript As String = "" + + clsSetWd.SetRCommand("setwd") + clsSetWd.AddParameter("dir", Chr(34) & Path.Combine(frmMain.strStaticPath.Replace("\", "/") & strInstatObjectPath) & Chr(34)) 'This is bad the wd should be flexible and not automatically set to the instat object directory + clsSource.SetRCommand("source") + clsSource.AddParameter("file", Chr(34) & "Rsetup.R" & Chr(34)) + clsCreateIO.SetOperation("<-") + clsCreateIO.AddParameter("left", strInstatDataObject, iPosition:=0) + clsCreateIO.AddParameter("right", "instat_object$new()", iPosition:=1) + + strScript = "" + strScript = strScript & clsSetWd.ToScript() & Environment.NewLine + strScript = strScript & clsSource.ToScript() & Environment.NewLine + strScript = strScript & clsCreateIO.ToScript() + + Return strScript + End Function Public Sub CreateNewInstatObject() RunScript(strInstatDataObject & " <- instat_object$new()", strComment:="Defining new Instat Object") diff --git a/instat/dlgAutoSaveRecovery.Designer.vb b/instat/dlgAutoSaveRecovery.Designer.vb new file mode 100644 index 00000000000..61b560afd3f --- /dev/null +++ b/instat/dlgAutoSaveRecovery.Designer.vb @@ -0,0 +1,292 @@ + _ +Partial Class dlgAutoSaveRecovery + 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.lblAutoRecoverMessage = New System.Windows.Forms.Label() + Me.cmdRunLog = New System.Windows.Forms.Button() + Me.cmdNewSession = New System.Windows.Forms.Button() + Me.cmdLoadData = New System.Windows.Forms.Button() + Me.lblBackupLogDetected = New System.Windows.Forms.Label() + Me.cmdSaveLog = New System.Windows.Forms.Button() + Me.cmdSaveDebuggingLog = New System.Windows.Forms.Button() + Me.lblBackupDebuggingLogDetected = New System.Windows.Forms.Label() + Me.cmdSaveData = New System.Windows.Forms.Button() + Me.lblBackupDataDetected = New System.Windows.Forms.Label() + Me.lblDataSavedTo = New System.Windows.Forms.Label() + Me.ucrInputSavedPathData = New instat.ucrInputTextBox() + Me.ucrInputSavedPathLog = New instat.ucrInputTextBox() + Me.lblLogSavedTo = New System.Windows.Forms.Label() + Me.ucrInputSavedPathDebuggingLog = New instat.ucrInputTextBox() + Me.lblDebuggingLogSavedTo = New System.Windows.Forms.Label() + Me.ucrChkSendDebuggingLog = New instat.ucrCheck() + Me.cmdHelp = New System.Windows.Forms.Button() + Me.grpSavingOptions = New System.Windows.Forms.GroupBox() + Me.grpEndChoice = New System.Windows.Forms.GroupBox() + Me.grpSavingOptions.SuspendLayout() + Me.grpEndChoice.SuspendLayout() + Me.SuspendLayout() + ' + 'lblAutoRecoverMessage + ' + Me.lblAutoRecoverMessage.Dock = System.Windows.Forms.DockStyle.Top + Me.lblAutoRecoverMessage.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.lblAutoRecoverMessage.Location = New System.Drawing.Point(0, 0) + Me.lblAutoRecoverMessage.Name = "lblAutoRecoverMessage" + Me.lblAutoRecoverMessage.Size = New System.Drawing.Size(762, 91) + Me.lblAutoRecoverMessage.TabIndex = 0 + Me.lblAutoRecoverMessage.Text = "We have detected that R-Instat may have closed unexpectedly." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Below are your auto" & + " recovery options." + Me.lblAutoRecoverMessage.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + ' + 'cmdRunLog + ' + Me.cmdRunLog.Location = New System.Drawing.Point(39, 24) + Me.cmdRunLog.Name = "cmdRunLog" + Me.cmdRunLog.Size = New System.Drawing.Size(131, 29) + Me.cmdRunLog.TabIndex = 1 + Me.cmdRunLog.Text = "Run Backup Log" + Me.cmdRunLog.UseVisualStyleBackColor = True + ' + 'cmdNewSession + ' + Me.cmdNewSession.Location = New System.Drawing.Point(341, 24) + Me.cmdNewSession.Name = "cmdNewSession" + Me.cmdNewSession.Size = New System.Drawing.Size(131, 29) + Me.cmdNewSession.TabIndex = 2 + Me.cmdNewSession.Text = "Start New Session" + Me.cmdNewSession.UseVisualStyleBackColor = True + ' + 'cmdLoadData + ' + Me.cmdLoadData.Location = New System.Drawing.Point(190, 24) + Me.cmdLoadData.Name = "cmdLoadData" + Me.cmdLoadData.Size = New System.Drawing.Size(131, 29) + Me.cmdLoadData.TabIndex = 3 + Me.cmdLoadData.Text = "Load Backup Data" + Me.cmdLoadData.UseVisualStyleBackColor = True + ' + 'lblBackupLogDetected + ' + Me.lblBackupLogDetected.AutoSize = True + Me.lblBackupLogDetected.Location = New System.Drawing.Point(11, 76) + Me.lblBackupLogDetected.Name = "lblBackupLogDetected" + Me.lblBackupLogDetected.Size = New System.Drawing.Size(131, 13) + Me.lblBackupLogDetected.TabIndex = 4 + Me.lblBackupLogDetected.Text = "Backup Log File Detected" + ' + 'cmdSaveLog + ' + Me.cmdSaveLog.Location = New System.Drawing.Point(203, 68) + Me.cmdSaveLog.Name = "cmdSaveLog" + Me.cmdSaveLog.Size = New System.Drawing.Size(176, 29) + Me.cmdSaveLog.TabIndex = 5 + Me.cmdSaveLog.Text = "Save Backup Log..." + Me.cmdSaveLog.UseVisualStyleBackColor = True + ' + 'cmdSaveDebuggingLog + ' + Me.cmdSaveDebuggingLog.Location = New System.Drawing.Point(203, 115) + Me.cmdSaveDebuggingLog.Name = "cmdSaveDebuggingLog" + Me.cmdSaveDebuggingLog.Size = New System.Drawing.Size(176, 29) + Me.cmdSaveDebuggingLog.TabIndex = 7 + Me.cmdSaveDebuggingLog.Text = "Save Backup Debugging Log..." + Me.cmdSaveDebuggingLog.UseVisualStyleBackColor = True + ' + 'lblBackupDebuggingLogDetected + ' + Me.lblBackupDebuggingLogDetected.AutoSize = True + Me.lblBackupDebuggingLogDetected.Location = New System.Drawing.Point(11, 123) + Me.lblBackupDebuggingLogDetected.Name = "lblBackupDebuggingLogDetected" + Me.lblBackupDebuggingLogDetected.Size = New System.Drawing.Size(186, 13) + Me.lblBackupDebuggingLogDetected.TabIndex = 6 + Me.lblBackupDebuggingLogDetected.Text = "Backup Debugging Log File Detected" + ' + 'cmdSaveData + ' + Me.cmdSaveData.Location = New System.Drawing.Point(203, 21) + Me.cmdSaveData.Name = "cmdSaveData" + Me.cmdSaveData.Size = New System.Drawing.Size(176, 29) + Me.cmdSaveData.TabIndex = 9 + Me.cmdSaveData.Text = "Save Backup Data..." + Me.cmdSaveData.UseVisualStyleBackColor = True + ' + 'lblBackupDataDetected + ' + Me.lblBackupDataDetected.AutoSize = True + Me.lblBackupDataDetected.Location = New System.Drawing.Point(11, 29) + Me.lblBackupDataDetected.Name = "lblBackupDataDetected" + Me.lblBackupDataDetected.Size = New System.Drawing.Size(136, 13) + Me.lblBackupDataDetected.TabIndex = 8 + Me.lblBackupDataDetected.Text = "Backup Data File Detected" + ' + 'lblDataSavedTo + ' + Me.lblDataSavedTo.AutoSize = True + Me.lblDataSavedTo.Location = New System.Drawing.Point(398, 29) + Me.lblDataSavedTo.Name = "lblDataSavedTo" + Me.lblDataSavedTo.Size = New System.Drawing.Size(55, 13) + Me.lblDataSavedTo.TabIndex = 11 + Me.lblDataSavedTo.Text = "Saving at:" + ' + 'ucrInputSavedPathData + ' + Me.ucrInputSavedPathData.AddQuotesIfUnrecognised = True + Me.ucrInputSavedPathData.IsMultiline = False + Me.ucrInputSavedPathData.IsReadOnly = False + Me.ucrInputSavedPathData.Location = New System.Drawing.Point(468, 27) + Me.ucrInputSavedPathData.Name = "ucrInputSavedPathData" + Me.ucrInputSavedPathData.Size = New System.Drawing.Size(258, 21) + Me.ucrInputSavedPathData.TabIndex = 12 + ' + 'ucrInputSavedPathLog + ' + Me.ucrInputSavedPathLog.AddQuotesIfUnrecognised = True + Me.ucrInputSavedPathLog.IsMultiline = False + Me.ucrInputSavedPathLog.IsReadOnly = False + Me.ucrInputSavedPathLog.Location = New System.Drawing.Point(468, 76) + Me.ucrInputSavedPathLog.Name = "ucrInputSavedPathLog" + Me.ucrInputSavedPathLog.Size = New System.Drawing.Size(258, 21) + Me.ucrInputSavedPathLog.TabIndex = 14 + ' + 'lblLogSavedTo + ' + Me.lblLogSavedTo.AutoSize = True + Me.lblLogSavedTo.Location = New System.Drawing.Point(398, 78) + Me.lblLogSavedTo.Name = "lblLogSavedTo" + Me.lblLogSavedTo.Size = New System.Drawing.Size(55, 13) + Me.lblLogSavedTo.TabIndex = 13 + Me.lblLogSavedTo.Text = "Saving at:" + ' + 'ucrInputSavedPathDebuggingLog + ' + Me.ucrInputSavedPathDebuggingLog.AddQuotesIfUnrecognised = True + Me.ucrInputSavedPathDebuggingLog.IsMultiline = False + Me.ucrInputSavedPathDebuggingLog.IsReadOnly = False + Me.ucrInputSavedPathDebuggingLog.Location = New System.Drawing.Point(468, 123) + Me.ucrInputSavedPathDebuggingLog.Name = "ucrInputSavedPathDebuggingLog" + Me.ucrInputSavedPathDebuggingLog.Size = New System.Drawing.Size(258, 21) + Me.ucrInputSavedPathDebuggingLog.TabIndex = 16 + ' + 'lblDebuggingLogSavedTo + ' + Me.lblDebuggingLogSavedTo.AutoSize = True + Me.lblDebuggingLogSavedTo.Location = New System.Drawing.Point(398, 125) + Me.lblDebuggingLogSavedTo.Name = "lblDebuggingLogSavedTo" + Me.lblDebuggingLogSavedTo.Size = New System.Drawing.Size(55, 13) + Me.lblDebuggingLogSavedTo.TabIndex = 15 + Me.lblDebuggingLogSavedTo.Text = "Saving at:" + ' + 'ucrChkSendDebuggingLog + ' + Me.ucrChkSendDebuggingLog.Checked = False + Me.ucrChkSendDebuggingLog.Location = New System.Drawing.Point(12, 254) + Me.ucrChkSendDebuggingLog.Name = "ucrChkSendDebuggingLog" + Me.ucrChkSendDebuggingLog.Size = New System.Drawing.Size(266, 20) + Me.ucrChkSendDebuggingLog.TabIndex = 17 + ' + 'cmdHelp + ' + Me.cmdHelp.Location = New System.Drawing.Point(660, 254) + Me.cmdHelp.Name = "cmdHelp" + Me.cmdHelp.Size = New System.Drawing.Size(78, 29) + Me.cmdHelp.TabIndex = 18 + Me.cmdHelp.Text = "Help" + Me.cmdHelp.UseVisualStyleBackColor = True + ' + 'grpSavingOptions + ' + Me.grpSavingOptions.Controls.Add(Me.lblBackupDataDetected) + Me.grpSavingOptions.Controls.Add(Me.lblBackupLogDetected) + Me.grpSavingOptions.Controls.Add(Me.cmdSaveLog) + Me.grpSavingOptions.Controls.Add(Me.ucrInputSavedPathDebuggingLog) + Me.grpSavingOptions.Controls.Add(Me.lblBackupDebuggingLogDetected) + Me.grpSavingOptions.Controls.Add(Me.lblDebuggingLogSavedTo) + Me.grpSavingOptions.Controls.Add(Me.cmdSaveDebuggingLog) + Me.grpSavingOptions.Controls.Add(Me.ucrInputSavedPathLog) + Me.grpSavingOptions.Controls.Add(Me.cmdSaveData) + Me.grpSavingOptions.Controls.Add(Me.lblLogSavedTo) + Me.grpSavingOptions.Controls.Add(Me.lblDataSavedTo) + Me.grpSavingOptions.Controls.Add(Me.ucrInputSavedPathData) + Me.grpSavingOptions.Location = New System.Drawing.Point(12, 85) + Me.grpSavingOptions.Name = "grpSavingOptions" + Me.grpSavingOptions.Size = New System.Drawing.Size(738, 154) + Me.grpSavingOptions.TabIndex = 19 + Me.grpSavingOptions.TabStop = False + Me.grpSavingOptions.Text = "Saving Options" + ' + 'grpEndChoice + ' + Me.grpEndChoice.Controls.Add(Me.cmdRunLog) + Me.grpEndChoice.Controls.Add(Me.cmdNewSession) + Me.grpEndChoice.Controls.Add(Me.cmdLoadData) + Me.grpEndChoice.Location = New System.Drawing.Point(124, 294) + Me.grpEndChoice.Name = "grpEndChoice" + Me.grpEndChoice.Size = New System.Drawing.Size(509, 66) + Me.grpEndChoice.TabIndex = 20 + Me.grpEndChoice.TabStop = False + Me.grpEndChoice.Text = "Choose one of the following to proceed" + ' + 'dlgAutoSaveRecovery + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(762, 371) + Me.Controls.Add(Me.grpEndChoice) + Me.Controls.Add(Me.grpSavingOptions) + Me.Controls.Add(Me.cmdHelp) + Me.Controls.Add(Me.ucrChkSendDebuggingLog) + Me.Controls.Add(Me.lblAutoRecoverMessage) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "dlgAutoSaveRecovery" + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen + Me.Text = "Auto Save Recovery Options" + Me.grpSavingOptions.ResumeLayout(False) + Me.grpSavingOptions.PerformLayout() + Me.grpEndChoice.ResumeLayout(False) + Me.ResumeLayout(False) + + End Sub + + Friend WithEvents lblAutoRecoverMessage As Label + Friend WithEvents cmdRunLog As Button + Friend WithEvents cmdNewSession As Button + Friend WithEvents cmdLoadData As Button + Friend WithEvents lblBackupLogDetected As Label + Friend WithEvents cmdSaveLog As Button + Friend WithEvents cmdSaveDebuggingLog As Button + Friend WithEvents lblBackupDebuggingLogDetected As Label + Friend WithEvents cmdSaveData As Button + Friend WithEvents lblBackupDataDetected As Label + Friend WithEvents lblDataSavedTo As Label + Friend WithEvents ucrInputSavedPathData As ucrInputTextBox + Friend WithEvents ucrInputSavedPathLog As ucrInputTextBox + Friend WithEvents lblLogSavedTo As Label + Friend WithEvents ucrInputSavedPathDebuggingLog As ucrInputTextBox + Friend WithEvents lblDebuggingLogSavedTo As Label + Friend WithEvents ucrChkSendDebuggingLog As ucrCheck + Friend WithEvents cmdHelp As Button + Friend WithEvents grpSavingOptions As GroupBox + Friend WithEvents grpEndChoice As GroupBox +End Class diff --git a/instat/dlgAutoSaveRecovery.resx b/instat/dlgAutoSaveRecovery.resx new file mode 100644 index 00000000000..1af7de150c9 --- /dev/null +++ b/instat/dlgAutoSaveRecovery.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/dlgAutoSaveRecovery.vb b/instat/dlgAutoSaveRecovery.vb new file mode 100644 index 00000000000..df0a0525111 --- /dev/null +++ b/instat/dlgAutoSaveRecovery.vb @@ -0,0 +1,138 @@ +' Instat-R +' Copyright (C) 2015 +' +' 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 k +' along with this program. If not, see . + +Imports instat.Translations +Imports System.IO + +Public Class dlgAutoSaveRecovery + Private strScript As String + Private strLoadDateFilePath As String + Public strAutoSavedDataFilePaths() As String + Public strAutoSavedLogFilePaths() As String + Public strAutoSavedDebuggingLogFilePaths() As String + + Private Sub dlgAutoSaveRecovery_Load(sender As Object, e As EventArgs) Handles MyBase.Load + ucrChkSendDebuggingLog.SetText("Send Debugging Log to R-Instat Team") + strScript = "" + strLoadDateFilePath = "" + If strAutoSavedDataFilePaths IsNot Nothing AndAlso strAutoSavedDataFilePaths.Count > 0 Then + lblBackupDataDetected.Text = "Backup Data File Detected" + cmdSaveData.Enabled = True + Else + lblBackupDataDetected.Text = "No Backup Data File Detected" + cmdSaveData.Enabled = False + End If + If strAutoSavedLogFilePaths IsNot Nothing AndAlso strAutoSavedLogFilePaths.Count > 0 Then + lblBackupLogDetected.Text = "Backup Log File Detected" + cmdSaveLog.Enabled = True + Else + lblBackupLogDetected.Text = "No Backup Log File Detected" + cmdSaveLog.Enabled = False + End If + If strAutoSavedDebuggingLogFilePaths IsNot Nothing AndAlso strAutoSavedDebuggingLogFilePaths.Count > 0 Then + lblBackupDebuggingLogDetected.Text = "Backup Debugging Log File Detected" + cmdSaveDebuggingLog.Enabled = True + ucrChkSendDebuggingLog.Visible = True + ucrChkSendDebuggingLog.Checked = True + Else + lblBackupDebuggingLogDetected.Text = "No Backup Debugging Log File Detected" + cmdSaveDebuggingLog.Enabled = False + ucrChkSendDebuggingLog.Visible = False + ucrChkSendDebuggingLog.Checked = False + End If + ucrInputSavedPathData.IsReadOnly = True + ucrInputSavedPathDebuggingLog.IsReadOnly = True + ucrInputSavedPathLog.IsReadOnly = True + + cmdRunLog.Enabled = False + cmdLoadData.Enabled = False + cmdNewSession.Enabled = True + autoTranslate(Me) + End Sub + + Public Function GetScript() As String + Return strScript + End Function + + Public Function GetDataFilePath() As String + Return strLoadDateFilePath + End Function + + Private Sub cmdSaveData_Click(sender As Object, e As EventArgs) Handles cmdSaveData.Click + Using dlgSave As New SaveFileDialog + dlgSave.Title = "Save Data File" + dlgSave.Filter = "RDS Data file (*.RDS)|*.RDS" + If dlgSave.ShowDialog() = DialogResult.OK Then + strLoadDateFilePath = dlgSave.FileName + ucrInputSavedPathData.SetName(dlgSave.FileName) + Else + ucrInputSavedPathData.SetName("") + End If + End Using + End Sub + + Private Sub cmdSaveLog_Click(sender As Object, e As EventArgs) Handles cmdSaveLog.Click + Using dlgSave As New SaveFileDialog + dlgSave.Title = "Save Log File" + dlgSave.Filter = "R script file (*.R)|*.R" + If dlgSave.ShowDialog() = DialogResult.OK Then + ucrInputSavedPathLog.SetName(dlgSave.FileName) + Else + ucrInputSavedPathLog.SetName("") + End If + End Using + End Sub + + Private Sub cmdSaveDebuggingLog_Click(sender As Object, e As EventArgs) Handles cmdSaveDebuggingLog.Click + Using dlgSave As New SaveFileDialog + dlgSave.Title = "Save Debugging Log File" + dlgSave.Filter = "R script file (*.R)|*.R" + If dlgSave.ShowDialog() = DialogResult.OK Then + ucrInputSavedPathDebuggingLog.SetName(dlgSave.FileName) + Else + ucrInputSavedPathDebuggingLog.SetName("") + End If + End Using + End Sub + + Private Sub cmdRunLog_Click(sender As Object, e As EventArgs) Handles cmdRunLog.Click + If MsgBox("Are you sure you are finished? You cannot return to this dialog after leaving and any unsaved recovered files will be lost." & Environment.NewLine & "Warning: running the log file can fail if files have been moved.", MessageBoxButtons.YesNo, "Are you sure you are finished?") Then + Close() + End If + End Sub + + Private Sub SaveFiles() + If Not ucrInputSavedPathData.IsEmpty Then + If File.Exists(strAutoSavedDataFilePaths(0)) Then + Try + File.Copy(strAutoSavedDataFilePaths(0), ucrInputSavedPathData.GetText()) + Catch ex As Exception + MsgBox("Could not copy data file from: " & strAutoSavedDataFilePaths(0) & " to: " & ucrInputSavedPathLog.GetText() & Environment.NewLine & ex.Message) + End Try + End If + End If + If Not ucrInputSavedPathLog.IsEmpty Then + If File.Exists(strAutoSavedLogFilePaths(0)) Then + Try + File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText()) + Catch ex As Exception + MsgBox("Could not copy log file from: " & strAutoSavedLogFilePaths(0) & " to: " & ucrInputSavedPathLog.GetText() & Environment.NewLine & ex.Message) + End Try + End If + End If + + End Sub +End Class \ No newline at end of file diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 864e3bcc656..35ed2b3550b 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -37,7 +37,10 @@ Public Class frmMain Private ctrActive As Control Private WithEvents timer As New System.Windows.Forms.Timer Private iAutoSaveTime As Integer = 300000 - Private strAutoSaveDataFilePath As String = Path.Combine(Path.GetTempPath, "R-Instat_auto_save.rds") + Public strAutoSaveDataFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_data_auto_save") + Public strAutoSaveLogFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_log_auto_save") + Public strCurrentAutoSaveDataFilePath As String + Public strCurrentAutoSaveLogFilePath As String 'This is the default data frame to appear in the data frame selector 'If "" the current worksheet will be used @@ -69,7 +72,7 @@ Public Class frmMain strInstatOptionsFile = "Options.bin" strSaveFilePath = "" - clsRLink.SetEngine() + StartREngine() 'Setting the properties of R Interface clsRLink.SetLog(ucrLogWindow.txtLog) @@ -80,15 +83,15 @@ Public Class frmMain 'Do this after loading options because interval depends on options timer.Interval = iAutoSaveTime timer.Start() - AddHandler System.Windows.Forms.Application.Idle, AddressOf Application_Idle - 'Sets up R source files - clsRLink.RSetup() + AddHandler System.Windows.Forms.Application.Idle, AddressOf Application_Idle 'Sets up the Recent items clsRecentItems.setToolStripItems(mnuFile, mnuTbShowLast10, sepStart, sepEnd) 'checks existence of MRU list clsRecentItems.checkOnLoad() + + CheckAutoSave() End Sub Private Sub Application_Idle(sender As Object, e As EventArgs) @@ -98,8 +101,44 @@ Public Class frmMain End If End Sub + Private Sub StartREngine() + Dim iLogFiles As Integer = 0 + Dim iDataFiles As Integer = 0 + Dim strScript As String = "" + Dim strDataFilePath As String = "" + Dim strAutoSavedLogFilePaths() As String = Nothing + Dim strAutoSavedDataFilePaths() As String = Nothing + + If Process.GetProcessesByName(Path.GetFileNameWithoutExtension(Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1 Then + clsRLink.StartREngine(clsRLink.GetRSetupScript()) + Else + If (Directory.Exists(strAutoSaveLogFolderPath)) Then + strAutoSavedLogFilePaths = My.Computer.FileSystem.GetFiles(strAutoSaveLogFolderPath).ToArray + iLogFiles = strAutoSavedLogFilePaths.Count + End If + If Directory.Exists(strAutoSaveDataFolderPath) Then + strAutoSavedDataFilePaths = My.Computer.FileSystem.GetFiles(strAutoSaveDataFolderPath).ToArray + iDataFiles = strAutoSavedDataFilePaths.Count + End If + If iLogFiles > 0 OrElse iDataFiles > 0 Then + If MsgBox("We have detected that R-Instat may have closed unexpectadly. Would you like to see auto recovery options?", MessageBoxButtons.YesNo, "Auto Recovery") Then + dlgAutoSaveRecovery.strAutoSavedLogFilePaths = strAutoSavedLogFilePaths + dlgAutoSaveRecovery.strAutoSavedDataFilePaths = strAutoSavedDataFilePaths + dlgAutoSaveRecovery.ShowDialog() + strScript = dlgAutoSaveRecovery.GetScript() + strDataFilePath = dlgAutoSaveRecovery.GetDataFilePath() + End If + End If + clsRLink.StartREngine(strScript) + If strDataFilePath <> "" Then + clsRLink.LoadInstatDataObjectFromFile(strDataFilePath, strComment:="Loading auto recovered data file") + End If + End If + End Sub + Private Sub CheckAutoSave() - If File.Exists(strAutoSaveDataFilePath) Then + If File.Exists(strAutoSaveDataFolderPath) OrElse File.Exists(strAutoSaveLogFolderPath) Then + MsgBox("R-Instat did not close properly!", MsgBoxStyle.MsgBoxHelp) End If End Sub @@ -790,6 +829,7 @@ Public Class frmMain clsRecentItems.saveOnClose() SaveInstatOptions(Path.Combine(strAppDataPath, strInstatOptionsFile)) DeleteAutoSaveData() + 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 @@ -804,7 +844,7 @@ Public Class frmMain If clsRLink.bInstatObjectExists Then clsSaveRDS.SetRCommand("saveRDS") clsSaveRDS.AddParameter("object", clsRLink.strInstatDataObject) - clsSaveRDS.AddParameter("file", Chr(34) & strAutoSaveDataFilePath.Replace("\", "/") & Chr(34)) + clsSaveRDS.AddParameter("file", Chr(34) & strAutoSaveDataFolderPath.Replace("\", "/") & Chr(34)) Dim t As New Stopwatch t.Start() clsRLink.RunInternalScript(clsSaveRDS.ToScript()) @@ -815,9 +855,17 @@ Public Class frmMain Public Sub DeleteAutoSaveData() Try - File.Delete(strAutoSaveDataFilePath) + File.Delete(strCurrentAutoSaveDataFilePath) + Catch ex As Exception + MsgBox("Could not delete auto save data file at: " & strCurrentAutoSaveDataFilePath & Environment.NewLine & ex.Message) + End Try + End Sub + + Public Sub DeleteAutoSaveLog() + Try + File.Delete(strCurrentAutoSaveLogFilePath) Catch ex As Exception - MsgBox("Could not delete auto save data file at: " & strAutoSaveDataFilePath & Environment.NewLine & ex.Message) + MsgBox("Could not delete auto save log file at: " & strCurrentAutoSaveLogFilePath & Environment.NewLine & ex.Message) End Try End Sub diff --git a/instat/instat.vbproj b/instat/instat.vbproj index 539f10bdaba..a14da8798cb 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -167,6 +167,12 @@ Form + + dlgAutoSaveRecovery.vb + + + Form + dlgCalculationsSummary.vb @@ -2215,6 +2221,9 @@ dlgAddLink.vb + + dlgAutoSaveRecovery.vb + dlgCalculationsSummary.vb From 14dbadc3496335f37760c7f2f0bae50342a47e43 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sat, 24 Jun 2017 21:40:56 +0100 Subject: [PATCH 170/201] fuxed bug in reading options class implemented auto recovery options --- instat/clsInstatOptions.vb | 2 +- instat/clsRLink.vb | 67 ++++++++++--------- instat/dlgAutoSaveRecovery.vb | 78 ++++++++++++++++------ instat/frmMain.vb | 118 +++++++++++++++++++++------------- 4 files changed, 168 insertions(+), 97 deletions(-) diff --git a/instat/clsInstatOptions.vb b/instat/clsInstatOptions.vb index 58a50f51b3f..23e2b9f14d8 100644 --- a/instat/clsInstatOptions.vb +++ b/instat/clsInstatOptions.vb @@ -114,7 +114,7 @@ Imports RDotNet SetMaxRows(DEFAULTiMaxRows) End If - If iMaxRows.HasValue Then + If iMaxCols.HasValue Then SetMaxCols(iMaxCols) Else SetMaxCols(DEFAULTiMaxCols) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 0aad1dbf84a..9c6308165a3 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -25,13 +25,15 @@ Public Class RLink Dim strInstatObjectPath As String = "/InstatObject/R" 'path to the Instat object Public strInstatDataObject As String = "InstatDataObject" - Private strDebugLogFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_debug_logs") Private bFirstRCode As Boolean = True Private bDebugLogExists As Boolean = False Private bAutoSaveLogExists As Boolean = False Private bFirstLogCode As Boolean = True Public bRCodeRunning As Boolean = False + Public strAutoSaveLogFilePath As String = "" + Public strAutoSaveDebugLogFilePath As String = "" + Public clsEngine As REngine Public bREngineInitialised As Boolean = False Public rtbOutput As New ucrWPFRichTextBox @@ -74,7 +76,7 @@ Public Class RLink If strScript = "" Then strScript = GetRSetupScript() iCallType = 0 - strComment = "" + strComment = "Setting working directory, sources R code and loading R packages" bSeparateThread = True End If RunScript(strScript:=strScript, iCallType:=iCallType, strComment:=strComment, bSeparateThread:=bSeparateThread) @@ -266,15 +268,26 @@ Public Class RLink End Function Private Sub AppendToAutoSaveLog(strScript As String) + Dim strTempFile As String + Dim i As Integer = 1 Try If bFirstLogCode Then - 'File.WriteAllText(frmMain.strAutoSaveLogFilePath, "") + If Not Directory.Exists(frmMain.strAutoSaveLogFolderPath) Then + Directory.CreateDirectory(frmMain.strAutoSaveLogFolderPath) + End If + strTempFile = "log.R" + While File.Exists(Path.Combine(frmMain.strAutoSaveLogFolderPath, strTempFile)) + i = i + 1 + strTempFile = "log" & i & ".R" + End While + strAutoSaveLogFilePath = Path.Combine(frmMain.strAutoSaveLogFolderPath, strTempFile) + File.WriteAllText(strAutoSaveLogFilePath, "") bAutoSaveLogExists = True End If If bAutoSaveLogExists Then - 'Using w As StreamWriter = File.AppendText(frmMain.strAutoSaveLogFilePath) - 'w.WriteLine(strScript) - 'End Using + Using w As StreamWriter = File.AppendText(strAutoSaveLogFilePath) + w.WriteLine(strScript) + End Using End If Catch ex As Exception 'MsgBox("Could not add script to auto save log file at:" & frmMain.strAutoSaveLogFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Auot save Log File") @@ -283,26 +296,7 @@ Public Class RLink bFirstLogCode = False End Try End Sub - - Public Sub RunLogFile(strFilePath As String, Optional bDeleteFile As Boolean = False) - Dim strLines() As String - Dim strScript As String - Try - If File.Exists(strFilePath) Then - strLines = File.ReadAllLines(strFilePath) - strScript = String.Join(Environment.NewLine, strLines) - 'Delete before running in case this is an auto save - If bDeleteFile Then - File.Delete(strFilePath) - End If - RunScript(strScript) - End If - Catch ex As Exception - MsgBox("Could not read log file at:" & strFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Cannot Read Log File") - End Try - End Sub - Public Sub RunScript(strScript As String, Optional iCallType As Integer = 0, Optional strComment As String = "", Optional bSeparateThread As Boolean = True) Dim strCapturedScript As String Dim expTemp As RDotNet.SymbolicExpression @@ -325,7 +319,6 @@ Public Class RLink End If If bLog Then txtLog.Text = txtLog.Text & strScriptWithComment & Environment.NewLine - AppendToAutoSaveLog(strScriptWithComment & Environment.NewLine) End If If bOutput Then If strComment <> "" AndAlso bShowCommands Then @@ -443,6 +436,7 @@ Public Class RLink rtbOutput.AppendText(clrOutput, fOutput, strOutput) End If End If + AppendToAutoSaveLog(strScriptWithComment & Environment.NewLine) frmMain.clsGrids.UpdateGrids() End Sub @@ -499,6 +493,8 @@ Public Class RLink Dim evtWaitHandleWaitDisplayDone As New System.Threading.AutoResetEvent(False) Dim evtWaitHandleDelayDone As New System.Threading.AutoResetEvent(False) Dim bReturn As Boolean = True + Dim i As Integer = 1 + Dim strTempFile As String While bRCodeRunning Threading.Thread.Sleep(5) @@ -507,8 +503,17 @@ Public Class RLink If clsEngine IsNot Nothing Then If bFirstRCode Then Try - File.WriteAllText(strDebugLogFolderPath, "") - Using w As StreamWriter = File.AppendText(strDebugLogFolderPath) + If Not Directory.Exists(frmMain.strAutoSaveDebugLogFolderPath) Then + Directory.CreateDirectory(frmMain.strAutoSaveDebugLogFolderPath) + End If + strTempFile = "debug_log.R" + While File.Exists(Path.Combine(frmMain.strAutoSaveDebugLogFolderPath, strTempFile)) + i = i + 1 + strTempFile = "debug_log" & i & ".R" + End While + strAutoSaveDebugLogFilePath = Path.Combine(frmMain.strAutoSaveDebugLogFolderPath, strTempFile) + File.WriteAllText(strAutoSaveDebugLogFilePath, "") + Using w As StreamWriter = File.AppendText(strAutoSaveDebugLogFilePath) w.WriteLine("# ****************************") w.WriteLine("# R-Instat debugging log file") w.WriteLine("# ****************************") @@ -520,7 +525,7 @@ Public Class RLink End Using bDebugLogExists = True Catch ex As Exception - MsgBox("Could not create debug log file at:" & strDebugLogFolderPath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") + MsgBox("Could not create debug log file at:" & strAutoSaveDebugLogFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") bDebugLogExists = False Finally bFirstRCode = False @@ -530,14 +535,14 @@ Public Class RLink If bDebugLogExists Then Dim ts As New Stopwatch ts.Start() - Using w As StreamWriter = File.AppendText(strDebugLogFolderPath) + Using w As StreamWriter = File.AppendText(strAutoSaveDebugLogFilePath) w.WriteLine(strScript) End Using ts.Stop() Console.WriteLine(ts.ElapsedMilliseconds) End If Catch ex As Exception - MsgBox("Could not add text to debug log file at:" & strDebugLogFolderPath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") + MsgBox("Could not add text to debug log file at:" & strAutoSaveDebugLogFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") End Try Try If bSeparateThread Then diff --git a/instat/dlgAutoSaveRecovery.vb b/instat/dlgAutoSaveRecovery.vb index df0a0525111..2abdf9101ab 100644 --- a/instat/dlgAutoSaveRecovery.vb +++ b/instat/dlgAutoSaveRecovery.vb @@ -19,10 +19,12 @@ Imports System.IO Public Class dlgAutoSaveRecovery Private strScript As String + Public strAutoSavedLogScript As String Private strLoadDateFilePath As String Public strAutoSavedDataFilePaths() As String Public strAutoSavedLogFilePaths() As String Public strAutoSavedDebuggingLogFilePaths() As String + Private bUserClose As Boolean = True Private Sub dlgAutoSaveRecovery_Load(sender As Object, e As EventArgs) Handles MyBase.Load ucrChkSendDebuggingLog.SetText("Send Debugging Log to R-Instat Team") @@ -31,16 +33,20 @@ Public Class dlgAutoSaveRecovery If strAutoSavedDataFilePaths IsNot Nothing AndAlso strAutoSavedDataFilePaths.Count > 0 Then lblBackupDataDetected.Text = "Backup Data File Detected" cmdSaveData.Enabled = True + cmdLoadData.Enabled = True Else lblBackupDataDetected.Text = "No Backup Data File Detected" cmdSaveData.Enabled = False + cmdLoadData.Enabled = False End If If strAutoSavedLogFilePaths IsNot Nothing AndAlso strAutoSavedLogFilePaths.Count > 0 Then lblBackupLogDetected.Text = "Backup Log File Detected" cmdSaveLog.Enabled = True + cmdRunLog.Enabled = True Else lblBackupLogDetected.Text = "No Backup Log File Detected" cmdSaveLog.Enabled = False + cmdRunLog.Enabled = False End If If strAutoSavedDebuggingLogFilePaths IsNot Nothing AndAlso strAutoSavedDebuggingLogFilePaths.Count > 0 Then lblBackupDebuggingLogDetected.Text = "Backup Debugging Log File Detected" @@ -57,8 +63,6 @@ Public Class dlgAutoSaveRecovery ucrInputSavedPathDebuggingLog.IsReadOnly = True ucrInputSavedPathLog.IsReadOnly = True - cmdRunLog.Enabled = False - cmdLoadData.Enabled = False cmdNewSession.Enabled = True autoTranslate(Me) End Sub @@ -76,7 +80,6 @@ Public Class dlgAutoSaveRecovery dlgSave.Title = "Save Data File" dlgSave.Filter = "RDS Data file (*.RDS)|*.RDS" If dlgSave.ShowDialog() = DialogResult.OK Then - strLoadDateFilePath = dlgSave.FileName ucrInputSavedPathData.SetName(dlgSave.FileName) Else ucrInputSavedPathData.SetName("") @@ -108,31 +111,68 @@ Public Class dlgAutoSaveRecovery End Using End Sub - Private Sub cmdRunLog_Click(sender As Object, e As EventArgs) Handles cmdRunLog.Click - If MsgBox("Are you sure you are finished? You cannot return to this dialog after leaving and any unsaved recovered files will be lost." & Environment.NewLine & "Warning: running the log file can fail if files have been moved.", MessageBoxButtons.YesNo, "Are you sure you are finished?") Then - Close() + Private Sub SaveFiles() + If File.Exists(strAutoSavedDataFilePaths(0)) AndAlso Not ucrInputSavedPathData.IsEmpty() Then + Try + File.Copy(strAutoSavedDataFilePaths(0), ucrInputSavedPathData.GetText()) + Catch ex As Exception + MsgBox("Could not copy data file from: " & strAutoSavedDataFilePaths(0) & " to: " & ucrInputSavedPathData.GetText() & Environment.NewLine & ex.Message) + End Try + End If + If File.Exists(strAutoSavedLogFilePaths(0)) AndAlso Not ucrInputSavedPathLog.IsEmpty() Then + Try + File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText()) + Catch ex As Exception + MsgBox("Could not copy log file from: " & strAutoSavedLogFilePaths(0) & " to: " & ucrInputSavedPathLog.GetText() & Environment.NewLine & ex.Message) + End Try + End If + If File.Exists(strAutoSavedLogFilePaths(0)) AndAlso Not ucrInputSavedPathDebuggingLog.IsEmpty() Then + Try + File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText()) + Catch ex As Exception + MsgBox("Could not copy debugging log file from: " & strAutoSavedDebuggingLogFilePaths(0) & " to: " & ucrInputSavedPathDebuggingLog.GetText() & Environment.NewLine & ex.Message, "Are you finished?") + End Try End If End Sub - Private Sub SaveFiles() - If Not ucrInputSavedPathData.IsEmpty Then - If File.Exists(strAutoSavedDataFilePaths(0)) Then - Try - File.Copy(strAutoSavedDataFilePaths(0), ucrInputSavedPathData.GetText()) - Catch ex As Exception - MsgBox("Could not copy data file from: " & strAutoSavedDataFilePaths(0) & " to: " & ucrInputSavedPathLog.GetText() & Environment.NewLine & ex.Message) - End Try - End If - End If - If Not ucrInputSavedPathLog.IsEmpty Then + Private Sub cmdRunLog_Click(sender As Object, e As EventArgs) Handles cmdRunLog.Click + If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost." & Environment.NewLine & "Warning: running the log file can fail if files have been moved.", MessageBoxButtons.YesNo, "Are you sure you are finished?") Then + SaveFiles() If File.Exists(strAutoSavedLogFilePaths(0)) Then Try - File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText()) + strScript = File.ReadAllText(strAutoSavedLogFilePaths(0)) Catch ex As Exception - MsgBox("Could not copy log file from: " & strAutoSavedLogFilePaths(0) & " to: " & ucrInputSavedPathLog.GetText() & Environment.NewLine & ex.Message) + MsgBox("Could not read log file at: " & strAutoSavedLogFilePaths(0) & Environment.NewLine & ex.Message) + strScript = "" End Try End If + bUserClose = False + Close() + End If + End Sub + + Private Sub cmdLoadData_Click(sender As Object, e As EventArgs) Handles cmdLoadData.Click + If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost.", MessageBoxButtons.YesNo, "Are you finished?") Then + SaveFiles() + strLoadDateFilePath = strAutoSavedDataFilePaths(0) + bUserClose = False + Close() + End If + End Sub + + Private Sub cmdNewSession_Click(sender As Object, e As EventArgs) Handles cmdNewSession.Click + If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost.", MessageBoxButtons.YesNo, "Are you finished?") Then + SaveFiles() + bUserClose = False + Close() End If + End Sub + Private Sub dlgAutoSaveRecovery_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing + If bUserClose Then + If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost.", MessageBoxButtons.YesNo, "Are you finished?") Then + e.Cancel = False + End If + End If End Sub End Class \ No newline at end of file diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 35ed2b3550b..a6763e92fe0 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -25,22 +25,24 @@ Public Class frmMain Public clsRLink As New RLink Public clsGrids As New clsGridLink Public strStaticPath As String - Public strHelpFilePath As String + Public strHelpFilePath As String = "Help\R-Instat.chm" Public strAppDataPath As String - Public strInstatOptionsFile As String + Public strInstatOptionsFile As String = "Options.bin" Public clsInstatOptions As InstatOptions Public clsRecentItems As New clsRecentFiles Public strCurrentDataFrame As String Public dlgLastDialog As Form - Public strSaveFilePath As String + Public strSaveFilePath As String = "" Private mnuItems As New List(Of Form) Private ctrActive As Control Private WithEvents timer As New System.Windows.Forms.Timer - Private iAutoSaveTime As Integer = 300000 + Private iAutoSaveDataTime As Integer = 300000 + Public strAutoSaveDataFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_data_auto_save") Public strAutoSaveLogFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_log_auto_save") - Public strCurrentAutoSaveDataFilePath As String - Public strCurrentAutoSaveLogFilePath As String + Public strAutoSaveDebugLogFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_debug_log_auto_save") + + Public strCurrentAutoSaveDataFilePath As String = "" 'This is the default data frame to appear in the data frame selector 'If "" the current worksheet will be used @@ -57,31 +59,28 @@ Public Class frmMain End Sub Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load - InitialiseOutputWindow() + 'temporary mnuHelpAboutRInstat.Visible = False + InitialiseOutputWindow() clsGrids.SetDataViewer(ucrDataViewer) clsGrids.SetMetadata(ucrDataFrameMeta.grdMetaData) clsGrids.SetVariablesMetadata(ucrColumnMeta.grdVariables) + clsRLink.SetLog(ucrLogWindow.txtLog) + SetToDefaultLayout() strStaticPath = Path.GetFullPath("static") - strHelpFilePath = "Help\R-Instat.chm" strAppDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RInstat\") - strInstatOptionsFile = "Options.bin" - strSaveFilePath = "" - - StartREngine() - 'Setting the properties of R Interface - clsRLink.SetLog(ucrLogWindow.txtLog) + AutoRecoverAndStartREngine() - 'Do this before setting up R Link becuase setup edits Output window which is changed by Options + 'Do this after setting up R Link becuase setup edits Output window which is changed by Options LoadInstatOptions() 'Do this after loading options because interval depends on options - timer.Interval = iAutoSaveTime + timer.Interval = iAutoSaveDataTime timer.Start() AddHandler System.Windows.Forms.Application.Idle, AddressOf Application_Idle @@ -90,8 +89,6 @@ Public Class frmMain clsRecentItems.setToolStripItems(mnuFile, mnuTbShowLast10, sepStart, sepEnd) 'checks existence of MRU list clsRecentItems.checkOnLoad() - - CheckAutoSave() End Sub Private Sub Application_Idle(sender As Object, e As EventArgs) @@ -101,12 +98,14 @@ Public Class frmMain End If End Sub - Private Sub StartREngine() + Private Sub AutoRecoverAndStartREngine() Dim iLogFiles As Integer = 0 + Dim iDebugLog As Integer = 0 Dim iDataFiles As Integer = 0 Dim strScript As String = "" Dim strDataFilePath As String = "" Dim strAutoSavedLogFilePaths() As String = Nothing + Dim strAutoSavedDebugLogFilePaths() As String = Nothing Dim strAutoSavedDataFilePaths() As String = Nothing If Process.GetProcessesByName(Path.GetFileNameWithoutExtension(Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1 Then @@ -116,12 +115,16 @@ Public Class frmMain strAutoSavedLogFilePaths = My.Computer.FileSystem.GetFiles(strAutoSaveLogFolderPath).ToArray iLogFiles = strAutoSavedLogFilePaths.Count End If + If (Directory.Exists(strAutoSaveDebugLogFolderPath)) Then + strAutoSavedDebugLogFilePaths = My.Computer.FileSystem.GetFiles(strAutoSaveDebugLogFolderPath).ToArray + iDebugLog = strAutoSavedDebugLogFilePaths.Count + End If If Directory.Exists(strAutoSaveDataFolderPath) Then strAutoSavedDataFilePaths = My.Computer.FileSystem.GetFiles(strAutoSaveDataFolderPath).ToArray iDataFiles = strAutoSavedDataFilePaths.Count End If If iLogFiles > 0 OrElse iDataFiles > 0 Then - If MsgBox("We have detected that R-Instat may have closed unexpectadly. Would you like to see auto recovery options?", MessageBoxButtons.YesNo, "Auto Recovery") Then + If MsgBox("We have detected that R-Instat may have closed unexpectadly last time." & Environment.NewLine & "Would you like to see auto recovery options?", MessageBoxButtons.YesNo, "Auto Recovery") = MsgBoxResult.Yes Then dlgAutoSaveRecovery.strAutoSavedLogFilePaths = strAutoSavedLogFilePaths dlgAutoSaveRecovery.strAutoSavedDataFilePaths = strAutoSavedDataFilePaths dlgAutoSaveRecovery.ShowDialog() @@ -136,12 +139,6 @@ Public Class frmMain End If End Sub - Private Sub CheckAutoSave() - If File.Exists(strAutoSaveDataFolderPath) OrElse File.Exists(strAutoSaveLogFolderPath) Then - MsgBox("R-Instat did not close properly!", MsgBoxStyle.MsgBoxHelp) - End If - End Sub - Private Sub InitialiseOutputWindow() clsRLink.SetOutput(ucrOutput.ucrRichTextBox) 'TEST temporary : creating the temporary graphs @@ -742,9 +739,9 @@ Public Class frmMain End Sub Private Sub mnuToolsClearOutputWindow_Click(sender As Object, e As EventArgs) Handles mnuToolsClearOutputWindow.Click - Dim dlgResponse As DialogResult - dlgResponse = MessageBox.Show("Are you sure you want to clear the Output Window?", "Clear Output Window", MessageBoxButtons.YesNo) - If dlgResponse = DialogResult.Yes Then + Dim rstResponse As DialogResult + rstResponse = MessageBox.Show("Are you sure you want to clear the Output Window?", "Clear Output Window", MessageBoxButtons.YesNo) + If rstResponse = DialogResult.Yes Then ucrOutput.ucrRichTextBox.rtbOutput.Document.Blocks.Clear() 'To b checked End If End Sub @@ -820,8 +817,12 @@ Public Class frmMain End Sub Private Sub frmMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing - Dim close = MsgBox("Are you sure you want to exit R-Instat?", MessageBoxButtons.YesNo, "Exit") - If close = DialogResult.Yes Then + Dim bClose As DialogResult = DialogResult.Yes + + If e.CloseReason = CloseReason.UserClosing Then + bClose = MsgBox("Are you sure you want to exit R-Instat?", MessageBoxButtons.YesNo, "Exit") + End If + If bClose = DialogResult.Yes Then Try If (Not System.IO.Directory.Exists(strAppDataPath)) Then System.IO.Directory.CreateDirectory(strAppDataPath) @@ -829,6 +830,8 @@ Public Class frmMain clsRecentItems.saveOnClose() SaveInstatOptions(Path.Combine(strAppDataPath, strInstatOptionsFile)) DeleteAutoSaveData() + DeleteAutoSaveLog() + DeleteAutoSaveDebugLog() 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") @@ -840,33 +843,56 @@ Public Class frmMain Public Sub AutoSaveData() Dim clsSaveRDS As New RFunction + Dim strTempFile As String + Dim i As Integer = 0 If clsRLink.bInstatObjectExists Then + If Not Directory.Exists(strAutoSaveDataFolderPath) Then + Directory.CreateDirectory(strAutoSaveDataFolderPath) + End If + If strCurrentAutoSaveDataFilePath = "" Then + strTempFile = "data.rds" + While File.Exists(Path.Combine(strAutoSaveDataFolderPath, strTempFile)) + i = i + 1 + strTempFile = "data" & i & ".rds" + End While + strCurrentAutoSaveDataFilePath = strTempFile + End If clsSaveRDS.SetRCommand("saveRDS") clsSaveRDS.AddParameter("object", clsRLink.strInstatDataObject) - clsSaveRDS.AddParameter("file", Chr(34) & strAutoSaveDataFolderPath.Replace("\", "/") & Chr(34)) - Dim t As New Stopwatch - t.Start() + clsSaveRDS.AddParameter("file", Chr(34) & strCurrentAutoSaveDataFilePath.Replace("\", "/") & Chr(34)) clsRLink.RunInternalScript(clsSaveRDS.ToScript()) - t.Stop() - Console.WriteLine("save time: " & t.ElapsedMilliseconds) End If End Sub Public Sub DeleteAutoSaveData() - Try - File.Delete(strCurrentAutoSaveDataFilePath) - Catch ex As Exception - MsgBox("Could not delete auto save data file at: " & strCurrentAutoSaveDataFilePath & Environment.NewLine & ex.Message) - End Try + If strCurrentAutoSaveDataFilePath <> "" Then + Try + File.Delete(strCurrentAutoSaveDataFilePath) + Catch ex As Exception + MsgBox("Could not delete auto save data file at: " & strCurrentAutoSaveDataFilePath & Environment.NewLine & ex.Message) + End Try + End If End Sub Public Sub DeleteAutoSaveLog() - Try - File.Delete(strCurrentAutoSaveLogFilePath) - Catch ex As Exception - MsgBox("Could not delete auto save log file at: " & strCurrentAutoSaveLogFilePath & Environment.NewLine & ex.Message) - End Try + If clsRLink.strAutoSaveLogFilePath <> "" Then + Try + File.Delete(clsRLink.strAutoSaveLogFilePath) + Catch ex As Exception + MsgBox("Could not delete auto save log file at: " & clsRLink.strAutoSaveLogFilePath & Environment.NewLine & ex.Message) + End Try + End If + End Sub + + Public Sub DeleteAutoSaveDebugLog() + If clsRLink.strAutoSaveDebugLogFilePath <> "" Then + Try + File.Delete(clsRLink.strAutoSaveDebugLogFilePath) + Catch ex As Exception + MsgBox("Could not delete auto save debug log file at: " & clsRLink.strAutoSaveDebugLogFilePath & Environment.NewLine & ex.Message) + End Try + End If End Sub Private Sub mnuOrganiseDataObjectHideDataframes_Click(sender As Object, e As EventArgs) Handles mnuPrepareDataObjectHideDataframes.Click From 42c78c37533f7558dfd0ade38bfccbc75f570025 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sat, 24 Jun 2017 22:48:42 +0100 Subject: [PATCH 171/201] added deleting auto save files after use --- instat/dlgAutoSaveRecovery.vb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/instat/dlgAutoSaveRecovery.vb b/instat/dlgAutoSaveRecovery.vb index 2abdf9101ab..1743afe07bd 100644 --- a/instat/dlgAutoSaveRecovery.vb +++ b/instat/dlgAutoSaveRecovery.vb @@ -115,6 +115,7 @@ Public Class dlgAutoSaveRecovery If File.Exists(strAutoSavedDataFilePaths(0)) AndAlso Not ucrInputSavedPathData.IsEmpty() Then Try File.Copy(strAutoSavedDataFilePaths(0), ucrInputSavedPathData.GetText()) + File.Delete(strAutoSavedDataFilePaths(0)) Catch ex As Exception MsgBox("Could not copy data file from: " & strAutoSavedDataFilePaths(0) & " to: " & ucrInputSavedPathData.GetText() & Environment.NewLine & ex.Message) End Try @@ -122,6 +123,7 @@ Public Class dlgAutoSaveRecovery If File.Exists(strAutoSavedLogFilePaths(0)) AndAlso Not ucrInputSavedPathLog.IsEmpty() Then Try File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText()) + File.Delete(strAutoSavedLogFilePaths(0)) Catch ex As Exception MsgBox("Could not copy log file from: " & strAutoSavedLogFilePaths(0) & " to: " & ucrInputSavedPathLog.GetText() & Environment.NewLine & ex.Message) End Try @@ -129,6 +131,7 @@ Public Class dlgAutoSaveRecovery If File.Exists(strAutoSavedLogFilePaths(0)) AndAlso Not ucrInputSavedPathDebuggingLog.IsEmpty() Then Try File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText()) + File.Delete(strAutoSavedLogFilePaths(0)) Catch ex As Exception MsgBox("Could not copy debugging log file from: " & strAutoSavedDebuggingLogFilePaths(0) & " to: " & ucrInputSavedPathDebuggingLog.GetText() & Environment.NewLine & ex.Message, "Are you finished?") End Try From 33793c6660ec9da0520bb4d0dc205d787e331b7b Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Sun, 25 Jun 2017 11:19:28 +0100 Subject: [PATCH 172/201] corrected bugs in auto recovery --- instat/clsRLink.vb | 3 +-- instat/dlgAutoSaveRecovery.vb | 24 ++++++++++++------------ instat/dlgImportDataset.vb | 2 +- instat/frmMain.vb | 1 + 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 9c6308165a3..13960f741d8 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -79,9 +79,8 @@ Public Class RLink strComment = "Setting working directory, sources R code and loading R packages" bSeparateThread = True End If - RunScript(strScript:=strScript, iCallType:=iCallType, strComment:=strComment, bSeparateThread:=bSeparateThread) - 'TODO is this ok to set here? bInstatObjectExists = True + RunScript(strScript:=strScript, iCallType:=iCallType, strComment:=strComment, bSeparateThread:=bSeparateThread) End Sub Public Sub CloseREngine() diff --git a/instat/dlgAutoSaveRecovery.vb b/instat/dlgAutoSaveRecovery.vb index 1743afe07bd..db726575ec6 100644 --- a/instat/dlgAutoSaveRecovery.vb +++ b/instat/dlgAutoSaveRecovery.vb @@ -112,26 +112,26 @@ Public Class dlgAutoSaveRecovery End Sub Private Sub SaveFiles() - If File.Exists(strAutoSavedDataFilePaths(0)) AndAlso Not ucrInputSavedPathData.IsEmpty() Then + If strAutoSavedDataFilePaths IsNot Nothing AndAlso strAutoSavedDataFilePaths.Count > 0 AndAlso File.Exists(strAutoSavedDataFilePaths(0)) AndAlso Not ucrInputSavedPathData.IsEmpty() Then Try - File.Copy(strAutoSavedDataFilePaths(0), ucrInputSavedPathData.GetText()) + File.Copy(strAutoSavedDataFilePaths(0), ucrInputSavedPathData.GetText(), True) File.Delete(strAutoSavedDataFilePaths(0)) Catch ex As Exception MsgBox("Could not copy data file from: " & strAutoSavedDataFilePaths(0) & " to: " & ucrInputSavedPathData.GetText() & Environment.NewLine & ex.Message) End Try End If - If File.Exists(strAutoSavedLogFilePaths(0)) AndAlso Not ucrInputSavedPathLog.IsEmpty() Then + If strAutoSavedLogFilePaths IsNot Nothing AndAlso strAutoSavedLogFilePaths.Count > 0 AndAlso File.Exists(strAutoSavedLogFilePaths(0)) AndAlso Not ucrInputSavedPathLog.IsEmpty() Then Try - File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText()) + File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText(), True) File.Delete(strAutoSavedLogFilePaths(0)) Catch ex As Exception MsgBox("Could not copy log file from: " & strAutoSavedLogFilePaths(0) & " to: " & ucrInputSavedPathLog.GetText() & Environment.NewLine & ex.Message) End Try End If - If File.Exists(strAutoSavedLogFilePaths(0)) AndAlso Not ucrInputSavedPathDebuggingLog.IsEmpty() Then + If strAutoSavedDebuggingLogFilePaths IsNot Nothing AndAlso strAutoSavedDebuggingLogFilePaths.Count > 0 AndAlso File.Exists(strAutoSavedDebuggingLogFilePaths(0)) AndAlso Not ucrInputSavedPathDebuggingLog.IsEmpty() Then Try - File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText()) - File.Delete(strAutoSavedLogFilePaths(0)) + File.Copy(strAutoSavedDebuggingLogFilePaths(0), ucrInputSavedPathDebuggingLog.GetText(), True) + File.Delete(strAutoSavedDebuggingLogFilePaths(0)) Catch ex As Exception MsgBox("Could not copy debugging log file from: " & strAutoSavedDebuggingLogFilePaths(0) & " to: " & ucrInputSavedPathDebuggingLog.GetText() & Environment.NewLine & ex.Message, "Are you finished?") End Try @@ -139,7 +139,7 @@ Public Class dlgAutoSaveRecovery End Sub Private Sub cmdRunLog_Click(sender As Object, e As EventArgs) Handles cmdRunLog.Click - If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost." & Environment.NewLine & "Warning: running the log file can fail if files have been moved.", MessageBoxButtons.YesNo, "Are you sure you are finished?") Then + If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost." & Environment.NewLine & "Warning: running the log file can fail if files have been moved.", MessageBoxButtons.YesNo, "Are you sure you are finished?") = MsgBoxResult.Yes Then SaveFiles() If File.Exists(strAutoSavedLogFilePaths(0)) Then Try @@ -155,7 +155,7 @@ Public Class dlgAutoSaveRecovery End Sub Private Sub cmdLoadData_Click(sender As Object, e As EventArgs) Handles cmdLoadData.Click - If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost.", MessageBoxButtons.YesNo, "Are you finished?") Then + If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost.", MessageBoxButtons.YesNo, "Are you finished?") = MsgBoxResult.Yes Then SaveFiles() strLoadDateFilePath = strAutoSavedDataFilePaths(0) bUserClose = False @@ -164,7 +164,7 @@ Public Class dlgAutoSaveRecovery End Sub Private Sub cmdNewSession_Click(sender As Object, e As EventArgs) Handles cmdNewSession.Click - If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost.", MessageBoxButtons.YesNo, "Are you finished?") Then + If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost.", MessageBoxButtons.YesNo, "Are you finished?") = MsgBoxResult.Yes Then SaveFiles() bUserClose = False Close() @@ -173,8 +173,8 @@ Public Class dlgAutoSaveRecovery Private Sub dlgAutoSaveRecovery_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing If bUserClose Then - If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost.", MessageBoxButtons.YesNo, "Are you finished?") Then - e.Cancel = False + If MsgBox("Are you sure you are finished?" & Environment.NewLine & "You cannot return to this dialog after leaving and any unsaved recovered files will be lost.", MessageBoxButtons.YesNo, "Are you finished?") = MsgBoxResult.No Then + e.Cancel = True End If End If End Sub diff --git a/instat/dlgImportDataset.vb b/instat/dlgImportDataset.vb index c3f2aa15071..dda9dcbec7b 100644 --- a/instat/dlgImportDataset.vb +++ b/instat/dlgImportDataset.vb @@ -551,7 +551,7 @@ Public Class dlgImportDataset dfTemp = expTemp.AsDataFrame If dfTemp IsNot Nothing Then Try - frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False, iColMax:=frmMain.clsInstatOptions.iMaxCols) + frmMain.clsGrids.FillSheet(dfTemp, strTempDataFrameName, grdDataPreview, bIncludeDataTypes:=False, iColMax:=frmMain.clsGrids.iMaxCols) grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_DragSelectionToMoveCells, False) grdDataPreview.CurrentWorksheet.SetSettings(unvell.ReoGrid.WorksheetSettings.Edit_Readonly, True) grdDataPreview.Enabled = True diff --git a/instat/frmMain.vb b/instat/frmMain.vb index a6763e92fe0..4b0227cc6b7 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -127,6 +127,7 @@ Public Class frmMain If MsgBox("We have detected that R-Instat may have closed unexpectadly last time." & Environment.NewLine & "Would you like to see auto recovery options?", MessageBoxButtons.YesNo, "Auto Recovery") = MsgBoxResult.Yes Then dlgAutoSaveRecovery.strAutoSavedLogFilePaths = strAutoSavedLogFilePaths dlgAutoSaveRecovery.strAutoSavedDataFilePaths = strAutoSavedDataFilePaths + dlgAutoSaveRecovery.strAutoSavedDebuggingLogFilePaths = strAutoSavedDebugLogFilePaths dlgAutoSaveRecovery.ShowDialog() strScript = dlgAutoSaveRecovery.GetScript() strDataFilePath = dlgAutoSaveRecovery.GetDataFilePath() From 977749e853a0e564e3665b96316e93589a1deb86 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 26 Jun 2017 12:02:24 +0300 Subject: [PATCH 173/201] edits --- instat/clsRegressionDefaults.vb | 48 +--- instat/dlgFitCorruptionModel.vb | 10 +- instat/dlgFitModel.vb | 10 +- instat/dlgFourVariableModelling.vb | 28 +-- instat/dlgRegressionSimple.Designer.vb | 291 +++++++++++-------------- instat/dlgRegressionSimple.vb | 111 +++------- instat/dlgThreeVariablesModelling.vb | 14 +- instat/dlgTwoVariableUseModel.vb | 6 +- instat/sdgModelOptions.vb | 2 +- instat/sdgSimpleRegOptions.vb | 190 ++++++++-------- instat/sdgVariableTransformations.vb | 10 +- 11 files changed, 300 insertions(+), 420 deletions(-) diff --git a/instat/clsRegressionDefaults.vb b/instat/clsRegressionDefaults.vb index 9ac63f2c229..b55054f47ae 100644 --- a/instat/clsRegressionDefaults.vb +++ b/instat/clsRegressionDefaults.vb @@ -1,5 +1,5 @@ Public Class clsRegressionDefaults - Public Shared ReadOnly Property clsDefaultRLmOrGLM As RFunction + Public Shared ReadOnly Property clsDefaultRLmFunction As RFunction Get Dim clsRModelFunction As New RFunction @@ -104,50 +104,12 @@ End Get End Property - Public Shared ReadOnly Property clsDefaultFitted As RFunction + Public Shared ReadOnly Property clsDefaultAddColumnsToData As RFunction Get - Dim clsRFittedValues As New RFunction - Dim clsRWriteFitted, clsRModelFunction As New RFunction + Dim clsDefaultAddColumnsToDataFunction As New RFunction - clsRWriteFitted.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - Return clsRWriteFitted - End Get - End Property - - - Public Shared ReadOnly Property clsDefaultRWriteFitted As RFunction - Get - Dim clsDefaultRWriteFittedFunction As New RFunction - - clsDefaultRWriteFittedFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - Return clsDefaultRWriteFittedFunction - End Get - End Property - - Public Shared ReadOnly Property clsDefaultRWriteResiduals As RFunction - Get - Dim clsDefaultRWriteResidualsFunc As New RFunction - - clsDefaultRWriteResidualsFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - Return clsDefaultRWriteResidualsFunc - End Get - End Property - - Public Shared ReadOnly Property clsDefaultRWriteStdResiduals As RFunction - Get - Dim clsDefaultRWriteStdResidualsFunc As New RFunction - - clsDefaultRWriteStdResidualsFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - Return clsDefaultRWriteStdResidualsFunc - End Get - End Property - - Public Shared ReadOnly Property clsDefaultRWriteLeverage As RFunction - Get - Dim clsDefaultRWriteLeverageFunc As New RFunction - - clsDefaultRWriteLeverageFunc.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") - Return clsDefaultRWriteLeverageFunc + clsDefaultAddColumnsToDataFunction.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$add_columns_to_data") + Return clsDefaultAddColumnsToDataFunction End Get End Property diff --git a/instat/dlgFitCorruptionModel.vb b/instat/dlgFitCorruptionModel.vb index 11b92528e4a..461d00ccde6 100644 --- a/instat/dlgFitCorruptionModel.vb +++ b/instat/dlgFitCorruptionModel.vb @@ -174,13 +174,13 @@ Public Class dlgFitCorruptionModel End Sub Private Sub LoadSubdialog() - sdgSimpleRegOptions.SetRModelFunction(clsCorruptionModel) + 'sdgSimpleRegOptions.SetRModelFunction(clsCorruptionModel) sdgSimpleRegOptions.SetRDataFrame(ucrSelectorFitModel.ucrAvailableDataFrames) - sdgSimpleRegOptions.SetRYVariable(ucrReceiverOutput) - sdgSimpleRegOptions.SetDefaults() - sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True + ' sdgSimpleRegOptions.SetRYVariable(ucrReceiverOutput) + ' sdgSimpleRegOptions.SetDefaults() + ' sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True - sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True + ' sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True End Sub Private Sub ucrReceiverOutput_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverOutput.ControlValueChanged, ucrReceiverControlVariables.ControlValueChanged, ucrReceiverIndicators.ControlValueChanged diff --git a/instat/dlgFitModel.vb b/instat/dlgFitModel.vb index 9c95a5e1d67..27350e66329 100644 --- a/instat/dlgFitModel.vb +++ b/instat/dlgFitModel.vb @@ -46,10 +46,10 @@ Public Class dlgFitModel ucrReceiverResponseVar.Selector = ucrSelectorByDataFrameAddRemoveForFitModel ucrReceiverResponseVar.SetMeAsReceiver() ucrModelName.SetValidationTypeAsRVariable() - sdgSimpleRegOptions.SetRModelFunction(ucrBase.clsRsyntax.clsBaseFunction) + 'sdgSimpleRegOptions.SetRModelFunction(ucrBase.clsRsyntax.clsBaseFunction) ucrInputModelPreview.IsReadOnly = True sdgSimpleRegOptions.SetRDataFrame(ucrSelectorByDataFrameAddRemoveForFitModel.ucrAvailableDataFrames) - sdgSimpleRegOptions.SetRYVariable(ucrReceiverResponseVar) + 'sdgSimpleRegOptions.SetRYVariable(ucrReceiverResponseVar) 'sdgVariableTransformations.SetRYVariable(ucrReceiverResponseVar) 'sdgVariableTransformations.SetRModelOperator(clsModel) 'sdgModelOptions.SetRCIFunction(clsRCIFunction) @@ -66,12 +66,12 @@ Public Class dlgFitModel chkConvertToVariate.Checked = False chkConvertToVariate.Visible = False ucrModelName.SetName("reg") - sdgSimpleRegOptions.SetDefaults() + 'sdgSimpleRegOptions.SetDefaults() sdgModelOptions.SetDefaults() ResponseConvert() - sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True + ' sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True - sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True + 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True TestOKEnabled() End Sub diff --git a/instat/dlgFourVariableModelling.vb b/instat/dlgFourVariableModelling.vb index 6a89611fa1f..e70bbbfb86c 100644 --- a/instat/dlgFourVariableModelling.vb +++ b/instat/dlgFourVariableModelling.vb @@ -50,11 +50,11 @@ Public Class dlgFourVariableModelling ucrInputModelOperators1.SetItems({"+", "*", ":", "/", "|"}) ucrInputModelOperators2.SetItems({"+", "*", ":", "/", "|"}) ucrModelName.SetValidationTypeAsRVariable() - sdgSimpleRegOptions.SetRModelFunction(ucrBaseFourVariableModelling.clsRsyntax.clsBaseFunction) + ' sdgSimpleRegOptions.SetRModelFunction(ucrBaseFourVariableModelling.clsRsyntax.clsBaseFunction) ucrModelPreview.IsReadOnly = True sdgSimpleRegOptions.SetRDataFrame(ucrSelectorFourVariableModelling.ucrAvailableDataFrames) - sdgSimpleRegOptions.SetRYVariable(ucrResponse) - sdgSimpleRegOptions.SetRXVariable(ucrFirstExplanatory) + 'sdgSimpleRegOptions.SetRYVariable(ucrResponse) + ' sdgSimpleRegOptions.SetRXVariable(ucrFirstExplanatory) 'sdgVariableTransformations.SetRYVariable(ucrResponse) 'sdgVariableTransformations.SetRModelOperator(clsModel1) 'sdgModelOptions.SetRCIFunction(clsRCIFunction) @@ -79,7 +79,7 @@ Public Class dlgFourVariableModelling chkFirstFunction.Checked = False chkFirstFunction.Visible = False ucrModelName.SetName("reg") - sdgSimpleRegOptions.SetDefaults() + ' sdgSimpleRegOptions.SetDefaults() sdgModelOptions.SetDefaults() ResponseConvert() TestOKEnabled() @@ -237,30 +237,30 @@ Public Class dlgFourVariableModelling sdgModelOptions.RestrictLink() 'TODO: Include multinomial as an option And the appropriate function If (ucrFamily.clsCurrDistribution.strNameTag = "Normal" And ucrInputModelOperators2.GetText <> "|") Then - sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True + 'sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True - sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True + 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True ucrBaseFourVariableModelling.clsRsyntax.SetFunction("lm") ucrBaseFourVariableModelling.clsRsyntax.RemoveParameter("family") ElseIf (ucrFamily.clsCurrDistribution.strNameTag = "Normal" And ucrInputModelOperators2.GetText = "|") Then - sdgSimpleRegOptions.chkDisplayCLimits.Checked = False - sdgSimpleRegOptions.chkDisplayCLimits.Enabled = False + ' sdgSimpleRegOptions.chkDisplayCLimits.Checked = False + ' sdgSimpleRegOptions.chkDisplayCLimits.Enabled = False sdgSimpleRegOptions.lblDisplayCLevel.Enabled = False - sdgSimpleRegOptions.nudDisplayCLevel.Enabled = False + ' sdgSimpleRegOptions.nudDisplayCLevel.Enabled = False ucrBaseFourVariableModelling.clsRsyntax.SetFunction("lmer") ucrBaseFourVariableModelling.clsRsyntax.RemoveParameter("family") ElseIf (ucrFamily.clsCurrDistribution.strNameTag <> "Normal" And ucrInputModelOperators2.GetText = "|") Then - sdgSimpleRegOptions.chkDisplayCLimits.Checked = False - sdgSimpleRegOptions.chkDisplayCLimits.Enabled = False + 'sdgSimpleRegOptions.chkDisplayCLimits.Checked = False + 'sdgSimpleRegOptions.chkDisplayCLimits.Enabled = False sdgSimpleRegOptions.lblDisplayCLevel.Enabled = False - sdgSimpleRegOptions.nudDisplayCLevel.Enabled = False + 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = False clsRCIFunction.SetRCommand(ucrFamily.clsCurrDistribution.strGLMFunctionName) ucrBaseFourVariableModelling.clsRsyntax.SetFunction("glmer") ucrBaseFourVariableModelling.clsRsyntax.AddParameter("family", clsRFunctionParameter:=clsRCIFunction) Else - sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True + ' sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True - sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True + 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True clsRCIFunction.SetRCommand(ucrFamily.clsCurrDistribution.strGLMFunctionName) ucrBaseFourVariableModelling.clsRsyntax.SetFunction("glm") ucrBaseFourVariableModelling.clsRsyntax.AddParameter("family", clsRFunctionParameter:=clsRCIFunction) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 5cbd9244d4f..9d820a50f89 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -30,35 +30,31 @@ Partial Class dlgRegressionSimple Me.cmdDisplayOptions = New System.Windows.Forms.Button() Me.cmdModelOptions = New System.Windows.Forms.Button() Me.lblModelPreview = New System.Windows.Forms.Label() - Me.Label1 = New System.Windows.Forms.Label() - Me.rdoKruskalTest = New System.Windows.Forms.RadioButton() - Me.rdoWilcoxonTest = New System.Windows.Forms.RadioButton() - Me.ucrNudHypothesis = New instat.ucrNud() - Me.ucrChkPairedTest = New instat.ucrCheck() - Me.ucrNudCI = New instat.ucrNud() - Me.ucrPnlMeansAndVariance = New instat.UcrPanel() - Me.lblConfidenceInterval = New System.Windows.Forms.Label() - Me.lblDifferenceInMeans = New System.Windows.Forms.Label() - Me.ucrChkFunction = New instat.ucrCheck() - Me.ucrModelPreview = New instat.ucrInputTextBox() - Me.ucrFamily = New instat.ucrDistributions() - Me.ucrBase = New instat.ucrButtons() - Me.ucrPnlModelType = New instat.UcrPanel() - Me.lblHyp1 = New System.Windows.Forms.Label() - Me.grpParameters = New System.Windows.Forms.GroupBox() - Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() - Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() Me.rdoTwoSample = New System.Windows.Forms.RadioButton() Me.rdoGeneralCase = New System.Windows.Forms.RadioButton() - Me.ucrChkConvertToVariate = New instat.ucrCheck() Me.lblFactor = New System.Windows.Forms.Label() Me.lblNumeric = New System.Windows.Forms.Label() - Me.ucrExplanatory = New instat.ucrReceiverSingle() - Me.ucrResponse = New instat.ucrReceiverSingle() - Me.ucrSelectorSimpleReg = New instat.ucrSelectorByDataFrameAddRemove() Me.lblExplanatory = New System.Windows.Forms.Label() Me.lblResponse = New System.Windows.Forms.Label() + Me.grpParameters = New System.Windows.Forms.GroupBox() + Me.lblConfidenceInterval = New System.Windows.Forms.Label() + Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() + Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() + Me.lblDifferenceInMeans = New System.Windows.Forms.Label() + Me.ucrChkPairedTest = New instat.ucrCheck() + Me.ucrPnlMeansAndVariance = New instat.UcrPanel() + Me.ucrNudHypothesis = New instat.ucrNud() + Me.ucrNudCI = New instat.ucrNud() Me.ucrSaveModels = New instat.ucrSave() + Me.ucrChkConvertToVariate = New instat.ucrCheck() + Me.ucrExplanatory = New instat.ucrReceiverSingle() + Me.ucrResponse = New instat.ucrReceiverSingle() + Me.ucrSelectorSimpleReg = New instat.ucrSelectorByDataFrameAddRemove() + Me.ucrChkFunction = New instat.ucrCheck() + Me.ucrPnlModelType = New instat.UcrPanel() + Me.ucrModelPreview = New instat.ucrInputTextBox() + Me.ucrFamily = New instat.ucrDistributions() + Me.ucrBase = New instat.ucrButtons() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -103,121 +99,71 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.lblModelPreview, "lblModelPreview") Me.lblModelPreview.Name = "lblModelPreview" ' - 'Label1 - ' - resources.ApplyResources(Me.Label1, "Label1") - Me.Label1.Name = "Label1" - ' - 'rdoKruskalTest - ' - resources.ApplyResources(Me.rdoKruskalTest, "rdoKruskalTest") - Me.rdoKruskalTest.Name = "rdoKruskalTest" - Me.rdoKruskalTest.TabStop = True - Me.rdoKruskalTest.UseVisualStyleBackColor = True - ' - 'rdoWilcoxonTest - ' - resources.ApplyResources(Me.rdoWilcoxonTest, "rdoWilcoxonTest") - Me.rdoWilcoxonTest.Name = "rdoWilcoxonTest" - Me.rdoWilcoxonTest.TabStop = True - Me.rdoWilcoxonTest.UseVisualStyleBackColor = True - ' - 'ucrNudHypothesis - ' - Me.ucrNudHypothesis.DecimalPlaces = New Decimal(New Integer() {2, 0, 0, 0}) - Me.ucrNudHypothesis.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - resources.ApplyResources(Me.ucrNudHypothesis, "ucrNudHypothesis") - Me.ucrNudHypothesis.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudHypothesis.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudHypothesis.Name = "ucrNudHypothesis" - Me.ucrNudHypothesis.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrChkPairedTest - ' - Me.ucrChkPairedTest.Checked = False - resources.ApplyResources(Me.ucrChkPairedTest, "ucrChkPairedTest") - Me.ucrChkPairedTest.Name = "ucrChkPairedTest" - ' - 'ucrNudCI - ' - Me.ucrNudCI.DecimalPlaces = New Decimal(New Integer() {2, 0, 0, 0}) - Me.ucrNudCI.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - resources.ApplyResources(Me.ucrNudCI, "ucrNudCI") - Me.ucrNudCI.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudCI.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudCI.Name = "ucrNudCI" - Me.ucrNudCI.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrPnlMeansAndVariance - ' - resources.ApplyResources(Me.ucrPnlMeansAndVariance, "ucrPnlMeansAndVariance") - Me.ucrPnlMeansAndVariance.Name = "ucrPnlMeansAndVariance" - ' - 'lblConfidenceInterval - ' - resources.ApplyResources(Me.lblConfidenceInterval, "lblConfidenceInterval") - Me.lblConfidenceInterval.Name = "lblConfidenceInterval" - ' - 'lblDifferenceInMeans - ' - resources.ApplyResources(Me.lblDifferenceInMeans, "lblDifferenceInMeans") - Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" - ' - 'ucrChkFunction + 'rdoTwoSample ' - Me.ucrChkFunction.Checked = False - resources.ApplyResources(Me.ucrChkFunction, "ucrChkFunction") - Me.ucrChkFunction.Name = "ucrChkFunction" + resources.ApplyResources(Me.rdoTwoSample, "rdoTwoSample") + Me.rdoTwoSample.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoTwoSample.FlatAppearance.BorderSize = 2 + Me.rdoTwoSample.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoTwoSample.Name = "rdoTwoSample" + Me.rdoTwoSample.UseVisualStyleBackColor = True ' - 'ucrModelPreview + 'rdoGeneralCase ' - Me.ucrModelPreview.AddQuotesIfUnrecognised = True - Me.ucrModelPreview.IsMultiline = False - Me.ucrModelPreview.IsReadOnly = False - resources.ApplyResources(Me.ucrModelPreview, "ucrModelPreview") - Me.ucrModelPreview.Name = "ucrModelPreview" + resources.ApplyResources(Me.rdoGeneralCase, "rdoGeneralCase") + Me.rdoGeneralCase.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoGeneralCase.FlatAppearance.BorderSize = 2 + Me.rdoGeneralCase.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoGeneralCase.Name = "rdoGeneralCase" + Me.rdoGeneralCase.UseVisualStyleBackColor = True ' - 'ucrFamily + 'lblFactor ' - resources.ApplyResources(Me.ucrFamily, "ucrFamily") - Me.ucrFamily.Name = "ucrFamily" + resources.ApplyResources(Me.lblFactor, "lblFactor") + Me.lblFactor.Name = "lblFactor" ' - 'ucrBase + 'lblNumeric ' - resources.ApplyResources(Me.ucrBase, "ucrBase") - Me.ucrBase.Name = "ucrBase" + resources.ApplyResources(Me.lblNumeric, "lblNumeric") + Me.lblNumeric.Name = "lblNumeric" ' - 'ucrPnlModelType + 'lblExplanatory ' - resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") - Me.ucrPnlModelType.Name = "ucrPnlModelType" + resources.ApplyResources(Me.lblExplanatory, "lblExplanatory") + Me.lblExplanatory.Name = "lblExplanatory" + Me.lblExplanatory.Tag = "Explanatory_Variable" ' - 'lblHyp1 + 'lblResponse ' - resources.ApplyResources(Me.lblHyp1, "lblHyp1") - Me.lblHyp1.Name = "lblHyp1" + resources.ApplyResources(Me.lblResponse, "lblResponse") + Me.lblResponse.Name = "lblResponse" + Me.lblResponse.Tag = "Response_Variable" ' 'grpParameters ' - Me.grpParameters.Controls.Add(Me.Label1) - Me.grpParameters.Controls.Add(Me.rdoKruskalTest) - Me.grpParameters.Controls.Add(Me.rdoWilcoxonTest) - Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) - Me.grpParameters.Controls.Add(Me.ucrNudCI) - Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) + Me.grpParameters.Controls.Add(Me.rdoCompareVariance) Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) - Me.grpParameters.Controls.Add(Me.lblHyp1) + Me.grpParameters.Controls.Add(Me.rdoCompareMeans) Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) + Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) + Me.grpParameters.Controls.Add(Me.ucrNudCI) + Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) resources.ApplyResources(Me.grpParameters, "grpParameters") Me.grpParameters.Name = "grpParameters" Me.grpParameters.TabStop = False ' + 'lblConfidenceInterval + ' + resources.ApplyResources(Me.lblConfidenceInterval, "lblConfidenceInterval") + Me.lblConfidenceInterval.Name = "lblConfidenceInterval" + ' 'rdoCompareVariance ' resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") Me.rdoCompareVariance.Name = "rdoCompareVariance" Me.rdoCompareVariance.TabStop = True + Me.rdoCompareVariance.Tag = "" Me.rdoCompareVariance.UseVisualStyleBackColor = True ' 'rdoCompareMeans @@ -225,41 +171,55 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") Me.rdoCompareMeans.Name = "rdoCompareMeans" Me.rdoCompareMeans.TabStop = True + Me.rdoCompareMeans.Tag = "" Me.rdoCompareMeans.UseVisualStyleBackColor = True ' - 'rdoTwoSample + 'lblDifferenceInMeans ' - resources.ApplyResources(Me.rdoTwoSample, "rdoTwoSample") - Me.rdoTwoSample.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoTwoSample.FlatAppearance.BorderSize = 2 - Me.rdoTwoSample.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoTwoSample.Name = "rdoTwoSample" - Me.rdoTwoSample.UseVisualStyleBackColor = True + resources.ApplyResources(Me.lblDifferenceInMeans, "lblDifferenceInMeans") + Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" ' - 'rdoGeneralCase + 'ucrChkPairedTest ' - resources.ApplyResources(Me.rdoGeneralCase, "rdoGeneralCase") - Me.rdoGeneralCase.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoGeneralCase.FlatAppearance.BorderSize = 2 - Me.rdoGeneralCase.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption - Me.rdoGeneralCase.Name = "rdoGeneralCase" - Me.rdoGeneralCase.UseVisualStyleBackColor = True + Me.ucrChkPairedTest.Checked = False + resources.ApplyResources(Me.ucrChkPairedTest, "ucrChkPairedTest") + Me.ucrChkPairedTest.Name = "ucrChkPairedTest" ' - 'ucrChkConvertToVariate + 'ucrPnlMeansAndVariance ' - Me.ucrChkConvertToVariate.Checked = False - resources.ApplyResources(Me.ucrChkConvertToVariate, "ucrChkConvertToVariate") - Me.ucrChkConvertToVariate.Name = "ucrChkConvertToVariate" + resources.ApplyResources(Me.ucrPnlMeansAndVariance, "ucrPnlMeansAndVariance") + Me.ucrPnlMeansAndVariance.Name = "ucrPnlMeansAndVariance" ' - 'lblFactor + 'ucrNudHypothesis ' - resources.ApplyResources(Me.lblFactor, "lblFactor") - Me.lblFactor.Name = "lblFactor" + Me.ucrNudHypothesis.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudHypothesis.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + resources.ApplyResources(Me.ucrNudHypothesis, "ucrNudHypothesis") + Me.ucrNudHypothesis.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudHypothesis.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudHypothesis.Name = "ucrNudHypothesis" + Me.ucrNudHypothesis.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'lblNumeric + 'ucrNudCI ' - resources.ApplyResources(Me.lblNumeric, "lblNumeric") - Me.lblNumeric.Name = "lblNumeric" + Me.ucrNudCI.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudCI.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + resources.ApplyResources(Me.ucrNudCI, "ucrNudCI") + Me.ucrNudCI.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudCI.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudCI.Name = "ucrNudCI" + Me.ucrNudCI.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrSaveModels + ' + resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") + Me.ucrSaveModels.Name = "ucrSaveModels" + ' + 'ucrChkConvertToVariate + ' + Me.ucrChkConvertToVariate.Checked = False + resources.ApplyResources(Me.ucrChkConvertToVariate, "ucrChkConvertToVariate") + Me.ucrChkConvertToVariate.Name = "ucrChkConvertToVariate" ' 'ucrExplanatory ' @@ -286,35 +246,46 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrSelectorSimpleReg, "ucrSelectorSimpleReg") Me.ucrSelectorSimpleReg.Name = "ucrSelectorSimpleReg" ' - 'lblExplanatory + 'ucrChkFunction ' - resources.ApplyResources(Me.lblExplanatory, "lblExplanatory") - Me.lblExplanatory.Name = "lblExplanatory" - Me.lblExplanatory.Tag = "Explanatory_Variable" + Me.ucrChkFunction.Checked = False + resources.ApplyResources(Me.ucrChkFunction, "ucrChkFunction") + Me.ucrChkFunction.Name = "ucrChkFunction" ' - 'lblResponse + 'ucrPnlModelType ' - resources.ApplyResources(Me.lblResponse, "lblResponse") - Me.lblResponse.Name = "lblResponse" - Me.lblResponse.Tag = "Response_Variable" + resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") + Me.ucrPnlModelType.Name = "ucrPnlModelType" ' - 'ucrSaveModels + 'ucrModelPreview ' - resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") - Me.ucrSaveModels.Name = "ucrSaveModels" + Me.ucrModelPreview.AddQuotesIfUnrecognised = True + Me.ucrModelPreview.IsMultiline = False + Me.ucrModelPreview.IsReadOnly = False + resources.ApplyResources(Me.ucrModelPreview, "ucrModelPreview") + Me.ucrModelPreview.Name = "ucrModelPreview" + ' + 'ucrFamily + ' + resources.ApplyResources(Me.ucrFamily, "ucrFamily") + Me.ucrFamily.Name = "ucrFamily" + ' + 'ucrBase + ' + resources.ApplyResources(Me.ucrBase, "ucrBase") + Me.ucrBase.Name = "ucrBase" ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.Controls.Add(Me.rdoCompareVariance) + Me.Controls.Add(Me.grpParameters) Me.Controls.Add(Me.ucrSaveModels) Me.Controls.Add(Me.rdoTwoSample) Me.Controls.Add(Me.rdoGeneralCase) Me.Controls.Add(Me.ucrChkConvertToVariate) Me.Controls.Add(Me.lblFactor) Me.Controls.Add(Me.lblNumeric) - Me.Controls.Add(Me.rdoCompareMeans) Me.Controls.Add(Me.ucrExplanatory) Me.Controls.Add(Me.ucrResponse) Me.Controls.Add(Me.ucrSelectorSimpleReg) @@ -322,7 +293,6 @@ Partial Class dlgRegressionSimple Me.Controls.Add(Me.lblResponse) Me.Controls.Add(Me.ucrChkFunction) Me.Controls.Add(Me.ucrPnlModelType) - Me.Controls.Add(Me.grpParameters) Me.Controls.Add(Me.ucrModelPreview) Me.Controls.Add(Me.lblModelPreview) Me.Controls.Add(Me.ucrFamily) @@ -338,6 +308,7 @@ Partial Class dlgRegressionSimple Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide Me.Tag = "Simple_Regression" Me.grpParameters.ResumeLayout(False) + Me.grpParameters.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -352,19 +323,8 @@ Partial Class dlgRegressionSimple Friend WithEvents ucrFamily As ucrDistributions Friend WithEvents lblModelPreview As Label Friend WithEvents ucrModelPreview As ucrInputTextBox - Friend WithEvents lblConfidenceInterval As Label - Friend WithEvents lblDifferenceInMeans As Label - Friend WithEvents ucrChkPairedTest As ucrCheck - Friend WithEvents ucrPnlMeansAndVariance As UcrPanel - Friend WithEvents ucrNudCI As ucrNud - Friend WithEvents ucrNudHypothesis As ucrNud Friend WithEvents ucrChkFunction As ucrCheck - Friend WithEvents rdoKruskalTest As RadioButton - Friend WithEvents rdoWilcoxonTest As RadioButton - Friend WithEvents Label1 As Label Friend WithEvents ucrPnlModelType As UcrPanel - Friend WithEvents grpParameters As GroupBox - Friend WithEvents lblHyp1 As Label Friend WithEvents rdoTwoSample As RadioButton Friend WithEvents rdoGeneralCase As RadioButton Friend WithEvents ucrChkConvertToVariate As ucrCheck @@ -375,7 +335,14 @@ Partial Class dlgRegressionSimple Friend WithEvents ucrSelectorSimpleReg As ucrSelectorByDataFrameAddRemove Friend WithEvents lblExplanatory As Label Friend WithEvents lblResponse As Label - Friend WithEvents rdoCompareMeans As RadioButton - Friend WithEvents rdoCompareVariance As RadioButton Friend WithEvents ucrSaveModels As ucrSave + Friend WithEvents grpParameters As GroupBox + Friend WithEvents ucrNudCI As ucrNud + Friend WithEvents ucrNudHypothesis As ucrNud + Friend WithEvents ucrChkPairedTest As ucrCheck + Friend WithEvents lblConfidenceInterval As Label + Friend WithEvents rdoCompareVariance As RadioButton + Friend WithEvents rdoCompareMeans As RadioButton + Friend WithEvents ucrPnlMeansAndVariance As UcrPanel + Friend WithEvents lblDifferenceInMeans As Label End Class \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index e2b46f8df09..778b37fa34c 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -65,7 +65,7 @@ Public Class dlgRegressionSimple Private Sub InitialiseDialog() ucrBase.clsRsyntax.iCallType = 2 - ' cmdModelOptions.Enabled = False + cmdModelOptions.Enabled = False ucrResponse.Selector = ucrSelectorSimpleReg ucrExplanatory.Selector = ucrSelectorSimpleReg @@ -138,7 +138,7 @@ Public Class dlgRegressionSimple ' sdgSimpleRegOptions.SetRModelFunction(clsRLmOrGLM) - 'sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) + sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) 'sdgSimpleRegOptions.SetRYVariable(ucrResponse) ' sdgSimpleRegOptions.SetRXVariable(ucrExplanatory) sdgModelOptions.SetRCIFunction(clsRCIFunction) @@ -195,7 +195,7 @@ Public Class dlgRegressionSimple clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone clsRGraphicsOperator.iCallType = 3 - clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmOrGLM.Clone + clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmFunction.Clone clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) clsGLM.SetRCommand("glm") clsGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) @@ -216,7 +216,7 @@ Public Class dlgRegressionSimple 'FitModel clsRggplotFunction = clsRegressionDefaults.clsDefaultRggplot.Clone clsRggplotFunction.AddParameter("type", Chr(34) & "conditional" & Chr(34)) - ' clsRggplotFunction.AddParameter("rug", "TRUE") + clsRggplotFunction.AddParameter("scale", Chr(34) & "linear" & Chr(34)) clsRggplotFunction.AddParameter("alpha", 0.05) clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsRLmOrGLM) clsRggplotFunction.iCallType = 3 @@ -248,37 +248,25 @@ Public Class dlgRegressionSimple clsRestpvalFunction.iCallType = 2 'ucrSave (sdgSimpleRegOptions) Fitted Values - clsRWriteFitted = clsRegressionDefaults.clsDefaultRWriteFitted.Clone - clsRFittedValues.SetPackageName("stats") - clsRFittedValues.SetRCommand("fitted") - clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) - - clsRWriteFitted.iCallType = 3 + clsRWriteFitted = clsRegressionDefaults.clsDefaultAddColumnsToData.Clone + clsRWriteFitted.SetAssignTo(sdgSimpleRegOptions.ucrSaveFittedColumnName.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=sdgSimpleRegOptions.ucrSaveFittedColumnName.GetText, bAssignToIsPrefix:=True) + ' clsRWriteFitted.iCallType = 3 'ucrSave (sdgSimpleRegOptions) Residuals - clsRWriteResiduals = clsRegressionDefaults.clsDefaultRWriteResiduals.Clone - clsRResiduals.SetPackageName("stats") - clsRResiduals.SetRCommand("resid") - clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) - clsRWriteResiduals.iCallType = 3 + clsRWriteResiduals = clsRegressionDefaults.clsDefaultAddColumnsToData.Clone + clsRWriteResiduals.SetAssignTo(sdgSimpleRegOptions.ucrSaveResidualsColumnName.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=sdgSimpleRegOptions.ucrSaveResidualsColumnName.GetText, bAssignToIsPrefix:=True) + ' clsRWriteResiduals.iCallType = 3 'ucrSave (sdgSimpleRegOptions) StdResiduals - clsRStdResiduals.SetPackageName("stats") - clsRStdResiduals.SetRCommand("rstandard") - clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteStdResiduals = clsRegressionDefaults.clsDefaultRWriteStdResiduals.Clone - clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) - clsRWriteStdResiduals.iCallType = 3 + clsRWriteStdResiduals = clsRegressionDefaults.clsDefaultAddColumnsToData.Clone + clsRWriteStdResiduals.SetAssignTo(sdgSimpleRegOptions.ucrSaveStdResidualsColumnName.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=sdgSimpleRegOptions.ucrSaveStdResidualsColumnName.GetText, bAssignToIsPrefix:=True) + ' clsRWriteStdResiduals.iCallType = 3 'ucrSave (sdgSimpleRegOptions) Leverage - clsRLeverage.SetPackageName("stats") - clsRLeverage.SetRCommand("hatvalues") - clsRLeverage.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteLeverage = clsRegressionDefaults.clsDefaultRWriteLeverage.Clone - clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) - clsRWriteLeverage.iCallType = 3 + clsRWriteLeverage = clsRegressionDefaults.clsDefaultAddColumnsToData.Clone + clsRWriteLeverage.SetAssignTo(sdgSimpleRegOptions.ucrSaveLeverageColumnName.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=sdgSimpleRegOptions.ucrSaveLeverageColumnName.GetText, bAssignToIsPrefix:=True) + 'clsRWriteLeverage.iCallType = 3 + clsRConvert.SetRCommand("as.numeric") @@ -318,10 +306,7 @@ Public Class dlgRegressionSimple ucrModelPreview.SetName("") SetRCode() ucrFamily.SetGLMDistributions() - 'sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True - 'sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True - 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True - rdoCompareMeans.Checked = True + SetEnableDists() TestOKEnabled() bResetSubDialog = True @@ -368,12 +353,6 @@ Public Class dlgRegressionSimple sdgSimpleRegOptions.ShowDialog() End Sub - Private Sub grpParameters_Enter(sender As Object, e As EventArgs) - - End Sub - - - Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged clsRYVariable = ucrResponse.GetVariableNames(bWithQuotes:=False) Preview() @@ -387,12 +366,6 @@ Public Class dlgRegressionSimple DataTypeAccepted() End Sub - Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged - clsRXVariable = ucrExplanatory.GetVariableNames(bWithQuotes:=False) - Preview() - End Sub - - Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click sdgModelOptions.ShowDialog() ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) @@ -603,7 +576,6 @@ Public Class dlgRegressionSimple End If End If End If - TestOKEnabled() End Sub Private Sub TestOKEnabled() @@ -626,7 +598,7 @@ Public Class dlgRegressionSimple 'End If End Sub - Private Sub ucrSelectorSimpleReg_DataFrameChanged() Handles ucrSelectorSimpleReg.ControlValueChanged + Private Sub ucrSelectorSimpleReg_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorSimpleReg.ControlValueChanged SetRCode() End Sub @@ -656,7 +628,7 @@ Public Class dlgRegressionSimple Else If ucrFamily.lstCurrentDistributions.Count = 0 OrElse ucrResponse.IsEmpty() Then ucrFamily.ucrInputDistributions.SetName("") - ' cmdModelOptions.Enabled = False + cmdModelOptions.Enabled = False Else cmdModelOptions.Enabled = True End If @@ -668,17 +640,13 @@ Public Class dlgRegressionSimple End If End Sub - Public Sub SetEnableDists() - ucrFamily.Enabled = Not ucrResponse.IsEmpty - End Sub - Private Sub ucrExplanatory_SelectionChanged(sender As Object, e As EventArgs) Handles ucrExplanatory.SelectionChanged If Not ucrExplanatory.IsEmpty Then - ' ucrLevel1.SetItems({ucrExplanatory.GetItemType("Levels")}) + 'ucrLevel1.SetItems({ucrExplanatory.GetItemType("Levels")}) End If End Sub - Private Sub ucrchkConvertToVariate_CheckedChanged() Handles ucrChkConvertToVariate.ControlValueChanged + Private Sub ucrchkConvertToVariate_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkConvertToVariate.ControlValueChanged SetRCode() ConvertToVariate() End Sub @@ -702,10 +670,12 @@ Public Class dlgRegressionSimple End If End Sub - Private Sub ucrExplanatory_SelectionChanged() Handles ucrExplanatory.ControlValueChanged - ' ExplanatoryFunctionSelect() + Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged SetRCode() + ExplanatoryFunctionSelect() DataTypeAccepted() + ' clsRXVariable = ucrExplanatory.GetVariableNames(bWithQuotes:=False) + Preview() End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -714,22 +684,7 @@ Public Class dlgRegressionSimple TestOKEnabled() End Sub - Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk - 'If rdoGeneral.Checked Then - ' sdgSimpleRegOptions.RegOptions() - 'End If - End Sub - - Private Sub chkModelName_CheckedChanged(sender As Object, e As EventArgs) - 'If chkSaveModel.Checked Then - ' ucrModelName.Visible = True - 'Else - ' ucrModelName.Visible = False - 'End If - TestOKEnabled() - End Sub - - Private Sub chkFunction_CheckedChanged() Handles ucrChkFunction.ControlValueChanged + Private Sub chkFunction_CheckedChanged(ucrChangedControl As ucrCore) Handles ucrChkFunction.ControlValueChanged If ucrChkFunction.Checked Then ExplanatoryFunctionSelect() End If @@ -817,17 +772,16 @@ Public Class dlgRegressionSimple TestOKEnabled() End Sub - Private Sub rdoTop_CheckedChanged(sender As Object, e As EventArgs) - + Public Sub SetEnableDists() + ucrFamily.Enabled = Not ucrResponse.IsEmpty End Sub Private Sub ucrFamily_EnabledChanged() Handles ucrFamily.EnabledChanged DataTypeAccepted() - TestOKEnabled() SetEnableDists() End Sub - Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged + Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged, ucrPnlModelType.ControlValueChanged TestOKEnabled() End Sub @@ -837,10 +791,9 @@ Public Class dlgRegressionSimple Else ucrFamily.SetExactDistributions() End If - ucrFamily.ucrInputDistributions.SetName("") + ExplanatoryFunctionSelect() SetRCode() - TestOKEnabled() - DataTypeAccepted() ConvertToVariate() + DataTypeAccepted() End Sub End Class \ No newline at end of file diff --git a/instat/dlgThreeVariablesModelling.vb b/instat/dlgThreeVariablesModelling.vb index afd2c5104b5..8cb939ad9c0 100644 --- a/instat/dlgThreeVariablesModelling.vb +++ b/instat/dlgThreeVariablesModelling.vb @@ -36,7 +36,7 @@ Public Class dlgThreeVariableModelling Private Sub InitialiseDialog() 'Temporary fix: function autoplot does not support glm/lm models - sdgSimpleRegOptions.chkMultiplePlots.Enabled = False + 'sdgSimpleRegOptions.chkMultiplePlots.Enabled = False ucrBaseThreeVariableModelling.clsRsyntax.iCallType = 2 ucrBaseThreeVariableModelling.clsRsyntax.SetFunction("") ucrBaseThreeVariableModelling.iHelpTopicID = 369 @@ -53,10 +53,10 @@ Public Class dlgThreeVariableModelling ucrModelName.SetItemsTypeAsModels() ucrModelName.SetDefaultTypeAsModel() ucrModelPreview.IsReadOnly = True - sdgSimpleRegOptions.SetRModelFunction(ucrBaseThreeVariableModelling.clsRsyntax.clsBaseFunction) + 'sdgSimpleRegOptions.SetRModelFunction(ucrBaseThreeVariableModelling.clsRsyntax.clsBaseFunction) sdgSimpleRegOptions.SetRDataFrame(ucrSelectorThreeVariableModelling.ucrAvailableDataFrames) - sdgSimpleRegOptions.SetRYVariable(ucrResponse) - sdgSimpleRegOptions.SetRXVariable(ucrFirstExplanatory) + ' sdgSimpleRegOptions.SetRYVariable(ucrResponse) + 'sdgSimpleRegOptions.SetRXVariable(ucrFirstExplanatory) 'sdgVariableTransformations.SetRYVariable(ucrResponse) 'sdgVariableTransformations.SetRModelOperator(clsModel1) 'sdgModelOptions.SetRCIFunction(clsRCIFunction) @@ -85,15 +85,15 @@ Public Class dlgThreeVariableModelling chkFirstFunction.Visible = False chkSecondFunction.Checked = False chkSecondFunction.Visible = False - sdgSimpleRegOptions.SetDefaults() + 'sdgSimpleRegOptions.SetDefaults() sdgModelOptions.SetDefaults() ucrModelName.Reset() ucrModelPreview.Reset() ResponseConvert() ModelOperator() - sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True + 'sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True - sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True + '' sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True TestOKEnabled() End Sub diff --git a/instat/dlgTwoVariableUseModel.vb b/instat/dlgTwoVariableUseModel.vb index 51ba28e5b14..2ddeef91e7f 100644 --- a/instat/dlgTwoVariableUseModel.vb +++ b/instat/dlgTwoVariableUseModel.vb @@ -43,9 +43,9 @@ Public Class dlgTwoVariableUseModel Private Sub InitialiseDialog() 'Temporary fix: Bugs if you run the dialogue the second time - sdgSimpleRegOptions.chkFittedModel.Enabled = False + ' sdgSimpleRegOptions.chkFittedModel.Enabled = False 'autoplot function does not support glm/lm models - sdgSimpleRegOptions.chkFittedModel.Enabled = False + ' sdgSimpleRegOptions.chkFittedModel.Enabled = False 'ucrBase.iHelpTopicID = ucrBaseUseModel.clsRsyntax.SetOperation("+") ucrReceiverUseModel.SetItemType("model") @@ -53,7 +53,7 @@ Public Class dlgTwoVariableUseModel clsRCommand.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$get_models") ucrBaseUseModel.clsRsyntax.SetOperatorParameter(True, clsRFunc:=clsRCommand) ucrModel.IsReadOnly = True - sdgSimpleRegOptions.SetRModelFunction(clsRCommand) + ' sdgSimpleRegOptions.SetRModelFunction(clsRCommand) sdgSimpleRegOptions.SetRDataFrame(ucrSelectorUseModel.ucrAvailableDataFrames) ucrReceiverUseModel.strSelectorHeading = "Models" End Sub diff --git a/instat/sdgModelOptions.vb b/instat/sdgModelOptions.vb index 846e6884f17..cc14598dceb 100644 --- a/instat/sdgModelOptions.vb +++ b/instat/sdgModelOptions.vb @@ -72,7 +72,7 @@ Public Class sdgModelOptions rdoSqrt.Enabled = False End Sub - Public Sub ucrFamily_cboDistributionsIndexChanged() Handles ucrFamily.ControlValueChanged + Public Sub ucrFamily_cboDistributionsIndexChanged() Handles ucrFamily.DistributionsIndexChanged RestrictLink() End Sub diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 83e8b522812..35a1533469e 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -65,30 +65,6 @@ Public Class sdgSimpleRegOptions ucrChkFittedModel.SetText("Fitted Model") - ucrSaveFittedColumnName.SetPrefix("Fitted") - ucrSaveFittedColumnName.SetSaveTypeAsColumn() - ucrSaveFittedColumnName.SetIsComboBox() - ucrSaveFittedColumnName.SetCheckBoxText("Fitted Values") - ucrSaveFittedColumnName.SetDataFrameSelector(clsRDataFrame) - ucrSaveFittedColumnName.SetAssignToIfUncheckedValue("last_Fitted") - - ucrSaveResidualsColumnName.SetPrefix("Resids") - ucrSaveResidualsColumnName.SetSaveTypeAsColumn() - ucrSaveResidualsColumnName.SetIsComboBox() - ucrSaveResidualsColumnName.SetDataFrameSelector(clsRDataFrame) - ucrSaveResidualsColumnName.SetAssignToIfUncheckedValue("last_Resids") - - ucrSaveStdResidualsColumnName.SetPrefix("Sresids") - ucrSaveStdResidualsColumnName.SetSaveTypeAsColumn() - ucrSaveStdResidualsColumnName.SetIsComboBox() - ucrSaveStdResidualsColumnName.SetDataFrameSelector(clsRDataFrame) - ucrSaveStdResidualsColumnName.SetAssignToIfUncheckedValue("last_Sresids") - - ucrSaveLeverageColumnName.SetPrefix("Lever") - ucrSaveLeverageColumnName.SetSaveTypeAsColumn() - ucrSaveLeverageColumnName.SetIsComboBox() - ucrSaveLeverageColumnName.SetDataFrameSelector(clsRDataFrame) - ucrSaveLeverageColumnName.SetAssignToIfUncheckedValue("last_Lever") 'Multiple Plots (Autoplot function) ucrPnlMutiplePlots.AddRadioButton(rdoFourPlots) @@ -98,7 +74,9 @@ Public Class sdgSimpleRegOptions ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoSixPlots2Rows, {"autoplot"}) ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoSixPlots3Rows, {"autoplot"}) - ucrChkMultiplePlots.AddFunctionNamesCondition(False, "autoplot") + ucrChkMultiplePlots.Enabled = False + ucrChkMultiplePlots.AddFunctionNamesCondition(False, "autoplot", False) + 'ucrChkMultiplePlots.AddFunctionNamesCondition(True, "autoplot") ucrChkMultiplePlots.SetText("Multiple Plots") ucrChkMultiplePlots.AddToLinkedControls(ucrPnlMutiplePlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoFourPlots) ' ucrPnlMutiplePlots.SetLinkedDisplayControl(grpMultiplePlots) @@ -117,13 +95,16 @@ Public Class sdgSimpleRegOptions ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoCooksDistanceLeverage, {"autoplot"}) ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoCooksDistance, {"autoplot"}) - ucrChkIndividualPlots.AddFunctionNamesCondition(False, "autoplot") + ucrChkIndividualPlots.Enabled = False + ucrChkIndividualPlots.AddFunctionNamesCondition(False, "autoplot", False) + 'ucrChkIndividualPlots.AddFunctionNamesCondition(True, "autoplot") ucrChkIndividualPlots.SetText("Individual Plots") ucrChkIndividualPlots.AddToLinkedControls(ucrPnlIndividualPlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoResidualsFitted) 'ucrPnlIndividualPlots.SetLinkedDisplayControl(grpIndividualPlots) 'Fitting Models Plots (Visreg) - ucrChkFittedModel.AddFunctionNamesCondition(False, "visreg") + ucrChkFittedModel.AddFunctionNamesCondition(False, "visreg", False) + ucrChkFittedModel.AddFunctionNamesCondition(True, "visreg") ''type ucrPnlPlotType.SetParameter(New RParameter("type")) ucrPnlPlotType.AddRadioButton(rdoConditional, Chr(34) & "conditional" & Chr(34)) @@ -137,20 +118,28 @@ Public Class sdgSimpleRegOptions ucrChkFittedModel.AddToLinkedControls(ucrPnlScale, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrPnlScale.SetRDefault(Chr(34) & "linear" & Chr(34)) + ucrChkRugs.SetText("Rugs") + ucrPnlPartial12.SetParameter(New RParameter("rug")) + ucrPnlPartial12.AddRadioButton(rdo1, "1") + ucrPnlPartial12.AddRadioButton(rdo2, "2") + ucrPnlPartial12.AddRadioButton(rdoPartial, "!partial") 'To obtain partial: to be produced rug=T & partial=T(Default of partial is TRUE) + ucrPnlPartial12.SetRDefault("!partial") + + ucrNudWhiteSpace.SetParameter(New RParameter("whitespace")) + ucrNudWhiteSpace.DecimalPlaces = 1 + ucrNudWhiteSpace.Increment = 0.1 + ucrNudWhiteSpace.SetMinMax(0, 1) + ucrNudWhiteSpace.SetRDefault(0.2) + ucrChkFittedModel.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkFittedModel.AddToLinkedControls(ucrChkPartial, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkFittedModel.AddToLinkedControls(ucrChkRugs, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkRugs.AddToLinkedControls(ucrPnlPartial12, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkRugs.AddToLinkedControls(ucrPnlPartial12, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoPartial) ucrChkFittedModel.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkFittedModel.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkRugs.SetText("Rugs") - ucrPnlPartial12.SetParameter(New RParameter("rug")) - ucrPnlPartial12.AddRadioButton(rdo1, "1") - ucrPnlPartial12.AddRadioButton(rdo2, "2") - ucrPnlPartial12.AddRadioButton(rdoPartial, "TRUE") 'To obtain partial: to be produced rug=T & partial=T(Default of partial is TRUE) - ucrPnlPartial12.SetRDefault("TRUE") + ucrChkJitter.SetText("Jitter") ucrChkJitter.SetParameter(New RParameter("jitter"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") @@ -161,10 +150,7 @@ Public Class sdgSimpleRegOptions ucrNudGraphicsCLevel.Increment = 0.01 ucrNudGraphicsCLevel.SetMinMax(0, 1) - ucrNudWhiteSpace.SetParameter(New RParameter("whitespace")) - ucrNudWhiteSpace.DecimalPlaces = 1 - ucrNudWhiteSpace.Increment = 0.1 - ucrNudWhiteSpace.SetMinMax(0, 1) + ucrChkPartial.SetText("Partial") ucrChkPartial.SetParameter(New RParameter("partial"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") @@ -176,42 +162,39 @@ Public Class sdgSimpleRegOptions ''Save Plots (Save tab) ''Save Fitted Column Names - 'ucrSaveFittedColumnName.SetPrefix("Fitted") - 'ucrSaveFittedColumnName.SetSaveTypeAsDataFrame() - 'ucrSaveFittedColumnName.SetCheckBoxText("Fitted Values") - 'ucrSaveFittedColumnName.SetIsComboBox() - 'ucrSaveFittedColumnName.SetAssignToIfUncheckedValue("last_fitted") - '' ucrSaveFittedColumnName.Enabled = False ' disabled until working - - ''Save Residuals Column Names - 'ucrSaveResidualsColumnName.SetPrefix("Resids") - 'ucrSaveResidualsColumnName.SetSaveTypeAsDataFrame() - 'ucrSaveResidualsColumnName.SetCheckBoxText("Residuals") - 'ucrSaveResidualsColumnName.SetIsComboBox() - 'ucrSaveResidualsColumnName.SetAssignToIfUncheckedValue("last_residual") - ''ucrSaveResidualsColumnName.Enabled = False ' disabled until working - - ''Save StdResiduals Column Names - 'ucrSaveStdResidualsColumnName.SetPrefix("Sresids") - 'ucrSaveStdResidualsColumnName.SetSaveTypeAsDataFrame() - 'ucrSaveStdResidualsColumnName.SetCheckBoxText("Std Residuals") - 'ucrSaveStdResidualsColumnName.SetIsComboBox() - 'ucrSaveStdResidualsColumnName.SetAssignToIfUncheckedValue("last_stdresidual") - ''ucrSaveStdResidualsColumnName.Enabled = False ' disabled until working - - ''Save Leverage Column Names - 'ucrSaveLeverageColumnName.SetPrefix("Lever") - 'ucrSaveLeverageColumnName.SetSaveTypeAsDataFrame() - 'ucrSaveLeverageColumnName.SetCheckBoxText("Leverage") - 'ucrSaveLeverageColumnName.SetIsComboBox() - 'ucrSaveLeverageColumnName.SetAssignToIfUncheckedValue("last_leverage") - '' ucrSaveLeverageColumnName.Enabled = False ' disabled until working + ucrSaveFittedColumnName.SetPrefix("Fitted") + ucrSaveFittedColumnName.SetSaveTypeAsColumn() + ucrSaveFittedColumnName.SetCheckBoxText("Fitted Values") + ucrSaveFittedColumnName.SetIsComboBox() + ucrSaveFittedColumnName.SetDataFrameSelector(clsRDataFrame) + + + ' save residuals column names + ucrSaveResidualsColumnName.SetPrefix("Resids") + ucrSaveResidualsColumnName.SetSaveTypeAsColumn() + ucrSaveResidualsColumnName.SetCheckBoxText("residuals") + ucrSaveResidualsColumnName.SetIsComboBox() + ucrSaveResidualsColumnName.SetDataFrameSelector(clsRDataFrame) + + ' save stdresiduals column names + ucrSaveStdResidualsColumnName.SetPrefix("Sresids") + ucrSaveStdResidualsColumnName.SetSaveTypeAsColumn() + ucrSaveStdResidualsColumnName.SetIsComboBox() + ucrSaveStdResidualsColumnName.SetCheckBoxText("std residuals") + ucrSaveStdResidualsColumnName.SetDataFrameSelector(clsRDataFrame) + + 'save leverage column names + ucrSaveLeverageColumnName.SetPrefix("Lever") + ucrSaveLeverageColumnName.SetSaveTypeAsColumn() + ucrSaveLeverageColumnName.SetIsComboBox() + ucrSaveLeverageColumnName.SetCheckBoxText("leverage") + ucrSaveLeverageColumnName.SetDataFrameSelector(clsRDataFrame) bControlsInitialised = True End Sub 'Optional clsNewRWriteLeverage As RFunction = Nothing, - 'Optional clsRWriteResiduals As RFunction = Nothing, + 'Optional strNewTempDataframe As String = Nothing, Public Sub SetRCode(clsNewRSyntax As RSyntax, Optional clsNewRanovaFunction As RFunction = Nothing, Optional clsNewRSummaryFunction As RFunction = Nothing, Optional clsNewRConfint As RFunction = Nothing, Optional clsNewRggplotFunction As RFunction = Nothing, Optional clsNewRModelsFunction As RFunction = Nothing, Optional clsNewRaovpvalFunction As RFunction = Nothing, Optional clsNewRgeom_point As RFunction = Nothing, Optional clsNewRWriteResiduals As RFunction = Nothing, Optional clsNewRResidualPlots As RFunction = Nothing, Optional clsNewRestpvalFunction As RFunction = Nothing, Optional clsNewRWriteLeverage As RFunction = Nothing, Optional clsNewRWriteStdResiduals As RFunction = Nothing, Optional clsNewRLmOrGLM As RFunction = Nothing, Optional clsNewRModelFunction As RFunction = Nothing, Optional clsNewRXVariable As String = Nothing, Optional clsNewRYVariable As String = Nothing, Optional clsNewRWriteFitted As RFunction = Nothing, Optional clsNewRFittedValues As RFunction = Nothing, Optional clsNewRGraphicsOperator As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() @@ -223,7 +206,7 @@ Public Class sdgSimpleRegOptions clsRModelFunction = clsNewRModelFunction clsRXVariable = clsNewRXVariable clsRYVariable = clsNewRYVariable - clsRWriteFitted = clsNewRWriteFitted + 'clsRWriteFitted = clsNewRWriteFitted clsRFittedValues = clsNewRFittedValues clsRaovpvalFunction = clsNewRaovpvalFunction clsRModelsFunction = clsNewRModelsFunction @@ -233,8 +216,8 @@ Public Class sdgSimpleRegOptions clsRgeom_point = clsNewRgeom_point clsRResidualPlotsFunction = clsNewRResidualPlots clsRggplotFunction = clsNewRggplotFunction - clsRWriteResiduals = clsNewRWriteResiduals - clsRWriteStdResiduals = clsNewRWriteStdResiduals + 'clsRWriteResiduals = clsNewRWriteResiduals + ' clsRWriteStdResiduals = clsNewRWriteStdResiduals clsRWriteLeverage = clsNewRWriteLeverage @@ -258,10 +241,15 @@ Public Class sdgSimpleRegOptions ucrPnlMutiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) ucrChkFittedModel.SetRCode(clsRggplotFunction, bReset) - 'ucrSaveFittedColumnName.SetRCode(clsRWriteFitted, bReset) - 'ucrSaveResidualsColumnName.SetRCode(clsRWriteResiduals, bReset) - 'ucrSaveStdResidualsColumnName.SetRCode(clsRWriteStdResiduals, bReset) - 'ucrSaveLeverageColumnName.SetRCode(clsRWriteLeverage, bReset) + ucrSaveFittedColumnName.SetRCode(clsRWriteFitted, bReset) + ucrSaveResidualsColumnName.SetRCode(clsRWriteResiduals, bReset) + ucrSaveStdResidualsColumnName.SetRCode(clsRWriteStdResiduals, bReset) + ucrSaveLeverageColumnName.SetRCode(clsRWriteLeverage, bReset) + + clsRResiduals.SetPackageName("stats") + clsRResiduals.SetRCommand("resid") + clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) End Sub @@ -429,39 +417,49 @@ Public Class sdgSimpleRegOptions ' disabled until working Private Sub ucrSaveFittedColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveFittedColumnName.ControlValueChanged - clsRWriteFitted.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - clsRWriteFitted.AddParameter("col_name", Chr(34) & ucrSaveFittedColumnName.GetText & Chr(34)) - clsRSyntax.AddToAfterCodes(clsRWriteFitted, iPosition:=8) - clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) - clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) - clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) + clsRFittedValues.SetPackageName("stats") + clsRFittedValues.SetRCommand("fitted") + clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) + 'clsRSyntax.AddToAfterCodes(clsRWriteFitted, iPosition:=8) End Sub Private Sub ucrSaveResidualsColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveResidualsColumnName.ControlValueChanged - 'clsRWriteResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - 'clsRWriteResiduals.AddParameter("col_name", Chr(34) & ucrSaveResidualsColumnName.GetText & Chr(34)) - 'clsRSyntax.AddToAfterCodes(clsRWriteResiduals, iPosition:=9) - 'clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) - 'clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) - 'clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) + 'clsRResiduals.SetPackageName("stats") + 'clsRResiduals.SetRCommand("resid") + 'clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + 'clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) + ' clsRSyntax.AddToAfterCodes(clsRWriteResiduals, iPosition:=9) + ' clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) + ' clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) + ' clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) End Sub Private Sub ucrSaveStdResidualsColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStdResidualsColumnName.ControlValueChanged - 'clsRWriteStdResiduals.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - 'clsRWriteStdResiduals.AddParameter("col_name", Chr(34) & ucrSaveStdResidualsColumnName.GetText & Chr(34)) + clsRStdResiduals.SetPackageName("stats") + clsRStdResiduals.SetRCommand("rstandard") + clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) + clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) 'clsRSyntax.AddToAfterCodes(clsRWriteStdResiduals, iPosition:=10) - 'clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) - 'clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) - 'clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) + ' clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) + ' clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) + ' clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) End Sub Private Sub ucrSaveLeverageColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveLeverageColumnName.ControlValueChanged - 'clsRWriteLeverage.AddParameter("data_name", Chr(34) & clsRDataFrame.cboAvailableDataFrames.Text & Chr(34)) - 'clsRWriteLeverage.AddParameter("col_name", Chr(34) & ucrSaveLeverageColumnName.GetText & Chr(34)) - 'clsRSyntax.AddToAfterCodes(clsRWriteLeverage, iPosition:=11) + clsRLeverage.SetPackageName("stats") + clsRLeverage.SetRCommand("hatvalues") + clsRLeverage.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) + clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) + ' clsRSyntax.AddToAfterCodes(clsRWriteLeverage, iPosition:=11) 'clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) 'clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) 'clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) End Sub + Private Sub ucrchkRugs_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkRugs.ControlValueChanged + If ucrChkRugs.Checked Then + rdoPartial.Checked = True + End If + End Sub End Class \ No newline at end of file diff --git a/instat/sdgVariableTransformations.vb b/instat/sdgVariableTransformations.vb index 0df7d6aa7a7..280c7f8b52e 100644 --- a/instat/sdgVariableTransformations.vb +++ b/instat/sdgVariableTransformations.vb @@ -33,11 +33,11 @@ Public Class sdgVariableTransformations ucrPnlGenerateFunctions.AddRadioButton(rdoPower) ucrPnlGenerateFunctions.AddRadioButton(rdoSquareroot) - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoLogBase10, "log10") - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoSquareroot, "sqrt") - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoNaturallog, "log") - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoIdentity, {"log10", "power", "log", "sqrt"}, False) - ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoPower, "power") + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoLogBase10, "log10") + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoSquareroot, "sqrt") + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoNaturallog, "log") + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoIdentity, {"log10", "power", "log", "sqrt"}, False) + 'ucrPnlGenerateFunctions.AddFunctionNamesCondition(rdoPower, "power") bControlsInitialised = True End Sub From 26b7e6fcb53578be2f9734e4c8ce8597c069523c Mon Sep 17 00:00:00 2001 From: Alex Sananka Date: Mon, 26 Jun 2017 12:26:05 +0300 Subject: [PATCH 174/201] fixing reseting on ucrInputInstepsof --- instat/dlgRegularSequence.vb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index ae704175fad..9046433c55f 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -64,7 +64,7 @@ Public Class dlgRegularSequence ucrInputFrom.SetLinkedDisplayControl(lblFrom) ucrPnlSequenceType.AddToLinkedControls(ucrInputTo, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrInputTo.SetLinkedDisplayControl(lblTo) - ucrPnlSequenceType.AddToLinkedControls(ucrInputInStepsOf, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + ucrPnlSequenceType.AddToLinkedControls(ucrInputInStepsOf, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=1) ucrInputInStepsOf.SetLinkedDisplayControl(lblInStepsOf) ucrPnlSequenceType.AddToLinkedControls(ucrNudRepeatValues, {rdoNumeric}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) ucrNudRepeatValues.SetLinkedDisplayControl(lblRepeatValues) @@ -99,11 +99,11 @@ Public Class dlgRegularSequence clsSeqFunction.AddParameter("to", ucrSelectDataFrameRegularSequence.iDataFrameLength) clsSeqFunction.AddParameter("by", 1) + clsRepFunction.SetRCommand("rep") clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsSeqFunction) clsRepFunction.AddParameter("each", 1) clsRepFunction.AddParameter("length.out", ucrSelectDataFrameRegularSequence.iDataFrameLength, iPosition:=3) - 'clsSeqFunction.SetAssignTo(ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) ucrBase.clsRsyntax.SetAssignTo(strAssignToName:=ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) ucrBase.clsRsyntax.SetBaseRFunction(clsRepFunction) CheckSequenceLength() @@ -116,9 +116,6 @@ Public Class dlgRegularSequence ucrInputFrom.SetRCode(clsSeqFunction, bReset) ucrInputTo.SetRCode(clsSeqFunction, bReset) ucrNudRepeatValues.SetRCode(clsRepFunction, bReset) - If bReset AndAlso (ucrInputFrom.GetText < ucrInputTo.GetText) Then - ucrInputInStepsOf.SetRCode(clsSeqFunction, bReset) - End If bUpdateBy = True End Sub From 6b9f481d80ff8f367d04bab24db748badbcd9191 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 11:10:06 +0100 Subject: [PATCH 175/201] fixes #3479 --- instat/static/InstatObject/R/data_object_R6.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instat/static/InstatObject/R/data_object_R6.R b/instat/static/InstatObject/R/data_object_R6.R index 232cfb88a0d..bc86fd9be52 100644 --- a/instat/static/InstatObject/R/data_object_R6.R +++ b/instat/static/InstatObject/R/data_object_R6.R @@ -320,7 +320,7 @@ data_object$set("public", "get_variables_metadata", function(data_type = "all", } else { cols <- column - curr_data <- private$data[ ,column] + curr_data <- private$data[column] } for(i in seq_along(cols)) { col <- curr_data[[i]] @@ -352,8 +352,8 @@ data_object$set("public", "get_variables_metadata", function(data_type = "all", #rbind.fill safer alternative currently out <- plyr::rbind.fill(out) out <- as.data.frame(out) - if(all(c(name_label, label_label) %in% names(out))) out <- out[ ,c(c(name_label, label_label), setdiff(names(out), c(name_label, label_label)))] - else if(name_label %in% names(out)) out <- out[ ,c(name_label, setdiff(names(out), name_label))] + if(all(c(name_label, label_label) %in% names(out))) out <- out[c(c(name_label, label_label), setdiff(names(out), c(name_label, label_label)))] + else if(name_label %in% names(out)) out <- out[c(name_label, setdiff(names(out), name_label))] #row.names(out) <- self$get_column_names() row.names(out) <- cols if(data_type != "all") { From fe305238b259f7ff025262c2736623d7482abcd6 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 26 Jun 2017 13:19:26 +0300 Subject: [PATCH 176/201] bug fix --- instat/dlgRegularSequence.vb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index 9046433c55f..27ba46e3ecb 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -155,10 +155,10 @@ Public Class dlgRegularSequence End Sub Private Sub SetBaseFunction() - If ucrNudRepeatValues.Value > 1 Then - ucrBase.clsRsyntax.SetBaseRFunction(clsRepFunction) - Else + If ucrNudRepeatValues.Value = 1 Then ucrBase.clsRsyntax.SetBaseRFunction(clsSeqFunction) + Else + ucrBase.clsRsyntax.SetBaseRFunction(clsRepFunction) End If End Sub @@ -227,13 +227,13 @@ Public Class dlgRegularSequence CheckSequenceLength() End Sub - Private Sub ucrNudRepeatValues_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudRepeatValues.ControlContentsChanged + Private Sub ucrNudRepeatValues_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudRepeatValues.ControlValueChanged SetBaseFunction() CheckSequenceLength() TestOKEnabled() End Sub - Private Sub ucrInputFrom_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrInputFrom.ControlValueChanged, ucrInputTo.ControlValueChanged, ucrInputInStepsOf.ControlValueChanged + Private Sub ucrInputFrom_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrInputFrom.ControlContentsChanged, ucrInputTo.ControlContentsChanged, ucrInputInStepsOf.ControlContentsChanged If bUpdateBy Then SetInStepsOfParameter() End If From 6daff1dec6d411f4d21fc28590892e23e3c57a05 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 12:11:49 +0100 Subject: [PATCH 177/201] fixed backup files not deleting correctly --- instat/clsRLink.vb | 8 +- instat/dlgAutoSaveRecovery.Designer.vb | 100 ++++++++++++------------- instat/dlgAutoSaveRecovery.vb | 61 ++++++++------- instat/frmMain.vb | 36 +++++++-- 4 files changed, 118 insertions(+), 87 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 13960f741d8..823b50f7e2b 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -502,15 +502,15 @@ Public Class RLink If clsEngine IsNot Nothing Then If bFirstRCode Then Try - If Not Directory.Exists(frmMain.strAutoSaveDebugLogFolderPath) Then - Directory.CreateDirectory(frmMain.strAutoSaveDebugLogFolderPath) + If Not Directory.Exists(frmMain.strAutoSaveInternalLogFolderPath) Then + Directory.CreateDirectory(frmMain.strAutoSaveInternalLogFolderPath) End If strTempFile = "debug_log.R" - While File.Exists(Path.Combine(frmMain.strAutoSaveDebugLogFolderPath, strTempFile)) + While File.Exists(Path.Combine(frmMain.strAutoSaveInternalLogFolderPath, strTempFile)) i = i + 1 strTempFile = "debug_log" & i & ".R" End While - strAutoSaveDebugLogFilePath = Path.Combine(frmMain.strAutoSaveDebugLogFolderPath, strTempFile) + strAutoSaveDebugLogFilePath = Path.Combine(frmMain.strAutoSaveInternalLogFolderPath, strTempFile) File.WriteAllText(strAutoSaveDebugLogFilePath, "") Using w As StreamWriter = File.AppendText(strAutoSaveDebugLogFilePath) w.WriteLine("# ****************************") diff --git a/instat/dlgAutoSaveRecovery.Designer.vb b/instat/dlgAutoSaveRecovery.Designer.vb index 61b560afd3f..20be7145b7f 100644 --- a/instat/dlgAutoSaveRecovery.Designer.vb +++ b/instat/dlgAutoSaveRecovery.Designer.vb @@ -28,17 +28,17 @@ Partial Class dlgAutoSaveRecovery Me.cmdLoadData = New System.Windows.Forms.Button() Me.lblBackupLogDetected = New System.Windows.Forms.Label() Me.cmdSaveLog = New System.Windows.Forms.Button() - Me.cmdSaveDebuggingLog = New System.Windows.Forms.Button() - Me.lblBackupDebuggingLogDetected = New System.Windows.Forms.Label() + Me.cmdSaveInternalLog = New System.Windows.Forms.Button() + Me.lblBackupInternalLogDetected = New System.Windows.Forms.Label() Me.cmdSaveData = New System.Windows.Forms.Button() Me.lblBackupDataDetected = New System.Windows.Forms.Label() Me.lblDataSavedTo = New System.Windows.Forms.Label() Me.ucrInputSavedPathData = New instat.ucrInputTextBox() Me.ucrInputSavedPathLog = New instat.ucrInputTextBox() Me.lblLogSavedTo = New System.Windows.Forms.Label() - Me.ucrInputSavedPathDebuggingLog = New instat.ucrInputTextBox() - Me.lblDebuggingLogSavedTo = New System.Windows.Forms.Label() - Me.ucrChkSendDebuggingLog = New instat.ucrCheck() + Me.ucrInputSavedPathInternalLog = New instat.ucrInputTextBox() + Me.lblInternalLogSavedTo = New System.Windows.Forms.Label() + Me.ucrChkSendInternalLog = New instat.ucrCheck() Me.cmdHelp = New System.Windows.Forms.Button() Me.grpSavingOptions = New System.Windows.Forms.GroupBox() Me.grpEndChoice = New System.Windows.Forms.GroupBox() @@ -103,23 +103,23 @@ Partial Class dlgAutoSaveRecovery Me.cmdSaveLog.Text = "Save Backup Log..." Me.cmdSaveLog.UseVisualStyleBackColor = True ' - 'cmdSaveDebuggingLog + 'cmdSaveInternalLog ' - Me.cmdSaveDebuggingLog.Location = New System.Drawing.Point(203, 115) - Me.cmdSaveDebuggingLog.Name = "cmdSaveDebuggingLog" - Me.cmdSaveDebuggingLog.Size = New System.Drawing.Size(176, 29) - Me.cmdSaveDebuggingLog.TabIndex = 7 - Me.cmdSaveDebuggingLog.Text = "Save Backup Debugging Log..." - Me.cmdSaveDebuggingLog.UseVisualStyleBackColor = True + Me.cmdSaveInternalLog.Location = New System.Drawing.Point(203, 115) + Me.cmdSaveInternalLog.Name = "cmdSaveInternalLog" + Me.cmdSaveInternalLog.Size = New System.Drawing.Size(176, 29) + Me.cmdSaveInternalLog.TabIndex = 7 + Me.cmdSaveInternalLog.Text = "Save Backup Internal Log..." + Me.cmdSaveInternalLog.UseVisualStyleBackColor = True ' - 'lblBackupDebuggingLogDetected + 'lblBackupInternalLogDetected ' - Me.lblBackupDebuggingLogDetected.AutoSize = True - Me.lblBackupDebuggingLogDetected.Location = New System.Drawing.Point(11, 123) - Me.lblBackupDebuggingLogDetected.Name = "lblBackupDebuggingLogDetected" - Me.lblBackupDebuggingLogDetected.Size = New System.Drawing.Size(186, 13) - Me.lblBackupDebuggingLogDetected.TabIndex = 6 - Me.lblBackupDebuggingLogDetected.Text = "Backup Debugging Log File Detected" + Me.lblBackupInternalLogDetected.AutoSize = True + Me.lblBackupInternalLogDetected.Location = New System.Drawing.Point(11, 123) + Me.lblBackupInternalLogDetected.Name = "lblBackupInternalLogDetected" + Me.lblBackupInternalLogDetected.Size = New System.Drawing.Size(169, 13) + Me.lblBackupInternalLogDetected.TabIndex = 6 + Me.lblBackupInternalLogDetected.Text = "Backup Internal Log File Detected" ' 'cmdSaveData ' @@ -177,32 +177,32 @@ Partial Class dlgAutoSaveRecovery Me.lblLogSavedTo.TabIndex = 13 Me.lblLogSavedTo.Text = "Saving at:" ' - 'ucrInputSavedPathDebuggingLog + 'ucrInputSavedPathInternalLog ' - Me.ucrInputSavedPathDebuggingLog.AddQuotesIfUnrecognised = True - Me.ucrInputSavedPathDebuggingLog.IsMultiline = False - Me.ucrInputSavedPathDebuggingLog.IsReadOnly = False - Me.ucrInputSavedPathDebuggingLog.Location = New System.Drawing.Point(468, 123) - Me.ucrInputSavedPathDebuggingLog.Name = "ucrInputSavedPathDebuggingLog" - Me.ucrInputSavedPathDebuggingLog.Size = New System.Drawing.Size(258, 21) - Me.ucrInputSavedPathDebuggingLog.TabIndex = 16 + Me.ucrInputSavedPathInternalLog.AddQuotesIfUnrecognised = True + Me.ucrInputSavedPathInternalLog.IsMultiline = False + Me.ucrInputSavedPathInternalLog.IsReadOnly = False + Me.ucrInputSavedPathInternalLog.Location = New System.Drawing.Point(468, 123) + Me.ucrInputSavedPathInternalLog.Name = "ucrInputSavedPathInternalLog" + Me.ucrInputSavedPathInternalLog.Size = New System.Drawing.Size(258, 21) + Me.ucrInputSavedPathInternalLog.TabIndex = 16 ' - 'lblDebuggingLogSavedTo + 'lblInternalLogSavedTo ' - Me.lblDebuggingLogSavedTo.AutoSize = True - Me.lblDebuggingLogSavedTo.Location = New System.Drawing.Point(398, 125) - Me.lblDebuggingLogSavedTo.Name = "lblDebuggingLogSavedTo" - Me.lblDebuggingLogSavedTo.Size = New System.Drawing.Size(55, 13) - Me.lblDebuggingLogSavedTo.TabIndex = 15 - Me.lblDebuggingLogSavedTo.Text = "Saving at:" + Me.lblInternalLogSavedTo.AutoSize = True + Me.lblInternalLogSavedTo.Location = New System.Drawing.Point(398, 125) + Me.lblInternalLogSavedTo.Name = "lblInternalLogSavedTo" + Me.lblInternalLogSavedTo.Size = New System.Drawing.Size(55, 13) + Me.lblInternalLogSavedTo.TabIndex = 15 + Me.lblInternalLogSavedTo.Text = "Saving at:" ' - 'ucrChkSendDebuggingLog + 'ucrChkSendInternalLog ' - Me.ucrChkSendDebuggingLog.Checked = False - Me.ucrChkSendDebuggingLog.Location = New System.Drawing.Point(12, 254) - Me.ucrChkSendDebuggingLog.Name = "ucrChkSendDebuggingLog" - Me.ucrChkSendDebuggingLog.Size = New System.Drawing.Size(266, 20) - Me.ucrChkSendDebuggingLog.TabIndex = 17 + Me.ucrChkSendInternalLog.Checked = False + Me.ucrChkSendInternalLog.Location = New System.Drawing.Point(12, 254) + Me.ucrChkSendInternalLog.Name = "ucrChkSendInternalLog" + Me.ucrChkSendInternalLog.Size = New System.Drawing.Size(266, 20) + Me.ucrChkSendInternalLog.TabIndex = 17 ' 'cmdHelp ' @@ -218,10 +218,10 @@ Partial Class dlgAutoSaveRecovery Me.grpSavingOptions.Controls.Add(Me.lblBackupDataDetected) Me.grpSavingOptions.Controls.Add(Me.lblBackupLogDetected) Me.grpSavingOptions.Controls.Add(Me.cmdSaveLog) - Me.grpSavingOptions.Controls.Add(Me.ucrInputSavedPathDebuggingLog) - Me.grpSavingOptions.Controls.Add(Me.lblBackupDebuggingLogDetected) - Me.grpSavingOptions.Controls.Add(Me.lblDebuggingLogSavedTo) - Me.grpSavingOptions.Controls.Add(Me.cmdSaveDebuggingLog) + Me.grpSavingOptions.Controls.Add(Me.ucrInputSavedPathInternalLog) + Me.grpSavingOptions.Controls.Add(Me.lblBackupInternalLogDetected) + Me.grpSavingOptions.Controls.Add(Me.lblInternalLogSavedTo) + Me.grpSavingOptions.Controls.Add(Me.cmdSaveInternalLog) Me.grpSavingOptions.Controls.Add(Me.ucrInputSavedPathLog) Me.grpSavingOptions.Controls.Add(Me.cmdSaveData) Me.grpSavingOptions.Controls.Add(Me.lblLogSavedTo) @@ -254,7 +254,7 @@ Partial Class dlgAutoSaveRecovery Me.Controls.Add(Me.grpEndChoice) Me.Controls.Add(Me.grpSavingOptions) Me.Controls.Add(Me.cmdHelp) - Me.Controls.Add(Me.ucrChkSendDebuggingLog) + Me.Controls.Add(Me.ucrChkSendInternalLog) Me.Controls.Add(Me.lblAutoRecoverMessage) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.MaximizeBox = False @@ -275,17 +275,17 @@ Partial Class dlgAutoSaveRecovery Friend WithEvents cmdLoadData As Button Friend WithEvents lblBackupLogDetected As Label Friend WithEvents cmdSaveLog As Button - Friend WithEvents cmdSaveDebuggingLog As Button - Friend WithEvents lblBackupDebuggingLogDetected As Label + Friend WithEvents cmdSaveInternalLog As Button + Friend WithEvents lblBackupInternalLogDetected As Label Friend WithEvents cmdSaveData As Button Friend WithEvents lblBackupDataDetected As Label Friend WithEvents lblDataSavedTo As Label Friend WithEvents ucrInputSavedPathData As ucrInputTextBox Friend WithEvents ucrInputSavedPathLog As ucrInputTextBox Friend WithEvents lblLogSavedTo As Label - Friend WithEvents ucrInputSavedPathDebuggingLog As ucrInputTextBox - Friend WithEvents lblDebuggingLogSavedTo As Label - Friend WithEvents ucrChkSendDebuggingLog As ucrCheck + Friend WithEvents ucrInputSavedPathInternalLog As ucrInputTextBox + Friend WithEvents lblInternalLogSavedTo As Label + Friend WithEvents ucrChkSendInternalLog As ucrCheck Friend WithEvents cmdHelp As Button Friend WithEvents grpSavingOptions As GroupBox Friend WithEvents grpEndChoice As GroupBox diff --git a/instat/dlgAutoSaveRecovery.vb b/instat/dlgAutoSaveRecovery.vb index db726575ec6..01e37def159 100644 --- a/instat/dlgAutoSaveRecovery.vb +++ b/instat/dlgAutoSaveRecovery.vb @@ -23,11 +23,14 @@ Public Class dlgAutoSaveRecovery Private strLoadDateFilePath As String Public strAutoSavedDataFilePaths() As String Public strAutoSavedLogFilePaths() As String - Public strAutoSavedDebuggingLogFilePaths() As String + Public strAutoSavedInternalLogFilePaths() As String Private bUserClose As Boolean = True Private Sub dlgAutoSaveRecovery_Load(sender As Object, e As EventArgs) Handles MyBase.Load - ucrChkSendDebuggingLog.SetText("Send Debugging Log to R-Instat Team") + 'temporary - not yet implemented + ucrChkSendInternalLog.Visible = False + + ucrChkSendInternalLog.SetText("Send Debugging Log to R-Instat Team") strScript = "" strLoadDateFilePath = "" If strAutoSavedDataFilePaths IsNot Nothing AndAlso strAutoSavedDataFilePaths.Count > 0 Then @@ -48,19 +51,19 @@ Public Class dlgAutoSaveRecovery cmdSaveLog.Enabled = False cmdRunLog.Enabled = False End If - If strAutoSavedDebuggingLogFilePaths IsNot Nothing AndAlso strAutoSavedDebuggingLogFilePaths.Count > 0 Then - lblBackupDebuggingLogDetected.Text = "Backup Debugging Log File Detected" - cmdSaveDebuggingLog.Enabled = True - ucrChkSendDebuggingLog.Visible = True - ucrChkSendDebuggingLog.Checked = True + If strAutoSavedInternalLogFilePaths IsNot Nothing AndAlso strAutoSavedInternalLogFilePaths.Count > 0 Then + lblBackupInternalLogDetected.Text = "Backup Debugging Log File Detected" + cmdSaveInternalLog.Enabled = True + ucrChkSendInternalLog.Visible = True + ucrChkSendInternalLog.Checked = True Else - lblBackupDebuggingLogDetected.Text = "No Backup Debugging Log File Detected" - cmdSaveDebuggingLog.Enabled = False - ucrChkSendDebuggingLog.Visible = False - ucrChkSendDebuggingLog.Checked = False + lblBackupInternalLogDetected.Text = "No Backup Debugging Log File Detected" + cmdSaveInternalLog.Enabled = False + ucrChkSendInternalLog.Visible = False + ucrChkSendInternalLog.Checked = False End If ucrInputSavedPathData.IsReadOnly = True - ucrInputSavedPathDebuggingLog.IsReadOnly = True + ucrInputSavedPathInternalLog.IsReadOnly = True ucrInputSavedPathLog.IsReadOnly = True cmdNewSession.Enabled = True @@ -99,41 +102,47 @@ Public Class dlgAutoSaveRecovery End Using End Sub - Private Sub cmdSaveDebuggingLog_Click(sender As Object, e As EventArgs) Handles cmdSaveDebuggingLog.Click + Private Sub cmdSaveDebuggingLog_Click(sender As Object, e As EventArgs) Handles cmdSaveInternalLog.Click Using dlgSave As New SaveFileDialog dlgSave.Title = "Save Debugging Log File" dlgSave.Filter = "R script file (*.R)|*.R" If dlgSave.ShowDialog() = DialogResult.OK Then - ucrInputSavedPathDebuggingLog.SetName(dlgSave.FileName) + ucrInputSavedPathInternalLog.SetName(dlgSave.FileName) Else - ucrInputSavedPathDebuggingLog.SetName("") + ucrInputSavedPathInternalLog.SetName("") End If End Using End Sub Private Sub SaveFiles() - If strAutoSavedDataFilePaths IsNot Nothing AndAlso strAutoSavedDataFilePaths.Count > 0 AndAlso File.Exists(strAutoSavedDataFilePaths(0)) AndAlso Not ucrInputSavedPathData.IsEmpty() Then + If strAutoSavedDataFilePaths IsNot Nothing AndAlso strAutoSavedDataFilePaths.Count > 0 AndAlso File.Exists(strAutoSavedDataFilePaths(0)) Then Try - File.Copy(strAutoSavedDataFilePaths(0), ucrInputSavedPathData.GetText(), True) + If Not ucrInputSavedPathData.IsEmpty() Then + File.Copy(strAutoSavedDataFilePaths(0), ucrInputSavedPathData.GetText(), True) + End If File.Delete(strAutoSavedDataFilePaths(0)) Catch ex As Exception - MsgBox("Could not copy data file from: " & strAutoSavedDataFilePaths(0) & " to: " & ucrInputSavedPathData.GetText() & Environment.NewLine & ex.Message) + MsgBox("Could not copy and/or delete data file." & Environment.NewLine & ex.Message, "Error copying/deleting file") End Try End If - If strAutoSavedLogFilePaths IsNot Nothing AndAlso strAutoSavedLogFilePaths.Count > 0 AndAlso File.Exists(strAutoSavedLogFilePaths(0)) AndAlso Not ucrInputSavedPathLog.IsEmpty() Then + If strAutoSavedLogFilePaths IsNot Nothing AndAlso strAutoSavedLogFilePaths.Count > 0 AndAlso File.Exists(strAutoSavedLogFilePaths(0)) Then Try - File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText(), True) + If Not ucrInputSavedPathLog.IsEmpty() Then + File.Copy(strAutoSavedLogFilePaths(0), ucrInputSavedPathLog.GetText(), True) + End If File.Delete(strAutoSavedLogFilePaths(0)) Catch ex As Exception - MsgBox("Could not copy log file from: " & strAutoSavedLogFilePaths(0) & " to: " & ucrInputSavedPathLog.GetText() & Environment.NewLine & ex.Message) + MsgBox("Could not copy and/or delete log file." & Environment.NewLine & ex.Message, "Error copying/deleting file") End Try End If - If strAutoSavedDebuggingLogFilePaths IsNot Nothing AndAlso strAutoSavedDebuggingLogFilePaths.Count > 0 AndAlso File.Exists(strAutoSavedDebuggingLogFilePaths(0)) AndAlso Not ucrInputSavedPathDebuggingLog.IsEmpty() Then + If strAutoSavedInternalLogFilePaths IsNot Nothing AndAlso strAutoSavedInternalLogFilePaths.Count > 0 AndAlso File.Exists(strAutoSavedInternalLogFilePaths(0)) Then Try - File.Copy(strAutoSavedDebuggingLogFilePaths(0), ucrInputSavedPathDebuggingLog.GetText(), True) - File.Delete(strAutoSavedDebuggingLogFilePaths(0)) + If Not ucrInputSavedPathInternalLog.IsEmpty() Then + File.Copy(strAutoSavedInternalLogFilePaths(0), ucrInputSavedPathInternalLog.GetText(), True) + End If + File.Delete(strAutoSavedInternalLogFilePaths(0)) Catch ex As Exception - MsgBox("Could not copy debugging log file from: " & strAutoSavedDebuggingLogFilePaths(0) & " to: " & ucrInputSavedPathDebuggingLog.GetText() & Environment.NewLine & ex.Message, "Are you finished?") + MsgBox("Could not copy and/or delete internal log file." & Environment.NewLine & ex.Message, "Error copying/deleting file") End Try End If End Sub @@ -145,7 +154,7 @@ Public Class dlgAutoSaveRecovery Try strScript = File.ReadAllText(strAutoSavedLogFilePaths(0)) Catch ex As Exception - MsgBox("Could not read log file at: " & strAutoSavedLogFilePaths(0) & Environment.NewLine & ex.Message) + MsgBox("Could not read log file." & Environment.NewLine & ex.Message, "Cannot read file") strScript = "" End Try End If diff --git a/instat/frmMain.vb b/instat/frmMain.vb index 4b0227cc6b7..a9cc40e6971 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -40,7 +40,7 @@ Public Class frmMain Public strAutoSaveDataFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_data_auto_save") Public strAutoSaveLogFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_log_auto_save") - Public strAutoSaveDebugLogFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_debug_log_auto_save") + Public strAutoSaveInternalLogFolderPath As String = Path.Combine(Path.GetTempPath, "R-Instat_debug_log_auto_save") Public strCurrentAutoSaveDataFilePath As String = "" @@ -100,12 +100,12 @@ Public Class frmMain Private Sub AutoRecoverAndStartREngine() Dim iLogFiles As Integer = 0 - Dim iDebugLog As Integer = 0 + Dim iInternalLogFiles As Integer = 0 Dim iDataFiles As Integer = 0 Dim strScript As String = "" Dim strDataFilePath As String = "" Dim strAutoSavedLogFilePaths() As String = Nothing - Dim strAutoSavedDebugLogFilePaths() As String = Nothing + Dim strAutoSavedInternalLogFilePaths() As String = Nothing Dim strAutoSavedDataFilePaths() As String = Nothing If Process.GetProcessesByName(Path.GetFileNameWithoutExtension(Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1 Then @@ -115,9 +115,9 @@ Public Class frmMain strAutoSavedLogFilePaths = My.Computer.FileSystem.GetFiles(strAutoSaveLogFolderPath).ToArray iLogFiles = strAutoSavedLogFilePaths.Count End If - If (Directory.Exists(strAutoSaveDebugLogFolderPath)) Then - strAutoSavedDebugLogFilePaths = My.Computer.FileSystem.GetFiles(strAutoSaveDebugLogFolderPath).ToArray - iDebugLog = strAutoSavedDebugLogFilePaths.Count + If (Directory.Exists(strAutoSaveInternalLogFolderPath)) Then + strAutoSavedInternalLogFilePaths = My.Computer.FileSystem.GetFiles(strAutoSaveInternalLogFolderPath).ToArray + iInternalLogFiles = strAutoSavedInternalLogFilePaths.Count End If If Directory.Exists(strAutoSaveDataFolderPath) Then strAutoSavedDataFilePaths = My.Computer.FileSystem.GetFiles(strAutoSaveDataFolderPath).ToArray @@ -127,10 +127,32 @@ Public Class frmMain If MsgBox("We have detected that R-Instat may have closed unexpectadly last time." & Environment.NewLine & "Would you like to see auto recovery options?", MessageBoxButtons.YesNo, "Auto Recovery") = MsgBoxResult.Yes Then dlgAutoSaveRecovery.strAutoSavedLogFilePaths = strAutoSavedLogFilePaths dlgAutoSaveRecovery.strAutoSavedDataFilePaths = strAutoSavedDataFilePaths - dlgAutoSaveRecovery.strAutoSavedDebuggingLogFilePaths = strAutoSavedDebugLogFilePaths + dlgAutoSaveRecovery.strAutoSavedInternalLogFilePaths = strAutoSavedInternalLogFilePaths dlgAutoSaveRecovery.ShowDialog() strScript = dlgAutoSaveRecovery.GetScript() strDataFilePath = dlgAutoSaveRecovery.GetDataFilePath() + Else + If iLogFiles > 0 Then + Try + File.Delete(strAutoSavedLogFilePaths(0)) + Catch ex As Exception + MsgBox("Could not delete backup log file" & Environment.NewLine, "Error deleting file") + End Try + End If + If iInternalLogFiles > 0 Then + Try + File.Delete(strAutoSavedInternalLogFilePaths(0)) + Catch ex As Exception + MsgBox("Could not delete backup internal log file." & Environment.NewLine & ex.Message, "Error deleting file") + End Try + End If + If iDataFiles > 0 Then + Try + File.Delete(strAutoSavedDataFilePaths(0)) + Catch ex As Exception + MsgBox("Could not delete back data file." & Environment.NewLine & ex.Message, "Error deleting file") + End Try + End If End If End If clsRLink.StartREngine(strScript) From 4de0ab3ef81e1019e7aaf44b9106f5aeab63e79c Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 12:56:32 +0100 Subject: [PATCH 178/201] fixed bug in options class and added separate class for default options --- instat/clsInstatOptions.vb | 156 ++++++++++++++++------------- instat/clsInstatOptionsDefaults.vb | 41 ++++++++ instat/instat.vbproj | 1 + 3 files changed, 130 insertions(+), 68 deletions(-) create mode 100644 instat/clsInstatOptionsDefaults.vb diff --git a/instat/clsInstatOptions.vb b/instat/clsInstatOptions.vb index 23e2b9f14d8..b9987b3685b 100644 --- a/instat/clsInstatOptions.vb +++ b/instat/clsInstatOptions.vb @@ -1,17 +1,33 @@ -Imports System.Threading +' Instat-R +' Copyright (C) 2015 +' +' 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 k +' along with this program. If not, see . + +Imports System.Threading Imports System.Globalization Imports unvell.ReoGrid Imports RDotNet 'Serializable allows the class to be exported as a file Public Class InstatOptions - Public bIncludeRDefaultParameters As Boolean Public fntOutput, fntScript, fntComment, fntEditor As Font Public clrOutput, clrScript, clrComment, clrEditor As Color Public strComment, strLanguageCultureCode As String Public strWorkingDirectory As String ' Nullable allows us to have integers and booleans with value = Nothing ' Needed so we can check if variable has been specified, not just has default value + Public bIncludeRDefaultParameters As Nullable(Of Boolean) Public iPreviewRows As Nullable(Of Integer) Public iMaxRows As Nullable(Of Integer) Public iMaxCols As Nullable(Of Integer) @@ -23,55 +39,29 @@ Imports RDotNet Public bShowSignifStars As Nullable(Of Boolean) Public bChangeDataFrame As Nullable(Of Boolean) - 'Factory defaults - Private DEFAULTbIncludeRDefaultParameters As Boolean = False - Private DEFAULTbCommandsinOutput As Boolean = True - Private DEFAULTbIncludeCommentDefault As Boolean = True - Private DEFAULTfntOutput As Font = New Font(FontFamily.GenericMonospace, 11, FontStyle.Regular) - Private DEFAULTclrOutput As Color = Color.Blue - Private DEFAULTfntComment As Font = New Font(FontFamily.GenericSansSerif, 11, FontStyle.Regular) - Private DEFAULTclrComment As Color = Color.Green - Private DEFAULTfntScript As Font = New Font(FontFamily.GenericSansSerif, 11, FontStyle.Regular) - Private DEFAULTclrScript As Color = Color.Black - Private DEFAULTfntEditor As Font = New Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular) - Private DEFAULTclrEditor As Color = Color.Black - Private DEFAULTiPreviewRows As Integer = 10 - Private DEFAULTiMaxRows As Integer = 1000 - Private DEFAULTiMaxCols As Integer = 30 - Private DEFAULTstrComment As String = "code generated by the dialog" - Private DEFAULTstrGraphDisplayOption As String = "view_output_window" - Private DEFAULTbChangeDataFrame As Boolean = False - 'TODO is this sensible? - Private DEFAULTstrLanguageCultureCode As String = Thread.CurrentThread.CurrentCulture.Name - Private DEFAULTstrWorkingDirectory As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) - Private DEFAULTlstColourPalette As List(Of Color) = ({Color.Aqua, Color.Gray, Color.LightGreen, Color.AliceBlue, Color.Maroon, Color.Green, Color.LightPink, Color.LightSkyBlue, Color.Brown, Color.MediumPurple, Color.White}).ToList - Private DEFAULTiDigits As Integer = 4 - Private DEFAULTbShowSignifStars As Boolean = False - Public Sub New(Optional bSetOptions As Boolean = True) 'TODO Is this sensible to do in constructor? - bIncludeRDefaultParameters = DEFAULTbIncludeRDefaultParameters - bCommandsinOutput = DEFAULTbCommandsinOutput - bIncludeCommentDefault = DEFAULTbIncludeCommentDefault - fntOutput = DEFAULTfntOutput - clrOutput = DEFAULTclrOutput - fntComment = DEFAULTfntComment - clrComment = DEFAULTclrComment - fntScript = DEFAULTfntScript - clrScript = DEFAULTclrScript - fntEditor = DEFAULTfntEditor - clrEditor = DEFAULTclrEditor - iPreviewRows = DEFAULTiPreviewRows - iMaxRows = DEFAULTiMaxRows - iMaxCols = DEFAULTiMaxCols - strComment = DEFAULTstrComment - strGraphDisplayOption = DEFAULTstrGraphDisplayOption - 'TODO is this sensible? - strLanguageCultureCode = DEFAULTstrLanguageCultureCode - strWorkingDirectory = DEFAULTstrWorkingDirectory - SetColorPalette(DEFAULTlstColourPalette) - iDigits = DEFAULTiDigits - bShowSignifStars = DEFAULTbShowSignifStars + bIncludeRDefaultParameters = clsInstatOptionsDefaults.DEFAULTbIncludeRDefaultParameters + bCommandsinOutput = clsInstatOptionsDefaults.DEFAULTbCommandsinOutput + bIncludeCommentDefault = clsInstatOptionsDefaults.DEFAULTbIncludeCommentDefault + fntOutput = clsInstatOptionsDefaults.DEFAULTfntOutput + clrOutput = clsInstatOptionsDefaults.DEFAULTclrOutput + fntComment = clsInstatOptionsDefaults.DEFAULTfntComment + clrComment = clsInstatOptionsDefaults.DEFAULTclrComment + fntScript = clsInstatOptionsDefaults.DEFAULTfntScript + clrScript = clsInstatOptionsDefaults.DEFAULTclrScript + fntEditor = clsInstatOptionsDefaults.DEFAULTfntEditor + clrEditor = clsInstatOptionsDefaults.DEFAULTclrEditor + iPreviewRows = clsInstatOptionsDefaults.DEFAULTiPreviewRows + iMaxRows = clsInstatOptionsDefaults.DEFAULTiMaxRows + iMaxCols = clsInstatOptionsDefaults.DEFAULTiMaxCols + strComment = clsInstatOptionsDefaults.DEFAULTstrComment + strGraphDisplayOption = clsInstatOptionsDefaults.DEFAULTstrGraphDisplayOption + strLanguageCultureCode = clsInstatOptionsDefaults.DEFAULTstrLanguageCultureCode + strWorkingDirectory = clsInstatOptionsDefaults.DEFAULTstrWorkingDirectory + lstColourPalette = clsInstatOptionsDefaults.DEFAULTlstColourPalette + iDigits = clsInstatOptionsDefaults.DEFAULTiDigits + bShowSignifStars = clsInstatOptionsDefaults.DEFAULTbShowSignifStars If bSetOptions Then SetOptions() End If @@ -81,103 +71,121 @@ Imports RDotNet If fntOutput IsNot Nothing AndAlso clrOutput <> Color.Empty Then SetFormatOutput(fntOutput, clrOutput) Else - SetFormatOutput(DEFAULTfntOutput, DEFAULTclrOutput) + SetFormatOutput(clsInstatOptionsDefaults.DEFAULTfntOutput, clsInstatOptionsDefaults.DEFAULTclrOutput) End If If fntComment IsNot Nothing AndAlso clrComment <> Color.Empty Then SetFormatComment(fntComment, clrComment) Else - SetFormatComment(DEFAULTfntComment, DEFAULTclrComment) + SetFormatComment(clsInstatOptionsDefaults.DEFAULTfntComment, clsInstatOptionsDefaults.DEFAULTclrComment) End If If fntScript IsNot Nothing AndAlso clrScript <> Color.Empty Then SetFormatScript(fntScript, clrScript) Else - SetFormatScript(DEFAULTfntScript, DEFAULTclrScript) + SetFormatScript(clsInstatOptionsDefaults.DEFAULTfntScript, clsInstatOptionsDefaults.DEFAULTclrScript) End If If fntEditor IsNot Nothing AndAlso clrEditor <> Color.Empty Then SetFormatEditor(fntEditor, clrEditor) Else - SetFormatEditor(DEFAULTfntEditor, DEFAULTclrEditor) + SetFormatEditor(clsInstatOptionsDefaults.DEFAULTfntEditor, clsInstatOptionsDefaults.DEFAULTclrEditor) End If If iPreviewRows.HasValue Then SetPreviewRows(iPreviewRows) Else - SetPreviewRows(DEFAULTiPreviewRows) + SetPreviewRows(clsInstatOptionsDefaults.DEFAULTiPreviewRows) End If If iMaxRows.HasValue Then SetMaxRows(iMaxRows) Else - SetMaxRows(DEFAULTiMaxRows) + SetMaxRows(clsInstatOptionsDefaults.DEFAULTiMaxRows) End If If iMaxCols.HasValue Then SetMaxCols(iMaxCols) Else - SetMaxCols(DEFAULTiMaxCols) + SetMaxCols(clsInstatOptionsDefaults.DEFAULTiMaxCols) End If If bCommandsinOutput.HasValue Then SetCommandInOutpt(bCommandsinOutput) Else - SetCommandInOutpt(DEFAULTbCommandsinOutput) + SetCommandInOutpt(clsInstatOptionsDefaults.DEFAULTbCommandsinOutput) End If If strComment IsNot Nothing Then SetComment(strComment) Else - SetComment(DEFAULTstrComment) + SetComment(clsInstatOptionsDefaults.DEFAULTstrComment) End If If strGraphDisplayOption IsNot Nothing Then SetGraphDisplayOption(strGraphDisplayOption) Else - SetGraphDisplayOption(DEFAULTstrGraphDisplayOption) + SetGraphDisplayOption(clsInstatOptionsDefaults.DEFAULTstrGraphDisplayOption) End If If strLanguageCultureCode IsNot Nothing Then SetLanguageCultureCode(strLanguageCultureCode) Else - SetLanguageCultureCode(DEFAULTstrLanguageCultureCode) + SetLanguageCultureCode(clsInstatOptionsDefaults.DEFAULTstrLanguageCultureCode) End If If strWorkingDirectory IsNot Nothing Then SetWorkingDirectory(strWorkingDirectory) Else - SetWorkingDirectory(DEFAULTstrWorkingDirectory) + SetWorkingDirectory(clsInstatOptionsDefaults.DEFAULTstrWorkingDirectory) End If If iDigits.HasValue Then SetDigits(iDigits) Else - SetDigits(DEFAULTiDigits) + SetDigits(clsInstatOptionsDefaults.DEFAULTiDigits) End If If bShowSignifStars.HasValue Then SetSignifStars(bShowSignifStars) Else - SetSignifStars(DEFAULTbShowSignifStars) + SetSignifStars(clsInstatOptionsDefaults.DEFAULTbShowSignifStars) End If If bChangeDataFrame.HasValue Then SetChangeDataFrame(bChangeDataFrame) Else - SetChangeDataFrame(DEFAULTbChangeDataFrame) + SetChangeDataFrame(clsInstatOptionsDefaults.DEFAULTbChangeDataFrame) + End If + + If bIncludeCommentDefault.HasValue Then + SetIncludeCommentByDefault(bIncludeCommentDefault) + Else + SetIncludeCommentByDefault(clsInstatOptionsDefaults.DEFAULTbIncludeCommentDefault) + End If + + If bIncludeRDefaultParameters.HasValue Then + SetIncludeRDefaultParameters(bIncludeRDefaultParameters) + Else + SetIncludeRDefaultParameters(clsInstatOptionsDefaults.DEFAULTbIncludeRDefaultParameters) + End If + + If lstColourPalette IsNot Nothing Then + SetColorPalette(lstColourPalette) + Else + SetColorPalette(clsInstatOptionsDefaults.DEFAULTlstColourPalette) End If End Sub Public Sub SetMaxRows(iRows As Integer) - If iRows <> iMaxRows Then + If (iMaxRows.HasValue AndAlso iRows <> iMaxRows) OrElse Not iMaxRows.HasValue Then iMaxRows = iRows frmMain.clsGrids.SetMaxRows(iMaxRows) End If End Sub Public Sub SetMaxCols(iCols As Integer) - If iCols <> iMaxCols Then + If (iMaxCols.HasValue AndAlso iCols <> iMaxCols) OrElse Not iMaxCols.HasValue Then iMaxCols = iCols frmMain.clsGrids.SetMaxCols(iMaxCols) End If @@ -269,6 +277,7 @@ Imports RDotNet Public Sub SetDigits(iNewDigits As Integer) Dim clsOptionsFunction As New RFunction Dim clsGetOptionFunction As New RFunction + Dim expCurrDigits As SymbolicExpression If iNewDigits > 22 OrElse iNewDigits < 0 Then MsgBox("Cannot set digits to: " & iNewDigits & ". Digits must be an integer between 0 and 22.", MsgBoxStyle.Critical, "Error setting digits") @@ -276,7 +285,8 @@ Imports RDotNet iDigits = iNewDigits clsGetOptionFunction.SetRCommand("getOption") clsGetOptionFunction.AddParameter("x", Chr(34) & "digits" & Chr(34)) - If frmMain.clsRLink.RunInternalScriptGetValue(clsGetOptionFunction.ToScript()).AsInteger(0) <> iDigits Then + expCurrDigits = frmMain.clsRLink.RunInternalScriptGetValue(clsGetOptionFunction.ToScript(), bSilent:=True) + If (expCurrDigits IsNot Nothing AndAlso expCurrDigits.Type <> Internals.SymbolicExpressionType.Null AndAlso expCurrDigits.AsInteger(0) <> iDigits) OrElse expCurrDigits Is Nothing Then clsOptionsFunction.SetRCommand("options") clsOptionsFunction.AddParameter("digits", iDigits) frmMain.clsRLink.RunScript(clsOptionsFunction.ToScript(), strComment:="Option: Number of digits to display") @@ -287,12 +297,14 @@ Imports RDotNet Public Sub SetSignifStars(bShowStars As Boolean) Dim clsOptionsFunction As New RFunction Dim clsGetOptionsFunction As New RFunction + Dim expCurrStars As SymbolicExpression bShowSignifStars = bShowStars clsGetOptionsFunction.SetRCommand("getOption") clsGetOptionsFunction.AddParameter("x", Chr(34) & "show.signif.stars" & Chr(34)) clsOptionsFunction.SetRCommand("options") - If frmMain.clsRLink.RunInternalScriptGetValue(clsGetOptionsFunction.ToScript()).AsLogical(0) <> bShowSignifStars Then + expCurrStars = frmMain.clsRLink.RunInternalScriptGetValue(clsGetOptionsFunction.ToScript(), bSilent:=True) + If (expCurrStars IsNot Nothing AndAlso expCurrStars.Type <> Internals.SymbolicExpressionType.Null AndAlso expCurrStars.AsLogical(0) <> bShowSignifStars) OrElse expCurrStars Is Nothing Then If bShowSignifStars Then clsOptionsFunction.AddParameter("show.signif.stars", "TRUE") Else @@ -305,4 +317,12 @@ Imports RDotNet Public Sub SetChangeDataFrame(bNewChange As Boolean) bChangeDataFrame = bNewChange End Sub + + Public Sub SetIncludeCommentByDefault(bNewInclude As Boolean) + bIncludeCommentDefault = bNewInclude + End Sub + + Public Sub SetIncludeRDefaultParameters(bNewInclude As Boolean) + bIncludeRDefaultParameters = bNewInclude + End Sub End Class \ No newline at end of file diff --git a/instat/clsInstatOptionsDefaults.vb b/instat/clsInstatOptionsDefaults.vb new file mode 100644 index 00000000000..b3b9fce181b --- /dev/null +++ b/instat/clsInstatOptionsDefaults.vb @@ -0,0 +1,41 @@ +' Instat-R +' Copyright (C) 2015 +' +' 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 k +' along with this program. If not, see . + +Public Class clsInstatOptionsDefaults + Public Shared ReadOnly DEFAULTbIncludeRDefaultParameters As Boolean = False + Public Shared ReadOnly DEFAULTbCommandsinOutput As Boolean = True + Public Shared ReadOnly DEFAULTbIncludeCommentDefault As Boolean = True + Public Shared ReadOnly DEFAULTfntOutput As Font = New Font(FontFamily.GenericMonospace, 11, FontStyle.Regular) + Public Shared ReadOnly DEFAULTclrOutput As Color = Color.Blue + Public Shared ReadOnly DEFAULTfntComment As Font = New Font(FontFamily.GenericSansSerif, 11, FontStyle.Regular) + Public Shared ReadOnly DEFAULTclrComment As Color = Color.Green + Public Shared ReadOnly DEFAULTfntScript As Font = New Font(FontFamily.GenericSansSerif, 11, FontStyle.Regular) + Public Shared ReadOnly DEFAULTclrScript As Color = Color.Black + Public Shared ReadOnly DEFAULTfntEditor As Font = New Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular) + Public Shared ReadOnly DEFAULTclrEditor As Color = Color.Black + Public Shared ReadOnly DEFAULTiPreviewRows As Integer = 10 + Public Shared ReadOnly DEFAULTiMaxRows As Integer = 1000 + Public Shared ReadOnly DEFAULTiMaxCols As Integer = 30 + Public Shared ReadOnly DEFAULTstrComment As String = "code generated by the dialog" + Public Shared ReadOnly DEFAULTstrGraphDisplayOption As String = "view_output_window" + Public Shared ReadOnly DEFAULTbChangeDataFrame As Boolean = False + 'TODO is this sensible? + Public Shared ReadOnly DEFAULTstrLanguageCultureCode As String = Threading.Thread.CurrentThread.CurrentCulture.Name + Public Shared ReadOnly DEFAULTstrWorkingDirectory As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + Public Shared ReadOnly DEFAULTlstColourPalette As List(Of Color) = ({Color.Aqua, Color.Gray, Color.LightGreen, Color.AliceBlue, Color.Maroon, Color.Green, Color.LightPink, Color.LightSkyBlue, Color.Brown, Color.MediumPurple, Color.White}).ToList + Public Shared ReadOnly DEFAULTiDigits As Integer = 4 + Public Shared ReadOnly DEFAULTbShowSignifStars As Boolean = False +End Class diff --git a/instat/instat.vbproj b/instat/instat.vbproj index a14da8798cb..b262e0c087f 100644 --- a/instat/instat.vbproj +++ b/instat/instat.vbproj @@ -148,6 +148,7 @@ + dlgAddComment.vb From 6584af3912b070cc99898ae92c039001aefa939a Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 14:13:52 +0100 Subject: [PATCH 179/201] added waiting dialog when commnds running too long --- instat/clsRLink.vb | 4 +- instat/frmSetupLoading.Designer.vb | 95 +++++++++++++++++------------- instat/frmSetupLoading.vb | 22 +++++-- 3 files changed, 74 insertions(+), 47 deletions(-) diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 823b50f7e2b..13d91c9e056 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -564,12 +564,12 @@ Public Class RLink evtWaitHandleDelayDone.Set() End Sub) thrWaitDisplay = New Threading.Thread(Sub() - 'frmWaiting.Show() + frmSetupLoading.Show() While thrRScript.IsAlive Threading.Thread.Sleep(5) Application.DoEvents() End While - 'frmWaiting.Hide() + frmSetupLoading.Hide() evtWaitHandleWaitDisplayDone.Set() End Sub) thrRScript.Start() diff --git a/instat/frmSetupLoading.Designer.vb b/instat/frmSetupLoading.Designer.vb index e0141084769..200072f7d06 100644 --- a/instat/frmSetupLoading.Designer.vb +++ b/instat/frmSetupLoading.Designer.vb @@ -22,77 +22,92 @@ Partial Class frmSetupLoading 'Do not modify it using the code editor. _ Private Sub InitializeComponent() - Me.components = New System.ComponentModel.Container() - Me.lblLoading = New System.Windows.Forms.Label() - Me.Label1 = New System.Windows.Forms.Label() + Me.lblHeader = New System.Windows.Forms.Label() Me.pgbProgres = New System.Windows.Forms.ProgressBar() - Me.Timer1 = New System.Windows.Forms.Timer(Me.components) + Me.lblWaiting = New System.Windows.Forms.Label() + Me.lblSeparator = New System.Windows.Forms.Label() + Me.lblMessage = New System.Windows.Forms.Label() Me.SuspendLayout() ' - 'lblLoading + 'lblHeader ' - Me.lblLoading.AutoSize = True - Me.lblLoading.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.lblLoading.Location = New System.Drawing.Point(29, 60) - Me.lblLoading.Name = "lblLoading" - Me.lblLoading.Size = New System.Drawing.Size(199, 40) - Me.lblLoading.TabIndex = 0 - Me.lblLoading.Text = "Loading packages from R. " & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Please wait." - Me.lblLoading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.lblLoading.UseWaitCursor = True - ' - 'Label1 - ' - Me.Label1.AutoSize = True - Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.Label1.Location = New System.Drawing.Point(28, 140) - Me.Label1.Name = "Label1" - Me.Label1.Size = New System.Drawing.Size(203, 17) - Me.Label1.TabIndex = 1 - Me.Label1.Text = "This may take several minutes." - Me.Label1.UseWaitCursor = True + Me.lblHeader.Dock = System.Windows.Forms.DockStyle.Top + Me.lblHeader.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.lblHeader.Location = New System.Drawing.Point(0, 0) + Me.lblHeader.Name = "lblHeader" + Me.lblHeader.Size = New System.Drawing.Size(437, 111) + Me.lblHeader.TabIndex = 0 + Me.lblHeader.Text = "Sorry for the wait." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "An R command is taking some time to complete. " & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Please be " & + "patient while the process finishes." + Me.lblHeader.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ' 'pgbProgres ' - Me.pgbProgres.Location = New System.Drawing.Point(13, 123) + Me.pgbProgres.Location = New System.Drawing.Point(43, 117) Me.pgbProgres.MarqueeAnimationSpeed = 75 Me.pgbProgres.Name = "pgbProgres" - Me.pgbProgres.Size = New System.Drawing.Size(236, 13) + Me.pgbProgres.Size = New System.Drawing.Size(351, 16) Me.pgbProgres.Style = System.Windows.Forms.ProgressBarStyle.Marquee Me.pgbProgres.TabIndex = 2 - Me.pgbProgres.UseWaitCursor = True ' - 'Timer1 + 'lblWaiting + ' + Me.lblWaiting.AutoSize = True + Me.lblWaiting.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.lblWaiting.Location = New System.Drawing.Point(21, 162) + Me.lblWaiting.Name = "lblWaiting" + Me.lblWaiting.Size = New System.Drawing.Size(159, 20) + Me.lblWaiting.TabIndex = 3 + Me.lblWaiting.Text = "While you're waiting..." + ' + 'lblSeparator + ' + Me.lblSeparator.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D + Me.lblSeparator.Location = New System.Drawing.Point(18, 145) + Me.lblSeparator.Name = "lblSeparator" + Me.lblSeparator.Size = New System.Drawing.Size(400, 2) + Me.lblSeparator.TabIndex = 4 + ' + 'lblMessage ' - Me.Timer1.Enabled = True - Me.Timer1.Interval = 10 + Me.lblMessage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle + Me.lblMessage.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.lblMessage.ForeColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(192, Byte), Integer)) + Me.lblMessage.Location = New System.Drawing.Point(22, 194) + Me.lblMessage.Name = "lblMessage" + Me.lblMessage.Size = New System.Drawing.Size(393, 89) + Me.lblMessage.TabIndex = 5 + Me.lblMessage.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ' 'frmSetupLoading ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(261, 182) + Me.BackColor = System.Drawing.SystemColors.Control + Me.ClientSize = New System.Drawing.Size(437, 311) Me.ControlBox = False + Me.Controls.Add(Me.lblMessage) + Me.Controls.Add(Me.lblSeparator) + Me.Controls.Add(Me.lblWaiting) Me.Controls.Add(Me.pgbProgres) - Me.Controls.Add(Me.Label1) - Me.Controls.Add(Me.lblLoading) - Me.Cursor = System.Windows.Forms.Cursors.WaitCursor + Me.Controls.Add(Me.lblHeader) + Me.Cursor = System.Windows.Forms.Cursors.Default Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow Me.Location = New System.Drawing.Point(540, 49) Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "frmSetupLoading" Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual - Me.Text = "Setup Loading" + Me.Text = "An R Command is Running" Me.TopMost = True - Me.UseWaitCursor = True Me.ResumeLayout(False) Me.PerformLayout() End Sub - Friend WithEvents lblLoading As Label - Friend WithEvents Label1 As Label + Friend WithEvents lblHeader As Label Friend WithEvents pgbProgres As ProgressBar - Friend WithEvents Timer1 As Timer + Friend WithEvents lblWaiting As Label + Friend WithEvents lblSeparator As Label + Friend WithEvents lblMessage As Label End Class diff --git a/instat/frmSetupLoading.vb b/instat/frmSetupLoading.vb index 59647f01d59..d9019ecde98 100644 --- a/instat/frmSetupLoading.vb +++ b/instat/frmSetupLoading.vb @@ -14,12 +14,24 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . Public Class frmSetupLoading - Public Sub New() + Private strHyperlink As String = "" - ' This call is required by the designer. - InitializeComponent() + Private Sub frmSetupLoading_Load(sender As Object, e As EventArgs) Handles MyBase.Load + 'Eventually have multiple messages and rotate what is shown each time + lblMessage.Text = "Did you know that R-Instat was developed in Africa by African Maths Initiative (AMI)?" & Environment.NewLine & "Click here to find out more AMI and the partners who helped make R-Instat a success." - ' Add any initialization after the InitializeComponent() call. - Me.Cursor = Cursors.WaitCursor + 'Optional hyperlink when clicking on the message + strHyperlink = "https://chuffed.org/project/africandatainitiative" + lblMessage.Cursor = Cursors.Hand + End Sub + + Private Sub lblMessage_Click(sender As Object, e As EventArgs) Handles lblMessage.Click + If strHyperlink <> "" Then + Try + Process.Start(strHyperlink) + Catch ex As Exception + MsgBox("Sorry, we couldn't open this link (" & strHyperlink & ")" & Environment.NewLine & ex.Message, "Cannot open link") + End Try + End If End Sub End Class \ No newline at end of file From 6c01bd54b9b26b9a18bb03e9a8831db5eac10eec Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 15:37:18 +0100 Subject: [PATCH 180/201] fixed bugs in levels/labels dialog --- instat/dlgLabels.Designer.vb | 43 ++++++++++++++++++------------------ instat/dlgLabels.vb | 18 ++++++++++----- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/instat/dlgLabels.Designer.vb b/instat/dlgLabels.Designer.vb index 79a210caac9..377654f78ae 100644 --- a/instat/dlgLabels.Designer.vb +++ b/instat/dlgLabels.Designer.vb @@ -23,12 +23,12 @@ Partial Class dlgLabels _ Private Sub InitializeComponent() Me.lblFactor = New System.Windows.Forms.Label() + Me.cmdAddLevel = New System.Windows.Forms.Button() + Me.ucrChkIncludeLevelNumbers = New instat.ucrCheck() Me.ucrReceiverLabels = New instat.ucrReceiverSingle() Me.ucrFactorLabels = New instat.ucrFactor() Me.ucrSelectorForLabels = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrBase = New instat.ucrButtons() - Me.cmdAddLevel = New System.Windows.Forms.Button() - Me.ucrChkAddLevels = New instat.ucrCheck() Me.SuspendLayout() ' 'lblFactor @@ -41,6 +41,23 @@ Partial Class dlgLabels Me.lblFactor.Tag = "Factor_Selected:" Me.lblFactor.Text = "Factor Selected:" ' + 'cmdAddLevel + ' + Me.cmdAddLevel.Location = New System.Drawing.Point(256, 243) + Me.cmdAddLevel.Name = "cmdAddLevel" + Me.cmdAddLevel.Size = New System.Drawing.Size(96, 23) + Me.cmdAddLevel.TabIndex = 5 + Me.cmdAddLevel.Text = "Add Factor Level" + Me.cmdAddLevel.UseVisualStyleBackColor = True + ' + 'ucrChkIncludeLevelNumbers + ' + Me.ucrChkIncludeLevelNumbers.Checked = False + Me.ucrChkIncludeLevelNumbers.Location = New System.Drawing.Point(395, 246) + Me.ucrChkIncludeLevelNumbers.Name = "ucrChkIncludeLevelNumbers" + Me.ucrChkIncludeLevelNumbers.Size = New System.Drawing.Size(126, 20) + Me.ucrChkIncludeLevelNumbers.TabIndex = 6 + ' 'ucrReceiverLabels ' Me.ucrReceiverLabels.frmParent = Me @@ -63,6 +80,7 @@ Partial Class dlgLabels Me.ucrFactorLabels.shtCurrSheet = Nothing Me.ucrFactorLabels.Size = New System.Drawing.Size(267, 171) Me.ucrFactorLabels.TabIndex = 2 + Me.ucrFactorLabels.ucrChkLevels = Nothing ' 'ucrSelectorForLabels ' @@ -81,29 +99,12 @@ Partial Class dlgLabels Me.ucrBase.Size = New System.Drawing.Size(410, 53) Me.ucrBase.TabIndex = 0 ' - 'cmdAddLevel - ' - Me.cmdAddLevel.Location = New System.Drawing.Point(256, 243) - Me.cmdAddLevel.Name = "cmdAddLevel" - Me.cmdAddLevel.Size = New System.Drawing.Size(75, 23) - Me.cmdAddLevel.TabIndex = 5 - Me.cmdAddLevel.Text = "Add Level" - Me.cmdAddLevel.UseVisualStyleBackColor = True - ' - 'ucrChkAddLevels - ' - Me.ucrChkAddLevels.Checked = False - Me.ucrChkAddLevels.Location = New System.Drawing.Point(344, 245) - Me.ucrChkAddLevels.Name = "ucrChkAddLevels" - Me.ucrChkAddLevels.Size = New System.Drawing.Size(100, 20) - Me.ucrChkAddLevels.TabIndex = 6 - ' 'dlgLabels ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(533, 332) - Me.Controls.Add(Me.ucrChkAddLevels) + Me.Controls.Add(Me.ucrChkIncludeLevelNumbers) Me.Controls.Add(Me.cmdAddLevel) Me.Controls.Add(Me.ucrReceiverLabels) Me.Controls.Add(Me.lblFactor) @@ -128,5 +129,5 @@ Partial Class dlgLabels Friend WithEvents lblFactor As Label Friend WithEvents ucrReceiverLabels As ucrReceiverSingle Friend WithEvents cmdAddLevel As Button - Friend WithEvents ucrChkAddLevels As ucrCheck + Friend WithEvents ucrChkIncludeLevelNumbers As ucrCheck End Class diff --git a/instat/dlgLabels.vb b/instat/dlgLabels.vb index afc86ab4084..9bd3fa8e412 100644 --- a/instat/dlgLabels.vb +++ b/instat/dlgLabels.vb @@ -36,10 +36,11 @@ Public Class dlgLabels Private Sub SetRCodeforControls(bReset As Boolean) SetRCode(Me, ucrBase.clsRsyntax.clsBaseFunction, bReset) + TestOKEnabled() End Sub Private Sub TestOKEnabled() - If Not ucrReceiverLabels.IsEmpty() AndAlso ucrFactorLabels.IsColumnComplete(ucrFactorLabels.strLabelsName) AndAlso (ucrChkAddLevels.Visible AndAlso Not ucrChkAddLevels.Checked OrElse (ucrFactorLabels.IsColumnComplete(ucrFactorLabels.strLevelsName))) Then + If Not ucrReceiverLabels.IsEmpty() AndAlso ucrFactorLabels.IsColumnComplete(ucrFactorLabels.strLabelsName) AndAlso (ucrChkIncludeLevelNumbers.Visible AndAlso Not ucrChkIncludeLevelNumbers.Checked OrElse (ucrFactorLabels.IsColumnComplete(ucrFactorLabels.strLevelsName))) Then ucrBase.OKEnabled(True) Else ucrBase.OKEnabled(False) @@ -52,6 +53,7 @@ Public Class dlgLabels ucrSelectorForLabels.Focus() clsViewLabels.SetRCommand(frmMain.clsRLink.strInstatDataObject & "$set_factor_levels") ucrBase.clsRsyntax.SetBaseRFunction(clsViewLabels) + AddLevelButtonEnabled() End Sub Private Sub InitialiseDialog() @@ -62,7 +64,7 @@ Public Class dlgLabels ucrFactorLabels.SetAsViewerOnly() ucrFactorLabels.AddEditableColumns({ucrFactorLabels.strLevelsName, ucrFactorLabels.strLabelsName}) ucrFactorLabels.SetIsGridColumn(ucrFactorLabels.strLabelsName) - ucrFactorLabels.SetLevelsCheckbox(ucrChkAddLevels) + ucrFactorLabels.SetLevelsCheckbox(ucrChkIncludeLevelNumbers) ucrReceiverLabels.SetParameter(New RParameter("col_name", 1)) ucrReceiverLabels.SetParameterIsString() @@ -73,7 +75,7 @@ Public Class dlgLabels ucrSelectorForLabels.SetParameter(New RParameter("data_name", 0)) ucrSelectorForLabels.SetParameterIsString() - ucrChkAddLevels.SetText("Add Level Numbers") + ucrChkIncludeLevelNumbers.SetText("Include Level Numbers") End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -88,13 +90,17 @@ Public Class dlgLabels End Sub Private Sub ucrReceiverLabels_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverLabels.ControlContentsChanged, ucrFactorLabels.ControlContentsChanged - cmdAddLevel.Enabled = ucrFactorLabels.grdFactorData.Visible + AddLevelButtonEnabled() TestOKEnabled() End Sub + Private Sub AddLevelButtonEnabled() + cmdAddLevel.Enabled = ucrFactorLabels.grdFactorData.Visible AndAlso Not ucrReceiverLabels.IsEmpty + End Sub + 'TODO modify factor control to be able to manage two parameters from different columns - Private Sub ucrFactorLabels_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrFactorLabels.ControlValueChanged, ucrChkAddLevels.ControlValueChanged - If (ucrChkAddLevels.Checked OrElse Not ucrChkAddLevels.Visible) AndAlso ucrFactorLabels.IsColumnComplete(ucrFactorLabels.strLevelsName) Then + Private Sub ucrFactorLabels_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrFactorLabels.ControlValueChanged, ucrChkIncludeLevelNumbers.ControlValueChanged + If (ucrChkIncludeLevelNumbers.Checked OrElse Not ucrChkIncludeLevelNumbers.Visible) AndAlso ucrFactorLabels.IsColumnComplete(ucrFactorLabels.strLevelsName) Then clsViewLabels.AddParameter("new_levels", strParameterValue:=ucrFactorLabels.GetColumnInFactorSheet(ucrFactorLabels.strLevelsName, bWithQuotes:=False)) Else clsViewLabels.RemoveParameterByName("new_levels") From d28a62fb1cdf32eff19193cd9c04ca92518fc7b8 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 15:45:11 +0100 Subject: [PATCH 181/201] Set theme jekyll-theme-minimal --- _config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 _config.yml diff --git a/_config.yml b/_config.yml new file mode 100644 index 00000000000..2f7efbeab57 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-minimal \ No newline at end of file From 3af780f77e0417a8b090845ee0df5372d23ab5e3 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 15:53:23 +0100 Subject: [PATCH 182/201] created docs folder for website --- docs/foo.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/foo.txt diff --git a/docs/foo.txt b/docs/foo.txt new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/docs/foo.txt @@ -0,0 +1 @@ + From f62407ecc7551fadd718abc86a53cf22bef6b2ba Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 15:53:53 +0100 Subject: [PATCH 183/201] Set theme jekyll-theme-minimal --- docs/_config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000000..2f7efbeab57 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-minimal \ No newline at end of file From c1100bb82aed91105a4b869776bd27cea28ecc01 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 16:52:03 +0100 Subject: [PATCH 184/201] fixed bugs in regular sequence --- instat/dlgRegularSequence.designer.vb | 49 ++++++++--------- instat/dlgRegularSequence.vb | 79 +++++++++++++++++++++------ instat/ucrCore.vb | 2 +- 3 files changed, 87 insertions(+), 43 deletions(-) diff --git a/instat/dlgRegularSequence.designer.vb b/instat/dlgRegularSequence.designer.vb index 0a18ef76423..9ba6a7210bb 100644 --- a/instat/dlgRegularSequence.designer.vb +++ b/instat/dlgRegularSequence.designer.vb @@ -32,14 +32,13 @@ Partial Class dlgRegularSequence Me.dtpSelectorB = New System.Windows.Forms.DateTimePicker() Me.dtpSelectorA = New System.Windows.Forms.DateTimePicker() Me.lblLength = New System.Windows.Forms.Label() - Me.lblTimes1 = New System.Windows.Forms.Label() + Me.lblTimes = New System.Windows.Forms.Label() Me.lblRepeatValues = New System.Windows.Forms.Label() Me.lblInStepsOf = New System.Windows.Forms.Label() Me.lblTo = New System.Windows.Forms.Label() Me.lblFrom = New System.Windows.Forms.Label() Me.lblPreview = New System.Windows.Forms.Label() Me.txtGetPreview = New System.Windows.Forms.RichTextBox() - Me.txtMessage = New System.Windows.Forms.TextBox() Me.grpSequenceType = New System.Windows.Forms.GroupBox() Me.rdoNumeric = New System.Windows.Forms.RadioButton() Me.rdoDates = New System.Windows.Forms.RadioButton() @@ -47,6 +46,7 @@ Partial Class dlgRegularSequence Me.ucrNewColumnName = New instat.ucrSave() Me.ucrSelectDataFrameRegularSequence = New instat.ucrDataFrame() Me.ucrBase = New instat.ucrButtons() + Me.lblMessage = New System.Windows.Forms.Label() Me.grpSequenceDefinition.SuspendLayout() Me.grpSequenceType.SuspendLayout() Me.SuspendLayout() @@ -62,7 +62,7 @@ Partial Class dlgRegularSequence Me.grpSequenceDefinition.Controls.Add(Me.dtpSelectorB) Me.grpSequenceDefinition.Controls.Add(Me.dtpSelectorA) Me.grpSequenceDefinition.Controls.Add(Me.lblLength) - Me.grpSequenceDefinition.Controls.Add(Me.lblTimes1) + Me.grpSequenceDefinition.Controls.Add(Me.lblTimes) Me.grpSequenceDefinition.Controls.Add(Me.lblRepeatValues) Me.grpSequenceDefinition.Controls.Add(Me.lblInStepsOf) Me.grpSequenceDefinition.Controls.Add(Me.lblTo) @@ -159,15 +159,15 @@ Partial Class dlgRegularSequence Me.lblLength.Tag = "Length" Me.lblLength.Text = "Length:" ' - 'lblTimes1 + 'lblTimes ' - Me.lblTimes1.AutoSize = True - Me.lblTimes1.Location = New System.Drawing.Point(152, 106) - Me.lblTimes1.Name = "lblTimes1" - Me.lblTimes1.Size = New System.Drawing.Size(41, 13) - Me.lblTimes1.TabIndex = 10 - Me.lblTimes1.Tag = "Times" - Me.lblTimes1.Text = "Time(s)" + Me.lblTimes.AutoSize = True + Me.lblTimes.Location = New System.Drawing.Point(152, 106) + Me.lblTimes.Name = "lblTimes" + Me.lblTimes.Size = New System.Drawing.Size(41, 13) + Me.lblTimes.TabIndex = 10 + Me.lblTimes.Tag = "Times" + Me.lblTimes.Text = "Time(s)" ' 'lblRepeatValues ' @@ -226,20 +226,10 @@ Partial Class dlgRegularSequence ' Me.txtGetPreview.Location = New System.Drawing.Point(221, 65) Me.txtGetPreview.Name = "txtGetPreview" - Me.txtGetPreview.Size = New System.Drawing.Size(171, 172) + Me.txtGetPreview.Size = New System.Drawing.Size(185, 172) Me.txtGetPreview.TabIndex = 4 Me.txtGetPreview.Text = "" ' - 'txtMessage - ' - Me.txtMessage.Enabled = False - Me.txtMessage.Location = New System.Drawing.Point(221, 239) - Me.txtMessage.Multiline = True - Me.txtMessage.Name = "txtMessage" - Me.txtMessage.ReadOnly = True - Me.txtMessage.Size = New System.Drawing.Size(171, 58) - Me.txtMessage.TabIndex = 5 - ' 'grpSequenceType ' Me.grpSequenceType.Controls.Add(Me.rdoNumeric) @@ -308,14 +298,23 @@ Partial Class dlgRegularSequence Me.ucrBase.Size = New System.Drawing.Size(410, 52) Me.ucrBase.TabIndex = 7 ' + 'lblMessage + ' + Me.lblMessage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle + Me.lblMessage.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.lblMessage.Location = New System.Drawing.Point(221, 245) + Me.lblMessage.Name = "lblMessage" + Me.lblMessage.Size = New System.Drawing.Size(185, 52) + Me.lblMessage.TabIndex = 8 + ' 'dlgRegularSequence ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(418, 387) + Me.Controls.Add(Me.lblMessage) Me.Controls.Add(Me.grpSequenceType) Me.Controls.Add(Me.ucrNewColumnName) - Me.Controls.Add(Me.txtMessage) Me.Controls.Add(Me.txtGetPreview) Me.Controls.Add(Me.grpSequenceDefinition) Me.Controls.Add(Me.lblPreview) @@ -345,13 +344,12 @@ Partial Class dlgRegularSequence Friend WithEvents ucrSelectDataFrameRegularSequence As ucrDataFrame Friend WithEvents lblPreview As Label Friend WithEvents lblLength As Label - Friend WithEvents lblTimes1 As Label + Friend WithEvents lblTimes As Label Friend WithEvents lblRepeatValues As Label Friend WithEvents dtpSelectorA As DateTimePicker Friend WithEvents dtpSelectorB As DateTimePicker Friend WithEvents txtGetPreview As RichTextBox Friend WithEvents ucrDataFrameLengthForRegularSequence As ucrDataFrameLength - Friend WithEvents txtMessage As TextBox Friend WithEvents ucrNewColumnName As ucrSave Friend WithEvents grpSequenceType As GroupBox Friend WithEvents rdoNumeric As RadioButton @@ -362,4 +360,5 @@ Partial Class dlgRegularSequence Friend WithEvents ucrInputFrom As ucrInputTextBox Friend WithEvents ucrNudRepeatValues As ucrNud Friend WithEvents ucrChkDefineAsFactor As ucrCheck + Friend WithEvents lblMessage As Label End Class diff --git a/instat/dlgRegularSequence.vb b/instat/dlgRegularSequence.vb index 27ba46e3ecb..ed05d918db8 100644 --- a/instat/dlgRegularSequence.vb +++ b/instat/dlgRegularSequence.vb @@ -14,14 +14,17 @@ ' You should have received a copy of the GNU General Public License k ' along with this program. If not, see . +Imports instat Imports instat.Translations Imports RDotNet + Public Class dlgRegularSequence Dim bIsExtended As Boolean = False Public bFirstLoad As Boolean = True Private bReset As Boolean = True Private clsSeqFunction, clsRepFunction As New RFunction Private bUpdateBy As Boolean = False + Private Sub dlgRegularSequence_Load(sender As Object, e As EventArgs) Handles MyBase.Load autoTranslate(Me) If bFirstLoad Then @@ -99,24 +102,44 @@ Public Class dlgRegularSequence clsSeqFunction.AddParameter("to", ucrSelectDataFrameRegularSequence.iDataFrameLength) clsSeqFunction.AddParameter("by", 1) - clsRepFunction.SetRCommand("rep") clsRepFunction.AddParameter("x", clsRFunctionParameter:=clsSeqFunction) clsRepFunction.AddParameter("each", 1) clsRepFunction.AddParameter("length.out", ucrSelectDataFrameRegularSequence.iDataFrameLength, iPosition:=3) + ucrBase.clsRsyntax.SetAssignTo(strAssignToName:=ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) ucrBase.clsRsyntax.SetBaseRFunction(clsRepFunction) - CheckSequenceLength() End Sub Private Sub SetRCodeForControls(bReset As Boolean) + Dim strBy As String + Dim dcmBy As Decimal + bUpdateBy = False + 'Set to base function so that control is set correctly + 'After then set to nothing so that updating is done manually ucrNewColumnName.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) + ucrNewColumnName.SetRCode(Nothing, bReset:=False, bUpdate:=False) ucrPnlSequenceType.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) ucrInputFrom.SetRCode(clsSeqFunction, bReset) ucrInputTo.SetRCode(clsSeqFunction, bReset) ucrNudRepeatValues.SetRCode(clsRepFunction, bReset) + If clsSeqFunction.ContainsParameter("by") Then + strBy = clsSeqFunction.GetParameter("by").strArgumentValue + If strBy IsNot Nothing Then + If Decimal.TryParse(strBy, dcmBy) Then + ucrInputInStepsOf.SetName(Math.Abs(dcmBy)) + Else + ucrInputInStepsOf.SetName("") + End If + Else + ucrInputInStepsOf.SetName("") + End If + Else + ucrInputInStepsOf.SetName("") + End If bUpdateBy = True + CheckSequenceLength() End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -144,12 +167,21 @@ Public Class dlgRegularSequence End Sub Private Sub SetInStepsOfParameter() + Dim dcmTo As Decimal + Dim dcmFrom As Decimal + If Not ucrInputTo.IsEmpty AndAlso Not ucrInputFrom.IsEmpty Then - If Convert.ToDecimal(ucrInputTo.GetText) >= Convert.ToDecimal(ucrInputFrom.GetText) Then - clsSeqFunction.AddParameter("by", ucrInputInStepsOf.GetText) + If Decimal.TryParse(ucrInputTo.GetText, dcmTo) AndAlso Decimal.TryParse(ucrInputFrom.GetText, dcmFrom) Then + If dcmTo >= dcmFrom Then + clsSeqFunction.AddParameter("by", ucrInputInStepsOf.GetText) + Else + clsSeqFunction.AddParameter("by", "-" & ucrInputInStepsOf.GetText) + End If Else - clsSeqFunction.AddParameter("by", "-" & ucrInputInStepsOf.GetText) + clsSeqFunction.RemoveParameterByName("by") End If + Else + clsSeqFunction.RemoveParameterByName("by") End If CheckSequenceLength() End Sub @@ -159,8 +191,9 @@ Public Class dlgRegularSequence ucrBase.clsRsyntax.SetBaseRFunction(clsSeqFunction) Else ucrBase.clsRsyntax.SetBaseRFunction(clsRepFunction) + clsSeqFunction.RemoveAssignTo() End If - + SetAssignTo() End Sub 'Private Sub dtpSelectorA_ValueChanged(sender As Object, e As EventArgs) Handles dtpSelectorA.ValueChanged @@ -180,7 +213,7 @@ Public Class dlgRegularSequence Dim bIsAssigned As Boolean Dim bToBeAssigned As Boolean - txtMessage.Text = "" + lblMessage.Text = "" Try bIsAssigned = ucrBase.clsRsyntax.clsBaseFunction.bIsAssigned bToBeAssigned = ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned @@ -199,13 +232,13 @@ Public Class dlgRegularSequence vecSequence = frmMain.clsRLink.RunInternalScriptGetValue(strRCommand, bSilent:=True).AsNumeric ucrBase.clsRsyntax.SetAssignTo(strAssignToName:=ucrNewColumnName.GetText, strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText) If iLength < ucrSelectDataFrameRegularSequence.iDataFrameLength Then - txtMessage.Text = "Sequence extended to match" & Environment.NewLine & " the length of the data frame." + lblMessage.Text = "Sequence extended to match" & Environment.NewLine & "the length of the data frame." ElseIf iLength > ucrSelectDataFrameRegularSequence.iDataFrameLength Then - txtMessage.Text = "Sequence truncated to match" & Environment.NewLine & " the length of the data frame." + lblMessage.Text = "Sequence truncated to match" & Environment.NewLine & "the length of the data frame." End If Else clsRepFunction.RemoveParameterByName("length.out") - txtMessage.Text = "Sequence matches the length of the data frame." + lblMessage.Text = "Sequence matches the length of the data frame." End If txtGetPreview.Text = "" txtGetPreview.Text = String.Join(", ", vecSequence.AsCharacter()) @@ -213,33 +246,45 @@ Public Class dlgRegularSequence ucrBase.clsRsyntax.clsBaseFunction.bToBeAssigned = bToBeAssigned Catch ex As Exception txtGetPreview.Text = "" - txtMessage.Text = "No preview available." + lblMessage.Text = "No preview available." End Try End Sub Private Sub ucrSelectDataFrameRegularSequence_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectDataFrameRegularSequence.ControlValueChanged If ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text <> "" Then Try - ucrInputTo.txtInput.Text = frmMain.clsRLink.GetDataFrameLength(ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text) + ucrInputTo.SetName(frmMain.clsRLink.GetDataFrameLength(ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text)) Catch ex As Exception + ucrInputTo.SetName("") End Try End If - CheckSequenceLength() + SetAssignTo() End Sub - Private Sub ucrNudRepeatValues_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNudRepeatValues.ControlValueChanged + Private Sub ucrNudRepeatValues_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNudRepeatValues.ControlValueChanged SetBaseFunction() CheckSequenceLength() - TestOKEnabled() End Sub - Private Sub ucrInputFrom_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrInputFrom.ControlContentsChanged, ucrInputTo.ControlContentsChanged, ucrInputInStepsOf.ControlContentsChanged + Private Sub ucrInputFrom_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrInputFrom.ControlValueChanged, ucrInputTo.ControlValueChanged, ucrInputInStepsOf.ControlValueChanged If bUpdateBy Then SetInStepsOfParameter() End If End Sub - Private Sub ucrNewColumnName_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNewColumnName.ControlContentsChanged, ucrInputTo.ControlContentsChanged, ucrInputFrom.ControlContentsChanged, ucrInputInStepsOf.ControlContentsChanged, ucrPnlSequenceType.ControlContentsChanged, ucrSelectDataFrameRegularSequence.ControlContentsChanged + Private Sub ucrNewColumnName_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrNewColumnName.ControlContentsChanged, ucrInputTo.ControlContentsChanged, ucrInputFrom.ControlContentsChanged, ucrInputInStepsOf.ControlContentsChanged, ucrPnlSequenceType.ControlContentsChanged, ucrSelectDataFrameRegularSequence.ControlContentsChanged, ucrInputFrom.ControlContentsChanged, ucrInputTo.ControlContentsChanged, ucrInputInStepsOf.ControlContentsChanged, ucrNudRepeatValues.ControlContentsChanged TestOKEnabled() End Sub + + Private Sub ucrNewColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrNewColumnName.ControlValueChanged + SetAssignTo() + End Sub + + Private Sub SetAssignTo() + If ucrNewColumnName.GetText() <> "" AndAlso ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text <> "" Then + ucrBase.clsRsyntax.SetAssignTo(ucrNewColumnName.GetText(), strTempDataframe:=ucrSelectDataFrameRegularSequence.cboAvailableDataFrames.Text, strTempColumn:=ucrNewColumnName.GetText()) + Else + ucrBase.clsRsyntax.RemoveAssignTo() + End If + End Sub End Class \ No newline at end of file diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index 1a9e1633543..65f10c2a314 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -229,7 +229,7 @@ Public Class ucrCore Public Overridable Sub SetRCode(clsNewCodeStructure As RCodeStructure, Optional bReset As Boolean = False, Optional bUpdate As Boolean = True, Optional bCloneIfNeeded As Boolean = False) If clsRCode Is Nothing OrElse Not clsRCode.Equals(clsNewCodeStructure) Then clsRCode = clsNewCodeStructure - If bUpdateRCodeFromControl AndAlso CanUpdate() AndAlso bUpdate Then + If clsRCode IsNot Nothing AndAlso bUpdateRCodeFromControl AndAlso CanUpdate() AndAlso bUpdate Then UpdateRCode(bReset) End If End If From b0bc702455c171be92da2273ce3f3db51a606867 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 17:36:14 +0100 Subject: [PATCH 185/201] temp fixed bugs in correlation dialog --- instat/dlgCorrelation.vb | 7 +++++++ instat/sdgCorrPlot.vb | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/instat/dlgCorrelation.vb b/instat/dlgCorrelation.vb index 10750449334..00eddc834d6 100644 --- a/instat/dlgCorrelation.vb +++ b/instat/dlgCorrelation.vb @@ -265,4 +265,11 @@ Public Class dlgCorrelation Private Sub ucrSaveModel_CheckedChanged(bChecked As Boolean) Handles ucrSaveModel.CheckedChanged TestOKEnabled() End Sub + + 'Very bad temporary solution! Whole dialog needs to be fixed properly! + Private Sub ucrBase_BeforeClickOk(sender As Object, e As EventArgs) Handles ucrBase.BeforeClickOk + If sdgCorrPlot.rdoPairwisePlot.Checked OrElse sdgCorrPlot.rdoScatterplotMatrix.Checked OrElse sdgCorrPlot.rdoCorrelationPlot.Checked Then + ucrBase.clsRsyntax.iCallType = 3 + End If + End Sub End Class \ No newline at end of file diff --git a/instat/sdgCorrPlot.vb b/instat/sdgCorrPlot.vb index f736eb31fb6..b8d4ba0cd9a 100644 --- a/instat/sdgCorrPlot.vb +++ b/instat/sdgCorrPlot.vb @@ -44,7 +44,7 @@ Public Class sdgCorrPlot dlgCorrelation.TempData() clsRGraphics.SetPackageName("GGally") clsRGraphics.SetRCommand("ggpairs") - dlgCorrelation.ucrBase.clsRsyntax.iCallType = 2 + dlgCorrelation.ucrBase.clsRsyntax.iCallType = 3 dlgCorrelation.ucrBase.clsRsyntax.SetBaseRFunction(clsRGraphics) dlgCorrelation.TestOKEnabled() End Sub @@ -55,7 +55,7 @@ Public Class sdgCorrPlot clsRGGcorrGraphics.SetRCommand("ggcorr") clsRGGcorrGraphics.AddParameter("data", "NULL") clsRGGcorrGraphics.AddParameter("cor_matrix", clsRFunctionParameter:=dlgCorrelation.clsRCorrelation) - dlgCorrelation.ucrBase.clsRsyntax.iCallType = 2 + dlgCorrelation.ucrBase.clsRsyntax.iCallType = 3 dlgCorrelation.ucrBase.clsRsyntax.SetBaseRFunction(clsRGGcorrGraphics) dlgCorrelation.TestOKEnabled() End Sub @@ -64,7 +64,7 @@ Public Class sdgCorrPlot dlgCorrelation.TempData() clsRGGscatmatrix.SetPackageName("GGally") clsRGGscatmatrix.SetRCommand("ggscatmat") - dlgCorrelation.ucrBase.clsRsyntax.iCallType = 2 + dlgCorrelation.ucrBase.clsRsyntax.iCallType = 3 dlgCorrelation.ucrBase.clsRsyntax.SetBaseRFunction(clsRGGscatmatrix) dlgCorrelation.TestOKEnabled() End Sub From 3eabedd204e81cb9da0bac53baa6312ea3a2081c Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Mon, 26 Jun 2017 17:37:47 +0100 Subject: [PATCH 186/201] fixed position of check box on labels dialog --- instat/dlgLabels.Designer.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/dlgLabels.Designer.vb b/instat/dlgLabels.Designer.vb index 377654f78ae..3810119427e 100644 --- a/instat/dlgLabels.Designer.vb +++ b/instat/dlgLabels.Designer.vb @@ -53,9 +53,9 @@ Partial Class dlgLabels 'ucrChkIncludeLevelNumbers ' Me.ucrChkIncludeLevelNumbers.Checked = False - Me.ucrChkIncludeLevelNumbers.Location = New System.Drawing.Point(395, 246) + Me.ucrChkIncludeLevelNumbers.Location = New System.Drawing.Point(388, 246) Me.ucrChkIncludeLevelNumbers.Name = "ucrChkIncludeLevelNumbers" - Me.ucrChkIncludeLevelNumbers.Size = New System.Drawing.Size(126, 20) + Me.ucrChkIncludeLevelNumbers.Size = New System.Drawing.Size(135, 20) Me.ucrChkIncludeLevelNumbers.TabIndex = 6 ' 'ucrReceiverLabels From 82a7088e0d82b19ed4d6567eefeb6ceda80b7590 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 26 Jun 2017 21:45:17 +0300 Subject: [PATCH 187/201] design of main dialogue --- instat/dlgRegressionSimple.Designer.vb | 160 ++++++++++++------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 9d820a50f89..b0ef3e43ede 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -36,15 +36,7 @@ Partial Class dlgRegressionSimple Me.lblNumeric = New System.Windows.Forms.Label() Me.lblExplanatory = New System.Windows.Forms.Label() Me.lblResponse = New System.Windows.Forms.Label() - Me.grpParameters = New System.Windows.Forms.GroupBox() - Me.lblConfidenceInterval = New System.Windows.Forms.Label() - Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() - Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() - Me.lblDifferenceInMeans = New System.Windows.Forms.Label() - Me.ucrChkPairedTest = New instat.ucrCheck() Me.ucrPnlMeansAndVariance = New instat.UcrPanel() - Me.ucrNudHypothesis = New instat.ucrNud() - Me.ucrNudCI = New instat.ucrNud() Me.ucrSaveModels = New instat.ucrSave() Me.ucrChkConvertToVariate = New instat.ucrCheck() Me.ucrExplanatory = New instat.ucrReceiverSingle() @@ -55,6 +47,14 @@ Partial Class dlgRegressionSimple Me.ucrModelPreview = New instat.ucrInputTextBox() Me.ucrFamily = New instat.ucrDistributions() Me.ucrBase = New instat.ucrButtons() + Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() + Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() + Me.grpParameters = New System.Windows.Forms.GroupBox() + Me.lblDifferenceInMeans = New System.Windows.Forms.Label() + Me.lblConfidenceInterval = New System.Windows.Forms.Label() + Me.ucrNudHypothesis = New instat.ucrNud() + Me.ucrChkPairedTest = New instat.ucrCheck() + Me.ucrNudCI = New instat.ucrNud() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -139,77 +139,11 @@ Partial Class dlgRegressionSimple Me.lblResponse.Name = "lblResponse" Me.lblResponse.Tag = "Response_Variable" ' - 'grpParameters - ' - Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) - Me.grpParameters.Controls.Add(Me.rdoCompareVariance) - Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) - Me.grpParameters.Controls.Add(Me.rdoCompareMeans) - Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) - Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) - Me.grpParameters.Controls.Add(Me.ucrNudCI) - Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) - resources.ApplyResources(Me.grpParameters, "grpParameters") - Me.grpParameters.Name = "grpParameters" - Me.grpParameters.TabStop = False - ' - 'lblConfidenceInterval - ' - resources.ApplyResources(Me.lblConfidenceInterval, "lblConfidenceInterval") - Me.lblConfidenceInterval.Name = "lblConfidenceInterval" - ' - 'rdoCompareVariance - ' - resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") - Me.rdoCompareVariance.Name = "rdoCompareVariance" - Me.rdoCompareVariance.TabStop = True - Me.rdoCompareVariance.Tag = "" - Me.rdoCompareVariance.UseVisualStyleBackColor = True - ' - 'rdoCompareMeans - ' - resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") - Me.rdoCompareMeans.Name = "rdoCompareMeans" - Me.rdoCompareMeans.TabStop = True - Me.rdoCompareMeans.Tag = "" - Me.rdoCompareMeans.UseVisualStyleBackColor = True - ' - 'lblDifferenceInMeans - ' - resources.ApplyResources(Me.lblDifferenceInMeans, "lblDifferenceInMeans") - Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" - ' - 'ucrChkPairedTest - ' - Me.ucrChkPairedTest.Checked = False - resources.ApplyResources(Me.ucrChkPairedTest, "ucrChkPairedTest") - Me.ucrChkPairedTest.Name = "ucrChkPairedTest" - ' 'ucrPnlMeansAndVariance ' resources.ApplyResources(Me.ucrPnlMeansAndVariance, "ucrPnlMeansAndVariance") Me.ucrPnlMeansAndVariance.Name = "ucrPnlMeansAndVariance" ' - 'ucrNudHypothesis - ' - Me.ucrNudHypothesis.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudHypothesis.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - resources.ApplyResources(Me.ucrNudHypothesis, "ucrNudHypothesis") - Me.ucrNudHypothesis.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudHypothesis.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudHypothesis.Name = "ucrNudHypothesis" - Me.ucrNudHypothesis.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudCI - ' - Me.ucrNudCI.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudCI.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - resources.ApplyResources(Me.ucrNudCI, "ucrNudCI") - Me.ucrNudCI.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudCI.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudCI.Name = "ucrNudCI" - Me.ucrNudCI.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' 'ucrSaveModels ' resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") @@ -275,6 +209,72 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrBase, "ucrBase") Me.ucrBase.Name = "ucrBase" ' + 'rdoCompareMeans + ' + resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") + Me.rdoCompareMeans.Name = "rdoCompareMeans" + Me.rdoCompareMeans.TabStop = True + Me.rdoCompareMeans.Tag = "" + Me.rdoCompareMeans.UseVisualStyleBackColor = True + ' + 'rdoCompareVariance + ' + resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") + Me.rdoCompareVariance.Name = "rdoCompareVariance" + Me.rdoCompareVariance.TabStop = True + Me.rdoCompareVariance.Tag = "" + Me.rdoCompareVariance.UseVisualStyleBackColor = True + ' + 'grpParameters + ' + Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) + Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) + Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) + Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) + Me.grpParameters.Controls.Add(Me.ucrNudCI) + Me.grpParameters.Controls.Add(Me.rdoCompareMeans) + Me.grpParameters.Controls.Add(Me.rdoCompareVariance) + Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) + resources.ApplyResources(Me.grpParameters, "grpParameters") + Me.grpParameters.Name = "grpParameters" + Me.grpParameters.TabStop = False + ' + 'lblDifferenceInMeans + ' + resources.ApplyResources(Me.lblDifferenceInMeans, "lblDifferenceInMeans") + Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" + ' + 'lblConfidenceInterval + ' + resources.ApplyResources(Me.lblConfidenceInterval, "lblConfidenceInterval") + Me.lblConfidenceInterval.Name = "lblConfidenceInterval" + ' + 'ucrNudHypothesis + ' + Me.ucrNudHypothesis.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudHypothesis.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + resources.ApplyResources(Me.ucrNudHypothesis, "ucrNudHypothesis") + Me.ucrNudHypothesis.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudHypothesis.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudHypothesis.Name = "ucrNudHypothesis" + Me.ucrNudHypothesis.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkPairedTest + ' + Me.ucrChkPairedTest.Checked = False + resources.ApplyResources(Me.ucrChkPairedTest, "ucrChkPairedTest") + Me.ucrChkPairedTest.Name = "ucrChkPairedTest" + ' + 'ucrNudCI + ' + Me.ucrNudCI.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudCI.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + resources.ApplyResources(Me.ucrNudCI, "ucrNudCI") + Me.ucrNudCI.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudCI.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudCI.Name = "ucrNudCI" + Me.ucrNudCI.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") @@ -336,13 +336,13 @@ Partial Class dlgRegressionSimple Friend WithEvents lblExplanatory As Label Friend WithEvents lblResponse As Label Friend WithEvents ucrSaveModels As ucrSave - Friend WithEvents grpParameters As GroupBox - Friend WithEvents ucrNudCI As ucrNud - Friend WithEvents ucrNudHypothesis As ucrNud - Friend WithEvents ucrChkPairedTest As ucrCheck - Friend WithEvents lblConfidenceInterval As Label + Friend WithEvents ucrPnlMeansAndVariance As UcrPanel Friend WithEvents rdoCompareVariance As RadioButton Friend WithEvents rdoCompareMeans As RadioButton - Friend WithEvents ucrPnlMeansAndVariance As UcrPanel + Friend WithEvents grpParameters As GroupBox + Friend WithEvents ucrChkPairedTest As ucrCheck + Friend WithEvents ucrNudHypothesis As ucrNud + Friend WithEvents ucrNudCI As ucrNud Friend WithEvents lblDifferenceInMeans As Label + Friend WithEvents lblConfidenceInterval As Label End Class \ No newline at end of file From 96fdccbecba39f57dbf6549583b82244ffd1835d Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 27 Jun 2017 10:07:50 +0300 Subject: [PATCH 188/201] bug fix --- instat/dlgRegressionSimple.Designer.vb | 98 ++++---- instat/dlgRegressionSimple.vb | 14 +- instat/sdgSimpleRegOptions.Designer.vb | 324 ++++++++++++------------- instat/sdgSimpleRegOptions.vb | 28 ++- 4 files changed, 232 insertions(+), 232 deletions(-) diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index b0ef3e43ede..59c7f624594 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -36,7 +36,6 @@ Partial Class dlgRegressionSimple Me.lblNumeric = New System.Windows.Forms.Label() Me.lblExplanatory = New System.Windows.Forms.Label() Me.lblResponse = New System.Windows.Forms.Label() - Me.ucrPnlMeansAndVariance = New instat.UcrPanel() Me.ucrSaveModels = New instat.ucrSave() Me.ucrChkConvertToVariate = New instat.ucrCheck() Me.ucrExplanatory = New instat.ucrReceiverSingle() @@ -47,14 +46,15 @@ Partial Class dlgRegressionSimple Me.ucrModelPreview = New instat.ucrInputTextBox() Me.ucrFamily = New instat.ucrDistributions() Me.ucrBase = New instat.ucrButtons() - Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() - Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() Me.grpParameters = New System.Windows.Forms.GroupBox() - Me.lblDifferenceInMeans = New System.Windows.Forms.Label() - Me.lblConfidenceInterval = New System.Windows.Forms.Label() Me.ucrNudHypothesis = New instat.ucrNud() - Me.ucrChkPairedTest = New instat.ucrCheck() Me.ucrNudCI = New instat.ucrNud() + Me.lblConfidenceInterval = New System.Windows.Forms.Label() + Me.ucrChkPairedTest = New instat.ucrCheck() + Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() + Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() + Me.ucrPnlMeansAndVariance = New instat.UcrPanel() + Me.lblDifferenceInMeans = New System.Windows.Forms.Label() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -139,11 +139,6 @@ Partial Class dlgRegressionSimple Me.lblResponse.Name = "lblResponse" Me.lblResponse.Tag = "Response_Variable" ' - 'ucrPnlMeansAndVariance - ' - resources.ApplyResources(Me.ucrPnlMeansAndVariance, "ucrPnlMeansAndVariance") - Me.ucrPnlMeansAndVariance.Name = "ucrPnlMeansAndVariance" - ' 'ucrSaveModels ' resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") @@ -209,46 +204,20 @@ Partial Class dlgRegressionSimple resources.ApplyResources(Me.ucrBase, "ucrBase") Me.ucrBase.Name = "ucrBase" ' - 'rdoCompareMeans - ' - resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") - Me.rdoCompareMeans.Name = "rdoCompareMeans" - Me.rdoCompareMeans.TabStop = True - Me.rdoCompareMeans.Tag = "" - Me.rdoCompareMeans.UseVisualStyleBackColor = True - ' - 'rdoCompareVariance - ' - resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") - Me.rdoCompareVariance.Name = "rdoCompareVariance" - Me.rdoCompareVariance.TabStop = True - Me.rdoCompareVariance.Tag = "" - Me.rdoCompareVariance.UseVisualStyleBackColor = True - ' 'grpParameters ' Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) - Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) Me.grpParameters.Controls.Add(Me.ucrNudHypothesis) - Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) Me.grpParameters.Controls.Add(Me.ucrNudCI) - Me.grpParameters.Controls.Add(Me.rdoCompareMeans) + Me.grpParameters.Controls.Add(Me.lblConfidenceInterval) + Me.grpParameters.Controls.Add(Me.ucrChkPairedTest) Me.grpParameters.Controls.Add(Me.rdoCompareVariance) + Me.grpParameters.Controls.Add(Me.rdoCompareMeans) Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) resources.ApplyResources(Me.grpParameters, "grpParameters") Me.grpParameters.Name = "grpParameters" Me.grpParameters.TabStop = False ' - 'lblDifferenceInMeans - ' - resources.ApplyResources(Me.lblDifferenceInMeans, "lblDifferenceInMeans") - Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" - ' - 'lblConfidenceInterval - ' - resources.ApplyResources(Me.lblConfidenceInterval, "lblConfidenceInterval") - Me.lblConfidenceInterval.Name = "lblConfidenceInterval" - ' 'ucrNudHypothesis ' Me.ucrNudHypothesis.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) @@ -259,12 +228,6 @@ Partial Class dlgRegressionSimple Me.ucrNudHypothesis.Name = "ucrNudHypothesis" Me.ucrNudHypothesis.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'ucrChkPairedTest - ' - Me.ucrChkPairedTest.Checked = False - resources.ApplyResources(Me.ucrChkPairedTest, "ucrChkPairedTest") - Me.ucrChkPairedTest.Name = "ucrChkPairedTest" - ' 'ucrNudCI ' Me.ucrNudCI.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) @@ -275,6 +238,43 @@ Partial Class dlgRegressionSimple Me.ucrNudCI.Name = "ucrNudCI" Me.ucrNudCI.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' + 'lblConfidenceInterval + ' + resources.ApplyResources(Me.lblConfidenceInterval, "lblConfidenceInterval") + Me.lblConfidenceInterval.Name = "lblConfidenceInterval" + ' + 'ucrChkPairedTest + ' + Me.ucrChkPairedTest.Checked = False + resources.ApplyResources(Me.ucrChkPairedTest, "ucrChkPairedTest") + Me.ucrChkPairedTest.Name = "ucrChkPairedTest" + ' + 'rdoCompareVariance + ' + resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") + Me.rdoCompareVariance.Name = "rdoCompareVariance" + Me.rdoCompareVariance.TabStop = True + Me.rdoCompareVariance.Tag = "" + Me.rdoCompareVariance.UseVisualStyleBackColor = True + ' + 'rdoCompareMeans + ' + resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") + Me.rdoCompareMeans.Name = "rdoCompareMeans" + Me.rdoCompareMeans.TabStop = True + Me.rdoCompareMeans.Tag = "" + Me.rdoCompareMeans.UseVisualStyleBackColor = True + ' + 'ucrPnlMeansAndVariance + ' + resources.ApplyResources(Me.ucrPnlMeansAndVariance, "ucrPnlMeansAndVariance") + Me.ucrPnlMeansAndVariance.Name = "ucrPnlMeansAndVariance" + ' + 'lblDifferenceInMeans + ' + resources.ApplyResources(Me.lblDifferenceInMeans, "lblDifferenceInMeans") + Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" + ' 'dlgRegressionSimple ' resources.ApplyResources(Me, "$this") @@ -336,13 +336,13 @@ Partial Class dlgRegressionSimple Friend WithEvents lblExplanatory As Label Friend WithEvents lblResponse As Label Friend WithEvents ucrSaveModels As ucrSave - Friend WithEvents ucrPnlMeansAndVariance As UcrPanel + Friend WithEvents grpParameters As GroupBox Friend WithEvents rdoCompareVariance As RadioButton Friend WithEvents rdoCompareMeans As RadioButton - Friend WithEvents grpParameters As GroupBox + Friend WithEvents ucrPnlMeansAndVariance As UcrPanel Friend WithEvents ucrChkPairedTest As ucrCheck + Friend WithEvents lblConfidenceInterval As Label Friend WithEvents ucrNudHypothesis As ucrNud Friend WithEvents ucrNudCI As ucrNud Friend WithEvents lblDifferenceInMeans As Label - Friend WithEvents lblConfidenceInterval As Label End Class \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 778b37fa34c..4a446f07b45 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -308,7 +308,6 @@ Public Class dlgRegressionSimple ucrFamily.SetGLMDistributions() SetEnableDists() - TestOKEnabled() bResetSubDialog = True bResetOptionsSubDialog = True End Sub @@ -354,15 +353,14 @@ Public Class dlgRegressionSimple End Sub Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged - clsRYVariable = ucrResponse.GetVariableNames(bWithQuotes:=False) Preview() + clsRYVariable = ucrResponse.GetVariableNames(bWithQuotes:=False) SetEnableDists() End Sub Private Sub ucrSelectorSimpleReg_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSelectorSimpleReg.ControlValueChanged ConvertToVariate() - TestOKEnabled() DataTypeAccepted() End Sub @@ -674,8 +672,8 @@ Public Class dlgRegressionSimple SetRCode() ExplanatoryFunctionSelect() DataTypeAccepted() - ' clsRXVariable = ucrExplanatory.GetVariableNames(bWithQuotes:=False) Preview() + clsRXVariable = ucrExplanatory.GetVariableNames(bWithQuotes:=False) End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -766,12 +764,6 @@ Public Class dlgRegressionSimple ' End If End Sub - Private Sub chkboxes_VisibleChanged(sender As Object, e As EventArgs) - ' ExplanatoryFunctionSelect() - ConvertToVariate() - TestOKEnabled() - End Sub - Public Sub SetEnableDists() ucrFamily.Enabled = Not ucrResponse.IsEmpty End Sub @@ -781,7 +773,7 @@ Public Class dlgRegressionSimple SetEnableDists() End Sub - Private Sub ucrResponse_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged, ucrPnlModelType.ControlValueChanged + Private Sub Controls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlContentsChanged, ucrPnlModelType.ControlContentsChanged, ucrExplanatory.ControlContentsChanged TestOKEnabled() End Sub diff --git a/instat/sdgSimpleRegOptions.Designer.vb b/instat/sdgSimpleRegOptions.Designer.vb index 2b0dac51150..04d41281199 100644 --- a/instat/sdgSimpleRegOptions.Designer.vb +++ b/instat/sdgSimpleRegOptions.Designer.vb @@ -25,28 +25,18 @@ Partial Class sdgSimpleRegOptions Me.tbGraphics = New System.Windows.Forms.TabPage() Me.tcGraphics = New System.Windows.Forms.TabControl() Me.tbModel = New System.Windows.Forms.TabPage() - Me.ucrNudWhiteSpace = New instat.ucrNud() - Me.ucrNudGraphicsCLevel = New instat.ucrNud() - Me.ucrChkRugs = New instat.ucrCheck() - Me.ucrChkJitter = New instat.ucrCheck() - Me.ucrChkPartial = New instat.ucrCheck() - Me.ucrChkConfIntervalband = New instat.ucrCheck() - Me.ucrChkFittedModel = New instat.ucrCheck() Me.grpRugs = New System.Windows.Forms.GroupBox() Me.rdoPartial = New System.Windows.Forms.RadioButton() Me.rdo1 = New System.Windows.Forms.RadioButton() Me.rdo2 = New System.Windows.Forms.RadioButton() - Me.ucrPnlPartial12 = New instat.UcrPanel() Me.lblWhiteSpace = New System.Windows.Forms.Label() Me.lblGraphicsSignLevel = New System.Windows.Forms.Label() Me.grpPlotType = New System.Windows.Forms.GroupBox() Me.rdoContrast = New System.Windows.Forms.RadioButton() Me.rdoConditional = New System.Windows.Forms.RadioButton() - Me.ucrPnlPlotType = New instat.UcrPanel() Me.grpScale = New System.Windows.Forms.GroupBox() Me.rdoResponse = New System.Windows.Forms.RadioButton() Me.rdoLinear = New System.Windows.Forms.RadioButton() - Me.ucrPnlScale = New instat.UcrPanel() Me.tbResiduals = New System.Windows.Forms.TabPage() Me.rdoCooksDistanceLeverage = New System.Windows.Forms.RadioButton() Me.rdoCooksDistance = New System.Windows.Forms.RadioButton() @@ -58,21 +48,31 @@ Partial Class sdgSimpleRegOptions Me.rdoSixPlots3Rows = New System.Windows.Forms.RadioButton() Me.rdoFourPlots = New System.Windows.Forms.RadioButton() Me.rdoSixPlots2Rows = New System.Windows.Forms.RadioButton() - Me.ucrPnlMutiplePlots = New instat.UcrPanel() Me.grpIndividualPlots = New System.Windows.Forms.GroupBox() - Me.ucrPnlIndividualPlots = New instat.UcrPanel() - Me.ucrChkIndividualPlots = New instat.ucrCheck() - Me.ucrChkMultiplePlots = New instat.ucrCheck() Me.tbDisplay = New System.Windows.Forms.TabPage() + Me.lblDisplayCLevel = New System.Windows.Forms.Label() + Me.tbRegOptions = New System.Windows.Forms.TabControl() + Me.tbSave = New System.Windows.Forms.TabPage() Me.ucrNudDisplayCLevel = New instat.ucrNud() Me.ucrChkPvalues = New instat.ucrCheck() Me.ucrChkEstimates = New instat.ucrCheck() Me.ucrChkDisplayCLimits = New instat.ucrCheck() Me.ucrChkANOVA = New instat.ucrCheck() Me.ucrChkModel = New instat.ucrCheck() - Me.lblDisplayCLevel = New System.Windows.Forms.Label() - Me.tbRegOptions = New System.Windows.Forms.TabControl() - Me.tbSave = New System.Windows.Forms.TabPage() + Me.ucrNudWhiteSpace = New instat.ucrNud() + Me.ucrNudGraphicsCLevel = New instat.ucrNud() + Me.ucrChkRugs = New instat.ucrCheck() + Me.ucrChkJitter = New instat.ucrCheck() + Me.ucrChkPartial = New instat.ucrCheck() + Me.ucrChkConfIntervalband = New instat.ucrCheck() + Me.ucrChkFittedModel = New instat.ucrCheck() + Me.ucrPnlPartial12 = New instat.UcrPanel() + Me.ucrPnlPlotType = New instat.UcrPanel() + Me.ucrPnlScale = New instat.UcrPanel() + Me.ucrPnlMutiplePlots = New instat.UcrPanel() + Me.ucrPnlIndividualPlots = New instat.UcrPanel() + Me.ucrChkIndividualPlots = New instat.ucrCheck() + Me.ucrChkMultiplePlots = New instat.ucrCheck() Me.ucrSaveLeverageColumnName = New instat.ucrSave() Me.ucrSaveStdResidualsColumnName = New instat.ucrSave() Me.ucrSaveResidualsColumnName = New instat.ucrSave() @@ -137,70 +137,6 @@ Partial Class sdgSimpleRegOptions Me.tbModel.Text = "Model" Me.tbModel.UseVisualStyleBackColor = True ' - 'ucrNudWhiteSpace - ' - Me.ucrNudWhiteSpace.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudWhiteSpace.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudWhiteSpace.Location = New System.Drawing.Point(112, 150) - Me.ucrNudWhiteSpace.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudWhiteSpace.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudWhiteSpace.Name = "ucrNudWhiteSpace" - Me.ucrNudWhiteSpace.Size = New System.Drawing.Size(50, 20) - Me.ucrNudWhiteSpace.TabIndex = 29 - Me.ucrNudWhiteSpace.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrNudGraphicsCLevel - ' - Me.ucrNudGraphicsCLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudGraphicsCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudGraphicsCLevel.Location = New System.Drawing.Point(112, 124) - Me.ucrNudGraphicsCLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudGraphicsCLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudGraphicsCLevel.Name = "ucrNudGraphicsCLevel" - Me.ucrNudGraphicsCLevel.Size = New System.Drawing.Size(50, 20) - Me.ucrNudGraphicsCLevel.TabIndex = 28 - Me.ucrNudGraphicsCLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrChkRugs - ' - Me.ucrChkRugs.Checked = False - Me.ucrChkRugs.Location = New System.Drawing.Point(115, 179) - Me.ucrChkRugs.Name = "ucrChkRugs" - Me.ucrChkRugs.Size = New System.Drawing.Size(113, 20) - Me.ucrChkRugs.TabIndex = 24 - ' - 'ucrChkJitter - ' - Me.ucrChkJitter.Checked = False - Me.ucrChkJitter.Location = New System.Drawing.Point(10, 204) - Me.ucrChkJitter.Name = "ucrChkJitter" - Me.ucrChkJitter.Size = New System.Drawing.Size(97, 20) - Me.ucrChkJitter.TabIndex = 23 - ' - 'ucrChkPartial - ' - Me.ucrChkPartial.Checked = False - Me.ucrChkPartial.Location = New System.Drawing.Point(10, 178) - Me.ucrChkPartial.Name = "ucrChkPartial" - Me.ucrChkPartial.Size = New System.Drawing.Size(113, 20) - Me.ucrChkPartial.TabIndex = 25 - ' - 'ucrChkConfIntervalband - ' - Me.ucrChkConfIntervalband.Checked = False - Me.ucrChkConfIntervalband.Location = New System.Drawing.Point(115, 202) - Me.ucrChkConfIntervalband.Name = "ucrChkConfIntervalband" - Me.ucrChkConfIntervalband.Size = New System.Drawing.Size(113, 20) - Me.ucrChkConfIntervalband.TabIndex = 22 - ' - 'ucrChkFittedModel - ' - Me.ucrChkFittedModel.Checked = False - Me.ucrChkFittedModel.Location = New System.Drawing.Point(10, 7) - Me.ucrChkFittedModel.Name = "ucrChkFittedModel" - Me.ucrChkFittedModel.Size = New System.Drawing.Size(113, 20) - Me.ucrChkFittedModel.TabIndex = 21 - ' 'grpRugs ' Me.grpRugs.Controls.Add(Me.rdoPartial) @@ -249,13 +185,6 @@ Partial Class sdgSimpleRegOptions Me.rdo2.Text = "2" Me.rdo2.UseVisualStyleBackColor = True ' - 'ucrPnlPartial12 - ' - Me.ucrPnlPartial12.Location = New System.Drawing.Point(6, 13) - Me.ucrPnlPartial12.Name = "ucrPnlPartial12" - Me.ucrPnlPartial12.Size = New System.Drawing.Size(176, 27) - Me.ucrPnlPartial12.TabIndex = 35 - ' 'lblWhiteSpace ' Me.lblWhiteSpace.AutoSize = True @@ -311,13 +240,6 @@ Partial Class sdgSimpleRegOptions Me.rdoConditional.Text = "Conditional" Me.rdoConditional.UseVisualStyleBackColor = True ' - 'ucrPnlPlotType - ' - Me.ucrPnlPlotType.Location = New System.Drawing.Point(9, 19) - Me.ucrPnlPlotType.Name = "ucrPnlPlotType" - Me.ucrPnlPlotType.Size = New System.Drawing.Size(77, 43) - Me.ucrPnlPlotType.TabIndex = 31 - ' 'grpScale ' Me.grpScale.Controls.Add(Me.rdoResponse) @@ -355,13 +277,6 @@ Partial Class sdgSimpleRegOptions Me.rdoLinear.Text = "Linear" Me.rdoLinear.UseVisualStyleBackColor = True ' - 'ucrPnlScale - ' - Me.ucrPnlScale.Location = New System.Drawing.Point(6, 19) - Me.ucrPnlScale.Name = "ucrPnlScale" - Me.ucrPnlScale.Size = New System.Drawing.Size(94, 43) - Me.ucrPnlScale.TabIndex = 28 - ' 'tbResiduals ' Me.tbResiduals.Controls.Add(Me.rdoCooksDistanceLeverage) @@ -505,13 +420,6 @@ Partial Class sdgSimpleRegOptions Me.rdoSixPlots2Rows.Text = "Six_Plots(2 rows)" Me.rdoSixPlots2Rows.UseVisualStyleBackColor = True ' - 'ucrPnlMutiplePlots - ' - Me.ucrPnlMutiplePlots.Location = New System.Drawing.Point(4, 12) - Me.ucrPnlMutiplePlots.Name = "ucrPnlMutiplePlots" - Me.ucrPnlMutiplePlots.Size = New System.Drawing.Size(268, 56) - Me.ucrPnlMutiplePlots.TabIndex = 40 - ' 'grpIndividualPlots ' Me.grpIndividualPlots.Location = New System.Drawing.Point(10, 149) @@ -521,29 +429,6 @@ Partial Class sdgSimpleRegOptions Me.grpIndividualPlots.TabStop = False Me.grpIndividualPlots.Tag = "" ' - 'ucrPnlIndividualPlots - ' - Me.ucrPnlIndividualPlots.Location = New System.Drawing.Point(20, 164) - Me.ucrPnlIndividualPlots.Name = "ucrPnlIndividualPlots" - Me.ucrPnlIndividualPlots.Size = New System.Drawing.Size(268, 68) - Me.ucrPnlIndividualPlots.TabIndex = 29 - ' - 'ucrChkIndividualPlots - ' - Me.ucrChkIndividualPlots.Checked = False - Me.ucrChkIndividualPlots.Location = New System.Drawing.Point(6, 123) - Me.ucrChkIndividualPlots.Name = "ucrChkIndividualPlots" - Me.ucrChkIndividualPlots.Size = New System.Drawing.Size(113, 20) - Me.ucrChkIndividualPlots.TabIndex = 23 - ' - 'ucrChkMultiplePlots - ' - Me.ucrChkMultiplePlots.Checked = False - Me.ucrChkMultiplePlots.Location = New System.Drawing.Point(6, 7) - Me.ucrChkMultiplePlots.Name = "ucrChkMultiplePlots" - Me.ucrChkMultiplePlots.Size = New System.Drawing.Size(113, 20) - Me.ucrChkMultiplePlots.TabIndex = 22 - ' 'tbDisplay ' Me.tbDisplay.Controls.Add(Me.ucrNudDisplayCLevel) @@ -562,6 +447,42 @@ Partial Class sdgSimpleRegOptions Me.tbDisplay.Text = "Display" Me.tbDisplay.UseVisualStyleBackColor = True ' + 'lblDisplayCLevel + ' + Me.lblDisplayCLevel.AutoSize = True + Me.lblDisplayCLevel.Location = New System.Drawing.Point(49, 111) + Me.lblDisplayCLevel.Name = "lblDisplayCLevel" + Me.lblDisplayCLevel.Size = New System.Drawing.Size(93, 13) + Me.lblDisplayCLevel.TabIndex = 5 + Me.lblDisplayCLevel.Tag = "Confidence_Level:" + Me.lblDisplayCLevel.Text = "Confidence Level:" + ' + 'tbRegOptions + ' + Me.tbRegOptions.Controls.Add(Me.tbDisplay) + Me.tbRegOptions.Controls.Add(Me.tbGraphics) + Me.tbRegOptions.Controls.Add(Me.tbSave) + Me.tbRegOptions.Location = New System.Drawing.Point(2, 3) + Me.tbRegOptions.Name = "tbRegOptions" + Me.tbRegOptions.SelectedIndex = 0 + Me.tbRegOptions.Size = New System.Drawing.Size(321, 342) + Me.tbRegOptions.TabIndex = 0 + ' + 'tbSave + ' + Me.tbSave.Controls.Add(Me.ucrSaveLeverageColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveStdResidualsColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveResidualsColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveFittedColumnName) + Me.tbSave.Location = New System.Drawing.Point(4, 22) + Me.tbSave.Name = "tbSave" + Me.tbSave.Padding = New System.Windows.Forms.Padding(3) + Me.tbSave.Size = New System.Drawing.Size(313, 316) + Me.tbSave.TabIndex = 2 + Me.tbSave.Tag = "Save" + Me.tbSave.Text = "Save" + Me.tbSave.UseVisualStyleBackColor = True + ' 'ucrNudDisplayCLevel ' Me.ucrNudDisplayCLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) @@ -614,41 +535,120 @@ Partial Class sdgSimpleRegOptions Me.ucrChkModel.Size = New System.Drawing.Size(113, 20) Me.ucrChkModel.TabIndex = 7 ' - 'lblDisplayCLevel + 'ucrNudWhiteSpace ' - Me.lblDisplayCLevel.AutoSize = True - Me.lblDisplayCLevel.Location = New System.Drawing.Point(49, 111) - Me.lblDisplayCLevel.Name = "lblDisplayCLevel" - Me.lblDisplayCLevel.Size = New System.Drawing.Size(93, 13) - Me.lblDisplayCLevel.TabIndex = 5 - Me.lblDisplayCLevel.Tag = "Confidence_Level:" - Me.lblDisplayCLevel.Text = "Confidence Level:" + Me.ucrNudWhiteSpace.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudWhiteSpace.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudWhiteSpace.Location = New System.Drawing.Point(112, 150) + Me.ucrNudWhiteSpace.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudWhiteSpace.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudWhiteSpace.Name = "ucrNudWhiteSpace" + Me.ucrNudWhiteSpace.Size = New System.Drawing.Size(50, 20) + Me.ucrNudWhiteSpace.TabIndex = 29 + Me.ucrNudWhiteSpace.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'tbRegOptions + 'ucrNudGraphicsCLevel ' - Me.tbRegOptions.Controls.Add(Me.tbDisplay) - Me.tbRegOptions.Controls.Add(Me.tbGraphics) - Me.tbRegOptions.Controls.Add(Me.tbSave) - Me.tbRegOptions.Location = New System.Drawing.Point(2, 3) - Me.tbRegOptions.Name = "tbRegOptions" - Me.tbRegOptions.SelectedIndex = 0 - Me.tbRegOptions.Size = New System.Drawing.Size(321, 342) - Me.tbRegOptions.TabIndex = 0 + Me.ucrNudGraphicsCLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Location = New System.Drawing.Point(112, 124) + Me.ucrNudGraphicsCLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Name = "ucrNudGraphicsCLevel" + Me.ucrNudGraphicsCLevel.Size = New System.Drawing.Size(50, 20) + Me.ucrNudGraphicsCLevel.TabIndex = 28 + Me.ucrNudGraphicsCLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' - 'tbSave + 'ucrChkRugs ' - Me.tbSave.Controls.Add(Me.ucrSaveLeverageColumnName) - Me.tbSave.Controls.Add(Me.ucrSaveStdResidualsColumnName) - Me.tbSave.Controls.Add(Me.ucrSaveResidualsColumnName) - Me.tbSave.Controls.Add(Me.ucrSaveFittedColumnName) - Me.tbSave.Location = New System.Drawing.Point(4, 22) - Me.tbSave.Name = "tbSave" - Me.tbSave.Padding = New System.Windows.Forms.Padding(3) - Me.tbSave.Size = New System.Drawing.Size(313, 316) - Me.tbSave.TabIndex = 2 - Me.tbSave.Tag = "Save" - Me.tbSave.Text = "Save" - Me.tbSave.UseVisualStyleBackColor = True + Me.ucrChkRugs.Checked = False + Me.ucrChkRugs.Location = New System.Drawing.Point(115, 179) + Me.ucrChkRugs.Name = "ucrChkRugs" + Me.ucrChkRugs.Size = New System.Drawing.Size(113, 20) + Me.ucrChkRugs.TabIndex = 24 + ' + 'ucrChkJitter + ' + Me.ucrChkJitter.Checked = False + Me.ucrChkJitter.Location = New System.Drawing.Point(10, 204) + Me.ucrChkJitter.Name = "ucrChkJitter" + Me.ucrChkJitter.Size = New System.Drawing.Size(97, 20) + Me.ucrChkJitter.TabIndex = 23 + ' + 'ucrChkPartial + ' + Me.ucrChkPartial.Checked = False + Me.ucrChkPartial.Location = New System.Drawing.Point(10, 178) + Me.ucrChkPartial.Name = "ucrChkPartial" + Me.ucrChkPartial.Size = New System.Drawing.Size(113, 20) + Me.ucrChkPartial.TabIndex = 25 + ' + 'ucrChkConfIntervalband + ' + Me.ucrChkConfIntervalband.Checked = False + Me.ucrChkConfIntervalband.Location = New System.Drawing.Point(115, 202) + Me.ucrChkConfIntervalband.Name = "ucrChkConfIntervalband" + Me.ucrChkConfIntervalband.Size = New System.Drawing.Size(113, 20) + Me.ucrChkConfIntervalband.TabIndex = 22 + ' + 'ucrChkFittedModel + ' + Me.ucrChkFittedModel.Checked = False + Me.ucrChkFittedModel.Location = New System.Drawing.Point(10, 7) + Me.ucrChkFittedModel.Name = "ucrChkFittedModel" + Me.ucrChkFittedModel.Size = New System.Drawing.Size(113, 20) + Me.ucrChkFittedModel.TabIndex = 21 + ' + 'ucrPnlPartial12 + ' + Me.ucrPnlPartial12.Location = New System.Drawing.Point(6, 13) + Me.ucrPnlPartial12.Name = "ucrPnlPartial12" + Me.ucrPnlPartial12.Size = New System.Drawing.Size(176, 27) + Me.ucrPnlPartial12.TabIndex = 35 + ' + 'ucrPnlPlotType + ' + Me.ucrPnlPlotType.Location = New System.Drawing.Point(9, 19) + Me.ucrPnlPlotType.Name = "ucrPnlPlotType" + Me.ucrPnlPlotType.Size = New System.Drawing.Size(77, 43) + Me.ucrPnlPlotType.TabIndex = 31 + ' + 'ucrPnlScale + ' + Me.ucrPnlScale.Location = New System.Drawing.Point(6, 19) + Me.ucrPnlScale.Name = "ucrPnlScale" + Me.ucrPnlScale.Size = New System.Drawing.Size(94, 43) + Me.ucrPnlScale.TabIndex = 28 + ' + 'ucrPnlMutiplePlots + ' + Me.ucrPnlMutiplePlots.Location = New System.Drawing.Point(4, 12) + Me.ucrPnlMutiplePlots.Name = "ucrPnlMutiplePlots" + Me.ucrPnlMutiplePlots.Size = New System.Drawing.Size(268, 56) + Me.ucrPnlMutiplePlots.TabIndex = 40 + ' + 'ucrPnlIndividualPlots + ' + Me.ucrPnlIndividualPlots.Location = New System.Drawing.Point(20, 164) + Me.ucrPnlIndividualPlots.Name = "ucrPnlIndividualPlots" + Me.ucrPnlIndividualPlots.Size = New System.Drawing.Size(268, 68) + Me.ucrPnlIndividualPlots.TabIndex = 29 + ' + 'ucrChkIndividualPlots + ' + Me.ucrChkIndividualPlots.Checked = False + Me.ucrChkIndividualPlots.Location = New System.Drawing.Point(6, 123) + Me.ucrChkIndividualPlots.Name = "ucrChkIndividualPlots" + Me.ucrChkIndividualPlots.Size = New System.Drawing.Size(113, 20) + Me.ucrChkIndividualPlots.TabIndex = 23 + ' + 'ucrChkMultiplePlots + ' + Me.ucrChkMultiplePlots.Checked = False + Me.ucrChkMultiplePlots.Location = New System.Drawing.Point(6, 7) + Me.ucrChkMultiplePlots.Name = "ucrChkMultiplePlots" + Me.ucrChkMultiplePlots.Size = New System.Drawing.Size(113, 20) + Me.ucrChkMultiplePlots.TabIndex = 22 ' 'ucrSaveLeverageColumnName ' diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 35a1533469e..0a68931ba80 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -26,6 +26,14 @@ Public Class sdgSimpleRegOptions Public clsRaovFunction, clsRaovpvalFunction, clsRestpvalFunction, clsRResidualPlotsFunction, clsRgeom_point, clsRPredFunction, clsRDFFunction, clsRFittedValues, clsRWriteFitted, clsRResiduals, clsRWriteResiduals, clsRStdResiduals, clsRWriteStdResiduals, clsRLeverage, clsRWriteLeverage As New RFunction Public clsRggplotFunction, clsRaesFunction, clsRStat_smooth, clsRModelsFunction, clsRCIFunction, clsR_ribbon, clsRaes_ribbon As New RFunction + Private Sub rdoLinear_CheckedChanged(sender As Object, e As EventArgs) Handles rdoLinear.CheckedChanged + + End Sub + + Private Sub rdoResponse_CheckedChanged(sender As Object, e As EventArgs) Handles rdoResponse.CheckedChanged + + End Sub + Public bControlsInitialised As Boolean = False Private Sub sdgSimpleRegOptions_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -218,7 +226,7 @@ Public Class sdgSimpleRegOptions clsRggplotFunction = clsNewRggplotFunction 'clsRWriteResiduals = clsNewRWriteResiduals ' clsRWriteStdResiduals = clsNewRWriteStdResiduals - clsRWriteLeverage = clsNewRWriteLeverage + 'clsRWriteLeverage = clsNewRWriteLeverage ucrChkModel.SetRCode(clsRModelsFunction, bReset) @@ -421,16 +429,16 @@ Public Class sdgSimpleRegOptions clsRFittedValues.SetRCommand("fitted") clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) - 'clsRSyntax.AddToAfterCodes(clsRWriteFitted, iPosition:=8) + clsRSyntax.AddToAfterCodes(clsRWriteFitted, iPosition:=8) End Sub Private Sub ucrSaveResidualsColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveResidualsColumnName.ControlValueChanged - 'clsRResiduals.SetPackageName("stats") - 'clsRResiduals.SetRCommand("resid") - 'clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - 'clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) - ' clsRSyntax.AddToAfterCodes(clsRWriteResiduals, iPosition:=9) - ' clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) + clsRResiduals.SetPackageName("stats") + clsRResiduals.SetRCommand("resid") + clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) + clsRSyntax.AddToAfterCodes(clsRWriteResiduals, iPosition:=9) + ' clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) End Sub @@ -440,7 +448,7 @@ Public Class sdgSimpleRegOptions clsRStdResiduals.SetRCommand("rstandard") clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) - 'clsRSyntax.AddToAfterCodes(clsRWriteStdResiduals, iPosition:=10) + clsRSyntax.AddToAfterCodes(clsRWriteStdResiduals, iPosition:=10) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) @@ -451,7 +459,7 @@ Public Class sdgSimpleRegOptions clsRLeverage.SetRCommand("hatvalues") clsRLeverage.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) - ' clsRSyntax.AddToAfterCodes(clsRWriteLeverage, iPosition:=11) + clsRSyntax.AddToAfterCodes(clsRWriteLeverage, iPosition:=11) 'clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) 'clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) 'clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) From 27657d728e5ca9fff4a4168ae6836c7c6677befe Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 27 Jun 2017 10:17:39 +0300 Subject: [PATCH 189/201] minor edits --- instat/dlgRegressionSimple.vb | 4 -- instat/sdgSimpleRegOptions.vb | 74 +---------------------------------- 2 files changed, 1 insertion(+), 77 deletions(-) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 4a446f07b45..2b65094c104 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -135,8 +135,6 @@ Public Class dlgRegressionSimple ucrPnlMeansAndVariance.AddToLinkedControls(ucrNudHypothesis, {rdoCompareVariance}, bNewLinkedDisabledIfParameterMissing:=True) - - ' sdgSimpleRegOptions.SetRModelFunction(clsRLmOrGLM) sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) 'sdgSimpleRegOptions.SetRYVariable(ucrResponse) @@ -187,8 +185,6 @@ Public Class dlgRegressionSimple ucrSelectorSimpleReg.Focus() ucrModelPreview.Reset() - - DataTypeAccepted() clsRGraphicsOperator = clsRegressionDefaults.clsDefaultRGraphicsOperator.Clone diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index 0a68931ba80..a3cd393cd8b 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -25,15 +25,6 @@ Public Class sdgSimpleRegOptions Private clsRSyntax As RSyntax Public clsRaovFunction, clsRaovpvalFunction, clsRestpvalFunction, clsRResidualPlotsFunction, clsRgeom_point, clsRPredFunction, clsRDFFunction, clsRFittedValues, clsRWriteFitted, clsRResiduals, clsRWriteResiduals, clsRStdResiduals, clsRWriteStdResiduals, clsRLeverage, clsRWriteLeverage As New RFunction Public clsRggplotFunction, clsRaesFunction, clsRStat_smooth, clsRModelsFunction, clsRCIFunction, clsR_ribbon, clsRaes_ribbon As New RFunction - - Private Sub rdoLinear_CheckedChanged(sender As Object, e As EventArgs) Handles rdoLinear.CheckedChanged - - End Sub - - Private Sub rdoResponse_CheckedChanged(sender As Object, e As EventArgs) Handles rdoResponse.CheckedChanged - - End Sub - Public bControlsInitialised As Boolean = False Private Sub sdgSimpleRegOptions_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -68,12 +59,6 @@ Public Class sdgSimpleRegOptions ucrChkDisplayCLimits.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) - - - - ucrChkFittedModel.SetText("Fitted Model") - - 'Multiple Plots (Autoplot function) ucrPnlMutiplePlots.AddRadioButton(rdoFourPlots) ucrPnlMutiplePlots.AddRadioButton(rdoSixPlots2Rows) @@ -111,6 +96,7 @@ Public Class sdgSimpleRegOptions 'ucrPnlIndividualPlots.SetLinkedDisplayControl(grpIndividualPlots) 'Fitting Models Plots (Visreg) + ucrChkFittedModel.SetText("Fitted Model") ucrChkFittedModel.AddFunctionNamesCondition(False, "visreg", False) ucrChkFittedModel.AddFunctionNamesCondition(True, "visreg") ''type @@ -146,9 +132,6 @@ Public Class sdgSimpleRegOptions ucrChkFittedModel.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkFittedModel.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - - - ucrChkJitter.SetText("Jitter") ucrChkJitter.SetParameter(New RParameter("jitter"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") ucrChkJitter.SetRDefault("FALSE") @@ -315,43 +298,6 @@ Public Class sdgSimpleRegOptions clsRDataFrame = clsRDataFr End Sub - Private Sub ConfidenceInterval() - clsRCIFunction.SetRCommand("confint") - clsRCIFunction.AddParameter("object", clsRFunctionParameter:=clsRModelFunction) - DisplayConfidence() - frmMain.clsRLink.RunScript(clsRCIFunction.ToScript(), 2) - End Sub - - - Private Sub chkMultiplePlots_CheckedChanged(sender As Object, e As EventArgs) - 'GraphMultiplePlots() - End Sub - - Private Sub GraphMultiplePlots() - 'If ucrChkMultiplePlots.Checked Then - ' ucrChkFittedModel.Checked = False - ' ucrChkIndividualPlots.Checked = False - ' grpMultiplePlots.Enabled = True - ' rdoFourPlots.Checked = True - 'Else - ' grpMultiplePlots.Enabled = False - 'End If - End Sub - - Private Sub GraphIndividualPlots() - 'If ucrChkIndividualPlots.Checked Then - ' ucrChkFittedModel.Checked = False - ' ucrChkMultiplePlots.Checked = False - ' grpIndividualPlots.Enabled = True - ' rdoResidualsFitted.Checked = True - 'Else - ' grpIndividualPlots.Enabled = False - 'End If - End Sub - - Private Sub chkIndividualPlots_CheckedChanged(sender As Object, e As EventArgs) - GraphIndividualPlots() - End Sub Private Sub ucrPnlMutiplePlots_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlMutiplePlots.ControlValueChanged, ucrPnlIndividualPlots.ControlValueChanged 'Multiple Plots If ucrChkMultiplePlots.Checked Then @@ -406,24 +352,6 @@ Public Class sdgSimpleRegOptions End If End Sub - Private Sub DisplayConfidence() - If (ucrChkDisplayCLimits.Checked = True) Then - clsRCIFunction.AddParameter("level", ucrNudDisplayCLevel.Value) - ElseIf (ucrChkDisplayCLimits.Checked = False) Then - clsRCIFunction.AddParameter("level", "") - Else - clsRCIFunction.RemoveParameterByName("level") - End If - End Sub - - Public Sub RegOptions() - If (ucrChkDisplayCLimits.Checked) Then - ConfidenceInterval() - End If - End Sub - - ' disabled until working - Private Sub ucrSaveFittedColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveFittedColumnName.ControlValueChanged clsRFittedValues.SetPackageName("stats") clsRFittedValues.SetRCommand("fitted") From db2a453a9ba0e5c5ec246114d3ef79d44db3fb4a Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 27 Jun 2017 11:05:13 +0300 Subject: [PATCH 190/201] tidy up of simpleRegOptions --- instat/clsRegressionDefaults.vb | 10 ++++++++++ instat/dlgFitCorruptionModel.vb | 2 +- instat/dlgFitModel.vb | 2 +- instat/dlgFourVariableModelling.vb | 2 +- instat/dlgRegressionSimple.vb | 19 ++++++++----------- instat/dlgThreeVariablesModelling.vb | 2 +- instat/dlgTwoVariableUseModel.vb | 2 +- 7 files changed, 23 insertions(+), 16 deletions(-) diff --git a/instat/clsRegressionDefaults.vb b/instat/clsRegressionDefaults.vb index b55054f47ae..5bb7dbb4c9f 100644 --- a/instat/clsRegressionDefaults.vb +++ b/instat/clsRegressionDefaults.vb @@ -9,6 +9,16 @@ End Get End Property + Public Shared ReadOnly Property clsDefaultGlmFunction As RFunction + Get + + Dim clsDefaultGlmFunc As New RFunction + + clsDefaultGlmFunc.SetRCommand("glm") + Return clsDefaultGlmFunc + End Get + End Property + Public Shared ReadOnly Property clsDefaultRGraphicsOperator As ROperator Get diff --git a/instat/dlgFitCorruptionModel.vb b/instat/dlgFitCorruptionModel.vb index 461d00ccde6..842220fcaae 100644 --- a/instat/dlgFitCorruptionModel.vb +++ b/instat/dlgFitCorruptionModel.vb @@ -189,6 +189,6 @@ Public Class dlgFitCorruptionModel End Sub Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk - sdgSimpleRegOptions.RegOptions() + 'sdgSimpleRegOptions.RegOptions() End Sub End Class \ No newline at end of file diff --git a/instat/dlgFitModel.vb b/instat/dlgFitModel.vb index 27350e66329..ef7a3e603f4 100644 --- a/instat/dlgFitModel.vb +++ b/instat/dlgFitModel.vb @@ -279,6 +279,6 @@ Public Class dlgFitModel ChooseRFunction() End Sub Private Sub ucrBase_ClickOk(sender As Object, e As EventArgs) Handles ucrBase.ClickOk - sdgSimpleRegOptions.RegOptions() + 'sdgSimpleRegOptions.RegOptions() End Sub End Class \ No newline at end of file diff --git a/instat/dlgFourVariableModelling.vb b/instat/dlgFourVariableModelling.vb index e70bbbfb86c..f798b34aed2 100644 --- a/instat/dlgFourVariableModelling.vb +++ b/instat/dlgFourVariableModelling.vb @@ -194,7 +194,7 @@ Public Class dlgFourVariableModelling End Sub Private Sub ucrBaseFourVariableModelling_ClickOk(sender As Object, e As EventArgs) Handles ucrBaseFourVariableModelling.ClickOk - sdgSimpleRegOptions.RegOptions() + 'sdgSimpleRegOptions.RegOptions() End Sub Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 2b65094c104..3478c06e364 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -135,10 +135,7 @@ Public Class dlgRegressionSimple ucrPnlMeansAndVariance.AddToLinkedControls(ucrNudHypothesis, {rdoCompareVariance}, bNewLinkedDisabledIfParameterMissing:=True) - ' sdgSimpleRegOptions.SetRModelFunction(clsRLmOrGLM) sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) - 'sdgSimpleRegOptions.SetRYVariable(ucrResponse) - ' sdgSimpleRegOptions.SetRXVariable(ucrExplanatory) sdgModelOptions.SetRCIFunction(clsRCIFunction) @@ -184,6 +181,7 @@ Public Class dlgRegressionSimple ucrResponse.SetMeAsReceiver() ucrSelectorSimpleReg.Focus() ucrModelPreview.Reset() + ucrModelPreview.SetName("") DataTypeAccepted() @@ -193,7 +191,7 @@ Public Class dlgRegressionSimple clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmFunction.Clone clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) - clsGLM.SetRCommand("glm") + clsGLM = clsRegressionDefaults.clsDefaultGlmFunction.Clone clsGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) @@ -297,9 +295,8 @@ Public Class dlgRegressionSimple clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempModel:="last_model", bAssignToIsPrefix:=True) - 'sdgSimpleRegOptions.SetDefaults() + sdgModelOptions.SetDefaults() - ucrModelPreview.SetName("") SetRCode() ucrFamily.SetGLMDistributions() @@ -610,13 +607,13 @@ Public Class dlgRegressionSimple If ucrChkConvertToVariate.Checked Then clsRConvert.AddParameter("x", ucrResponse.GetVariableNames(bWithQuotes:=False)) - clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=clsRConvert) - clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsRLmOrGLM.AddParameter("x", clsRFunctionParameter:=clsRConvert) + clsRLmOrGLM.AddParameter("x", clsRFunctionParameter:=ucrExplanatory.GetVariables()) ucrFamily.RecieverDatatype("numeric") Else - clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) - clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) - clsModel.AddParameter(iPosition:=0, strParameterValue:=ucrResponse.GetVariableNames(bWithQuotes:=False)) + 'clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) + ' clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) + 'clsModel.AddParameter(iPosition:=0, strParameterValue:=ucrResponse.GetVariableNames(bWithQuotes:=False)) ucrFamily.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrResponse.GetVariableNames(bWithQuotes:=False)) End If Else diff --git a/instat/dlgThreeVariablesModelling.vb b/instat/dlgThreeVariablesModelling.vb index 8cb939ad9c0..c522aa7bfa2 100644 --- a/instat/dlgThreeVariablesModelling.vb +++ b/instat/dlgThreeVariablesModelling.vb @@ -214,7 +214,7 @@ Public Class dlgThreeVariableModelling End Sub Private Sub ucrBaseThreeVariableModelling_ClickOk(sender As Object, e As EventArgs) Handles ucrBaseThreeVariableModelling.ClickOk - sdgSimpleRegOptions.RegOptions() + ' sdgSimpleRegOptions.RegOptions() End Sub Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click diff --git a/instat/dlgTwoVariableUseModel.vb b/instat/dlgTwoVariableUseModel.vb index 2ddeef91e7f..cde1e93f904 100644 --- a/instat/dlgTwoVariableUseModel.vb +++ b/instat/dlgTwoVariableUseModel.vb @@ -67,7 +67,7 @@ Public Class dlgTwoVariableUseModel End Sub Private Sub ucrBaseUseModel_ClickOk(sender As Object, e As EventArgs) Handles ucrBaseUseModel.ClickOk - sdgSimpleRegOptions.RegOptions() + 'sdgSimpleRegOptions.RegOptions() End Sub Private Sub TestOkEnabled() From 38bde19c15eea1beb646843f8cb7a8960c913043 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Tue, 27 Jun 2017 12:32:39 +0300 Subject: [PATCH 191/201] Changing radiobuttons --- instat/dlgFromLibrary.Designer.vb | 86 ++++++++++++++++++------------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/instat/dlgFromLibrary.Designer.vb b/instat/dlgFromLibrary.Designer.vb index d0c5fe1e56e..ea7f959ab6c 100644 --- a/instat/dlgFromLibrary.Designer.vb +++ b/instat/dlgFromLibrary.Designer.vb @@ -26,10 +26,10 @@ Partial Class dlgFromLibrary Me.lstCollection = New System.Windows.Forms.ListView() Me.clmDatasets = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) Me.clmDesc = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) - Me.rdoDefaultDatasets = New System.Windows.Forms.RadioButton() - Me.rdoInstatCollection = New System.Windows.Forms.RadioButton() Me.lblFromPackage = New System.Windows.Forms.Label() Me.cmdHelp = New System.Windows.Forms.Button() + Me.rdoDefaultDatasets = New System.Windows.Forms.RadioButton() + Me.rdoInstatCollection = New System.Windows.Forms.RadioButton() Me.ucrInputPackages = New instat.ucrInputComboBox() Me.ucrBase = New instat.ucrButtons() Me.ucrPnlOptions = New instat.UcrPanel() @@ -37,7 +37,7 @@ Partial Class dlgFromLibrary ' 'cmdLibraryCollection ' - Me.cmdLibraryCollection.Location = New System.Drawing.Point(129, 33) + Me.cmdLibraryCollection.Location = New System.Drawing.Point(129, 52) Me.cmdLibraryCollection.Name = "cmdLibraryCollection" Me.cmdLibraryCollection.Size = New System.Drawing.Size(117, 23) Me.cmdLibraryCollection.TabIndex = 2 @@ -48,7 +48,7 @@ Partial Class dlgFromLibrary ' Me.lstCollection.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.clmDatasets, Me.clmDesc}) Me.lstCollection.FullRowSelect = True - Me.lstCollection.Location = New System.Drawing.Point(10, 60) + Me.lstCollection.Location = New System.Drawing.Point(10, 79) Me.lstCollection.MultiSelect = False Me.lstCollection.Name = "lstCollection" Me.lstCollection.ShowGroups = False @@ -69,32 +69,10 @@ Partial Class dlgFromLibrary Me.clmDesc.Text = "Description" Me.clmDesc.Width = 266 ' - 'rdoDefaultDatasets - ' - Me.rdoDefaultDatasets.AutoSize = True - Me.rdoDefaultDatasets.Location = New System.Drawing.Point(10, 9) - Me.rdoDefaultDatasets.Name = "rdoDefaultDatasets" - Me.rdoDefaultDatasets.Size = New System.Drawing.Size(83, 17) - Me.rdoDefaultDatasets.TabIndex = 12 - Me.rdoDefaultDatasets.TabStop = True - Me.rdoDefaultDatasets.Text = "Load from R" - Me.rdoDefaultDatasets.UseVisualStyleBackColor = True - ' - 'rdoInstatCollection - ' - Me.rdoInstatCollection.AutoSize = True - Me.rdoInstatCollection.Location = New System.Drawing.Point(129, 10) - Me.rdoInstatCollection.Name = "rdoInstatCollection" - Me.rdoInstatCollection.Size = New System.Drawing.Size(149, 17) - Me.rdoInstatCollection.TabIndex = 6 - Me.rdoInstatCollection.TabStop = True - Me.rdoInstatCollection.Text = "Load from Instat collection" - Me.rdoInstatCollection.UseVisualStyleBackColor = True - ' 'lblFromPackage ' Me.lblFromPackage.AutoSize = True - Me.lblFromPackage.Location = New System.Drawing.Point(7, 33) + Me.lblFromPackage.Location = New System.Drawing.Point(7, 52) Me.lblFromPackage.Name = "lblFromPackage" Me.lblFromPackage.Size = New System.Drawing.Size(79, 13) Me.lblFromPackage.TabIndex = 15 @@ -102,18 +80,54 @@ Partial Class dlgFromLibrary ' 'cmdHelp ' - Me.cmdHelp.Location = New System.Drawing.Point(332, 239) + Me.cmdHelp.Location = New System.Drawing.Point(332, 258) Me.cmdHelp.Name = "cmdHelp" Me.cmdHelp.Size = New System.Drawing.Size(75, 23) Me.cmdHelp.TabIndex = 17 Me.cmdHelp.Text = "Help" Me.cmdHelp.UseVisualStyleBackColor = True ' + 'rdoDefaultDatasets + ' + Me.rdoDefaultDatasets.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoDefaultDatasets.BackColor = System.Drawing.SystemColors.Control + Me.rdoDefaultDatasets.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoDefaultDatasets.FlatAppearance.BorderSize = 2 + Me.rdoDefaultDatasets.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoDefaultDatasets.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoDefaultDatasets.Location = New System.Drawing.Point(7, 12) + Me.rdoDefaultDatasets.Name = "rdoDefaultDatasets" + Me.rdoDefaultDatasets.Size = New System.Drawing.Size(124, 28) + Me.rdoDefaultDatasets.TabIndex = 20 + Me.rdoDefaultDatasets.TabStop = True + Me.rdoDefaultDatasets.Tag = "" + Me.rdoDefaultDatasets.Text = "Load from R" + Me.rdoDefaultDatasets.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoDefaultDatasets.UseVisualStyleBackColor = False + ' + 'rdoInstatCollection + ' + Me.rdoInstatCollection.Appearance = System.Windows.Forms.Appearance.Button + Me.rdoInstatCollection.BackColor = System.Drawing.SystemColors.Control + Me.rdoInstatCollection.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoInstatCollection.FlatAppearance.BorderSize = 2 + Me.rdoInstatCollection.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoInstatCollection.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoInstatCollection.Location = New System.Drawing.Point(129, 12) + Me.rdoInstatCollection.Name = "rdoInstatCollection" + Me.rdoInstatCollection.Size = New System.Drawing.Size(157, 28) + Me.rdoInstatCollection.TabIndex = 21 + Me.rdoInstatCollection.TabStop = True + Me.rdoInstatCollection.Tag = "" + Me.rdoInstatCollection.Text = "Load from Instat collection" + Me.rdoInstatCollection.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.rdoInstatCollection.UseVisualStyleBackColor = False + ' 'ucrInputPackages ' Me.ucrInputPackages.AddQuotesIfUnrecognised = True Me.ucrInputPackages.IsReadOnly = False - Me.ucrInputPackages.Location = New System.Drawing.Point(92, 33) + Me.ucrInputPackages.Location = New System.Drawing.Point(92, 52) Me.ucrInputPackages.Name = "ucrInputPackages" Me.ucrInputPackages.Size = New System.Drawing.Size(137, 21) Me.ucrInputPackages.TabIndex = 18 @@ -122,7 +136,7 @@ Partial Class dlgFromLibrary ' Me.ucrBase.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _ Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.ucrBase.Location = New System.Drawing.Point(7, 266) + Me.ucrBase.Location = New System.Drawing.Point(7, 292) Me.ucrBase.Name = "ucrBase" Me.ucrBase.Size = New System.Drawing.Size(400, 53) Me.ucrBase.TabIndex = 0 @@ -131,20 +145,20 @@ Partial Class dlgFromLibrary ' Me.ucrPnlOptions.Location = New System.Drawing.Point(5, 2) Me.ucrPnlOptions.Name = "ucrPnlOptions" - Me.ucrPnlOptions.Size = New System.Drawing.Size(278, 28) + Me.ucrPnlOptions.Size = New System.Drawing.Size(297, 44) Me.ucrPnlOptions.TabIndex = 19 ' 'dlgFromLibrary ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(431, 325) + Me.ClientSize = New System.Drawing.Size(431, 351) + Me.Controls.Add(Me.rdoDefaultDatasets) + Me.Controls.Add(Me.rdoInstatCollection) Me.Controls.Add(Me.cmdLibraryCollection) Me.Controls.Add(Me.ucrInputPackages) Me.Controls.Add(Me.cmdHelp) Me.Controls.Add(Me.lblFromPackage) - Me.Controls.Add(Me.rdoDefaultDatasets) - Me.Controls.Add(Me.rdoInstatCollection) Me.Controls.Add(Me.lstCollection) Me.Controls.Add(Me.ucrBase) Me.Controls.Add(Me.ucrPnlOptions) @@ -164,10 +178,10 @@ Partial Class dlgFromLibrary Friend WithEvents lstCollection As ListView Friend WithEvents clmDatasets As ColumnHeader Friend WithEvents clmDesc As ColumnHeader - Friend WithEvents rdoDefaultDatasets As RadioButton - Friend WithEvents rdoInstatCollection As RadioButton Friend WithEvents lblFromPackage As Label Friend WithEvents cmdHelp As Button Friend WithEvents ucrInputPackages As ucrInputComboBox Friend WithEvents ucrPnlOptions As UcrPanel + Friend WithEvents rdoDefaultDatasets As RadioButton + Friend WithEvents rdoInstatCollection As RadioButton End Class \ No newline at end of file From 9b43183bc46631d88f0b5bc8d948687df2a3262c Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Tue, 27 Jun 2017 12:47:46 +0100 Subject: [PATCH 192/201] update to regression simple dialog --- instat/clsROperator.vb | 58 +- instat/clsRegressionDefaults.vb | 1 - instat/dlgRegressionSimple.Designer.vb | 229 +++++-- instat/dlgRegressionSimple.resx | 867 ------------------------- instat/dlgRegressionSimple.vb | 388 +++++------ instat/ucrDistributions.vb | 10 +- 6 files changed, 399 insertions(+), 1154 deletions(-) diff --git a/instat/clsROperator.vb b/instat/clsROperator.vb index 1ca03ccc3d0..a9c5d6d03fa 100644 --- a/instat/clsROperator.vb +++ b/instat/clsROperator.vb @@ -33,38 +33,40 @@ Public Class ROperator Public Overrides Function ToScript(Optional ByRef strScript As String = "", Optional strTemp As String = "") As String 'Parameters are sorted in the appropriate order and then the script is built. SortParameters() - If clsParameters(0) IsNot Nothing Then - If clsParameters(0).bIsOperator AndAlso bBrackets Then - strTemp = strTemp & "(" & clsParameters(0).ToScript(strScript) & ")" + If clsParameters.Count > 0 Then + If clsParameters(0) IsNot Nothing Then + If clsParameters(0).bIsOperator AndAlso bBrackets Then + strTemp = strTemp & "(" & clsParameters(0).ToScript(strScript) & ")" + Else + strTemp = strTemp & clsParameters(0).ToScript(strScript) + End If + 'If there's only one parameter and bForceIncludeOperation then we include the operator + 'The position of the operator depends on the parameter position + If bForceIncludeOperation AndAlso clsParameters.Count = 1 Then + If clsParameters(0).Position = 0 Then + strTemp = strTemp & Chr(32) & strOperation & Chr(32) + Else + strTemp = Chr(32) & strOperation & Chr(32) & strTemp + End If + End If Else - strTemp = strTemp & clsParameters(0).ToScript(strScript) + 'message End If - 'If there's only one parameter and bForceIncludeOperation then we include the operator - 'The position of the operator depends on the parameter position - If bForceIncludeOperation AndAlso clsParameters.Count = 1 Then - If clsParameters(0).Position = 0 Then - strTemp = strTemp & Chr(32) & strOperation & Chr(32) - Else - strTemp = Chr(32) & strOperation & Chr(32) & strTemp + For Each clsParam In clsParameters.GetRange(1, clsParameters.Count - 1) + 'If bIncludeOperation Then + strTemp = strTemp & Chr(32) & strOperation & Chr(32) + strTemp = strTemp & clsParam.ToScript(strScript) + Next + If bToScriptAsRString Then + 'TODO 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 - End If - Else - 'message - End If - For Each clsParam In clsParameters.GetRange(1, clsParameters.Count - 1) - 'If bIncludeOperation Then - strTemp = strTemp & Chr(32) & strOperation & Chr(32) - strTemp = strTemp & clsParam.ToScript(strScript) - Next - If bToScriptAsRString Then - 'TODO 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.") + 'Cannot have double quotes ("") in the string because strTemp will be wrapped with "" + 'In most cases signle quotes (') will give same functionality, though it's preferable to avoid this when constructing the RFunction + strTemp = strTemp.Replace(Chr(34), Chr(39)) + strTemp = Chr(34) & strTemp & Chr(34) End If - 'Cannot have double quotes ("") in the string because strTemp will be wrapped with "" - 'In most cases signle quotes (') will give same functionality, though it's preferable to avoid this when constructing the RFunction - strTemp = strTemp.Replace(Chr(34), Chr(39)) - strTemp = Chr(34) & strTemp & Chr(34) End If Return MyBase.ToScript(strScript, strTemp) End Function diff --git a/instat/clsRegressionDefaults.vb b/instat/clsRegressionDefaults.vb index 5bb7dbb4c9f..7cfe55269bc 100644 --- a/instat/clsRegressionDefaults.vb +++ b/instat/clsRegressionDefaults.vb @@ -31,7 +31,6 @@ Public Shared ReadOnly Property clsDefaultFormulaOperator As ROperator Get - Dim clsFormulaOperator As New ROperator clsFormulaOperator.SetOperation("~") diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 59c7f624594..7607ce2c0c1 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -22,7 +22,6 @@ Partial Class dlgRegressionSimple 'Do not modify it using the code editor. Private Sub InitializeComponent() - Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(dlgRegressionSimple)) Me.lblResidualMsg = New System.Windows.Forms.Label() Me.lblDF = New System.Windows.Forms.Label() Me.txtResidualMsg = New System.Windows.Forms.TextBox() @@ -38,15 +37,16 @@ Partial Class dlgRegressionSimple Me.lblResponse = New System.Windows.Forms.Label() Me.ucrSaveModels = New instat.ucrSave() Me.ucrChkConvertToVariate = New instat.ucrCheck() - Me.ucrExplanatory = New instat.ucrReceiverSingle() - Me.ucrResponse = New instat.ucrReceiverSingle() + Me.ucrReceiverExplanatory = New instat.ucrReceiverSingle() + Me.ucrReceiverResponse = New instat.ucrReceiverSingle() Me.ucrSelectorSimpleReg = New instat.ucrSelectorByDataFrameAddRemove() Me.ucrChkFunction = New instat.ucrCheck() Me.ucrPnlModelType = New instat.UcrPanel() Me.ucrModelPreview = New instat.ucrInputTextBox() - Me.ucrFamily = New instat.ucrDistributions() + Me.ucrDistributionChoice = New instat.ucrDistributions() Me.ucrBase = New instat.ucrButtons() Me.grpParameters = New System.Windows.Forms.GroupBox() + Me.lblDifferenceInMeans = New System.Windows.Forms.Label() Me.ucrNudHypothesis = New instat.ucrNud() Me.ucrNudCI = New instat.ucrNud() Me.lblConfidenceInterval = New System.Windows.Forms.Label() @@ -54,155 +54,226 @@ Partial Class dlgRegressionSimple Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() Me.ucrPnlMeansAndVariance = New instat.UcrPanel() - Me.lblDifferenceInMeans = New System.Windows.Forms.Label() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' 'lblResidualMsg ' - resources.ApplyResources(Me.lblResidualMsg, "lblResidualMsg") + Me.lblResidualMsg.AutoSize = True + Me.lblResidualMsg.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblResidualMsg.Location = New System.Drawing.Point(7, 11) Me.lblResidualMsg.Name = "lblResidualMsg" + Me.lblResidualMsg.Size = New System.Drawing.Size(94, 13) + Me.lblResidualMsg.TabIndex = 0 Me.lblResidualMsg.Tag = "Residual_Msg" ' 'lblDF ' - resources.ApplyResources(Me.lblDF, "lblDF") + Me.lblDF.AutoSize = True + Me.lblDF.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblDF.Location = New System.Drawing.Point(7, 43) Me.lblDF.Name = "lblDF" + Me.lblDF.Size = New System.Drawing.Size(100, 13) + Me.lblDF.TabIndex = 1 Me.lblDF.Tag = "Degrees_of_freedom" ' 'txtResidualMsg ' - resources.ApplyResources(Me.txtResidualMsg, "txtResidualMsg") + Me.txtResidualMsg.Location = New System.Drawing.Point(118, 11) Me.txtResidualMsg.Name = "txtResidualMsg" + Me.txtResidualMsg.Size = New System.Drawing.Size(149, 20) + Me.txtResidualMsg.TabIndex = 2 ' 'txtdf ' - resources.ApplyResources(Me.txtdf, "txtdf") + Me.txtdf.Location = New System.Drawing.Point(118, 43) Me.txtdf.Name = "txtdf" + Me.txtdf.Size = New System.Drawing.Size(58, 20) + Me.txtdf.TabIndex = 12 ' 'cmdDisplayOptions ' - resources.ApplyResources(Me.cmdDisplayOptions, "cmdDisplayOptions") + Me.cmdDisplayOptions.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdDisplayOptions.Location = New System.Drawing.Point(325, 286) Me.cmdDisplayOptions.Name = "cmdDisplayOptions" + Me.cmdDisplayOptions.Size = New System.Drawing.Size(110, 23) + Me.cmdDisplayOptions.TabIndex = 16 Me.cmdDisplayOptions.Tag = "Display_Options..." + Me.cmdDisplayOptions.Text = "Display Options..." Me.cmdDisplayOptions.UseVisualStyleBackColor = True ' 'cmdModelOptions ' - resources.ApplyResources(Me.cmdModelOptions, "cmdModelOptions") + Me.cmdModelOptions.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.cmdModelOptions.Location = New System.Drawing.Point(325, 259) Me.cmdModelOptions.Name = "cmdModelOptions" + Me.cmdModelOptions.Size = New System.Drawing.Size(110, 23) + Me.cmdModelOptions.TabIndex = 15 Me.cmdModelOptions.Tag = "Model_Options..." + Me.cmdModelOptions.Text = "Model Options..." Me.cmdModelOptions.UseVisualStyleBackColor = True ' 'lblModelPreview ' - resources.ApplyResources(Me.lblModelPreview, "lblModelPreview") + Me.lblModelPreview.AutoSize = True + Me.lblModelPreview.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblModelPreview.Location = New System.Drawing.Point(10, 262) Me.lblModelPreview.Name = "lblModelPreview" + Me.lblModelPreview.Size = New System.Drawing.Size(80, 13) + Me.lblModelPreview.TabIndex = 11 + Me.lblModelPreview.Text = "Model Preview:" ' 'rdoTwoSample ' - resources.ApplyResources(Me.rdoTwoSample, "rdoTwoSample") + Me.rdoTwoSample.Appearance = System.Windows.Forms.Appearance.Button Me.rdoTwoSample.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption Me.rdoTwoSample.FlatAppearance.BorderSize = 2 Me.rdoTwoSample.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoTwoSample.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoTwoSample.Location = New System.Drawing.Point(249, 11) Me.rdoTwoSample.Name = "rdoTwoSample" + Me.rdoTwoSample.Size = New System.Drawing.Size(100, 28) + Me.rdoTwoSample.TabIndex = 21 + Me.rdoTwoSample.Text = "Two Sample" + Me.rdoTwoSample.TextAlign = System.Drawing.ContentAlignment.MiddleCenter Me.rdoTwoSample.UseVisualStyleBackColor = True ' 'rdoGeneralCase ' - resources.ApplyResources(Me.rdoGeneralCase, "rdoGeneralCase") + Me.rdoGeneralCase.Appearance = System.Windows.Forms.Appearance.Button Me.rdoGeneralCase.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveCaption Me.rdoGeneralCase.FlatAppearance.BorderSize = 2 Me.rdoGeneralCase.FlatAppearance.CheckedBackColor = System.Drawing.SystemColors.ActiveCaption + Me.rdoGeneralCase.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.rdoGeneralCase.Location = New System.Drawing.Point(151, 11) Me.rdoGeneralCase.Name = "rdoGeneralCase" + Me.rdoGeneralCase.Size = New System.Drawing.Size(100, 28) + Me.rdoGeneralCase.TabIndex = 20 + Me.rdoGeneralCase.Text = "General Case" + Me.rdoGeneralCase.TextAlign = System.Drawing.ContentAlignment.MiddleCenter Me.rdoGeneralCase.UseVisualStyleBackColor = True ' 'lblFactor ' - resources.ApplyResources(Me.lblFactor, "lblFactor") + Me.lblFactor.AutoSize = True + Me.lblFactor.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblFactor.Location = New System.Drawing.Point(264, 117) Me.lblFactor.Name = "lblFactor" + Me.lblFactor.Size = New System.Drawing.Size(106, 13) + Me.lblFactor.TabIndex = 6 + Me.lblFactor.Text = "Explanatory Variable:" ' 'lblNumeric ' - resources.ApplyResources(Me.lblNumeric, "lblNumeric") + Me.lblNumeric.AutoSize = True + Me.lblNumeric.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.lblNumeric.Location = New System.Drawing.Point(264, 55) Me.lblNumeric.Name = "lblNumeric" + Me.lblNumeric.Size = New System.Drawing.Size(99, 13) + Me.lblNumeric.TabIndex = 3 + Me.lblNumeric.Text = "Response Variable:" ' 'lblExplanatory ' - resources.ApplyResources(Me.lblExplanatory, "lblExplanatory") + Me.lblExplanatory.Location = New System.Drawing.Point(0, 0) Me.lblExplanatory.Name = "lblExplanatory" - Me.lblExplanatory.Tag = "Explanatory_Variable" + Me.lblExplanatory.Size = New System.Drawing.Size(100, 23) + Me.lblExplanatory.TabIndex = 23 ' 'lblResponse ' - resources.ApplyResources(Me.lblResponse, "lblResponse") + Me.lblResponse.Location = New System.Drawing.Point(0, 0) Me.lblResponse.Name = "lblResponse" - Me.lblResponse.Tag = "Response_Variable" + Me.lblResponse.Size = New System.Drawing.Size(100, 23) + Me.lblResponse.TabIndex = 24 ' 'ucrSaveModels ' - resources.ApplyResources(Me.ucrSaveModels, "ucrSaveModels") + Me.ucrSaveModels.Location = New System.Drawing.Point(9, 285) Me.ucrSaveModels.Name = "ucrSaveModels" + Me.ucrSaveModels.Size = New System.Drawing.Size(291, 24) + Me.ucrSaveModels.TabIndex = 1 ' 'ucrChkConvertToVariate ' Me.ucrChkConvertToVariate.Checked = False - resources.ApplyResources(Me.ucrChkConvertToVariate, "ucrChkConvertToVariate") + Me.ucrChkConvertToVariate.Location = New System.Drawing.Point(267, 92) Me.ucrChkConvertToVariate.Name = "ucrChkConvertToVariate" - ' - 'ucrExplanatory - ' - Me.ucrExplanatory.frmParent = Me - resources.ApplyResources(Me.ucrExplanatory, "ucrExplanatory") - Me.ucrExplanatory.Name = "ucrExplanatory" - Me.ucrExplanatory.Selector = Nothing - Me.ucrExplanatory.strNcFilePath = "" - Me.ucrExplanatory.ucrSelector = Nothing - ' - 'ucrResponse - ' - Me.ucrResponse.frmParent = Me - resources.ApplyResources(Me.ucrResponse, "ucrResponse") - Me.ucrResponse.Name = "ucrResponse" - Me.ucrResponse.Selector = Nothing - Me.ucrResponse.strNcFilePath = "" - Me.ucrResponse.ucrSelector = Nothing + Me.ucrChkConvertToVariate.Size = New System.Drawing.Size(100, 20) + Me.ucrChkConvertToVariate.TabIndex = 4 + ' + 'ucrReceiverExplanatory + ' + Me.ucrReceiverExplanatory.frmParent = Me + Me.ucrReceiverExplanatory.Location = New System.Drawing.Point(267, 135) + Me.ucrReceiverExplanatory.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverExplanatory.Name = "ucrReceiverExplanatory" + Me.ucrReceiverExplanatory.Selector = Nothing + Me.ucrReceiverExplanatory.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverExplanatory.strNcFilePath = "" + Me.ucrReceiverExplanatory.TabIndex = 22 + Me.ucrReceiverExplanatory.ucrSelector = Nothing + ' + 'ucrReceiverResponse + ' + Me.ucrReceiverResponse.frmParent = Me + Me.ucrReceiverResponse.Location = New System.Drawing.Point(267, 69) + Me.ucrReceiverResponse.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverResponse.Name = "ucrReceiverResponse" + Me.ucrReceiverResponse.Selector = Nothing + Me.ucrReceiverResponse.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverResponse.strNcFilePath = "" + Me.ucrReceiverResponse.TabIndex = 4 + Me.ucrReceiverResponse.ucrSelector = Nothing ' 'ucrSelectorSimpleReg ' Me.ucrSelectorSimpleReg.bShowHiddenColumns = False Me.ucrSelectorSimpleReg.bUseCurrentFilter = True - resources.ApplyResources(Me.ucrSelectorSimpleReg, "ucrSelectorSimpleReg") + Me.ucrSelectorSimpleReg.Location = New System.Drawing.Point(10, 37) + Me.ucrSelectorSimpleReg.Margin = New System.Windows.Forms.Padding(0) Me.ucrSelectorSimpleReg.Name = "ucrSelectorSimpleReg" + Me.ucrSelectorSimpleReg.Size = New System.Drawing.Size(226, 186) + Me.ucrSelectorSimpleReg.TabIndex = 2 ' 'ucrChkFunction ' Me.ucrChkFunction.Checked = False - resources.ApplyResources(Me.ucrChkFunction, "ucrChkFunction") + Me.ucrChkFunction.Location = New System.Drawing.Point(489, 86) Me.ucrChkFunction.Name = "ucrChkFunction" + Me.ucrChkFunction.Size = New System.Drawing.Size(100, 20) + Me.ucrChkFunction.TabIndex = 0 ' 'ucrPnlModelType ' - resources.ApplyResources(Me.ucrPnlModelType, "ucrPnlModelType") + Me.ucrPnlModelType.Location = New System.Drawing.Point(143, -5) Me.ucrPnlModelType.Name = "ucrPnlModelType" + Me.ucrPnlModelType.Size = New System.Drawing.Size(219, 54) + Me.ucrPnlModelType.TabIndex = 3 ' 'ucrModelPreview ' Me.ucrModelPreview.AddQuotesIfUnrecognised = True Me.ucrModelPreview.IsMultiline = False Me.ucrModelPreview.IsReadOnly = False - resources.ApplyResources(Me.ucrModelPreview, "ucrModelPreview") + Me.ucrModelPreview.Location = New System.Drawing.Point(96, 258) Me.ucrModelPreview.Name = "ucrModelPreview" + Me.ucrModelPreview.Size = New System.Drawing.Size(204, 21) + Me.ucrModelPreview.TabIndex = 23 ' - 'ucrFamily + 'ucrDistributionChoice ' - resources.ApplyResources(Me.ucrFamily, "ucrFamily") - Me.ucrFamily.Name = "ucrFamily" + Me.ucrDistributionChoice.Location = New System.Drawing.Point(9, 226) + Me.ucrDistributionChoice.Name = "ucrDistributionChoice" + Me.ucrDistributionChoice.Size = New System.Drawing.Size(208, 27) + Me.ucrDistributionChoice.TabIndex = 24 ' 'ucrBase ' - resources.ApplyResources(Me.ucrBase, "ucrBase") + Me.ucrBase.Location = New System.Drawing.Point(9, 317) Me.ucrBase.Name = "ucrBase" + Me.ucrBase.Size = New System.Drawing.Size(406, 54) + Me.ucrBase.TabIndex = 17 ' 'grpParameters ' @@ -214,71 +285,90 @@ Partial Class dlgRegressionSimple Me.grpParameters.Controls.Add(Me.rdoCompareVariance) Me.grpParameters.Controls.Add(Me.rdoCompareMeans) Me.grpParameters.Controls.Add(Me.ucrPnlMeansAndVariance) - resources.ApplyResources(Me.grpParameters, "grpParameters") + Me.grpParameters.Location = New System.Drawing.Point(489, 131) Me.grpParameters.Name = "grpParameters" + Me.grpParameters.Size = New System.Drawing.Size(200, 100) + Me.grpParameters.TabIndex = 0 Me.grpParameters.TabStop = False ' + 'lblDifferenceInMeans + ' + Me.lblDifferenceInMeans.Location = New System.Drawing.Point(540, 256) + Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" + Me.lblDifferenceInMeans.Size = New System.Drawing.Size(100, 23) + Me.lblDifferenceInMeans.TabIndex = 19 + ' 'ucrNudHypothesis ' Me.ucrNudHypothesis.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudHypothesis.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - resources.ApplyResources(Me.ucrNudHypothesis, "ucrNudHypothesis") + Me.ucrNudHypothesis.Location = New System.Drawing.Point(578, 220) Me.ucrNudHypothesis.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudHypothesis.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudHypothesis.Name = "ucrNudHypothesis" + Me.ucrNudHypothesis.Size = New System.Drawing.Size(50, 20) + Me.ucrNudHypothesis.TabIndex = 13 Me.ucrNudHypothesis.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'ucrNudCI ' Me.ucrNudCI.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudCI.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - resources.ApplyResources(Me.ucrNudCI, "ucrNudCI") + Me.ucrNudCI.Location = New System.Drawing.Point(554, 223) Me.ucrNudCI.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) Me.ucrNudCI.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) Me.ucrNudCI.Name = "ucrNudCI" + Me.ucrNudCI.Size = New System.Drawing.Size(50, 20) + Me.ucrNudCI.TabIndex = 15 Me.ucrNudCI.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'lblConfidenceInterval ' - resources.ApplyResources(Me.lblConfidenceInterval, "lblConfidenceInterval") + Me.lblConfidenceInterval.Location = New System.Drawing.Point(589, 243) Me.lblConfidenceInterval.Name = "lblConfidenceInterval" + Me.lblConfidenceInterval.Size = New System.Drawing.Size(100, 23) + Me.lblConfidenceInterval.TabIndex = 18 ' 'ucrChkPairedTest ' Me.ucrChkPairedTest.Checked = False - resources.ApplyResources(Me.ucrChkPairedTest, "ucrChkPairedTest") + Me.ucrChkPairedTest.Location = New System.Drawing.Point(489, 140) Me.ucrChkPairedTest.Name = "ucrChkPairedTest" + Me.ucrChkPairedTest.Size = New System.Drawing.Size(100, 20) + Me.ucrChkPairedTest.TabIndex = 14 ' 'rdoCompareVariance ' - resources.ApplyResources(Me.rdoCompareVariance, "rdoCompareVariance") + Me.rdoCompareVariance.Location = New System.Drawing.Point(0, 0) Me.rdoCompareVariance.Name = "rdoCompareVariance" + Me.rdoCompareVariance.Size = New System.Drawing.Size(104, 24) + Me.rdoCompareVariance.TabIndex = 20 Me.rdoCompareVariance.TabStop = True Me.rdoCompareVariance.Tag = "" Me.rdoCompareVariance.UseVisualStyleBackColor = True ' 'rdoCompareMeans ' - resources.ApplyResources(Me.rdoCompareMeans, "rdoCompareMeans") + Me.rdoCompareMeans.Location = New System.Drawing.Point(0, 0) Me.rdoCompareMeans.Name = "rdoCompareMeans" + Me.rdoCompareMeans.Size = New System.Drawing.Size(104, 24) + Me.rdoCompareMeans.TabIndex = 21 Me.rdoCompareMeans.TabStop = True Me.rdoCompareMeans.Tag = "" Me.rdoCompareMeans.UseVisualStyleBackColor = True ' 'ucrPnlMeansAndVariance ' - resources.ApplyResources(Me.ucrPnlMeansAndVariance, "ucrPnlMeansAndVariance") + Me.ucrPnlMeansAndVariance.Location = New System.Drawing.Point(489, 286) Me.ucrPnlMeansAndVariance.Name = "ucrPnlMeansAndVariance" - ' - 'lblDifferenceInMeans - ' - resources.ApplyResources(Me.lblDifferenceInMeans, "lblDifferenceInMeans") - Me.lblDifferenceInMeans.Name = "lblDifferenceInMeans" + Me.ucrPnlMeansAndVariance.Size = New System.Drawing.Size(187, 76) + Me.ucrPnlMeansAndVariance.TabIndex = 17 ' 'dlgRegressionSimple ' - resources.ApplyResources(Me, "$this") + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(721, 372) Me.Controls.Add(Me.grpParameters) Me.Controls.Add(Me.ucrSaveModels) Me.Controls.Add(Me.rdoTwoSample) @@ -286,8 +376,8 @@ Partial Class dlgRegressionSimple Me.Controls.Add(Me.ucrChkConvertToVariate) Me.Controls.Add(Me.lblFactor) Me.Controls.Add(Me.lblNumeric) - Me.Controls.Add(Me.ucrExplanatory) - Me.Controls.Add(Me.ucrResponse) + Me.Controls.Add(Me.ucrReceiverExplanatory) + Me.Controls.Add(Me.ucrReceiverResponse) Me.Controls.Add(Me.ucrSelectorSimpleReg) Me.Controls.Add(Me.lblExplanatory) Me.Controls.Add(Me.lblResponse) @@ -295,7 +385,7 @@ Partial Class dlgRegressionSimple Me.Controls.Add(Me.ucrPnlModelType) Me.Controls.Add(Me.ucrModelPreview) Me.Controls.Add(Me.lblModelPreview) - Me.Controls.Add(Me.ucrFamily) + Me.Controls.Add(Me.ucrDistributionChoice) Me.Controls.Add(Me.cmdModelOptions) Me.Controls.Add(Me.cmdDisplayOptions) Me.Controls.Add(Me.ucrBase) @@ -306,9 +396,10 @@ Partial Class dlgRegressionSimple Me.Name = "dlgRegressionSimple" Me.ShowIcon = False Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Tag = "Simple_Regression" + Me.Text = "Two Variable Fit Model" Me.grpParameters.ResumeLayout(False) - Me.grpParameters.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -320,7 +411,7 @@ Partial Class dlgRegressionSimple Friend WithEvents txtdf As TextBox Friend WithEvents cmdDisplayOptions As Button Friend WithEvents cmdModelOptions As Button - Friend WithEvents ucrFamily As ucrDistributions + Friend WithEvents ucrDistributionChoice As ucrDistributions Friend WithEvents lblModelPreview As Label Friend WithEvents ucrModelPreview As ucrInputTextBox Friend WithEvents ucrChkFunction As ucrCheck @@ -330,8 +421,8 @@ Partial Class dlgRegressionSimple Friend WithEvents ucrChkConvertToVariate As ucrCheck Friend WithEvents lblFactor As Label Friend WithEvents lblNumeric As Label - Friend WithEvents ucrExplanatory As ucrReceiverSingle - Friend WithEvents ucrResponse As ucrReceiverSingle + Friend WithEvents ucrReceiverExplanatory As ucrReceiverSingle + Friend WithEvents ucrReceiverResponse As ucrReceiverSingle Friend WithEvents ucrSelectorSimpleReg As ucrSelectorByDataFrameAddRemove Friend WithEvents lblExplanatory As Label Friend WithEvents lblResponse As Label diff --git a/instat/dlgRegressionSimple.resx b/instat/dlgRegressionSimple.resx index be05e4a9290..29dcb1b3a35 100644 --- a/instat/dlgRegressionSimple.resx +++ b/instat/dlgRegressionSimple.resx @@ -117,871 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - - NoControl - - - - 7, 11 - - - 94, 13 - - - 0 - - - lblResidualMsg - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - NoControl - - - 7, 43 - - - 100, 13 - - - 1 - - - lblDF - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 118, 11 - - - 149, 20 - - - 2 - - - txtResidualMsg - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 118, 43 - - - 58, 20 - - - 12 - - - txtdf - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - NoControl - - - 264, 55 - - - 99, 13 - - - 1 - - - Response Variable: - - - lblResponse - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 30 - - - True - - - NoControl - - - 264, 117 - - - 106, 13 - - - 3 - - - Explanatory Variable: - - - lblExplanatory - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 29 - - - NoControl - - - 325, 286 - - - 110, 23 - - - 16 - - - Display Options... - - - cmdDisplayOptions - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 28 - - - NoControl - - - 325, 259 - - - 110, 23 - - - 15 - - - Model Options... - - - cmdModelOptions - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 27 - - - True - - - NoControl - - - 10, 262 - - - 80, 13 - - - 11 - - - Model Preview: - - - lblModelPreview - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 24 - - - True - - - NoControl - - - 264, 55 - - - 98, 13 - - - 3 - - - Numerical Variable: - - - lblNumeric - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 20 - - - True - - - NoControl - - - 264, 117 - - - 81, 13 - - - 6 - - - Factor Variable: - - - lblFactor - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 19 - - - 540, 255 - - - 100, 23 - - - 5 - - - Label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 9 - - - 554, 256 - - - 104, 24 - - - 10 - - - rdoKruskalTest - - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 8 - - - 554, 288 - - - 104, 24 - - - 11 - - - rdoWilcoxonTest - - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 7 - - - 578, 220 - - - 50, 20 - - - 13 - - - ucrNudHypothesis - - - instat.ucrNud, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 6 - - - 489, 140 - - - 100, 20 - - - 14 - - - ucrChkPairedTest - - - instat.ucrCheck, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 5 - - - 554, 223 - - - 50, 20 - - - 15 - - - ucrNudCI - - - instat.ucrNud, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 2 - - - 489, 286 - - - 187, 76 - - - 17 - - - ucrPnlMeansAndVariance - - - instat.UcrPanel, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 16 - - - 589, 243 - - - 100, 23 - - - 18 - - - lblConfidenceInterval - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - 540, 256 - - - 100, 23 - - - 19 - - - lblDifferenceInMeans - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 489, 86 - - - 100, 20 - - - 0 - - - ucrChkFunction - - - instat.ucrCheck, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 14 - - - 570, 131 - - - 50, 20 - - - 1 - - - ucrNudSuccess - - - instat.ucrNud, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 10 - - - 489, 181 - - - 137, 21 - - - 3 - - - ucrInputLevel2 - - - instat.ucrInputComboBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 13 - - - 489, 208 - - - 137, 21 - - - 4 - - - ucrInputLevel1 - - - instat.ucrInputComboBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 11 - - - True - - - NoControl - - - 575, 264 - - - 45, 13 - - - 9 - - - Level 1: - - - lblLevel1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 12 - - - 92, 260 - - - 204, 21 - - - 12 - - - ucrModelPreview - - - instat.ucrInputTextBox, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 21 - - - True - - - 6, 13 - - - 721, 372 - - - Button - - - Flat - - - 249, 11 - - - 100, 28 - - - 21 - - - Two Sample - - - MiddleCenter - - - rdoTwoSample - - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - Button - - - Flat - - - 151, 11 - - - 100, 28 - - - 20 - - - General ase - - - MiddleCenter - - - rdoGeneralCase - - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - 13, 288 - - - 241, 24 - - - 0 - - - ucrSaveModels - - - instat.ucrSave, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 15 - - - 143, -5 - - - 219, 54 - - - 3 - - - ucrPnlModelType - - - instat.UcrPanel, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 17 - - - 267, 92 - - - 100, 20 - - - 4 - - - ucrChkConvertToVariate - - - instat.ucrCheck, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 18 - - - 267, 69 - - - 0, 0, 0, 0 - - - 120, 20 - - - 4 - - - ucrResponse - - - instat.ucrReceiverSingle, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 23 - - - 10, 37 - - - 0, 0, 0, 0 - - - 226, 186 - - - 2 - - - ucrSelectorSimpleReg - - - instat.ucrSelectorByDataFrameAddRemove, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 25 - - - 9, 220 - - - 233, 43 - - - 9 - - - ucrFamily - - - instat.ucrDistributions, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 26 - - - 9, 317 - - - 406, 54 - - - 17 - - - ucrBase - - - instat.ucrButtons, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 31 - - - CenterScreen - - - Two Variable Fit Model - - - dlgRegressionSimple - - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 267, 131 - - - 0, 0, 0, 0 - - - 120, 20 - - - 7 - - - ucrExplanatory - - - instat.ucrReceiverSingle, instat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this - - - 22 - \ No newline at end of file diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 3478c06e364..58ff793b8f8 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -19,11 +19,18 @@ Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True Public clsModel, clsFormulaOperator, clsRGraphicsOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator - Public clsRPoisson, clsRggplotFunction, clsRLeverage, clsRWriteLeverage, clsRResiduals, clsRStdResiduals, clsRWriteResiduals, clsRWriteStdResiduals, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsRCIFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsRLmOrGLM, clsTFunc, clsRLength As New RFunction + Public clsRPoisson, clsRggplotFunction, clsRLeverage, clsRWriteLeverage, clsRResiduals, clsRStdResiduals, clsRWriteResiduals, clsRWriteStdResiduals, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsFamilyFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsLM, clsLMOrGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsTFunc, clsRLength As New RFunction + Private bRCodeSet As Boolean + + Private Sub ucrFamily_EnabledChanged(sender As Object, e As EventArgs) Handles ucrDistributionChoice.EnabledChanged + + End Sub + Public clsRYVariable, clsRXVariable, ModelPreview As String Private bReset As Boolean = True Public bResetSubDialog As Boolean = False Public bResetOptionsSubDialog As Boolean = False + Private Sub dlgRegressionSimple_Load(sender As Object, e As EventArgs) Handles Me.Load autoTranslate(Me) If bFirstLoad Then @@ -38,107 +45,82 @@ Public Class dlgRegressionSimple autoTranslate(Me) End Sub - Private Sub SetRCodeForControls(bReset) - ucrResponse.SetRCode(clsFormulaOperator, bReset) - ucrExplanatory.SetRCode(clsFormulaOperator, bReset) - ucrSelectorSimpleReg.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) - ucrPnlModelType.SetRCode(clsRLmOrGLM, bReset) - ucrSaveModels.SetRCode(ucrBase.clsRsyntax.clsBaseFunction, bReset) - ' ucrResponse.AddAdditionalCodeParameterPair(clsGLM, ucrResponse.GetParameter, iAdditionalPairNo:=1) - ' ucrExplanatory.AddAdditionalCodeParameterPair(clsGLM, ucrExplanatory.GetParameter, iAdditionalPairNo:=1) - 'ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, New RParameter("data"), iAdditionalPairNo:=1) - ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) - ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) - ' ucrResponse.AddAdditionalCodeParameterPair(clsRConvert, New RParameter("x", 1)) - 'ucrNudCI.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("conf.int"), 1) - 'ucrNudHypothesis.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("r"), 1) - End Sub - - Private Sub Preview() - Dim ResponseVar As String - Dim ExplanatoryVar As String - ResponseVar = ucrResponse.GetVariableNames(bWithQuotes:=False) - ExplanatoryVar = ucrExplanatory.GetVariableNames(bWithQuotes:=False) - ModelPreview = ResponseVar & "~" & ExplanatoryVar - End Sub - Private Sub InitialiseDialog() + ucrBase.iHelpTopicID = 366 ucrBase.clsRsyntax.iCallType = 2 - cmdModelOptions.Enabled = False + ucrDistributionChoice.SetGLMDistributions() + ucrDistributionChoice.SetFunctionIsDistFunction() - ucrResponse.Selector = ucrSelectorSimpleReg - ucrExplanatory.Selector = ucrSelectorSimpleReg - ucrBase.iHelpTopicID = 366 + ucrModelPreview.IsReadOnly = True - ucrResponse.SetParameter(New RParameter("y", 0)) - ucrResponse.SetParameterIsString() - ucrResponse.bWithQuotes = False + ucrPnlModelType.AddRadioButton(rdoGeneralCase) + ucrPnlModelType.AddRadioButton(rdoTwoSample) + ucrPnlModelType.AddFunctionNamesCondition(rdoTwoSample, "t.test") + ucrPnlModelType.AddFunctionNamesCondition(rdoGeneralCase, "t.test", False) + ucrPnlModelType.AddToLinkedControls(ucrModelPreview, {rdoGeneralCase}, bNewLinkedHideIfParameterMissing:=True) + ucrPnlModelType.AddToLinkedControls(ucrNudCI, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=0.95) + ucrPnlModelType.AddToLinkedControls(ucrNudHypothesis, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=0) + ucrPnlModelType.AddToLinkedControls(ucrPnlMeansAndVariance, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=rdoCompareMeans) + ucrPnlModelType.AddToLinkedControls(ucrChkPairedTest, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=False) - ucrExplanatory.SetParameter(New RParameter("x", 1)) - ucrExplanatory.SetParameterIsString() - ucrExplanatory.bWithQuotes = False + 'General case controls + ucrSelectorSimpleReg.SetParameter(New RParameter("data", 0)) + ucrSelectorSimpleReg.SetParameterIsrfunction() + + ucrReceiverResponse.SetParameter(New RParameter("y", 0)) + ucrReceiverResponse.Selector = ucrSelectorSimpleReg + ucrReceiverResponse.SetParameterIsString() + ucrReceiverResponse.bWithQuotes = False + + ucrReceiverExplanatory.SetParameter(New RParameter("x", 1)) + ucrReceiverExplanatory.Selector = ucrSelectorSimpleReg + ucrReceiverExplanatory.SetParameterIsString() + ucrReceiverExplanatory.bWithQuotes = False ucrChkConvertToVariate.SetText("Convert to Variate") - ucrSaveModels.SetPrefix("reg") + ucrSaveModels.SetPrefix("two_var") ucrSaveModels.SetSaveTypeAsModel() ucrSaveModels.SetDataFrameSelector(ucrSelectorSimpleReg.ucrAvailableDataFrames) ucrSaveModels.SetCheckBoxText("Save Model") ucrSaveModels.SetIsComboBox() - ucrPnlMeansAndVariance.AddRadioButton(rdoCompareMeans) - ucrPnlMeansAndVariance.AddRadioButton(rdoCompareVariance) - - ucrModelPreview.IsReadOnly = True - - ucrPnlModelType.AddRadioButton(rdoGeneralCase) - ucrPnlModelType.AddRadioButton(rdoTwoSample) - ucrPnlModelType.AddFunctionNamesCondition(rdoTwoSample, "t.test") - ucrPnlModelType.AddFunctionNamesCondition(rdoTwoSample, "lm", False) - ucrPnlModelType.AddFunctionNamesCondition(rdoGeneralCase, "lm") + 'ucrPnlMeansAndVariance.AddRadioButton(rdoCompareMeans) + 'ucrPnlMeansAndVariance.AddRadioButton(rdoCompareVariance) + '################################### - ucrPnlModelType.AddToLinkedControls(ucrModelPreview, {rdoGeneralCase}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True) + ' Two sample controls ucrModelPreview.SetLinkedDisplayControl(lblModelPreview) ucrModelPreview.SetLinkedDisplayControl(cmdDisplayOptions) ucrModelPreview.SetLinkedDisplayControl(cmdModelOptions) - ucrPnlModelType.AddToLinkedControls(ucrNudCI, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=0.95) + ucrNudCI.SetParameter(New RParameter("conf.level")) ucrNudCI.SetLinkedDisplayControl(lblConfidenceInterval) ucrNudCI.SetLinkedDisplayControl(grpParameters) ucrNudCI.DecimalPlaces = 2 - ucrPnlModelType.AddToLinkedControls(ucrNudHypothesis, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=0) ucrNudHypothesis.SetLinkedDisplayControl(lblDifferenceInMeans) ucrNudHypothesis.SetLinkedDisplayControl(grpParameters) ucrNudHypothesis.DecimalPlaces = 2 - ucrPnlModelType.AddToLinkedControls(ucrPnlMeansAndVariance, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=rdoCompareMeans) - ucrPnlMeansAndVariance.SetLinkedDisplayControl(grpParameters) - ucrPnlModelType.AddToLinkedControls(ucrChkPairedTest, {rdoTwoSample}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=False) ucrChkPairedTest.SetText("Paired Text") ucrChkPairedTest.Enabled = False 'for the time being - - ucrSelectorSimpleReg.SetParameter(New RParameter("data", 0)) - ucrSelectorSimpleReg.SetParameterIsrfunction() - 'ucrPnlModelType.AddToLinkedControls(ucrChkFunction, {rdoge}, bNewLinkedChangeToDefaultState:=True, bNewLinkedHideIfParameterMissing:=True, objNewDefaultState:=True) ucrChkFunction.SetText("Function") - ucrNudCI.SetParameter(New RParameter("conf.level")) ucrNudHypothesis.SetParameter(New RParameter("r")) + ucrPnlMeansAndVariance.SetLinkedDisplayControl(grpParameters) ucrPnlMeansAndVariance.AddToLinkedControls(ucrNudHypothesis, {rdoCompareVariance}, bNewLinkedDisabledIfParameterMissing:=True) - sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) - sdgModelOptions.SetRCIFunction(clsRCIFunction) - - + 'sdgSimpleRegOptions.SetRDataFrame(ucrSelectorSimpleReg.ucrAvailableDataFrames) + 'sdgModelOptions.SetRCIFunction(clsRCIFunction) End Sub Private Sub SetDefaults() @@ -146,10 +128,10 @@ Public Class dlgRegressionSimple clsPoissonOperation = New ROperator clsRGraphicsOperator = New ROperator - clsRLmOrGLM = New RFunction + clsLM = New RFunction clsGLM = New RFunction clsRConvert = New RFunction - clsRCIFunction = New RFunction + clsFamilyFunction = New RFunction clsRTTest = New RFunction clsRPoisson = New RFunction clsxFunc = New RFunction @@ -175,36 +157,34 @@ Public Class dlgRegressionSimple clsRResidualPlots = New RFunction clsRgeom_point = New RFunction clsRggplotFunction = New RFunction - 'clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone ucrSelectorSimpleReg.Reset() - ucrResponse.SetMeAsReceiver() - ucrSelectorSimpleReg.Focus() - ucrModelPreview.Reset() + ucrReceiverResponse.SetMeAsReceiver() ucrModelPreview.SetName("") - DataTypeAccepted() + 'DataTypeAccepted() clsRGraphicsOperator = clsRegressionDefaults.clsDefaultRGraphicsOperator.Clone clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone clsRGraphicsOperator.iCallType = 3 - clsRLmOrGLM = clsRegressionDefaults.clsDefaultRLmFunction.Clone - clsRLmOrGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) + clsLM = clsRegressionDefaults.clsDefaultRLmFunction.Clone + clsLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) + clsGLM = clsRegressionDefaults.clsDefaultGlmFunction.Clone clsGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) 'Residual Plots clsRResidualPlots = clsRegressionDefaults.clsDefaultRResidualPlots.Clone - clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsLmOrGLM) clsRgeom_point = clsRegressionDefaults.clsDefaultRgeom_pointFunction.Clone clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point, iPosition:=1) clsRaovFunction.SetPackageName("stats") clsRaovFunction.SetRCommand("anova") - clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) clsRaovFunction.iCallType = 2 'FitModel @@ -212,32 +192,32 @@ Public Class dlgRegressionSimple clsRggplotFunction.AddParameter("type", Chr(34) & "conditional" & Chr(34)) clsRggplotFunction.AddParameter("scale", Chr(34) & "linear" & Chr(34)) clsRggplotFunction.AddParameter("alpha", 0.05) - clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsRLmOrGLM) + clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsLmOrGLM) clsRggplotFunction.iCallType = 3 'Model clsRModelsFunction = clsRegressionDefaults.clsDefaultModel.Clone - clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) clsRModelsFunction.iCallType = 2 'Summary clsRSummaryFunction = clsRegressionDefaults.clsDefaultSummary.Clone - clsRSummaryFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRSummaryFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) clsRSummaryFunction.iCallType = 2 'ANOVA clsRanovaFunction = clsRegressionDefaults.clsDefaultRanovaFunction.Clone - clsRanovaFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRanovaFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) clsRanovaFunction.iCallType = 2 'Confidence Interval clsRConfint = clsRegressionDefaults.clsDefaultRConfinterval.Clone - clsRConfint.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + clsRConfint.AddParameter("object", clsRFunctionParameter:=clsLmOrGLM) clsRConfint.iCallType = 2 'Anova + Pvalue clsRestpvalFunction = clsRegressionDefaults.clsDefaultRaovPValueFunction.Clone - clsRestpvalFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) + clsRestpvalFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) ' clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) clsRestpvalFunction.iCallType = 2 @@ -264,8 +244,9 @@ Public Class dlgRegressionSimple clsRConvert.SetRCommand("as.numeric") - clsRCIFunction.SetRCommand(ucrFamily.clsCurrDistribution.strGLMFunctionName) - clsGLM.AddParameter("family", clsRFunctionParameter:=clsRCIFunction) + clsFamilyFunction = ucrDistributionChoice.clsCurrRFunction + 'clsFamilyFunction.SetRCommand(ucrDistributionChoice.clsCurrDistribution.strGLMFunctionName) + clsGLM.AddParameter("family", clsRFunctionParameter:=clsFamilyFunction) clsRTTest.SetPackageName("mosaic") @@ -290,49 +271,83 @@ Public Class dlgRegressionSimple clsTFunc.SetRCommand("c") + ucrBase.clsRsyntax.SetBaseRFunction(clsLM) + clsLMOrGLM = clsLM - ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) - - clsRLmOrGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempModel:="last_model", bAssignToIsPrefix:=True) - + clsLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempModel:="last_model", bAssignToIsPrefix:=True) + clsGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempModel:="last_model", bAssignToIsPrefix:=True) sdgModelOptions.SetDefaults() - SetRCode() - ucrFamily.SetGLMDistributions() - - SetEnableDists() bResetSubDialog = True bResetOptionsSubDialog = True End Sub - Private Sub ucrDistWithParameters_ucrInputDistributionsIndexChanged() Handles ucrFamily.DistributionsIndexChanged - sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) - sdgModelOptions.ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrFamily.clsCurrDistribution.strNameTag) - sdgModelOptions.RestrictLink() + Private Sub SetRCodeForControls(bReset) + bRCodeSet = False + 'General case controls + ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter(), 1) + ucrSaveModels.AddAdditionalRCode(clsGLM, 1) + + ucrReceiverResponse.SetRCode(clsFormulaOperator, bReset) + ucrReceiverExplanatory.SetRCode(clsFormulaOperator, bReset) + ucrPnlModelType.SetRCode(clsLmOrGLM, bReset) + + ucrSelectorSimpleReg.SetRCode(clsLM, bReset) + + ucrSaveModels.SetRCode(clsLM, bReset) + + ucrDistributionChoice.SetRCode(clsFamilyFunction, bReset) + + '################################################### + + 'Two sample controls + ' ucrResponse.AddAdditionalCodeParameterPair(clsGLM, ucrResponse.GetParameter, iAdditionalPairNo:=1) + ' ucrExplanatory.AddAdditionalCodeParameterPair(clsGLM, ucrExplanatory.GetParameter, iAdditionalPairNo:=1) + 'ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, New RParameter("data"), iAdditionalPairNo:=1) + ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter, 1) + ' ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsRTTest, ucrSelectorSimpleReg.GetParameter, 2) + ' ucrResponse.AddAdditionalCodeParameterPair(clsRConvert, New RParameter("x", 1)) + 'ucrNudCI.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("conf.int"), 1) + 'ucrNudHypothesis.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("r"), 1) + bRCodeSet = True + End Sub + + Private Sub UpdatePreview() + If Not ucrReceiverResponse.IsEmpty AndAlso Not ucrReceiverExplanatory.IsEmpty Then + ucrModelPreview.SetName(clsFormulaOperator.ToScript()) + Else + ucrModelPreview.SetName("") + End If + End Sub + + Private Sub ucrDistWithParameters_ucrInputDistributionsIndexChanged() Handles ucrDistributionChoice.DistributionsIndexChanged + 'sdgModelOptions.ucrFamily.RecieverDatatype(ucrDistributionChoice.strDataType) + 'sdgModelOptions.ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrDistributionChoice.clsCurrDistribution.strNameTag) + 'sdgModelOptions.RestrictLink() ExplanatoryFunctionSelect() - SetRCode() + SetBaseFunction() DataTypeAccepted() End Sub Public Sub DataTypeAccepted() If rdoTwoSample.Checked Then - ucrResponse.SetIncludedDataTypes({"integer", "numeric"}) - ucrExplanatory.SetIncludedDataTypes({"character", "factor"}) - If ucrResponse.strCurrDataType = "factor" OrElse ucrResponse.strCurrDataType = "character" Then - ucrResponse.Clear() + ucrReceiverResponse.SetIncludedDataTypes({"integer", "numeric"}) + ucrReceiverExplanatory.SetIncludedDataTypes({"character", "factor"}) + If ucrReceiverResponse.strCurrDataType = "factor" OrElse ucrReceiverResponse.strCurrDataType = "character" Then + ucrReceiverResponse.Clear() End If - If ucrExplanatory.strCurrDataType = "integer" OrElse ucrExplanatory.strCurrDataType = "numeric" OrElse ucrResponse.strCurrDataType = "positive integer" Then - ucrExplanatory.Clear() + If ucrReceiverExplanatory.strCurrDataType = "integer" OrElse ucrReceiverExplanatory.strCurrDataType = "numeric" OrElse ucrReceiverResponse.strCurrDataType = "positive integer" Then + ucrReceiverExplanatory.Clear() End If ElseIf rdoGeneralCase.Checked Then - ucrResponse.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) - ucrExplanatory.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) + ucrReceiverResponse.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) + ucrReceiverExplanatory.SetIncludedDataTypes({"integer", "numeric", "character", "factor"}) End If End Sub Private Sub ucrChkFunction_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkFunction.ControlValueChanged If ucrChkFunction.Checked Then - sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsRLmOrGLM, clsNewFormulaOperator:=clsFormulaOperator, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel) + sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsLmOrGLM, clsNewFormulaOperator:=clsFormulaOperator, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel) sdgVariableTransformations.ShowDialog() ExplanatoryFunctionSelect() bResetSubDialog = False @@ -340,26 +355,25 @@ Public Class dlgRegressionSimple End Sub Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click - sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRGraphicsOperator:=clsRGraphicsOperator, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRgeom_point:=clsRgeom_point, clsNewRResidualPlots:=clsRResidualPlots, clsNewRggplotFunction:=clsRggplotFunction, clsNewRConfint:=clsRConfint, clsNewRWriteResiduals:=clsRWriteResiduals, clsNewRWriteStdResiduals:=clsRWriteStdResiduals, clsNewRWriteLeverage:=clsRWriteLeverage, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsRLmOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) + sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRGraphicsOperator:=clsRGraphicsOperator, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRgeom_point:=clsRgeom_point, clsNewRResidualPlots:=clsRResidualPlots, clsNewRggplotFunction:=clsRggplotFunction, clsNewRConfint:=clsRConfint, clsNewRWriteResiduals:=clsRWriteResiduals, clsNewRWriteStdResiduals:=clsRWriteStdResiduals, clsNewRWriteLeverage:=clsRWriteLeverage, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsLmOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) bResetOptionsSubDialog = False sdgSimpleRegOptions.ShowDialog() End Sub - Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlValueChanged - Preview() - clsRYVariable = ucrResponse.GetVariableNames(bWithQuotes:=False) + Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverResponse.ControlValueChanged + UpdatePreview() + ConvertToVariate() + clsRYVariable = ucrReceiverResponse.GetVariableNames(bWithQuotes:=False) SetEnableDists() End Sub - Private Sub ucrSelectorSimpleReg_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSelectorSimpleReg.ControlValueChanged ConvertToVariate() - DataTypeAccepted() End Sub Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click sdgModelOptions.ShowDialog() - ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) + ucrDistributionChoice.ucrInputDistributions.cboInput.SelectedIndex = ucrDistributionChoice.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) End Sub Private Sub SetTTest() @@ -373,8 +387,8 @@ Public Class dlgRegressionSimple ' clsRTTest.AddParameter("y", clsRFunctionParameter:=ucrExplanatory.GetVariables()) ' Else clsModel.SetOperation("~") - clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) - clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrReceiverResponse.GetVariables()) + clsModel.AddParameter(clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) clsRTTest.AddParameter("x", clsROperatorParameter:=clsModel) ' End If If ucrChkPairedTest.Checked Then @@ -391,8 +405,8 @@ Public Class dlgRegressionSimple clsRFTest.AddParameter("data", clsRFunctionParameter:=ucrSelectorSimpleReg.ucrAvailableDataFrames.clsCurrDataFrame) ' clsRFTest.AddParameter("mu", nudHypothesis.Value.ToString()) clsModel.SetOperation("~") - clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) - clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrReceiverResponse.GetVariables()) + clsModel.AddParameter(clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) clsRFTest.AddParameter("", clsROperatorParameter:=clsModel) End Sub @@ -403,8 +417,8 @@ Public Class dlgRegressionSimple ' clsRWilcoxTest.AddParameter("conf.level", nudCI.Value.ToString()) ' clsRWilcoxTest.AddParameter("mu", nudHypothesis.Value.ToString()) clsModel.SetOperation("~") - clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) - clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrReceiverResponse.GetVariables()) + clsModel.AddParameter(clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) clsRWilcoxTest.AddParameter("", clsROperatorParameter:=clsModel) End Sub @@ -412,8 +426,8 @@ Public Class dlgRegressionSimple ucrBase.clsRsyntax.SetBaseRFunction(clsRKruskalTest) clsModel.SetOperation("~") - clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) - clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrReceiverResponse.GetVariables()) + clsModel.AddParameter(clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) clsRKruskalTest.AddParameter("", clsROperatorParameter:=clsModel) End Sub @@ -426,10 +440,10 @@ Public Class dlgRegressionSimple ' clsRBinomial.AddParameter("conf.level", nudCI.Value.ToString()) clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) - clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRGroup.ToScript & "]") + clsRLength.AddParameter("x", ucrReceiverResponse.GetVariables().ToScript & "[" & clsRGroup.ToScript & "]") clsRGroup.AddParameter("x", clsROperatorParameter:=clsPoissonOperation) clsPoissonOperation.SetOperation("==") - clsPoissonOperation.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsPoissonOperation.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) clsRBinomial.AddParameter("data", ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text) @@ -452,13 +466,13 @@ Public Class dlgRegressionSimple ' LengthOne clsRLength.SetRCommand("length") clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) - clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor.ToScript & "&" & clsRNumeric.ToScript & "]") + clsRLength.AddParameter("x", ucrReceiverResponse.GetVariables().ToScript & "[" & clsRFactor.ToScript & "&" & clsRNumeric.ToScript & "]") ' LengthTwo ' length(x=ucrResponse[(x=ucrExplanatory == 2)&(x=ucrResponse ==1)])) clsRLength.SetRCommand("length") clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) - clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor2.ToScript & "&" & clsRNumeric.ToScript & "]") + clsRLength.AddParameter("x", ucrReceiverResponse.GetVariables().ToScript & "[" & clsRFactor2.ToScript & "&" & clsRNumeric.ToScript & "]") ' Total counts for each level: @@ -466,30 +480,30 @@ Public Class dlgRegressionSimple clsRLength.SetRCommand("length") clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) - clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor.ToScript & "]") + clsRLength.AddParameter("x", ucrReceiverResponse.GetVariables().ToScript & "[" & clsRFactor.ToScript & "]") clsRLength.SetRCommand("length") clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) - clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRFactor2.ToScript & "]") + clsRLength.AddParameter("x", ucrReceiverResponse.GetVariables().ToScript & "[" & clsRFactor2.ToScript & "]") ' The three groups of interest: '' x=ucrExplanatory == Level1 clsRFactor.AddParameter("x", clsROperatorParameter:=clsRBinomialOperation) clsRBinomialOperation.SetOperation("==") - clsRBinomialOperation.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsRBinomialOperation.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) ' clsRBinomialOperation.AddParameter(strParameterValue:=ucrLevel1.GetText()) '' x=ucrExplanatory == Level2 clsRFactor2.AddParameter("x", clsROperatorParameter:=clsRBinomialOperation2) clsRBinomialOperation2.SetOperation("==") - clsRBinomialOperation2.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsRBinomialOperation2.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) ' clsRBinomialOperation2.AddParameter(strParameterValue:=ucrLevel2.GetText()) '' x=ucrResponse == SuccessIf clsRNumeric.AddParameter("x", clsROperatorParameter:=clsRBinomialOperation3) clsRBinomialOperation3.SetOperation("==") - clsRBinomialOperation3.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) + clsRBinomialOperation3.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrReceiverResponse.GetVariables()) ' clsRBinomialOperation3.AddParameter(strParameterValue:=ucrNud.Value) ' If two factors: @@ -508,10 +522,10 @@ Public Class dlgRegressionSimple clsRLength.SetRCommand("length") clsRLength.AddParameter("x", clsRFunctionParameter:=clsRLength) - clsRLength.AddParameter("x", ucrResponse.GetVariables().ToScript & "[" & clsRGroup2.ToScript & "]") + clsRLength.AddParameter("x", ucrReceiverResponse.GetVariables().ToScript & "[" & clsRGroup2.ToScript & "]") clsRGroup2.AddParameter("x", clsROperatorParameter:=clsPoissonOperation2) clsPoissonOperation2.SetOperation("==") - clsPoissonOperation2.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsPoissonOperation2.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) ' clsPoissonOperation2.AddParameter(strParameterValue:=ucrLevel2.GetText()) ' T = ... @@ -532,32 +546,33 @@ Public Class dlgRegressionSimple clsRPoisson.SetRCommand("poisson.test") ucrBase.clsRsyntax.SetBaseRFunction(clsRPoisson) clsRLength.SetRCommand("length") - clsRLength.AddParameter("x", clsRFunctionParameter:=ucrResponse.GetVariables()) + clsRLength.AddParameter("x", clsRFunctionParameter:=ucrReceiverResponse.GetVariables()) clsRLength.SetRCommand("length") - clsRLength.AddParameter("x", clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsRLength.AddParameter("x", clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) clsRMean.SetRCommand("mean") - clsRMean.AddParameter("x", clsRFunctionParameter:=ucrResponse.GetVariables()) + clsRMean.AddParameter("x", clsRFunctionParameter:=ucrReceiverResponse.GetVariables()) clsRMean2.SetRCommand("mean") - clsRMean2.AddParameter("x", clsRFunctionParameter:=ucrExplanatory.GetVariables()) + clsRMean2.AddParameter("x", clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) End Sub - Private Sub SetRCode() + Private Sub SetBaseFunction() If rdoGeneralCase.Checked Then - If (ucrFamily.clsCurrDistribution.strNameTag = "Normal") Then - ucrBase.clsRsyntax.SetBaseRFunction(clsRLmOrGLM) + If (ucrDistributionChoice.clsCurrDistribution.strNameTag = "Normal") Then + clsLMOrGLM = clsLM Else - ucrBase.clsRsyntax.SetBaseRFunction(clsGLM) + clsLMOrGLM = clsGLM End If + ucrBase.clsRsyntax.SetBaseRFunction(clsLMOrGLM) ElseIf rdoTwoSample.Checked Then - If ucrFamily.clsCurrDistribution.strNameTag = "Normal" Then + If ucrDistributionChoice.clsCurrDistribution.strNameTag = "Normal" Then If rdoCompareMeans.Checked Then SetTTest() ElseIf rdoCompareVariance.Checked Then SetFTest() End If - ElseIf ucrFamily.clsCurrDistribution.strNameTag = "Poisson" Then + ElseIf ucrDistributionChoice.clsCurrDistribution.strNameTag = "Poisson" Then SetPoissonTest() - ElseIf ucrFamily.clsCurrDistribution.strNameTag = "Bernouli" Then + ElseIf ucrDistributionChoice.clsCurrDistribution.strNameTag = "Bernouli" Then SetBinomTest() Else If rdoCompareMeans.Checked Then @@ -570,8 +585,7 @@ Public Class dlgRegressionSimple End Sub Private Sub TestOKEnabled() - If Not ucrResponse.IsEmpty() AndAlso Not ucrExplanatory.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then - ucrModelPreview.SetName(ModelPreview) + If Not ucrReceiverResponse.IsEmpty() AndAlso Not ucrReceiverExplanatory.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then 'If rdoSpecific.Checked AndAlso (ucrFamily.clsCurrDistribution.strNameTag = "Poisson" OrElse ucrFamily.clsCurrDistribution.strNameTag = "Binomial") AndAlso Not (ucrLevel1.IsEmpty OrElse ucrLevel2.IsEmpty) Then ' ucrBase.OKEnabled(True) 'Else @@ -590,62 +604,64 @@ Public Class dlgRegressionSimple End Sub Private Sub ucrSelectorSimpleReg_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorSimpleReg.ControlValueChanged - SetRCode() + SetBaseFunction() End Sub Public Sub ConvertToVariate() - If rdoGeneralCase.Checked Then - If Not ucrResponse.IsEmpty Then - ucrFamily.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrResponse.GetVariableNames(bWithQuotes:=False)) - If ucrFamily.strDataType = "numeric" Then - ucrChkConvertToVariate.Checked = False - ucrChkConvertToVariate.Visible = False + If bRCodeSet Then + If rdoGeneralCase.Checked Then + If Not ucrReceiverResponse.IsEmpty Then + ucrDistributionChoice.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrReceiverResponse.GetVariableNames(bWithQuotes:=False)) + If ucrDistributionChoice.strDataType = "numeric" Then + ucrChkConvertToVariate.Checked = False + ucrChkConvertToVariate.Visible = False + Else + ucrChkConvertToVariate.Visible = True + End If + sdgModelOptions.ucrFamily.RecieverDatatype(ucrDistributionChoice.strDataType) + If ucrChkConvertToVariate.Checked Then + + clsRConvert.AddParameter("x", ucrReceiverResponse.GetVariableNames(bWithQuotes:=False)) + clsLMOrGLM.AddParameter("x", clsRFunctionParameter:=clsRConvert) + clsLMOrGLM.AddParameter("x", clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) + ucrDistributionChoice.RecieverDatatype("numeric") + Else + 'clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) + ' clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) + 'clsModel.AddParameter(iPosition:=0, strParameterValue:=ucrResponse.GetVariableNames(bWithQuotes:=False)) + ucrDistributionChoice.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrReceiverResponse.GetVariableNames(bWithQuotes:=False)) + End If Else - ucrChkConvertToVariate.Visible = True - End If - sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) - If ucrChkConvertToVariate.Checked Then - - clsRConvert.AddParameter("x", ucrResponse.GetVariableNames(bWithQuotes:=False)) - clsRLmOrGLM.AddParameter("x", clsRFunctionParameter:=clsRConvert) - clsRLmOrGLM.AddParameter("x", clsRFunctionParameter:=ucrExplanatory.GetVariables()) - ucrFamily.RecieverDatatype("numeric") - Else - 'clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) - ' clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) - 'clsModel.AddParameter(iPosition:=0, strParameterValue:=ucrResponse.GetVariableNames(bWithQuotes:=False)) - ucrFamily.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrResponse.GetVariableNames(bWithQuotes:=False)) + If ucrDistributionChoice.lstCurrentDistributions.Count = 0 OrElse ucrReceiverResponse.IsEmpty() Then + ucrDistributionChoice.ucrInputDistributions.SetName("") + cmdModelOptions.Enabled = False + Else + cmdModelOptions.Enabled = True + End If End If Else - If ucrFamily.lstCurrentDistributions.Count = 0 OrElse ucrResponse.IsEmpty() Then - ucrFamily.ucrInputDistributions.SetName("") - cmdModelOptions.Enabled = False - Else - cmdModelOptions.Enabled = True + If Not ucrReceiverResponse.IsEmpty Then + ucrDistributionChoice.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrReceiverResponse.GetVariableNames(bWithQuotes:=False)) End If End If - Else - If Not ucrResponse.IsEmpty Then - ucrFamily.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrResponse.GetVariableNames(bWithQuotes:=False)) - End If End If End Sub - Private Sub ucrExplanatory_SelectionChanged(sender As Object, e As EventArgs) Handles ucrExplanatory.SelectionChanged - If Not ucrExplanatory.IsEmpty Then + Private Sub ucrExplanatory_SelectionChanged(sender As Object, e As EventArgs) Handles ucrReceiverExplanatory.SelectionChanged + If Not ucrReceiverExplanatory.IsEmpty Then 'ucrLevel1.SetItems({ucrExplanatory.GetItemType("Levels")}) End If End Sub Private Sub ucrchkConvertToVariate_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkConvertToVariate.ControlValueChanged - SetRCode() + SetBaseFunction() ConvertToVariate() End Sub Private Sub ExplanatoryFunctionSelect() Dim strExplanatoryType As String - If Not ucrExplanatory.IsEmpty AndAlso rdoGeneralCase.Checked Then - strExplanatoryType = frmMain.clsRLink.GetDataType(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrExplanatory.GetVariableNames(bWithQuotes:=False)) + If Not ucrReceiverExplanatory.IsEmpty AndAlso rdoGeneralCase.Checked Then + strExplanatoryType = frmMain.clsRLink.GetDataType(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrReceiverExplanatory.GetVariableNames(bWithQuotes:=False)) If rdoGeneralCase.Checked AndAlso (strExplanatoryType = "numeric" OrElse strExplanatoryType = "positive integer" OrElse strExplanatoryType = "integer") Then ucrChkFunction.Visible = True Else @@ -661,12 +677,12 @@ Public Class dlgRegressionSimple End If End Sub - Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrExplanatory.ControlValueChanged - SetRCode() + Private Sub ucrExplanatory_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverExplanatory.ControlValueChanged + SetBaseFunction() ExplanatoryFunctionSelect() DataTypeAccepted() - Preview() - clsRXVariable = ucrExplanatory.GetVariableNames(bWithQuotes:=False) + UpdatePreview() + clsRXVariable = ucrReceiverExplanatory.GetVariableNames(bWithQuotes:=False) End Sub Private Sub ucrBase_ClickReset(sender As Object, e As EventArgs) Handles ucrBase.ClickReset @@ -758,26 +774,26 @@ Public Class dlgRegressionSimple End Sub Public Sub SetEnableDists() - ucrFamily.Enabled = Not ucrResponse.IsEmpty + ucrDistributionChoice.Enabled = Not ucrReceiverResponse.IsEmpty End Sub - Private Sub ucrFamily_EnabledChanged() Handles ucrFamily.EnabledChanged + Private Sub ucrFamily_EnabledChanged() Handles ucrDistributionChoice.EnabledChanged DataTypeAccepted() SetEnableDists() End Sub - Private Sub Controls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrResponse.ControlContentsChanged, ucrPnlModelType.ControlContentsChanged, ucrExplanatory.ControlContentsChanged + Private Sub Controls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverResponse.ControlContentsChanged, ucrPnlModelType.ControlContentsChanged, ucrReceiverExplanatory.ControlContentsChanged TestOKEnabled() End Sub Private Sub ucrPnlModelType_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlModelType.ControlValueChanged If rdoGeneralCase.Checked Then - ucrFamily.SetGLMDistributions() + ucrDistributionChoice.SetGLMDistributions() Else - ucrFamily.SetExactDistributions() + ucrDistributionChoice.SetExactDistributions() End If ExplanatoryFunctionSelect() - SetRCode() + SetBaseFunction() ConvertToVariate() DataTypeAccepted() End Sub diff --git a/instat/ucrDistributions.vb b/instat/ucrDistributions.vb index d16a0b07b74..a699d9f237e 100644 --- a/instat/ucrDistributions.vb +++ b/instat/ucrDistributions.vb @@ -622,8 +622,6 @@ Public Class ucrDistributions clsTempParam = New RParameter End If If bParameterIsDistName Then - 'TODO this currently only works with one value to ignore. Also may need option not to set parameter value to strValuesToIgnore - ' although this currently can be done with bAddParameterIfEmpty = True clsTempParam.SetArgumentValue(Chr(34) & clsCurrDistribution.strRName & Chr(34)) ElseIf bParameterIsDistFunction Then clsTempParam.SetArgument(clsCurrRFunction) @@ -637,6 +635,7 @@ Public Class ucrDistributions Dim lstCurrentVariables As String() = Nothing Dim clsTempParameter As RParameter Dim clsNewCurrentDist As Distribution = Nothing + Dim bErrorIfNotFound As Boolean = True clsTempParameter = GetParameter() If bParameterIsDistName AndAlso clsTempParameter IsNot Nothing AndAlso clsTempParameter.bIsString Then @@ -653,12 +652,17 @@ Public Class ucrDistributions clsNewCurrentDist = clsTempDist End If Next + Else + ucrInputDistributions.SetName("") + bErrorIfNotFound = False End If End If If clsNewCurrentDist IsNot Nothing Then ucrInputDistributions.SetName(translate(clsNewCurrentDist.strNameTag)) Else - MsgBox("Developer error: Cannot set value of " & Name & " because cannot find a distribution matching the function and parameter given") + If bErrorIfNotFound Then + MsgBox("Developer error: Cannot set value of " & Name & " because cannot find a distribution matching the function and parameter given") + End If End If End Sub End Class \ No newline at end of file From 70ea9169508bc6769bba02e804e276e699339942 Mon Sep 17 00:00:00 2001 From: Lily Date: Tue, 27 Jun 2017 13:17:20 +0100 Subject: [PATCH 193/201] Spelling fixes --- instat/frmMain.vb | 2 +- instat/ucrCore.vb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/instat/frmMain.vb b/instat/frmMain.vb index a9cc40e6971..0586b7ead79 100644 --- a/instat/frmMain.vb +++ b/instat/frmMain.vb @@ -124,7 +124,7 @@ Public Class frmMain iDataFiles = strAutoSavedDataFilePaths.Count End If If iLogFiles > 0 OrElse iDataFiles > 0 Then - If MsgBox("We have detected that R-Instat may have closed unexpectadly last time." & Environment.NewLine & "Would you like to see auto recovery options?", MessageBoxButtons.YesNo, "Auto Recovery") = MsgBoxResult.Yes Then + If MsgBox("We have detected that R-Instat may have closed unexpectedly last time." & Environment.NewLine & "Would you like to see auto recovery options?", MessageBoxButtons.YesNo, "Auto Recovery") = MsgBoxResult.Yes Then dlgAutoSaveRecovery.strAutoSavedLogFilePaths = strAutoSavedLogFilePaths dlgAutoSaveRecovery.strAutoSavedDataFilePaths = strAutoSavedDataFilePaths dlgAutoSaveRecovery.strAutoSavedInternalLogFilePaths = strAutoSavedInternalLogFilePaths diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index 65f10c2a314..9997b26a73e 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -560,7 +560,7 @@ Public Class ucrCore lstAllRCodes.Add(clsNewRCode) lstAllRParameters.Add(clsNewRParameter) Else - MsgBox("Developer error: Cannot add additional RCode and RParameter pair because the addional pair number is out of bounds of the current pairs.") + MsgBox("Developer error: Cannot add additional RCode and RParameter pair because the additional pair number is out of bounds of the current pairs.") End If End Sub From 4896c68e8ce74cb23262cb2dae051d22b7fc3e32 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Tue, 27 Jun 2017 20:19:20 +0100 Subject: [PATCH 194/201] fixed regression simple for general case fixed bug in condition setting removed write line to console from RLink --- instat/clsCondition.vb | 3 +- instat/clsRLink.vb | 1 - instat/clsRegressionDefaults.vb | 2 +- instat/dlgRegressionSimple.Designer.vb | 194 ++++++++++++------------- instat/dlgRegressionSimple.vb | 106 ++++++++------ 5 files changed, 160 insertions(+), 146 deletions(-) diff --git a/instat/clsCondition.vb b/instat/clsCondition.vb index 52ec97011f0..667c89a35a0 100644 --- a/instat/clsCondition.vb +++ b/instat/clsCondition.vb @@ -90,7 +90,8 @@ bIsRSyntaxFunctionNames = False bIsRSyntaxContainsCode = False bIsParameterValuesRFunctionNames = False - strParameterName = strParamName + strParameterName = strParamName + bIsPositive = bNewIsPositive If Not {"string", "RFunction", "ROperator"}.Contains(strType) Then MsgBox("Developer error: strType must be either string, RFunction or ROperator.") strParameterType = "" diff --git a/instat/clsRLink.vb b/instat/clsRLink.vb index 13d91c9e056..e24e2a67b2e 100644 --- a/instat/clsRLink.vb +++ b/instat/clsRLink.vb @@ -538,7 +538,6 @@ Public Class RLink w.WriteLine(strScript) End Using ts.Stop() - Console.WriteLine(ts.ElapsedMilliseconds) End If Catch ex As Exception MsgBox("Could not add text to debug log file at:" & strAutoSaveDebugLogFilePath & Environment.NewLine & ex.Message, MsgBoxStyle.Exclamation, "Debug Log File") diff --git a/instat/clsRegressionDefaults.vb b/instat/clsRegressionDefaults.vb index 7cfe55269bc..09dd614cd44 100644 --- a/instat/clsRegressionDefaults.vb +++ b/instat/clsRegressionDefaults.vb @@ -1,5 +1,5 @@ Public Class clsRegressionDefaults - Public Shared ReadOnly Property clsDefaultRLmFunction As RFunction + Public Shared ReadOnly Property clsDefaultLmFunction As RFunction Get Dim clsRModelFunction As New RFunction diff --git a/instat/dlgRegressionSimple.Designer.vb b/instat/dlgRegressionSimple.Designer.vb index 7607ce2c0c1..f34448e9999 100644 --- a/instat/dlgRegressionSimple.Designer.vb +++ b/instat/dlgRegressionSimple.Designer.vb @@ -35,6 +35,15 @@ Partial Class dlgRegressionSimple Me.lblNumeric = New System.Windows.Forms.Label() Me.lblExplanatory = New System.Windows.Forms.Label() Me.lblResponse = New System.Windows.Forms.Label() + Me.grpParameters = New System.Windows.Forms.GroupBox() + Me.lblDifferenceInMeans = New System.Windows.Forms.Label() + Me.ucrNudHypothesis = New instat.ucrNud() + Me.ucrNudCI = New instat.ucrNud() + Me.lblConfidenceInterval = New System.Windows.Forms.Label() + Me.ucrChkPairedTest = New instat.ucrCheck() + Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() + Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() + Me.ucrPnlMeansAndVariance = New instat.UcrPanel() Me.ucrSaveModels = New instat.ucrSave() Me.ucrChkConvertToVariate = New instat.ucrCheck() Me.ucrReceiverExplanatory = New instat.ucrReceiverSingle() @@ -45,15 +54,6 @@ Partial Class dlgRegressionSimple Me.ucrModelPreview = New instat.ucrInputTextBox() Me.ucrDistributionChoice = New instat.ucrDistributions() Me.ucrBase = New instat.ucrButtons() - Me.grpParameters = New System.Windows.Forms.GroupBox() - Me.lblDifferenceInMeans = New System.Windows.Forms.Label() - Me.ucrNudHypothesis = New instat.ucrNud() - Me.ucrNudCI = New instat.ucrNud() - Me.lblConfidenceInterval = New System.Windows.Forms.Label() - Me.ucrChkPairedTest = New instat.ucrCheck() - Me.rdoCompareVariance = New System.Windows.Forms.RadioButton() - Me.rdoCompareMeans = New System.Windows.Forms.RadioButton() - Me.ucrPnlMeansAndVariance = New instat.UcrPanel() Me.grpParameters.SuspendLayout() Me.SuspendLayout() ' @@ -187,94 +187,6 @@ Partial Class dlgRegressionSimple Me.lblResponse.Size = New System.Drawing.Size(100, 23) Me.lblResponse.TabIndex = 24 ' - 'ucrSaveModels - ' - Me.ucrSaveModels.Location = New System.Drawing.Point(9, 285) - Me.ucrSaveModels.Name = "ucrSaveModels" - Me.ucrSaveModels.Size = New System.Drawing.Size(291, 24) - Me.ucrSaveModels.TabIndex = 1 - ' - 'ucrChkConvertToVariate - ' - Me.ucrChkConvertToVariate.Checked = False - Me.ucrChkConvertToVariate.Location = New System.Drawing.Point(267, 92) - Me.ucrChkConvertToVariate.Name = "ucrChkConvertToVariate" - Me.ucrChkConvertToVariate.Size = New System.Drawing.Size(100, 20) - Me.ucrChkConvertToVariate.TabIndex = 4 - ' - 'ucrReceiverExplanatory - ' - Me.ucrReceiverExplanatory.frmParent = Me - Me.ucrReceiverExplanatory.Location = New System.Drawing.Point(267, 135) - Me.ucrReceiverExplanatory.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverExplanatory.Name = "ucrReceiverExplanatory" - Me.ucrReceiverExplanatory.Selector = Nothing - Me.ucrReceiverExplanatory.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverExplanatory.strNcFilePath = "" - Me.ucrReceiverExplanatory.TabIndex = 22 - Me.ucrReceiverExplanatory.ucrSelector = Nothing - ' - 'ucrReceiverResponse - ' - Me.ucrReceiverResponse.frmParent = Me - Me.ucrReceiverResponse.Location = New System.Drawing.Point(267, 69) - Me.ucrReceiverResponse.Margin = New System.Windows.Forms.Padding(0) - Me.ucrReceiverResponse.Name = "ucrReceiverResponse" - Me.ucrReceiverResponse.Selector = Nothing - Me.ucrReceiverResponse.Size = New System.Drawing.Size(120, 20) - Me.ucrReceiverResponse.strNcFilePath = "" - Me.ucrReceiverResponse.TabIndex = 4 - Me.ucrReceiverResponse.ucrSelector = Nothing - ' - 'ucrSelectorSimpleReg - ' - Me.ucrSelectorSimpleReg.bShowHiddenColumns = False - Me.ucrSelectorSimpleReg.bUseCurrentFilter = True - Me.ucrSelectorSimpleReg.Location = New System.Drawing.Point(10, 37) - Me.ucrSelectorSimpleReg.Margin = New System.Windows.Forms.Padding(0) - Me.ucrSelectorSimpleReg.Name = "ucrSelectorSimpleReg" - Me.ucrSelectorSimpleReg.Size = New System.Drawing.Size(226, 186) - Me.ucrSelectorSimpleReg.TabIndex = 2 - ' - 'ucrChkFunction - ' - Me.ucrChkFunction.Checked = False - Me.ucrChkFunction.Location = New System.Drawing.Point(489, 86) - Me.ucrChkFunction.Name = "ucrChkFunction" - Me.ucrChkFunction.Size = New System.Drawing.Size(100, 20) - Me.ucrChkFunction.TabIndex = 0 - ' - 'ucrPnlModelType - ' - Me.ucrPnlModelType.Location = New System.Drawing.Point(143, -5) - Me.ucrPnlModelType.Name = "ucrPnlModelType" - Me.ucrPnlModelType.Size = New System.Drawing.Size(219, 54) - Me.ucrPnlModelType.TabIndex = 3 - ' - 'ucrModelPreview - ' - Me.ucrModelPreview.AddQuotesIfUnrecognised = True - Me.ucrModelPreview.IsMultiline = False - Me.ucrModelPreview.IsReadOnly = False - Me.ucrModelPreview.Location = New System.Drawing.Point(96, 258) - Me.ucrModelPreview.Name = "ucrModelPreview" - Me.ucrModelPreview.Size = New System.Drawing.Size(204, 21) - Me.ucrModelPreview.TabIndex = 23 - ' - 'ucrDistributionChoice - ' - Me.ucrDistributionChoice.Location = New System.Drawing.Point(9, 226) - Me.ucrDistributionChoice.Name = "ucrDistributionChoice" - Me.ucrDistributionChoice.Size = New System.Drawing.Size(208, 27) - Me.ucrDistributionChoice.TabIndex = 24 - ' - 'ucrBase - ' - Me.ucrBase.Location = New System.Drawing.Point(9, 317) - Me.ucrBase.Name = "ucrBase" - Me.ucrBase.Size = New System.Drawing.Size(406, 54) - Me.ucrBase.TabIndex = 17 - ' 'grpParameters ' Me.grpParameters.Controls.Add(Me.lblDifferenceInMeans) @@ -364,6 +276,94 @@ Partial Class dlgRegressionSimple Me.ucrPnlMeansAndVariance.Size = New System.Drawing.Size(187, 76) Me.ucrPnlMeansAndVariance.TabIndex = 17 ' + 'ucrSaveModels + ' + Me.ucrSaveModels.Location = New System.Drawing.Point(9, 285) + Me.ucrSaveModels.Name = "ucrSaveModels" + Me.ucrSaveModels.Size = New System.Drawing.Size(291, 24) + Me.ucrSaveModels.TabIndex = 1 + ' + 'ucrChkConvertToVariate + ' + Me.ucrChkConvertToVariate.Checked = False + Me.ucrChkConvertToVariate.Location = New System.Drawing.Point(267, 92) + Me.ucrChkConvertToVariate.Name = "ucrChkConvertToVariate" + Me.ucrChkConvertToVariate.Size = New System.Drawing.Size(120, 20) + Me.ucrChkConvertToVariate.TabIndex = 4 + ' + 'ucrReceiverExplanatory + ' + Me.ucrReceiverExplanatory.frmParent = Me + Me.ucrReceiverExplanatory.Location = New System.Drawing.Point(267, 135) + Me.ucrReceiverExplanatory.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverExplanatory.Name = "ucrReceiverExplanatory" + Me.ucrReceiverExplanatory.Selector = Nothing + Me.ucrReceiverExplanatory.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverExplanatory.strNcFilePath = "" + Me.ucrReceiverExplanatory.TabIndex = 22 + Me.ucrReceiverExplanatory.ucrSelector = Nothing + ' + 'ucrReceiverResponse + ' + Me.ucrReceiverResponse.frmParent = Me + Me.ucrReceiverResponse.Location = New System.Drawing.Point(267, 69) + Me.ucrReceiverResponse.Margin = New System.Windows.Forms.Padding(0) + Me.ucrReceiverResponse.Name = "ucrReceiverResponse" + Me.ucrReceiverResponse.Selector = Nothing + Me.ucrReceiverResponse.Size = New System.Drawing.Size(120, 20) + Me.ucrReceiverResponse.strNcFilePath = "" + Me.ucrReceiverResponse.TabIndex = 4 + Me.ucrReceiverResponse.ucrSelector = Nothing + ' + 'ucrSelectorSimpleReg + ' + Me.ucrSelectorSimpleReg.bShowHiddenColumns = False + Me.ucrSelectorSimpleReg.bUseCurrentFilter = True + Me.ucrSelectorSimpleReg.Location = New System.Drawing.Point(10, 37) + Me.ucrSelectorSimpleReg.Margin = New System.Windows.Forms.Padding(0) + Me.ucrSelectorSimpleReg.Name = "ucrSelectorSimpleReg" + Me.ucrSelectorSimpleReg.Size = New System.Drawing.Size(226, 186) + Me.ucrSelectorSimpleReg.TabIndex = 2 + ' + 'ucrChkFunction + ' + Me.ucrChkFunction.Checked = False + Me.ucrChkFunction.Location = New System.Drawing.Point(489, 86) + Me.ucrChkFunction.Name = "ucrChkFunction" + Me.ucrChkFunction.Size = New System.Drawing.Size(100, 20) + Me.ucrChkFunction.TabIndex = 0 + ' + 'ucrPnlModelType + ' + Me.ucrPnlModelType.Location = New System.Drawing.Point(143, -5) + Me.ucrPnlModelType.Name = "ucrPnlModelType" + Me.ucrPnlModelType.Size = New System.Drawing.Size(219, 54) + Me.ucrPnlModelType.TabIndex = 3 + ' + 'ucrModelPreview + ' + Me.ucrModelPreview.AddQuotesIfUnrecognised = True + Me.ucrModelPreview.IsMultiline = False + Me.ucrModelPreview.IsReadOnly = False + Me.ucrModelPreview.Location = New System.Drawing.Point(96, 258) + Me.ucrModelPreview.Name = "ucrModelPreview" + Me.ucrModelPreview.Size = New System.Drawing.Size(204, 21) + Me.ucrModelPreview.TabIndex = 23 + ' + 'ucrDistributionChoice + ' + Me.ucrDistributionChoice.Location = New System.Drawing.Point(9, 226) + Me.ucrDistributionChoice.Name = "ucrDistributionChoice" + Me.ucrDistributionChoice.Size = New System.Drawing.Size(208, 27) + Me.ucrDistributionChoice.TabIndex = 24 + ' + 'ucrBase + ' + Me.ucrBase.Location = New System.Drawing.Point(9, 317) + Me.ucrBase.Name = "ucrBase" + Me.ucrBase.Size = New System.Drawing.Size(406, 54) + Me.ucrBase.TabIndex = 17 + ' 'dlgRegressionSimple ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index 58ff793b8f8..fea1e1854f8 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -16,10 +16,11 @@ Imports instat Imports instat.Translations + Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True Public clsModel, clsFormulaOperator, clsRGraphicsOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator - Public clsRPoisson, clsRggplotFunction, clsRLeverage, clsRWriteLeverage, clsRResiduals, clsRStdResiduals, clsRWriteResiduals, clsRWriteStdResiduals, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsRConvert, clsFamilyFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsLM, clsLMOrGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsTFunc, clsRLength As New RFunction + Public clsRPoisson, clsRggplotFunction, clsRLeverage, clsRWriteLeverage, clsRResiduals, clsRStdResiduals, clsRWriteResiduals, clsRWriteStdResiduals, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsAsNumeric, clsFamilyFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsLM, clsLMOrGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsTFunc, clsRLength As New RFunction Private bRCodeSet As Boolean Private Sub ucrFamily_EnabledChanged(sender As Object, e As EventArgs) Handles ucrDistributionChoice.EnabledChanged @@ -46,6 +47,9 @@ Public Class dlgRegressionSimple End Sub Private Sub InitialiseDialog() + 'temp disabled until implemented + rdoTwoSample.Enabled = False + ucrBase.iHelpTopicID = 366 ucrBase.clsRsyntax.iCallType = 2 @@ -68,7 +72,8 @@ Public Class dlgRegressionSimple ucrSelectorSimpleReg.SetParameter(New RParameter("data", 0)) ucrSelectorSimpleReg.SetParameterIsrfunction() - ucrReceiverResponse.SetParameter(New RParameter("y", 0)) + 'The main parameter will be in the as.numeric() function since it's always present there + ucrReceiverResponse.SetParameter(New RParameter("x", 0)) ucrReceiverResponse.Selector = ucrSelectorSimpleReg ucrReceiverResponse.SetParameterIsString() ucrReceiverResponse.bWithQuotes = False @@ -78,13 +83,16 @@ Public Class dlgRegressionSimple ucrReceiverExplanatory.SetParameterIsString() ucrReceiverExplanatory.bWithQuotes = False - ucrChkConvertToVariate.SetText("Convert to Variate") + ucrChkConvertToVariate.SetText("Convert to Numeric") + ucrChkConvertToVariate.AddParameterIsRFunctionCondition(True, "y", True) + ucrChkConvertToVariate.AddParameterIsRFunctionCondition(False, "y", False) ucrSaveModels.SetPrefix("two_var") ucrSaveModels.SetSaveTypeAsModel() ucrSaveModels.SetDataFrameSelector(ucrSelectorSimpleReg.ucrAvailableDataFrames) ucrSaveModels.SetCheckBoxText("Save Model") ucrSaveModels.SetIsComboBox() + ucrSaveModels.SetAssignToIfUncheckedValue("last_model") 'ucrPnlMeansAndVariance.AddRadioButton(rdoCompareMeans) 'ucrPnlMeansAndVariance.AddRadioButton(rdoCompareVariance) @@ -130,7 +138,7 @@ Public Class dlgRegressionSimple clsLM = New RFunction clsGLM = New RFunction - clsRConvert = New RFunction + clsAsNumeric = New RFunction clsFamilyFunction = New RFunction clsRTTest = New RFunction clsRPoisson = New RFunction @@ -168,7 +176,7 @@ Public Class dlgRegressionSimple clsFormulaOperator = clsRegressionDefaults.clsDefaultFormulaOperator.Clone clsRGraphicsOperator.iCallType = 3 - clsLM = clsRegressionDefaults.clsDefaultRLmFunction.Clone + clsLM = clsRegressionDefaults.clsDefaultLmFunction.Clone clsLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) clsGLM = clsRegressionDefaults.clsDefaultGlmFunction.Clone @@ -177,14 +185,14 @@ Public Class dlgRegressionSimple 'Residual Plots clsRResidualPlots = clsRegressionDefaults.clsDefaultRResidualPlots.Clone - clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsLmOrGLM) + clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsLMOrGLM) clsRgeom_point = clsRegressionDefaults.clsDefaultRgeom_pointFunction.Clone clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point, iPosition:=1) clsRaovFunction.SetPackageName("stats") clsRaovFunction.SetRCommand("anova") - clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) + clsRaovFunction.AddParameter("", clsRFunctionParameter:=clsLMOrGLM) clsRaovFunction.iCallType = 2 'FitModel @@ -192,32 +200,32 @@ Public Class dlgRegressionSimple clsRggplotFunction.AddParameter("type", Chr(34) & "conditional" & Chr(34)) clsRggplotFunction.AddParameter("scale", Chr(34) & "linear" & Chr(34)) clsRggplotFunction.AddParameter("alpha", 0.05) - clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsLmOrGLM) + clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsLMOrGLM) clsRggplotFunction.iCallType = 3 'Model clsRModelsFunction = clsRegressionDefaults.clsDefaultModel.Clone - clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) + clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsLMOrGLM) clsRModelsFunction.iCallType = 2 'Summary clsRSummaryFunction = clsRegressionDefaults.clsDefaultSummary.Clone - clsRSummaryFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) + clsRSummaryFunction.AddParameter("", clsRFunctionParameter:=clsLMOrGLM) clsRSummaryFunction.iCallType = 2 'ANOVA clsRanovaFunction = clsRegressionDefaults.clsDefaultRanovaFunction.Clone - clsRanovaFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) + clsRanovaFunction.AddParameter("", clsRFunctionParameter:=clsLMOrGLM) clsRanovaFunction.iCallType = 2 'Confidence Interval clsRConfint = clsRegressionDefaults.clsDefaultRConfinterval.Clone - clsRConfint.AddParameter("object", clsRFunctionParameter:=clsLmOrGLM) + clsRConfint.AddParameter("object", clsRFunctionParameter:=clsLMOrGLM) clsRConfint.iCallType = 2 'Anova + Pvalue clsRestpvalFunction = clsRegressionDefaults.clsDefaultRaovPValueFunction.Clone - clsRestpvalFunction.AddParameter("", clsRFunctionParameter:=clsLmOrGLM) + clsRestpvalFunction.AddParameter("", clsRFunctionParameter:=clsLMOrGLM) ' clsRaovpvalFunction.AddParameter("", clsRFunctionParameter:=clsRLmOrGLM) clsRestpvalFunction.iCallType = 2 @@ -241,8 +249,7 @@ Public Class dlgRegressionSimple clsRWriteLeverage.SetAssignTo(sdgSimpleRegOptions.ucrSaveLeverageColumnName.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempColumn:=sdgSimpleRegOptions.ucrSaveLeverageColumnName.GetText, bAssignToIsPrefix:=True) 'clsRWriteLeverage.iCallType = 3 - - clsRConvert.SetRCommand("as.numeric") + clsAsNumeric.SetRCommand("as.numeric") clsFamilyFunction = ucrDistributionChoice.clsCurrRFunction 'clsFamilyFunction.SetRCommand(ucrDistributionChoice.clsCurrDistribution.strGLMFunctionName) @@ -284,16 +291,15 @@ Public Class dlgRegressionSimple Private Sub SetRCodeForControls(bReset) bRCodeSet = False + 'General case controls ucrSelectorSimpleReg.AddAdditionalCodeParameterPair(clsGLM, ucrSelectorSimpleReg.GetParameter(), 1) ucrSaveModels.AddAdditionalRCode(clsGLM, 1) - - ucrReceiverResponse.SetRCode(clsFormulaOperator, bReset) + ucrReceiverResponse.SetRCode(clsAsNumeric, bReset) ucrReceiverExplanatory.SetRCode(clsFormulaOperator, bReset) - ucrPnlModelType.SetRCode(clsLmOrGLM, bReset) - + ucrPnlModelType.SetRCode(clsLMOrGLM, bReset) ucrSelectorSimpleReg.SetRCode(clsLM, bReset) - + ucrChkConvertToVariate.SetRCode(clsFormulaOperator) ucrSaveModels.SetRCode(clsLM, bReset) ucrDistributionChoice.SetRCode(clsFamilyFunction, bReset) @@ -310,6 +316,8 @@ Public Class dlgRegressionSimple 'ucrNudCI.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("conf.int"), 1) 'ucrNudHypothesis.AddAdditionalCodeParameterPair(clsRPoisson, New RParameter("r"), 1) bRCodeSet = True + SetEnableDists() + ConvertToVariate() End Sub Private Sub UpdatePreview() @@ -347,7 +355,7 @@ Public Class dlgRegressionSimple Private Sub ucrChkFunction_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkFunction.ControlValueChanged If ucrChkFunction.Checked Then - sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsLmOrGLM, clsNewFormulaOperator:=clsFormulaOperator, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel) + sdgVariableTransformations.SetRCodeForControls(clsNewLMorGLM:=clsLMOrGLM, clsNewFormulaOperator:=clsFormulaOperator, bReset:=bResetSubDialog, clsRXVariableNew:=clsRXVariable, clsRYVariableNew:=clsRYVariable, clsRModelNew:=clsModel) sdgVariableTransformations.ShowDialog() ExplanatoryFunctionSelect() bResetSubDialog = False @@ -355,7 +363,7 @@ Public Class dlgRegressionSimple End Sub Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click - sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRGraphicsOperator:=clsRGraphicsOperator, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRgeom_point:=clsRgeom_point, clsNewRResidualPlots:=clsRResidualPlots, clsNewRggplotFunction:=clsRggplotFunction, clsNewRConfint:=clsRConfint, clsNewRWriteResiduals:=clsRWriteResiduals, clsNewRWriteStdResiduals:=clsRWriteStdResiduals, clsNewRWriteLeverage:=clsRWriteLeverage, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsLmOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) + sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRGraphicsOperator:=clsRGraphicsOperator, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRgeom_point:=clsRgeom_point, clsNewRResidualPlots:=clsRResidualPlots, clsNewRggplotFunction:=clsRggplotFunction, clsNewRConfint:=clsRConfint, clsNewRWriteResiduals:=clsRWriteResiduals, clsNewRWriteStdResiduals:=clsRWriteStdResiduals, clsNewRWriteLeverage:=clsRWriteLeverage, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsLMOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) bResetOptionsSubDialog = False sdgSimpleRegOptions.ShowDialog() End Sub @@ -367,10 +375,6 @@ Public Class dlgRegressionSimple SetEnableDists() End Sub - Private Sub ucrSelectorSimpleReg_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrSelectorSimpleReg.ControlValueChanged - ConvertToVariate() - End Sub - Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click sdgModelOptions.ShowDialog() ucrDistributionChoice.ucrInputDistributions.cboInput.SelectedIndex = ucrDistributionChoice.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) @@ -431,7 +435,6 @@ Public Class dlgRegressionSimple clsRKruskalTest.AddParameter("", clsROperatorParameter:=clsModel) End Sub - Private Sub SetBinomTest() Dim clsyFunc, clsnFunc As New RFunction clsRBinomial.SetRCommand("mosaic") @@ -585,22 +588,31 @@ Public Class dlgRegressionSimple End Sub Private Sub TestOKEnabled() - If Not ucrReceiverResponse.IsEmpty() AndAlso Not ucrReceiverExplanatory.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then - 'If rdoSpecific.Checked AndAlso (ucrFamily.clsCurrDistribution.strNameTag = "Poisson" OrElse ucrFamily.clsCurrDistribution.strNameTag = "Binomial") AndAlso Not (ucrLevel1.IsEmpty OrElse ucrLevel2.IsEmpty) Then - ' ucrBase.OKEnabled(True) - 'Else - ' ucrBase.OKEnabled(False) - 'End If - 'If rdoGeneralCase.Checked Then - ' ucrBase.clsRsyntax.AddParameter("formula", clsROperatorParameter:=clsModel) - 'End If - ucrBase.OKEnabled(True) + If rdoGeneralCase.Checked Then + If Not ucrReceiverResponse.IsEmpty() AndAlso Not ucrReceiverExplanatory.IsEmpty() AndAlso ucrSaveModels.IsComplete AndAlso Not ucrDistributionChoice.ucrInputDistributions.IsEmpty Then + ucrBase.OKEnabled(True) + Else + ucrBase.OKEnabled(False) + End If Else - ucrBase.OKEnabled(False) + 'TODO End If - 'If Not ucrResponse.IsEmpty() Then + 'If Not ucrReceiverResponse.IsEmpty() AndAlso Not ucrReceiverExplanatory.IsEmpty() AndAlso (ucrSaveModels.IsComplete) Then + ' 'If rdoSpecific.Checked AndAlso (ucrFamily.clsCurrDistribution.strNameTag = "Poisson" OrElse ucrFamily.clsCurrDistribution.strNameTag = "Binomial") AndAlso Not (ucrLevel1.IsEmpty OrElse ucrLevel2.IsEmpty) Then + ' ' ucrBase.OKEnabled(True) + ' 'Else + ' ' ucrBase.OKEnabled(False) + ' 'End If + ' 'If rdoGeneralCase.Checked Then + ' ' ucrBase.clsRsyntax.AddParameter("formula", clsROperatorParameter:=clsModel) + ' 'End If ' ucrBase.OKEnabled(True) + 'Else + ' ucrBase.OKEnabled(False) 'End If + ''If Not ucrResponse.IsEmpty() Then + '' ucrBase.OKEnabled(True) + ''End If End Sub Private Sub ucrSelectorSimpleReg_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSelectorSimpleReg.ControlValueChanged @@ -618,25 +630,26 @@ Public Class dlgRegressionSimple Else ucrChkConvertToVariate.Visible = True End If - sdgModelOptions.ucrFamily.RecieverDatatype(ucrDistributionChoice.strDataType) + 'sdgModelOptions.ucrFamily.RecieverDatatype(ucrDistributionChoice.strDataType) If ucrChkConvertToVariate.Checked Then - - clsRConvert.AddParameter("x", ucrReceiverResponse.GetVariableNames(bWithQuotes:=False)) - clsLMOrGLM.AddParameter("x", clsRFunctionParameter:=clsRConvert) - clsLMOrGLM.AddParameter("x", clsRFunctionParameter:=ucrReceiverExplanatory.GetVariables()) + clsFormulaOperator.AddParameter("y", clsRFunctionParameter:=clsAsNumeric, iPosition:=0) ucrDistributionChoice.RecieverDatatype("numeric") Else + clsFormulaOperator.AddParameter("y", ucrReceiverResponse.GetVariableNames(False), iPosition:=0) 'clsModel.AddParameter(iPosition:=0, clsRFunctionParameter:=ucrResponse.GetVariables()) ' clsModel.AddParameter(clsRFunctionParameter:=ucrExplanatory.GetVariables()) 'clsModel.AddParameter(iPosition:=0, strParameterValue:=ucrResponse.GetVariableNames(bWithQuotes:=False)) ucrDistributionChoice.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrReceiverResponse.GetVariableNames(bWithQuotes:=False)) End If Else + ucrChkConvertToVariate.Visible = False If ucrDistributionChoice.lstCurrentDistributions.Count = 0 OrElse ucrReceiverResponse.IsEmpty() Then ucrDistributionChoice.ucrInputDistributions.SetName("") + ucrDistributionChoice.Enabled = False cmdModelOptions.Enabled = False Else cmdModelOptions.Enabled = True + ucrDistributionChoice.Enabled = True End If End If Else @@ -644,6 +657,8 @@ Public Class dlgRegressionSimple ucrDistributionChoice.RecieverDatatype(ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrReceiverResponse.GetVariableNames(bWithQuotes:=False)) End If End If + UpdatePreview() + TestOKEnabled() End If End Sub @@ -653,7 +668,7 @@ Public Class dlgRegressionSimple End If End Sub - Private Sub ucrchkConvertToVariate_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkConvertToVariate.ControlValueChanged + Private Sub ucrChkConvertToVariate_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkConvertToVariate.ControlValueChanged SetBaseFunction() ConvertToVariate() End Sub @@ -779,7 +794,6 @@ Public Class dlgRegressionSimple Private Sub ucrFamily_EnabledChanged() Handles ucrDistributionChoice.EnabledChanged DataTypeAccepted() - SetEnableDists() End Sub Private Sub Controls_ControlContentsChanged(ucrChangedControl As ucrCore) Handles ucrReceiverResponse.ControlContentsChanged, ucrPnlModelType.ControlContentsChanged, ucrReceiverExplanatory.ControlContentsChanged From 4c03bf50499c2756dd53b556808cc6c9c8608af6 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Wed, 28 Jun 2017 13:20:02 +0100 Subject: [PATCH 195/201] Create CNAME --- docs/CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/CNAME diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 00000000000..68887b1cb58 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +r-instat.org \ No newline at end of file From 41385b6ef016923eb4851537ac928580df14f58b Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Wed, 28 Jun 2017 13:35:13 +0100 Subject: [PATCH 196/201] created index.html --- docs/index.html | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docs/index.html diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000000..e69921b19a5 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,12 @@ + + + + + + R-Instat + + + +

R-Instat

+ + From f159161aa4667ad1983a8de12156de72bf2a9381 Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Wed, 28 Jun 2017 13:35:43 +0100 Subject: [PATCH 197/201] deleted foo.txt --- docs/foo.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 docs/foo.txt diff --git a/docs/foo.txt b/docs/foo.txt deleted file mode 100644 index 8b137891791..00000000000 --- a/docs/foo.txt +++ /dev/null @@ -1 +0,0 @@ - From 45c4741a908e6601dbdd0708635de805357dd4f9 Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Wed, 28 Jun 2017 16:36:36 +0300 Subject: [PATCH 198/201] Adding site files --- docs/.gitignore | 2 + docs/About.html | 112 + docs/Contact.html | 127 + docs/Developers.html | 115 + docs/Documentation.html | 112 + docs/Download.html | 112 + docs/Forum.html | 112 + docs/LICENSE | 22 + docs/README.md | 27 + docs/ReleaseNotes.html | 113 + docs/css/creative.css | 426 + docs/css/creative.min.css | 5 + docs/faq.html | 112 + docs/gulpfile.js | 98 + docs/img/header.jpg | Bin 0 -> 125976 bytes docs/img/portfolio/fullsize/1.jpg | Bin 0 -> 63788 bytes docs/img/portfolio/fullsize/2.jpg | Bin 0 -> 48101 bytes docs/img/portfolio/fullsize/3.jpg | Bin 0 -> 48228 bytes docs/img/portfolio/fullsize/4.jpg | Bin 0 -> 49055 bytes docs/img/portfolio/fullsize/5.jpg | Bin 0 -> 62334 bytes docs/img/portfolio/fullsize/6.jpg | Bin 0 -> 53428 bytes docs/img/portfolio/thumbnails/1.jpg | Bin 0 -> 63788 bytes docs/img/portfolio/thumbnails/2.jpg | Bin 0 -> 48101 bytes docs/img/portfolio/thumbnails/3.jpg | Bin 0 -> 48228 bytes docs/img/portfolio/thumbnails/4.jpg | Bin 0 -> 49055 bytes docs/img/portfolio/thumbnails/5.jpg | Bin 0 -> 62334 bytes docs/img/portfolio/thumbnails/6.jpg | Bin 0 -> 53428 bytes docs/index.html | 115 +- docs/js/creative.js | 64 + docs/js/creative.min.js | 6 + docs/less/creative.less | 361 + docs/less/mixins.less | 63 + docs/less/variables.less | 12 + docs/package.json | 29 + docs/vendor/bootstrap/css/bootstrap.css | 6757 ++++++++++ docs/vendor/bootstrap/css/bootstrap.min.css | 6 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes docs/vendor/bootstrap/js/bootstrap.js | 2377 ++++ docs/vendor/bootstrap/js/bootstrap.min.js | 7 + docs/vendor/font-awesome/css/font-awesome.css | 2199 +++ .../font-awesome/css/font-awesome.min.css | 4 + .../vendor/font-awesome/fonts/FontAwesome.otf | Bin 0 -> 124988 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 76518 bytes .../fonts/fontawesome-webfont.svg | 685 + .../fonts/fontawesome-webfont.ttf | Bin 0 -> 152796 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 90412 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 71896 bytes docs/vendor/font-awesome/less/animated.less | 34 + .../font-awesome/less/bordered-pulled.less | 25 + docs/vendor/font-awesome/less/core.less | 12 + .../vendor/font-awesome/less/fixed-width.less | 6 + .../font-awesome/less/font-awesome.less | 18 + docs/vendor/font-awesome/less/icons.less | 733 + docs/vendor/font-awesome/less/larger.less | 13 + docs/vendor/font-awesome/less/list.less | 19 + docs/vendor/font-awesome/less/mixins.less | 60 + docs/vendor/font-awesome/less/path.less | 15 + .../font-awesome/less/rotated-flipped.less | 20 + .../font-awesome/less/screen-reader.less | 5 + docs/vendor/font-awesome/less/stacked.less | 20 + docs/vendor/font-awesome/less/variables.less | 744 ++ docs/vendor/font-awesome/scss/_animated.scss | 34 + .../font-awesome/scss/_bordered-pulled.scss | 25 + docs/vendor/font-awesome/scss/_core.scss | 12 + .../font-awesome/scss/_fixed-width.scss | 6 + docs/vendor/font-awesome/scss/_icons.scss | 733 + docs/vendor/font-awesome/scss/_larger.scss | 13 + docs/vendor/font-awesome/scss/_list.scss | 19 + docs/vendor/font-awesome/scss/_mixins.scss | 60 + docs/vendor/font-awesome/scss/_path.scss | 15 + .../font-awesome/scss/_rotated-flipped.scss | 20 + .../font-awesome/scss/_screen-reader.scss | 5 + docs/vendor/font-awesome/scss/_stacked.scss | 20 + docs/vendor/font-awesome/scss/_variables.scss | 744 ++ .../font-awesome/scss/font-awesome.scss | 18 + docs/vendor/jquery/jquery.js | 11008 ++++++++++++++++ docs/vendor/jquery/jquery.min.js | 5 + .../magnific-popup/jquery.magnific-popup.js | 1860 +++ .../jquery.magnific-popup.min.js | 4 + docs/vendor/magnific-popup/magnific-popup.css | 351 + docs/vendor/scrollreveal/scrollreveal.js | 947 ++ docs/vendor/scrollreveal/scrollreveal.min.js | 1 + 86 files changed, 32086 insertions(+), 6 deletions(-) create mode 100644 docs/.gitignore create mode 100644 docs/About.html create mode 100644 docs/Contact.html create mode 100644 docs/Developers.html create mode 100644 docs/Documentation.html create mode 100644 docs/Download.html create mode 100644 docs/Forum.html create mode 100644 docs/LICENSE create mode 100644 docs/README.md create mode 100644 docs/ReleaseNotes.html create mode 100644 docs/css/creative.css create mode 100644 docs/css/creative.min.css create mode 100644 docs/faq.html create mode 100644 docs/gulpfile.js create mode 100644 docs/img/header.jpg create mode 100644 docs/img/portfolio/fullsize/1.jpg create mode 100644 docs/img/portfolio/fullsize/2.jpg create mode 100644 docs/img/portfolio/fullsize/3.jpg create mode 100644 docs/img/portfolio/fullsize/4.jpg create mode 100644 docs/img/portfolio/fullsize/5.jpg create mode 100644 docs/img/portfolio/fullsize/6.jpg create mode 100644 docs/img/portfolio/thumbnails/1.jpg create mode 100644 docs/img/portfolio/thumbnails/2.jpg create mode 100644 docs/img/portfolio/thumbnails/3.jpg create mode 100644 docs/img/portfolio/thumbnails/4.jpg create mode 100644 docs/img/portfolio/thumbnails/5.jpg create mode 100644 docs/img/portfolio/thumbnails/6.jpg create mode 100644 docs/js/creative.js create mode 100644 docs/js/creative.min.js create mode 100644 docs/less/creative.less create mode 100644 docs/less/mixins.less create mode 100644 docs/less/variables.less create mode 100644 docs/package.json create mode 100644 docs/vendor/bootstrap/css/bootstrap.css create mode 100644 docs/vendor/bootstrap/css/bootstrap.min.css create mode 100644 docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 docs/vendor/bootstrap/js/bootstrap.js create mode 100644 docs/vendor/bootstrap/js/bootstrap.min.js create mode 100644 docs/vendor/font-awesome/css/font-awesome.css create mode 100644 docs/vendor/font-awesome/css/font-awesome.min.css create mode 100644 docs/vendor/font-awesome/fonts/FontAwesome.otf create mode 100644 docs/vendor/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 docs/vendor/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 docs/vendor/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 docs/vendor/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 docs/vendor/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 docs/vendor/font-awesome/less/animated.less create mode 100644 docs/vendor/font-awesome/less/bordered-pulled.less create mode 100644 docs/vendor/font-awesome/less/core.less create mode 100644 docs/vendor/font-awesome/less/fixed-width.less create mode 100644 docs/vendor/font-awesome/less/font-awesome.less create mode 100644 docs/vendor/font-awesome/less/icons.less create mode 100644 docs/vendor/font-awesome/less/larger.less create mode 100644 docs/vendor/font-awesome/less/list.less create mode 100644 docs/vendor/font-awesome/less/mixins.less create mode 100644 docs/vendor/font-awesome/less/path.less create mode 100644 docs/vendor/font-awesome/less/rotated-flipped.less create mode 100644 docs/vendor/font-awesome/less/screen-reader.less create mode 100644 docs/vendor/font-awesome/less/stacked.less create mode 100644 docs/vendor/font-awesome/less/variables.less create mode 100644 docs/vendor/font-awesome/scss/_animated.scss create mode 100644 docs/vendor/font-awesome/scss/_bordered-pulled.scss create mode 100644 docs/vendor/font-awesome/scss/_core.scss create mode 100644 docs/vendor/font-awesome/scss/_fixed-width.scss create mode 100644 docs/vendor/font-awesome/scss/_icons.scss create mode 100644 docs/vendor/font-awesome/scss/_larger.scss create mode 100644 docs/vendor/font-awesome/scss/_list.scss create mode 100644 docs/vendor/font-awesome/scss/_mixins.scss create mode 100644 docs/vendor/font-awesome/scss/_path.scss create mode 100644 docs/vendor/font-awesome/scss/_rotated-flipped.scss create mode 100644 docs/vendor/font-awesome/scss/_screen-reader.scss create mode 100644 docs/vendor/font-awesome/scss/_stacked.scss create mode 100644 docs/vendor/font-awesome/scss/_variables.scss create mode 100644 docs/vendor/font-awesome/scss/font-awesome.scss create mode 100644 docs/vendor/jquery/jquery.js create mode 100644 docs/vendor/jquery/jquery.min.js create mode 100644 docs/vendor/magnific-popup/jquery.magnific-popup.js create mode 100644 docs/vendor/magnific-popup/jquery.magnific-popup.min.js create mode 100644 docs/vendor/magnific-popup/magnific-popup.css create mode 100644 docs/vendor/scrollreveal/scrollreveal.js create mode 100644 docs/vendor/scrollreveal/scrollreveal.min.js diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000000..bb93d680af6 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +node_modules +bower_components \ No newline at end of file diff --git a/docs/About.html b/docs/About.html new file mode 100644 index 00000000000..db15d9e9ff3 --- /dev/null +++ b/docs/About.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + R-Instat + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

What is R-Instat

+
+

R-Instat is an R based new statistics software developed in Africa for use all around the world.

+ +
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/Contact.html b/docs/Contact.html new file mode 100644 index 00000000000..5f21e6258f9 --- /dev/null +++ b/docs/Contact.html @@ -0,0 +1,127 @@ + + + + + + + + + + + + + R-Instat + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Let's Get In Touch!

+
+

You could reach R-Instat team via

+
+
+ +

0728508241

+
+

Could we have a form instead of this????

+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + diff --git a/docs/Developers.html b/docs/Developers.html new file mode 100644 index 00000000000..89e90b6886f --- /dev/null +++ b/docs/Developers.html @@ -0,0 +1,115 @@ + + + + + + + + + + + + R-Instat + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

R-Instat Developers

+
+

Text Goes here. A table with images is prefered


+

+ table will go here +

+
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/Documentation.html b/docs/Documentation.html new file mode 100644 index 00000000000..9f20c39b439 --- /dev/null +++ b/docs/Documentation.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + R-Instat + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

R-Instat Documentation

+
+

Text goes here

+ +
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/Download.html b/docs/Download.html new file mode 100644 index 00000000000..2460fbb50ed --- /dev/null +++ b/docs/Download.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + R-Instat + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Downloading R-Instat

+
+

Text Goes here

+ +
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/Forum.html b/docs/Forum.html new file mode 100644 index 00000000000..42095c1f94b --- /dev/null +++ b/docs/Forum.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + R-Instat + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

R-Instat Forum

+
+

Forum questions will be created here

+ +
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/LICENSE b/docs/LICENSE new file mode 100644 index 00000000000..07a6d176ccb --- /dev/null +++ b/docs/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2013-2016 Blackrock Digital LLC. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000000..ed36df29797 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,27 @@ +# [Start Bootstrap](http://startbootstrap.com/) - [Creative](http://startbootstrap.com/template-overviews/creative/) + +[Creative](http://startbootstrap.com/template-overviews/creative/) is a one page creative theme for [Bootstrap](http://getbootstrap.com/) created by [Start Bootstrap](http://startbootstrap.com/). + +## Getting Started + +To begin using this template, choose one of the following options to get started: +* [Download the latest release on Start Bootstrap](http://startbootstrap.com/template-overviews/creative/) +* Clone the repo: `git clone https://github.com/BlackrockDigital/startbootstrap-creative.git` +* Fork the repo + +## Bugs and Issues + +Have a bug or an issue with this template? [Open a new issue](https://github.com/BlackrockDigital/startbootstrap-creative/issues) here on GitHub or leave a comment on the [template overview page at Start Bootstrap](http://startbootstrap.com/template-overviews/creative/). + +## Creator + +Start Bootstrap was created by and is maintained by **[David Miller](http://davidmiller.io/)**, Owner of [Blackrock Digital](http://blackrockdigital.io/). + +* https://twitter.com/davidmillerskt +* https://github.com/davidtmiller + +Start Bootstrap is based on the [Bootstrap](http://getbootstrap.com/) framework created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thorton](https://twitter.com/fat). + +## Copyright and License + +Copyright 2013-2016 Blackrock Digital LLC. Code released under the [MIT](https://github.com/BlackrockDigital/startbootstrap-creative/blob/gh-pages/LICENSE) license. \ No newline at end of file diff --git a/docs/ReleaseNotes.html b/docs/ReleaseNotes.html new file mode 100644 index 00000000000..8a738d39883 --- /dev/null +++ b/docs/ReleaseNotes.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + R-Instat + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

R-Instat Release Notes

+
+

Hext goes here

+ +
+
+
+ + + + + + + + + + + + + + + + + + diff --git a/docs/css/creative.css b/docs/css/creative.css new file mode 100644 index 00000000000..c37d19cbbb8 --- /dev/null +++ b/docs/css/creative.css @@ -0,0 +1,426 @@ +/*! + * Start Bootstrap - Creative v3.3.7+1 (http://startbootstrap.com/template-overviews/creative) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */ +html, +body { + height: 100%; + width: 100%; +} +body { + font-family: 'Merriweather', 'Helvetica Neue', Arial, sans-serif; +} +hr { + border-color: #F05F40; + border-width: 3px; + max-width: 50px; +} +hr.light { + border-color: white; +} +a { + -webkit-transition: all 0.35s; + -moz-transition: all 0.35s; + transition: all 0.35s; + color: #F05F40; +} +a:hover, +a:focus { + color: #eb3812; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif; +} +p { + font-size: 16px; + line-height: 1.5; + margin-bottom: 20px; +} +.bg-primary { + background-color: #F05F40; + height: 100% + position: relative; + text-align: center; + padding: 100px 15px 100px; + width: 100%; + height: 100% +} +.bg-dark { + background-color: #222222; + color: white; + height: 100%; +} +.text-faded { + color: rgba(255, 255, 255, 0.7); +} +section { + padding: 100px 0; + height: 100%; + width: 100%; +} +aside { + padding: 50px 0; +} +.no-padding { + padding: 0; +} +.navbar-default { + background-color: white; + border-color: rgba(34, 34, 34, 0.05); + font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif; + -webkit-transition: all 0.35s; + -moz-transition: all 0.35s; + transition: all 0.35s; +} +.navbar-default .navbar-header .navbar-brand { + color: #F05F40; + font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif; + font-weight: 700; + text-transform: uppercase; +} +.navbar-default .navbar-header .navbar-brand:hover, +.navbar-default .navbar-header .navbar-brand:focus { + color: #eb3812; +} +.navbar-default .navbar-header .navbar-toggle { + font-weight: 700; + font-size: 12px; + color: #222222; + text-transform: uppercase; +} +.navbar-default .nav > li > a, +.navbar-default .nav > li > a:focus { + text-transform: uppercase; + font-weight: 700; + font-size: 13px; + color: #222222; +} +.navbar-default .nav > li > a:hover, +.navbar-default .nav > li > a:focus:hover { + color: #F05F40; +} +.navbar-default .nav > li.active > a, +.navbar-default .nav > li.active > a:focus { + color: #F05F40 !important; + background-color: transparent; +} +.navbar-default .nav > li.active > a:hover, +.navbar-default .nav > li.active > a:focus:hover { + background-color: transparent; +} +@media (min-width: 768px) { + .navbar-default { + background-color: transparent; + border-color: rgba(255, 255, 255, 0.3); + } + .navbar-default .navbar-header .navbar-brand { + color: rgba(255, 255, 255, 0.7); + } + .navbar-default .navbar-header .navbar-brand:hover, + .navbar-default .navbar-header .navbar-brand:focus { + color: white; + } + .navbar-default .nav > li > a, + .navbar-default .nav > li > a:focus { + color: rgba(255, 255, 255, 0.7); + } + .navbar-default .nav > li > a:hover, + .navbar-default .nav > li > a:focus:hover { + color: white; + } + .navbar-default.affix { + background-color: white; + border-color: rgba(34, 34, 34, 0.05); + } + .navbar-default.affix .navbar-header .navbar-brand { + color: #F05F40; + font-size: 14px; + } + .navbar-default.affix .navbar-header .navbar-brand:hover, + .navbar-default.affix .navbar-header .navbar-brand:focus { + color: #eb3812; + } + .navbar-default.affix .nav > li > a, + .navbar-default.affix .nav > li > a:focus { + color: #222222; + } + .navbar-default.affix .nav > li > a:hover, + .navbar-default.affix .nav > li > a:focus:hover { + color: #F05F40; + } +} +header { + position: relative; + width: 100%; + height: 100% + min-height: auto; + -webkit-background-size: cover; + -moz-background-size: cover; + background-size: cover; + -o-background-size: cover; + background-position: center; + text-align: center; + color: white; +} +header .header-content { + position: relative; + text-align: center; + padding: 100px 15px 100px; + width: 100%; + height: 100% +} +header .header-content .header-content-inner h1 { + font-weight: 700; + text-transform: uppercase; + margin-top: 0; + margin-bottom: 0; + font-size: 30px; +} +header .header-content .header-content-inner hr { + margin: 30px auto; +} +header .header-content .header-content-inner p { + font-weight: 300; + color: rgba(255, 255, 255, 0.7); + font-size: 16px; + margin-bottom: 50px; +} +@media (min-width: 768px) { + header { + min-height: 100%; + } + header .header-content { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + padding: 0 50px; + } + header .header-content .header-content-inner { + max-width: 1000px; + margin-left: auto; + margin-right: auto; + } + header .header-content .header-content-inner h1 { + font-size: 50px; + } + header .header-content .header-content-inner p { + font-size: 18px; + max-width: 80%; + margin-left: auto; + margin-right: auto; + } +} +.section-heading { + margin-top: 0; +} +.service-box { + max-width: 400px; + margin: 50px auto 0; +} +@media (min-width: 992px) { + .service-box { + margin: 20px auto 0; + } +} +.service-box p { + margin-bottom: 0; +} +.portfolio-box { + position: relative; + display: block; + max-width: 650px; + margin: 0 auto; +} +.portfolio-box .portfolio-box-caption { + color: white; + opacity: 0; + display: block; + background: rgba(240, 95, 64, 0.9); + position: absolute; + bottom: 0; + text-align: center; + width: 100%; + height: 100%; + -webkit-transition: all 0.35s; + -moz-transition: all 0.35s; + transition: all 0.35s; +} +.portfolio-box .portfolio-box-caption .portfolio-box-caption-content { + width: 100%; + text-align: center; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-category, +.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-name { + font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif; + padding: 0 15px; +} +.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-category { + text-transform: uppercase; + font-weight: 600; + font-size: 14px; +} +.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-name { + font-size: 18px; +} +.portfolio-box:hover .portfolio-box-caption { + opacity: 1; +} +.portfolio-box:focus { + outline: none; +} +@media (min-width: 768px) { + .portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-category { + font-size: 16px; + } + .portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-name { + font-size: 22px; + } +} +.call-to-action h2 { + margin: 0 auto 20px; +} +.text-primary { + color: #F05F40; +} +.no-gutter > [class*='col-'] { + padding-right: 0; + padding-left: 0; +} +.btn-default { + color: #222222; + background-color: white; + border-color: white; + -webkit-transition: all 0.35s; + -moz-transition: all 0.35s; + transition: all 0.35s; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #222222; + background-color: #f2f2f2; + border-color: #ededed; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: white; + border-color: white; +} +.btn-default .badge { + color: white; + background-color: #222222; +} +.btn-primary { + color: white; + background-color: #F05F40; + border-color: #F05F40; + -webkit-transition: all 0.35s; + -moz-transition: all 0.35s; + transition: all 0.35s; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: white; + background-color: #ee4b28; + border-color: #ed431f; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #F05F40; + border-color: #F05F40; +} +.btn-primary .badge { + color: #F05F40; + background-color: white; +} +.btn { + font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif; + border: none; + border-radius: 300px; + font-weight: 700; + text-transform: uppercase; +} +.btn-xl { + padding: 15px 30px; +} +::-moz-selection { + color: white; + text-shadow: none; + background: #222222; +} +::selection { + color: white; + text-shadow: none; + background: #222222; +} +img::selection { + color: white; + background: transparent; +} +img::-moz-selection { + color: white; + background: transparent; +} +body { + webkit-tap-highlight-color: #222222; +} diff --git a/docs/css/creative.min.css b/docs/css/creative.min.css new file mode 100644 index 00000000000..e9517630725 --- /dev/null +++ b/docs/css/creative.min.css @@ -0,0 +1,5 @@ +/*! + * Start Bootstrap - Creative v3.3.7+1 (http://startbootstrap.com/template-overviews/creative) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */.navbar-default,a{-webkit-transition:all .35s;-moz-transition:all .35s}header,header .header-content{position:relative;width:100%;text-align:center}body,html{height:100%;width:100%}body{font-family:Merriweather,'Helvetica Neue',Arial,sans-serif;webkit-tap-highlight-color:#222}.btn,.navbar-default,.navbar-default .navbar-header .navbar-brand,h1,h2,h3,h4,h5,h6{font-family:'Open Sans','Helvetica Neue',Arial,sans-serif}hr{border-color:#F05F40;border-width:3px;max-width:50px}hr.light{border-color:#fff}a{transition:all .35s;color:#F05F40}a:focus,a:hover{color:#eb3812}p{font-size:16px;line-height:1.5;margin-bottom:20px}.bg-primary{background-color:#F05F40}.bg-dark{background-color:#222;color:#fff}.text-faded{color:rgba(255,255,255,.7)}section{padding:100px 0}aside{padding:50px 0}.no-padding{padding:0}.navbar-default{background-color:#fff;border-color:rgba(34,34,34,.05);transition:all .35s}.btn-default,.portfolio-box .portfolio-box-caption{-webkit-transition:all .35s;-moz-transition:all .35s}.navbar-default .navbar-header .navbar-brand{color:#F05F40;font-weight:700;text-transform:uppercase}.navbar-default .navbar-header .navbar-brand:focus,.navbar-default .navbar-header .navbar-brand:hover{color:#eb3812}.navbar-default .navbar-header .navbar-toggle{font-weight:700;font-size:12px;color:#222;text-transform:uppercase}.navbar-default .nav>li>a,.navbar-default .nav>li>a:focus{text-transform:uppercase;font-weight:700;font-size:13px;color:#222}.navbar-default .nav>li>a:focus:hover,.navbar-default .nav>li>a:hover{color:#F05F40}.navbar-default .nav>li.active>a,.navbar-default .nav>li.active>a:focus{color:#F05F40!important;background-color:transparent}.navbar-default .nav>li.active>a:focus:hover,.navbar-default .nav>li.active>a:hover{background-color:transparent}@media (min-width:768px){.navbar-default{background-color:transparent;border-color:rgba(255,255,255,.3)}.navbar-default .navbar-header .navbar-brand{color:rgba(255,255,255,.7)}.navbar-default .navbar-header .navbar-brand:focus,.navbar-default .navbar-header .navbar-brand:hover{color:#fff}.navbar-default .nav>li>a,.navbar-default .nav>li>a:focus{color:rgba(255,255,255,.7)}.navbar-default .nav>li>a:focus:hover,.navbar-default .nav>li>a:hover{color:#fff}.navbar-default.affix{background-color:#fff;border-color:rgba(34,34,34,.05)}.navbar-default.affix .navbar-header .navbar-brand{color:#F05F40;font-size:14px}.navbar-default.affix .navbar-header .navbar-brand:focus,.navbar-default.affix .navbar-header .navbar-brand:hover{color:#eb3812}.navbar-default.affix .nav>li>a,.navbar-default.affix .nav>li>a:focus{color:#222}.navbar-default.affix .nav>li>a:focus:hover,.navbar-default.affix .nav>li>a:hover{color:#F05F40}}header{min-height:auto;-webkit-background-size:cover;-moz-background-size:cover;background-size:cover;-o-background-size:cover;background-position:center;background-image:url(../img/header.jpg);color:#fff}header .header-content{padding:100px 15px}header .header-content .header-content-inner h1{font-weight:700;text-transform:uppercase;margin-top:0;margin-bottom:0;font-size:30px}header .header-content .header-content-inner hr{margin:30px auto}header .header-content .header-content-inner p{font-weight:300;color:rgba(255,255,255,.7);font-size:16px;margin-bottom:50px}@media (min-width:768px){header{min-height:100%}header .header-content{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);padding:0 50px}header .header-content .header-content-inner{max-width:1000px;margin-left:auto;margin-right:auto}header .header-content .header-content-inner h1{font-size:50px}header .header-content .header-content-inner p{font-size:18px;max-width:80%;margin-left:auto;margin-right:auto}}.section-heading{margin-top:0}.service-box{max-width:400px;margin:50px auto 0}@media (min-width:992px){.service-box{margin:20px auto 0}}.service-box p{margin-bottom:0}.portfolio-box{position:relative;display:block;max-width:650px;margin:0 auto}.portfolio-box .portfolio-box-caption{color:#fff;opacity:0;display:block;background:rgba(240,95,64,.9);position:absolute;bottom:0;text-align:center;width:100%;height:100%;transition:all .35s}.btn-default.active,.btn-default:active,.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-primary{background-image:none}.portfolio-box .portfolio-box-caption .portfolio-box-caption-content{width:100%;text-align:center;position:absolute;top:50%;transform:translateY(-50%)}.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-category,.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-name{font-family:'Open Sans','Helvetica Neue',Arial,sans-serif;padding:0 15px}.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-category{text-transform:uppercase;font-weight:600;font-size:14px}.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-name{font-size:18px}.portfolio-box:hover .portfolio-box-caption{opacity:1}.portfolio-box:focus{outline:0}@media (min-width:768px){.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-category{font-size:16px}.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-name{font-size:22px}}.call-to-action h2{margin:0 auto 20px}.text-primary{color:#F05F40}.no-gutter>[class*=col-]{padding-right:0;padding-left:0}.btn-default{color:#222;background-color:#fff;border-color:#fff;transition:all .35s}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#222;background-color:#f2f2f2;border-color:#ededed}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#fff}.btn-default .badge{color:#fff;background-color:#222}.btn-primary{color:#fff;background-color:#F05F40;border-color:#F05F40;-webkit-transition:all .35s;-moz-transition:all .35s;transition:all .35s}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#ee4b28;border-color:#ed431f}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#F05F40;border-color:#F05F40}.btn-primary .badge{color:#F05F40;background-color:#fff}.btn{border:none;border-radius:300px;font-weight:700;text-transform:uppercase}.btn-xl{padding:15px 30px}::-moz-selection{color:#fff;text-shadow:none;background:#222}::selection{color:#fff;text-shadow:none;background:#222}img::selection{color:#fff;background:0 0}img::-moz-selection{color:#fff;background:0 0} \ No newline at end of file diff --git a/docs/faq.html b/docs/faq.html new file mode 100644 index 00000000000..c7d90949f16 --- /dev/null +++ b/docs/faq.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + R-Instat + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

FAQs

+
+

Questions goes here

+ +
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/gulpfile.js b/docs/gulpfile.js new file mode 100644 index 00000000000..ecd77f06730 --- /dev/null +++ b/docs/gulpfile.js @@ -0,0 +1,98 @@ +var gulp = require('gulp'); +var less = require('gulp-less'); +var browserSync = require('browser-sync').create(); +var header = require('gulp-header'); +var cleanCSS = require('gulp-clean-css'); +var rename = require("gulp-rename"); +var uglify = require('gulp-uglify'); +var pkg = require('./package.json'); + +// Set the banner content +var banner = ['/*!\n', + ' * Start Bootstrap - <%= pkg.title %> v<%= pkg.version %> (<%= pkg.homepage %>)\n', + ' * Copyright 2013-' + (new Date()).getFullYear(), ' <%= pkg.author %>\n', + ' * Licensed under <%= pkg.license.type %> (<%= pkg.license.url %>)\n', + ' */\n', + '' +].join(''); + +// Compile LESS files from /less into /css +gulp.task('less', function() { + return gulp.src('less/creative.less') + .pipe(less()) + .pipe(header(banner, { pkg: pkg })) + .pipe(gulp.dest('css')) + .pipe(browserSync.reload({ + stream: true + })) +}); + +// Minify compiled CSS +gulp.task('minify-css', ['less'], function() { + return gulp.src('css/creative.css') + .pipe(cleanCSS({ compatibility: 'ie8' })) + .pipe(rename({ suffix: '.min' })) + .pipe(gulp.dest('css')) + .pipe(browserSync.reload({ + stream: true + })) +}); + +// Minify JS +gulp.task('minify-js', function() { + return gulp.src('js/creative.js') + .pipe(uglify()) + .pipe(header(banner, { pkg: pkg })) + .pipe(rename({ suffix: '.min' })) + .pipe(gulp.dest('js')) + .pipe(browserSync.reload({ + stream: true + })) +}); + +// Copy vendor libraries from /node_modules into /vendor +gulp.task('copy', function() { + gulp.src(['node_modules/bootstrap/dist/**/*', '!**/npm.js', '!**/bootstrap-theme.*', '!**/*.map']) + .pipe(gulp.dest('vendor/bootstrap')) + + gulp.src(['node_modules/jquery/dist/jquery.js', 'node_modules/jquery/dist/jquery.min.js']) + .pipe(gulp.dest('vendor/jquery')) + + gulp.src(['node_modules/magnific-popup/dist/*']) + .pipe(gulp.dest('vendor/magnific-popup')) + + gulp.src(['node_modules/scrollreveal/dist/*.js']) + .pipe(gulp.dest('vendor/scrollreveal')) + + gulp.src([ + 'node_modules/font-awesome/**', + '!node_modules/font-awesome/**/*.map', + '!node_modules/font-awesome/.npmignore', + '!node_modules/font-awesome/*.txt', + '!node_modules/font-awesome/*.md', + '!node_modules/font-awesome/*.json' + ]) + .pipe(gulp.dest('vendor/font-awesome')) +}) + +// Run everything +gulp.task('default', ['less', 'minify-css', 'minify-js', 'copy']); + +// Configure the browserSync task +gulp.task('browserSync', function() { + browserSync.init({ + server: { + baseDir: '' + }, + }) +}) + +// Dev task with browserSync +gulp.task('dev', ['browserSync', 'less', 'minify-css', 'minify-js'], function() { + gulp.watch('less/*.less', ['less']); + gulp.watch('css/*.css', ['minify-css']); + gulp.watch('js/*.js', ['minify-js']); + // Reloads the browser whenever HTML or JS files change + gulp.watch('*.html', browserSync.reload); + gulp.watch('js/**/*.js', browserSync.reload); +}); diff --git a/docs/img/header.jpg b/docs/img/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b21a437ab70cc98cd2880d3b7c739576627586d7 GIT binary patch literal 125976 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 RG9nuP0D71W+;>w0|JfIUT7Uom literal 0 HcmV?d00001 diff --git a/docs/img/portfolio/fullsize/2.jpg b/docs/img/portfolio/fullsize/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0df8fde8c18bc38a36b7e9e9f7ba179164d41407 GIT binary patch literal 48101 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 literal 0 HcmV?d00001 diff --git a/docs/img/portfolio/fullsize/3.jpg b/docs/img/portfolio/fullsize/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b0862707b2bce677bde7819960174c6a49aad48 GIT binary patch literal 48228 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 F|Jm%t5mx{J literal 0 HcmV?d00001 diff --git a/docs/img/portfolio/fullsize/5.jpg b/docs/img/portfolio/fullsize/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd87077058a73a025a34c0b80f966de50bdb371f GIT binary patch literal 62334 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 F|Jm%t5mx{J literal 0 HcmV?d00001 diff --git a/docs/img/portfolio/thumbnails/5.jpg b/docs/img/portfolio/thumbnails/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd87077058a73a025a34c0b80f966de50bdb371f GIT binary patch literal 62334 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

P-tBw}rl^5o#Bn4kF5FeRV!YoQe;iq0R^OEBF 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 Ky2fH#ckzJ$ literal 0 HcmV?d00001 diff --git a/docs/img/portfolio/thumbnails/6.jpg b/docs/img/portfolio/thumbnails/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9be6c5ea2b664acd57b5edbecd16c0af853a4ea6 GIT binary patch literal 53428 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 PgL}VIZuAj)RH^^jIMg;Z literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html index e69921b19a5..7b78f445c7e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,12 +1,115 @@ - - + + - - R-Instat + + + + + + + + R-Instat + + + + + + + + + + + + + + + + + + + - -

R-Instat

+ + + + +
+
+
+

Welcome to R-Instat website. You will find all inforamtion you need to know about R-Instat

+
+

R-Instat is a free, open source statistical software that is easy to use, even with low computer literacy. It encourages good statistical practices and learning, by opening the door for training to emphasis concepts rather than theory. +This software is designed to support improved statistical literacy in Africa and beyond, through work undertaken primarily within Africa. +In resource rich environments, students should ideally become familiar with more than one package and R-Instat might sometimes be a useful addition to the mix. In resource poor environments R-Instat combined with R-Studio is designed to be sufficient for student needs. +.

+ Find Out More +
+
+
+ + + + + + + + + + + + + + + diff --git a/docs/js/creative.js b/docs/js/creative.js new file mode 100644 index 00000000000..03da715370c --- /dev/null +++ b/docs/js/creative.js @@ -0,0 +1,64 @@ +(function($) { + "use strict"; // Start of use strict + + // jQuery for page scrolling feature - requires jQuery Easing plugin + $(document).on('click', 'a.page-scroll', function(event) { + var $anchor = $(this); + $('html, body').stop().animate({ + scrollTop: ($($anchor.attr('href')).offset().top - 50) + }, 1250, 'easeInOutExpo'); + event.preventDefault(); + }); + + // Highlight the top nav as scrolling occurs + $('body').scrollspy({ + target: '.navbar-fixed-top', + offset: 51 + }); + + // Closes the Responsive Menu on Menu Item Click + $('.navbar-collapse ul li a').click(function() { + $('.navbar-toggle:visible').click(); + }); + + // Offset for Main Navigation + $('#mainNav').affix({ + offset: { + top: 100 + } + }) + + // Initialize and Configure Scroll Reveal Animation + window.sr = ScrollReveal(); + sr.reveal('.sr-icons', { + duration: 600, + scale: 0.3, + distance: '0px' + }, 200); + sr.reveal('.sr-button', { + duration: 1000, + delay: 200 + }); + sr.reveal('.sr-contact', { + duration: 600, + scale: 0.3, + distance: '0px' + }, 300); + + // Initialize and Configure Magnific Popup Lightbox Plugin + $('.popup-gallery').magnificPopup({ + delegate: 'a', + type: 'image', + tLoading: 'Loading image #%curr%...', + mainClass: 'mfp-img-mobile', + gallery: { + enabled: true, + navigateByImgClick: true, + preload: [0, 1] // Will preload 0 - before current, and 1 after the current image + }, + image: { + tError: 'The image #%curr% could not be loaded.' + } + }); + +})(jQuery); // End of use strict diff --git a/docs/js/creative.min.js b/docs/js/creative.min.js new file mode 100644 index 00000000000..98ad9301f7f --- /dev/null +++ b/docs/js/creative.min.js @@ -0,0 +1,6 @@ +/*! + * Start Bootstrap - Creative v3.3.7+1 (http://startbootstrap.com/template-overviews/creative) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */ +!function(a){"use strict";a(document).on("click","a.page-scroll",function(e){var l=a(this);a("html, body").stop().animate({scrollTop:a(l.attr("href")).offset().top-50},1250,"easeInOutExpo"),e.preventDefault()}),a("body").scrollspy({target:".navbar-fixed-top",offset:51}),a(".navbar-collapse ul li a").click(function(){a(".navbar-toggle:visible").click()}),a("#mainNav").affix({offset:{top:100}}),window.sr=ScrollReveal(),sr.reveal(".sr-icons",{duration:600,scale:.3,distance:"0px"},200),sr.reveal(".sr-button",{duration:1e3,delay:200}),sr.reveal(".sr-contact",{duration:600,scale:.3,distance:"0px"},300),a(".popup-gallery").magnificPopup({delegate:"a",type:"image",tLoading:"Loading image #%curr%...",mainClass:"mfp-img-mobile",gallery:{enabled:!0,navigateByImgClick:!0,preload:[0,1]},image:{tError:'The image #%curr% could not be loaded.'}})}(jQuery); diff --git a/docs/less/creative.less b/docs/less/creative.less new file mode 100644 index 00000000000..5e71eb52694 --- /dev/null +++ b/docs/less/creative.less @@ -0,0 +1,361 @@ +@import "variables.less"; +@import "mixins.less"; + +// Global Components +html, +body { + height: 100%; + width: 100%; +} + +body { + .serif-font; +} + +hr { + border-color: @theme-primary; + border-width: 3px; + max-width: 50px; +} + +hr.light { + border-color: white; +} + +a { + .transition-all; + color: @theme-primary; + &:hover, + &:focus { + color: darken(@theme-primary, 10%); + } +} + +h1, +h2, +h3, +h4, +h5, +h6 { + .sans-serif-font; +} + +p { + font-size: 16px; + line-height: 1.5; + margin-bottom: 20px; +} + +.bg-primary { + background-color: @theme-primary; +} + +.bg-dark { + background-color: @gray-darker; + color: white; +} + +.text-faded { + color: fade(white, 70%); +} + +section { + padding: 100px 0; +} + +aside { + padding: 50px 0; +} + +.no-padding { + padding: 0; +} + +// Navigation + +.navbar-default { + background-color: white; + border-color: fade(@gray-darker, 5%); + .sans-serif-font; + .transition-all; + .navbar-header .navbar-brand { + color: @theme-primary; + .sans-serif-font; + font-weight: 700; + text-transform: uppercase; + &:hover, + &:focus { + color: darken(@theme-primary, 10%); + } + } + .navbar-header .navbar-toggle { + font-weight: 700; + font-size: 12px; + color: @gray-darker; + text-transform: uppercase; + } + .nav { + > li { + > a, + > a:focus { + text-transform: uppercase; + font-weight: 700; + font-size: 13px; + color: @gray-darker; + &:hover { + color: @theme-primary; + } + } + &.active { + > a, + > a:focus { + color: @theme-primary !important; + background-color: transparent; + &:hover { + background-color: transparent; + } + } + } + } + } + @media (min-width: 768px) { + background-color: transparent; + border-color: fade(white, 30%); + .navbar-header .navbar-brand { + color: fade(white, 70%); + &:hover, + &:focus { + color: white; + } + } + .nav > li > a, + .nav > li > a:focus { + color: fade(white, 70%); + &:hover { + color: white; + } + } + &.affix { + background-color: white; + border-color: fade(@gray-darker, 5%); + .navbar-header .navbar-brand { + color: @theme-primary; + font-size: 14px; + &:hover, + &:focus { + color: darken(@theme-primary, 10%); + } + } + .nav > li > a, + .nav > li > a:focus { + color: @gray-darker; + &:hover { + color: @theme-primary; + } + } + } + } +} + +// Homepage Header + +header { + position: relative; + width: 100%; + min-height: auto; + .background-cover; + background-position: center; + background-image: url('../img/header.jpg'); + text-align: center; + color: white; + .header-content { + position: relative; + text-align: center; + padding: 100px 15px 100px; + width: 100%; + .header-content-inner { + h1 { + font-weight: 700; + text-transform: uppercase; + margin-top: 0; + margin-bottom: 0; + font-size: 30px; + } + hr { + margin: 30px auto; + } + p { + font-weight: 300; + color: fade(white, 70%); + font-size: 16px; + margin-bottom: 50px; + } + } + } + @media (min-width: 768px) { + min-height: 100%; + .header-content { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + padding: 0 50px; + .header-content-inner { + max-width: 1000px; + margin-left: auto; + margin-right: auto; + h1 { + font-size: 50px; + } + p { + font-size: 18px; + max-width: 80%; + margin-left: auto; + margin-right: auto; + } + } + } + } +} + +// Sections + +.section-heading { + margin-top: 0; +} + +.service-box { + max-width: 400px; + margin: 50px auto 0; + @media (min-width: 992px) { + margin: 20px auto 0; + } + p { + margin-bottom: 0; + } +} + +.portfolio-box { + position: relative; + display: block; + max-width: 650px; + margin: 0 auto; + .portfolio-box-caption { + color: white; + opacity: 0; + display: block; + background: fade(@theme-primary, 90%); + position: absolute; + bottom: 0; + text-align: center; + width: 100%; + height: 100%; + .transition-all; + .portfolio-box-caption-content { + width: 100%; + text-align: center; + position: absolute; + top: 50%; + transform: translateY(-50%); + .project-category, + .project-name { + .sans-serif-font; + padding: 0 15px; + } + .project-category { + text-transform: uppercase; + font-weight: 600; + font-size: 14px; + } + .project-name { + font-size: 18px; + } + } + } + &:hover { + .portfolio-box-caption { + opacity: 1; + } + } + &:focus { + outline: none; + } + @media (min-width: 768px) { + .portfolio-box-caption { + .portfolio-box-caption-content { + .project-category { + font-size: 16px; + } + .project-name { + font-size: 22px; + } + } + } + } +} + +.call-to-action { + h2 { + margin: 0 auto 20px; + } +} + +// Bootstrap Overrides +.text-primary { + color: @theme-primary; +} + +.no-gutter > [class*='col-'] { + padding-right:0; + padding-left:0; +} + +// Button Styles +.btn-default { + .button-variant(@gray-darker;white;white); +} + +.btn-primary { + .button-variant(white;@theme-primary;@theme-primary); +} + +.btn { + .sans-serif-font; + border: none; + border-radius: 300px; + font-weight: 700; + text-transform: uppercase; +} + +.btn-xl { + padding: 15px 30px; +} + +// Extras +// -- Highlight Color Customization +::-moz-selection { + color: white; + text-shadow: none; + background: @gray-darker; +} + +::selection { + color: white; + text-shadow: none; + background: @gray-darker; +} + +img::selection { + color: white; + background: transparent; +} + +img::-moz-selection { + color: white; + background: transparent; +} + +body { + webkit-tap-highlight-color: @gray-darker; +} \ No newline at end of file diff --git a/docs/less/mixins.less b/docs/less/mixins.less new file mode 100644 index 00000000000..74de548fa7a --- /dev/null +++ b/docs/less/mixins.less @@ -0,0 +1,63 @@ +// Mixins + +.transition-all() { + -webkit-transition: all 0.35s; + -moz-transition: all 0.35s; + transition: all 0.35s; +} + +.background-cover() { + -webkit-background-size: cover; + -moz-background-size: cover; + background-size: cover; + -o-background-size: cover; +} + +.button-variant(@color; @background; @border) { + color: @color; + background-color: @background; + border-color: @border; + .transition-all; + + &:hover, + &:focus, + &.focus, + &:active, + &.active, + .open > .dropdown-toggle& { + color: @color; + background-color: darken(@background, 5%); + border-color: darken(@border, 7%); + } + &:active, + &.active, + .open > .dropdown-toggle& { + background-image: none; + } + &.disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &.focus, + &:active, + &.active { + background-color: @background; + border-color: @border; + } + } + + .badge { + color: @background; + background-color: @color; + } +} + +.sans-serif-font() { + font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif; +} + +.serif-font() { + font-family: 'Merriweather', 'Helvetica Neue', Arial, sans-serif; +} \ No newline at end of file diff --git a/docs/less/variables.less b/docs/less/variables.less new file mode 100644 index 00000000000..c3eec985fde --- /dev/null +++ b/docs/less/variables.less @@ -0,0 +1,12 @@ +// Variables + +// Gray and Brand Colors for use across theme + +@theme-primary: #F05F40; + +@gray-base: #000; +@gray-darker: lighten(@gray-base, 13.5%); // #222 +@gray-dark: lighten(@gray-base, 20%); // #333 +@gray: lighten(@gray-base, 33.5%); // #555 +@gray-light: lighten(@gray-base, 46.7%); // #777 +@gray-lighter: lighten(@gray-base, 93.5%); // #eee \ No newline at end of file diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000000..c781f3ceece --- /dev/null +++ b/docs/package.json @@ -0,0 +1,29 @@ +{ + "name": "creative", + "title": "Creative", + "version": "3.3.7+1", + "homepage": "http://startbootstrap.com/template-overviews/creative", + "author": "Start Bootstrap", + "license": { + "type": "MIT", + "url": "https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE" + }, + "devDependencies": { + "bootstrap": "^3.3.7", + "browser-sync": "^2.13.0", + "font-awesome": "^4.6.3", + "gulp": "^3.9.1", + "gulp-clean-css": "^2.0.10", + "gulp-header": "^1.8.7", + "gulp-less": "^3.1.0", + "gulp-rename": "^1.2.2", + "gulp-uglify": "^1.5.4", + "jquery": "^1.11.3", + "magnific-popup": "^1.1.0", + "scrollreveal": "^3.1.4" + }, + "repository": { + "type": "git", + "url": "https://github.com/BlackrockDigital/startbootstrap-creative.git" + } +} diff --git a/docs/vendor/bootstrap/css/bootstrap.css b/docs/vendor/bootstrap/css/bootstrap.css new file mode 100644 index 00000000000..6167622cecf --- /dev/null +++ b/docs/vendor/bootstrap/css/bootstrap.css @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/docs/vendor/bootstrap/css/bootstrap.min.css b/docs/vendor/bootstrap/css/bootstrap.min.css new file mode 100644 index 00000000000..ed3905e0e0c --- /dev/null +++ b/docs/vendor/bootstrap/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot b/docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf b/docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/docs/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/docs/vendor/bootstrap/js/bootstrap.js b/docs/vendor/bootstrap/js/bootstrap.js new file mode 100644 index 00000000000..8a2e99a535d --- /dev/null +++ b/docs/vendor/bootstrap/js/bootstrap.js @@ -0,0 +1,2377 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.7 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.7 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.7' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector === '#' ? [] : selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.7 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.7' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d).prop(d, true) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d).prop(d, false) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target).closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { + // Prevent double click on radios, and the double selections (so cancellation) on checkboxes + e.preventDefault() + // The target component still receive the focus + if ($btn.is('input,button')) $btn.trigger('focus') + else $btn.find('input:visible,button:visible').first().trigger('focus') + } + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.7 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.7' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.7 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + +/* jshint latedef: false */ + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.7' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.7 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.7' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.7 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.7' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (document !== e.target && + this.$element[0] !== e.target && + !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.7 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.7' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + } + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var isSvg = window.SVGElement && el instanceof window.SVGElement + // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. + // See https://github.com/twbs/bootstrap/issues/20280 + var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + that.$element = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.7 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.7' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.7 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.7' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.7 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.7' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.7 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.7' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/docs/vendor/bootstrap/js/bootstrap.min.js b/docs/vendor/bootstrap/js/bootstrap.min.js new file mode 100644 index 00000000000..9bcd2fccaed --- /dev/null +++ b/docs/vendor/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/docs/vendor/font-awesome/css/font-awesome.css b/docs/vendor/font-awesome/css/font-awesome.css new file mode 100644 index 00000000000..a0b879fa000 --- /dev/null +++ b/docs/vendor/font-awesome/css/font-awesome.css @@ -0,0 +1,2199 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.6.3'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/docs/vendor/font-awesome/css/font-awesome.min.css b/docs/vendor/font-awesome/css/font-awesome.min.css new file mode 100644 index 00000000000..9b27f8ea8f8 --- /dev/null +++ b/docs/vendor/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/docs/vendor/font-awesome/fonts/FontAwesome.otf b/docs/vendor/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..d4de13e832d567ff29c5b4e9561b8c370348cc9c GIT binary patch literal 124988 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ÐT?>-5aYhU|+1c>&YMpPK5x#-mbV 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'NS^o{z1ZKlHsAybrl=JE7AP369ntV%vB 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 CDx5C> literal 0 HcmV?d00001 diff --git a/docs/vendor/font-awesome/fonts/fontawesome-webfont.eot b/docs/vendor/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..c7b00d2ba8896fd29de846b19f89fcf0d56ad152 GIT binary patch literal 76518 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%0DyT{kunD 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⋙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 z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/docs/vendor/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f221e50a2ef60738ba30932d834530cdfe55cb3e GIT binary patch literal 152796 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

=v_rA!CPE#mM^4@)}X7qf;At+v)G*FZd&; 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

P-tBw}rl^5o#Bn4kF5FeRV!YoQe;iq0R^OEBF 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 Ky2fH#ckzJ$ literal 0 HcmV?d00001 diff --git a/docs/img/portfolio/fullsize/6.jpg b/docs/img/portfolio/fullsize/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9be6c5ea2b664acd57b5edbecd16c0af853a4ea6 GIT binary patch literal 53428 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 PgL}VIZuAj)RH^^jIMg;Z literal 0 HcmV?d00001 diff --git a/docs/img/portfolio/thumbnails/1.jpg b/docs/img/portfolio/thumbnails/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..44692cc902078585121655d9590d3312cbe50cd5 GIT binary patch literal 63788 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 RG9nuP0D71W+;>w0|JfIUT7Uom literal 0 HcmV?d00001 diff --git a/docs/img/portfolio/thumbnails/2.jpg b/docs/img/portfolio/thumbnails/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0df8fde8c18bc38a36b7e9e9f7ba179164d41407 GIT binary patch literal 48101 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 literal 0 HcmV?d00001 diff --git a/docs/img/portfolio/thumbnails/3.jpg b/docs/img/portfolio/thumbnails/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b0862707b2bce677bde7819960174c6a49aad48 GIT binary patch literal 48228 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

from table fragments + if ( !support.tbody ) { + + // String was a
StatisticNMeanSt. Dev.MinMax
n%nr@Ea}KU-3@g8l2;h(3 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 ALjV8( literal 0 HcmV?d00001 diff --git a/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff b/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..6e7483cf61b490c08ed644d6ef802c69472eb247 GIT binary patch literal 90412 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%0Ded40&XED0GYFoIh+AV*?9!MR5pBW?X_8Bp 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 IH>08b4`|GD*#H0l literal 0 HcmV?d00001 diff --git a/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff2 b/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7eb74fd127ee5eddf3b95fee6a20dc1684b0963b GIT binary patch literal 71896 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≠dR0E9ICQ{-tcR;@{R^I5P#1GUH!p=-{c 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 literal 0 HcmV?d00001 diff --git a/docs/vendor/font-awesome/less/animated.less b/docs/vendor/font-awesome/less/animated.less new file mode 100644 index 00000000000..66ad52a5ba0 --- /dev/null +++ b/docs/vendor/font-awesome/less/animated.less @@ -0,0 +1,34 @@ +// Animated Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.@{fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/docs/vendor/font-awesome/less/bordered-pulled.less b/docs/vendor/font-awesome/less/bordered-pulled.less new file mode 100644 index 00000000000..f1c8ad75f52 --- /dev/null +++ b/docs/vendor/font-awesome/less/bordered-pulled.less @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.@{fa-css-prefix}-pull-left { float: left; } +.@{fa-css-prefix}-pull-right { float: right; } + +.@{fa-css-prefix} { + &.@{fa-css-prefix}-pull-left { margin-right: .3em; } + &.@{fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/docs/vendor/font-awesome/less/core.less b/docs/vendor/font-awesome/less/core.less new file mode 100644 index 00000000000..c577ac84a6a --- /dev/null +++ b/docs/vendor/font-awesome/less/core.less @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/docs/vendor/font-awesome/less/fixed-width.less b/docs/vendor/font-awesome/less/fixed-width.less new file mode 100644 index 00000000000..110289f2f4b --- /dev/null +++ b/docs/vendor/font-awesome/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/docs/vendor/font-awesome/less/font-awesome.less b/docs/vendor/font-awesome/less/font-awesome.less new file mode 100644 index 00000000000..c44e5f466a0 --- /dev/null +++ b/docs/vendor/font-awesome/less/font-awesome.less @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "animated.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; +@import "screen-reader.less"; diff --git a/docs/vendor/font-awesome/less/icons.less b/docs/vendor/font-awesome/less/icons.less new file mode 100644 index 00000000000..ba21b222d6f --- /dev/null +++ b/docs/vendor/font-awesome/less/icons.less @@ -0,0 +1,733 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-feed:before, +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-y-combinator-square:before, +.@{fa-css-prefix}-yc-square:before, +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-intersex:before, +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } +.@{fa-css-prefix}-yc:before, +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } +.@{fa-css-prefix}-battery-4:before, +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } +.@{fa-css-prefix}-battery-3:before, +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } +.@{fa-css-prefix}-battery-2:before, +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } +.@{fa-css-prefix}-battery-1:before, +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } +.@{fa-css-prefix}-battery-0:before, +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } +.@{fa-css-prefix}-hourglass-1:before, +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } +.@{fa-css-prefix}-hourglass-2:before, +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } +.@{fa-css-prefix}-hourglass-3:before, +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } +.@{fa-css-prefix}-hand-grab-o:before, +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } +.@{fa-css-prefix}-hand-stop-o:before, +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } +.@{fa-css-prefix}-tv:before, +.@{fa-css-prefix}-television:before { content: @fa-var-television; } +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } +.@{fa-css-prefix}-map:before { content: @fa-var-map; } +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } +.@{fa-css-prefix}-asl-interpreting:before, +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } +.@{fa-css-prefix}-deafness:before, +.@{fa-css-prefix}-hard-of-hearing:before, +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } +.@{fa-css-prefix}-signing:before, +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } diff --git a/docs/vendor/font-awesome/less/larger.less b/docs/vendor/font-awesome/less/larger.less new file mode 100644 index 00000000000..c9d646770e2 --- /dev/null +++ b/docs/vendor/font-awesome/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/docs/vendor/font-awesome/less/list.less b/docs/vendor/font-awesome/less/list.less new file mode 100644 index 00000000000..0b440382f61 --- /dev/null +++ b/docs/vendor/font-awesome/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/docs/vendor/font-awesome/less/mixins.less b/docs/vendor/font-awesome/less/mixins.less new file mode 100644 index 00000000000..beef231d0e1 --- /dev/null +++ b/docs/vendor/font-awesome/less/mixins.less @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +.fa-icon-rotate(@degrees, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +.sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/docs/vendor/font-awesome/less/path.less b/docs/vendor/font-awesome/less/path.less new file mode 100644 index 00000000000..835be41f815 --- /dev/null +++ b/docs/vendor/font-awesome/less/path.less @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/docs/vendor/font-awesome/less/rotated-flipped.less b/docs/vendor/font-awesome/less/rotated-flipped.less new file mode 100644 index 00000000000..f6ba81475b9 --- /dev/null +++ b/docs/vendor/font-awesome/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/docs/vendor/font-awesome/less/screen-reader.less b/docs/vendor/font-awesome/less/screen-reader.less new file mode 100644 index 00000000000..11c188196d5 --- /dev/null +++ b/docs/vendor/font-awesome/less/screen-reader.less @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { .sr-only(); } +.sr-only-focusable { .sr-only-focusable(); } diff --git a/docs/vendor/font-awesome/less/stacked.less b/docs/vendor/font-awesome/less/stacked.less new file mode 100644 index 00000000000..fc53fb0e7ab --- /dev/null +++ b/docs/vendor/font-awesome/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/docs/vendor/font-awesome/less/variables.less b/docs/vendor/font-awesome/less/variables.less new file mode 100644 index 00000000000..2b3381975e9 --- /dev/null +++ b/docs/vendor/font-awesome/less/variables.less @@ -0,0 +1,744 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +@fa-line-height-base: 1; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.6.3"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-500px: "\f26e"; +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-amazon: "\f270"; +@fa-var-ambulance: "\f0f9"; +@fa-var-american-sign-language-interpreting: "\f2a3"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asl-interpreting: "\f2a3"; +@fa-var-assistive-listening-systems: "\f2a2"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-audio-description: "\f29e"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-balance-scale: "\f24e"; +@fa-var-ban: "\f05e"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-battery-0: "\f244"; +@fa-var-battery-1: "\f243"; +@fa-var-battery-2: "\f242"; +@fa-var-battery-3: "\f241"; +@fa-var-battery-4: "\f240"; +@fa-var-battery-empty: "\f244"; +@fa-var-battery-full: "\f240"; +@fa-var-battery-half: "\f242"; +@fa-var-battery-quarter: "\f243"; +@fa-var-battery-three-quarters: "\f241"; +@fa-var-bed: "\f236"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-black-tie: "\f27e"; +@fa-var-blind: "\f29d"; +@fa-var-bluetooth: "\f293"; +@fa-var-bluetooth-b: "\f294"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-braille: "\f2a1"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-check-o: "\f274"; +@fa-var-calendar-minus-o: "\f272"; +@fa-var-calendar-o: "\f133"; +@fa-var-calendar-plus-o: "\f271"; +@fa-var-calendar-times-o: "\f273"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-diners-club: "\f24c"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-jcb: "\f24b"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-chrome: "\f268"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-clone: "\f24d"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-codiepie: "\f284"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-commenting: "\f27a"; +@fa-var-commenting-o: "\f27b"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; +@fa-var-contao: "\f26d"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-creative-commons: "\f25e"; +@fa-var-credit-card: "\f09d"; +@fa-var-credit-card-alt: "\f283"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; +@fa-var-database: "\f1c0"; +@fa-var-deaf: "\f2a4"; +@fa-var-deafness: "\f2a4"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edge: "\f282"; +@fa-var-edit: "\f044"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-square: "\f199"; +@fa-var-envira: "\f299"; +@fa-var-eraser: "\f12d"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-expeditedssl: "\f23e"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-feed: "\f09e"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; +@fa-var-fonticons: "\f280"; +@fa-var-fort-awesome: "\f286"; +@fa-var-forumbee: "\f211"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-genderless: "\f22d"; +@fa-var-get-pocket: "\f265"; +@fa-var-gg: "\f260"; +@fa-var-gg-circle: "\f261"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gitlab: "\f296"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-glide: "\f2a5"; +@fa-var-glide-g: "\f2a6"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-grab-o: "\f255"; +@fa-var-hand-lizard-o: "\f258"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hand-paper-o: "\f256"; +@fa-var-hand-peace-o: "\f25b"; +@fa-var-hand-pointer-o: "\f25a"; +@fa-var-hand-rock-o: "\f255"; +@fa-var-hand-scissors-o: "\f257"; +@fa-var-hand-spock-o: "\f259"; +@fa-var-hand-stop-o: "\f256"; +@fa-var-hard-of-hearing: "\f2a4"; +@fa-var-hashtag: "\f292"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; +@fa-var-hourglass: "\f254"; +@fa-var-hourglass-1: "\f251"; +@fa-var-hourglass-2: "\f252"; +@fa-var-hourglass-3: "\f253"; +@fa-var-hourglass-end: "\f253"; +@fa-var-hourglass-half: "\f252"; +@fa-var-hourglass-o: "\f250"; +@fa-var-hourglass-start: "\f251"; +@fa-var-houzz: "\f27c"; +@fa-var-html5: "\f13b"; +@fa-var-i-cursor: "\f246"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-industry: "\f275"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-internet-explorer: "\f26b"; +@fa-var-intersex: "\f224"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-low-vision: "\f2a8"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map: "\f279"; +@fa-var-map-marker: "\f041"; +@fa-var-map-o: "\f278"; +@fa-var-map-pin: "\f276"; +@fa-var-map-signs: "\f277"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; +@fa-var-medkit: "\f0fa"; +@fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mixcloud: "\f289"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-modx: "\f285"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; +@fa-var-mouse-pointer: "\f245"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-object-group: "\f247"; +@fa-var-object-ungroup: "\f248"; +@fa-var-odnoklassniki: "\f263"; +@fa-var-odnoklassniki-square: "\f264"; +@fa-var-opencart: "\f23d"; +@fa-var-openid: "\f19b"; +@fa-var-opera: "\f26a"; +@fa-var-optin-monster: "\f23c"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-pause-circle: "\f28b"; +@fa-var-pause-circle-o: "\f28c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-percent: "\f295"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f2ae"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-product-hunt: "\f288"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-question-circle-o: "\f29c"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-alien: "\f281"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-registered: "\f25d"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-safari: "\f267"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-scribd: "\f28a"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; +@fa-var-shopping-bag: "\f290"; +@fa-var-shopping-basket: "\f291"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-language: "\f2a7"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-signing: "\f2a7"; +@fa-var-simplybuilt: "\f215"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-snapchat: "\f2ab"; +@fa-var-snapchat-ghost: "\f2ac"; +@fa-var-snapchat-square: "\f2ad"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-sticky-note: "\f249"; +@fa-var-sticky-note-o: "\f24a"; +@fa-var-stop: "\f04d"; +@fa-var-stop-circle: "\f28d"; +@fa-var-stop-circle-o: "\f28e"; +@fa-var-street-view: "\f21d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-television: "\f26c"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trademark: "\f25c"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-tripadvisor: "\f262"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-tv: "\f26c"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-universal-access: "\f29a"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usb: "\f287"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-md: "\f0f0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; +@fa-var-users: "\f0c0"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; +@fa-var-viadeo: "\f2a9"; +@fa-var-viadeo-square: "\f2aa"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo: "\f27d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-control-phone: "\f2a0"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; +@fa-var-wheelchair: "\f193"; +@fa-var-wheelchair-alt: "\f29b"; +@fa-var-wifi: "\f1eb"; +@fa-var-wikipedia-w: "\f266"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wpbeginner: "\f297"; +@fa-var-wpforms: "\f298"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-y-combinator: "\f23b"; +@fa-var-y-combinator-square: "\f1d4"; +@fa-var-yahoo: "\f19e"; +@fa-var-yc: "\f23b"; +@fa-var-yc-square: "\f1d4"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/docs/vendor/font-awesome/scss/_animated.scss b/docs/vendor/font-awesome/scss/_animated.scss new file mode 100644 index 00000000000..8a020dbfff7 --- /dev/null +++ b/docs/vendor/font-awesome/scss/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/docs/vendor/font-awesome/scss/_bordered-pulled.scss b/docs/vendor/font-awesome/scss/_bordered-pulled.scss new file mode 100644 index 00000000000..d4b85a02f24 --- /dev/null +++ b/docs/vendor/font-awesome/scss/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/docs/vendor/font-awesome/scss/_core.scss b/docs/vendor/font-awesome/scss/_core.scss new file mode 100644 index 00000000000..7425ef85fc8 --- /dev/null +++ b/docs/vendor/font-awesome/scss/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/docs/vendor/font-awesome/scss/_fixed-width.scss b/docs/vendor/font-awesome/scss/_fixed-width.scss new file mode 100644 index 00000000000..b221c98133a --- /dev/null +++ b/docs/vendor/font-awesome/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/docs/vendor/font-awesome/scss/_icons.scss b/docs/vendor/font-awesome/scss/_icons.scss new file mode 100644 index 00000000000..2944344350f --- /dev/null +++ b/docs/vendor/font-awesome/scss/_icons.scss @@ -0,0 +1,733 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } diff --git a/docs/vendor/font-awesome/scss/_larger.scss b/docs/vendor/font-awesome/scss/_larger.scss new file mode 100644 index 00000000000..41e9a8184aa --- /dev/null +++ b/docs/vendor/font-awesome/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/docs/vendor/font-awesome/scss/_list.scss b/docs/vendor/font-awesome/scss/_list.scss new file mode 100644 index 00000000000..7d1e4d54d6c --- /dev/null +++ b/docs/vendor/font-awesome/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/docs/vendor/font-awesome/scss/_mixins.scss b/docs/vendor/font-awesome/scss/_mixins.scss new file mode 100644 index 00000000000..c3bbd5745d3 --- /dev/null +++ b/docs/vendor/font-awesome/scss/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/docs/vendor/font-awesome/scss/_path.scss b/docs/vendor/font-awesome/scss/_path.scss new file mode 100644 index 00000000000..bb457c23a8e --- /dev/null +++ b/docs/vendor/font-awesome/scss/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/docs/vendor/font-awesome/scss/_rotated-flipped.scss b/docs/vendor/font-awesome/scss/_rotated-flipped.scss new file mode 100644 index 00000000000..a3558fd09ca --- /dev/null +++ b/docs/vendor/font-awesome/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/docs/vendor/font-awesome/scss/_screen-reader.scss b/docs/vendor/font-awesome/scss/_screen-reader.scss new file mode 100644 index 00000000000..637426f0da6 --- /dev/null +++ b/docs/vendor/font-awesome/scss/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/docs/vendor/font-awesome/scss/_stacked.scss b/docs/vendor/font-awesome/scss/_stacked.scss new file mode 100644 index 00000000000..aef7403660c --- /dev/null +++ b/docs/vendor/font-awesome/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/docs/vendor/font-awesome/scss/_variables.scss b/docs/vendor/font-awesome/scss/_variables.scss new file mode 100644 index 00000000000..a5a89ef97bc --- /dev/null +++ b/docs/vendor/font-awesome/scss/_variables.scss @@ -0,0 +1,744 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.6.3" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/docs/vendor/font-awesome/scss/font-awesome.scss b/docs/vendor/font-awesome/scss/font-awesome.scss new file mode 100644 index 00000000000..2308b14ca7c --- /dev/null +++ b/docs/vendor/font-awesome/scss/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/docs/vendor/jquery/jquery.js b/docs/vendor/jquery/jquery.js new file mode 100644 index 00000000000..7fc60fca78b --- /dev/null +++ b/docs/vendor/jquery/jquery.js @@ -0,0 +1,11008 @@ +/*! + * jQuery JavaScript Library v1.12.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:17Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var deletedIds = []; + +var document = window.document; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.12.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE6-10 + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] +}; + +// Support: IE8-IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = /
, *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "'+ + '', + + srcAction: 'iframe_src', + + // we don't care and support only one default type of URL by default + patterns: { + youtube: { + index: 'youtube.com', + id: 'v=', + src: '//www.youtube.com/embed/%id%?autoplay=1' + }, + vimeo: { + index: 'vimeo.com/', + id: '/', + src: '//player.vimeo.com/video/%id%?autoplay=1' + }, + gmaps: { + index: '//maps.google.', + src: '%id%&output=embed' + } + } + }, + + proto: { + initIframe: function() { + mfp.types.push(IFRAME_NS); + + _mfpOn('BeforeChange', function(e, prevType, newType) { + if(prevType !== newType) { + if(prevType === IFRAME_NS) { + _fixIframeBugs(); // iframe if removed + } else if(newType === IFRAME_NS) { + _fixIframeBugs(true); // iframe is showing + } + }// else { + // iframe source is switched, don't do anything + //} + }); + + _mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() { + _fixIframeBugs(); + }); + }, + + getIframe: function(item, template) { + var embedSrc = item.src; + var iframeSt = mfp.st.iframe; + + $.each(iframeSt.patterns, function() { + if(embedSrc.indexOf( this.index ) > -1) { + if(this.id) { + if(typeof this.id === 'string') { + embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length); + } else { + embedSrc = this.id.call( this, embedSrc ); + } + } + embedSrc = this.src.replace('%id%', embedSrc ); + return false; // break; + } + }); + + var dataObj = {}; + if(iframeSt.srcAction) { + dataObj[iframeSt.srcAction] = embedSrc; + } + mfp._parseMarkup(template, dataObj, item); + + mfp.updateStatus('ready'); + + return template; + } + } +}); + + + +/*>>iframe*/ + +/*>>gallery*/ +/** + * Get looped index depending on number of slides + */ +var _getLoopedId = function(index) { + var numSlides = mfp.items.length; + if(index > numSlides - 1) { + return index - numSlides; + } else if(index < 0) { + return numSlides + index; + } + return index; + }, + _replaceCurrTotal = function(text, curr, total) { + return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total); + }; + +$.magnificPopup.registerModule('gallery', { + + options: { + enabled: false, + arrowMarkup: '', + preload: [0,2], + navigateByImgClick: true, + arrows: true, + + tPrev: 'Previous (Left arrow key)', + tNext: 'Next (Right arrow key)', + tCounter: '%curr% of %total%' + }, + + proto: { + initGallery: function() { + + var gSt = mfp.st.gallery, + ns = '.mfp-gallery'; + + mfp.direction = true; // true - next, false - prev + + if(!gSt || !gSt.enabled ) return false; + + _wrapClasses += ' mfp-gallery'; + + _mfpOn(OPEN_EVENT+ns, function() { + + if(gSt.navigateByImgClick) { + mfp.wrap.on('click'+ns, '.mfp-img', function() { + if(mfp.items.length > 1) { + mfp.next(); + return false; + } + }); + } + + _document.on('keydown'+ns, function(e) { + if (e.keyCode === 37) { + mfp.prev(); + } else if (e.keyCode === 39) { + mfp.next(); + } + }); + }); + + _mfpOn('UpdateStatus'+ns, function(e, data) { + if(data.text) { + data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length); + } + }); + + _mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) { + var l = mfp.items.length; + values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : ''; + }); + + _mfpOn('BuildControls' + ns, function() { + if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) { + var markup = gSt.arrowMarkup, + arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS), + arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS); + + arrowLeft.click(function() { + mfp.prev(); + }); + arrowRight.click(function() { + mfp.next(); + }); + + mfp.container.append(arrowLeft.add(arrowRight)); + } + }); + + _mfpOn(CHANGE_EVENT+ns, function() { + if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout); + + mfp._preloadTimeout = setTimeout(function() { + mfp.preloadNearbyImages(); + mfp._preloadTimeout = null; + }, 16); + }); + + + _mfpOn(CLOSE_EVENT+ns, function() { + _document.off(ns); + mfp.wrap.off('click'+ns); + mfp.arrowRight = mfp.arrowLeft = null; + }); + + }, + next: function() { + mfp.direction = true; + mfp.index = _getLoopedId(mfp.index + 1); + mfp.updateItemHTML(); + }, + prev: function() { + mfp.direction = false; + mfp.index = _getLoopedId(mfp.index - 1); + mfp.updateItemHTML(); + }, + goTo: function(newIndex) { + mfp.direction = (newIndex >= mfp.index); + mfp.index = newIndex; + mfp.updateItemHTML(); + }, + preloadNearbyImages: function() { + var p = mfp.st.gallery.preload, + preloadBefore = Math.min(p[0], mfp.items.length), + preloadAfter = Math.min(p[1], mfp.items.length), + i; + + for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) { + mfp._preloadItem(mfp.index+i); + } + for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) { + mfp._preloadItem(mfp.index-i); + } + }, + _preloadItem: function(index) { + index = _getLoopedId(index); + + if(mfp.items[index].preloaded) { + return; + } + + var item = mfp.items[index]; + if(!item.parsed) { + item = mfp.parseEl( index ); + } + + _mfpTrigger('LazyLoad', item); + + if(item.type === 'image') { + item.img = $('').on('load.mfploader', function() { + item.hasSize = true; + }).on('error.mfploader', function() { + item.hasSize = true; + item.loadError = true; + _mfpTrigger('LazyLoadError', item); + }).attr('src', item.src); + } + + + item.preloaded = true; + } + } +}); + +/*>>gallery*/ + +/*>>retina*/ + +var RETINA_NS = 'retina'; + +$.magnificPopup.registerModule(RETINA_NS, { + options: { + replaceSrc: function(item) { + return item.src.replace(/\.\w+$/, function(m) { return '@2x' + m; }); + }, + ratio: 1 // Function or number. Set to 1 to disable. + }, + proto: { + initRetina: function() { + if(window.devicePixelRatio > 1) { + + var st = mfp.st.retina, + ratio = st.ratio; + + ratio = !isNaN(ratio) ? ratio : ratio(); + + if(ratio > 1) { + _mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) { + item.img.css({ + 'max-width': item.img[0].naturalWidth / ratio, + 'width': '100%' + }); + }); + _mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) { + item.src = st.replaceSrc(item, ratio); + }); + } + } + + } + } +}); + +/*>>retina*/ + _checkInstance(); })); \ No newline at end of file diff --git a/docs/vendor/magnific-popup/jquery.magnific-popup.min.js b/docs/vendor/magnific-popup/jquery.magnific-popup.min.js new file mode 100644 index 00000000000..6ee3a3bd5b5 --- /dev/null +++ b/docs/vendor/magnific-popup/jquery.magnific-popup.min.js @@ -0,0 +1,4 @@ +/*! Magnific Popup - v1.1.0 - 2016-02-20 +* http://dimsemenov.com/plugins/magnific-popup/ +* Copyright (c) 2016 Dmitry Semenov; */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):window.jQuery||window.Zepto)}(function(a){var b,c,d,e,f,g,h="Close",i="BeforeClose",j="AfterClose",k="BeforeAppend",l="MarkupParse",m="Open",n="Change",o="mfp",p="."+o,q="mfp-ready",r="mfp-removing",s="mfp-prevent-close",t=function(){},u=!!window.jQuery,v=a(window),w=function(a,c){b.ev.on(o+a+p,c)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(c,d){b.ev.triggerHandler(o+c,d),b.st.callbacks&&(c=c.charAt(0).toLowerCase()+c.slice(1),b.st.callbacks[c]&&b.st.callbacks[c].apply(b,a.isArray(d)?d:[d]))},z=function(c){return c===g&&b.currTemplate.closeBtn||(b.currTemplate.closeBtn=a(b.st.closeMarkup.replace("%title%",b.st.tClose)),g=c),b.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(b=new t,b.init(),a.magnificPopup.instance=b)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(void 0!==a.transition)return!0;for(;b.length;)if(b.pop()+"Transition"in a)return!0;return!1};t.prototype={constructor:t,init:function(){var c=navigator.appVersion;b.isLowIE=b.isIE8=document.all&&!document.addEventListener,b.isAndroid=/android/gi.test(c),b.isIOS=/iphone|ipad|ipod/gi.test(c),b.supportsTransition=B(),b.probablyMobile=b.isAndroid||b.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),d=a(document),b.popupsCache={}},open:function(c){var e;if(c.isObj===!1){b.items=c.items.toArray(),b.index=0;var g,h=c.items;for(e=0;e(a||v.height())},_setFocus:function(){(b.st.focus?b.content.find(b.st.focus).eq(0):b.wrap).focus()},_onFocusIn:function(c){return c.target===b.wrap[0]||a.contains(b.wrap[0],c.target)?void 0:(b._setFocus(),!1)},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(l,[b,c,d]),a.each(c,function(c,d){if(void 0===d||d===!1)return!0;if(e=c.split("_"),e.length>1){var f=b.find(p+"-"+e[0]);if(f.length>0){var g=e[1];"replaceWith"===g?f[0]!==d[0]&&f.replaceWith(d):"img"===g?f.is("img")?f.attr("src",d):f.replaceWith(a("").attr("src",d).attr("class",f.attr("class"))):f.attr(e[1],d)}}else b.find(p+"-"+c).html(d)})},_getScrollbarSize:function(){if(void 0===b.scrollbarSize){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),b.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return b.scrollbarSize}},a.magnificPopup={instance:null,proto:t.prototype,modules:[],open:function(b,c){return A(),b=b?a.extend(!0,{},b):{},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("
");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I="ajax",J=function(){H&&a(document.body).removeClass(H)},K=function(){J(),b.req&&b.req.abort()};a.magnificPopup.registerModule(I,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){b.types.push(I),H=b.st.ajax.cursor,w(h+"."+I,K),w("BeforeChange."+I,K)},getAjax:function(c){H&&a(document.body).addClass(H),b.updateStatus("loading");var d=a.extend({url:c.src,success:function(d,e,f){var g={data:d,xhr:f};y("ParseAjax",g),b.appendContent(a(g.data),I),c.finished=!0,J(),b._setFocus(),setTimeout(function(){b.wrap.addClass(q)},16),b.updateStatus("ready"),y("AjaxContentAdded")},error:function(){J(),c.finished=c.loadError=!0,b.updateStatus("error",b.st.ajax.tError.replace("%url%",c.src))}},b.st.ajax.settings);return b.req=a.ajax(d),""}}});var L,M=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,L&&clearInterval(L),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){L&&clearInterval(L),L=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(L),c++,void(3===c?e(10):40===c?e(50):100===c&&e(500)))},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:M(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(L&&clearInterval(L),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var N,O=function(){return void 0===N&&(N=void 0!==document.createElement("p").style.MozTransform),N};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return O()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});var P="iframe",Q="//about:blank",R=function(a){if(b.currTemplate[P]){var c=b.currTemplate[P].find("iframe");c.length&&(a||(c[0].src=Q),b.isIE8&&c.css("display",a?"block":"none"))}};a.magnificPopup.registerModule(P,{options:{markup:'
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){b.types.push(P),w("BeforeChange",function(a,b,c){b!==c&&(b===P?R():c===P&&R(!0))}),w(h+"."+P,function(){R()})},getIframe:function(c,d){var e=c.src,f=b.st.iframe;a.each(f.patterns,function(){return e.indexOf(this.index)>-1?(this.id&&(e="string"==typeof this.id?e.substr(e.lastIndexOf(this.id)+this.id.length,e.length):this.id.call(this,e)),e=this.src.replace("%id%",e),!1):void 0});var g={};return f.srcAction&&(g[f.srcAction]=e),b._parseMarkup(d,g,c),b.updateStatus("ready"),d}}});var S=function(a){var c=b.items.length;return a>c-1?a-c:0>a?c+a:a},T=function(a,b,c){return a.replace(/%curr%/gi,b+1).replace(/%total%/gi,c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=b.st.gallery,e=".mfp-gallery";return b.direction=!0,c&&c.enabled?(f+=" mfp-gallery",w(m+e,function(){c.navigateByImgClick&&b.wrap.on("click"+e,".mfp-img",function(){return b.items.length>1?(b.next(),!1):void 0}),d.on("keydown"+e,function(a){37===a.keyCode?b.prev():39===a.keyCode&&b.next()})}),w("UpdateStatus"+e,function(a,c){c.text&&(c.text=T(c.text,b.currItem.index,b.items.length))}),w(l+e,function(a,d,e,f){var g=b.items.length;e.counter=g>1?T(c.tCounter,f.index,g):""}),w("BuildControls"+e,function(){if(b.items.length>1&&c.arrows&&!b.arrowLeft){var d=c.arrowMarkup,e=b.arrowLeft=a(d.replace(/%title%/gi,c.tPrev).replace(/%dir%/gi,"left")).addClass(s),f=b.arrowRight=a(d.replace(/%title%/gi,c.tNext).replace(/%dir%/gi,"right")).addClass(s);e.click(function(){b.prev()}),f.click(function(){b.next()}),b.container.append(e.add(f))}}),w(n+e,function(){b._preloadTimeout&&clearTimeout(b._preloadTimeout),b._preloadTimeout=setTimeout(function(){b.preloadNearbyImages(),b._preloadTimeout=null},16)}),void w(h+e,function(){d.off(e),b.wrap.off("click"+e),b.arrowRight=b.arrowLeft=null})):!1},next:function(){b.direction=!0,b.index=S(b.index+1),b.updateItemHTML()},prev:function(){b.direction=!1,b.index=S(b.index-1),b.updateItemHTML()},goTo:function(a){b.direction=a>=b.index,b.index=a,b.updateItemHTML()},preloadNearbyImages:function(){var a,c=b.st.gallery.preload,d=Math.min(c[0],b.items.length),e=Math.min(c[1],b.items.length);for(a=1;a<=(b.direction?e:d);a++)b._preloadItem(b.index+a);for(a=1;a<=(b.direction?d:e);a++)b._preloadItem(b.index-a)},_preloadItem:function(c){if(c=S(c),!b.items[c].preloaded){var d=b.items[c];d.parsed||(d=b.parseEl(c)),y("LazyLoad",d),"image"===d.type&&(d.img=a('').on("load.mfploader",function(){d.hasSize=!0}).on("error.mfploader",function(){d.hasSize=!0,d.loadError=!0,y("LazyLoadError",d)}).attr("src",d.src)),d.preloaded=!0}}}});var U="retina";a.magnificPopup.registerModule(U,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+U,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+U,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),A()}); \ No newline at end of file diff --git a/docs/vendor/magnific-popup/magnific-popup.css b/docs/vendor/magnific-popup/magnific-popup.css new file mode 100644 index 00000000000..8561e181adf --- /dev/null +++ b/docs/vendor/magnific-popup/magnific-popup.css @@ -0,0 +1,351 @@ +/* Magnific Popup CSS */ +.mfp-bg { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1042; + overflow: hidden; + position: fixed; + background: #0b0b0b; + opacity: 0.8; } + +.mfp-wrap { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1043; + position: fixed; + outline: none !important; + -webkit-backface-visibility: hidden; } + +.mfp-container { + text-align: center; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + padding: 0 8px; + box-sizing: border-box; } + +.mfp-container:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; } + +.mfp-align-top .mfp-container:before { + display: none; } + +.mfp-content { + position: relative; + display: inline-block; + vertical-align: middle; + margin: 0 auto; + text-align: left; + z-index: 1045; } + +.mfp-inline-holder .mfp-content, +.mfp-ajax-holder .mfp-content { + width: 100%; + cursor: auto; } + +.mfp-ajax-cur { + cursor: progress; } + +.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { + cursor: -moz-zoom-out; + cursor: -webkit-zoom-out; + cursor: zoom-out; } + +.mfp-zoom { + cursor: pointer; + cursor: -webkit-zoom-in; + cursor: -moz-zoom-in; + cursor: zoom-in; } + +.mfp-auto-cursor .mfp-content { + cursor: auto; } + +.mfp-close, +.mfp-arrow, +.mfp-preloader, +.mfp-counter { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; } + +.mfp-loading.mfp-figure { + display: none; } + +.mfp-hide { + display: none !important; } + +.mfp-preloader { + color: #CCC; + position: absolute; + top: 50%; + width: auto; + text-align: center; + margin-top: -0.8em; + left: 8px; + right: 8px; + z-index: 1044; } + .mfp-preloader a { + color: #CCC; } + .mfp-preloader a:hover { + color: #FFF; } + +.mfp-s-ready .mfp-preloader { + display: none; } + +.mfp-s-error .mfp-content { + display: none; } + +button.mfp-close, +button.mfp-arrow { + overflow: visible; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + display: block; + outline: none; + padding: 0; + z-index: 1046; + box-shadow: none; + touch-action: manipulation; } + +button::-moz-focus-inner { + padding: 0; + border: 0; } + +.mfp-close { + width: 44px; + height: 44px; + line-height: 44px; + position: absolute; + right: 0; + top: 0; + text-decoration: none; + text-align: center; + opacity: 0.65; + padding: 0 0 18px 10px; + color: #FFF; + font-style: normal; + font-size: 28px; + font-family: Arial, Baskerville, monospace; } + .mfp-close:hover, + .mfp-close:focus { + opacity: 1; } + .mfp-close:active { + top: 1px; } + +.mfp-close-btn-in .mfp-close { + color: #333; } + +.mfp-image-holder .mfp-close, +.mfp-iframe-holder .mfp-close { + color: #FFF; + right: -6px; + text-align: right; + padding-right: 6px; + width: 100%; } + +.mfp-counter { + position: absolute; + top: 0; + right: 0; + color: #CCC; + font-size: 12px; + line-height: 18px; + white-space: nowrap; } + +.mfp-arrow { + position: absolute; + opacity: 0.65; + margin: 0; + top: 50%; + margin-top: -55px; + padding: 0; + width: 90px; + height: 110px; + -webkit-tap-highlight-color: transparent; } + .mfp-arrow:active { + margin-top: -54px; } + .mfp-arrow:hover, + .mfp-arrow:focus { + opacity: 1; } + .mfp-arrow:before, + .mfp-arrow:after { + content: ''; + display: block; + width: 0; + height: 0; + position: absolute; + left: 0; + top: 0; + margin-top: 35px; + margin-left: 35px; + border: medium inset transparent; } + .mfp-arrow:after { + border-top-width: 13px; + border-bottom-width: 13px; + top: 8px; } + .mfp-arrow:before { + border-top-width: 21px; + border-bottom-width: 21px; + opacity: 0.7; } + +.mfp-arrow-left { + left: 0; } + .mfp-arrow-left:after { + border-right: 17px solid #FFF; + margin-left: 31px; } + .mfp-arrow-left:before { + margin-left: 25px; + border-right: 27px solid #3F3F3F; } + +.mfp-arrow-right { + right: 0; } + .mfp-arrow-right:after { + border-left: 17px solid #FFF; + margin-left: 39px; } + .mfp-arrow-right:before { + border-left: 27px solid #3F3F3F; } + +.mfp-iframe-holder { + padding-top: 40px; + padding-bottom: 40px; } + .mfp-iframe-holder .mfp-content { + line-height: 0; + width: 100%; + max-width: 900px; } + .mfp-iframe-holder .mfp-close { + top: -40px; } + +.mfp-iframe-scaler { + width: 100%; + height: 0; + overflow: hidden; + padding-top: 56.25%; } + .mfp-iframe-scaler iframe { + position: absolute; + display: block; + top: 0; + left: 0; + width: 100%; + height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: #000; } + +/* Main image in popup */ +img.mfp-img { + width: auto; + max-width: 100%; + height: auto; + display: block; + line-height: 0; + box-sizing: border-box; + padding: 40px 0 40px; + margin: 0 auto; } + +/* The shadow behind the image */ +.mfp-figure { + line-height: 0; } + .mfp-figure:after { + content: ''; + position: absolute; + left: 0; + top: 40px; + bottom: 40px; + display: block; + right: 0; + width: auto; + height: auto; + z-index: -1; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: #444; } + .mfp-figure small { + color: #BDBDBD; + display: block; + font-size: 12px; + line-height: 14px; } + .mfp-figure figure { + margin: 0; } + +.mfp-bottom-bar { + margin-top: -36px; + position: absolute; + top: 100%; + left: 0; + width: 100%; + cursor: auto; } + +.mfp-title { + text-align: left; + line-height: 18px; + color: #F3F3F3; + word-wrap: break-word; + padding-right: 36px; } + +.mfp-image-holder .mfp-content { + max-width: 100%; } + +.mfp-gallery .mfp-image-holder .mfp-figure { + cursor: pointer; } + +@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) { + /** + * Remove all paddings around the image on small screen + */ + .mfp-img-mobile .mfp-image-holder { + padding-left: 0; + padding-right: 0; } + .mfp-img-mobile img.mfp-img { + padding: 0; } + .mfp-img-mobile .mfp-figure:after { + top: 0; + bottom: 0; } + .mfp-img-mobile .mfp-figure small { + display: inline; + margin-left: 5px; } + .mfp-img-mobile .mfp-bottom-bar { + background: rgba(0, 0, 0, 0.6); + bottom: 0; + margin: 0; + top: auto; + padding: 3px 5px; + position: fixed; + box-sizing: border-box; } + .mfp-img-mobile .mfp-bottom-bar:empty { + padding: 0; } + .mfp-img-mobile .mfp-counter { + right: 5px; + top: 3px; } + .mfp-img-mobile .mfp-close { + top: 0; + right: 0; + width: 35px; + height: 35px; + line-height: 35px; + background: rgba(0, 0, 0, 0.6); + position: fixed; + text-align: center; + padding: 0; } } + +@media all and (max-width: 900px) { + .mfp-arrow { + -webkit-transform: scale(0.75); + transform: scale(0.75); } + .mfp-arrow-left { + -webkit-transform-origin: 0; + transform-origin: 0; } + .mfp-arrow-right { + -webkit-transform-origin: 100%; + transform-origin: 100%; } + .mfp-container { + padding-left: 6px; + padding-right: 6px; } } diff --git a/docs/vendor/scrollreveal/scrollreveal.js b/docs/vendor/scrollreveal/scrollreveal.js new file mode 100644 index 00000000000..b9ee80c3d97 --- /dev/null +++ b/docs/vendor/scrollreveal/scrollreveal.js @@ -0,0 +1,947 @@ + +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define(factory); + } else if (typeof exports === 'object') { + module.exports = factory(require, exports, module); + } else { + root.ScrollReveal = factory(); + } +}(this, function(require, exports, module) { + + +///// ///// ///// ///// +///// ///// ///// ///// +///// ///// ///// ///// +///// ///// ///// ///// +///// ///// ///// +///// ///// ///// +///// ///// ///// ///// +///// ///// ///// ///// + ///// ///// + ///// ///// +///// ///// ///// ///// +///// ///// ///// ///// +///// ///// ///// ///// +///// ///// ///// ///// + +/** + * ScrollReveal + * ------------ + * Version : 3.1.4 + * Website : scrollrevealjs.org + * Repo : github.com/jlmakes/scrollreveal.js + * Author : Julian Lloyd (@jlmakes) + */ + +;(function() { + 'use strict'; + + var + sr, + Tools, + _requestAnimationFrame; + + this.ScrollReveal = (function() { + + /** + * Configuration + * ------------- + * This object signature can be passed directly to the ScrollReveal constructor, + * or as the second argument of the `reveal()` method. + */ + + ScrollReveal.prototype.defaults = { + + // 'bottom', 'left', 'top', 'right' + origin : 'bottom', + + // Can be any valid CSS distance, e.g. '5rem', '10%', '20vw', etc. + distance : '20px', + + // Time in milliseconds. + duration : 500, + delay : 0, + + // Starting angles in degrees, will transition from these values to 0 in all axes. + rotate : { x: 0, y: 0, z: 0 }, + + // Starting opacity value, before transitioning to the computed opacity. + opacity : 0, + + // Starting scale value, will transition from this value to 1 + scale : 0.9, + + // Accepts any valid CSS easing, e.g. 'ease', 'ease-in-out', 'linear', etc. + easing : 'cubic-bezier(0.6, 0.2, 0.1, 1)', + + // When null, `` is assumed to be the reveal container. You can pass a + // DOM node as a custom container, e.g. document.querySelector('.fooContainer') + // or a selector, e.g. '.fooContainer' + container : null, + + // true/false to control reveal animations on mobile. + mobile : true, + + // true: reveals occur every time elements become visible + // false: reveals occur once as elements become visible + reset : false, + + // 'always' — delay for all reveal animations + // 'once' — delay only the first time reveals occur + // 'onload' - delay only for animations triggered by first load + useDelay : 'always', + + // Change when an element is considered in the viewport. The default value + // of 0.20 means 20% of an element must be visible for its reveal to occur. + viewFactor : 0.2, + + // Pixel values that alter the container boundaries. + // e.g. Set `{ top: 48 }`, if you have a 48px tall fixed toolbar. + // -- + // Visual Aid: https://scrollrevealjs.org/assets/viewoffset.png + viewOffset : { top: 0, right: 0, bottom: 0, left: 0 }, + + // Callbacks that fire for each completed element reveal, and if + // `config.reset = true`, for each completed element reset. When creating your + // callbacks, remember they are passed the element’s DOM node that triggered + // it as the first argument. + afterReveal : function(domEl) {}, + afterReset : function(domEl) {} + }; + + + + function ScrollReveal(config) { + + // Support instantiation without the `new` keyword. + if (typeof this == 'undefined' || Object.getPrototypeOf(this) !== ScrollReveal.prototype) { + return new ScrollReveal(config) + } + + sr = this; // Save reference to instance. + sr.tools = new Tools(); // *required utilities + + if (sr.isSupported()) { + + sr.tools.extend(sr.defaults, config || {}); + + _resolveContainer(sr.defaults); + + sr.store = { + elements : {}, + containers : [] + }; + + sr.sequences = {}; + sr.history = []; + sr.uid = 0; + sr.initialized = false; + } + + // Note: IE9 only supports console if devtools are open. + else if (typeof console !== 'undefined' && console !== null) { + console.log('ScrollReveal is not supported in this browser.'); + } + + return sr + } + + + + /** + * Check if client supports CSS Transform and CSS Transition. + * @return {boolean} + */ + ScrollReveal.prototype.isSupported = function() { + var style = document.documentElement.style; + return 'WebkitTransition' in style && 'WebkitTransform' in style + || 'transition' in style && 'transform' in style + }; + + + + /** + * Creates a reveal set, a group of elements that will animate when they + * become visible. If [interval] is provided, a new sequence is created + * that will ensure elements reveal in the order they appear in the DOM. + * + * @param {string|Node} [selector] The element (node) or elements (selector) to animate. + * @param {Object} [config] Override the defaults for this reveal set. + * @param {number} [interval] Time between sequenced element animations (milliseconds). + * @param {boolean} [sync] Used internally when updating reveals for async content. + * + * @return {Object} The current ScrollReveal instance. + */ + ScrollReveal.prototype.reveal = function(selector, config, interval, sync) { + + var + container, + elements, + elem, + elemId, + sequence, + sequenceId; + + // Resolve container. + if (config && config.container) { + container = _resolveContainer(config); + } else { + container = sr.defaults.container; + } + + // Let’s check to see if a DOM node was passed in as the first argument, + // otherwise query the container for all elements matching the selector. + if (sr.tools.isNode(selector)) { + elements = [selector]; + } else { + elements = Array.prototype.slice.call(container.querySelectorAll(selector)); + } + + if (!elements.length) { + console.log('ScrollReveal: reveal on "'+ selector + '" failed, no elements found.'); + return sr + } + + // No custom configuration was passed, but a sequence interval instead. + // let’s shuffle things around to make sure everything works. + if (config && typeof config == 'number') { + interval = config; + config = {}; + } + + // Prepare a new sequence if an interval is passed. + if (interval && typeof interval == 'number') { + sequenceId = _nextUid(); + + sequence = sr.sequences[sequenceId] = { + id : sequenceId, + interval : interval, + elemIds : [], + active : false + } + } + + // Begin main loop to configure ScrollReveal elements. + for (var i = 0; i < elements.length; i++) { + + // Check if the element has already been configured and grab it from the store. + elemId = elements[i].getAttribute('data-sr-id'); + if (elemId) { + elem = sr.store.elements[elemId]; + } + + // Otherwise, let’s do some basic setup. + else { + elem = { + id : _nextUid(), + domEl : elements[i], + seen : false, + revealing : false + }; + elem.domEl.setAttribute('data-sr-id', elem.id); + } + + // Sequence only setup + if (sequence) { + + elem.sequence = { + id : sequence.id, + index : sequence.elemIds.length + }; + + sequence.elemIds.push(elem.id); + } + + // New or existing element, it’s time to update its configuration, styles, + // and send the updates to our store. + _configure(elem, config || {}); + _style(elem); + _updateStore(elem); + + // We need to make sure elements are set to visibility: visible, even when + // on mobile and `config.mobile == false`, or if unsupported. + if (sr.tools.isMobile() && !elem.config.mobile || !sr.isSupported()) { + elem.domEl.setAttribute('style', elem.styles.inline); + elem.disabled = true; + } + + // Otherwise, proceed normally. + else if (!elem.revealing) { + elem.domEl.setAttribute('style', + elem.styles.inline + + elem.styles.transform.initial + ); + } + } + + // Each `reveal()` is recorded so that when calling `sync()` while working + // with asynchronously loaded content, it can re-trace your steps but with + // all your new elements now in the DOM. + + // Since `reveal()` is called internally by `sync()`, we don’t want to + // record or intiialize each reveal during syncing. + if (!sync && sr.isSupported()) { + _record(selector, config); + + // We push initialization to the event queue using setTimeout, so that we can + // give ScrollReveal room to process all reveal calls before putting things into motion. + // -- + // Philip Roberts - What the heck is the event loop anyway? (JSConf EU 2014) + // https://www.youtube.com/watch?v=8aGhZQkoFbQ + if (sr.initTimeout) { + window.clearTimeout(sr.initTimeout); + } + sr.initTimeout = window.setTimeout(_init, 0); + } + + return sr + }; + + + + /** + * Re-runs `reveal()` for each record stored in history, effectively capturing + * any content loaded asynchronously that matches existing reveal set selectors. + * + * @return {Object} The current ScrollReveal instance. + */ + ScrollReveal.prototype.sync = function() { + if (sr.history.length && sr.isSupported()) { + for (var i = 0; i < sr.history.length; i++) { + var record = sr.history[i]; + sr.reveal(record.selector, record.config, record.interval, true); + }; + _init(); + } else { + console.log('ScrollReveal: sync failed, no reveals found.'); + } + return sr + }; + + + + /** + * Private Methods + * --------------- + * These methods remain accessible only to the ScrollReveal instance, even + * though they only "exist" during instantiation outside of the constructors scope. + * -- + * http://stackoverflow.com/questions/111102/how-do-javascript-closures-work + */ + + function _resolveContainer(config) { + var container = config.container; + + // Check if our container is defined by a selector. + if (container && typeof container == 'string') { + return config.container = window.document.querySelector(container); + } + + // Check if our container is defined by a node. + else if (container && !sr.tools.isNode(container)) { + console.log('ScrollReveal: Invalid container provided, using instead.'); + config.container = null; + } + + // Otherwise use by default. + if (container == null) { + config.container = window.document.documentElement; + } + + return config.container + } + + + + /** + * A consistent way of creating unique IDs. + * @returns {number} + */ + function _nextUid() { + return ++sr.uid; + } + + + + function _configure(elem, config) { + + // If the element hasn’t already been configured, let’s use a clone of the + // defaults extended by the configuration passed as the second argument. + if (!elem.config) { + elem.config = sr.tools.extendClone(sr.defaults, config); + } + + // Otherwise, let’s use a clone of the existing element configuration extended + // by the configuration passed as the second argument. + else { + elem.config = sr.tools.extendClone(elem.config, config); + } + + // Infer CSS Transform axis from origin string. + if (elem.config.origin === 'top' || elem.config.origin === 'bottom') { + elem.config.axis = 'Y'; + } else { + elem.config.axis = 'X'; + } + + // Let’s make sure our our pixel distances are negative for top and left. + // e.g. config.origin = 'top' and config.distance = '25px' starts at `top: -25px` in CSS. + if (elem.config.origin === 'top' || elem.config.origin === 'left') { + elem.config.distance = '-' + elem.config.distance; + } + } + + + + function _style(elem) { + var computed = window.getComputedStyle(elem.domEl); + + if (!elem.styles) { + elem.styles = { + transition : {}, + transform : {}, + computed : {} + }; + + // Capture any existing inline styles, and add our visibility override. + // -- + // See section 4.2. in the Documentation: + // https://github.com/jlmakes/scrollreveal.js#42-improve-user-experience + elem.styles.inline = elem.domEl.getAttribute('style') || ''; + elem.styles.inline += '; visibility: visible; '; + + // grab the elements existing opacity. + elem.styles.computed.opacity = computed.opacity; + + // grab the elements existing transitions. + if (!computed.transition || computed.transition == 'all 0s ease 0s') { + elem.styles.computed.transition = ''; + } else { + elem.styles.computed.transition = computed.transition + ', '; + } + } + + // Create transition styles + elem.styles.transition.instant = _generateTransition(elem, 0); + elem.styles.transition.delayed = _generateTransition(elem, elem.config.delay); + + // Generate transform styles, first with the webkit prefix. + elem.styles.transform.initial = ' -webkit-transform:'; + elem.styles.transform.target = ' -webkit-transform:'; + _generateTransform(elem); + + // And again without any prefix. + elem.styles.transform.initial += 'transform:'; + elem.styles.transform.target += 'transform:'; + _generateTransform(elem); + + } + + + + function _generateTransition(elem, delay) { + var config = elem.config; + + return '-webkit-transition: ' + elem.styles.computed.transition + + '-webkit-transform ' + config.duration / 1000 + 's ' + + config.easing + ' ' + + delay / 1000 + 's, opacity ' + + config.duration / 1000 + 's ' + + config.easing + ' ' + + delay / 1000 + 's; ' + + + 'transition: ' + elem.styles.computed.transition + + 'transform ' + config.duration / 1000 + 's ' + + config.easing + ' ' + + delay / 1000 + 's, opacity ' + + config.duration / 1000 + 's ' + + config.easing + ' ' + + delay / 1000 + 's; ' + } + + + + function _generateTransform(elem) { + var config = elem.config; + var transform = elem.styles.transform; + + if (parseInt(config.distance)) { + transform.initial += ' translate' + config.axis + '(' + config.distance + ')'; + transform.target += ' translate' + config.axis + '(0)'; + } + if (config.scale) { + transform.initial += ' scale(' + config.scale + ')'; + transform.target += ' scale(1)'; + } + if (config.rotate.x) { + transform.initial += ' rotateX(' + config.rotate.x + 'deg)'; + transform.target += ' rotateX(0)'; + } + if (config.rotate.y) { + transform.initial += ' rotateY(' + config.rotate.y + 'deg)'; + transform.target += ' rotateY(0)'; + } + if (config.rotate.z) { + transform.initial += ' rotateZ(' + config.rotate.z + 'deg)'; + transform.target += ' rotateZ(0)'; + } + transform.initial += '; opacity: ' + config.opacity + ';'; + transform.target += '; opacity: ' + elem.styles.computed.opacity + ';'; + } + + + + function _updateStore(elem) { + var container = elem.config.container; + + // If this element’s container isn’t already in the store, let’s add it. + if (container && sr.store.containers.indexOf(container) == -1) { + sr.store.containers.push(elem.config.container); + } + + // Update the element stored with our new element. + sr.store.elements[elem.id] = elem; + }; + + + + function _record(selector, config, interval) { + + // Save the `reveal()` arguments that triggered this `_record()` call, so we + // can re-trace our steps when calling the `sync()` method. + var record = { + selector : selector, + config : config, + interval : interval + }; + sr.history.push(record); + } + + + + function _init() { + if (sr.isSupported()) { + + // Initial animate call triggers valid reveal animations on first load. + // Subsequent animate calls are made inside the event handler. + _animate(); + + // Then we loop through all container nodes in the store and bind event + // listeners to each. + for (var i = 0; i < sr.store.containers.length; i++) { + sr.store.containers[i].addEventListener('scroll', _handler); + sr.store.containers[i].addEventListener('resize', _handler); + } + + // Let’s also do a one-time binding of window event listeners. + if (!sr.initialized) { + window.addEventListener('scroll', _handler); + window.addEventListener('resize', _handler); + sr.initialized = true; + } + } + return sr + } + + + + function _handler() { + _requestAnimationFrame(_animate); + } + + + + function _setActiveSequences() { + + var + active, + elem, + elemId, + sequence; + + // Loop through all sequences + sr.tools.forOwn(sr.sequences, function(sequenceId) { + sequence = sr.sequences[sequenceId]; + active = false; + + // For each sequenced elemenet, let’s check visibility and if + // any are visible, set it’s sequence to active. + for (var i = 0; i < sequence.elemIds.length; i++) { + elemId = sequence.elemIds[i] + elem = sr.store.elements[elemId]; + if (_isElemVisible(elem) && !active) { + active = true; + } + } + + sequence.active = active; + }); + } + + + + function _animate() { + + var + delayed, + elem; + + _setActiveSequences(); + + // Loop through all elements in the store + sr.tools.forOwn(sr.store.elements, function(elemId) { + + elem = sr.store.elements[elemId]; + delayed = _shouldUseDelay(elem); + + // Let’s see if we should reveal, and if so, whether to use delay. + if (_shouldReveal(elem)) { + if (delayed) { + elem.domEl.setAttribute('style', + elem.styles.inline + + elem.styles.transform.target + + elem.styles.transition.delayed + ); + } else { + elem.domEl.setAttribute('style', + elem.styles.inline + + elem.styles.transform.target + + elem.styles.transition.instant + ); + } + + // Let’s queue the `afterReveal` callback and tag the element. + _queueCallback('reveal', elem, delayed); + elem.revealing = true; + elem.seen = true; + + if (elem.sequence) { + _queueNextInSequence(elem, delayed); + } + } + + // If we got this far our element shouldn’t reveal, but should it reset? + else if (_shouldReset(elem)) { + elem.domEl.setAttribute('style', + elem.styles.inline + + elem.styles.transform.initial + + elem.styles.transition.instant + ); + _queueCallback('reset', elem); + elem.revealing = false; + } + }); + } + + + + /** + * Sequence callback that triggers the next element. + */ + function _queueNextInSequence(elem, delayed) { + + var + elapsed = 0, + delay = 0, + sequence = sr.sequences[elem.sequence.id]; + + // We’re processing a sequenced element, so let's block other elements in this sequence. + sequence.blocked = true; + + // Since we’re triggering animations a part of a sequence after animations on first load, + // we need to check for that condition and explicitly add the delay to our timer. + if (delayed && elem.config.useDelay == 'onload') { + delay = elem.config.delay; + } + + // If a sequence timer is already running, capture the elapsed time and clear it. + if (elem.sequence.timer) { + elapsed = Math.abs(elem.sequence.timer.started - new Date()); + window.clearTimeout(elem.sequence.timer); + } + + // Start a new timer. + elem.sequence.timer = { started: new Date() }; + elem.sequence.timer.clock = window.setTimeout(function() { + + // Sequence interval has passed, so unblock the sequence and re-run the handler. + sequence.blocked = false; + elem.sequence.timer = null; + _handler(); + + }, Math.abs(sequence.interval) + delay - elapsed); + } + + + + function _queueCallback(type, elem, delayed) { + + var + elapsed = 0, + duration = 0, + callback = 'after'; + + // Check which callback we’re working with. + switch (type) { + + case 'reveal': + duration = elem.config.duration; + if (delayed) { + duration += elem.config.delay; + } + callback += 'Reveal'; + break + + case 'reset': + duration = elem.config.duration; + callback += 'Reset'; + break + } + + // If a timer is already running, capture the elapsed time and clear it. + if (elem.timer) { + elapsed = Math.abs(elem.timer.started - new Date()); + window.clearTimeout(elem.timer.clock); + } + + // Start a new timer. + elem.timer = { started: new Date() }; + elem.timer.clock = window.setTimeout(function() { + + // The timer completed, so let’s fire the callback and null the timer. + elem.config[callback](elem.domEl); + elem.timer = null; + + }, duration - elapsed); + } + + + + function _shouldReveal(elem) { + if (elem.sequence) { + var sequence = sr.sequences[elem.sequence.id]; + return sequence.active + && !sequence.blocked + && !elem.revealing + && !elem.disabled + } + return _isElemVisible(elem) + && !elem.revealing + && !elem.disabled + } + + + + function _shouldUseDelay(elem) { + var config = elem.config.useDelay; + return config === 'always' + || (config === 'onload' && !sr.initialized) + || (config === 'once' && !elem.seen) + } + + + + function _shouldReset(elem) { + if (elem.sequence) { + var sequence = sr.sequences[elem.sequence.id]; + return !sequence.active + && elem.config.reset + && elem.revealing + && !elem.disabled + } + return !_isElemVisible(elem) + && elem.config.reset + && elem.revealing + && !elem.disabled + } + + + + function _getContainer(container) { + return { + width : container.clientWidth, + height : container.clientHeight + } + } + + + + function _getScrolled(container) { + + // Return the container scroll values, plus the its offset. + if (container && container !== window.document.documentElement) { + var offset = _getOffset(container); + return { + x : container.scrollLeft + offset.left, + y : container.scrollTop + offset.top + } + } + + // Otherwise, default to the window object’s scroll values. + else { + return { + x : window.pageXOffset, + y : window.pageYOffset + } + } + } + + + + function _getOffset(domEl) { + + var + offsetTop = 0, + offsetLeft = 0, + + // Grab the element’s dimensions. + offsetHeight = domEl.offsetHeight, + offsetWidth = domEl.offsetWidth; + + // Now calculate the distance between the element and its parent, then + // again for the parent to its parent, and again etc... until we have the + // total distance of the element to the document’s top and left origin. + do { + if (!isNaN(domEl.offsetTop)) { + offsetTop += domEl.offsetTop; + } + if (!isNaN(domEl.offsetLeft)) { + offsetLeft += domEl.offsetLeft; + } + } while (domEl = domEl.offsetParent); + + return { + top : offsetTop, + left : offsetLeft, + height : offsetHeight, + width : offsetWidth + } + } + + + + function _isElemVisible(elem) { + + var + offset = _getOffset(elem.domEl), + container = _getContainer(elem.config.container), + scrolled = _getScrolled(elem.config.container), + vF = elem.config.viewFactor, + + // Define the element geometry. + elemHeight = offset.height, + elemWidth = offset.width, + elemTop = offset.top, + elemLeft = offset.left, + elemBottom = elemTop + elemHeight, + elemRight = elemLeft + elemWidth; + + return confirmBounds() || isPositionFixed() + + function confirmBounds() { + + var + // Define the element’s functional boundaries using its view factor. + top = elemTop + elemHeight * vF, + left = elemLeft + elemWidth * vF, + bottom = elemBottom - elemHeight * vF, + right = elemRight - elemWidth * vF, + + // Define the container functional boundaries using its view offset. + viewTop = scrolled.y + elem.config.viewOffset.top, + viewLeft = scrolled.x + elem.config.viewOffset.left, + viewBottom = scrolled.y - elem.config.viewOffset.bottom + container.height, + viewRight = scrolled.x - elem.config.viewOffset.right + container.width; + + return top < viewBottom + && bottom > viewTop + && left > viewLeft + && right < viewRight + } + + function isPositionFixed() { + return (window.getComputedStyle(elem.domEl).position === 'fixed') + } + } + + + + return ScrollReveal + + })(); + + + /** + * helper.tools.js + * --------------- + * Simple deep object extend, and a few other agnostic helper methods. + * gist: https://gist.github.com/jlmakes/9f104e3f1b4d86334987 + */ + + Tools = (function() { + + Tools.prototype.isObject = function(object) { + return object !== null && typeof object === 'object' && object.constructor == Object + }; + + Tools.prototype.isNode = function(object) { + return typeof Node === 'object' + ? object instanceof Node + : object && typeof object === 'object' + && typeof object.nodeType === 'number' + && typeof object.nodeName === 'string' + }; + + Tools.prototype.forOwn = function(object, callback) { + if (!this.isObject(object)) { + throw new TypeError('Expected "object", but received "' + typeof object + '".'); + } else { + for (var property in object) { + if (object.hasOwnProperty(property)) { + callback(property); + } + } + } + }; + + Tools.prototype.extend = function(target, source) { + this.forOwn(source, function(property) { + if (this.isObject(source[property])) { + if (!target[property] || !this.isObject(target[property])) { + target[property] = {}; + } + this.extend(target[property], source[property]); + } else { + target[property] = source[property]; + } + }.bind(this)); + return target + }; + + Tools.prototype.extendClone = function(target, source) { + return this.extend(this.extend({}, target), source) + }; + + Tools.prototype.isMobile = function() { + return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) + }; + + function Tools() {}; + return Tools + + })(); + + + + _requestAnimationFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame; + + + +}).call(this); + +return this.ScrollReveal; + +})); diff --git a/docs/vendor/scrollreveal/scrollreveal.min.js b/docs/vendor/scrollreveal/scrollreveal.min.js new file mode 100644 index 00000000000..4adb29feec6 --- /dev/null +++ b/docs/vendor/scrollreveal/scrollreveal.min.js @@ -0,0 +1 @@ +!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t(require,exports,module):e.ScrollReveal=t()}(this,function(e,t,n){return function(){"use strict";var e,t,n;this.ScrollReveal=function(){function i(n){return"undefined"==typeof this||Object.getPrototypeOf(this)!==i.prototype?new i(n):(e=this,e.tools=new t,e.isSupported()?(e.tools.extend(e.defaults,n||{}),o(e.defaults),e.store={elements:{},containers:[]},e.sequences={},e.history=[],e.uid=0,e.initialized=!1):"undefined"!=typeof console&&null!==console,e)}function o(t){var n=t.container;return n&&"string"==typeof n?t.container=window.document.querySelector(n):(n&&!e.tools.isNode(n)&&(t.container=null),null==n&&(t.container=window.document.documentElement),t.container)}function r(){return++e.uid}function s(t,n){t.config?t.config=e.tools.extendClone(t.config,n):t.config=e.tools.extendClone(e.defaults,n),"top"===t.config.origin||"bottom"===t.config.origin?t.config.axis="Y":t.config.axis="X","top"!==t.config.origin&&"left"!==t.config.origin||(t.config.distance="-"+t.config.distance)}function a(e){var t=window.getComputedStyle(e.domEl);e.styles||(e.styles={transition:{},transform:{},computed:{}},e.styles.inline=e.domEl.getAttribute("style")||"",e.styles.inline+="; visibility: visible; ",e.styles.computed.opacity=t.opacity,t.transition&&"all 0s ease 0s"!=t.transition?e.styles.computed.transition=t.transition+", ":e.styles.computed.transition=""),e.styles.transition.instant=l(e,0),e.styles.transition.delayed=l(e,e.config.delay),e.styles.transform.initial=" -webkit-transform:",e.styles.transform.target=" -webkit-transform:",c(e),e.styles.transform.initial+="transform:",e.styles.transform.target+="transform:",c(e)}function l(e,t){var n=e.config;return"-webkit-transition: "+e.styles.computed.transition+"-webkit-transform "+n.duration/1e3+"s "+n.easing+" "+t/1e3+"s, opacity "+n.duration/1e3+"s "+n.easing+" "+t/1e3+"s; transition: "+e.styles.computed.transition+"transform "+n.duration/1e3+"s "+n.easing+" "+t/1e3+"s, opacity "+n.duration/1e3+"s "+n.easing+" "+t/1e3+"s; "}function c(e){var t=e.config,n=e.styles.transform;parseInt(t.distance)&&(n.initial+=" translate"+t.axis+"("+t.distance+")",n.target+=" translate"+t.axis+"(0)"),t.scale&&(n.initial+=" scale("+t.scale+")",n.target+=" scale(1)"),t.rotate.x&&(n.initial+=" rotateX("+t.rotate.x+"deg)",n.target+=" rotateX(0)"),t.rotate.y&&(n.initial+=" rotateY("+t.rotate.y+"deg)",n.target+=" rotateY(0)"),t.rotate.z&&(n.initial+=" rotateZ("+t.rotate.z+"deg)",n.target+=" rotateZ(0)"),n.initial+="; opacity: "+t.opacity+";",n.target+="; opacity: "+e.styles.computed.opacity+";"}function f(t){var n=t.config.container;n&&-1==e.store.containers.indexOf(n)&&e.store.containers.push(t.config.container),e.store.elements[t.id]=t}function u(t,n,i){var o={selector:t,config:n,interval:i};e.history.push(o)}function d(){if(e.isSupported()){p();for(var t=0;tt&&i>m&&n>p&&w>y}function n(){return"fixed"===window.getComputedStyle(e.domEl).position}var i=E(e.domEl),o=x(e.config.container),r=q(e.config.container),s=e.config.viewFactor,a=i.height,l=i.width,c=i.top,f=i.left,u=c+a,d=f+l;return t()||n()}return i.prototype.defaults={origin:"bottom",distance:"20px",duration:500,delay:0,rotate:{x:0,y:0,z:0},opacity:0,scale:.9,easing:"cubic-bezier(0.6, 0.2, 0.1, 1)",container:null,mobile:!0,reset:!1,useDelay:"always",viewFactor:.2,viewOffset:{top:0,right:0,bottom:0,left:0},afterReveal:function(e){},afterReset:function(e){}},i.prototype.isSupported=function(){var e=document.documentElement.style;return"WebkitTransition"in e&&"WebkitTransform"in e||"transition"in e&&"transform"in e},i.prototype.reveal=function(t,n,i,l){var c,y,m,p,g,w;if(c=n&&n.container?o(n):e.defaults.container,y=e.tools.isNode(t)?[t]:Array.prototype.slice.call(c.querySelectorAll(t)),!y.length)return e;n&&"number"==typeof n&&(i=n,n={}),i&&"number"==typeof i&&(w=r(),g=e.sequences[w]={id:w,interval:i,elemIds:[],active:!1});for(var v=0;v Date: Wed, 28 Jun 2017 16:44:04 +0300 Subject: [PATCH 199/201] adding index file --- docs/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.html b/docs/index.html index 7b78f445c7e..22c74bcf754 100644 --- a/docs/index.html +++ b/docs/index.html @@ -86,7 +86,7 @@
-

Welcome to R-Instat website. You will find all inforamtion you need to know about R-Instat

+

Welcome to R-Instat website.


R-Instat is a free, open source statistical software that is easy to use, even with low computer literacy. It encourages good statistical practices and learning, by opening the door for training to emphasis concepts rather than theory. This software is designed to support improved statistical literacy in Africa and beyond, through work undertaken primarily within Africa. From 502f09aa3ca0a744cec55e5ff6ae2af4adf460db Mon Sep 17 00:00:00 2001 From: maxwell fundi Date: Wed, 28 Jun 2017 16:48:52 +0300 Subject: [PATCH 200/201] removing unnecesary images --- docs/img/portfolio/fullsize/1.jpg | Bin 63788 -> 0 bytes docs/img/portfolio/fullsize/2.jpg | Bin 48101 -> 0 bytes docs/img/portfolio/fullsize/3.jpg | Bin 48228 -> 0 bytes docs/img/portfolio/fullsize/4.jpg | Bin 49055 -> 0 bytes docs/img/portfolio/fullsize/5.jpg | Bin 62334 -> 0 bytes docs/img/portfolio/fullsize/6.jpg | Bin 53428 -> 0 bytes docs/img/portfolio/thumbnails/1.jpg | Bin 63788 -> 0 bytes docs/img/portfolio/thumbnails/2.jpg | Bin 48101 -> 0 bytes docs/img/portfolio/thumbnails/3.jpg | Bin 48228 -> 0 bytes docs/img/portfolio/thumbnails/4.jpg | Bin 49055 -> 0 bytes docs/img/portfolio/thumbnails/5.jpg | Bin 62334 -> 0 bytes docs/img/portfolio/thumbnails/6.jpg | Bin 53428 -> 0 bytes 12 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/img/portfolio/fullsize/1.jpg delete mode 100644 docs/img/portfolio/fullsize/2.jpg delete mode 100644 docs/img/portfolio/fullsize/3.jpg delete mode 100644 docs/img/portfolio/fullsize/4.jpg delete mode 100644 docs/img/portfolio/fullsize/5.jpg delete mode 100644 docs/img/portfolio/fullsize/6.jpg delete mode 100644 docs/img/portfolio/thumbnails/1.jpg delete mode 100644 docs/img/portfolio/thumbnails/2.jpg delete mode 100644 docs/img/portfolio/thumbnails/3.jpg delete mode 100644 docs/img/portfolio/thumbnails/4.jpg delete mode 100644 docs/img/portfolio/thumbnails/5.jpg delete mode 100644 docs/img/portfolio/thumbnails/6.jpg diff --git a/docs/img/portfolio/fullsize/1.jpg b/docs/img/portfolio/fullsize/1.jpg deleted file mode 100644 index 44692cc902078585121655d9590d3312cbe50cd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63788 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 RG9nuP0D71W+;>w0|JfIUT7Uom diff --git a/docs/img/portfolio/fullsize/2.jpg b/docs/img/portfolio/fullsize/2.jpg deleted file mode 100644 index 0df8fde8c18bc38a36b7e9e9f7ba179164d41407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48101 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 diff --git a/docs/img/portfolio/fullsize/3.jpg b/docs/img/portfolio/fullsize/3.jpg deleted file mode 100644 index 3b0862707b2bce677bde7819960174c6a49aad48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48228 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 F|Jm%t5mx{J diff --git a/docs/img/portfolio/fullsize/5.jpg b/docs/img/portfolio/fullsize/5.jpg deleted file mode 100644 index cd87077058a73a025a34c0b80f966de50bdb371f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62334 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

P-tBw}rl^5o#Bn4kF5FeRV!YoQe;iq0R^OEBF zECYRi0WG}#V*Y1(jQs(oiKx12imbl?w3ND{6Acp$ng9JOYj*4L%BFK6E^5t^8nwNt z^D&-@4zw4s&cOO`*lE7Puz=-?Y2iKak%WKq?z6n1q(#g@F88Zq-x8oAPI5|U%*_>j z7hBd)>9S|A5cZy(U8pFXQMJI2tEU#;TAs{!WRrv|3X!TSilYu$t3M7O7UnYKOf+Y? z!}P#kNZWEJ?1j&5v#Qf}_v6KO$f4YkZwWuAWn7lUwoJUw17kY|u5)Gc3m?yFLm7nV z)E;*);Ni@#JGO0X$9Jt&!YXtaw;1EbUyUr)z3C3GM|Z=Ea_#@*JEHo8Cd@hXdeSDa zRnpy-_KgNhMwJC_wgFbE7WeHkg&5ZJWPoEM&z8HP1*f(mb0&o4n^$!T7b=kn7Uqq< zA*iehG`C)=;bYwfe9bbY#aZUOSCk2I?n2dbQHb1!>#K!K%aQez;br=b;#JTihZ`}S z={xlU3K}9T*-GK5#h7mj;4lp^U0rkbWMJoD6t(|fLv=Q^}mVfN+90K#GXpN=_yF? z_#V$xJJ+1qls!xgDG}#M!XH7vZkeVl%U&IAZGiU^j0t`ntNa60cZz6qJ z=kH4kQ4TE+nO6~qZ&|M3l9{)2X&Pfr=xj~p_@+5^V^x5e;AffHNLHY?;G)j1?QAk8 z3arTX=VgHZb_?WJGHDigYP0~~z0PZ*SxW|wswYn4JO{euH+Z)ln@K9 zkQM4@Z4ufdClc@^HDAb7F);=otAqE^t$szUi(8ER3HzdWFTEMd&fFsdf8I2NfDLfQ zB5vggt&v>10_7@F!AB-CzInGo&FPB5d2u#gEJa;&)vTQ_T_-{#g3AF*aTs%zPLQ#Z z;$!A#j!d@GdzR{zfQ-F?v>A!AACNytrr_q!Wi3yT65-YLdLjm8&}FeT3?9{nPXH<4 z?&P|$LpVWsnpZe_{^kD$D{R?nYzu%gM0xMV4tW-jDMGN>6I>NrvGzEpUJZLX->pyi(KQh=pXF zcbGr&LsCAlAd%l=?1ppX_=0eb9QgUxbw?&SSr46%OBQry z(f6{T3L?v&|T*Hq$UA z_xdlXHk@s?Pk8+kg)>w%nUdnH-mWrb910sNG`q<%q!w)0i$vy)BJc@dolNG;dQ}&w zm}dIB0+GCI-2Hf(2G4gLW3(1zxKG-d&1*=iA}h2ZBSp&&F0cD9pgm(t;(5osWv79y zPTZ`qBO}buTT|ksKutcsTklJ|U8A8D;(0KvSO9g`Qt$D=_V{Hc#;BM4PyRa| zu-pk^qE{rj`OJ{a1ULnh*8Y@7bk*nE$($7in>Td+p3x-@4u z&cFGP|3oE?;qA0c6?d7?*ErA`n0cCmYG^-!QD+)RcQ-wVj{CuXe6Hp)Lo=;B>tP13 zvs_DtJWssOfY<%)T|&07x1@Bj7Zwo@+mt4%5!G3ok0UL!e+&%TlPUa^J^eV|v2oYj zS7)9+PdgpnEp*SS?|P*Lr>OZU2Tt?>tkaW`_2Soht8!1{NOgyK`JYK*ji3^PL2ELEpMmyKWG+ow8Vb+YmrC1MT(HBudl8Otie(+1#LhBe&TgK@PY z91xsf?ze2}(j5I40DmSk8_Q=LaNRPO&gjN!SBaV8(iDu%%z}Qt zu(Hae6bK%rS9rg)xu_8rgjCPRhDZpF@{ks*`eDKGvP6jjcaU?^`HP=PBn2s&BY8Wm zuAe{p;WN$+P2IX3^9g$YE*n#z^G6o0U0`W%12Kk|kOp&R-57Cv@JwJx@ejOTi)PG} zojTxN2iAx$YMv(ojqt`O9*>ZH?rFBJld!jTX4$b6kpKJ(+$sb&h)LEmkND*{^ocda zUr7s+{!9{Jt?c?t!%FvVJ?wZiftY}E)H_+;gINuQ#*8fH1hJ&$kt>F4=19K|Qj|!6 zZ`vj_PqWJF4O8;pM2aod?xo5gn76mdeZ=gHTwttH_7%2ci){;nCUCHi#!^C6(b(c! zgmpkg0h6f+IOVJ&N~HC%gS{@)ugc0V;%V}CQJZX}$O^oyR2za6Rj4JQ-(tMAboy)~ zX~DK+7f*XD-p`{j1}PKZup7%PyGzE@wBf&|w|?xm0+;&yUfkX10pjk zx6EiUZOSjNgVT^bcQ;T1cL+7awdsN$`v29A;uP+@PhE zFwi8LGDIK0pz5^wuufpTTgo~yna`n~ zfcG!?%0x`>3X3;Crh(oFW-^3`u$$q7n3A;QUn}g#gt(aM-Y<*`Dxk^bj&*+PJpMY& zWRC;gxs9$u%P4#?!1AS74rJTC^^f#fJJpci2SFt4G+~=|u*#h5K}c#X37Y1Es`y%! z<6=7evrkvsuf-d2Dxn-m2IpBN%?(!o1W7mo#|dhAO&{pxg~SUCs&PF69jmaH4<_?D zh0|MxnS&qeM`#`mi{y>*%ud>I8*%>B>WP=qq}@OnJIcKD)~(H|u6)wTGBY6PTkVD6 z6!AI-Sewi+-2BeXgp&)pMh+CJoxRj zYvbmx_r2Qid*Oeh#E_Nt`n3LLr#MZEj)1^OCf8U|iXUCEg@CW|6cBB$XD7eAURcV` z5?dB{fE%pjOw^qEhw#!D_>znVhlmNd)&DWPYg9}r*9t!b1f1%9g zsKo>LG%XIv4&v`8dK0^e_SdFQ2rHrEVA<0VB^glBN{T&^)4|A-#gdz~VBUcA6!MBU zkd(M$Pc>0`N5Gmuvbaq-EcV-&)`)QlnfN~ZJ;T#-tXyF%(S7ZX>8)&#Z~ zDC&q;VHk4d_jy+M?f$Gj zjaN9_>WZ7UP!LT$r0RzHTG=%;chz?<_LGg^1sq*uMyTI1tW-Qo(y}KszTXtLTT+Ph zp~sF)C-Qz3==y>0=h6LAG17dc#Wj z%1f-qnlw~E`*R}3W6bvv%}}`iyXu-SJ8#q0>I^NmW+vG4z!`bo{1sNu*I1+M&VUz* zy1fCLb#Wg1VbiE%xd%D&WsDy^=%G5Vg+M0}Z>J0h>WT?ZW+Y_+zXc@c6O7H181|S9 z8DudoL2-iWl2Z(na&aUB4s(56VI>t=`CKFH<`+&)H-h}=v)Dfj#_DJdU^yx~J$TT9 zh2}vH3%QIFla|%lB+~GzEzjf?Lt~122tMSxXzJ381`tImSkpH#R_hR5?B7{e{D+C3 zt4qQ$JtlO+CxJ&r_Jc6f?Xol;v3q@8@lb?;_mtvl@$;X7$VUq@y`9Nd6;-Xn~M2oPVyW+fL>p4Tj5-wJc`Pyt4?-||*Q;5P? zUf7y?pbiJ<^` zD9x3Q?{}>>={g+%NIZUvblq2YPuf;!&~A2MbUW2uWt|ap6-`_aLIMU!dJjD!OGB9 z8^h|t|MZ=XgpaQ=a>569ffr*JXpDMd0+A4X0^Q!xU@^WeHjbZnF25z3;U!9E`|Atn zyav0@PP2s<*C}M5IciN8LvC)RB*dCP)<$mz8g}(zXQXR1ngvOMA_l94c*Kf;aU@bd zLbku+jHLiS)#kYNs`TD*=v_bj3m9J_DP!07|DCx3Ieid*08 z`eu#-$c?|;^zxeo!D|4Hl1u{r+K3i&u0+Lnf{($pzoK63))mfY?QDRKIJF*jBNi4E zYDlMv;GZZL<>CvwD@G&X-#+R{WLJ<^WAdI@h<(k>LVB_c3%&-G0JSC7Xr(hMnraqRP0j$SJ+X*=qP1sM3?+?Uhy5_T=m<+>HZD`Sci z9n`foDd#;r1ry4*=MD6_EhbfUwPtj9#I#=4nJv}DDxXCs=fO^bwae*DBXiEuo_Aec zg%xX#zz&LP80Pp~#inlOo;xTbg(BK&cPno+jVFt7(pVoG=VVs&lnYkmxu4JVbLM-E z?>_weOlybO-m!;SRIGIQ)f6sP$f%LJROa{Q`eQ_Y-<53@`Rp{IP95Z2bHE;?$4#oU zusS$NbSrnA9$weWT~ z-~4~Smw{g;&x+H6OtO`6r{QAvvmG`?4if*%?en^RkB?gk6Dj?z4gH@!uKc7KO6_|_ zJbwWM1%Ll4Zc>#iCe|B6_mSh`_gbJfA;Ilck}H(gg9>oqa^h_R<;@c3180gll5Rnt z2vy3GyvxkksO+YTplEp+C!RjuP5OpX+1YzR7Ms4@6Oa32!oi$Pj}KhSnV8V+D$R|#oyaNKl&(~S6#ko_aO1_~jN@NDXNm>! zOrJ0#H;m0hYX?Gx(ue3SS>c>z-{yk|C&D!(pwf0UybF55`AfM^Wys(!z+LWjd7ht~ zPJamnzVz4b6LG(w#EZej(AxNYV&m9kvs%N)S}nO`=5FlPygK=c8Zp=Gb`r*>d~P#J zH}A`|s5})4g$=?4H1#Cx81a<0k&7TtR!e~sOXXva%H1`wSO?nPU#z# z5&^qp8m7`EG&$?E#A)V3WBEB)#`WUmYxPNkB_0#Ym>%*_&T<{%20UuCN3ZKBm_ zK@&k0qso8Jew+I9z7*+V9N{^NYAG#Xxmrh~z* z&KV1vt53(Nsl=veoW`fCE~MJC;8i?woD(5*pgvd}&=heG{?hMlT#*kU2fq4hR|n`- zkC!}5S2Qxy*?7tN=fg*hL}&%U&&pex;f49M7#{aAE>%P&J}e(8e>GqGc_sV`7mPtFXfa775PK`-A+Fd?e^W>fMus z7{;-W0{?vC5ip7P)T=O~k~oqJTLEsgdw&X?=--8kc{yfq85g_@zRe!xU5*{nCnhb* zPxz9lLY^1wtmc$NZr>wUCO~D#P97Sh^uWtqkHQUj@d5fO{#XBIW^Fe{e;JTuoAuC_ zEaZn_?8l&|&Up+xtJF7*vCT;EgMTrgWP05WVfm9N#R!EPFm+(?4cs7iwjf*3h*T6}Gh8fvSG{L4aMc@V)mZv-Olt)%}b-$+- z+`6-N+#!>b(3)_2CHAXOBCu-~(Fn;B1zDZ(=O-DrXl$ zpaqwAs(N~5C2cv*LOcdC5F~-G!r|nGHZqnL-dj((bBTG&**3!iqmYSeAKJbzH)wKb zZ@^lX*5}M4H^Qo(;__IDCQ+`v4gb>4xzy!bieV?fr_7R+sYtIX?|dKHNvJ6?EXGQ( zgw@#r>h>Tp6{GP#1Z3adCmvCaHerd+$#vOWF`QSuMjti)G4_Ps_`I=&PV8*hJB93_ zbOF~1ZlBM(rdYl>!!UB~tdR<=jMK&7`ztflZ@zN5&d$4G7>)fk<_#AV*1|j~RA;s+ zLCZi>%BRbI166<(;3POjPEvDq$Z0+LdMWE3V!3EMyW{1{1b`dvEv2f^J@oh9!(t$> zo-h#&DN?tc|lD`@_n=MEp2;;YRzwyRe<`6gYGWH8du~yXI z7>kkNJJy!!XoJmR5L}T$evw0yfle^@H5EWf! z=QSUn$O4gi1TWc;x^Yz!c2Aa5$tIXoab>D3@NobY&wxKN>>nACvkNhIfl-Q>%k6eb+c!W43r(n+3Jd_zOr=VSL}J_!kf?l`-=J?!Ez5&jLpFhOQ1N%5U+k ze&DRxj2xu|k&`xO&wTdnels67LjVJ$cN%9RU-O0Qb1QH+J^fH~=SxhG0h@2`5EK(p z*dGHGHh2>d2y-<_U#(pS$|R)| zrWp%@2e}+dq8ZNqYa^6C%+Un;6eUc3!|)e?%VqJKdzW3&p9x1vtlnK5S8DJFnUGLj zQrXK5YobqjCL@#R7tioDz| zb$|?{pnk#htgDR^$4aJr>YRS<1=0M$iH`nK69gPO@jt~0=^H8!$ zBQ9vAW2IMn!gKHxJR8?(-#IFT%8u%ijIt?QWFdb6mPOwCXm^^rSV@#KMj^(Y*b@%pLqiGw4Yx533U6@^vOu z?n@>ofG}I#d%at;|rfn8*_}Y zouic8-c-5EE9usiMaqHanp>Ej(^KE|c84{ZB9t%sIbTaj$|umB#kV|0FOv*Zy9plx zGB--=4HTv7^$OI=bH@&uZ;gd&&Y}H^v)EZG2To&w$MKX)nGKnQbGS~XeIJU_*_#gY zeH!MdCYr#(M#Hrkd4RY$jgdB@MO6qf7BLI*zHEHAK=Jwah58fk&&Axr=Vf|SDbeXTts|LoYlRiT1A$2OLd?kAJ@UGTtlVixPY??jie{8{4 zo6dUoXIg>ed0=Ob55dHg1BOBWOjK0>2c7518E*)S9Z%3Xn z!7jgjs1|+K&FYO{oJ!RuS8iEhUw#nvM%TsXpNS7-=tx4og+?s?>UQTQN>sb~7a}@} zs1PG*R2qn(pW}jDl_Ed6W8S2bq}m!42S+XDsPXmBju$-&ERj1g1|NxdD+zOjtbpX$ zMa06F@Rh{owb#IlQ4KHMy25Bhw6N=;B}3!>m0O1B{QY>}e||O}&M(hpZK>dbWD9sr zan-8X^Hv@_&=ZTetDA?OaAMaFS4J4XD-r~&(W$}7R;-mI5$E-~Bd_AJ7k@(JOw|)K z-n|=yUrtT$yKOCtb^F&@7^wswOB%WUHzI{XD#6EJv_{ngW2}7+;uH!&sd1|PsW`$T z(;jG%Ztj!y#taMuDO9%Usv9AqwO%9|tDX9_Fn&naTx9OiySYv&|8zb1G;_BQVXUzC zol)!Ol^@+EwF`Oo*%F5GfNv%W-aiQgqh zHrO2u76LN8NDDEletAC-I(+{dgGzk!KrQBkS3u0JO#&LH8sImT1%E8{Fx|U)UTN8? zu`MFJM55ZafzCiPC;9P<2;rsFjSaM!BeU*P6K$+?&K48J8-%vUL|#LYkwyM+cr_<6 zYps(`g+FYK%%K_)(9OB8!*WiYP@_&YxzB++RqT)aTn5{37ysqXwxg*vIv{Y!W;&An z_M%NX5hLuMKBOM5Ace17bNZpOW{G|SZ!Auxya$|f*b$Oy=x8zXYtR5$%fDDYdQnUJ zVc=Us?Si;Yx-hM$s1>>QW6uz~Iw-Q0;CTXh`4CCl)hKK9G*}NdShCMkJJ(3iiF5F& zkV91ZRXVZWL>KgnvA=Tn=%7xrJXN~2BRyiLlZ}jeD70N}>&fH1%S}O$ysi$xx>aDS z;5v(nK{BOrM<#Z4Wxi8`YaW!zSc%!v_Rn{inzyuq%AO43(i7YAReUqvwFolGvsm&S z%`Um8CjWk4@>sh*hH{IROnuJr>1W!Rp?=0gWvZ> zrb;1qs@d^)uE^uN_xMizp*hLyHtdu&CDvGPv3bp}lD`L0%&F8Q=bg~Fi35oI6vqdC zoBjwYDwS)NVJ*c9YmPp{BLTl|ff?^7E61iJnIs?gX?@$rBrF_>ls>LDRCaCpIPz6v z%{9+Z$krT{MlSbfONi;6u1B2prUoy}kWGugdr-8BPs8?BX} z`bCeDT)berpkL|F$RDlnVSnVGLx28+b`uYXg!R<1VeXgs7ID!l^3Lu@8V2fh;~hVY z=9HBueW}Sy`QhT(qrIS0hvhmV+xoS!dfbojtq4{l*3v`%ZkOl&C<&;T9tZdCGTx%# z;8ayr;Voz8LSv`p8g{E&h8-t%JM=A|xxml!tueKwt6I)5Er>_%HNcslUh-$x_lc8s zvdHwb71I`>nj#EuemkpvX^TcPbjHKO9(;=$O7w^Z4@e_E9p_~NUgh@ z1)_{c7Umf6%ttlXM~#&!@6R4~uoE+dWdbyEvOvT%Rq@1hu=}p0W|guG13cjRF7QX8 z6h0RgHySy{jQb@O*{Z-KmhTC{!!wZ!2}_BwB_6ZypAAT8s#Sh8>zhxVP|+qihl}a6 z^CX>&bK1cWdYyFNNSY&=!z^I{y-LwBSDsaMXq_#W3h;Z`PyKLuct~QJxpXd6Za*Qy zjklrHCGiR(%rE#VF^X{qmyCCb*6^_@aFbYPtyRo;7c0=jG0;;b<(1{KWV|g$`X%;; zJyPIqs6VGcsT_*U_FpPgMnE`hhsz>>3z_dbUxmN_zH{R9%Lh%?+Fb6c z)#?#pnGB_%oB#r(Qz_k=n9Nf?u~v_X`al5zs2Soss7_?@gNi$N2^VBHmih69rRp1U zZ=!8FQL>c5_N7ePqT81_sSa&T%MmZGKe2pZK>7rd(S84tj?)LdogrOb`vD_l_nU-3 z`N6C&hqNUWuNar)joJh39OkkshU!fxf^E+XbE`CzqdQFyafBG54@4tkb_#-UM4k63 z?jmeVxbWAVl)nJV7Ylx=K4c3QDrqA46Lr~QV;40Vi_x4XI$Jf!wZ?v$4kpFD^fYMd zj&1B|IP=r%t~6Xz9U*IQ$dKh1^di0BDtEU>J*iWEGWX`SA0q!X3>EXVo>@$=H^KdA zA<6rqAvH?56U#@{h6*Zk;d-OhH6C2CxjeBvkoCdv#yM{`GhNIbPYW>}MaeXW@w@>|7@VY~oOHVX=(jSb*t>46!@6#!@HVWu5+7iTQ z0rufAgrfOaO;!S-DYm}-pxRL>Dx)?lE-xJ=;IERG=OR+}xzjJ;+2Dzt_fJ+i{`wY5 zf8A5Rn}LBe_RhG8uZz*5BMMf2AzJJ2$%+#*FZ)bE!QvdL?Cn0QB?{UOx7~y#p>6}A zdot$Cgv8y*3$Ge`rQr|jm0GY3Zhg@E=zHUJ#kpi2JrEUpCcy;H$al2VPNBZe2R~y* zL{7h|G_(50Wq;4fB2v@2XT6Jb!9OC@+gO`R2#NBOcf016J|i#cu=lFwCbxI_-sQ6P zkY6DRN89u11sd80lkZ#?!r@W1uCZ~m{LF-mF9;#lo77Ju93rqq-OA+0c0R_*EW{m& zo)j&j4T>XDcn|Ldd5Y#9jqQzEi5274^}hgU{H9~=%i3o*f%0OfZSoXgxx(4my66S> zXtK1nTZvEVTGrR>GL&=#Wu5hYG*aB(CPvRQU66;V-e1Q^gpEW%!@fcb1TJ^e35x@E z6E<46@(X-cVVfo#o^*{X0HjHde7OJX3$}Gz6(M2C*0wx>M2SB9t`^kff-#m^JfPC&2u|KyH|-F` ziWN+y>>w;u?Lrm;3|#QCrdYMu?BC;GGM9c>)vE?>1dJ_!B(kk^hRuC)1BInUwBr)? zg^LXrE2@^3ur6_!t9ug*zKE~mBKPIXf8GQtoj=>d1llgwoMa(#LOHLD)eT%~itSf_ zi63-D8W6GesZ_{kCgg&?y(YgJ|1w!mZz=Zt8yhD3_egLL2%G(}-wBZOcm|Y; zhJx7zTJRhqrepejnes_2pTN76_ro zPNx%=FsCMPUN}$VlRZqs$Q%Jd>aoA?{5D{w8dxXcz~+pz-Pu=@PubYewW^yGS->wy ze_Z#;J1El`dW~P}H@SUQXP|d^y%ZoP(J<{DVs7_byf-$nFQ=DM25t(yNTlcr1g)E^s3g^U^Ne?|Q9m01yA=vrh!1L}6Zi3?Ybn2zUt1hLs zL}5+nefGMyxnWegKJ>g_Xa%m=y9jj?cWk`}))#Y#bKG=Bfd~EMP_rjEyp{CEBjwz$ z9nm`B-{P+7v6_ve`ZQk&`xfbSjoZy^!AHN*U(aOI7F!RN>}pU}7nC@3ROL5u|HTjR z3c)?{RGIauoaWDy!?kF`jtP?ro5@zOWw6^unOTEB?k~W6~6$H1B}HcK~jiJPjxsjJQ}8p|ldn%bPJGJF{R9S-^c-Y_&2{*)S+ z>AU$nL@8<@?FJ(5J;zrtPbb)%E)eKyZG3m}*=yl}$qU~3Ezq$Ai?V5xc>sjtzajrO zw_}k_@ddrU=LO`8=Xhs4qiiMo0pm{71lRRrck*7}013e)??*-tKURi(VN~5mS>j~6 zJwA0UK&9_5LI#=B4X*V`{&Y&VbvKsoGX2QYFHzYPT!bixOJyCZmbR8L>b}|4Z-my- zZcoJc)I!|lQI5rbAR7qayK~z1P7aj~P1{yWX430^Lf3{wmIQwM)sA}gX1*w`LsG>6 zYQI7R_J>^1$L1LfCi0q{v*o6x<1F)5>T97fhFvU#-}Nm!>+^F@n}09m-UQ+>9XU+A zS`LD2OG5R#&fULvDW6hzoz+o&zaxea3CWisR6eD5$O!Q)j(4{AwzTAw&{s%7*9A72(Wv3ZWOk(qw(-LR=9Q+Tm;`UuX8i%Cp z*x46J;N`@+J{4K!xk~o;{T5Wm|GtA8{G3*HR`)_bV6RINg+^y5;1K|Y|Q_mZJ8~M(df@H zF8|@*>DQ^?k(GD%m8PYa72>DZ(v9)4e`tL`t*urFM8wR!<$+G*ek`K+>y?kS$Hy59 zl269ZNqFWSkcIo^toUv(i(e8u!YrRzIC<_f<865q#z&SHY8Mm9NU{?tm)bK)c!T)l zDD8QSRJvgEZ-M`fYPcl^hR%cQM#R?(F}yDNSPB~cRdgibdfBL7F|3Koc9`E5PJ>xw zDyiyq-95w^=0%>r>=wt*ir3&^_R9-(@-R*Cm~MSny^w$P4AVc7nXOhTtc@?Ry0opm z_G4J8vHbe{q%bh;2a(ajIoFF6GuUJ#Y4S(8_{REHm1}Q#{_E|WimjbMexU@PuvI0|M~1~@sB-{b1>$KEy!_gbMK zo7ac!q3~FEtVsy$x$}3|mw$x5K{Kr8JsSsQyKNdReR?q+_zL}B0W_vG=(imQE&yZl>95pq7COh zf(m?C{n`K9<%J95Y;EAAqSOd#aiLVv=mT(?x0rvdU}cTtuqw#H6p_$Tnal;wBv(>s zNKfr*y)k&w^62>lVM z1&@BPecAArxiyD{XTYemG9#bxu718vbYG-5s(($s*LFLzc9Wk?BeqER4+2{ahazs$ zp<9yHUS+`2!}I8OAB_A9H49eKa!O2_h&ZmzLgC-L_X?x^bAGzi+WKg%^Zm3GF@5SH z)yRj_I={)^C5B^ILBX*evlG~S-@6^gW{a_=RSRQf4qt2o<1FVL7alonhPl_o2PBiG z$O%XVwCm&`J)*j9tB)F%Y&8YdDdhw^Mtm)o_Cc-4cC{=*^ryFk$x=m}g&*IzVfQH@ zLV!<{G0PIH-{`IIOXmp%saH2CDxRc?`y0iqbLx?-h{^KkVwSzr`w?zxk}U)=j#wIXaJ!ATH2Hl?}U7Tr`20 zUX!KmwOt=x@%Xq4!V?Cv^d16Bzr%mCRBs?EcW!Gt<*{Mo^n%GG9NVR+eUZej`~&o& zO_NelhEZPgi7``=$<2QL)o}KVRZ)I1MfXa#PuBZ!p731$MRswsO2YGFHz|``cym;I z`)4nh-4ilTrGmKR*tC_1B<-!}`%3+jq36W`O(e_e@9CoC3LcT@anqnD^OPuZ~3t#6UfG+$U0rQ{fL zs&f+#*mAZ_fk4&V=^gU*RjRGT8(0-iCH#!7;{+Yln{w_Uf~XFWE|3*jv|ieloYB7r z!C|jqX)R@XB-wQflGII4gus)D`2Pj7Kuo`3H6+R%IXcuQ?fcTYi3#g0Jc2Rj3e!Zo zmYZ(twpXBaJgPsKN(6}L7g=Pp-5N6qB=LtRL%JWddL*21@HlJ?(qXq3}wtx09jbhsrjJ77IF3fo^LzLM)fa%e7{Kb~j)S)F=NCHpY71d~BY^F|(@d#aMjYdH%$mZ<0}f&&Xkt|{A_VBPBw~rYf3Vd(qrYM`aqBDsBT0Fq`-1=XN{>XooP(d#sh3Aiuwc}G82#7 zU`S+BC{C>^Oo)yH2{ee5z>yqz58(t^7+Ynmu$S5X=;RUWE&X)01&Yb7f@U1zp8o*j z9?z@nc2LhZ*wYSCY^rL}eYcuQ)F!5x%o6q*(5?n~f;ouMvr@7lOTm|J?T1~r+z$|H zEzW;RsUy?+T$TX#@r*XBsjik*DxXO93k}Uc=h+S2aCcT8LvXLBbRh*v8Q~GV6iHfH z%oZ9w#PPvOAz2V|F`d<-(wI}1b+`|k$M7%}fYDFfQ~_%>ED0+$q<#^<*WKZm_v-S9 zidxFbMSWE&y&u$QnDi@S6Hklqe(}OT4D0|igtCHJm-?s$*-AvR6%^mw%73xf!8=8{2y(`k8$nY^$zIi0|K=;&I z>)ZND*3zbkkOT}M+8R2tihk(!$D%*DS&Ed8R)k=o{G>uH?znkDdXwN|YkQr!_S=Dq z(5l)r;8MBu51-pG(6jQ9W;PoLwM0iGa%fy75 zYP2I#hM+i%KvLzmxg_Wkjq>q$x;B4KHl`xs50y=}%A)ZFXIlx}ZoT%;>5Gc*aw)C@dhC9Stt z)f!UQv-v92iQZdkqpxVIaI};C5=xLqEhZ~ZYhC%nCvRHy{Bn&0ZF~OEQYkkbBB@t^ zFQ?3d-ZK%cC*vk(j&NVwb7tVCQBoh(Yu9xJkFKX~rZ~oGSg{pvu5y2)h zTh+B()tYPUr;8&oy=|Mtnf+;P)>e~(guwp*h(l}I__^1jd8sG2z1!S&a+WJ6Qo>A# zT=h%7G%COJvJdKwdu)57w{LBwu<&Z2=F5@??am!;j9UUdQ^7r7W3pYEn~kKBFj{34 zb*+R}wMu2@V_fKhl}4|srWo{wPYHN&|DY-sMyu&XB*Q%N6%ckZ6eTFkym48NP zt=bDUN=KFC%_rs{Y~E47<-Z7*9K zF_dekwemvRJ_!1nn}Z{!q@6tF8ui|+mEDo*O1*A?^M*q(Ok9-Yw_0x$ZZPWtN?J#h z#H^sAavNy8RyOjQZlOq0aR^bGOi!uJ77K3rT3qSXws63$IEWpZ73wTZ-R&19id3Ym zD*_Cm)yXa=^k0^^MI{ImvXu9DELUU0v5zumM#=X(pls5{hRxPU}(x{cXoV8>z zjb6U5EYH7ZgiiY{O;P=(;NsdPwY~yWc#x4eUu9(n*LY+n{X|^YO)a+C+5#UXPP}LG zfgnCGno@WE3hZrD`7t_4>6EiEr(qpj1voMtu{2u4YxM{yRy3*1!=h~A$e18vNWez` zN}!=w+0GpZ&j{cg$2jAl?8J1P1*)5OZn|(wZ>8bKQbCL_*VOz$wQk$|l2rcZ?lx1U z`Zir0?i z#V3)B7S`(E*shuhdfr?b+a7TW=^^ZKhE^4&VnlHM5E41DPSR>jf@LqW{m@z#NP3z@ zGVZN1TGp#8!1F>W#;R)>KnOHpu0q~D#}xoiS;Hu&tGq4DDwB~>di-KUTr&y z$mLBQn%X5Krml^0Dn~SwnA2@a%La9_8AA61+vhAuMc&ah+3I}CLB&j!W&RlQ_i5{& z2cf5Q;HNX^Mme5Qiug9yB2>tqr~}^xSPr7wc&7#8KQ>}JkPC6J>I|_43bX>sNLKAl z3!^<^QBJjh;TR1w#y2hRsgByd;zxOGK|-WgTgmz-2Bw@(%A<^@_eW~>TE((<&s{vA z?UnAe{{U~T6!$W!+6jPEqcxy@F!raKe`0C1iyI3F*!%X{9BF7t-&IyMkRPbZM8RVi#rVl%uO#aLEMRDp?v{23!{gn^PA0;IeJq=qZ*Ns!&@83Fj{O zcUQ_1eo4#T%d~DbKC<4lwN#-wjE{JPOW-}eOuq58Zg!fW7M0S}Ak7aVU>R{q5cS{T zooz|w7R{&cF5$6ssc&t4bqZuU>HeZeXyY0+?Ee63{)T(&Ym-{F-}X-Uq|(!kKQZQM zSU8^ph>JeA!z7!oQCQr5($_SVy=8o@u{CrSeBH@c@r>8>{H&TO?f7P0da&0aYi^|q zZRF;M29w_qt(9Csp{~o4GK%GSvlO{QQbI;0l1T)Jw5xJO)vTjQ+FtD2t{P}A=u0mg zJpPp)^BmK!)e4$_Mor$f1r5!kS!r5O>ao%CDkp6z=A*5yxMo*=+0~5HtrcvRT=_zV z2e`nd=dTQFYgftwwkLRP^`+}oQrbu}QyQk(mo%Ir%i7m&Nk3NWgGt*S{h_TCTb_*5 ztI}%Q1xP)lW+O#z;~6vBvCa(v6x&C3Fe)hDY2b2oq9!NZ9Mx_WYgB-_>>H&KE1*!R zWEqy#f~6Vn>wFq1?0l8#x&{^$-CI2eQ=Y6o5gSmlx@BU%+J=njo|&FpVN&vGmm#3q^LB@ZtJH0B=(#n#UZi>JW#?_gUi z+f(-ShMiV27^L__Hu{yeRvBG>&8voGTf1OZ($DJYyub63CYaAvvs1~Tx@<)a>rKkj zQkU(u4lv-wB?OPUHtY5k*W8TP(Che@4ZZJ<>9pvlyfgJ|j5?rcT)TJ}uSxt_8IQ>t zb)VdAlew5nPCDOFV-{VKRX$k6?}Zja*Z%;k5p?#yZ`@l`)FmygStkuK3wr6PtAfjW zSh6#1$?c8W+Oq2{DIq3d#^yv%z3KU>MLN>|0FD?fn|^OSw(vsKs;Xq4Gj2@aJ980T zcdPtd6TK|CQfk{<-aWN=(@#?8(N-%0+qeRI6_j80waOvUJ_~(in#XphCZUu(6eboW zJb4&zw%mbQ)hTy>Zf;aTPuU;qqcceEIC2Ig^tJewuJrjT6-ub4sp!@;x(C6;k>w^c zT8X^i)m!`zrn0G|0{TPD{{YQz7>)Eb!CLJcL87Zq?5t1n@rXK>R|TrHp+JSAW1Mnr z2Mn&P~+bS*+Fz}zLKS_dI8B`$b$k7Xq>k18oD1Lcj^$F2sjujN!wa2 zHqGs8u0TV+MPyRo!W+DDN$X?P`$ucufN{ptsN<;^MQgFH84GJqltJA+pR`mkMGMMh zzz&d1!9Fnc-(en_lnSP|rq!w~rN>x843e=mHb-&5Mb}G_`>Hc}-&>ONP4x9OIuHN~ zZNDzA)j_7J)q>kyiuhh3BxBBUixM}#XPa$1F_kDCPP*dACx)qE@Qiz`yBam8)W&`L zsCCWq@?-;Tw1gmxXNE9+Xl?%hBYP5({t7E7(u8p)9?v17gehvqT%aT~VpM10loTr) zCKyA6jXm%{&U~btqkuG}1!a^p2;7MD9wD_LYKOqKT(aR*VkhE$0+6JUqr62ud%8cMyKC7QUDn^ab`{~pP*yoe?OQ2ubdQy7tol?A2TwTl zDY|jN=j_wu+5NotKW^_T2JCk>gBJv}8+MJ~L!b!~f^+VI+TrjD&nuF-zWubUu{!O> z(hK%rX12$f#sTN~k=w(JVfHYn$r~IXyvE>hxr<6_;e+;nhKWwcRbQ=3I z(MwprIMa(xPna2Zh?Vp!EEJ~qUQEvCYr5I1KAPytm|32c=7o-FRz@&w($*l`uWGP6 zg@vMPSkg>^IAah=r-H4bKBkqRvX)%|!Rk!%jXL((Wvmdsw8yOby6<7A3QCHYpP43P zOR_d3ug4~9O?lwfthddry=~%}q$N)2^ERv$lgvczOvRDP-fB{}r?!>W)|`5rDyrH< z%F~O89iVXSiNm9ks_M!aohp*yZgn-bx|Pzr&LPIh3zvp*uU_==WJhj@QjH5|f7B)7 z)P&ORb`@B`ASSV(1Csqo$i|eP`f_A={EdE&<*~QjttE#UtV)wS2oAPSG3rT#vaPVz zMys`QicaPBdZvxjQ*A)6W<>N1gNg3osLi|9y8KzEU$a;F8NJJD(m7DFw5ghqB&LWd zDLuwA*LKP%G`)1bN9)Jcs z*U?x?-2VVEmB}t3{qbu<`)r7*S*ZcIJ+isd1ytGB^^}7W$^N2K+0HX;^)V|ZjegID zP_8tTE}>1;G*YCUDg{1Zdqic{uUCUjooup1H%D``RDEXOuX2@n$qFDI!ZI8 zGHms{)t5c9@8#y&q|@$dLsHIPRLGLM)Sf;OvY-82nQWu-P-=FI_Q>8;I;o#!@<*Ao zB)F1!q~irc!vwXIL|%Qicuo6TsajK$D*}EBh-}c>`%BY*$(vs+w^~OWZsO5EBQOwwB8ci`?DQw+dRV3aX?W7wR3#{xNNP zRlgQPW~RADt+xHh+Pj&M!rVe%RD!9VkTX1|oL|3-5bN-E`R%Qy;8js?DPhtl(jsUl z@QCg7)w5R&w!dZ9oSD7%WU7&6n}sJ#DspfSDef`nU2W9zZLO(tk9641w&8Y#MJ97h zjJ^@GPyCOInf7{1nvYpMz}}l_VV72?>5_k@?9Ky{qhhTtrmhUu?@!4ZcHQ^3#c*vb zT#{*=I25^x4{?RHZBvu0;{^4}#k98rA@&MTr3@TwiA?j9XW6Qj%E5YUy?&;Dxjmn* zLKOWgeRO7(w0zzo7QeQfebpJgcjpYPP;TAxvuXkxeQr}A$yBuyB3y*=5p7nb`1@>2 zWi3_mjXP-j`M0iNH1}|AwPygO;?ld7!^STASDrqE7h7;>&Qn*ilj&oZ&eVC%_FA{;9@rQ-}+0}*#7`=ORGb)52=gA8BCRc7dVYL!l8fU;osq9%3wv@=kHE_0*25!v!dnW%PEmfiCbnh?+9v3cOVus~fIP#GbO|VqF7((5YMB6x)iDj#Fg8zF?v=%~ zyGXUO`H-VD;n@@E4*+R0%|pEE+G!@WskTgm&6$ijjNo=_l5bfy&En5>Xtutaz~+@m z!z;*-TSP_M+v^Q_Pt&%VcN8V9A}d{%M4q(D4gUbz`_&uCRXc*IB!q(7L*`OOCcb3nC8Ni;Me~E_Cx;w^BeyF@ZU$n z`jO{%{{XC>msS2C->Gga)iSCJgJ^XQq_(uU0-JRQ0+l4-XUaCyZ-!vCJfj8oW7((n z>2m$IP`B(VI_hae)a4w{#ccNGo;={*hf?NY*K%5$N>+HF%pU_8`Y$E>zXOPQ<)apX z9JLG}I;8muvwi~Y_0`tuhU;kDQ!k**6y@Ayfd&%EJPxH~+4e^Fw_lqS@9C$yq)Bw- z$u1Af-|&fbjz(@vTlUu8Mzr9ekr{{<)|txf0j0C6qVJW|`cF8T_+!76DRinc3KCGr z!F3i$?ccV>=G*0jARDy@o|K%{IHG)&7Oq#-6XE>~9qV(<)RiMuJ!15A6fLwz-&L@6>UP*C8coQ!#`+PoXm zs~`FbSCrg|C8-c*LGg(G%PIPg(Ld;NriH&!Jg4CTn;JURk~QMR7eB#DEeb< zRKNDv#bqB}~r)^lx<4Qndc%1M&_fTuKif@eO4-vKFp0R#mrmwAIupU0s%U z3Mu16tX@FtWu4Wb*42nk1a?K1&le)~`Jt=qZ+R(dx^~^d z1v~Q4A6KD&%{-yqA$-)7&(V{cpW6#{;k8^W&LW5xvYYfS5 zn|(C(3ZlBvsh8R^C{U5_9LH#g_Prh%p(lgW~p|Lr3PWf$r*E&Vk=*D zyj+#NMa^(%`#=7m?iTlj7VoDnx9LsAgyKJ)AHp~5ys4|7`k1y+tTRwF`xAT6{behy zRTT*$rG)_M4{Wg=#uoIY`Q+-})!?CSFKusDYGEaeNfj@hcoeA)i@*4ru(ZQZRYDIg^k z&55U%oDaN4op99E$}?zP%Y#lUB+~lm0M0F^g`CRN1e6Y*b&gu(Y^3dXl4@rXpSJyp`ygT7Jn> zO;jAAams3hnW0D}IdURB3VTVfyC}tfTR6il`*Ytt<6tPIytDnvl?Fv;%Iv?JBjXpX z6_?n|_HBMh*LME^x!VtT)1sA2Z|WAAu8yPxueeV?2wS+tkZbc+HFWmMnboQ5C09vj z5lZKov)rx`lV_z{ekPrM)34-Eua-NNy-H&BMq3IpOPXfc9KwbX=j`?ENAPXey0=AE zIH{-(#SDHi>1(xZ z_~5~_Tdz4r$F+UU+B?FWQxzpO3KDjPqCt56S?A#tcJX9QFEu-S_STuuUb8vUS;y&I zGeQ1S!ZL33D{RyI8Z~>3V#Z~-_U*xiEsKR9WnyyHoE6+gaf7Y3TQZHR^}4}FtJ{?B z6)v59HU2^jzS#6B?b&maE&X)(z%4DuaM>Ik7o2G+R;dC?47(#rbl5@G^fWEE?{!OV zA*-uWYc8vEGCiq<{dTVhcTbY^-REQO_Ihv?H%ZGxcxc!Qx zd@iEO@Nf|{vT#uDFjwra;`=Z1ciC^rK}n@n{n)icP}Dra5PbB`f~J-J6NkbA-&;7c z>tmjlm)hkTM%DiSs7q_=MK0x~HrkI*)iw&*Cz<(^7G0Mga{3W*=LVSFMT-9bKo9I( zs9j9Lfl9%jXogl+S;^4rlu&mswaTQZ6`OVSG!`fH>m;NrkUSzc(HW_Id*|{g_ZBX+ z1UGuOt4KIhpd33wlMu3eSr=Ab81*&AsWKEV3Z}p0x@5lt5_(hMs@WWp6!!``qFQ|_ zrl|h_mf)5>hm2>wwz(}`l6I=rl_vlcp2(a*MPj{k+jQJ6kR6Pjnp!}S8R zlJxhwcFILk&q-cl+D;h6;Gm?|vgK)YvZSz~`$}xcgW&Hh%I)k;Uol`2wDBPCCqTVBr$mFeXe$GZN>E{r|6HkCS+ zNG9cdrMZAZufC8>gvID?#bbntVdHBE``hugeI0$qd$< z621UA$z8A_KY%qRn*9TH2n$cEP*??<>3~#uC2_YcD7vhEmgkev&Ys zAr!6|HssH})!5^vy~%8A1k3xQNzBgx@<;yw7sfkozbI{cJToYMiJF$xfF~>>71-*_ zTUxR%KHmGSc-pR_-Fs5&EPjMJ>Un{{q?}ZN%i$WSbpHS!>}9^Txiy{7v#eXv-ix)N z_K|UMu&R305z>4CfOcOES%^DzS7MdP+P1o3@MJYqw>vGtcI%rfr>k$&91{g6=0b)F zPa-49-J#Xw^tJ3wU>d6OrYbajGSX?gaYC&J6Q)+Imf&DI~PBh{tk0`Fa(BjCQ^-fW$Y|ZCt z-PYCEZ>UJEDbnLAz$_={LEw1CxLiIA*_?7x_nyqG+f~IQQ?{qc`bv|G$NaZBEANc= zq#8BeQBbS4G4yX}Jv0DTwt{sI@FD5B_EV8>sdZ!`C|+bUS3swb`)5)gNFa%FBPiYb zlWkfIU#AmUHEoOU{cQ@Gq1{O}RLPPB#j*RSAN<68-Qqj-wZOf;O-AjtHg@}=P123j zb=&~8bEY7Zho!`cYVJ6Qo%O5z8Cq;~{tT;d?F;7Gb4|vSJ4B^PHLdxZJf?nA*r@Zj zX|+w-w^qbmJw3muR>L|Ja8k0*#xd-@;u|kY)@2|ot$~-*sR$`wF%{A6+OIqbx7St= z+J5EkU7qqOYf`G)I5O$0)`86g{l+~yI_%9}Pd@dvIpEqDcV+vFXzMhj)FlH46Xkt{ zo*c*B9cs=PD`#AzG~GKdaBXLL%L1;_rFm-7C7wxeW1#(!lW(qU)$B=Bd6877OYJ31 zx&0KPT9Yr#IK|7-7WbzuNGBiW9+e37HSAVVW|`;g*3*=l zHI1eJ08uZpw&=HQCro-x#ehm@l-Ay3{4ntU0Mg`>$K;^Vt1P=OcTgs_jn>xVsR~79 zF%u?OY6CwUVprEouc=CGwSR*&-rm(+X%p2657MI(P{L+1`OktYW*RSyN}xoRn5PwuoThO5i-dqptIrWC$b^4)~%G(w!dQ4 zabq&O+HUrWpQpOgs+q%p3M8RlsSEUx9(Lbd)Zediw*+0n)XiE4QJLYGkcn&AYCIIZ z6}c*RZJzZx>(Y{wKPVZ9^>ly8D`Ll=yV8u*liPmlZ+)`jS#{G{Oq@D36C?roSD1}| zsSa^=MEfH({Yt#m^=0Yo*<#s7RekpE>t$$)xbZ6jAq+y zm2+fh*ZSDJjGr1z&08nyd<))yR*zpSgvE_+wsJ=?b3Zj$yt zyIYYY>Q|PbDePWKm+Fl)O3G^g0HK=c*A_PYxxIEq`k`Ai&o@?}kX@pDX?Xztla3tI z9cZ%aWGZbrt01>8w2iuzy=PEbR57G@$yxl1{xOedqSk2t0HL#Ax8mk|U1DaAp;Wch z?lAg%rKbUr?Gw&C>%En5@NTQEmI~d|W+Fw}L!|Lc#G_81eXLl9&rv+0ztOncpXwy7 zrxI{+1dqBs3hbrPjq9};ZQI`I?i*rI)k6NIfN@dvf!_-CN8;c;=aguc&v7>1;$TzP zhSa5cn0O6e6B4_(`j!e+FZ8lL`|Xy~x|JJi-%9$jL!M^m-JaxYg_clPAXeRsKSTqPAT}szi<20eSh*x^?$XOO{xC?Pzeh99p6YP!lVUtI!Qo0 z*4`v|PAy0Alt#)q!!-Ij+b!Ok>S$`2xKk}Tw4|*h9?!tTVC2~aTkVC4fr`swk4tJrntB|C6!UDIPio2sW5DiqA7rL>Yj?H;7WZ%bE|DA7%|w+ zLv$_SPX3}WH17WZ;Z$aNlgcix*Ce7YR4&Q7l>IxZ;H-~v$|G%Ua#dg8nmr$4`X|y zk0xU4h1HdlGOS7MG3eDs4>s296sR$s^6FbMmJ+ z=8@HGaa8XpO-6l?JE6Ka$<#Ne{qP;6DzH2hG9pleiwH@?7!q_HEgaktRYS5OorRPGgw(UA4+xg$go^1|X1&p;{{WDz^+sN%uHRC{GV%In%&HJ3 z(}Rc^5!=o!^k!Z%j-h458h6H;lw`4zzfg{u!#X^oX4Q3CLRqL+nI{K3qWboDWN%L> z%zfGRZ51hhaqVWpDzS3mYivm`49lz}WWH$Q!yMl9OzL03iBmdHl}b?4JwVGb-;83} zST<3T4TR^I{K7M`=wWnKKB1r#Pi{As({#uzk>~v!xcxx|H>|0Mp*58SFoq zA9Oz)5_OYYCYHUFR4}Bx+R_%w$TI{Hm?9OVz?=zUsbm&k!PI1~$Q8GS8&}E+VaCr< zmy#C4i70Wih#-j+k;D-frMwZcF<)@DQufu+4pXLfYSLFkMh+#wytF$ ziJ^V6k4Ba3rE+=qaNzm|hQDO{qqovqQo6L}Q^7TKZk}Tt5Bw^FYAdL*)Vr&cWm~Ii zUbe+=M!6kIRTK2}&6RYWPa=L*4kSo~K9!^?Dg3LEA7mZcYgaxWkZajyzNl!W zRSmUtp;MI3pJC44PBM$=^FKgF_kEx=ytMCm~v?vufSxF06#Hf;f*n0l}$lYO+x2H#y$s1|C zZe5#lHC9^1G>}JHokndq0m*2{_vaq2t+m>-$>;3U=<&h4Y>#_(uIr~3tHWrw+}#=- zrKr+rp6o)Ehxk>DJ=3bs1ghoZk)7S_(i{S}Ymm#s&bw=>k`>FOv+3?u5u0bKpWy*_@hAP@rmdnX0Gn|M&ff41s6;2$R*2dJL8s%G1w~IA2$!&unC80|o z^O|re?Gd9+ily4FSsj~P!&oDzt1q?-!fNcVu8ORuTVBesAEb$;QIW2`I5np} zc_V5zt$Ny<0k^^QsY^JH&_~@Buen6?D3!fyMj?aI9n-a{MNOWm+Ghxx%^=OQ#ziLu zd?Nb&s%*m{e_Hg)HQkT@08p0twKGMzQS>!llT@5oQ6HO%KIprxtDaE_PY(>Z-8O#N z+|8o0+~aih4uZ7RumYM_5>%And?PjV*JseZH(G{WyuG@vx2b>J8S1b-H4P*wvpl@g z^7k0V>3uKlHLKHV$PV4#yUS*+wu6T6Wl8@4(YmkQLU{C?#E#>HYSZl2_67^Pa;DWeqf{Ct~THE2ArPyP3uXb@`9?w!g z5<_o$g}nC4(A_;+-KIgtj-qZiA;3=*_!z%R+bafs)~*?^?Qec|?bJ0%dPnx>l_aaI z0@zVG`KA8=#3FW9T;&X%Ul?VI_pmml`6+(b>M2}sO)F+gX>-IKIea5E{d!w9aLdzu z>&{Hua{FmrYw9kpl-5!S>8N6ANFS*_r1-{b*KWQa^)%M{@5xB1+sxBCimPktrg^ie zw-B<0q>e-xh^DW4?-x=g&rZD81>0)->ALp%Q%Sg({_#VA6+nd5AwB+=JaO%f)VjCg zV!pRtO{&Ydc2@edp~`0%xHd$br*HvK$>J1~=Rxht9?G^+WFl^^YRa|y+N#=hDcdvQ z))aB4sE|@;l$XSJ$DhCcH_c7Dz3&z%mupM3s$DhGl~m3Q(&7l1{Ul5u2=iSpt^6}} zZ(FPtOO1|$R;qVHbKt3gKM@cvu;b;ZN{q4a$|Pc#w#gNH3&(}EkD#jAE+2-t@s6QpU@rKcedNDWUpPK?dc?t z)YNhl{+hgGV>Pr@{S6h}W%VlCgJN$jwpQaz3$>_ugUu&V3FNdKM}*=R*6YqudhS;K zNQ-s$n_5LX>tW>?78mAh9#SV#V?DJiaA;c^CdJu>qzcx$V3~E(=5Bw?F&;6V`kE_U zl6C8A4>zra1)$_Xm_8yR>RoIgtE|Z+rA^DfC^fr5X)*${ZWNNHhJ}tIHS6}@lRf=p z_y%IW>1}Z#*}8-0p+>LHf@M zT7+wsws++M2mfuINe?#3iAR+G1NAvfA*ApI)#2ZwY6@ zC6d@JxQg{$ZGv*9ZnKZFQ$hU0W?R48!VWNJf+OiAOgoCDd6*gyq`wS%cLt2t;R8>~1^}RLr$HLJsP{Bx7 z6gZQJJ%$UavcVN+R}AxALa@W9r%-|9JP%>)g{yN9k*vI~0&A^QH~U3Zs^X0;yfn-J zRNI5n;wSSY#;U%`83*>cMh|?k)YvZ%+biYOVEJ7L^0?ZuLx|=SJ_iW%_iJ@9^(SLDyi_-)DD*I^aiA^y={ALDbHToBUvhTOxK>44F3dL7$<&n9THPj2q<@&gjEV5`C+&?d z;hERUDI4qCD$T65+%272yD>gzrh3%m@OUI*j!XE;F#8^}8AwwK8jefti z(+#LI?a|wgO>1KBTUPhB)NReg!V_~!G}KcZ67p02YbSz|aWc!gJ$kie@|ovZI=`tw z-n$OzwQGvPO--T2{{W<{A0C^(m1F+*2+g-l8ue}M{E*LFt_h!PJ(dK-2R| zM;OIlT8`gyikdC9%D7U%?$ZzzA_fzS0N$rJTpoh0I>U@=SQqzP)YTbxkyzg{eRNQb8(0fBCJ6>Hc749(M0dtga3Ey_E6fs6LwN zmlBFX!ceT5S}~lsEE#-6WmTnA+GqJJ-J8S}yRCxc*$P`KeFa`+B`GT$K?N$|-5!pQ zZ(H*QJ-)rZB)@DAdG9-LvuWKuONE$8Emp{?rky;M#l#Lr%s57>U0Z`SsO!nDUUsh3 z-*(3Clr;@4=TrWY?M?#1ze|7-s17MIP>#N}enU;JoEaVd%eeNva%nDXpftIro%YJQ zE`f~Dta0X(h>t&auhiYEcVP{?MOM%XQgvzbrgI`ug8JGut0q>f_N^UQQmLM8XB`2( zA8wNxsqNoiDZ!rpy)VN=b&GKB&7WGAXkS}x&TdmKYGq@Rk@$>b)UL{H%H;FyuKLZd zWc%Y}yEZ8=VY_`<8f5944tFhBcq#)#qGW8ZdE1i4$#!Ly>zv0DCyOh>AZuVW^mv8H=~QJ9r`JC z_VQcyf4_HY8;G}WHdRqhyt0bpFWOeg}+tdVT8KlLp^Wt_9dPHtO3Ch1%-e zZLns#S3J!sTnZ228d|0DX8WsyR@)x^TdJOItLsLBpe~#?mrGGaR4V9Qa^G6YriW6p+S4vd5{-KIz8+B>nineu zm9#(V68mjibX&HZTxhULt_-9mp(C2mB$qrSV^uHk%$K8Fn_a%;wRdH!T^scGTXUjD zL@P=Bt4Z@AUGgyYs_3a`86y=VgO_PYCsFIP~mkuMwJni4{>E@>Ge(U1K zX?L<*X&qG^#+cH+pHER5K_92(P(6|7+P2p6nYOl9SRh`rR0lMvvY*PKiciBY7`1(c z9EkM*R9cQoOo+@zs&7OsqzmaQX;-e9#k8d2BuI<*t+^x8)!?yNea5<5bT?ejS+vS; zHz45y3_CF8 z2JW9HE>C-Vx!)~r8Y5%9ok{xIaHOQFa@61gdH!_x#(U{Zy>?k~lt5g)wcU1v{cV-> zU+pRcq3T^F(2|W%@u21T1Qag zc<3{ic+5sCQKMyc5%spT6#3i0e85fuvqRyP`rW-wq7;w}YS-+vM*1qqYK^r_NefPb zaxt#H<1<^+s{&ruT5)XZ?24~<|-?6s~z+PJ_(l z@rha4a5}2;7@J7|DV6F^4ly^krM1+d$yC56b-)F%}K!WI7j zfUoi?u&R`*in9lYnWsn02h2NQr8r=C$~@B4La8cJLy7dPW=91GE8(2}P)!w5b$umB zDscv3Lja-qhvO8b{4p5{&)Y1^Bg&ATXi)Qad_7!!VxWOW-S;i(6LggZ*#$qd){CL49Y zy+%#cw}B+!uElm9an-Z_pmqMle)if7?(0Z2qq%x>p%GycDHXI*x9xg_@Lgl%9{@1rAjV=y)|^I^0!dlT~@K2#}GXyDE29`wqGZm zYC6AzJ>Q!SvujrM6RGeEeBaVSy$04eM+S0j<{jQe!D<#1}%wOM^g4QW~eQp*lH z2mm-;7!jB#)sKW^h~>ZVXnEoe*V?a6B@Q!2%AIJ<3hR}C2$29SB3cvt zf?h`>fl9_8gUE?Tt4+1K$>-lwrv}-u{r>>B)HaG8(msZ_1PbIN{W8W=SQ9Otd8fKM z8sJ$>wr*c+HvR3tuCyr>HIFB#l{P`9dU)z7PFknxN5Ubq*RA-&FRy#AIYwJ`vtO)r z29oJV^y(_|xUf{(r-;zvPL+6L9#;PVTdT~ThP}$m1XX3Fs@BecfT5g$1K_BYH(Oi! z4{9qQExUZ)8ydY;c30A>cMR&S?#)a(KT>CcxhXiuv8UXv`Q-C<`p&!`Ky5wwv%SZ) zxj?ql^*TS-S*pLPo@;E0YfSQ5aU5kD=5S`sa*9^+_Kv#JrQA02j?_?~6**5ZUu0%w zDRmM)F_&+xJY?Cc+3@hp^xGJ#b#8?QDqN8&P)A6V;fhE}N{>0lWwF&m%Koxl>rKkT z5nXAeW%AWcbl0R!g&_{$tfWEI2W%?r)YiY%I61__u?<_c(o?RDU1W?`B<1#)uD@>8 z#ncnOtgV`o8)JU%y{@puJH_fO3aFkWqFolkeTS zrN-%ZazC@zD1?f}!i^iV;!Y)#K64$hs+LX4a%Qy}!$rGs`*pRq8WmW=1toK-)QakP z7Tg42r63&(2byGJSJPYl8C`qrPpUGV!Lj!~*>wG7FIJ1>tENv;r4DMzNdEv7dE5O< zSD)^B8hx7Ef(>=_VF0|z2`5P;D1qNCSVlFb(}rE$c?7Jt(may11eDHt1~TK`1Y2I~ z*9@KY*2FDcj$kOK%Aqu?0zSy}HTz409sOWx7q50_MMbiyY!GLp8KFnDC(3+8XtSmN z03<E>IipH#Oo;%SNMcYy0;ck$6c0FlvB4Kv)2@|T(i8JiwYW$l*up1{(=Zsg1jS@ zZC5KHc2-dEP$<*5Hr3Tt7P_j7ZF(k`H2G)EE+Y^}VuWa}`B@`v9|ozh{{ZSS=AT8g zc{YS8Qw`mjN`g~|m#)Z}l>TIVBULl}8Lptw&EZ!HM%7-$E$YQn=56-0sCIPLpDf2E zX+5yl)U3Wy)Vw@lmFuUs0--8@YSx$ZNV#mNAugnLDRRU4hm3h!zvI8z{f+v)-}irV zg>|8Nne|g#sa&P1MreF#GW^NrJEP6EyX$anR;`qxA#_e46-YeaU@26)Gn`Vpg|@I` zZKbMDl;SZdI1w6F=7_ygN7e160uFoTGwt=P9*Cmlna;9$MN{qV0OR1mb zc|LLDIIV2I(%?%~`N`XTLzIfsV!5i2I(+uJ@Rd`n^3~UrAoVW}2Nzdo zZmADlXexH?)hAOoYg(1l)%m)5rU&vY_eH5?ZW$|8u2FDfbM6YdK)ah%`_kCjK>q1& zSZ3+}j?*SbrmVhIe;mYBU*uMS*5O2g zhl%_QI>;D;nq?Vj6Fejb`-~LWts|_m%WM6;O{Nk(Y z2N(eNKnTB3G!y>-x9RHBs+q*O%%I5lh-GFYK+ah1)WnwL>PO0OFx`_7XgIX2A?C|V z;*|+}Ae<<)NW@5Uf|wc-7+Re}X-=grKqL+%nL{QcMxdudVF7Ih)PNHyf}bdqT0p7= z{r-pZqx#(+{{X4^W4j#)x6wL=p9xBIF;GcBRHlXTL7zD4xMb|5eMJg%A#0-~hF+Sf zlyK5`q)(B=L5~2RCqPw0C4~}-x>W#$^B`g1U~`Ws?i~1IibAVt1MPV#*d-+=Frk`E zxx;=+S0G<&hr>7$s+N%Ie6ONqt_M){Ao77ScLB7OB}mqgQlNb3;yH+|E=tuZ`}1O3 zw`DtzlA3F^I#y}xd5@L1fb}MRA`8zW)xmi%Y9{T|FXc1cfLqIQSeRnpMyJgDv3m zRX0mbdsVDHrYjmcnsv3F91Z{|9w5ajWo`*xt#WL;JAY8_gr=6Lri%Q8%cGNTfr(Rd z`%w<^Mmqlh1-_Q3Hs*(B06J87j#K?Sj5fQ&h9&7aMN8csimRed#tRuC6AfU^-PPl#J<149m_i;a)? zhiq@xb!8~YdUeAzt>f+0qj*w_)tU5D+?_~qx}*@MDpEwpS5F>G9y5;Frn@ubI`=wZ z@ME>M%KJTYv==5EX04MYp=l(6z@bSpAn+nQow}V|JRX%Unv?-h?Nc<)Hp3IqG1tfQf>Qc6{ZyzV7zB05`5SObNd1@)8a0vhc zQk@Fzz|ZWBI(EAGC9;W?3i~^h${}s5qz-aAliwbupJiM5Fm2HU?$GxKb?qfKnn%8_ z)2eHrc#_n=La{9#>^ma(WMJL4&iUFq?uk@xw1-?GZ(3@?dZ@xhX#B&H&}ZEo--o~y ztfIZR{ia(1%FVE)R5dbHK;n;8Ba>>M?spt};}-t_PIF)EYt`*|whYqiOI-7v1g$hK zBL@)jCy(mX0Zd`mmbdp+zwm0j+lK{auGe|DRi@!ZSW#HYwX*#?iAs=16w5(RgnD{C zsysx0a|YcOS(9k?*Wc!9{+`jiWk+6QhHk!8vgycmrTsOZ&FSuqlkt>hbuPQl+iP|4 zDzCQ`QQVda`l$n={KUqvIG@g+wkNwvx}PPq`wqB#88zP9Rcfyk_jVnos-;ero@{`n zAmydP2DDFsk2dwSKGtuqTYboCuFAWkNO3hmvazWy^xF?7nF~otiPv{u^#1^ye_^ez ze37-=M5(6GWz`c7I%WdT1LZhG>+HI={0(g?$g0*`LjJ)Ky-BO(^ zNgP0*+L)d2qR48j%~@LA-pA3`B)?#MI0`j=1ww#S{{Ta>0$hT=FclqhMmOwM#nC~t z?tgH-xT~#LC}wt>a)Wmlv>RgRw^vMqZL3+-9%s-=IEA%>PCTU$ z+3Hr`Li+u?E^=jCi`%Wsw_RJ+6v65g&;3<6Dr+2xNs&ivdE5Pa*PNU5?ydMMVaAzK z+*5r`X-uawh5rC7)gYnU8Tz{8hfT968x zGFCjv;W><@-TWg?zhs5<5rT%{K-Jfg0A@*<~5tw_XD++t+a09x8Ea zc4m6XIARW1aS*oksc**zE%sdGyHIakySY%BTgRDdN|M^D3QLXlHb^*e7{+_+y&iJD zOVahXAJ~oD_I!bhipC=skOmcn|9}+P1cP-6jVtms7U<5Y0{OBGf4-&BezVf zsVhy8FP4aADU6+Z}b;6X8nHWiz7L@Q(Wom zl}%AZs(QwZ(jC-=4tN2Vag3{9Pszch+qVOBw`ZGLo2zXk49GKIZ1DaNT@*?Jv+_tK zni}*?l9j4npO|-y;d?X~OpCAEEvY9;F+T$uDeN>x+LIyIO?bB?w!-yOt2%d59Ay6h zfpZb6yDM%;T9&T>1$0S$x7thATZ3e2sisnkVDT~ssE-0;MQ>%sQJ&PR=LDrib=me1 z_3D9}{VGh+cBD{hwGuz`+7p=n0Op{@Yr3!K$-P!zQgYS3Q&5!BF0H-6Ng#yU?}zCw zEsx7jUXoC`a0^%XV%(EX2{!1dsw;>7-ma*#UH}rbTvll+$j)rOl9r!Oaqxw7D6VQ7 zTF}<>*pw^X^y#gA;_8}t!~{9g3s7ZYNRpkhM-g5tlvjhnevo{AIyS2^r|QN{tEZ`7-xA@ zQ#+--Rdk#fsv%A%`5qo`_=HB@wQcnO0O!G4?rZ8vQ{OB%HHO0enyBQ<{zVh|93E2{ zZ|dHeuH>R~Cr>0K$I=x@6!%aY+(5 zNaSXukNio7fHrsP6eOZ#1_4=*_{KjN?x2y@t6W0TvZJbaEFCAoV*}$I)afQEw;fOc zFKMf9f>-2rU5d!Uz^VPwdDan3`5Cr4yLV~KofO8nH}832E3z}!wGRIakA@5 zN|LeW9Mi|dMPyD2{@~d*o!da|Jz9DWv`M$uBu#CZ3>D2J=AVRiy3G6yYr%wGtXEyN zbT<35N^NPGX-G3eiTub`MkTXTG*avO5yae9@mYCo(>n+tW)oo}b%<4+ewBwq2 zbA`X#XmA?+%2BCopK_C5(zR{}Qq_0?G}jX_mw6%X0bi>l24s`0aA{OECAAuL;1+bL zvyh+u6F9cJ#t7cNOrzZ`lI51-o6Q1Jn=NSx(u9B+d-A9ZB)rmmB3t!FR|WL#oIX)c zs&=}jh$4Y$O+r)_uPSC!#UPvnV%Do$ef%0P+1KslA`9kX}l zC~)BO!*&DP7zDiw@}5U-nS^qcP7@o?MlFk!>XOrrkb&oo|?eme<}SYJgxqtuhkxo zt<|!?#Wi9o5>g2y=YSoYW6r*pQ$nZw^t~jdzJ00 zyLD#iZb^2;RWpp$Orybnqw=f3#(mzqSzH>mZ&t(Ps3zlZa+SnWj-^rm0MjW!B@-M8 z63#Gwns!t8`82!QG0EDE!EvNH9}V0$o~MAsmu7oSJk7uXQzg<{lt5$ zt2piD0;=FELl4xU3{%zr08YKVVFk`DI2Anxe;A|D(o&Y!kN*HDRkyTG6Y>dBZ|M@I z%(yKo^#1_a4^7`9+gHHH_ScZ=U8O5#si`fng%r4xm{Us;WwevlX!|$byOq62qulNN zT_}=Mb8Rwt2QS}jdb`Fw@l|hvZibm#Yua1Z+TCWfKd5P9<4mEbOXVkz@~A@JU3Pv) zR`%BM!JBSh=|}Gaa>Byszqg2TJbH-@ABJG_=>yIXx~9E3B`V=0e9Pc&(O1R<#}suXp=# zdaytBw2l7&aI}x}CFei`CsHN<01%8Dy;hX24?|C~t%rs|(%c$#r0YTg!O~kyz$1ne zk1u5$n<~I-sVxnWlpSJiNtt%gd#B;MxB6K1*x3?QgyK| z(MwbgjCrM4E93lP_1@7NX-tQ$+RB*-NuMl_@G-Anwr0PqG|kTYZ(z|rgx6csf~cxf ztpI+R`H|itu}e8ve?o7v!^#Y^-I=3W+^}4ou+%tY<+iN-MHAhM)RKvIIFsKNTW?-| z<@Emmu{W--j4{iFO@_5$JC@L^GtL4Vxm%J~NVEBiB<24A?XSWsOIF#d66(tqMU!ma zH{RK#*JG+@c5QKslwn2C*y2FJ<`g?XiYqn9om1e@_TKW_8>Mak0B5URvizJCYN}Xi z{aOCf@Jpk!?1pu%fSaj5bi2~OOyv&mwi@P8WFKj{KG^)l1I>ptd?P;1Gs=?M?+@*L zf9O&#p3%_Usn>Sdb%?mMe6CWgr>Y0#)MN~~C{MOA+t+D*uO9}Lxli7q{F(h;-o4vu zgANtYKAcj^s9IDHWXTflF_zmB{OZjLjs7nLlUEy)DN1Tm9}@E@U}xhXV=UG1T~&`I z`YMt_6ecrCz>e_-S_CEsS7fDp87Dl4@QYJ>M6IO|k8S$8S32}=EtQ~P<7A|d5h&MR zVOtE%Z7pyMRQg{!FH}jZ7!RpxOwU=dAHktJa{HtI=je;M{f>vZ@U+S(w!>aDWV z>}vGfP?EZYhUmPrS6?*g<(4J|xnCn|T>Kv`p=&7;Q5-NbinKLW4ichqQ9Xpm9O_+m zWzo}Yb&8h@jke~N`o3TR0O=EtC*P!9HRT)qR^5MsTBeqb>;dVOWR>EN1DK4pvqpwR z)zQ>24^cBf!74K;@L0rn#p`6mXbnO{8R#d8z@PCCDe;OSP8SMQjKa9-5+}U}1K|ZA zN#Nj6I!0OO6Orv~;yfdu5_J^?Ng$AJy1IYEc)_N z;mK)H`$rh6X`m+4K6~BUI{CD2pG{nl^A2N8Sdsf~C-7G^#I|cMOU_XZ^)*O;QS;NO zGSZpqNtZ0;66sc>$o;IJ&}o|YrcnF+HIGcfv?)E{&K}yADHE>O<%O}L;Krugl94pJ z52vuCnPCvR{ckL-A9aLYc2Bu)+sk&nz_mR@pCu*0%&n2Z4iSo*`%?xdfmyfPUbbFs zi=(Scb$0ru^eHn6O3-p3kBBj&Rnu8B-mb1ugl`R}UA1qfiP5f+b8?2D5;~1f0Dn?) zRAS$&sk>IiWg}E|ODUg65^_rM_!#qVM7)}lBtZm;YZ(bhN+8A~E>`BMLV-FDA0fxM zt$U9UA@&Rm1b|#ndngM5$);S`xn&nwrcDAA3*JW?Y4KtnRL#j zD^rP;O$*qNd8fO98Aa8n42M@&H7UE#+uF-EtA({Dw$hALnF8|z^-I*B)I4JcvFXB^ z@NU!WD`E0hDeIehNmy+uBLz>FjCmK=2E@o3`;}EKTC45oRV~)uy-ev)3s46IAdgZ= z%txW?Rn@HhulyOeIZqj1r|g z(?wdLFwh^evU8ZnPlQWmg>0-cn*D~cY?&_M+V$3_MHRw~uTutQm{+mmZte!j&}Sy(^5%1JD^IXHuX?~S_mr^%Z7nm&Z~{{Y>K4(z8zBg9c& zf`5L2!-9y+v`?ugmT|JX40qQVKs(#o#;TlEe%(T8>#l9Tc)?1^smYkoN| zr`l^4G8?TEh4ry;VcKf?Rmn*qI>#_(F%jm)wYHBz#j*y~9dQyBDrl4C2~HBv6wY5{ zPTOhmBPv_u?L{p*bh@Xyb%O+`GEx`eiePKn{4clpI@I~(b)~aVpv6jbx^O|3om1eI zAGpSf>>+9muFX?O_^hFIY`)Q(ZnZR!Mm}Mf`=Zs`Jd$+yEOZ|3?g}E7?$pAdq<>wh zA!;1dpGv$X4C^_o7YmZ*Pk!0k;(;``8ftpgBu!H#6%C$2LQ5ZXJ#6^071lo%QLo<2 zQd=t5b+^{Oi(_D^DrrGAOel~NP@^QTNjXh3=Nc(@F!G7Ir^XoVi{4wkk@Q)2{TsE^ zEgqdU;Rp@Zp#aGxe=DM1J@LAhQ3hKtlUub_TQ0U$RavUpyIE>5btBH1AC<<>nYBXf z(ySWnb!Afb?YlK4PS_m!H?dHlbj`IMO|OS>k0W>deq|nxpLfGEy2?A{4aLe!g)ydi z2MtC<%aH;{;}|w;RYuxf+xP@xwvw-2qT(H3$y32XUwDCSHmC5;TNS^c?LFb8D7NVj zGnS$>u3vG6dfEqM!+wf_wYj!Z;K(HAJaZ7MWvUlM$Xk}uWnifQ1@bt3xqM?zziFdA z{dCArrM_B1n`LTMI)s-@;MUTHaxJQ9J`u9JX@BI-_1dB-t7w|7O=T0WZR?s<<$je* zQyw5mXdK2PvNTrrU;UT)A!^nAANVDzZ_QN%f9|_lYfwzu+!m6S-V(!6&;v`ym`bA5 z*;{eQmaUgO7u~JCZvlkUvsB*qvoUHPe_QzXVXDd4Mz;$i%%~eL_KJ}$!A+sb^ASjI|iTRr`pJt@_ zQdeD^{f-K)>)Hoa$hqx{fvlo=Jw|C=R%tk=L!3u^VB6`=YHZi-<}7D-J4Iy;L1N&C zXsVKA1Bn4&;Z(8kj8;~ohK*`0r8BKnRj`rNBBj1#%CJ8emLJe;uc&(!RJ8+27bkeO ztQ9Wk8An25DlH5=Cbq#U!%)nA5lZf8N3Ajfzip8+)*u{@+l~^ARQ5hdUq`?tHNyF5 zcU3y(lw;F$YLvMvF&2tgoZ6+b)9z(CNN%_qXOsX?SSxKrpOrx2;}f>4*EPx=Y^&!1 z+nSz>bJ+qb>tFgx6qjk7Y0YU$h>?%QiKt3H%s?pz zz{jUeippTaeKxDbgi};hux2zk4ry9Kf%wN>wXkVx*XmkqcN8j=kir-RMqwV3Wg>s= zk1N^L7UoY!*V#4V2~OFq7rf-g?pJM~Y4_KU)YZ7|quDKCzq<}{s4IGi~M=?7V1 zZ&J|QSXDhkX?>Svt(E787!|j`ZC{Xo{grP20PP$8pGPzOK3T(du(4A7wh;49+Uo*> z)BPnY0s>AS;z@>Te%3}|_CjbXAAOR;fg-+_1Hck8Up*=r!qvBrC^kuF!wX^ll7&D4 zG}RLhApDMHBgz>#&xR{gk0@J>Hrs}g(f*bB^wr5q#8%3{hTOGGow3q4L zOo%z8@KR3#BUM_l8Fg}e#p$N41K^eZRekZFW|L($PEiN-A=dP$ z36bg&m@$u}JQwXKTU85TJvB|loR2tLQ?^i5qX(-f!^j1_DFkF8b?oZ$b?GFQ%J&ZO zw5o$D3aPafd8vuT6Eh{h;Ts}yxiY+A@O=YSOSk>S+6m~mm7&qpqN(}Wcn&;AB?zo5 z)(KY6UA~49S4mrDx>Q@MT2nQY>d>^DrNK!&QlW@3Jv{_L{PUdX=z$il^#Izfc-SX5CpJ81?O|ZBa~=I;vXAeGWC{TW+V!gO?cb?ORd&Gtk2;6?DeUcxK^3 z6>qC$T}n#E@Jf})@}DD|dLF;AYgd{2c}6|Ds+`0hKzm*8eGc%pmMT&y?=;ELSxC8g z@R3?a6skQs+Az#Euas21$@bODQ;y!OY^ihxYpJA0C8AH6NFS54hjeB3G)_^kM)||! zrdw}~ph?1JWDr0TlzEq{_Cuy4L^a25 zq0psMg=<*!d)h@c;(9#=O^PqMp;$_Ii>v`afsq$-- zH~q7^t*LB=>Y8#zbnbzzC%ZA;BE8d4$n~{cqLaHlqkXhHRkxfjGDO!zvI~Qrg&$Dt zF`s9v=D*m{PiAp!88vOPqL!p6DcWl07pOQUg`q(B5eu(#SRVS#U)#TXTuY4E_hO{7 zLKwQrNjv~|k?oDT_kUw0^v@icX64#84bem%bqHFP0dB3SYV4B72+^}$b|O0V+gpPo z-JaN9?2IXN=r!~Q%%@wJaUaY9`$T!0eLGdkJsn=nZ;lyJZqY+l&X?YHVR=Y%cHK|gVoSCT-)Q&+? z%`vN9)oH+d&x|+7w_j1d0s1|+KN&f)0cNPhof>duSnpAxR_WWY0s|x7X1oq_HzgE+2S2ikX zHETvh$d8f8&$rgCkxg6OSwp>hRQruPQ)E!8Z5Wz&FnJxv4N>K6^>1DeMxM=I<;k1W zSl33kQBV|@C#l9(k`xp{s!P zTD_)-UrJ?Z+co0U@p6sDws8srB?Ey4IHgg(yX$^Tk4>w8d`<$ZreX&|^G~Z8MOp2C{ML%o+7PiI@BVcP3uVv@^gQkKiAAOHmLQ2b*a&tIaHZP)B~aQQL@>Vr<8 zwCYq+NKjJMF7%TM=_@5vr-E|ZxmJ==`jAqb5>%l-4t_D0W{BXmZ}LttUqM(8O=;D{ zVLyaLrnwv*uH4g!(WEGFpYeyT$Q9N|TB{3gCO`m5z!CWW02tFv?Ge7DMJATzZgone zbxi~6WXz#Mj-V zfyWGC-t>UAS(6kL4>s6H^rs{K@%Y9)yAx);bZG{qE~5p4C&w@U07;DQ8DtRJ%;%i2 zowk&g`^W!~BRBGdl>&-{}%)KRd_ zu9lnut%h4`N^Vo|1!+(+&Qk^w2kaN7tDor4<&K7TV_M#pCBD$P z(12=M^Pb+{5rL0S*wsIBPt`7dm80p}Z;?l$1chNj;)4+dp#T*Ia$C zfUx^ZLTZubrF;QUk-~UtmuDCOBzUC$lLk94ssep~hB}3&t)P81 z4HKvnh$Apyr`df)YpePl(3-Xs(#C~x98=mOqEsC{T#eJNf9Yz^og>Jv%`BiN;fBk~ z9%1EEyQ3*gAzV8|J#ExmDGIH&+iw=@UUXnAqysEFy5^>Mw;0?4pY@K#Zr;iPe9-K#N^t8}f-1l&Ki)uUTA02K2Q2gVah*{#DzY;?NAEI!ivfd1CKiYm7c_IlNT z;4_nJI0dJ(oNsPE<^4>ZXAk-tSGc<|ozrPW!hk3Hr7{Ys)}Qm6IP}T?0O9S9+pTP@ zu0f}7M-PJ%WeO=%FP#M>rEREU2*8355gs+_>ha0yCm?rrDea|-l`tMgsig5q=P0+Y zYi*j$5!=>~;3k@;-m0}+6a#e*q$g75Qb&YGWi~4GVu=otz*hm#D9F_W$%oz1F?(K)kgLa;|TooU2eXVt;9ldSlrq(N} zp-;=it)cg);S=BM&QX0H$BS}j_Uns)0Oy#_K$!A&Yd6-!gLmpb?nt({k{(!^aPpX6 z{d;up;P2YIb@DY;ezc+2DBMcW`f`#va)VD^?RH!N?X1Ad70PaP6l&JNGF0(Oy9nkX zp{y|B@J>fkk6M(5sNBM^cy>^hkpMrY%X4?Cz zj5?r_`hX4AH!Wg(JA7i7rEY|!?MEIAdw6?cdbE|h(E7?Q4>!Pmq~;<~Y8IN`g30X# z`+8Yu!Cflr_MvdJ;*zayQjwa%0V?T^IAI&TWZqGmbyLIqjiGhbAflucyF%~<3P+hT zJmXWNGN!mG`@h>Ob?;q$nL>)^>RJX3xPMR?9@xXb)UEQlHfi?Vac&H@p_`Suu~b(^ zzMb~Wq_OH8!Qvys-RruzgVmu>Vzc(9BwS2--UO$*|5bAsj{FN&G zs{JKMsiRWqpF#3CiHy1b00R}S_rn$HUI_ZtQq`~j0OjevmbEj}bEQs_qB1TvB%cu@ z8Y#8-BW+{PUGEIhrke1>JBH7JOUKOW5`SN*C$Pqv?NBt@t`ukl@=crbr_}9)pT}2k?ch+BwvYudq_SfE1kyI0HYq zU&b`k*l3OPrdDdU-NK3R^%|Ck5M~sN6eZclH&fZIlvv4a4LLw>zRf|=ccltk&Z^c1 zhjGhNeJc1x>nreo(UNID$$wH(+THo)9kp66$f~y0v|C*@Nd--zS&-W2rAgpWVXf`; zUvgkxw`Yc3_VeE4Z3YtMj^vx|2mw!8YYK|TK8neh`1nNW?bh6=8veDH)F0fhe3yB$ zH)&?yQEaVpX}Grc%Pi7^#2B@;_v3(T*+?&-Z#C@Vlprc_7+EV1Vq{gwX!^JO*NI~pr>sU)Pxb0aSi9x<{9$4T53 zA;|FXFja+h8hU}FF`y|YANC)@9bJn6tF^F6EoOd0h$oh;zA;YhSOs0RvY>|$T2^3V zDfSVM!g1Zh)LV9?wxCcZIA!(`hus0*LXfjU3QAPpVNAaRgd~g%<)kG(Pbe73%z@qW zCJ%5x(WP~>H3`oN;g52Ml=#8y0R^RkKp6g6NRI>f7&35$H>m6MtYN5mPsjMdObkMh z@^B+q%mIP;e+Xp)u)V)w{_%EcC9vaE#V=IKVL`O0PxWILqkaim3+-Q5>fTdI31L1| z6OKQ^IfZaA$$3gjRtZrYdmz*nz~qt0=gtTX*4+G)^seGD0)J{_)zfbb@^&vMsBSw+ zvs?{hWBmnDlczljIT+8oUq?O}r&ar?@`#X@sVahH{*JE$oRYKn7=uc$=*s5H>Vgxk zB-2c!q|Tkr!N9=!1L_pxZoJxGXoOWX4t)57-wkCsT#B4Hd>n40s*kB@I$cMV_WMKx z=O`|*hAN_Im31%#8Fi9AVf;jOzubVo+Q$_o1l2K$fWUrX#6vvg0emxsw(437Ns%UL zSj-W^1WD4+wuo^GZNLK2>rXz>46}ed3vEhm%@dM#RtbrdKVr-@TTm+AOK_G&ci+dT4Q$z={Z)lZesCe1ua`xR#W`S{9c{{j~rkK2a^3Q*#^*O>JP0T?*-&Q&kQH0A_@Yz>6)t zoYfNjeN;AW{>FQds)Q$P+}2C%r~MntKBmXYPcaWy)%_Ve*Rr1|mG@_2l_gt>*3j0G zs^G!~Dg*q`2NCl`{hb}Yu-^fhl+$C99hR$FS@xZ7P*6)c&hX*dzdLx_ddxu*8!%Fvc-3OcCMP=kW;3KEY#U2)*q3I6~mYv~#_6w9irAwfe=5_<`hS5>~()f2sP zrIKo~mTC+1?kO~`3A)tqC!A+{B}3$@tTCkpvatIrngN)Ro;-}9K8$kDX}eR_H>9X_ za#~JAc8|si`iRhC=~7ap1a(iU8b7kfWyZERq0f0rquZ{-%DHzzR}q>)iq|~ zr7ky3Ri!nJvPo`AGU{j;1CA;Yr&3G!C2KpVehR&kqjBw|3x?OK{{H~BTqRW&hg1~v zVMc0II{QB04e+9_6;F-UJrF z)r^Vqp5q-29Wqoaw#8)<*1AGK%}sNc-xRLjkzEKk=~!|8qLQjgjYOB)n34WbDMq?( zXoa<+VwZMZs7olkGArrZ6JoieDu#i`g{L2kYNpiqAn4Jk?H_X~s#xe$zAjYQ0Og&lHQ~DRC8)~hD)mt7*%<)YA!XRFWfmx!vxVC=V+=rs`e?@XWQ1S$c zJ=qw=x7Jc?)$BC0lx6#q+ndhZQBvDARD&nm1etcEMh)7ojrw-d%LR8sE0G{dGD}8? zLybMt#g*Wk(oE7|HS%=)5|r15);e#2GvoIE02o(Rj>8NrA!(aLDYNn(9o$3(W1UF) z>oqg@slPE9eE$H!QF?A@m9@!RuiDPEdep>%GE!y;@XSWde$?TaZR^JYR_)!mZA3Lz zKB}JqHDI6z6s&RYg7nhgjt*NbUUFNgw@%Z)Bk1eU+Vy#QRcKD5JUpuZ0DMU;n#X-? zQN6?3+iKLd*KF!C>xa)uqp1LXWUDyW>w8waf*ZX=l$6v`071$&J%lUkgi|&ht7)>L zQ>bb);39W%R?60?*&{)ve5nFc!y%XZct?SH!Rw|P)5<{_PMQ1tD0qxJ*G#u(v!WQirzV?QaE z;rt_k0?j*X0ErRKe0%=@jC36%FH)ooiVCw5&%9y`1EgV84XXtSa^gN2j|egu8gkr# zkWZN>C4HWu_`ys7>$Zt$2NQ@%l>Y#M@P_OwC3bDWi$%r$ywa+c`e5ZL8OZAA7uR?t zva*XWM#WSVx<#p?q=KU|Rj;%jaZbozxe>{B;Ym@46i-i*D>Jk)^G^`)KD4M#4E^6fz zD}@7;uQ_e26HKPVoYV4=+9L(&A8R(&)At}o3aT1iE9%o#PG*(yQg|vRl&E~6+lMQL z9EV-gtsm5GU1s^Gn1d`>M_dK9Cc2!>rKV1&oWBtq@sx7U+Ql}ZPT^2is%OAZ91>3m zGY{y%)c*h|S(PK1l~cLLf=Q0y{SN$>)au$Sth$fsFZzh&e=vg7WC_j&AL^yl)G}tV zfgHpu`5AmLlsKA}!5AqSjv&J)C`O=lwH2p5E~h@;*kr)e2U1rDQS|TNq9rrNFH6oD zD^toc{{V9RrA12DcCer~SBjse7$wfp$x%JJcN z;Zzwsu{g1sG;8eFChKS>#ZwBz91aw^QZBO?)BA<)$F?An6=`|RZCo} zZP}vDQv^v_q>c(n;tYAMTT?gU>OxH|&GaF*>i+<3634T@IGt}r${N+T$f|n{c&-l@ z!DRZ|AY%gCYU>e`t5%;Us_3d|ANq=O)6!-LiIqdTx)OpYspKDHHsYVAT|8aavY@)5qrd7d|oGei`5NBWi6YT$D7gmpqITC@lUHqc6s@J=bnyalrkh$NZE5Go6BZkVu}iw_+LES0o7R_3e8MNk zu*U6slQUkP7)_sX+OGExs7jY%-0b;WRJ4`L<#8rK#P{PGRhlOaW0YvN?Zx%0YLe*E zSgQg_s6m@+{!{+|gu_Z?-6Jc4X=(BnUr2S8iE5O=9kDCx4Qyvy*V>di+UslyNKu-c zqWM+ClpY7NJl)==W~ZU2+niX)?o2;!TA5WbOQ|w-wSovSmbGogoEmL~ftKpJjZGd! z4g)dvKziYYUQuGQZr5mn7_3=R4gtUx=wB;d_JNnRt21!j(DsMgvlsTQK2M->b~1DK1~X**Dj zRWm(aqDrXhwRv4`VG{6-6xz`nP_ym-0C0B=g-BgcQ}m=sH7)TUsAOYRHzq>b%{I}$ zY?u0)2bAIxw$-gz$c0Kn@rS*o30lK6ggb7oY@%p&BuIlJ35G6FM%`Y~S*z0RRlI#I zNtrr5C%i^ozM^?X&0gbJv5nUIeS4<*l@``1n^EdIoTNC2$!BWit_`VG;XX)2F-J(U zQ0Z}L9+IpgZuYw30;;ORC@!l)kM0B{W2Bgk^%kw9nxwl?)&AbJ^#*C;Viu*V$m=0W zU?@#8Smnfa0|8hK0aV)Q-)+s`P?z;w?PY}f47d&kGFsAIAe6SLNn&090LBm^x=K!1{qPPPY`BAm z{1L!o?bLu|p(*po#{vh^q>(*Rp9B10fOQH&lO<)#mvj&_y%mEtmE!~wDKD-?3j+=Z zBOM@tNkSB6k_Q46{C|ve93@SsRIy5q8Rz5w0BjS6mrI9~0!}mAH zPG|oB)FYLk=74DGD=jreN>h$f<`5N*pl~5woTEi{C;X9hXtY{4g|@f$T_8L{r>q38 z9?m`yT&_hVzP8iZm-`s*$mnL^lno^Z%$a#lG@PT@j|Y!FMwu#U%_kXsq7gomA_K51*atl^4!ctI$1*FcM%*P`g{{TQg@;cfXYg0?bmwh~e zhe>cNZRF;V5^0|EC*)D&U`K`@sutSIO8R%PA0m$~QPUV_H90~E=q_L7pGn{hE5La? zTP-*rMg;oOIEd(soil*4fZ`J4UalX)9w&lx9E}Af&nmpD2gDfUKtRv-=YsoR@G%Fhq)T}nQe6L>5&?-h-g$z_Csy#)&@;gZ7zkO)e>c?1k8M5t6eSN zM|&b&H%f%Q%P*joo){`viS~%h^r&rkE#Dz-(j|w3pih|QB6PUT2e2vX>ExNMDa597 zS`Re;00`8rBwB%{#ci^sHFT@c;W#)wD;$OyNhVsFYPL}lm_aQCLBge{$a)&ZiRfVMc2944}&JEroC+|+G<%UYN54aoOHOJ zU7{gJWa08&$u%n|`V-sz=})<=$$gWislOxas|6)sVhH=A+S1*tlgr&zRzJD6t*dd; zEtgRg|EM zb!b{v8`XXZ?Dvqv;b zptSp00zP5>*+r905^4@Dg#<{Bt7C`Ep5w+k05I(%YE0Anh~_g)GGeq0iZ^MO)~0Z! zT*n^q6s?-zR=z~t?RI9Rp4$EhR_@!2Yb&96LAY9S zMREZpBZi@vja9N_T}>Zo?`k^AMCf!sPOK71nH`2JTYQnVONBC0Qe9P^UHF{-0?T{6yr>TiTk_D>`AEVhlx z%|OtzrNNp{;9`o+6Lls_tvZ0L$m7IA_e~S(15--Nf^r6VtAX!<*zTka$8R*?Js<%& zr20>EQo9-z)UUZgT}GuPnaW0Ns7)ujFI|c9P3stDmVx)RHdSw}8K!7m9LR8mff#}uzDJ4T7A}eF=1a$nUd_(bB6s^_$;^UUQa5ywdCaaM=ecw z3-&1ZVH5_Ty0+d*w96&%iS370fmfL>R5$V@nt&2`EjbwSt*7ABnL5=&FCi+!EEFPA zbEx-C2Ne(TjOE%m!Aw?!IYQEtG65efvi|^dGGG}t_Q?RIU}ZeVapMQGICVDG$(S=E zh`~d@oN>}TibR1jC;En7A_N^LmqLY%v-o%z=sH21w=EuwK>2vbKxAmKi5VV5V;peO z+E~RyzBu6{sDe6XV~R|02ikBSDe^0k%fP`p0#FtRBM2g~WNN^t{>UH@rp(5JB@BmW zd~wG$kTf`%r;qz(9B}heCP4XR9Dv8Pf{35j5YKdwlM}K3wfA?$ro~3$uMSptu6ZJond-l_Fs;-Dx>eo8TM9z_F zIIWTL&zgSd_fHzj$#keeQUi$0ebARur0Tx|w9f*8jvQgN+*?$F-4=qG-6>Nwpns@r ze97nDAvf#)08%ZdWc{qCJt}umSkRj;VCqLB#xU7Klxwb3K0}&P0oG2cb>=xwj5-zn z0Fl&rX3EZ_EBb4W;2%-M0%ps(j9XkXUI9K(;QiDVox#-c=iLLGFmaT5vKOg`N0LXXvU7nJURECoba})#3JE)X#l#x|^=(+g9DxV^uq#5}~b!N2v<~1tvE- zE7ZkJj+QVD!MCova=Ynk&`U@9Pl4oE{10S#Tl6}!)Yq|DN+NC*EV7g>v;}1`6Vpd* zHXW9Lx~qx}D^Ingl#fZy7Milt4X=q8Np~;l6$VIF0Yic9gxR7v4R%Ok8*-KIvn!V# z_?>J!MTVVCRWYcfYE}zD^sD$7(43KK04uE$PPBqhoR#yUJAkGYVcr)@8>w!nmuU(0 zc1Dd`nkBPRv3{vW+TC{3G@;T4ADJrbF|l>IlkV2c%BH7rY-^~!SoKv=Hlm99B^k{C z;ta7I(ykG+Puq_Ktktm1-)HXIHt(}Dbhf)Pu_d8cEejd8;NV1QXwK89z0tPq_uF#l ztD6NU(7%}q;6aSrb*8dcR>xO^0>5p`uG6^&Y6)ER1a|hvlfO$xsjF&e4x@Cg znxPFO0@|}OiEGm+YwSq%&vL%Rrj)6bfOP>mPCCB7W1iRtp}dmlais>%X(Q6E$W59Z zN2b)vb*lKwy5KW?vrHO~OT}7$1EX_VgIFbAy@+g9xDgn`? zpPXc1t4APeco6LyZV6yh7EVM3TMjnTnRs>BP#~pP;maJvJ#5g8CRMApyVlj4j@x{& z;WKiK;?lb%@|f36{{SRytg!6AbDe4Q(Ogib9!?8odH0~0)ms_wLs+J`QP;GW>DDzX z<{xr|J5owoIbCm~uVHkxttDt!kxH=#x*>gO@>Z8?D9Lx1wl@j|Dz3{nDMl-&o+J58 zd7HgB$~`?k(zYKZA&Qkuw6v7CoEDX44=D4mST?3HQAqQT2O3#H7~o|FyAoMB)=4@W z-9;kM)ln-4CGmmIP#P?ZRy6to(5z3u_lO;V)NrIL@0SkW6|KZ|`7hglf6!bJ(5sVA5t6d- zi&tmK3u^cv_x8Zs*H#yCZ9OM~N|ftl3HQN!oic{4JK>mBMUPACLKifo$QadMYXV#T zInO7Wwk;Uzj<)$4zKdQ$SX->PlqFM1%_k_8lCqMju8s+scNH%tTw7Nj=*4=Ps>vEE z*O*W&sHR!6qk)Xqr1DiV#csW}>FKZbocyZG!ZX`jLp+j*aVj%G(xbzHg^^%+E5b?= z`=O)|Iy94n`wt(C5k-R`=FjsC{t&=A6cRN{#AV_mj$)EgJaFPUK>@|mw&r4dxxwmm zh%|bAN!FkH!Ut2k3@+T+#Xn|o-A?Q>x*Rl-G0p@BvCfmN38Tz`z{eao+M8AcNb)hr z5IfVu84(PCaHA=SjIoXZ&!-adcy>X9q)-mF2CPRo2MR-g%Sn;sBay?pf|H1m9AJRv zkGgTt5%wLapsH%FnMJqQP+Mvo#CZ(dtie%s>&KkP9x9 z{EEsa!yA+s*#$aIAmC>gt0c-+zrwV%MoJ=*%eqc-ZlW&Z%#5frng zbxbVHh2q&fJ0dATM&~|4iU3eyf73X&u0{-a1o;a{)`=+j(l9W>3Dlf7BvM!D)fWcpN~Vk$L^`z+#ZDl7dbxAF>Ysc{)>}MQF)h zp&h~8h<%hg*p_1=AT=jd!#hD#q%WrK3LH-uZFh__uU~=7-rTj{Xq>01X)YyWj$^b% ztwm%`n;lt#?>&!n+f^!Yu&1rcK38Rm2PI4Ik3VjRJq>$%EEL+;60IvwtYk)Dh)q>! z>)6}~k_jkphZJP14t zY`(Q+lQzAMu2J)@^VyZVX1}8R-k^0y>FNmo0J@{k?~fyXmq&xu)v;X>jN56SZc`de zVtcHaZi$it*Gu%lq{~p_5&h0&r$qq?p$T9hs{xcNytxby+I2Fr-n=*@#c0H`Cr|>1 zn8`!^yhK!+K($u1x|L}Y3iTt0gmfJwWe~VoDofOgQkpn8-Z@1nwWclVte|uI^Zx)? zs)sR4o~hyw3}eyL>`obvZh*T5L)JUVz3tgI){wZ`iPF>Q=AX*3z{dJsKZ847EN%8p z!$Wh+kTGWht@M$}oN9 zvYy-3-f&%_S^bKMObPs|#yqXsogO$nOPDJn@CTp*zFhmjf(SuOdRI*~k49F%Z$&m({~w0V3)TDFo-unz4E!BTKM#~7j! zm7DJ0r>$)3MwgR{7Mut@hAB;sqPoc)XWke6u~L@nH9bl^q2LKJ{bP)6*R?Y>^_s<# zeA=%RAhhCos*uq$4ST3P}^g;GUTV7T0imQv%75aVNO=tV3=vusmq{`sAGg8`f(Io$LC1^{PDv^)4XK9JJTTxy2n>ulNRS942v<RdjsT*Wf-{0}g*2a+2oP|IsRtZj94n}fUv_cQaUkXw{vbsuPkOjd`TL0f%PdefX1g-^lU^tz8!yut_6KSPQW{nqmyp#$m_@W+?? z%6fccQy(%WuOeQE91^|$VOBULOc zbtR?NO;gC2!4j5{j~H+OBi8@;XiTDHR3aU@TQRl!0hw_0d@TOC>RRo>HZ+xKTJ z^+3oOvhM|>fgg-`yR^eSYF>CHZOtjhf~Pzq4X9tRQ>;BKAst|Dz|K?D2@xEtIeLCg4q`ZdOGRR96qFE->PfNu1)9*;s~6($gq06nAwdeL{JRqE@v& z3Z-I7m72y<6{>0&Fw_8L108?#Rl9ZiA11X5nuh{U(TUWtx*k0^ip1HMZu30Dt z+bHf$K7bb~k>L!lB%NT+z1n_;nvqX0N{#?04l#$@$~_N8t+NNIx+K&uq^~LAEF&d# zxXI~sKQFjl1r8Fz5$Wt6y-SALzb?Ix+`&VPW8JT#fUKz} zgQ^^SArk}+q@_a)Czyv!R)vJ6SRA3#6`>AMHnjP~#{&+97&g|y#WPPhCksUyWuZe- zOmM@gwg%*;u}={k>F{@Rs-bDrX;Np{VR}j3poy;Ap#Z70>PgIYMD0e3S78eMh?%LM zDu)PFc2Ynbrc+8G#FQ@}ctPwK5}jxvK$I`@42*Xt5|o#PwnAU-3lNUK0BD(RrMHp_ zNKoKmMQC{{a1ckBeXu|{9n@w-{{Y*RG>ZbY9vN~uL696Gd3+2I9uBBrahE*fr050)ogRlr(@)SSL*T`9Y8fQUNkf9E22+-dnoOC0Jm7;Txq&zS;n!-|!IJ^{wUVJfrCH)XCx-|eGpwZ- zcP7iAk3!Bph8EahSwRU@Q856oc9!lmxJfU!i)-Q!F5?4bJ0bPot265Qcj?{^$fd^2 zoJ?T4Xxm3P3q#0pl)l%mh>lKj2#heM-T-SJlj;!3iqX4kw(V^ihE< z=Lgqz+WK3S163?7E;RB2lA(wpLU8R6;H7(ov1xC1<+UJ+l+ARHfr?ki_87^#N@&%i zbU&ejCaSvERP_y7OLYt=p=dnE9_aD5>S>;(Y&3UeNPnk2Am9ng9eUEFN46XUqjS5c zA<1?g5i5G%1Ffhgp6It-nlMn!GaqD0(bS@8mWyR#A7m#~myw?y_%w1YktCUnhFmzs z1r%CJ(=jO?93a4?b!EK@!%XGFi0*~pDV4j0p~jq3%=uNs@IB%*Y4#c?eR3VM_sva? zyfpbyrCI&fNu0k@W7gBTGY-v0`)9jRTHOX3CrzR)6HdR*Ns8vGv%740#^MuGUfNY22;+knGnow1AQKMi!Z= z1tADfoTmuT(gR%5P<0_PP~s&9r!m`g)kq-@8FDy5b%T**rLIcAnV8_H3c|XECHYGp z;|{DRQNXZHq+qCN1P?bRaCQ;--w`uINiBw8WY< zY>LMQ19P|DEsv>+wv^L}ID;0WrGabgs48l!XPJWa&=vMJ1R>YgEmJ-5H(IU>EthOb+o5m;zc@8DZHDn5_=A~R5VDl2f8>(V;*tcPLMjQQWxexlC#1k zZBjjU5tUZPUIn^@0C*}O>jjnm2wLsAP{=E1&fn#LDAqD9m9bXXy2V^85fbm4fo6Xw<2a=Tm zh9j~G!hk#@fO{-{*e44F9{3;^fk>Ew0X;I3N^*e*2qt1*Gyt9oQhh>Wn2wM^(n0M8 z3CB8#<=NpKCliE6(jFMYh?p_Q0ut>z$$gSi>uL%@hXNyxOxHHO^{eHnD^!I`V@v4b z6gc?6S-`eX+UF&8U%^RjCXT01 z`AazV7{L(Dli3F&$bUkigbZknJu~S!7-TCsr$UNPp->_NGIb(TZC;an(?&?mIJw&%32BWd4ORYO{e|2^W zu1y<-5&*chD_z-bcz1SOaYHVp(!~xH;A70m1 z3sz5UE$wvM6``tvS3;!?W0&e2kKZ1*uk5FWV%wnl7Q=g@yHGb$!qVbgNGVcG=NpVI zG{xL)j8-(ZT|iq-2`CXTVmG9erQ;?UzP1f!-l$b|7*g%ZRMws?&+v~g*!80*^z?7- z{E&2)29$y36OT64XxNxfR*}InzW7F%(g#$ULMDeq#2U%Y2QAk=nFuP>o_NPvrzTkG zszQ=6!<-^vXf+N>L}kFm6A_`(b@%X;Fr)0gq>z)~VwJd-sB>@X5+@!UjA*UMT8ABN zE5L|(5&_VM>DR5L5!no|cO=aY;PUk91{`M;S0?rR885pbHMQw9td$-r0yEa%duIJ~ z`wA;|I^&xpcf-A?qM}3NZ`PlXj|gAdg8{S~Zl$x-ROb@ey)^-?O9dZUnI%Fn*s(E8 z@xpL`XfX=}VGJnXQRCqS0C5X5{9%&>54PmMhfG$7(y5NvqGAp6m>ujANZsIa#1Z(5<=Y^Cy%|>Vk`8fYsS4s^&n@=Qx|yB`dX} zy>YNU#Pugqcqnp++K#2`bjYQ&v>7N(JmCikrmT9L%pGm=F~De?qpxZ72^>yf!zNAC zF)eW!9uUbBliC39|?plY}WGWr*Pm0UA*q#sR`QitNfdPAsHH(;f(dna2bj*5(Xx!5en;?Uw9{fKSt` z=zSd0c=$kJS;4QN)}Lv*rc@N#z#&73G0)_m(0efi0+S*nafeI=M{`*^dY)-Nwyb10 z7|Xj?lUALCB^#RCQ%m(DD9(#pL7#a5LQKaIGLHHUZIhIf-FgC zC|9UtV1bBikv5l?0}6uvPX7Q&e9~j04&?K#2SB@)^j|Gi_DX{FSQg6)UZ-rB@ zNY1sCkN*J32j3oFv!XJ3dN$5HnLSW>!{y_Vh--z(OUpQsSe+>-8n`GJX6nGZ610_7 zNk|1GEN9vyF3MEBY{}bw#nwtxK?(b#G{Y?tTBvK#@mEsg5Z*#U$bRS`2<2gx(Qa*r?A_2Ve@bnooGr4`P(0Hf8|Wf^M)+=*@H z5(xro8G}4v+NcW5A(x80$wZ0FOvJ5HiIVo)ikl!RdQW^p)hd}}rK$=@Gw_9znhZmO zQ^QdH1_Ul~f!knBgw?gS#lIhrXR1IS8D&3<##FT`TeiY2qVASe8YKp0GOF zRX-k4StkKVa45+7kHEo@F==pvK2TMl4IXhRa1klbF~S~XNFnYv&{AYDJb8D)P7V>a zueIBHv;@smiavI^cBVFI-vl;llX%2kl9Q`h)Ob!6 z)v@cX3;ygtGFC9ZsCY#7+q>-c>8*rq|7<#c<3T^rJ5yC32P1Gr;jzcanTG*YcJPH&)2&9PuOG!D$95!i^PEa6e z5@}Md5FJMBGP*89#u3me;LcG4n2EX$t_1x60Fe>4vZ~a4BCe!VHT8n$V=lLl|iU4Jivkri{3V zR)$Pz)Uf!{>O}IKD@pP)mB9;NV#iZhh=sL$7pC8m75YaS@~limS}K^99d(nbvoXX# z3sOr`-5Xqzzbd<7)rne!h|;u;F-4MRx@Rn)z$8kLMsd&)9iMyv2vcV~L#R4dgEXGe z3uS@o@@t!R@SByr3M2}Kzzzr+?I>N8hx8@JIK>e$4y>X|9xxk#r6Bh@2J5K`PGn3T z*z4D_4K3A_H8$-PVyWF26NGu~b#QK;%12V7ha_rWT~LYAJYbqwIVfnein)if)@09p{VsijP0a)sb4BDAGx)SURifJ_cH ztz$y7f|wo#)YgO8VOoHvClr9B_QxCs{Wx$);I430pyr0`_3O4)X*e{ah~Oh;t)wqQ zK&7Z|rI4Uz2#o|dDx1%2($`Zsm7`lui7h;jF&TI2O&WAQ*i_8-aH!MK*&Xu_)R5Wf_*fti`vtw>37*rMWzCiP<95wTUVlgOsi%K=?*o zy1OFvyG8oRb}zIwnc;ztF7)cnDIC$!%BauB zCAx$piF1Y&S^zLkJfsNb0kyISg=l2KS4%K(iMo!g3hf_cBcVlcg;GK~4cu?(2+9XR zyB_EeV0AmO;L#bu>IobG_`v|+6UrF?=}3kF$q;akI9gSVasw6=3^aiDwIudONzinq z3lkzn4W;kf+y+597Ba2o$x?=Kq5HdmAA(} z*j9ovw#+L*k(DHjAx1(Zdto~o{{Tb(00ppRA69&rpd+B;#AO8GDgeMZ4di1!P#94; zV7WO%P}`{|PD>obVs`6eS6UeJpp1ULWo5Xg+_v@5bPRPS5jlHcBP?FJthZxF@4M6j61qpJ1bOkoB;xwGZ zFs}ztWi*)Jv2ChzL5@IYQ8v{s1jlf9CtXaAp&ZUka7oli=N-s67($fN@${VGcp0f3 zP{b`TSP-d)6CyE#$T%61ZCK?Az}%j70YgxN1PJvq9t0my$iYnJ9b~#YM>ZZa3CQ+F z&0A-Z8z@*3`YRfibBfu?C4#HIHgz@H*0%Hj=o4vUG^k`_Cf!QN)uVS-V9vK$ZLD&V zq!hZ@ksSL(c)N8&gVn8$n}fhi8TLe0q*Jlf-Kr%%9AN&04&s$m>wq2~Yz~PBu_14% zb+rRIj&aa)C)j-}Ovi|hOh$qMn8z*#7y^OPV5SHh1TXoA7^1X@&^z?WAemvra)JSL zHLubr3C$b~Qkx)KRWRGd-MWeeB|>u&ls)!J2EB01O6zNU*SJ!TDI|!ly^&J(qLG1S zsFd_!#|S^PJrUpR^#>sx`%%ylNw?l{!KfKR+k7LH3vIsCs1B|E= zM-Fid>P*?MbO{T7nCWm8C!A!p9ZhMga2V6+Py`u>ysNI-$4;1Ymvppapp5_F_-j)R1$ z26#t6WK5I{1BVi!#te%GjHibfCmqyA2N)n5Q%GN@0}9lPoDHojNRh-qXk@@@Xc&Kh z1|;a2O5LIsy3n?PC=*Od)q>T$k;!rPRWy<%!VqRl(B0=Cyy2^8Cu$PS)HdR9#&K0* zPNJuWWH6#tjB&$D7~udT4h}yUmd6Oy>uc>{iT3e~eUE$ef6%pv`&09gLIKBcjyT~T z_CPpgYBlYIrSMTJBnN=^j2sdJithZ8wY)-AT!FNz|E)V`4FbIW#;E z0~2^<7EnO}Xwq^qMUe_#<+7=V&07P?tQ<)D<2K!KlUA$Bf(ezW4r3YFaO5ndK=6(f zeZx5@L103{rUHf$z!bBsI){vNISOUKwCGl13SekXqT2f)a5p2aB`zjoI4>fn0x8r| zbgL)`HXTxQs$vWP>xm0Q#&OK$fu_zfJYi5-)wBj9j24beWyS-8lK2=YfRnSiqyVEL zFpU(nlDa1!N?v5~;TCx$uw@?P?8a)_HEe*IhNeP?5y-|5XH2O#`rCXnA(J6R3si`~ zLOjPP^dR73mr;`BJK*nadF~Gw}AnG*(BOIIoq4b@3=M`3w8WOfa7z{abhX6Y1wGAgO5yt_p z$xNxKNW}I-qq{M$?ChkOAOprYGR}WxZ#19-`DF;?DUY*Yab{^wk=h}an=_uoiHcpm z02;*m<3&AH)gc$&^u>=QXBaS$v1Hw4rg*OV&(lWNWK!KAQEkeN3 zHm0FqG9;vk=nS4Q!8`$u0p%uqBaRSIX95BwoMVm_7le!%Iu2;%9C6TiD<~j=r&vm{ zPH?WHCJy2iDJ)DvG&*E$Wv!P%QUr`b)c7k~kgw6Y#$pl*ry^8H}Tv3TInf@GuiO zqpC>;2nDpVh3XzK^{^Txn63dBUafvAvhgxK&~O>%t0cDOj*$^A(w z1!hwnv5{$%dN#Z;WZqB)FhBL!R`e`hTOvjW{<|4&sITtm;9*{dH|?mV?`|Q$LBcuu z>IHj?RgZE7fR(EV!?#PRO4%~qO;VQ<6r4fKL{kevNg$5SaKej0AyfE4M>GunVo0Wl9$*sLk5O5KrAmvm^ZiR6{Gq)AiR+en#CJY!8Xq(%>k=+y#1;{nv=XeD|~)T5};0a?aULkSBx&5v4Z*10oB3kBXPEl7Eld1gBx3>`^zB1u`toN^M?B$HU$ z(VR230a{B2d1XZMk2`gbsq}S4MkIMgX+0wDBlH9E0YY<*0IolLa8Ab@aHcro2Xxk| zhJ{aqEh2M?ZLFf2?F`3nJL00HY6wx3N}jjK_x64UHkSVYylvb27dm$oP!t72Gr?${ zBfped+EinbRo$HMeWSK-^jGUGHOi4;ZB!vD1a^pRcI<@NPOOng(y4GT%K$j$2eLVw zfvyxy)zcJ_Ifxdlp{r0YEkkzi>HDO?E|q4gdx%v5zN1Zgl6Iia6u|;Qq+_Jv!nFkXP8^}T0to8*Wz{61Lj%q`w2ZJ&cUQLbb&R+}dR!oo zv7F(0wUkwEoHGo+*y}A7iecHQGxDl5>$1%^+Hme?!G>HR%;RFJ~f&pPrKzNDvM?u0A znB#=$oNz|ehyhGNM?Me(A{3YqG>Fn?0s|+CXWtzM2vClLgb{=RhRR5V3C&XMj*!93 z4~%igCP!$16NI5z#~cprJo1Ef88R}ig$f2@N1RF2qOl28LZr?^;R;bPnnLh)QzQsY zj|QJslVVm!Ox2uu`wyqop$Nm57>S^}4%qzw{D4+7jyUL!IOvWzRB^>`eWsY$sspMC z8cs4Nhhzp5=S2i-K5QmrVaW?XYx8%`aIQvBeG&fvO_e*fx@TEUBHyqqlGRCC5)iTK zNJ^9xLF^F)`Q!SRv~5%}9I|$V@{DI6XbEKoHqpj6@U$GTC2O0SY&P=duu3 zsOu$i%LoW8;-{-DU^9?ND$$7Uh7@f&^<@Afi}d#Lg205fS3IzQg2k^P&InFD7=0Fj^jcE;NEGTGQ$uT>={>FM?V0Er{- zA}WZo3gY(TT>k)Iw4QpBtUL@btc+!pmw(niQm#6ZqxeH1OC7bVB0_(7EnEbM`@}E_ zw%sXD`es7>Qa!>74jBpuKs%nfsIybc|kP7}0!UxcQ zFN6SzIpY8)hOYSF4L_q#n+Oajj;c*OjMO4lfzck)X}X6>hOSYcY3cerk2xt}lwrB_ Ky2fH#ckzJ$ diff --git a/docs/img/portfolio/fullsize/6.jpg b/docs/img/portfolio/fullsize/6.jpg deleted file mode 100644 index 9be6c5ea2b664acd57b5edbecd16c0af853a4ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53428 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 PgL}VIZuAj)RH^^jIMg;Z diff --git a/docs/img/portfolio/thumbnails/1.jpg b/docs/img/portfolio/thumbnails/1.jpg deleted file mode 100644 index 44692cc902078585121655d9590d3312cbe50cd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63788 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 RG9nuP0D71W+;>w0|JfIUT7Uom diff --git a/docs/img/portfolio/thumbnails/2.jpg b/docs/img/portfolio/thumbnails/2.jpg deleted file mode 100644 index 0df8fde8c18bc38a36b7e9e9f7ba179164d41407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48101 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 diff --git a/docs/img/portfolio/thumbnails/3.jpg b/docs/img/portfolio/thumbnails/3.jpg deleted file mode 100644 index 3b0862707b2bce677bde7819960174c6a49aad48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48228 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 F|Jm%t5mx{J diff --git a/docs/img/portfolio/thumbnails/5.jpg b/docs/img/portfolio/thumbnails/5.jpg deleted file mode 100644 index cd87077058a73a025a34c0b80f966de50bdb371f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62334 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

P-tBw}rl^5o#Bn4kF5FeRV!YoQe;iq0R^OEBF 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 Ky2fH#ckzJ$ diff --git a/docs/img/portfolio/thumbnails/6.jpg b/docs/img/portfolio/thumbnails/6.jpg deleted file mode 100644 index 9be6c5ea2b664acd57b5edbecd16c0af853a4ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53428 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 PgL}VIZuAj)RH^^jIMg;Z From 3fc885e38b07588261ba86fbbedefc97571b4aad Mon Sep 17 00:00:00 2001 From: Danny Parsons Date: Wed, 28 Jun 2017 16:50:51 +0100 Subject: [PATCH 201/201] two var fit model working with display sub dialog --- instat/clsRSyntax.vb | 14 +- instat/clsRegressionDefaults.vb | 27 +- instat/dlgFitCorruptionModel.vb | 2 +- instat/dlgFitModel.vb | 10 +- instat/dlgFourVariableModelling.vb | 16 +- instat/dlgRegressionSimple.vb | 91 +++--- instat/dlgThreeVariablesModelling.vb | 10 +- instat/sdgSimpleRegOptions.Designer.vb | 372 ++++++++++++------------- instat/sdgSimpleRegOptions.vb | 359 +++++++++++++----------- instat/ucrCore.vb | 4 +- 10 files changed, 464 insertions(+), 441 deletions(-) diff --git a/instat/clsRSyntax.vb b/instat/clsRSyntax.vb index 2a7012e5d48..f636d438a91 100644 --- a/instat/clsRSyntax.vb +++ b/instat/clsRSyntax.vb @@ -460,5 +460,17 @@ Public Class RSyntax Public Sub RemoveFromAfterCodes(clsNewRCode As RCodeStructure) lstAfterCodes.Remove(clsNewRCode) - End Sub + End Sub + + Public Sub ClearCodes() + lstBeforeCodes = New List(Of RCodeStructure) + lstAfterCodes = New List(Of RCodeStructure) + clsBaseFunction = Nothing + clsBaseOperator = Nothing + clsBaseCommandString = Nothing + strCommandString = "" + bUseBaseFunction = False + bUseBaseOperator = False + bUseCommandString = False + End Sub End Class \ No newline at end of file diff --git a/instat/clsRegressionDefaults.vb b/instat/clsRegressionDefaults.vb index 09dd614cd44..3ae2522612f 100644 --- a/instat/clsRegressionDefaults.vb +++ b/instat/clsRegressionDefaults.vb @@ -43,13 +43,12 @@ Get Dim clsDefaultRestpvalFunction As New RFunction - clsDefaultRestpvalFunction.SetPackageName("base") clsDefaultRestpvalFunction.SetRCommand("summary") Return clsDefaultRestpvalFunction End Get End Property - Public Shared ReadOnly Property clsDefaultRConfinterval As RFunction + Public Shared ReadOnly Property clsDefaultConfint As RFunction Get Dim clsDefaultRConfint As New RFunction clsDefaultRConfint.SetPackageName("stats") @@ -67,7 +66,7 @@ End Get End Property - Public Shared ReadOnly Property clsDefaultRanovaFunction As RFunction + Public Shared ReadOnly Property clsDefaultAnovaFunction As RFunction Get Dim clsDefaultRaovFunction As New RFunction clsDefaultRaovFunction.SetPackageName("stats") @@ -76,8 +75,7 @@ End Get End Property - - Public Shared ReadOnly Property clsDefaultModel As RFunction + Public Shared ReadOnly Property clsDefaultFormulaFunction As RFunction Get Dim clsDefaultRModelsFunction As New RFunction clsDefaultRModelsFunction.SetPackageName("stats") @@ -86,12 +84,12 @@ End Get End Property - Public Shared ReadOnly Property clsDefaultRResidualPlots As RFunction + Public Shared ReadOnly Property clsDefaultAutoplot As RFunction Get - Dim clsDefaultRResidualPlotsFunction As New RFunction - clsDefaultRResidualPlotsFunction.SetPackageName("ggplot2") - clsDefaultRResidualPlotsFunction.SetRCommand("autoplot") - Return clsDefaultRResidualPlotsFunction + Dim clsAutoplot As New RFunction + clsAutoplot.SetRCommand("autoplot") + clsAutoplot.iCallType = 3 + Return clsAutoplot End Get End Property @@ -104,15 +102,6 @@ End Get End Property - Public Shared ReadOnly Property clsDefaultRggplot As RFunction - Get - Dim clsDefaultRggplotFunction As New RFunction - clsDefaultRggplotFunction.SetPackageName("visreg") - clsDefaultRggplotFunction.SetRCommand("visreg") - Return clsDefaultRggplotFunction - End Get - End Property - Public Shared ReadOnly Property clsDefaultAddColumnsToData As RFunction Get Dim clsDefaultAddColumnsToDataFunction As New RFunction diff --git a/instat/dlgFitCorruptionModel.vb b/instat/dlgFitCorruptionModel.vb index 842220fcaae..222c5ff4670 100644 --- a/instat/dlgFitCorruptionModel.vb +++ b/instat/dlgFitCorruptionModel.vb @@ -179,7 +179,7 @@ Public Class dlgFitCorruptionModel ' sdgSimpleRegOptions.SetRYVariable(ucrReceiverOutput) ' sdgSimpleRegOptions.SetDefaults() ' sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True - sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True + sdgSimpleRegOptions.lblConfLevel.Enabled = True ' sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True End Sub diff --git a/instat/dlgFitModel.vb b/instat/dlgFitModel.vb index ef7a3e603f4..123e649c959 100644 --- a/instat/dlgFitModel.vb +++ b/instat/dlgFitModel.vb @@ -70,7 +70,7 @@ Public Class dlgFitModel sdgModelOptions.SetDefaults() ResponseConvert() ' sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True - sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True + sdgSimpleRegOptions.lblConfLevel.Enabled = True 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True TestOKEnabled() End Sub @@ -167,7 +167,7 @@ Public Class dlgFitModel Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click sdgModelOptions.ShowDialog() - ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) + ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrDistributionChoice.clsCurrDistribution.strNameTag) End Sub Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click @@ -205,7 +205,7 @@ Public Class dlgFitModel clsModel.AddParameter(iPosition:=0, strParameterValue:=ucrReceiverResponseVar.GetVariableNames(bWithQuotes:=False)) ucrFamily.RecieverDatatype(ucrSelectorByDataFrameAddRemoveForFitModel.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrReceiverResponseVar.GetVariableNames(bWithQuotes:=False)) End If - sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) + sdgModelOptions.ucrDistributionChoice.RecieverDatatype(ucrFamily.strDataType) End If If ucrFamily.lstCurrentDistributions.Count = 0 Or ucrReceiverResponseVar.IsEmpty() Then @@ -253,8 +253,8 @@ Public Class dlgFitModel End Sub Public Sub ChooseRFunction() - sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) - sdgModelOptions.ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrFamily.clsCurrDistribution.strNameTag) + sdgModelOptions.ucrDistributionChoice.RecieverDatatype(ucrFamily.strDataType) + sdgModelOptions.ucrDistributionChoice.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrDistributionChoice.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrFamily.clsCurrDistribution.strNameTag) sdgModelOptions.RestrictLink() 'TODO: Include multinomial as an option And the appropriate function 'If (ucrFamily.clsCurrDistribution.strNameTag = "Normal") Then diff --git a/instat/dlgFourVariableModelling.vb b/instat/dlgFourVariableModelling.vb index f798b34aed2..60ee12f775b 100644 --- a/instat/dlgFourVariableModelling.vb +++ b/instat/dlgFourVariableModelling.vb @@ -125,7 +125,7 @@ Public Class dlgFourVariableModelling clsModel.AddParameter(iPosition:=0, strParameterValue:=ucrResponse.GetVariableNames(bWithQuotes:=False)) ucrFamily.RecieverDatatype(ucrSelectorFourVariableModelling.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrResponse.GetVariableNames(bWithQuotes:=False)) End If - sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) + sdgModelOptions.ucrDistributionChoice.RecieverDatatype(ucrFamily.strDataType) End If If ucrFamily.lstCurrentDistributions.Count = 0 Or ucrResponse.IsEmpty() Then @@ -232,34 +232,34 @@ Public Class dlgFourVariableModelling End Sub Public Sub ChooseRFunction() - sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) - sdgModelOptions.ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrFamily.clsCurrDistribution.strNameTag) + sdgModelOptions.ucrDistributionChoice.RecieverDatatype(ucrFamily.strDataType) + sdgModelOptions.ucrDistributionChoice.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrDistributionChoice.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrFamily.clsCurrDistribution.strNameTag) sdgModelOptions.RestrictLink() 'TODO: Include multinomial as an option And the appropriate function If (ucrFamily.clsCurrDistribution.strNameTag = "Normal" And ucrInputModelOperators2.GetText <> "|") Then 'sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True - sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True + sdgSimpleRegOptions.lblConfLevel.Enabled = True 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True ucrBaseFourVariableModelling.clsRsyntax.SetFunction("lm") ucrBaseFourVariableModelling.clsRsyntax.RemoveParameter("family") ElseIf (ucrFamily.clsCurrDistribution.strNameTag = "Normal" And ucrInputModelOperators2.GetText = "|") Then ' sdgSimpleRegOptions.chkDisplayCLimits.Checked = False ' sdgSimpleRegOptions.chkDisplayCLimits.Enabled = False - sdgSimpleRegOptions.lblDisplayCLevel.Enabled = False + sdgSimpleRegOptions.lblConfLevel.Enabled = False ' sdgSimpleRegOptions.nudDisplayCLevel.Enabled = False ucrBaseFourVariableModelling.clsRsyntax.SetFunction("lmer") ucrBaseFourVariableModelling.clsRsyntax.RemoveParameter("family") ElseIf (ucrFamily.clsCurrDistribution.strNameTag <> "Normal" And ucrInputModelOperators2.GetText = "|") Then 'sdgSimpleRegOptions.chkDisplayCLimits.Checked = False 'sdgSimpleRegOptions.chkDisplayCLimits.Enabled = False - sdgSimpleRegOptions.lblDisplayCLevel.Enabled = False + sdgSimpleRegOptions.lblConfLevel.Enabled = False 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = False clsRCIFunction.SetRCommand(ucrFamily.clsCurrDistribution.strGLMFunctionName) ucrBaseFourVariableModelling.clsRsyntax.SetFunction("glmer") ucrBaseFourVariableModelling.clsRsyntax.AddParameter("family", clsRFunctionParameter:=clsRCIFunction) Else ' sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True - sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True + sdgSimpleRegOptions.lblConfLevel.Enabled = True 'sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True clsRCIFunction.SetRCommand(ucrFamily.clsCurrDistribution.strGLMFunctionName) ucrBaseFourVariableModelling.clsRsyntax.SetFunction("glm") @@ -273,7 +273,7 @@ Public Class dlgFourVariableModelling Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click sdgModelOptions.ShowDialog() - ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) + ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrDistributionChoice.clsCurrDistribution.strNameTag) End Sub Private Sub chkFirstFunction_CheckedChanged(sender As Object, e As EventArgs) Handles chkFirstFunction.CheckedChanged diff --git a/instat/dlgRegressionSimple.vb b/instat/dlgRegressionSimple.vb index fea1e1854f8..d8595b89a0a 100644 --- a/instat/dlgRegressionSimple.vb +++ b/instat/dlgRegressionSimple.vb @@ -19,13 +19,17 @@ Imports instat.Translations Public Class dlgRegressionSimple Public bFirstLoad As Boolean = True - Public clsModel, clsFormulaOperator, clsRGraphicsOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator - Public clsRPoisson, clsRggplotFunction, clsRLeverage, clsRWriteLeverage, clsRResiduals, clsRStdResiduals, clsRWriteResiduals, clsRWriteStdResiduals, clsRgeom_point, clsRResidualPlots, clsRModelsFunction, clsRWriteFitted, clsRFittedValues, clsRSummaryFunction, clsRestpvalFunction, clsRanovaFunction, clsRConfint, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsAsNumeric, clsFamilyFunction, clsRFactor, clsRFactor2, clsRNumeric, clsGLM, clsLM, clsLMOrGLM, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsTFunc, clsRLength As New RFunction - Private bRCodeSet As Boolean + Public clsModel, clsRGraphicsOperator, clsFunctionOperation, clsPoissonOperation, clsPoissonOperation2, clsRBinomialOperation, clsRBinomialOperation2, clsRBinomialOperation3 As New ROperator + Public clsRPoisson, clsVisReg, clsRLeverage, clsRWriteLeverage, clsRResiduals, clsRStdResiduals, clsRWriteResiduals, clsRWriteStdResiduals, clsRgeom_point, clsAutoPlot, clsRWriteFitted, clsRFittedValues, clsRestpvalFunction, clsRaovpvalFunction, clsRModelFunction, clsRaovFunction, clsRTTest, clsRFTest, clsRKruskalTest, clsRBinomial, clsRWilcoxTest, clsFamilyFunction, clsRFactor, clsRFactor2, clsRNumeric, clsxFunc, clsRMean, clsRMean2, clsRGroup, clsRGroup2, clsTFunc, clsRLength As New RFunction - Private Sub ucrFamily_EnabledChanged(sender As Object, e As EventArgs) Handles ucrDistributionChoice.EnabledChanged + 'General case codes + Public clsFormulaOperator As ROperator + Public clsGLM, clsLM, clsLMOrGLM, clsAsNumeric As RFunction - End Sub + 'Display options codes + Public clsFormulaFunction, clsAnovaFunction, clsSummaryFunction, clsConfint As RFunction + + Private bRCodeSet As Boolean Public clsRYVariable, clsRXVariable, ModelPreview As String Private bReset As Boolean = True @@ -52,6 +56,7 @@ Public Class dlgRegressionSimple ucrBase.iHelpTopicID = 366 ucrBase.clsRsyntax.iCallType = 2 + ucrBase.clsRsyntax.bExcludeAssignedFunctionOutput = False ucrDistributionChoice.SetGLMDistributions() ucrDistributionChoice.SetFunctionIsDistFunction() @@ -100,10 +105,6 @@ Public Class dlgRegressionSimple '################################### ' Two sample controls - ucrModelPreview.SetLinkedDisplayControl(lblModelPreview) - ucrModelPreview.SetLinkedDisplayControl(cmdDisplayOptions) - ucrModelPreview.SetLinkedDisplayControl(cmdModelOptions) - ucrNudCI.SetParameter(New RParameter("conf.level")) ucrNudCI.SetLinkedDisplayControl(lblConfidenceInterval) @@ -136,6 +137,7 @@ Public Class dlgRegressionSimple clsPoissonOperation = New ROperator clsRGraphicsOperator = New ROperator + ucrBase.clsRsyntax.ClearCodes() clsLM = New RFunction clsGLM = New RFunction clsAsNumeric = New RFunction @@ -146,11 +148,11 @@ Public Class dlgRegressionSimple clsRLength = New RFunction clsRKruskalTest = New RFunction clsRFTest = New RFunction - clsRModelsFunction = New RFunction + clsFormulaFunction = New RFunction clsRModelFunction = New RFunction clsRaovFunction = New RFunction clsRaovpvalFunction = New RFunction - clsRConfint = New RFunction + clsConfint = New RFunction clsRestpvalFunction = New RFunction clsRFittedValues = New RFunction clsRResiduals = New RFunction @@ -160,11 +162,11 @@ Public Class dlgRegressionSimple clsRLeverage = New RFunction clsRWriteStdResiduals = New RFunction clsRWriteFitted = New RFunction - clsRSummaryFunction = New RFunction - clsRanovaFunction = New RFunction - clsRResidualPlots = New RFunction + clsSummaryFunction = New RFunction + clsAnovaFunction = New RFunction + clsAutoPlot = New RFunction clsRgeom_point = New RFunction - clsRggplotFunction = New RFunction + clsVisReg = New RFunction ucrSelectorSimpleReg.Reset() ucrReceiverResponse.SetMeAsReceiver() @@ -182,10 +184,9 @@ Public Class dlgRegressionSimple clsGLM = clsRegressionDefaults.clsDefaultGlmFunction.Clone clsGLM.AddParameter("formula", clsROperatorParameter:=clsFormulaOperator, iPosition:=1) - 'Residual Plots - clsRResidualPlots = clsRegressionDefaults.clsDefaultRResidualPlots.Clone - clsRResidualPlots.AddParameter("object", clsRFunctionParameter:=clsLMOrGLM) + clsAutoPlot = clsRegressionDefaults.clsDefaultAutoplot.Clone + clsRgeom_point = clsRegressionDefaults.clsDefaultRgeom_pointFunction.Clone clsRGraphicsOperator.AddParameter("geom_point", clsRFunctionParameter:=clsRgeom_point, iPosition:=1) @@ -196,32 +197,27 @@ Public Class dlgRegressionSimple clsRaovFunction.iCallType = 2 'FitModel - clsRggplotFunction = clsRegressionDefaults.clsDefaultRggplot.Clone - clsRggplotFunction.AddParameter("type", Chr(34) & "conditional" & Chr(34)) - clsRggplotFunction.AddParameter("scale", Chr(34) & "linear" & Chr(34)) - clsRggplotFunction.AddParameter("alpha", 0.05) - clsRggplotFunction.AddParameter("fit", clsRFunctionParameter:=clsLMOrGLM) - clsRggplotFunction.iCallType = 3 + clsVisReg.SetPackageName("visreg") + clsVisReg.SetRCommand("visreg") + clsVisReg.AddParameter("type", Chr(34) & "conditional" & Chr(34)) + clsVisReg.AddParameter("gg", "TRUE") + clsVisReg.iCallType = 3 'Model - clsRModelsFunction = clsRegressionDefaults.clsDefaultModel.Clone - clsRModelsFunction.AddParameter("", clsRFunctionParameter:=clsLMOrGLM) - clsRModelsFunction.iCallType = 2 + clsFormulaFunction = clsRegressionDefaults.clsDefaultFormulaFunction.Clone + clsFormulaFunction.iCallType = 2 'Summary - clsRSummaryFunction = clsRegressionDefaults.clsDefaultSummary.Clone - clsRSummaryFunction.AddParameter("", clsRFunctionParameter:=clsLMOrGLM) - clsRSummaryFunction.iCallType = 2 + clsSummaryFunction = clsRegressionDefaults.clsDefaultSummary.Clone + clsSummaryFunction.iCallType = 2 'ANOVA - clsRanovaFunction = clsRegressionDefaults.clsDefaultRanovaFunction.Clone - clsRanovaFunction.AddParameter("", clsRFunctionParameter:=clsLMOrGLM) - clsRanovaFunction.iCallType = 2 + clsAnovaFunction = clsRegressionDefaults.clsDefaultAnovaFunction.Clone + clsAnovaFunction.iCallType = 2 'Confidence Interval - clsRConfint = clsRegressionDefaults.clsDefaultRConfinterval.Clone - clsRConfint.AddParameter("object", clsRFunctionParameter:=clsLMOrGLM) - clsRConfint.iCallType = 2 + clsConfint = clsRegressionDefaults.clsDefaultConfint.Clone + clsConfint.iCallType = 2 'Anova + Pvalue clsRestpvalFunction = clsRegressionDefaults.clsDefaultRaovPValueFunction.Clone @@ -270,7 +266,6 @@ Public Class dlgRegressionSimple clsxFunc.AddParameter("l2", clsRFunctionParameter:=clsRLength, bIncludeArgumentName:=False) clsRPoisson.AddParameter("x", clsRFunctionParameter:=clsxFunc) - clsRLength.SetRCommand("length") clsRKruskalTest.SetPackageName("stats") @@ -278,13 +273,14 @@ Public Class dlgRegressionSimple clsTFunc.SetRCommand("c") - ucrBase.clsRsyntax.SetBaseRFunction(clsLM) - clsLMOrGLM = clsLM - clsLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempModel:="last_model", bAssignToIsPrefix:=True) clsGLM.SetAssignTo(ucrSaveModels.GetText, strTempDataframe:=ucrSelectorSimpleReg.ucrAvailableDataFrames.cboAvailableDataFrames.Text, strTempModel:="last_model", bAssignToIsPrefix:=True) + clsLMOrGLM = clsLM + + ucrBase.clsRsyntax.SetBaseRFunction(clsLM) + ucrBase.clsRsyntax.AddToAfterCodes(clsAnovaFunction, 1) + ucrBase.clsRsyntax.AddToAfterCodes(clsSummaryFunction, 2) - sdgModelOptions.SetDefaults() bResetSubDialog = True bResetOptionsSubDialog = True End Sub @@ -363,9 +359,9 @@ Public Class dlgRegressionSimple End Sub Private Sub cmdDisplayOptions_Click(sender As Object, e As EventArgs) Handles cmdDisplayOptions.Click - sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewRGraphicsOperator:=clsRGraphicsOperator, clsNewRanovaFunction:=clsRanovaFunction, clsNewRSummaryFunction:=clsRSummaryFunction, clsNewRgeom_point:=clsRgeom_point, clsNewRResidualPlots:=clsRResidualPlots, clsNewRggplotFunction:=clsRggplotFunction, clsNewRConfint:=clsRConfint, clsNewRWriteResiduals:=clsRWriteResiduals, clsNewRWriteStdResiduals:=clsRWriteStdResiduals, clsNewRWriteLeverage:=clsRWriteLeverage, clsNewRModelsFunction:=clsRModelsFunction, clsNewRaovpvalFunction:=clsRaovpvalFunction, clsNewRestpvalFunction:=clsRestpvalFunction, clsNewRLmOrGLM:=clsLMOrGLM, clsNewRXVariable:=clsRXVariable, clsNewRYVariable:=clsRYVariable, clsNewRWriteFitted:=clsRWriteFitted, clsNewRFittedValues:=clsRFittedValues, bReset:=bResetOptionsSubDialog) - bResetOptionsSubDialog = False + sdgSimpleRegOptions.SetRCode(ucrBase.clsRsyntax, clsNewFormulaFunction:=clsFormulaFunction, clsNewAnovaFunction:=clsAnovaFunction, clsNewRSummaryFunction:=clsSummaryFunction, clsNewConfint:=clsConfint, clsNewVisReg:=clsVisReg, clsNewAutoplot:=clsAutoPlot, bReset:=bResetOptionsSubDialog) sdgSimpleRegOptions.ShowDialog() + bResetOptionsSubDialog = False End Sub Private Sub ucrResponse_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrReceiverResponse.ControlValueChanged @@ -377,7 +373,7 @@ Public Class dlgRegressionSimple Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click sdgModelOptions.ShowDialog() - ucrDistributionChoice.ucrInputDistributions.cboInput.SelectedIndex = ucrDistributionChoice.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) + ucrDistributionChoice.ucrInputDistributions.cboInput.SelectedIndex = ucrDistributionChoice.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrDistributionChoice.clsCurrDistribution.strNameTag) End Sub Private Sub SetTTest() @@ -566,6 +562,13 @@ Public Class dlgRegressionSimple clsLMOrGLM = clsGLM End If ucrBase.clsRsyntax.SetBaseRFunction(clsLMOrGLM) + 'Update display functions to contain correct model + clsFormulaFunction.AddParameter("x", clsRFunctionParameter:=clsLMOrGLM) + clsAnovaFunction.AddParameter("object", clsRFunctionParameter:=clsLMOrGLM) + clsSummaryFunction.AddParameter("object", clsRFunctionParameter:=clsLMOrGLM) + clsConfint.AddParameter("object", clsRFunctionParameter:=clsLMOrGLM) + clsVisReg.AddParameter("fit", clsRFunctionParameter:=clsLMOrGLM) + clsAutoPlot.AddParameter("object", clsRFunctionParameter:=clsLMOrGLM) ElseIf rdoTwoSample.Checked Then If ucrDistributionChoice.clsCurrDistribution.strNameTag = "Normal" Then If rdoCompareMeans.Checked Then diff --git a/instat/dlgThreeVariablesModelling.vb b/instat/dlgThreeVariablesModelling.vb index c522aa7bfa2..97015c9ab92 100644 --- a/instat/dlgThreeVariablesModelling.vb +++ b/instat/dlgThreeVariablesModelling.vb @@ -92,7 +92,7 @@ Public Class dlgThreeVariableModelling ResponseConvert() ModelOperator() 'sdgSimpleRegOptions.chkDisplayCLimits.Enabled = True - sdgSimpleRegOptions.lblDisplayCLevel.Enabled = True + sdgSimpleRegOptions.lblConfLevel.Enabled = True '' sdgSimpleRegOptions.nudDisplayCLevel.Enabled = True TestOKEnabled() End Sub @@ -132,7 +132,7 @@ Public Class dlgThreeVariableModelling clsModel.AddParameter(iPosition:=0, strParameterValue:=ucrResponse.GetVariableNames(bWithQuotes:=False)) ucrFamily.RecieverDatatype(ucrSelectorThreeVariableModelling.ucrAvailableDataFrames.cboAvailableDataFrames.Text, ucrResponse.GetVariableNames(bWithQuotes:=False)) End If - sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) + sdgModelOptions.ucrDistributionChoice.RecieverDatatype(ucrFamily.strDataType) End If If ucrFamily.lstCurrentDistributions.Count = 0 Or ucrResponse.IsEmpty() Then ucrFamily.Enabled = False @@ -257,8 +257,8 @@ Public Class dlgThreeVariableModelling End Sub Public Sub ucrFamily_cboDistributionsIndexChanged() Handles ucrFamily.DistributionsIndexChanged - sdgModelOptions.ucrFamily.RecieverDatatype(ucrFamily.strDataType) - sdgModelOptions.ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrFamily.clsCurrDistribution.strNameTag) + sdgModelOptions.ucrDistributionChoice.RecieverDatatype(ucrFamily.strDataType) + sdgModelOptions.ucrDistributionChoice.ucrInputDistributions.cboInput.SelectedIndex = sdgModelOptions.ucrDistributionChoice.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = ucrFamily.clsCurrDistribution.strNameTag) sdgModelOptions.RestrictLink() 'TODO: Include multinomial as an option And the appropriate function If (ucrFamily.clsCurrDistribution.strNameTag = "Normal") Then @@ -273,7 +273,7 @@ Public Class dlgThreeVariableModelling Private Sub cmdModelOptions_Click(sender As Object, e As EventArgs) Handles cmdModelOptions.Click sdgModelOptions.ShowDialog() - ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrFamily.clsCurrDistribution.strNameTag) + ucrFamily.ucrInputDistributions.cboInput.SelectedIndex = ucrFamily.lstCurrentDistributions.FindIndex(Function(dist) dist.strNameTag = sdgModelOptions.ucrDistributionChoice.clsCurrDistribution.strNameTag) End Sub Private Sub chkResponseFunction_CheckedChanged(sender As Object, e As EventArgs) Handles chkResponseFunction.CheckedChanged diff --git a/instat/sdgSimpleRegOptions.Designer.vb b/instat/sdgSimpleRegOptions.Designer.vb index 04d41281199..13a1fd11bb3 100644 --- a/instat/sdgSimpleRegOptions.Designer.vb +++ b/instat/sdgSimpleRegOptions.Designer.vb @@ -25,18 +25,28 @@ Partial Class sdgSimpleRegOptions Me.tbGraphics = New System.Windows.Forms.TabPage() Me.tcGraphics = New System.Windows.Forms.TabControl() Me.tbModel = New System.Windows.Forms.TabPage() + Me.ucrNudWhiteSpace = New instat.ucrNud() + Me.ucrNudGraphicsCLevel = New instat.ucrNud() + Me.ucrChkRugs = New instat.ucrCheck() + Me.ucrChkJitter = New instat.ucrCheck() + Me.ucrChkPartial = New instat.ucrCheck() + Me.ucrChkConfIntervalband = New instat.ucrCheck() + Me.ucrChkFittedModel = New instat.ucrCheck() Me.grpRugs = New System.Windows.Forms.GroupBox() Me.rdoPartial = New System.Windows.Forms.RadioButton() Me.rdo1 = New System.Windows.Forms.RadioButton() Me.rdo2 = New System.Windows.Forms.RadioButton() + Me.ucrPnlPartial12 = New instat.UcrPanel() Me.lblWhiteSpace = New System.Windows.Forms.Label() Me.lblGraphicsSignLevel = New System.Windows.Forms.Label() Me.grpPlotType = New System.Windows.Forms.GroupBox() Me.rdoContrast = New System.Windows.Forms.RadioButton() Me.rdoConditional = New System.Windows.Forms.RadioButton() + Me.ucrPnlPlotType = New instat.UcrPanel() Me.grpScale = New System.Windows.Forms.GroupBox() Me.rdoResponse = New System.Windows.Forms.RadioButton() Me.rdoLinear = New System.Windows.Forms.RadioButton() + Me.ucrPnlScale = New instat.UcrPanel() Me.tbResiduals = New System.Windows.Forms.TabPage() Me.rdoCooksDistanceLeverage = New System.Windows.Forms.RadioButton() Me.rdoCooksDistance = New System.Windows.Forms.RadioButton() @@ -48,31 +58,21 @@ Partial Class sdgSimpleRegOptions Me.rdoSixPlots3Rows = New System.Windows.Forms.RadioButton() Me.rdoFourPlots = New System.Windows.Forms.RadioButton() Me.rdoSixPlots2Rows = New System.Windows.Forms.RadioButton() + Me.ucrPnlMutiplePlots = New instat.UcrPanel() Me.grpIndividualPlots = New System.Windows.Forms.GroupBox() + Me.ucrPnlIndividualPlots = New instat.UcrPanel() + Me.ucrChkIndividualPlots = New instat.ucrCheck() + Me.ucrChkMultiplePlots = New instat.ucrCheck() Me.tbDisplay = New System.Windows.Forms.TabPage() - Me.lblDisplayCLevel = New System.Windows.Forms.Label() - Me.tbRegOptions = New System.Windows.Forms.TabControl() - Me.tbSave = New System.Windows.Forms.TabPage() - Me.ucrNudDisplayCLevel = New instat.ucrNud() + Me.ucrNudConfLevel = New instat.ucrNud() Me.ucrChkPvalues = New instat.ucrCheck() Me.ucrChkEstimates = New instat.ucrCheck() - Me.ucrChkDisplayCLimits = New instat.ucrCheck() + Me.ucrChkConfLimits = New instat.ucrCheck() Me.ucrChkANOVA = New instat.ucrCheck() Me.ucrChkModel = New instat.ucrCheck() - Me.ucrNudWhiteSpace = New instat.ucrNud() - Me.ucrNudGraphicsCLevel = New instat.ucrNud() - Me.ucrChkRugs = New instat.ucrCheck() - Me.ucrChkJitter = New instat.ucrCheck() - Me.ucrChkPartial = New instat.ucrCheck() - Me.ucrChkConfIntervalband = New instat.ucrCheck() - Me.ucrChkFittedModel = New instat.ucrCheck() - Me.ucrPnlPartial12 = New instat.UcrPanel() - Me.ucrPnlPlotType = New instat.UcrPanel() - Me.ucrPnlScale = New instat.UcrPanel() - Me.ucrPnlMutiplePlots = New instat.UcrPanel() - Me.ucrPnlIndividualPlots = New instat.UcrPanel() - Me.ucrChkIndividualPlots = New instat.ucrCheck() - Me.ucrChkMultiplePlots = New instat.ucrCheck() + Me.lblConfLevel = New System.Windows.Forms.Label() + Me.tbRegOptions = New System.Windows.Forms.TabControl() + Me.tbSave = New System.Windows.Forms.TabPage() Me.ucrSaveLeverageColumnName = New instat.ucrSave() Me.ucrSaveStdResidualsColumnName = New instat.ucrSave() Me.ucrSaveResidualsColumnName = New instat.ucrSave() @@ -137,6 +137,70 @@ Partial Class sdgSimpleRegOptions Me.tbModel.Text = "Model" Me.tbModel.UseVisualStyleBackColor = True ' + 'ucrNudWhiteSpace + ' + Me.ucrNudWhiteSpace.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudWhiteSpace.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudWhiteSpace.Location = New System.Drawing.Point(112, 150) + Me.ucrNudWhiteSpace.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudWhiteSpace.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudWhiteSpace.Name = "ucrNudWhiteSpace" + Me.ucrNudWhiteSpace.Size = New System.Drawing.Size(50, 20) + Me.ucrNudWhiteSpace.TabIndex = 29 + Me.ucrNudWhiteSpace.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrNudGraphicsCLevel + ' + Me.ucrNudGraphicsCLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Location = New System.Drawing.Point(112, 124) + Me.ucrNudGraphicsCLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudGraphicsCLevel.Name = "ucrNudGraphicsCLevel" + Me.ucrNudGraphicsCLevel.Size = New System.Drawing.Size(50, 20) + Me.ucrNudGraphicsCLevel.TabIndex = 28 + Me.ucrNudGraphicsCLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + ' + 'ucrChkRugs + ' + Me.ucrChkRugs.Checked = False + Me.ucrChkRugs.Location = New System.Drawing.Point(115, 179) + Me.ucrChkRugs.Name = "ucrChkRugs" + Me.ucrChkRugs.Size = New System.Drawing.Size(113, 20) + Me.ucrChkRugs.TabIndex = 24 + ' + 'ucrChkJitter + ' + Me.ucrChkJitter.Checked = False + Me.ucrChkJitter.Location = New System.Drawing.Point(10, 204) + Me.ucrChkJitter.Name = "ucrChkJitter" + Me.ucrChkJitter.Size = New System.Drawing.Size(97, 20) + Me.ucrChkJitter.TabIndex = 23 + ' + 'ucrChkPartial + ' + Me.ucrChkPartial.Checked = False + Me.ucrChkPartial.Location = New System.Drawing.Point(10, 178) + Me.ucrChkPartial.Name = "ucrChkPartial" + Me.ucrChkPartial.Size = New System.Drawing.Size(113, 20) + Me.ucrChkPartial.TabIndex = 25 + ' + 'ucrChkConfIntervalband + ' + Me.ucrChkConfIntervalband.Checked = False + Me.ucrChkConfIntervalband.Location = New System.Drawing.Point(115, 202) + Me.ucrChkConfIntervalband.Name = "ucrChkConfIntervalband" + Me.ucrChkConfIntervalband.Size = New System.Drawing.Size(113, 20) + Me.ucrChkConfIntervalband.TabIndex = 22 + ' + 'ucrChkFittedModel + ' + Me.ucrChkFittedModel.Checked = False + Me.ucrChkFittedModel.Location = New System.Drawing.Point(10, 7) + Me.ucrChkFittedModel.Name = "ucrChkFittedModel" + Me.ucrChkFittedModel.Size = New System.Drawing.Size(113, 20) + Me.ucrChkFittedModel.TabIndex = 21 + ' 'grpRugs ' Me.grpRugs.Controls.Add(Me.rdoPartial) @@ -185,6 +249,13 @@ Partial Class sdgSimpleRegOptions Me.rdo2.Text = "2" Me.rdo2.UseVisualStyleBackColor = True ' + 'ucrPnlPartial12 + ' + Me.ucrPnlPartial12.Location = New System.Drawing.Point(6, 13) + Me.ucrPnlPartial12.Name = "ucrPnlPartial12" + Me.ucrPnlPartial12.Size = New System.Drawing.Size(176, 27) + Me.ucrPnlPartial12.TabIndex = 35 + ' 'lblWhiteSpace ' Me.lblWhiteSpace.AutoSize = True @@ -240,6 +311,13 @@ Partial Class sdgSimpleRegOptions Me.rdoConditional.Text = "Conditional" Me.rdoConditional.UseVisualStyleBackColor = True ' + 'ucrPnlPlotType + ' + Me.ucrPnlPlotType.Location = New System.Drawing.Point(9, 19) + Me.ucrPnlPlotType.Name = "ucrPnlPlotType" + Me.ucrPnlPlotType.Size = New System.Drawing.Size(77, 43) + Me.ucrPnlPlotType.TabIndex = 31 + ' 'grpScale ' Me.grpScale.Controls.Add(Me.rdoResponse) @@ -277,6 +355,13 @@ Partial Class sdgSimpleRegOptions Me.rdoLinear.Text = "Linear" Me.rdoLinear.UseVisualStyleBackColor = True ' + 'ucrPnlScale + ' + Me.ucrPnlScale.Location = New System.Drawing.Point(6, 19) + Me.ucrPnlScale.Name = "ucrPnlScale" + Me.ucrPnlScale.Size = New System.Drawing.Size(94, 43) + Me.ucrPnlScale.TabIndex = 28 + ' 'tbResiduals ' Me.tbResiduals.Controls.Add(Me.rdoCooksDistanceLeverage) @@ -420,6 +505,13 @@ Partial Class sdgSimpleRegOptions Me.rdoSixPlots2Rows.Text = "Six_Plots(2 rows)" Me.rdoSixPlots2Rows.UseVisualStyleBackColor = True ' + 'ucrPnlMutiplePlots + ' + Me.ucrPnlMutiplePlots.Location = New System.Drawing.Point(4, 12) + Me.ucrPnlMutiplePlots.Name = "ucrPnlMutiplePlots" + Me.ucrPnlMutiplePlots.Size = New System.Drawing.Size(268, 56) + Me.ucrPnlMutiplePlots.TabIndex = 40 + ' 'grpIndividualPlots ' Me.grpIndividualPlots.Location = New System.Drawing.Point(10, 149) @@ -429,15 +521,38 @@ Partial Class sdgSimpleRegOptions Me.grpIndividualPlots.TabStop = False Me.grpIndividualPlots.Tag = "" ' + 'ucrPnlIndividualPlots + ' + Me.ucrPnlIndividualPlots.Location = New System.Drawing.Point(20, 164) + Me.ucrPnlIndividualPlots.Name = "ucrPnlIndividualPlots" + Me.ucrPnlIndividualPlots.Size = New System.Drawing.Size(268, 68) + Me.ucrPnlIndividualPlots.TabIndex = 29 + ' + 'ucrChkIndividualPlots + ' + Me.ucrChkIndividualPlots.Checked = False + Me.ucrChkIndividualPlots.Location = New System.Drawing.Point(6, 123) + Me.ucrChkIndividualPlots.Name = "ucrChkIndividualPlots" + Me.ucrChkIndividualPlots.Size = New System.Drawing.Size(113, 20) + Me.ucrChkIndividualPlots.TabIndex = 23 + ' + 'ucrChkMultiplePlots + ' + Me.ucrChkMultiplePlots.Checked = False + Me.ucrChkMultiplePlots.Location = New System.Drawing.Point(6, 7) + Me.ucrChkMultiplePlots.Name = "ucrChkMultiplePlots" + Me.ucrChkMultiplePlots.Size = New System.Drawing.Size(113, 20) + Me.ucrChkMultiplePlots.TabIndex = 22 + ' 'tbDisplay ' - Me.tbDisplay.Controls.Add(Me.ucrNudDisplayCLevel) + Me.tbDisplay.Controls.Add(Me.ucrNudConfLevel) Me.tbDisplay.Controls.Add(Me.ucrChkPvalues) Me.tbDisplay.Controls.Add(Me.ucrChkEstimates) - Me.tbDisplay.Controls.Add(Me.ucrChkDisplayCLimits) + Me.tbDisplay.Controls.Add(Me.ucrChkConfLimits) Me.tbDisplay.Controls.Add(Me.ucrChkANOVA) Me.tbDisplay.Controls.Add(Me.ucrChkModel) - Me.tbDisplay.Controls.Add(Me.lblDisplayCLevel) + Me.tbDisplay.Controls.Add(Me.lblConfLevel) Me.tbDisplay.Location = New System.Drawing.Point(4, 22) Me.tbDisplay.Name = "tbDisplay" Me.tbDisplay.Padding = New System.Windows.Forms.Padding(3) @@ -447,53 +562,17 @@ Partial Class sdgSimpleRegOptions Me.tbDisplay.Text = "Display" Me.tbDisplay.UseVisualStyleBackColor = True ' - 'lblDisplayCLevel - ' - Me.lblDisplayCLevel.AutoSize = True - Me.lblDisplayCLevel.Location = New System.Drawing.Point(49, 111) - Me.lblDisplayCLevel.Name = "lblDisplayCLevel" - Me.lblDisplayCLevel.Size = New System.Drawing.Size(93, 13) - Me.lblDisplayCLevel.TabIndex = 5 - Me.lblDisplayCLevel.Tag = "Confidence_Level:" - Me.lblDisplayCLevel.Text = "Confidence Level:" - ' - 'tbRegOptions - ' - Me.tbRegOptions.Controls.Add(Me.tbDisplay) - Me.tbRegOptions.Controls.Add(Me.tbGraphics) - Me.tbRegOptions.Controls.Add(Me.tbSave) - Me.tbRegOptions.Location = New System.Drawing.Point(2, 3) - Me.tbRegOptions.Name = "tbRegOptions" - Me.tbRegOptions.SelectedIndex = 0 - Me.tbRegOptions.Size = New System.Drawing.Size(321, 342) - Me.tbRegOptions.TabIndex = 0 - ' - 'tbSave + 'ucrNudConfLevel ' - Me.tbSave.Controls.Add(Me.ucrSaveLeverageColumnName) - Me.tbSave.Controls.Add(Me.ucrSaveStdResidualsColumnName) - Me.tbSave.Controls.Add(Me.ucrSaveResidualsColumnName) - Me.tbSave.Controls.Add(Me.ucrSaveFittedColumnName) - Me.tbSave.Location = New System.Drawing.Point(4, 22) - Me.tbSave.Name = "tbSave" - Me.tbSave.Padding = New System.Windows.Forms.Padding(3) - Me.tbSave.Size = New System.Drawing.Size(313, 316) - Me.tbSave.TabIndex = 2 - Me.tbSave.Tag = "Save" - Me.tbSave.Text = "Save" - Me.tbSave.UseVisualStyleBackColor = True - ' - 'ucrNudDisplayCLevel - ' - Me.ucrNudDisplayCLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDisplayCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudDisplayCLevel.Location = New System.Drawing.Point(147, 109) - Me.ucrNudDisplayCLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudDisplayCLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudDisplayCLevel.Name = "ucrNudDisplayCLevel" - Me.ucrNudDisplayCLevel.Size = New System.Drawing.Size(50, 20) - Me.ucrNudDisplayCLevel.TabIndex = 12 - Me.ucrNudDisplayCLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudConfLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudConfLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) + Me.ucrNudConfLevel.Location = New System.Drawing.Point(147, 109) + Me.ucrNudConfLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) + Me.ucrNudConfLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) + Me.ucrNudConfLevel.Name = "ucrNudConfLevel" + Me.ucrNudConfLevel.Size = New System.Drawing.Size(50, 20) + Me.ucrNudConfLevel.TabIndex = 12 + Me.ucrNudConfLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) ' 'ucrChkPvalues ' @@ -511,13 +590,13 @@ Partial Class sdgSimpleRegOptions Me.ucrChkEstimates.Size = New System.Drawing.Size(113, 20) Me.ucrChkEstimates.TabIndex = 10 ' - 'ucrChkDisplayCLimits + 'ucrChkConfLimits ' - Me.ucrChkDisplayCLimits.Checked = False - Me.ucrChkDisplayCLimits.Location = New System.Drawing.Point(10, 83) - Me.ucrChkDisplayCLimits.Name = "ucrChkDisplayCLimits" - Me.ucrChkDisplayCLimits.Size = New System.Drawing.Size(113, 20) - Me.ucrChkDisplayCLimits.TabIndex = 9 + Me.ucrChkConfLimits.Checked = False + Me.ucrChkConfLimits.Location = New System.Drawing.Point(10, 83) + Me.ucrChkConfLimits.Name = "ucrChkConfLimits" + Me.ucrChkConfLimits.Size = New System.Drawing.Size(113, 20) + Me.ucrChkConfLimits.TabIndex = 9 ' 'ucrChkANOVA ' @@ -535,120 +614,41 @@ Partial Class sdgSimpleRegOptions Me.ucrChkModel.Size = New System.Drawing.Size(113, 20) Me.ucrChkModel.TabIndex = 7 ' - 'ucrNudWhiteSpace + 'lblConfLevel ' - Me.ucrNudWhiteSpace.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudWhiteSpace.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudWhiteSpace.Location = New System.Drawing.Point(112, 150) - Me.ucrNudWhiteSpace.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudWhiteSpace.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudWhiteSpace.Name = "ucrNudWhiteSpace" - Me.ucrNudWhiteSpace.Size = New System.Drawing.Size(50, 20) - Me.ucrNudWhiteSpace.TabIndex = 29 - Me.ucrNudWhiteSpace.Value = New Decimal(New Integer() {0, 0, 0, 0}) + Me.lblConfLevel.AutoSize = True + Me.lblConfLevel.Location = New System.Drawing.Point(49, 111) + Me.lblConfLevel.Name = "lblConfLevel" + Me.lblConfLevel.Size = New System.Drawing.Size(93, 13) + Me.lblConfLevel.TabIndex = 5 + Me.lblConfLevel.Tag = "Confidence_Level:" + Me.lblConfLevel.Text = "Confidence Level:" ' - 'ucrNudGraphicsCLevel - ' - Me.ucrNudGraphicsCLevel.DecimalPlaces = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudGraphicsCLevel.Increment = New Decimal(New Integer() {1, 0, 0, 0}) - Me.ucrNudGraphicsCLevel.Location = New System.Drawing.Point(112, 124) - Me.ucrNudGraphicsCLevel.Maximum = New Decimal(New Integer() {100, 0, 0, 0}) - Me.ucrNudGraphicsCLevel.Minimum = New Decimal(New Integer() {0, 0, 0, 0}) - Me.ucrNudGraphicsCLevel.Name = "ucrNudGraphicsCLevel" - Me.ucrNudGraphicsCLevel.Size = New System.Drawing.Size(50, 20) - Me.ucrNudGraphicsCLevel.TabIndex = 28 - Me.ucrNudGraphicsCLevel.Value = New Decimal(New Integer() {0, 0, 0, 0}) - ' - 'ucrChkRugs - ' - Me.ucrChkRugs.Checked = False - Me.ucrChkRugs.Location = New System.Drawing.Point(115, 179) - Me.ucrChkRugs.Name = "ucrChkRugs" - Me.ucrChkRugs.Size = New System.Drawing.Size(113, 20) - Me.ucrChkRugs.TabIndex = 24 - ' - 'ucrChkJitter - ' - Me.ucrChkJitter.Checked = False - Me.ucrChkJitter.Location = New System.Drawing.Point(10, 204) - Me.ucrChkJitter.Name = "ucrChkJitter" - Me.ucrChkJitter.Size = New System.Drawing.Size(97, 20) - Me.ucrChkJitter.TabIndex = 23 - ' - 'ucrChkPartial - ' - Me.ucrChkPartial.Checked = False - Me.ucrChkPartial.Location = New System.Drawing.Point(10, 178) - Me.ucrChkPartial.Name = "ucrChkPartial" - Me.ucrChkPartial.Size = New System.Drawing.Size(113, 20) - Me.ucrChkPartial.TabIndex = 25 - ' - 'ucrChkConfIntervalband - ' - Me.ucrChkConfIntervalband.Checked = False - Me.ucrChkConfIntervalband.Location = New System.Drawing.Point(115, 202) - Me.ucrChkConfIntervalband.Name = "ucrChkConfIntervalband" - Me.ucrChkConfIntervalband.Size = New System.Drawing.Size(113, 20) - Me.ucrChkConfIntervalband.TabIndex = 22 - ' - 'ucrChkFittedModel - ' - Me.ucrChkFittedModel.Checked = False - Me.ucrChkFittedModel.Location = New System.Drawing.Point(10, 7) - Me.ucrChkFittedModel.Name = "ucrChkFittedModel" - Me.ucrChkFittedModel.Size = New System.Drawing.Size(113, 20) - Me.ucrChkFittedModel.TabIndex = 21 - ' - 'ucrPnlPartial12 - ' - Me.ucrPnlPartial12.Location = New System.Drawing.Point(6, 13) - Me.ucrPnlPartial12.Name = "ucrPnlPartial12" - Me.ucrPnlPartial12.Size = New System.Drawing.Size(176, 27) - Me.ucrPnlPartial12.TabIndex = 35 - ' - 'ucrPnlPlotType - ' - Me.ucrPnlPlotType.Location = New System.Drawing.Point(9, 19) - Me.ucrPnlPlotType.Name = "ucrPnlPlotType" - Me.ucrPnlPlotType.Size = New System.Drawing.Size(77, 43) - Me.ucrPnlPlotType.TabIndex = 31 - ' - 'ucrPnlScale - ' - Me.ucrPnlScale.Location = New System.Drawing.Point(6, 19) - Me.ucrPnlScale.Name = "ucrPnlScale" - Me.ucrPnlScale.Size = New System.Drawing.Size(94, 43) - Me.ucrPnlScale.TabIndex = 28 - ' - 'ucrPnlMutiplePlots - ' - Me.ucrPnlMutiplePlots.Location = New System.Drawing.Point(4, 12) - Me.ucrPnlMutiplePlots.Name = "ucrPnlMutiplePlots" - Me.ucrPnlMutiplePlots.Size = New System.Drawing.Size(268, 56) - Me.ucrPnlMutiplePlots.TabIndex = 40 - ' - 'ucrPnlIndividualPlots - ' - Me.ucrPnlIndividualPlots.Location = New System.Drawing.Point(20, 164) - Me.ucrPnlIndividualPlots.Name = "ucrPnlIndividualPlots" - Me.ucrPnlIndividualPlots.Size = New System.Drawing.Size(268, 68) - Me.ucrPnlIndividualPlots.TabIndex = 29 - ' - 'ucrChkIndividualPlots + 'tbRegOptions ' - Me.ucrChkIndividualPlots.Checked = False - Me.ucrChkIndividualPlots.Location = New System.Drawing.Point(6, 123) - Me.ucrChkIndividualPlots.Name = "ucrChkIndividualPlots" - Me.ucrChkIndividualPlots.Size = New System.Drawing.Size(113, 20) - Me.ucrChkIndividualPlots.TabIndex = 23 + Me.tbRegOptions.Controls.Add(Me.tbDisplay) + Me.tbRegOptions.Controls.Add(Me.tbGraphics) + Me.tbRegOptions.Controls.Add(Me.tbSave) + Me.tbRegOptions.Location = New System.Drawing.Point(2, 3) + Me.tbRegOptions.Name = "tbRegOptions" + Me.tbRegOptions.SelectedIndex = 0 + Me.tbRegOptions.Size = New System.Drawing.Size(321, 342) + Me.tbRegOptions.TabIndex = 0 ' - 'ucrChkMultiplePlots + 'tbSave ' - Me.ucrChkMultiplePlots.Checked = False - Me.ucrChkMultiplePlots.Location = New System.Drawing.Point(6, 7) - Me.ucrChkMultiplePlots.Name = "ucrChkMultiplePlots" - Me.ucrChkMultiplePlots.Size = New System.Drawing.Size(113, 20) - Me.ucrChkMultiplePlots.TabIndex = 22 + Me.tbSave.Controls.Add(Me.ucrSaveLeverageColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveStdResidualsColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveResidualsColumnName) + Me.tbSave.Controls.Add(Me.ucrSaveFittedColumnName) + Me.tbSave.Location = New System.Drawing.Point(4, 22) + Me.tbSave.Name = "tbSave" + Me.tbSave.Padding = New System.Windows.Forms.Padding(3) + Me.tbSave.Size = New System.Drawing.Size(313, 316) + Me.tbSave.TabIndex = 2 + Me.tbSave.Tag = "Save" + Me.tbSave.Text = "Save" + Me.tbSave.UseVisualStyleBackColor = True ' 'ucrSaveLeverageColumnName ' @@ -727,7 +727,7 @@ Partial Class sdgSimpleRegOptions Friend WithEvents lblGraphicsSignLevel As Label Friend WithEvents grpMultiplePlots As GroupBox Friend WithEvents tbDisplay As TabPage - Friend WithEvents lblDisplayCLevel As Label + Friend WithEvents lblConfLevel As Label Friend WithEvents chkPvalues As CheckBox Friend WithEvents tbRegOptions As TabControl Friend WithEvents tbSave As TabPage @@ -741,10 +741,10 @@ Partial Class sdgSimpleRegOptions Friend WithEvents tbResiduals As TabPage Friend WithEvents grpIndividualPlots As GroupBox Friend WithEvents ucrChkEstimates As ucrCheck - Friend WithEvents ucrChkDisplayCLimits As ucrCheck + Friend WithEvents ucrChkConfLimits As ucrCheck Friend WithEvents ucrChkANOVA As ucrCheck Friend WithEvents ucrChkModel As ucrCheck - Friend WithEvents ucrNudDisplayCLevel As ucrNud + Friend WithEvents ucrNudConfLevel As ucrNud Friend WithEvents ucrChkPvalues As ucrCheck Friend WithEvents ucrChkRugs As ucrCheck Friend WithEvents ucrChkJitter As ucrCheck diff --git a/instat/sdgSimpleRegOptions.vb b/instat/sdgSimpleRegOptions.vb index a3cd393cd8b..9bdb3e6b510 100644 --- a/instat/sdgSimpleRegOptions.vb +++ b/instat/sdgSimpleRegOptions.vb @@ -15,16 +15,21 @@ ' along with this program. If not, see . Imports instat Imports instat.Translations + Public Class sdgSimpleRegOptions Public clsRModelFunction As RFunction Public clsRDataFrame As ucrDataFrame Public clsRGraphicsOperator As ROperator Public clsRYVariable, clsRXVariable As String - Public clsRSummaryFunction, clsRanovaFunction, clsRConfint, clsRLmOrGLM As RFunction + Public clsRLmOrGLM As RFunction Public clsRGraphics As New RSyntax Private clsRSyntax As RSyntax - Public clsRaovFunction, clsRaovpvalFunction, clsRestpvalFunction, clsRResidualPlotsFunction, clsRgeom_point, clsRPredFunction, clsRDFFunction, clsRFittedValues, clsRWriteFitted, clsRResiduals, clsRWriteResiduals, clsRStdResiduals, clsRWriteStdResiduals, clsRLeverage, clsRWriteLeverage As New RFunction - Public clsRggplotFunction, clsRaesFunction, clsRStat_smooth, clsRModelsFunction, clsRCIFunction, clsR_ribbon, clsRaes_ribbon As New RFunction + Public clsRaovFunction, clsRaovpvalFunction, clsRestpvalFunction, clsAutoplot, clsRgeom_point, clsRPredFunction, clsRDFFunction, clsRFittedValues, clsRWriteFitted, clsRResiduals, clsRWriteResiduals, clsRStdResiduals, clsRWriteStdResiduals, clsRLeverage, clsRWriteLeverage As New RFunction + Public clsVisReg, clsRaesFunction, clsRStat_smooth, clsR_ribbon, clsRaes_ribbon As New RFunction + + 'Display tab functions + Public clsFormulaFunction, clsAnovaFunction, clsSummaryFunction, clsConfint As RFunction + Public bControlsInitialised As Boolean = False Private Sub sdgSimpleRegOptions_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -32,47 +37,73 @@ Public Class sdgSimpleRegOptions End Sub Private Sub InitialiseControls() + + 'Display tab controls + '########################################### ucrChkModel.SetText("Model") - ucrChkModel.AddFunctionNamesCondition(True, "formula") + ucrChkModel.AddRSyntaxContainsFunctionNamesCondition(True, {"formula"}, True) + ucrChkModel.AddRSyntaxContainsFunctionNamesCondition(False, {"formula"}, False) ucrChkANOVA.SetText("ANOVA") - ucrChkANOVA.AddFunctionNamesCondition(True, "anova") + ucrChkANOVA.AddRSyntaxContainsFunctionNamesCondition(True, {"anova"}, True) + ucrChkANOVA.AddRSyntaxContainsFunctionNamesCondition(False, {"anova"}, False) + ucrChkANOVA.AddToLinkedControls(ucrChkPvalues, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True) + + 'To display p values with anova table + 'temp disabled until implemented + ucrChkPvalues.SetText("Include P-Values") + ucrChkPvalues.Enabled = False + ucrChkPvalues.Checked = True ucrChkEstimates.SetText("Estimates") - ucrChkEstimates.AddFunctionNamesCondition(True, "summary") + ucrChkEstimates.AddRSyntaxContainsFunctionNamesCondition(True, {"summary"}, True) + ucrChkEstimates.AddRSyntaxContainsFunctionNamesCondition(False, {"summary"}, False) - ucrChkDisplayCLimits.SetText("Confidence Limits") - ucrChkDisplayCLimits.AddFunctionNamesCondition(True, "confint") + ucrChkConfLimits.SetText("Confidence Limits") + ucrChkConfLimits.AddRSyntaxContainsFunctionNamesCondition(True, {"confint"}, True) + ucrChkConfLimits.AddRSyntaxContainsFunctionNamesCondition(False, {"confint"}, False) + ucrChkConfLimits.AddToLinkedControls(ucrNudConfLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ucrChkPvalues.SetText("P-Values") - ucrChkPvalues.AddFunctionNamesCondition(True, "anova") + ucrNudConfLevel.SetParameter(New RParameter("level")) + ucrNudConfLevel.DecimalPlaces = 2 + ucrNudConfLevel.Increment = 0.01 + ucrNudConfLevel.SetMinMax(0, 1) + ucrNudConfLevel.SetLinkedDisplayControl(lblConfLevel) + ucrNudConfLevel.SetRDefault(0.95) - ucrChkPvalues.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) + 'Graphics tab control + '########################################### - ucrNudDisplayCLevel.SetParameter(New RParameter("level")) - ucrNudDisplayCLevel.DecimalPlaces = 2 - ucrNudDisplayCLevel.Increment = 0.01 - ucrNudDisplayCLevel.SetMinMax(0, 1) + 'Fitting Models Plots (Visreg) + ucrChkFittedModel.SetText("Fitted Model") + ucrChkFittedModel.AddRSyntaxContainsFunctionNamesCondition(True, {"visreg"}, True) + ucrChkFittedModel.AddRSyntaxContainsFunctionNamesCondition(False, {"visreg"}, False) + ucrChkFittedModel.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrChkPartial, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrChkRugs, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrPnlPlotType, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrChkFittedModel.AddToLinkedControls(ucrPnlScale, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkDisplayCLimits.AddParameterPresentCondition(False, "level") - ucrChkDisplayCLimits.AddToLinkedControls(ucrNudDisplayCLevel, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedHideIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=0.95) - ucrNudDisplayCLevel.SetLinkedDisplayControl(lblDisplayCLevel) + 'Multiple plots + ucrChkMultiplePlots.SetText("Multiple Plots") + ucrChkMultiplePlots.AddRSyntaxContainsFunctionNamesCondition(True, {"autoplot"}, True) + ucrChkMultiplePlots.AddRSyntaxContainsFunctionNamesCondition(False, {"autoplot"}, False) + ucrChkMultiplePlots.AddToLinkedControls(ucrPnlMutiplePlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoFourPlots) - 'Multiple Plots (Autoplot function) ucrPnlMutiplePlots.AddRadioButton(rdoFourPlots) ucrPnlMutiplePlots.AddRadioButton(rdoSixPlots2Rows) ucrPnlMutiplePlots.AddRadioButton(rdoSixPlots3Rows) - ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoFourPlots, {"autoplot"}) - ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoSixPlots2Rows, {"autoplot"}) - ucrPnlMutiplePlots.AddRSyntaxContainsFunctionNamesCondition(rdoSixPlots3Rows, {"autoplot"}) - ucrChkMultiplePlots.Enabled = False - ucrChkMultiplePlots.AddFunctionNamesCondition(False, "autoplot", False) - 'ucrChkMultiplePlots.AddFunctionNamesCondition(True, "autoplot") - ucrChkMultiplePlots.SetText("Multiple Plots") - ucrChkMultiplePlots.AddToLinkedControls(ucrPnlMutiplePlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoFourPlots) - ' ucrPnlMutiplePlots.SetLinkedDisplayControl(grpMultiplePlots) + ucrPnlMutiplePlots.AddParameterValuesCondition(rdoFourPlots, "ncol", "2") + ucrPnlMutiplePlots.AddParameterPresentCondition(rdoFourPlots, "which", False) + + ucrPnlMutiplePlots.AddParameterValuesCondition(rdoSixPlots2Rows, "ncol", "3") + ucrPnlMutiplePlots.AddParameterValuesCondition(rdoSixPlots2Rows, "which", "1:6") + + ucrPnlMutiplePlots.AddParameterValuesCondition(rdoSixPlots3Rows, "ncol", "2") + ucrPnlMutiplePlots.AddParameterValuesCondition(rdoSixPlots3Rows, "which", "1:6") 'Individual Plots (Autoplot function) ucrPnlIndividualPlots.AddRadioButton(rdoResidualsFitted) @@ -81,12 +112,6 @@ Public Class sdgSimpleRegOptions ucrPnlIndividualPlots.AddRadioButton(rdoScaleLocation) ucrPnlIndividualPlots.AddRadioButton(rdoCooksDistanceLeverage) ucrPnlIndividualPlots.AddRadioButton(rdoCooksDistance) - ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoResidualsFitted, {"autoplot"}) - ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoQQ, {"autoplot"}) - ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoResidualsLeverage, {"autoplot"}) - ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoScaleLocation, {"autoplot"}) - ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoCooksDistanceLeverage, {"autoplot"}) - ucrPnlIndividualPlots.AddRSyntaxContainsFunctionNamesCondition(rdoCooksDistance, {"autoplot"}) ucrChkIndividualPlots.Enabled = False ucrChkIndividualPlots.AddFunctionNamesCondition(False, "autoplot", False) @@ -95,21 +120,16 @@ Public Class sdgSimpleRegOptions ucrChkIndividualPlots.AddToLinkedControls(ucrPnlIndividualPlots, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoResidualsFitted) 'ucrPnlIndividualPlots.SetLinkedDisplayControl(grpIndividualPlots) - 'Fitting Models Plots (Visreg) - ucrChkFittedModel.SetText("Fitted Model") - ucrChkFittedModel.AddFunctionNamesCondition(False, "visreg", False) - ucrChkFittedModel.AddFunctionNamesCondition(True, "visreg") ''type ucrPnlPlotType.SetParameter(New RParameter("type")) ucrPnlPlotType.AddRadioButton(rdoConditional, Chr(34) & "conditional" & Chr(34)) ucrPnlPlotType.AddRadioButton(rdoContrast, Chr(34) & "contrast" & Chr(34)) - ucrChkFittedModel.AddToLinkedControls(ucrPnlPlotType, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) + ucrPnlPlotType.SetRDefault(Chr(34) & "conditional" & Chr(34)) ''scale ucrPnlScale.SetParameter(New RParameter("scale")) ucrPnlScale.AddRadioButton(rdoLinear, Chr(34) & "linear" & Chr(34)) ucrPnlScale.AddRadioButton(rdoResponse, Chr(34) & "response" & Chr(34)) - ucrChkFittedModel.AddToLinkedControls(ucrPnlScale, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrPnlScale.SetRDefault(Chr(34) & "linear" & Chr(34)) ucrChkRugs.SetText("Rugs") @@ -125,12 +145,7 @@ Public Class sdgSimpleRegOptions ucrNudWhiteSpace.SetMinMax(0, 1) ucrNudWhiteSpace.SetRDefault(0.2) - ucrChkFittedModel.AddToLinkedControls(ucrNudWhiteSpace, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkFittedModel.AddToLinkedControls(ucrChkPartial, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkFittedModel.AddToLinkedControls(ucrChkRugs, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkRugs.AddToLinkedControls(ucrPnlPartial12, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True, bNewLinkedChangeToDefaultState:=True, objNewDefaultState:=rdoPartial) - ucrChkFittedModel.AddToLinkedControls(ucrChkJitter, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) - ucrChkFittedModel.AddToLinkedControls(ucrChkConfIntervalband, {True}, bNewLinkedAddRemoveParameter:=True, bNewLinkedDisabledIfParameterMissing:=True) ucrChkJitter.SetText("Jitter") ucrChkJitter.SetParameter(New RParameter("jitter"), bNewChangeParameterValue:=True, bNewAddRemoveParameter:=True, strNewValueIfChecked:="TRUE", strNewValueIfUnchecked:="FALSE") @@ -186,11 +201,21 @@ Public Class sdgSimpleRegOptions 'Optional clsNewRWriteLeverage As RFunction = Nothing, 'Optional strNewTempDataframe As String = Nothing, - Public Sub SetRCode(clsNewRSyntax As RSyntax, Optional clsNewRanovaFunction As RFunction = Nothing, Optional clsNewRSummaryFunction As RFunction = Nothing, Optional clsNewRConfint As RFunction = Nothing, Optional clsNewRggplotFunction As RFunction = Nothing, Optional clsNewRModelsFunction As RFunction = Nothing, Optional clsNewRaovpvalFunction As RFunction = Nothing, Optional clsNewRgeom_point As RFunction = Nothing, Optional clsNewRWriteResiduals As RFunction = Nothing, Optional clsNewRResidualPlots As RFunction = Nothing, Optional clsNewRestpvalFunction As RFunction = Nothing, Optional clsNewRWriteLeverage As RFunction = Nothing, Optional clsNewRWriteStdResiduals As RFunction = Nothing, Optional clsNewRLmOrGLM As RFunction = Nothing, Optional clsNewRModelFunction As RFunction = Nothing, Optional clsNewRXVariable As String = Nothing, Optional clsNewRYVariable As String = Nothing, Optional clsNewRWriteFitted As RFunction = Nothing, Optional clsNewRFittedValues As RFunction = Nothing, Optional clsNewRGraphicsOperator As ROperator = Nothing, Optional bReset As Boolean = False) + Public Sub SetRCode(clsNewRSyntax As RSyntax, Optional clsNewFormulaFunction As RFunction = Nothing, Optional clsNewAnovaFunction As RFunction = Nothing, Optional clsNewRSummaryFunction As RFunction = Nothing, Optional clsNewConfint As RFunction = Nothing, Optional clsNewVisReg As RFunction = Nothing, Optional clsNewRaovpvalFunction As RFunction = Nothing, Optional clsNewRgeom_point As RFunction = Nothing, Optional clsNewRWriteResiduals As RFunction = Nothing, Optional clsNewAutoplot As RFunction = Nothing, Optional clsNewRestpvalFunction As RFunction = Nothing, Optional clsNewRWriteLeverage As RFunction = Nothing, Optional clsNewRWriteStdResiduals As RFunction = Nothing, Optional clsNewRLmOrGLM As RFunction = Nothing, Optional clsNewRModelFunction As RFunction = Nothing, Optional clsNewRXVariable As String = Nothing, Optional clsNewRYVariable As String = Nothing, Optional clsNewRWriteFitted As RFunction = Nothing, Optional clsNewRFittedValues As RFunction = Nothing, Optional clsNewRGraphicsOperator As ROperator = Nothing, Optional bReset As Boolean = False) If Not bControlsInitialised Then InitialiseControls() End If clsRSyntax = clsNewRSyntax + + 'Display functions + clsAnovaFunction = clsNewAnovaFunction + clsFormulaFunction = clsNewFormulaFunction + clsSummaryFunction = clsNewRSummaryFunction + clsConfint = clsNewConfint + + 'Graph functions + clsVisReg = clsNewVisReg + clsRGraphicsOperator = clsNewRGraphicsOperator clsRLmOrGLM = clsNewRLmOrGLM clsRestpvalFunction = clsNewRestpvalFunction @@ -200,37 +225,33 @@ Public Class sdgSimpleRegOptions 'clsRWriteFitted = clsNewRWriteFitted clsRFittedValues = clsNewRFittedValues clsRaovpvalFunction = clsNewRaovpvalFunction - clsRModelsFunction = clsNewRModelsFunction - clsRSummaryFunction = clsNewRSummaryFunction - clsRConfint = clsNewRConfint - clsRanovaFunction = clsNewRanovaFunction clsRgeom_point = clsNewRgeom_point - clsRResidualPlotsFunction = clsNewRResidualPlots - clsRggplotFunction = clsNewRggplotFunction + clsAutoplot = clsNewAutoplot 'clsRWriteResiduals = clsNewRWriteResiduals ' clsRWriteStdResiduals = clsNewRWriteStdResiduals 'clsRWriteLeverage = clsNewRWriteLeverage - - ucrChkModel.SetRCode(clsRModelsFunction, bReset) - ucrChkEstimates.SetRCode(clsRSummaryFunction, bReset) - ucrChkANOVA.SetRCode(clsRanovaFunction, bReset) - ucrChkDisplayCLimits.SetRCode(clsRCIFunction, bReset) - ucrNudDisplayCLevel.SetRCode(clsRCIFunction, bReset) - ucrChkPvalues.SetRCode(clsRestpvalFunction, bReset) - ucrPnlScale.SetRCode(clsRggplotFunction, bReset) - ucrPnlPlotType.SetRCode(clsRggplotFunction, bReset) - ucrChkJitter.SetRCode(clsRggplotFunction, bReset) - ucrNudGraphicsCLevel.SetRCode(clsRggplotFunction, bReset) - ucrNudWhiteSpace.SetRCode(clsRggplotFunction, bReset) - ucrChkPartial.SetRCode(clsRggplotFunction, bReset) - ucrChkConfIntervalband.SetRCode(clsRggplotFunction, bReset) - ucrPnlPartial12.SetRCode(clsRggplotFunction, bReset) - ucrChkIndividualPlots.SetRCode(clsRResidualPlotsFunction, bReset) - ucrPnlIndividualPlots.SetRCode(clsRResidualPlotsFunction, bReset) - ucrChkMultiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) - ucrPnlMutiplePlots.SetRCode(clsRResidualPlotsFunction, bReset) - ucrChkFittedModel.SetRCode(clsRggplotFunction, bReset) + 'Display tab controls + ucrChkModel.SetRSyntax(clsRSyntax, bReset, bCloneIfNeeded:=True) + ucrChkANOVA.SetRSyntax(clsRSyntax, bReset, bCloneIfNeeded:=True) + ucrChkEstimates.SetRSyntax(clsRSyntax, bReset, bCloneIfNeeded:=True) + ucrChkConfLimits.SetRSyntax(clsRSyntax, bReset, bCloneIfNeeded:=True) + ucrNudConfLevel.SetRCode(clsConfint, bReset) + ucrChkFittedModel.SetRSyntax(clsRSyntax, bReset, bCloneIfNeeded:=True) + + ucrPnlScale.SetRCode(clsVisReg, bReset) + ucrPnlPlotType.SetRCode(clsVisReg, bReset) + ucrChkJitter.SetRCode(clsVisReg, bReset) + ucrNudGraphicsCLevel.SetRCode(clsVisReg, bReset) + ucrNudWhiteSpace.SetRCode(clsVisReg, bReset) + ucrChkPartial.SetRCode(clsVisReg, bReset) + ucrChkConfIntervalband.SetRCode(clsVisReg, bReset) + ucrPnlPartial12.SetRCode(clsVisReg, bReset) + + ucrChkIndividualPlots.SetRCode(clsAutoplot, bReset) + ucrPnlIndividualPlots.SetRCode(clsAutoplot, bReset) + ucrChkMultiplePlots.SetRCode(clsAutoplot, bReset) + ucrPnlMutiplePlots.SetRCode(clsAutoplot, bReset) ucrSaveFittedColumnName.SetRCode(clsRWriteFitted, bReset) ucrSaveResidualsColumnName.SetRCode(clsRWriteResiduals, bReset) @@ -244,53 +265,51 @@ Public Class sdgSimpleRegOptions End Sub - Private Sub ucrChkANOVA_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkANOVA.ControlValueChanged - If ucrChkANOVA.Checked Then - clsRSyntax.AddToAfterCodes(clsRanovaFunction, iPosition:=0) + Private Sub ucrChkModel_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkModel.ControlValueChanged + If ucrChkModel.Checked Then + clsRSyntax.AddToAfterCodes(clsFormulaFunction, iPosition:=0) Else - clsRSyntax.RemoveFromAfterCodes(clsRanovaFunction) + clsRSyntax.RemoveFromAfterCodes(clsFormulaFunction) End If End Sub - Private Sub ucrChkEstimates_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkEstimates.ControlValueChanged - If ucrChkEstimates.Checked Then - clsRSyntax.AddToAfterCodes(clsRSummaryFunction, iPosition:=1) + Private Sub ucrChkANOVA_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkANOVA.ControlValueChanged + If ucrChkANOVA.Checked Then + clsRSyntax.AddToAfterCodes(clsAnovaFunction, iPosition:=1) Else - clsRSyntax.RemoveFromAfterCodes(clsRSummaryFunction) + clsRSyntax.RemoveFromAfterCodes(clsAnovaFunction) End If End Sub - - Private Sub ucrChkModel_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkModel.ControlValueChanged - If ucrChkModel.Checked Then - clsRSyntax.AddToAfterCodes(clsRModelsFunction, iPosition:=2) + Private Sub ucrChkEstimates_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkEstimates.ControlValueChanged + If ucrChkEstimates.Checked Then + clsRSyntax.AddToAfterCodes(clsSummaryFunction, iPosition:=2) Else - clsRSyntax.RemoveFromAfterCodes(clsRModelsFunction) + clsRSyntax.RemoveFromAfterCodes(clsSummaryFunction) End If End Sub - Private Sub ucrChkDisplayCLimits_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkDisplayCLimits.ControlValueChanged - If ucrChkDisplayCLimits.Checked Then - clsRSyntax.AddToAfterCodes(clsRConfint, iPosition:=4) + Private Sub ucrChkDisplayCLimits_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkConfLimits.ControlValueChanged + If ucrChkConfLimits.Checked Then + clsRSyntax.AddToAfterCodes(clsConfint, iPosition:=3) Else - clsRSyntax.RemoveFromAfterCodes(clsRConfint) + clsRSyntax.RemoveFromAfterCodes(clsConfint) End If End Sub - Private Sub ucrChkPvalues_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkPvalues.ControlValueChanged - If ucrChkPvalues.Checked Then - clsRSyntax.AddToAfterCodes(clsRestpvalFunction, iPosition:=5) + Private Sub ucrChkFittedModel_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkFittedModel.ControlValueChanged + If ucrChkFittedModel.Checked Then + clsRSyntax.AddToAfterCodes(clsVisReg, iPosition:=4) Else - clsRSyntax.RemoveFromAfterCodes(clsRestpvalFunction) + clsRSyntax.RemoveFromAfterCodes(clsVisReg) End If End Sub - Private Sub ucrChkFittedModel_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkFittedModel.ControlValueChanged - If ucrChkFittedModel.Checked Then - clsRggplotFunction.AddParameter("gg", "TRUE") - clsRSyntax.AddToAfterCodes(clsRggplotFunction, iPosition:=6) + Private Sub ucrChkMultiplePlots_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrChkMultiplePlots.ControlValueChanged + If ucrChkMultiplePlots.Checked Then + clsRSyntax.AddToAfterCodes(clsAutoplot, iPosition:=4) Else - clsRSyntax.RemoveFromAfterCodes(clsRggplotFunction) + clsRSyntax.RemoveFromAfterCodes(clsAutoplot) End If End Sub @@ -299,95 +318,95 @@ Public Class sdgSimpleRegOptions End Sub Private Sub ucrPnlMutiplePlots_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrPnlMutiplePlots.ControlValueChanged, ucrPnlIndividualPlots.ControlValueChanged - 'Multiple Plots - If ucrChkMultiplePlots.Checked Then - If rdoFourPlots.Checked Then - clsRResidualPlotsFunction.AddParameter("ncol", 2) - clsRResidualPlotsFunction.RemoveParameterByName("which") - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - ElseIf rdoSixPlots2Rows.Checked Then - clsRResidualPlotsFunction.AddParameter("ncol", 3) - clsRResidualPlotsFunction.AddParameter("which", "1:6") - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - ElseIf rdoSixPlots3Rows.Checked Then - clsRResidualPlotsFunction.AddParameter("ncol", 2) - clsRResidualPlotsFunction.AddParameter("which", "1:6") - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - End If - If (rdoFourPlots.Checked OrElse rdoSixPlots2Rows.Checked OrElse rdoSixPlots3Rows.Checked) Then - clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) - End If - End If - 'Individual Plots - If ucrChkIndividualPlots.Checked Then - If rdoQQ.Checked Then - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 2) - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - ElseIf rdoResidualsFitted.Checked Then - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 1) - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) - ElseIf rdoResidualsLeverage.Checked Then - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 5) - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - ElseIf rdoCooksDistanceLeverage.Checked Then - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 6) - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - ElseIf rdoCooksDistance.Checked Then - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 4) - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - ElseIf rdoScaleLocation.Checked Then - clsRResidualPlotsFunction.RemoveParameterByName("ncol") - clsRResidualPlotsFunction.AddParameter("which", 3) - clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsRResidualPlotsFunction, iPosition:=0) - End If - If (rdoResidualsFitted.Checked OrElse rdoQQ.Checked OrElse rdoResidualsLeverage.Checked OrElse rdoScaleLocation.Checked OrElse rdoCooksDistance.Checked OrElse rdoCooksDistanceLeverage.Checked) Then - clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=7) - End If - End If + ''Multiple Plots + 'If ucrChkMultiplePlots.Checked Then + ' If rdoFourPlots.Checked Then + ' clsAutoplot.AddParameter("ncol", 2) + ' clsAutoplot.RemoveParameterByName("which") + ' clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsAutoplot, iPosition:=0) + ' ElseIf rdoSixPlots2Rows.Checked Then + ' clsAutoplot.AddParameter("ncol", 3) + ' clsAutoplot.AddParameter("which", "1:6") + ' clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsAutoplot, iPosition:=0) + ' ElseIf rdoSixPlots3Rows.Checked Then + ' clsAutoplot.AddParameter("ncol", 2) + ' clsAutoplot.AddParameter("which", "1:6") + ' clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsAutoplot, iPosition:=0) + ' End If + ' If (rdoFourPlots.Checked OrElse rdoSixPlots2Rows.Checked OrElse rdoSixPlots3Rows.Checked) Then + ' clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=6) + ' End If + 'End If + ''Individual Plots + 'If ucrChkIndividualPlots.Checked Then + ' If rdoQQ.Checked Then + ' clsAutoplot.RemoveParameterByName("ncol") + ' clsAutoplot.AddParameter("which", 2) + ' clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsAutoplot, iPosition:=0) + ' ElseIf rdoResidualsFitted.Checked Then + ' clsAutoplot.RemoveParameterByName("ncol") + ' clsAutoplot.AddParameter("which", 1) + ' clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsAutoplot, iPosition:=0) + ' clsRGraphics.SetOperatorParameter(False, clsRFunc:=clsRgeom_point) + ' ElseIf rdoResidualsLeverage.Checked Then + ' clsAutoplot.RemoveParameterByName("ncol") + ' clsAutoplot.AddParameter("which", 5) + ' clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsAutoplot, iPosition:=0) + ' ElseIf rdoCooksDistanceLeverage.Checked Then + ' clsAutoplot.RemoveParameterByName("ncol") + ' clsAutoplot.AddParameter("which", 6) + ' clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsAutoplot, iPosition:=0) + ' ElseIf rdoCooksDistance.Checked Then + ' clsAutoplot.RemoveParameterByName("ncol") + ' clsAutoplot.AddParameter("which", 4) + ' clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsAutoplot, iPosition:=0) + ' ElseIf rdoScaleLocation.Checked Then + ' clsAutoplot.RemoveParameterByName("ncol") + ' clsAutoplot.AddParameter("which", 3) + ' clsRGraphicsOperator.AddParameter("reidual", clsRFunctionParameter:=clsAutoplot, iPosition:=0) + ' End If + ' If (rdoResidualsFitted.Checked OrElse rdoQQ.Checked OrElse rdoResidualsLeverage.Checked OrElse rdoScaleLocation.Checked OrElse rdoCooksDistance.Checked OrElse rdoCooksDistanceLeverage.Checked) Then + ' clsRSyntax.AddToAfterCodes(clsRGraphicsOperator, iPosition:=7) + ' End If + 'End If End Sub Private Sub ucrSaveFittedColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveFittedColumnName.ControlValueChanged - clsRFittedValues.SetPackageName("stats") - clsRFittedValues.SetRCommand("fitted") - clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) - clsRSyntax.AddToAfterCodes(clsRWriteFitted, iPosition:=8) + 'clsRFittedValues.SetPackageName("stats") + 'clsRFittedValues.SetRCommand("fitted") + 'clsRFittedValues.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + 'clsRWriteFitted.AddParameter("col_data", clsRFunctionParameter:=clsRFittedValues) + 'clsRSyntax.AddToAfterCodes(clsRWriteFitted, iPosition:=8) End Sub Private Sub ucrSaveResidualsColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveResidualsColumnName.ControlValueChanged - clsRResiduals.SetPackageName("stats") - clsRResiduals.SetRCommand("resid") - clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) - clsRSyntax.AddToAfterCodes(clsRWriteResiduals, iPosition:=9) + 'clsRResiduals.SetPackageName("stats") + 'clsRResiduals.SetRCommand("resid") + 'clsRResiduals.AddParameter("object", clsRFunctionParameter:=clsRLmOrGLM) + 'clsRWriteResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRResiduals) + 'clsRSyntax.AddToAfterCodes(clsRWriteResiduals, iPosition:=9) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) End Sub Private Sub ucrSaveStdResidualsColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveStdResidualsColumnName.ControlValueChanged - clsRStdResiduals.SetPackageName("stats") - clsRStdResiduals.SetRCommand("rstandard") - clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) - clsRSyntax.AddToAfterCodes(clsRWriteStdResiduals, iPosition:=10) + 'clsRStdResiduals.SetPackageName("stats") + 'clsRStdResiduals.SetRCommand("rstandard") + 'clsRStdResiduals.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) + 'clsRWriteStdResiduals.AddParameter("col_data", clsRFunctionParameter:=clsRStdResiduals) + 'clsRSyntax.AddToAfterCodes(clsRWriteStdResiduals, iPosition:=10) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) ' clsRSyntax.RemoveFromAfterCodes(clsRWriteLeverage) End Sub Private Sub ucrSaveLeverageColumnName_ControlValueChanged(ucrChangedControl As ucrCore) Handles ucrSaveLeverageColumnName.ControlValueChanged - clsRLeverage.SetPackageName("stats") - clsRLeverage.SetRCommand("hatvalues") - clsRLeverage.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) - clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) - clsRSyntax.AddToAfterCodes(clsRWriteLeverage, iPosition:=11) + 'clsRLeverage.SetPackageName("stats") + 'clsRLeverage.SetRCommand("hatvalues") + 'clsRLeverage.AddParameter("model", clsRFunctionParameter:=clsRLmOrGLM) + 'clsRWriteLeverage.AddParameter("col_data", clsRFunctionParameter:=clsRLeverage) + 'clsRSyntax.AddToAfterCodes(clsRWriteLeverage, iPosition:=11) 'clsRSyntax.RemoveFromAfterCodes(clsRWriteStdResiduals) 'clsRSyntax.RemoveFromAfterCodes(clsRWriteResiduals) 'clsRSyntax.RemoveFromAfterCodes(clsRWriteFitted) diff --git a/instat/ucrCore.vb b/instat/ucrCore.vb index 65f10c2a314..ec6ccc12991 100644 --- a/instat/ucrCore.vb +++ b/instat/ucrCore.vb @@ -240,14 +240,14 @@ Public Class ucrCore 'TODO in future may want to set RCode and RSyntax together if both needed for conditions ' then would need method to add both at the same time - Public Overridable Sub SetRSyntax(clsNewRSyntax As RSyntax, Optional bReset As Boolean = False) + Public Overridable Sub SetRSyntax(clsNewRSyntax As RSyntax, Optional bReset As Boolean = False, Optional bCloneIfNeeded As Boolean = False) If clsRSyntax Is Nothing OrElse Not clsRSyntax.Equals(clsNewRSyntax) Then clsRSyntax = clsNewRSyntax If bUpdateRCodeFromControl AndAlso CanUpdate() Then UpdateRCode(bReset) End If End If - UpdateControl(bReset) + UpdateControl(bReset, bCloneIfNeeded:=bCloneIfNeeded) End Sub Protected Overridable Function CanUpdate()