using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using VEPROMS.CSLA.Library; using DevComponents.DotNetBar; using DevComponents.DotNetBar.Controls; using System.Drawing.Imaging; using VEPROMS.Properties; using DescriptiveEnum; using Volian.Controls.Library; namespace VEPROMS { public partial class frmFolderProperties : DevComponents.DotNetBar.Office2007Form { private bool _Initializing = false; private readonly FolderConfig _FolderConfig; private readonly bool _IsVepromsNode = false; private readonly bool _IsDefaultSettingNode = false; private string _DefaultFormatName = null; private string _DefaultChgBarType = null; private string _DefaultChgBarLoc = null; private string _DefaultChgBarText = null; private string _DefaultChgBarUsrMsg1 = null; private string _DefaultChgBarUsrMsg2 = null; private string _DefaultROGraficFileExtension = null; private string _DefaultWatermark = null; private string _DefaultFormatColumns = null; private bool _ValidateTextBox = true; public frmFolderProperties(FolderConfig folderConfig) { _FolderConfig = folderConfig; _IsVepromsNode = !folderConfig.HasParent; // top tree node does not have a parent if (!_IsVepromsNode) _IsDefaultSettingNode = _FolderConfig.MyFolder.MyParent.MyParent == null; _Initializing = true; InitializeComponent(); btnGeneral.PerformClick(); // always start with General tab or button _Initializing = false; // Build window caption Text = $"{folderConfig.Name} Properties"; if (_IsDefaultSettingNode) { // Change these labels for the first node after the VE-PROMS node. ppLblDefSettingsInfo.Text = "* Default Proms settings are shown in italics"; ppCbShwDefSettings.Text = "Show Default Proms Settings"; } } /// /// Use the ParentLookup to grab the default values /// - set the watermark property (where applicable) of the control with that value /// - set the default setting labels with that value /// ** the default setting labels appear when the Show Default Values checkbox is checked by the user. /// private void FindDefaultValues() { _FolderConfig.ParentLookup = true; // Get the default format name _DefaultFormatName = _FolderConfig.DefaultFormatSelection; SetupDefault(_DefaultFormatName, ppLblFormatDefault, ppCmbxFormat); // Get the default Change Bar Type _DefaultChgBarType = _FolderConfig.Print_ChangeBar.ToString(); SetupDefault(EnumDescConverter.GetEnumDescription(_FolderConfig.Print_ChangeBar), ppLblChangeBarTypeDefault, ppCmbxChangeBarType); // Get the default Change Bar Location _DefaultChgBarLoc = _FolderConfig.Print_ChangeBarLoc.ToString(); SetupDefault(EnumDescConverter.GetEnumDescription(_FolderConfig.Print_ChangeBarLoc), ppLblChgBarPosDefault, ppCmbxChgBarPos); // Get the default Change Bar text _DefaultChgBarText = _FolderConfig.Print_ChangeBarText.ToString(); SetupDefault(EnumDescConverter.GetEnumDescription(_FolderConfig.Print_ChangeBarText), ppLblChgBarTxtTypeDefault, ppCmbxChgBarTxtType); // Get the default User Change Bar Message 1 _DefaultChgBarUsrMsg1 = _FolderConfig.Print_UserCBMess1; if (!(_DefaultChgBarUsrMsg1.Equals(""))) ppLblChgBarUserMsgOneDefault.Text = string.Format("({0})", _DefaultChgBarUsrMsg1); // Get the default User Change Bar Message 2 _DefaultChgBarUsrMsg2 = _FolderConfig.Print_UserCBMess2; if (!(_DefaultChgBarUsrMsg2.Equals(""))) ppLblChgBarUserMsgTwoDefault.Text = string.Format("({0})", _DefaultChgBarUsrMsg2); // Get the default RO Graphic file extension _DefaultROGraficFileExtension = _FolderConfig.Graphics_defaultext; // if no graphic file extension was saved, use Tif if (_DefaultROGraficFileExtension.Equals("")) { ppCmbxGrphFileExt.SelectedIndex = 5; _DefaultROGraficFileExtension = ppCmbxGrphFileExt.Text; } SetupDefault(_DefaultROGraficFileExtension, ppLblGrphFileExtDefault, ppCmbxGrphFileExt); // Get the default Watermark _DefaultWatermark = _FolderConfig.Print_Watermark.ToString(); SetupDefault(EnumDescConverter.GetEnumDescription(_FolderConfig.Print_Watermark), ppLblWatermarkDefault, ppCmbxWatermark); // Get the default Format Columns _DefaultFormatColumns = _FolderConfig.Format_Columns.ToString(); SetupDefault(EnumDescConverter.GetEnumDescription(_FolderConfig.Format_Columns), ppLblStpEditorColsDefault, ppCmbxStpEditorCols); _FolderConfig.ParentLookup = false; } private AnnotationTypeInfoList myAnnotationTypeInfoList = null; private LocalAnnotationTypeInfoList myLocalAnnotationTypeInfoList = null; private StageInfoList myStageInfoList = null; private LocalStageInfoList myLocalStageInfoList = null; private void frmFolderProperties_Load(object sender, EventArgs e) { _Initializing = true; imageCodecInfoBindingSource.DataSource = ImageCodecInfo.GetImageDecoders(); folderConfigBindingSource.DataSource = _FolderConfig; ppCmbxFormat.DataSource = null; ppCmbxFormat.DisplayMember = "FullName"; ppCmbxFormat.ValueMember = "FullName"; ppCmbxFormat.DataSource = FormatUtility.GetFilteredFormatList(FormatInfoList.SortedFormatInfoList); if (_FolderConfig.FormatSelection != null) { ppCmbxFormat.SelectedValue = _FolderConfig.FormatSelection; ppBtnDefaultFmt.Visible = true; //bug fix B2016-102 make the default button visable if other the the default format is being used } else ppCmbxFormat.SelectedIndex = -1; // default format // Get the saved settings for this user // // This setting tells us if we should display the default values on this property page ppCbShwDefSettings.Checked = !_IsVepromsNode && Settings.Default["ShowDefaultFolderProp"] != null && Settings.Default.ShowDefaultFolderProp; // Get the User's property page style "PropPageStyle" (this is a system wide user setting) // 1 - Button Dialog (default) // 2 - Tab Dialog if ((int)Settings.Default["PropPageStyle"] == (int)PropPgStyle.Tab) { tcFolder.TabsVisible = true; panButtons.Visible = false; Width -= panButtons.Width; } // Get the default values for the property page information FindDefaultValues(); // Setup as to which "tabs" to display on the property page // - the first (top) tree node shows different "tabs" than the // other folder type of tree nodes if (_IsVepromsNode) //(!_FolderConfig.HasParent) { // if we are at the top node of the tree, remove the Folder Property page tabs // that do not pertain to this level (top of tree) tcFolder.Tabs.Remove(tiOutputSettings); tcFolder.Tabs.Remove(tiEditSettings); // for format settings, include it if the top node's format is NOT the base, i.e. formatid != 1. // this is done so that PROMS EXPRESS folder specific info can be displayed/used for the top // node of the tree. The formatid for the top folder for PROMS EXPRESS databases must be // set manually to the PROMS EXPRESS format. if (_FolderConfig.MyFolder.MyFormat.FormatID == 1) { tcFolder.Tabs.Remove(tiFmtSettings); btnFormatSettings.Visible = false; } btnOutputSettings.Visible = false; btnEdSettings.Visible = false; ppLblDefSettingsInfo.Visible = false; ppCbShwDefSettings.Visible = false; // hide check box for showing default values for top node ppCbShwDefSettings.Checked = false; // FOR NOW, don't show Start Message tab // TODO: later on, not needed for initial release. tcFolder.Tabs.Remove(tiStMsg); btnStMsg.Visible = false; // Also, for the referenced object tab, the top node (veproms system level) should // allow setting of the default graphics file extension. No other folder level allows this. ppCmbxGrphFileExt.Visible = true; ppLblGrphFileExtDefault.Visible = false; // true; lblGrphFileExt.Visible = true; ppBtnDefaultGrphFileExt.Visible = false; // true; myStageInfoList = StageInfoList.Get(); lbRevisionStages.DataSource = myLocalStageInfoList = new LocalStageInfoList(myStageInfoList); lbRevisionStages.DisplayMember = "Name"; myAnnotationTypeInfoList = AnnotationTypeInfoList.Get(); lbAnnotationTypes.DataSource = myLocalAnnotationTypeInfoList = new LocalAnnotationTypeInfoList(myAnnotationTypeInfoList); lbAnnotationTypes.DisplayMember = "Name"; // make visible the text box to allow the user to change the Procedure Panel's heading (title) on the panel bar ppRTxtHeading.Visible = true; lblHeading.Visible = true; tbSqlTimeout.Text = _FolderConfig.Timeout; tbSqlTimeout.Visible = true; lblSqlTimeout.Visible = true; lblSqlTimeoutDefault.Visible = true; cbIncTranCvtPerm.Visible = true; cbIncTranCvtPerm.Checked = _FolderConfig.General_IncTranCvtPerm; // C2020-033: defaults to does not have permission lblIncTrans.Visible = true; } else { // don't show Start Message or ref obj tab if not at top level tcFolder.Tabs.Remove(tiStMsg); tcFolder.Tabs.Remove(tiRefObj); tcFolder.Tabs.Remove(tiAnnoTypes); tcFolder.Tabs.Remove(tiRevisionStages); btnStMsg.Visible = false; btnRefObjs.Visible = false; btnAnnoTypes.Visible = false; btnRevisionStages.Visible = false; cbIncTranCvtPerm.Visible = false; lblIncTrans.Visible = false; // Assign the data sources to the combo boxes ppCmbxChangeBarType.DataSource = EnumDetail.Details(); ppCmbxChangeBarType.DisplayMember = "Name"; ppCmbxChangeBarType.ValueMember = "EValue"; ppCmbxChangeBarType.SelectedValue = -1; ppCmbxChgBarPos.DataSource = EnumDetail.Details(); ppCmbxChgBarPos.DisplayMember = "Name"; ppCmbxChgBarPos.ValueMember = "EValue"; ppCmbxChgBarPos.SelectedValue = -1; ppCmbxChgBarTxtType.DataSource = EnumDetail.Details(); ppCmbxChgBarTxtType.DisplayMember = "Name"; ppCmbxChgBarTxtType.ValueMember = "EValue"; ppCmbxChgBarTxtType.SelectedValue = -1; ppCmbxWatermark.DataSource = EnumDetail.Details(); ppCmbxWatermark.DisplayMember = "Name"; ppCmbxWatermark.ValueMember = "EValue"; ppCmbxWatermark.SelectedValue = -1; ppCmbxStpEditorCols.DataSource = EnumDetail.Details(); ppCmbxStpEditorCols.DisplayMember = "Name"; ppCmbxStpEditorCols.ValueMember = "EValue"; ppCmbxStpEditorCols.SelectedValue = -1; ppCbShwDefSettings.Visible = true; // display check box for showing default values // Also, for the referenced object tab, the top node (veproms system level) should // allow setting of the default graphics file extension. No other folder level allows this. ppCmbxGrphFileExt.Visible = false; ppLblGrphFileExtDefault.Visible = false; lblGrphFileExt.Visible = false; // HIDE the text box that allows the user to change the Procedure Panel's heading (title) on the panel bar ppRTxtHeading.Visible = false; lblHeading.Visible = false; tbSqlTimeout.Visible = false; lblSqlTimeout.Visible = false; lblSqlTimeoutDefault.Visible = false; } _Initializing = false; } private void ppBtnCancel_Click(object sender, EventArgs e) { folderConfigBindingSource.CancelEdit(); DialogResult = DialogResult.Cancel; Close(); } private void ppBtnCancel_MouseEnter(object sender, EventArgs e) => _ValidateTextBox = false; private void ppBtnCancel_MouseLeave(object sender, EventArgs e) => _ValidateTextBox = true; private void ppBtnOK_Click(object sender, EventArgs e) { if (btnRevisoinStageUndo.Enabled) btnRevisoinStageUndo.PerformClick(); if (btnAnnoTypeUndo.Enabled) btnAnnoTypeUndo.PerformClick(); folderConfigBindingSource.EndEdit(); // Save Default settings for User // // Save whether we should display the default values on this property page Settings.Default.ShowDefaultFolderProp = ppCbShwDefSettings.Checked; Settings.Default.Save(); _FolderConfig.Timeout = tbSqlTimeout.Text; // C2020-033: Handling of external transitions - let admin decide who can convert transitions to text if (_FolderConfig.MyFolder.FolderID == 1)_FolderConfig.General_IncTranCvtPerm = cbIncTranCvtPerm.Checked; // only do top folder _FolderConfig.MyFolder.Config = _FolderConfig.ToString(); _FolderConfig.MyFolder.Save().Dispose(); SaveApprStages(); SaveAnnotationTypes(); DialogResult = DialogResult.OK; Close(); } private void SaveApprStages() { if (myStageInfoList == null) return; foreach (StageInfo si in myStageInfoList)// spin through old list (database) { LocalStageInfo found = null; foreach (LocalStageInfo lsi in myLocalStageInfoList)// find match in new list if (si.StageID == lsi.ID) found = lsi; if (found != null) { if (found.Name != si.Name || found.IsApproved != si.IsApproved)// if different then save changes { using (Stage stg = si.Get()) { stg.Name = found.Name; stg.IsApproved = found.IsApproved; stg.UserID = Volian.Base.Library.VlnSettings.UserID; stg.DTS = DateTime.Now; stg.Save(); } } myLocalStageInfoList.Remove(found); } else// if missing then delete { using (Stage stg = si.Get()) { stg.Delete(); stg.Save(); } } } // Add remaining as new foreach (LocalStageInfo lsi in myLocalStageInfoList) { using (Stage stg = Stage.MakeStage(lsi.Name, "", lsi.IsApproved, DateTime.Now, Volian.Base.Library.VlnSettings.UserID)) stg.Save(); } StageInfoList.Refresh(); } private void SaveAnnotationTypes() { if (myAnnotationTypeInfoList == null) return; foreach (AnnotationTypeInfo ai in myAnnotationTypeInfoList) //spin through old list (database) { LocalAnnotationTypeInfo found = null; AnnotationTypeConfig oldAtc = new AnnotationTypeConfig(ai.Config); foreach(LocalAnnotationTypeInfo lai in myLocalAnnotationTypeInfoList) // find match in new list if (ai.TypeID == lai.TypeID ) found = lai; if (found != null) { if (found.Name != ai.Name || oldAtc.PrintableText_XLocation != found.PrntLoc)// if different then save changes { using (AnnotationType at = ai.Get()) { at.Name = found.Name; at.UserID = Volian.Base.Library.VlnSettings.UserID; AnnotationTypeConfig newAtc = new AnnotationTypeConfig { PrintableText_XLocation = found.PrntLoc }; at.Config = newAtc.ToString(); at.DTS = DateTime.Now; at.Save(); } } myLocalAnnotationTypeInfoList.Remove(found); } else// if missing then delete { using (AnnotationType at = ai.Get()) { at.Delete(); at.Save(); } } } foreach (LocalAnnotationTypeInfo lai in myLocalAnnotationTypeInfoList) { AnnotationTypeConfig newAtc = new AnnotationTypeConfig { PrintableText_XLocation = lai.PrntLoc }; using (AnnotationType at = AnnotationType.New(lai.Name, newAtc.ToString(), DateTime.Now, Volian.Base.Library.VlnSettings.UserID)) at.Save(); } AnnotationTypeInfoList.Refresh(); } #region General tab /// /// This is the General button used on the button interface design /// /// object /// EventArgs private void btnGeneral_Click(object sender, EventArgs e) => ProcessButtonClick(tiGeneral, btnGeneral); private void ppRTxtName_Leave(object sender, EventArgs e) { if (ppRTxtName.Text == null || ppRTxtName.Text == "") { MessageBox.Show("Cannot have a blank Name."); return; } if (ppRTxtName.Text != _FolderConfig.Name) { // need a folderinfo to check for unique names... bool isunique = _FolderConfig.CheckUniqueName(ppRTxtName.Text); if (!isunique) { MessageBox.Show($"The Name '{ppRTxtName.Text}' that was entered is not a unique folder name"); ppRTxtName.Text = _FolderConfig.Name; } } } #endregion #region Referenced Objects tab /// /// This is the Referenced Objects button used on the button interface design /// /// object /// EventArgs private void btnRefObjs_Click(object sender, EventArgs e) => ProcessButtonClick(tiRefObj, btnRefObjs); /// /// Selection in Graphic File Extension combo box changed. /// /// object /// EventArgs private void ppCmbxGrphFileExt_SelectedValueChanged(object sender, EventArgs e) { if (!_Initializing) ProcessCmbxSelectedValueChange(ppCmbxGrphFileExt, _DefaultROGraficFileExtension, ppBtnDefaultGrphFileExt, ppLblGrphFileExtDefault); } /// /// Reset to the parent setting. /// Find the parent setting and assign it to _FolderConfig.Graphics_defaultext. /// This will force the database to be updated. /// /// /// private void ppBtnDefaultGrfExt_Click(object sender, EventArgs e) { // Compare parent setting with current setting if (_DefaultROGraficFileExtension.Equals(_FolderConfig.Graphics_defaultext)) _FolderConfig.Graphics_defaultext = _DefaultROGraficFileExtension;// this will force a database update (write) ppCmbxGrphFileExt.SelectedIndex = -1; //reset to the default Graphic File Extension setting } #endregion #region Output Settings tab /// /// This is the Output Settings button used on the button interface design /// /// object /// EventArgs private void btnOutputSettings_Click(object sender, EventArgs e) => ProcessButtonClick(tiOutputSettings, btnOutputSettings); /// /// Selection in Watermark combo box changed. /// /// object /// EventArgs private void ppCmbxWatermark_SelectedValueChanged(object sender, EventArgs e) { if (!_Initializing) { PrintWatermark wtr = (PrintWatermark)Enum.Parse(typeof(PrintWatermark), _DefaultWatermark); ProcessCmbxSelectionEnumChanged(ppCmbxWatermark, wtr, ppBtnDefWatermark, ppLblWatermarkDefault); } } /// /// Reset to the parent setting. /// Find the parent setting and assign it to _FolderConfig.Print_Watermark. /// This will force the database to be updated. /// /// /// private void ppBtnDefWatermark_Click(object sender, EventArgs e) { // Get the parent setting PrintWatermark wtr = (PrintWatermark)Enum.Parse(typeof(PrintWatermark), _DefaultWatermark); // Compare parent setting with current setting if (wtr != _FolderConfig.Print_Watermark) _FolderConfig.Print_Watermark = wtr; // this will force a database update (write) ppCmbxWatermark.SelectedIndex = -1; //reset to the default Watermark setting } #endregion #region Startup Message tab /// /// This is the Startup Message button used on the button interface design /// /// object /// EventArgs private void btnStMsg_Click(object sender, EventArgs e) => ProcessButtonClick(tiStMsg, btnStMsg); #endregion #region Format Settings tab /// /// This is the Format Settings button used on the button interface design /// /// object /// EventArgs private void btnFormatSettings_Click(object sender, EventArgs e) { ProcessButtonClick(tiFmtSettings, btnFormatSettings); // added for code change C2017-004 - select default format in dropdown list if (_InitialIndex < -1) _InitialIndex = ppCmbxFormat.SelectedIndex; // save the current format selection (happens here when current section is set to the default format) } private void ppBtnDefaultFmt_Click(object sender, EventArgs e) => ppCmbxFormat.SelectedIndex = -1; //reset to the default Format setting /// /// Enable or disable the user specified change bar options base on the type /// of change bar selected. /// private void setEnabledUserSpecifiedChgBarCombos(PrintChangeBar pcb) { ppGpbxUserSpecCB.Enabled = (ppCmbxChangeBarType.SelectedValue != null && ppCmbxChangeBarType.SelectedValue.Equals(PrintChangeBar.WithUserSpecified)) || (ppCmbxChangeBarType.SelectedValue == null && pcb.Equals(PrintChangeBar.WithUserSpecified)); } /// /// Selection in Change Bar combo box changed. /// /// object /// EventArgs private void ppCmbxChangeBarType_SelectedValueChanged(object sender, EventArgs e) { if (!_Initializing) { PrintChangeBar pcb = (PrintChangeBar)Enum.Parse(typeof(PrintChangeBar), _DefaultChgBarType); ProcessCmbxSelectionEnumChanged(ppCmbxChangeBarType, pcb, ppBtnDefaultChgBar, ppLblChangeBarTypeDefault); setEnabledUserSpecifiedChgBarCombos(pcb); } } /// /// Reset to the parent setting. /// Find the parent setting and assign it to _FolderConfig.PrintChangeBar. /// This will force the database to be updated. /// /// /// private void ppBtnDefaultChgBar_Click(object sender, EventArgs e) { // Get the parent setting PrintChangeBar pcb = (PrintChangeBar)Enum.Parse(typeof(PrintChangeBar), _DefaultChgBarType); // Compare parent setting with current setting if (pcb != _FolderConfig.Print_ChangeBar) _FolderConfig.Print_ChangeBar = pcb; // this will force a database update (write) ppCmbxChangeBarType.SelectedIndex = -1; //reset combo box to the default Change Bar setting } /// /// Selection in Change Bar Position combo box changed. /// /// object /// EventArgs private void ppCmbxChgBarPos_SelectedValueChanged(object sender, EventArgs e) { if (!_Initializing) { PrintChangeBarLoc cbl = (PrintChangeBarLoc)Enum.Parse(typeof(PrintChangeBarLoc), _DefaultChgBarLoc); ProcessCmbxSelectionEnumChanged(ppCmbxChgBarPos, cbl, ppBtnDefaultCbPos, ppLblChgBarPosDefault); } } /// /// Reset to the parent setting. /// Find the parent setting and assign it to _FolderConfig.Print_ChangeBarLoc. /// This will force the database to be updated. /// /// /// private void ppBtnDefaultCbPos_Click(object sender, EventArgs e) { // Get the parent setting PrintChangeBarLoc cbl = (PrintChangeBarLoc)Enum.Parse(typeof(PrintChangeBarLoc), _DefaultChgBarLoc); // Compare parent setting with current setting if (cbl != _FolderConfig.Print_ChangeBarLoc) _FolderConfig.Print_ChangeBarLoc = cbl; // this will force a database update (write) ppCmbxChgBarPos.SelectedIndex = -1; //reset to the default Change Bar Position setting } /// /// Selection in Change Bar Text Type combo box changed. /// /// object /// EventArgs private void ppCmbxChgBarTxtType_SelectedValueChanged(object sender, EventArgs e) { if (!_Initializing) { PrintChangeBarText cbt = (PrintChangeBarText)Enum.Parse(typeof(PrintChangeBarText), _DefaultChgBarText); ProcessCmbxSelectionEnumChanged(ppCmbxChgBarTxtType, cbt, ppBtnDefCbTxtTyp, ppLblChgBarTxtTypeDefault); setEnabledUserSpecifiedChgBarText(); } } /// /// Reset to the parent setting. /// Find the parent setting and assign it to _FolderConfig.Print_ChangeBarText. /// This will force the database to be updated. /// /// /// private void ppBtnDefCbTxtTyp_Click(object sender, EventArgs e) { // Get the parent setting PrintChangeBarText cbt = (PrintChangeBarText)Enum.Parse(typeof(PrintChangeBarText), _DefaultChgBarText); // Compare parent setting with current setting if (cbt != _FolderConfig.Print_ChangeBarText) _FolderConfig.Print_ChangeBarText = cbt; // this will force a database update (write) ppCmbxChgBarTxtType.SelectedIndex = -1; //reset to the default Change Bar Text Type setting } /// /// Enable or disable the user specified change bar text based on the selected /// change bar text type (selected in the user specific change bar grouping) /// private void setEnabledUserSpecifiedChgBarText() { // This string is used to check against our default setting to see if User Defined Changebar Text is active string decUserDef = PrintChangeBarText.UserDef.ToString(); ppGpbxUserSpecTxt.Enabled = (ppCmbxChgBarTxtType.SelectedValue != null && ppCmbxChgBarTxtType.SelectedValue.Equals(PrintChangeBarText.UserDef)) || (ppCmbxChgBarTxtType.SelectedIndex == -1 && _DefaultChgBarText.Equals(decUserDef)); } /// /// Selection in Change Bar User Message One text changed. /// /// object /// EventArgs private void ppTxbxChangeBarUserMsgOne_TextChanged(object sender, EventArgs e) { ppBtnDefCbTxt1.Visible = ((ppTxbxChangeBarUserMsgOne.Text != null) && !ppTxbxChangeBarUserMsgOne.Text.Equals(_DefaultChgBarUsrMsg1)); ppLblChgBarUserMsgOneDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefCbTxt1.Visible; } /// /// Selection in Change Bar User Message Two text changed. /// /// object /// EventArgs private void ppTxbxChangeBarUserMsgTwo_TextChanged(object sender, EventArgs e) { ppBtnDefCbTxt2.Visible = ((ppTxbxChgBarUserMsgTwo.Text != null) && !ppTxbxChgBarUserMsgTwo.Text.Equals(_DefaultChgBarUsrMsg2)); ppLblChgBarUserMsgTwoDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefCbTxt2.Visible; } #endregion #region Editor Settings tab /// /// This is the Editor Settings button used on the button interface design /// /// object /// EventArgs private void btnEdSettings_Click(object sender, EventArgs e) => ProcessButtonClick(tiEditSettings, btnEdSettings); /// /// Selection in Step Editor Columns combo box changed. /// /// object /// EventArgs private void ppCmbxStpEditorCols_SelectedValueChanged(object sender, EventArgs e) { if (!_Initializing) { FormatColumns fcl = (FormatColumns)Enum.Parse(typeof(FormatColumns), _DefaultFormatColumns); ProcessCmbxSelectionEnumChanged(ppCmbxStpEditorCols, fcl, ppBtnDefEdCols, ppLblStpEditorColsDefault); } } /// /// Reset to the parent setting. /// Find the parent setting and assign it to _FolderConfig.Format_Columns. /// This will force the database to be updated. /// /// /// private void ppBtnDefEdCols_Click(object sender, EventArgs e) { // Get the parent setting FormatColumns fcl = (FormatColumns)Enum.Parse(typeof(FormatColumns), _DefaultFormatColumns); // Compare parent setting with current setting if (fcl != _FolderConfig.Format_Columns) _FolderConfig.Format_Columns = fcl; // this will force a database update (write) ppCmbxStpEditorCols.SelectedIndex = -1; //reset to the default Step Editor Columns setting } #endregion #region Generic functions used on this property page /// /// Set the watermark and default label /// /// The default text /// Label that displays the current default when view defaults is set /// Combo box with a watermark property private static void SetupDefault(string defaultText, Label lbl, ComboBoxEx cmbo) { if (defaultText != null && !(defaultText.Equals(""))) { string deftext = string.Format("{0}", defaultText); lbl.Text = deftext; cmbo.WatermarkText = deftext; } } /// /// Determines what labels (showing default values) are visable on the property pages /// private void defaultSettingsVisiblity() { ppLblDefSettingsInfo.Visible = ppCbShwDefSettings.Checked; ppLblChgBarUserMsgOneDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefCbTxt1.Visible; ppLblChgBarUserMsgTwoDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefCbTxt2.Visible; ppLblStpEditorColsDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefEdCols.Visible; ppLblGrphFileExtDefault.Visible = (ppCbShwDefSettings.Checked || _IsVepromsNode) && ppBtnDefaultGrphFileExt.Visible; ppLblWatermarkDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefWatermark.Visible; ppLblChgBarTxtTypeDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefCbTxtTyp.Visible; ppLblFormatDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefaultFmt.Visible; ppLblChangeBarTypeDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefaultChgBar.Visible; ppLblChgBarPosDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefaultCbPos.Visible; } /// /// Process a change in the combo box selection /// /// Combo Box Name /// string containing default text /// button to reset to default value /// label containing the default private void ProcessCmbxSelectedValueChange(ComboBoxEx cmbx, string defstr, ButtonX button, Label deflabel) { if ((cmbx.SelectedIndex != -1) && defstr != null && defstr.Equals(cmbx.SelectedValue)) { button.Focus(); button.PerformClick(); } button.Visible = (cmbx.SelectedValue != null);//(!_FolderConfig.Name.Equals("VEPROMS")) && (cmbx.SelectedValue != null); deflabel.Visible = (ppCbShwDefSettings.Checked || _IsVepromsNode) && button.Visible; } /// /// Process a change in the enum combo box selection /// /// Combo Box Name /// the default enum value /// button to reset to default value /// label containing the default private void ProcessCmbxSelectionEnumChanged(ComboBoxEx cmbx, object enumval, ButtonX button, Label deflabel) { if ((cmbx.SelectedIndex != -1) && cmbx.SelectedValue.Equals(enumval)) { _Initializing = true; button.Visible = true; button.Focus(); button.PerformClick(); cmbx.SelectedIndex = -1; // This will hide the Default button _Initializing = false; } button.Visible = (!_IsVepromsNode && (cmbx.SelectedValue != null)&&(cmbx.SelectedIndex >= 0)); deflabel.Visible = ppCbShwDefSettings.Checked && button.Visible; } /// /// Select the corresponding tab and set the button's state to checked /// /// Property Page Tab /// Corresponding Property Page Button private void ProcessButtonClick(TabItem tab, ButtonX button) { ClearAllCheckedButtons(); tcFolder.SelectedTab = tab; button.Checked = true; } /// /// For the Button Interface property page style, when a button is selected (pressed), /// it will remain in the checked state even when a different button is selected. Thus /// we must clear the checked state of the buttons when a button is selected, then set /// the newly selected button's state to checked. /// private void ClearAllCheckedButtons() { btnGeneral.Checked = false; btnEdSettings.Checked = false; btnFormatSettings.Checked = false; btnOutputSettings.Checked = false; btnRefObjs.Checked = false; btnStMsg.Checked = false; btnAnnoTypes.Checked = false; btnRevisionStages.Checked = false; } /// /// This is a generic Enter Event function for use with all of the property page tabs. /// Found that the visiblity value of buttons is not recorded until the property page in which it resides is diplayed. /// Thus we need to call defaultSettingVisiblity() to check and set visiblity states. /// /// type object /// type EventArgs private void tabpage_Enter(object sender, EventArgs e) { // Show or hide the labels containing the default values defaultSettingsVisiblity(); } #endregion private void ppBtnDefCbTxt1_Click(object sender, EventArgs e) { // Compare default setting with current setting // Reset with the default and hide the default button and label if (_DefaultChgBarUsrMsg1 != _FolderConfig.Print_UserCBMess1) { _FolderConfig.Print_UserCBMess1 = _DefaultChgBarUsrMsg1; // this will force a database update (write) ppLblChgBarUserMsgOneDefault.Visible = false; ppBtnDefCbTxt1.Visible = false; } } private void ppBtnDefCbTxt2_Click(object sender, EventArgs e) { // Compare default setting with current setting // Reset with the default and hide the default button and label if (_DefaultChgBarUsrMsg2 != _FolderConfig.Print_UserCBMess2) { _FolderConfig.Print_UserCBMess2 = _DefaultChgBarUsrMsg2; // this will force a database update (write) ppLblChgBarUserMsgTwoDefault.Visible = false; ppBtnDefCbTxt2.Visible = false; } } private void frmFolderProperties_Shown(object sender, EventArgs e) => ppRTxtName.Focus(); private void btnAnnoTypes_Click(object sender, EventArgs e) => ProcessButtonClick(tiAnnoTypes, btnAnnoTypes); private void btnApprvStages_Click(object sender, EventArgs e) => ProcessButtonClick(tiRevisionStages, btnRevisionStages); #region Annotation Types private void lbAnnotationTypes_SelectedIndexChanged(object sender, System.EventArgs e) { if (btnAnnoTypeUndo.Enabled) { btnAnnoTypeUndo.Enabled = false; btnAnnoTypeApply.Enabled = false; myLocalAnnotationTypeInfoList[_LastAnnotationTypeInfoIndex].Name = tbxAnnotationDescription.Text; myLocalAnnotationTypeInfoList[_LastAnnotationTypeInfoIndex].PrntLoc = int.Parse(txbPrntLoc.Text == "" ? "0" : txbPrntLoc.Text); RefreshAnnotationTypeList(); } LoadLocalAnnotationTypeInfo(); } private int _LastAnnotationTypeInfoIndex = 0; private void LoadLocalAnnotationTypeInfo() { btnAnnoTypeUndo.Enabled = false; btnAnnoTypeApply.Enabled = false; _LastAnnotationTypeInfoIndex = lbAnnotationTypes.SelectedIndex; if (!(lbAnnotationTypes.SelectedValue is LocalAnnotationTypeInfo ai)) { tbxAnnotationDescription.Text = ""; tbxAnnotationDescription.Enabled = false; btnAnnoTypeUndo.Enabled = false; btnAnnoTypeApply.Enabled = false; btnAnnoTypeNew.Enabled = true; btnAnnoTypeRemove.Enabled = false; txbxRemoveMsg.Visible = false; lblAnnoTypeCntMessage.Visible = false; txbPrntLoc.Visible = false; lblPrintTxt.Visible = false; return; } tbxAnnotationDescription.Enabled = true; tbxAnnotationDescription.Text = ai.Name; btnAnnoTypeUndo.Enabled = false; btnAnnoTypeApply.Enabled = false; txbPrntLoc.Visible = true; lblPrintTxt.Visible = true; txbPrntLoc.Text = ai.PrntLoc != 0 ? ai.PrntLoc.ToString() : ""; if (ai.AnnotationTypeAnnotationCount == 0) { btnAnnoTypeRemove.Enabled = true; txbxRemoveMsg.Visible = false; lblAnnoTypeCntMessage.Visible = false; } else { string countMsg = $"{ai.Name} is used in {ai.AnnotationTypeAnnotationCount} places"; btnAnnoTypeRemove.Enabled = false; lblAnnoTypeCntMessage.Text = countMsg; txbxRemoveMsg.Visible = true; lblAnnoTypeCntMessage.Visible = true; } if (lbAnnotationTypes.SelectedIndex >= 0) { tbxAnnotationDescription.Focus(); tbxAnnotationDescription.SelectAll(); } } private void tbxAnnotationDescription_TextChanged(object sender, EventArgs e) { btnAnnoTypeUndo.Enabled = true; btnAnnoTypeApply.Enabled = true; } private void tbxAnnotationPrntLoc_TextChanged(object sender, EventArgs e) { btnAnnoTypeUndo.Enabled = true; btnAnnoTypeApply.Enabled = true; } private void tiAnnoTypes_Click(object sender, EventArgs e) { lbAnnotationTypes.SelectedIndex = -1; lbAnnotationTypes.Invalidate(); } private void RefreshAnnotationTypeList() { lbAnnotationTypes.DataSource = null; lbAnnotationTypes.DataSource = myLocalAnnotationTypeInfoList;//myAnnotationTypeInfoList = AnnotationTypeInfoList.Get(); lbAnnotationTypes.DisplayMember = "Name"; } private void btnAnnoTypeNew_Click(object sender, EventArgs e) { if (btnAnnoTypeUndo.Enabled) // save the current changes { btnAnnoTypeUndo.Enabled = false; btnAnnoTypeApply.Enabled = false; myLocalAnnotationTypeInfoList[_LastAnnotationTypeInfoIndex].Name = tbxAnnotationDescription.Text; RefreshAnnotationTypeList(); } LocalAnnotationTypeInfo lati = new LocalAnnotationTypeInfo("New Annotation Type"); lati.Name = string.Format("{0} {1}", lati.Name, lati.TypeID); myLocalAnnotationTypeInfoList.Add(lati); btnAnnoTypeUndo.Enabled = false; btnAnnoTypeApply.Enabled = false; RefreshAnnotationTypeList(); btnAnnoTypeRemove.Enabled = true; lbAnnotationTypes.SelectedIndex = lbAnnotationTypes.Items.Count - 1; _LastAnnotationTypeInfoIndex = lbAnnotationTypes.SelectedIndex; } private void btnAnnoTypeUndo_Click(object sender, EventArgs e) { tbxAnnotationDescription.Undo(); txbPrntLoc.Undo(); btnAnnoTypeUndo.Enabled = false; btnAnnoTypeApply.Enabled = false; } private void btnAnnoTypeRemove_Click(object sender, EventArgs e) { LocalAnnotationTypeInfo ai = lbAnnotationTypes.SelectedValue as LocalAnnotationTypeInfo; myLocalAnnotationTypeInfoList.Remove(ai); int saveIdx = lbAnnotationTypes.SelectedIndex; btnAnnoTypeRemove.Enabled = false; btnAnnoTypeUndo.Enabled = false; btnAnnoTypeApply.Enabled = false; RefreshAnnotationTypeList(); if (saveIdx > lbAnnotationTypes.Items.Count - 1) lbAnnotationTypes.SelectedIndex = saveIdx - 1; else { lbAnnotationTypes.SelectedIndex = saveIdx; LoadLocalAnnotationTypeInfo(); } } private void txbAnnotationPrntLoc_Validating(object sender, CancelEventArgs e) { if (_ValidateTextBox) { string newloc = txbPrntLoc.Text; if (newloc == "") newloc = "0"; try { int newloci = int.Parse(newloc); } catch (Exception) { MessageBox.Show("Invalid Print Location, must be an integer.", "Print Text Location"); e.Cancel = true; } } } private void tbxAnnotationDescription_Validating(object sender, CancelEventArgs e) { if (_ValidateTextBox) { string newname = tbxAnnotationDescription.Text; LocalAnnotationTypeInfo ai = lbAnnotationTypes.SelectedValue as LocalAnnotationTypeInfo; if (newname.Trim().Length == 0) { MessageBox.Show("An Annotation Type Name Cannot Be Blank", "Annotation Type"); e.Cancel = true; } else { foreach (LocalAnnotationTypeInfo lati in myLocalAnnotationTypeInfoList) if (lati.Name == newname && lati.TypeID != ai.TypeID) { MessageBox.Show("An Annotation Type of this Name already exists.", "Annotation Type"); e.Cancel = true; } } } } private void btnAnnoTypeRemove_MouseEnter(object sender, EventArgs e) => _ValidateTextBox = false; private void btnAnnoTypeRemove_MouseLeave(object sender, EventArgs e) => _ValidateTextBox = true; #endregion #region Revision Stages private void tbRevisionStage_TextChanged(object sender, EventArgs e) { btnRevisoinStageUndo.Enabled = true; btnRevisionStageApply.Enabled = true; } private void btnRevisionStageNew_Click(object sender, EventArgs e) { LocalStageInfo lsi = new LocalStageInfo("New Stage", 0); lsi.Name = $"{lsi.Name} {lsi.ID}"; myLocalStageInfoList.Add(lsi); btnRevisoinStageUndo.Enabled = false; btnRevisionStageApply.Enabled = false; RefreshRevisionStagesList(); btnRevisionStageRemove.Enabled = true; lbRevisionStages.SelectedIndex = lbRevisionStages.Items.Count - 1; } private void RefreshRevisionStagesList() { lbRevisionStages.DataSource = null; lbRevisionStages.DataSource = myLocalStageInfoList; lbRevisionStages.DisplayMember = "Name"; } private void btnRevisionStageRemove_Click(object sender, EventArgs e) { LocalStageInfo si = lbRevisionStages.SelectedValue as LocalStageInfo; myLocalStageInfoList.Remove(si); int savIdx = lbRevisionStages.SelectedIndex; btnRevisionStageRemove.Enabled = false; btnRevisoinStageUndo.Enabled = false; btnRevisionStageApply.Enabled = false; RefreshRevisionStagesList(); if (savIdx > lbRevisionStages.Items.Count - 1) lbRevisionStages.SelectedIndex = savIdx - 1; else { lbRevisionStages.SelectedIndex = savIdx; LoadLocalStageInfo(); } } private void btnRevisionStageUndo_Click(object sender, EventArgs e) { tbRevisionStage.Undo(); btnRevisoinStageUndo.Enabled = false; btnRevisionStageApply.Enabled = false; LocalStageInfo si = lbRevisionStages.SelectedValue as LocalStageInfo; rbApprovalStage.Checked = (si.IsApproved > 0); rbWorkflowStage.Checked = (si.IsApproved == 0); } private void lbRevisionStages_SelectedIndexChanged(object sender, EventArgs e) { if (btnRevisoinStageUndo.Enabled) { btnRevisoinStageUndo.Enabled = false; btnRevisionStageApply.Enabled = false; myLocalStageInfoList[_LastStageInfoIndex].Name = tbRevisionStage.Text; myLocalStageInfoList[_LastStageInfoIndex].IsApproved = rbApprovalStage.Checked ? 1 : 0; RefreshRevisionStagesList(); } LoadLocalStageInfo(); } private int _LastStageInfoIndex = -1; private void LoadLocalStageInfo() { btnRevisoinStageUndo.Enabled = false; btnRevisionStageApply.Enabled = false; _LastStageInfoIndex = lbRevisionStages.SelectedIndex; if (!(lbRevisionStages.SelectedValue is LocalStageInfo si)) { tbRevisionStage.Text = ""; tbRevisionStage.Enabled = false; btnRevisoinStageUndo.Enabled = false; btnRevisionStageApply.Enabled = false; btnRevisionStageNew.Enabled = true; btnRevisionStageRemove.Enabled = false; return; } tbRevisionStage.Enabled = true; tbRevisionStage.Text = si.Name; if (si.IsApproved > 0) rbApprovalStage.Checked = true; else rbWorkflowStage.Checked = true; btnRevisoinStageUndo.Enabled = false; btnRevisionStageApply.Enabled = false; btnRevisionStageRemove.Enabled = true; if (lbRevisionStages.SelectedIndex >= 0) { tbRevisionStage.Focus(); tbRevisionStage.SelectAll(); } } private void tiRevisionStages_Click(object sender, EventArgs e) { lbRevisionStages.SelectedIndex = -1; lbRevisionStages.Invalidate(); } private void rbWorkflowStage_CheckedChanged(object sender, EventArgs e) { btnRevisoinStageUndo.Enabled = true; btnRevisionStageApply.Enabled = true; } private void rbApproveStage_CheckedChanged(object sender, EventArgs e) { btnRevisoinStageUndo.Enabled = true; btnRevisionStageApply.Enabled = true; } private void tbRevisionStage_Validating(object sender, CancelEventArgs e) { if (_ValidateTextBox) { string newname = tbRevisionStage.Text; LocalStageInfo si = lbRevisionStages.SelectedValue as LocalStageInfo; if (newname.Trim().Length == 0) { MessageBox.Show("The Revision Stage Name Cannot Be Blank", "Revision Stage"); e.Cancel = true; } else { foreach (LocalStageInfo lsi in myLocalStageInfoList) if (lsi.Name == newname && lsi.ID != si.ID) { MessageBox.Show("A Revision Stage of this Name already exists.", "Revision Stage"); e.Cancel = true; } } } } private void btnRevisionStageRemove_MouseEnter(object sender, EventArgs e) => _ValidateTextBox = false; private void btnRevisionStageRemove_MouseLeave(object sender, EventArgs e) => _ValidateTextBox = true; private void rbReviseStage_MouseEnter(object sender, EventArgs e) => _ValidateTextBox = false; private void rbReviseStage_MouseLeave(object sender, EventArgs e) => _ValidateTextBox = true; private void rbApproveStage_MouseEnter(object sender, EventArgs e) => _ValidateTextBox = false; private void rbApproveStage_MouseLeave(object sender, EventArgs e) => _ValidateTextBox = true; #endregion private void btnRevisionStageApply_Click(object sender, EventArgs e) { //add code to apply changes btnRevisoinStageUndo.Enabled = false; btnRevisionStageApply.Enabled = false; LocalStageInfo si = lbRevisionStages.SelectedValue as LocalStageInfo; si.Name = tbRevisionStage.Text; si.IsApproved = rbApprovalStage.Checked ? 1 : 0; RefreshRevisionStagesList(); } private void btnAnnoTypeApply_Click(object sender, EventArgs e) { //add code btnAnnoTypeUndo.Enabled = false; btnAnnoTypeApply.Enabled = false; LocalAnnotationTypeInfo ati = lbAnnotationTypes.SelectedValue as LocalAnnotationTypeInfo; ati.Name = tbxAnnotationDescription.Text; txbPrntLoc.Visible = true; lblPrintTxt.Visible = true; ati.PrntLoc = int.Parse(txbPrntLoc.Text == "" ? "0" : txbPrntLoc.Text); // data was already checked RefreshAnnotationTypeList(); } private void ppCmbxFormat_DropDown(object sender, EventArgs e) { _Initializing = true; // C2017-004 - if using the default format, position the dropdown to the default format if (ppCmbxFormat.SelectedIndex == -1) ppCmbxFormat.SelectedValue = _DefaultFormatName; _Initializing = false; } private void ppCmbxFormat_DropDownClosed(object sender, EventArgs e) { // upon exit of the dropdown if the default format is selected - click the Default button if ((string)(ppCmbxFormat.SelectedValue) == _DefaultFormatName) { ppBtnDefaultFmt.PerformClick(); btnFormatSettings.Focus(); } } // added as part of code change C2017-004. this also makes it consistent with section properties int _InitialIndex = -2; private void ppCmbxFormat_SelectedIndexChanged(object sender, EventArgs e) { if (_Initializing) { // determine if the default button and the default description text should visable ppBtnDefaultFmt.Visible = !(ppCmbxFormat.SelectedValue == null || ppCmbxFormat.SelectedIndex == -1); ppLblFormatDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefaultFmt.Visible; return; } if (_InitialIndex < -1) _InitialIndex = ppCmbxFormat.SelectedIndex; // save the current format selection (happens here when current section format is not the default section) if ((ppCmbxFormat.SelectedIndex != -1) && _DefaultFormatName != null && _DefaultFormatName.Equals(ppCmbxFormat.SelectedValue)) { ppBtnDefaultFmt.Focus(); ppBtnDefaultFmt.PerformClick(); } // determine if the default button and the default description text should visable ppBtnDefaultFmt.Visible = !(ppCmbxFormat.SelectedValue == null || ppCmbxFormat.SelectedIndex == -1); ppLblFormatDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefaultFmt.Visible; } } public partial class LocalStageInfo { private static int _UniqueID = 0; protected static int UniqueID => --_UniqueID; private readonly int _MyUniqueID = UniqueID; // Absolutely Unique ID - Editable public int MyUniqueID => _MyUniqueID; public int ID { get; set; } public string Name { get; set; } public int IsApproved { get; set; } public int StageVersionCount { get; set; } public LocalStageInfo(string name, int isApproved) { ID = MyUniqueID; Name = name; IsApproved = isApproved; StageVersionCount = 0; } public LocalStageInfo(StageInfo si) { ID = si.StageID; Name = si.Name; IsApproved = si.IsApproved; StageVersionCount = si.StageVersionCount; } public override string ToString() => $"{ID} {Name}"; } public partial class LocalStageInfoList : List { public LocalStageInfoList(StageInfoList sil) { foreach (StageInfo si in sil) Add(new LocalStageInfo(si)); } } public partial class LocalAnnotationTypeInfo { private static int _UniqueID = 0; protected static int UniqueID { get { return --_UniqueID; } } private readonly int _MyUniqueID = UniqueID; // Absolutely Unique ID - Editable public int MyUniqueID => _MyUniqueID; public int TypeID { get; set; } public string Name { get; set; } public int PrntLoc { get; set; } public int AnnotationTypeAnnotationCount { get; set; } public LocalAnnotationTypeInfo(string name) { TypeID = MyUniqueID; Name = name; PrntLoc = 0; AnnotationTypeAnnotationCount = 0; } public LocalAnnotationTypeInfo(AnnotationTypeInfo ai) { TypeID = ai.TypeID; Name = ai.Name; AnnotationTypeConfig atc = new AnnotationTypeConfig(ai); if (atc != null) { PrntLoc = atc.PrintableText_XLocation; } AnnotationTypeAnnotationCount = ai.AnnotationTypeAnnotationCount; } public override string ToString() => $"{TypeID} {Name}"; } public partial class LocalAnnotationTypeInfoList : List { public LocalAnnotationTypeInfoList(AnnotationTypeInfoList ail) { foreach (AnnotationTypeInfo ai in ail) Add(new LocalAnnotationTypeInfo(ai)); } } }