SourceCode/PROMS/VEPROMS User Interface/frmSectionProperties.cs

1490 lines
68 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using VEPROMS.CSLA.Library;
using VEPROMS.Properties;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Controls;
using Volian.Controls.Library;
using DescriptiveEnum;
using System.IO;
namespace VEPROMS
{
public partial class frmSectionProperties : DevComponents.DotNetBar.Office2007Form
{
private string _DefaultFormatName = null;
private string _DefaultNumColumns = null;
private string _DefaultPaginationStyle = null;
private string _DefaultPrintSize = null;
private bool _Initializing;
private SectionConfig _SectionConfig;
private Document _DocumentToDelete = null;
private StepTabRibbon _MyStepTabRibbon;
private bool _isStepSection = true;
private bool _hasSectionCheckoffDefault = false;
private bool _isDefaultStepSection = false;
public frmSectionProperties(SectionConfig sectionConfig)
{
_SectionConfig = sectionConfig;
InitializeComponent();
btnGeneral.PerformClick(); // always start with General tab or button
ItemInfo ii = ItemInfo.Get(_SectionConfig.MySection.ItemID);
//if (sectionConfig.Number.Length > 0)
// this.Text = string.Format("{0} {1} Properties", sectionConfig.Number, sectionConfig.Title);
//else
// this.Text = string.Format("{0} Properties", sectionConfig.Title);
if (sectionConfig.Number.Length > 0)
this.Text = string.Format("{0} {1} Properties", ii.DisplayNumber, ii.DisplayText);
else
this.Text = string.Format("{0} Properties", ii.DisplayText);
ppSectTitleStpRTB.Font = ppSectTitleStpRTB.FormatFont = new System.Drawing.Font("Microsoft Sans Serif", 10F);
ppSectTitleStpRTB.FieldToEdit = E_FieldToEdit.Text;
ppSectTitleStpRTB.BorderStyle = BorderStyle.Fixed3D;
ppSectTitleStpRTB.MyItemInfo = ii;
ppSectTitleStpRTB.RefreshDisplay(true);
ppSectNumberStpRTB.Font = this.ppSectNumberStpRTB.FormatFont = new System.Drawing.Font("Microsoft Sans Serif", 10F);
ppSectNumberStpRTB.FieldToEdit = E_FieldToEdit.Number;
ppSectNumberStpRTB.BorderStyle = BorderStyle.Fixed3D;
ppSectNumberStpRTB.MyItemInfo = ii;
ppSectNumberStpRTB.RefreshDisplay(true);
_MyStepTabRibbon = new StepTabRibbon();
//_MyStepTabRibbon.Dock = System.Windows.Forms.DockStyle.Top;
//_MyStepTabRibbon.Location = new System.Drawing.Point(0, 0);
_MyStepTabRibbon.Name = "displayTabRibbon1";
_MyStepTabRibbon.Visible = false;
// B2017-272 disable/enable the Steps and Word radio buttons based on the section types defined in the format
// and the type of an existing section or if we are creating a new section.
// Move the check of creating a new section into CheckAvailableSectionTypes()
CheckAvaibleSectionTypes();
//// if creating a new section, enable the StepSect and WordSect radio buttons
//rbStepSect.Enabled = rbWordSect.Enabled = !(ii.HasWordContent || ii.HasStepContent);
// if this is an auto table of contents (mydocstyle == null if new section, so must check for that first)
if (ii.IsAutoTOCSection)
{
rbWordSect.Checked = true;
rbStepSect.Enabled = false;
rbWordSect.Enabled = false;
_isStepSection = false;
}
// if this has already been set to be a step section, i.e. HasStepContent, disable the libdoc tab
// also disable if there is no word content yet - the user may want to change from step type to
// word type, as long as there is no content yet.
if (ii.HasStepContent || !ii.HasWordContent) tcpLibDoc.Enabled = false;
if (ii.HasWordContent) _isStepSection = false;
}
// B2017-272 disable/enable the Steps and Word section radio buttons based on the section types defined in the format
// and the type of an existing section or if we are creating a new section
private void CheckAvaibleSectionTypes()
{
PlantFormat pf = (ppCmbxFormat.SelectedIndex != -1) ? FormatInfoList.SortedFormatInfoList[ppCmbxFormat.SelectedIndex].PlantFormat : (_SectionConfig.MyFormat != null) ? _SectionConfig.MyFormat.PlantFormat : _SectionConfig.MyDefaultFormat.PlantFormat;
ItemInfo ii = ItemInfo.Get(_SectionConfig.MySection.ItemID);
// if creating a new section, enable the StepSect and WordSect radio buttons
bool isNewSection = !(ii.HasWordContent || ii.HasStepContent || ii.HasSectionContent); // B2018-054 added check for sub sections
int numStepSects = 0;
int numWordSects = 0;
foreach (DocStyle nds in pf.DocStyles.DocStyleListActive)
{
if (nds.IsStepSection)
numStepSects++;
else
numWordSects++;
}
rbStepSect.Enabled = (numStepSects > 0 && (isNewSection || ii.IsStepSection)); // there are step section types and current section is a step section or creating new section
rbWordSect.Enabled = (numWordSects > 0 && (isNewSection || !ii.IsStepSection)); // there are word section types and current section is a word section or creating new section
}
private void btnSectPropOK_Click(object sender, EventArgs e)
{
sectionConfigBindingSource.EndEdit();
// Save Default settings for User
//
// Save whether we should display the default values on this property page
Settings.Default.ShowDefaultSectionProp = ppCbShwDefSettings.Checked;
Settings.Default.Save();
// save the type based on selection.
if (ppCmbxStyleSectionType.Items.Count > 0) // B2017-270 user click on OK button but format does not have section style for this section type
_SectionConfig.MySection.MyContent.Type = ((DocStyle)ppCmbxStyleSectionType.SelectedItem).Index + 10000;
// save any changes to checkoffs. The bindings were added to the designer, but the 'save' was
// hanging, so they're being done here.
PlantFormat pf = _SectionConfig.MyFormat != null ? _SectionConfig.MyFormat.PlantFormat : _SectionConfig.MyDefaultFormat.PlantFormat;
CheckOffList chkoffList = pf.FormatData.ProcData.CheckOffData.CheckOffList;
CheckOffHeaderList chkoffHeaderList = pf.FormatData.ProcData.CheckOffData.CheckOffHeaderList;
int maxindx = pf.FormatData.ProcData.CheckOffUCF ? pf.FormatData.ProcData.CheckOffData.CheckOffList.MaxIndex : pf.FormatData.ProcData.CheckOffData.CheckOffList.MaxIndexNoInherit;
// C2020-003 use the _CheckOffIndex dictionary to get and save the index of the selected checkoff from the sorted checkoff list
// B2020-039: Added the check for a valid selected index so that crash doesn't occur
if (ppGpbxSignoffCheckoff.Enabled && (chkoffList != null && maxindx > 1)
&& (ppCmbxCheckoffType.SelectedIndex > -1 && _CheckOffIndex[ppCmbxCheckoffType.SelectedIndex] != _SectionConfig.Section_CheckoffListSelection))
_SectionConfig.Section_CheckoffListSelection = _CheckOffIndex[ppCmbxCheckoffType.SelectedIndex];
if (ppCmbxCheckoffHeading.Enabled && chkoffHeaderList != null && chkoffHeaderList.MaxIndexNoInherit > 1)
_SectionConfig.Section_CheckoffHeaderSelection = ppCmbxCheckoffHeading.SelectedIndex;
if (ppCmbxSectPagination.SelectedValue == null)
_SectionConfig.Section_Pagination = (SectionConfig.SectionPagination)Enum.Parse(typeof(SectionConfig.SectionPagination), _DefaultPaginationStyle);
else
_SectionConfig.Section_Pagination = (SectionConfig.SectionPagination)ppCmbxSectPagination.SelectedValue;
_SectionConfig.MySection.MyContent.Config = _SectionConfig.ToString();
_SectionConfig.MySection.MyContent.DTS = DateTime.Now;
_SectionConfig.MySection.MyContent.UserID = Volian.Base.Library.VlnSettings.UserID;
Section mySection = _SectionConfig.MySection.Save();
SaveText(ppSectNumberStpRTB); // save the section number
SaveText(ppSectTitleStpRTB); // save the section title
FinishSectionSave(mySection); // this will also create an empty Word Doc if this is a word section
// B2018-126 & B2018-133: Refresh in case of library document usage change
if (_SectionConfig.MySection.MyContent.MyEntry != null && _SectionConfig.MySection.MyContent.MyEntry.MyDocument != null)
{
DocumentInfo docinfo = DocumentInfo.Get(_SectionConfig.MySection.MyContent.MyEntry.MyDocument.DocID);
docinfo.RefreshDocumentEntries();
}
// if there is a change to the format, clean up any overridden formats that point to the selected item before saving the format change:
// To determine a change to the format, first see if selection changed in list and then see if the format selected does not match
// what was set on procedure, if necessary resolve for an inherited format.
if (_SectionConfig.MySection.MySectionInfo.ActiveFormat != null &&
_SectionConfig.MySection.MySectionInfo.ActiveFormat.FormatID != _cmbxformatOriginal)
{
// clean up & then refresh the configs
using (ContentInfoList cil = ContentInfoList.ClearOverrideFormatsByItem(_SectionConfig.MySection.ItemID, _cmbxformatOriginal, _SectionConfig.MySection.MySectionInfo.ActiveFormat.FormatID))
{
foreach (ContentInfo ci in cil)
{
using (Content c = ci.Get())
{
// first refresh configs because the ContentInfo.Refresh causes events to occur that refresh screen
// and if configs aren't done first, the screen refresh, if based on config data, will not be correct.
foreach (ItemInfo ii in ci.ContentItems) ii.RefreshConfig();
ContentInfo.Refresh(c);
}
}
}
}
// if there was a document to delete, do it.
if (_DocumentToDelete != null)
{
Document.Delete(_DocumentToDelete.DocID);
_DocumentToDelete = null;
}
mySection.Dispose();
// B2019-002: if there is more than one default step section (probably from migrated data), and this section was updated to not
// be the default section, then reset the procedure's default section id.
if (_isDefaultStepSection && !ppCbDefaultStepSection.Checked)
{
// find first section in list that has originalsteps (flags a default section)
int defsctId = 0;
foreach (SectionInfo si in _SectionConfig.MySection.MySectionInfo.MyProcedure.Sections)
{
SectionConfig sc = si.MyConfig as SectionConfig;
if (si.ItemID != _SectionConfig.MySection.ItemID && sc != null && sc.Section_OriginalSteps == "Y")
{
defsctId = si.ItemID;
break;
}
}
if (defsctId != 0)
{
// also need to set the procedure's config sectionstart to the selected section
// if it is not set:
using (Procedure p = Procedure.Get(_SectionConfig.MySection.MySectionInfo.MyProcedure.ItemID))
{
if (p.ProcedureConfig.SectionStart != defsctId.ToString())
{
p.ProcedureConfig.SectionStart = defsctId.ToString();
p.Save();
ItemInfo.Refresh(p);
}
}
}
}
// if this section is now the 'DefaultStepSection', clear all others (only 1 section can have
// this property set - it is used when printing page numbers with 'WithSteps' numbering sequence.
else if (!_isDefaultStepSection && ppCbDefaultStepSection.Checked)
{
foreach (SectionInfo si in _SectionConfig.MySection.MySectionInfo.MyProcedure.Sections)
{
SectionConfig sc = si.MyConfig as SectionConfig;
if (si.ItemID != _SectionConfig.MySection.ItemID && sc != null && sc.Section_OriginalSteps == "Y")
{
using (Section ssav = si.Get())
{
ssav.SectionConfig.Section_OriginalSteps = "N";
ssav.Save();
ItemInfo.Refresh(ssav);
}
}
}
// also need to set the procedure's config sectionstart to the selected section
// if it is not set:
using (Procedure p = Procedure.Get(_SectionConfig.MySection.MySectionInfo.MyProcedure.ItemID))
{
if (p.ProcedureConfig.SectionStart != _SectionConfig.MySection.MySectionInfo.ItemID.ToString())
{
p.ProcedureConfig.SectionStart = _SectionConfig.MySection.MySectionInfo.ItemID.ToString();
p.Save();
ItemInfo.Refresh(p);
}
}
}
// Saving of enhanced data: Only need to save if the form_load determined that this may have enhanced & radio type
// boxes were enabled:
if (_isStepSection && checkEnhancedSettings && rbEnhLnkContents.Enabled)
{
// get string that should be used for "LnkEnh"
string type = rbEnhLnkTitle.Checked ? "T" : rbEnhLnkNo.Checked ? "N" : "Y";
if (_SectionConfig.Section_LnkEnh != type)
{
// note that the enhanced section will get created and linked from vlntreeview (to keep the code
// consistent between the way procedures and sections are done).
using (Section ssav = Section.Get(_SectionConfig.MySection.ItemID))
{
ssav.SectionConfig.Section_LnkEnh = type;
ssav.Save();
ItemInfo.Refresh(ssav);
}
}
}
this.DialogResult = DialogResult.OK;
this.Close();
}
public void SaveText(StepRTB myStepRTB)
{
if (myStepRTB.ReadOnly) return;
if (!myStepRTB.ActiveMode) return;
if (!myStepRTB.IsDirty && myStepRTB.Text.Contains("(Resolved Transition Text)") == false) return;
bool success = myStepRTB.OrigDisplayText.Save((RichTextBox)myStepRTB);
if (success)
{
myStepRTB.FindAllLinks();
myStepRTB.OrigRTF = myStepRTB.Rtf;
myStepRTB.ClearUndo();
}
}
//private static void FinishSectionSave(Section section)
private void FinishSectionSave(Section section)
{
ItemInfo sectinfo = ItemInfo.Get(section.ItemID);
// B2020-021: Clear MyDocStyle so that it will be re-read in code checking for auto TOC below
sectinfo.MyDocStyle = null;
// need to find out if this is a word document type section & if it is, create a new word doc.
bool isWordSect = true;
int sectype = (int)sectinfo.MyContent.Type - 10000;
PlantFormat pf = sectinfo.ActiveFormat.PlantFormat;
foreach (DocStyle ds in pf.DocStyles.DocStyleListActive)
{
if (ds.Index == sectype)
{
isWordSect = !ds.IsStepSection;
break;
}
}
if (isWordSect && !sectinfo.HasWordContent && !sectinfo.IsAutoTOCSection &&
(!sectinfo.IsPlacekeeperSection || (sectinfo.IsPlacekeeperSection && !ppCbPlaceKeeper.Checked)))
{
using (Content cont = Content.Get(sectinfo.MyContent.ContentID))
{
Byte[] tstbyte = System.Text.Encoding.Default.GetBytes("");
Document doc = Document.MakeDocument(null, tstbyte, null, null,".DOCX"); // RTF Caused B2016-196 Changed to DOCX for default
Entry entry = cont.MyEntry;
entry.MyDocument = Document.Get(doc.DocID);
cont.Save();
}
}
}
private void btnSectPropCancel_Click(object sender, EventArgs e)
{
_DocumentToDelete = null;
sectionConfigBindingSource.CancelEdit();
DialogResult = DialogResult.Cancel;
this.Close();
}
/// <summary>
/// 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.
/// </summary>
private void FindDefaultValues()
{
_SectionConfig.ParentLookup = true;
// Get the default format name
_DefaultFormatName = _SectionConfig.DefaultFormatSelection;
SetupDefault(_DefaultFormatName, ppLblFormatDefault, ppCmbxFormat);
//if (_DefaultFormatName != null && !(_DefaultFormatName.Equals("")))
//{
// string defName = string.Format("{0}", _DefaultFormatName);
// ppLblFormatDefault.Text = defName;
// ppCmbxFormat.WatermarkText = defName;
//}
SectionConfig.SectionColumnMode sc = _SectionConfig.Section_ColumnMode;
_DefaultNumColumns = sc.ToString();
SetupDefault(EnumDescConverter.GetEnumDescription(sc), ppLblDefaultNumColumns, ppCmbxNumColumns);
SectionConfig.SectionPagination sp = _SectionConfig.Section_Pagination;
//Console.WriteLine("{0}, {1}, default pagination", _SectionConfig.MySection.DisplayNumber, sp);
_DefaultPaginationStyle = sp.ToString();
SetupDefault(EnumDescConverter.GetEnumDescription(sp), ppLblDefPaginationStyle, ppCmbxSectPagination);
//_DefaultPrintSize = _SectionConfig.Section_AttachmentPrintSize.ToString();
//SetupDefault(EnumDescConverter.GetEnumDescription(_SectionConfig.Section_AttachmentPrintSize), ppLblDefaultPrintSize, ppCmbxAccPgPrintSize);
_SectionConfig.ParentLookup = false;
}
/// <summary>
/// Set the watermark and default label
/// </summary>
/// <param name="defaultText">The default text</param>
/// <param name="lbl">Label that displays the current default when view defaults is set</param>
/// <param name="cmboEx">Combo box with a watermark property</param>
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;
}
}
private bool checkEnhancedSettings = false;
private int? _cmbxformatOriginal = null;
private void frmSectionProperties_Load(object sender, EventArgs e)
{
_Initializing = true;
sectionConfigBindingSource.DataSource = _SectionConfig;
ppCmbxFormat.DataSource = null;
ppCmbxFormat.DisplayMember = "FullName";
ppCmbxFormat.ValueMember = "FullName";
ppCmbxFormat.DataSource = FormatUtility.GetFilteredFormatList(FormatInfoList.SortedFormatInfoList);
if (_SectionConfig.MySection.MySectionInfo.ActiveFormat != null) _cmbxformatOriginal = (int)_SectionConfig.MySection.MySectionInfo.ActiveFormat.FormatID;
if (_SectionConfig.FormatSelection != null)
ppCmbxFormat.SelectedValue = _SectionConfig.FormatSelection;
else
ppCmbxFormat.SelectedIndex = -1;
// Get the saved settings for this user
//
// Get setting telling us whether to display the default values on this property page
ppCbShwDefSettings.Checked = (Settings.Default["ShowDefaultSectionProp"] != null) ? Settings.Default.ShowDefaultSectionProp : false;
// 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)
{
tcSectionProp.TabsVisible = true;
panSectBtns.Visible = false;
this.Width -= panSectBtns.Width;
}
// Get the default values for the property page information
FindDefaultValues();
ppCmbxSectPagination.DataSource = EnumDetail<SectionConfig.SectionPagination>.Details();
ppCmbxSectPagination.DisplayMember = "Description";
ppCmbxSectPagination.SelectedValueChanged -= new EventHandler(ppCmbxSectPagination_SelectedValueChanged);
ppCmbxSectPagination.ValueMember = "EValue";
ppCmbxSectPagination.SelectedIndex = -1;
SectionConfig.SectionPagination sp = _SectionConfig.Section_Pagination;
if (!(sp.ToString().Equals(_DefaultPaginationStyle)) && _isStepSection)
{
ppBtnDefaultPaginationStyle.Visible = true;
ppCmbxSectPagination.SelectedValue = sp;
}
else
ppBtnDefaultPaginationStyle.Visible = false;
//Console.WriteLine("{0}, {1}, current pagination", _SectionConfig.MySection.DisplayNumber, ppCmbxSectPagination.SelectedValue);
ppCmbxSectPagination.SelectedValueChanged += new EventHandler(ppCmbxSectPagination_SelectedValueChanged);
ppCmbxNumColumns.DataSource = EnumDetail<SectionConfig.SectionColumnMode>.Details();
ppCmbxNumColumns.DisplayMember = "Description";
ppCmbxNumColumns.SelectedValueChanged -= new EventHandler(ppCmbxNumColumns_SelectedValueChanged);
ppCmbxNumColumns.ValueMember = "EValue";
ppCmbxNumColumns.SelectedIndex = -1;
SectionConfig.SectionColumnMode sc = _SectionConfig.Section_ColumnMode;
if (!(sc.ToString().Equals(_DefaultNumColumns)) && _isStepSection)
{
ppBtnDefaultNumColumns.Visible = true;
ppCmbxNumColumns.SelectedValue = sc;
}
else
ppBtnDefaultNumColumns.Visible = false;
ppCmbxNumColumns.SelectedValueChanged += new EventHandler(ppCmbxNumColumns_SelectedValueChanged);
//ppCmbxAccPgPrintSize.DataSource = EnumDetail<SectionConfig.AttPrintSize>.Details();
//ppCmbxAccPgPrintSize.DisplayMember = "Description";
//ppCmbxAccPgPrintSize.ValueMember = "Evalue";
//ppCmbxAccPgPrintSize.SelectedIndex = -1;
if (!_isStepSection)
ppCmbxLibDocFill();
// check type of section from document styles to determine if the stepsection checkbox should
// be checked.
//int secindx = (int)_SectionConfig.SectionType;
//// find the index for the document style to determine whether this is a step or word section.
PlantFormat pf = _SectionConfig.MyFormat != null ? _SectionConfig.MyFormat.PlantFormat : _SectionConfig.MyDefaultFormat.PlantFormat;
//for (int i = 0; i < pf.DocStyles.DocStyleList.Count; i++)
//{
// if (pf.DocStyles.DocStyleList[i].Index == secindx)
// rbStepSect.Checked = pf.DocStyles.DocStyleList[i].IsStepSection; _SectionConfig.MySection.
//}
// set the StepSect radio button based on _isStepSection to ensure the proper section types are available
rbStepSect.Checked = _isStepSection;
// set up some of the format tab:
SetupPpCmbxSectionType();
ShowAvailableOptionsForSectionType();
// set the section level configs:
ppCbEditableData.Checked = (_SectionConfig.SubSection_Edit == "Y");
ppCbAutoIndent.Checked = (pf.FormatData.SectData.UseMetaSections && _SectionConfig.SubSection_AutoIndent == "Y");
// if this section has subsections:
// show the editable data check box. If showing 'editable data', the procedures steps are
// shown in editor (tree view & editor) & printed before any subsections. If not showing
// 'editable data', the steps are not shown in editor or print.
// show the automatic indent checkbox.
ppCbEditableData.Enabled = _SectionConfig.MySection.MySectionInfo.Sections != null && _SectionConfig.MySection.MySectionInfo.Sections.Count > 0;
ppCbEditableData.Visible = _isStepSection; // only display if we are on a step editor section
//ppCbAutoIndent.Enabled = _SectionConfig.MySection.MySectionInfo.Sections != null && _SectionConfig.MySection.MySectionInfo.Sections.Count > 0;
ppCbAutoIndent.Enabled = pf.FormatData.SectData.UseMetaSections;
ppCbAutoIndent.Visible = _isStepSection; // only display if we are on a step editor section
// Check for the print section num/title config item to determine whether that checkbox should
// be checked.
ppCbPrnSecNumTitle.Enabled = _isStepSection;//true; // pf.FormatData.SectData.UseMetaSections;
//ppCbPrnSecNumTitle.Checked = ppCbPrnSecNumTitle.Enabled && _SectionConfig.Section_PrintHdr != "N";
ppCbPrnSecNumTitle.Checked = (_isStepSection && _SectionConfig.Section_PrintHdr != "N");
ppCbPrnSecNumTitle.Visible = _isStepSection; // only display if we are on a step editor section
// check if format has automated table of contents, if so, check if config flag is set that this
// section should be included.
ppCbIncTOC.Enabled = false;
gpTOC.Visible = false;
if ((pf.FormatData.PurchaseOptions & E_PurchaseOptions.AutoTableOfContents) == E_PurchaseOptions.AutoTableOfContents && _SectionConfig.MySection.MyContent.Text.ToUpper() != "TABLE OF CONTENTS")
{
ppCbIncTOC.Enabled = true;
ppCbIncTOC.Checked = _SectionConfig.Section_TOC == "Y";
if (_SectionConfig.MySection.MySectionInfo.MyDocStyle.IncludeInTOC)
{
ppCbIncTOC.Text = "Exclude from Table of Contents";
gpTOC.Visible = !ppCbIncTOC.Checked; // show grouping box if including on auto TOC
}
else
{
ppCbIncTOC.Text = "Include in Table of Contents";
gpTOC.Visible = ppCbIncTOC.Checked; // show grouping box if including on auto TOC
}
}
if (!_SectionConfig.MySection.MySectionInfo.IsStepSection)
cbKeepWordDocMargins.Checked = _SectionConfig.Section_WordMargin == "Y";
if ((pf.FormatData.PurchaseOptions & E_PurchaseOptions.AutoPlacekeeper) == E_PurchaseOptions.AutoPlacekeeper)
{
ppCbPlaceKeeper.Text = "Include In Placekeeper";
ppCbPlaceKeeper.Enabled = _isStepSection;
if (!_isStepSection && (_SectionConfig.MySection.MySectionInfo.MyDocStyle.StructureStyle.Style & E_DocStructStyle.Placekeeper) == E_DocStructStyle.Placekeeper)
{
//ppCbPlaceKeeper.Text = "Auto Generate Placekeeper";
//ppCbPlaceKeeper.Enabled = true;
ppCbPlaceKeeper.Enabled = false;
}
if (ppCbPlaceKeeper.Enabled) ppCbPlaceKeeper.Checked = _SectionConfig.Section_Placekeeper == "Y";
}
if (pf.FormatData.SectData.PrintPhoneList)
{
ppCbPhoneList.Enabled = true;
ppCbPhoneList.Checked = _SectionConfig.Section_PhoneList == "Y";
}
// Handle Default Step Section. First, this checkbox is only visible if it is
// a step section & it is the highest level (top, right below procedures).
ppCbDefaultStepSection.Visible = false;
if (_isStepSection && _SectionConfig.MySection.MySectionInfo.MyActiveParent.IsProcedure) // B2016-280 - use MyActiveParent because MyParent was sometimes null
{
ppCbDefaultStepSection.Visible = true;
ppCbDefaultStepSection.Checked = _SectionConfig.Section_OriginalSteps == "Y";
// Use checkbox text to clarify what is case for this section, i.e. is it already
// the default or can it be set. Note that this is used when printing of page numbers
// that use the 'WithSteps' numbering sequence.
if (_SectionConfig.Section_OriginalSteps == "Y")
{
ppCbDefaultStepSection.Text = "This is the Default Step Section"; // C2020-021 add the word "the"
_isDefaultStepSection = true;
}
else
ppCbDefaultStepSection.Text = "Make this the Default Step Section";
}
// Show Replace Words
ppCbShowRplWords.Visible = false;
if (_isStepSection && _SectionConfig.MySection.MySectionInfo.MyActiveParent.IsProcedure)
{
ppCbShowRplWords.Visible = true;
ppCbShowRplWords.Checked = _SectionConfig.Section_ShwRplWords == "Y";
// Use checkbox text to clarify what is case for this section, i.e. is it already
// the default or can it be set. Note that this is used when printing of page numbers
// that use the 'WithSteps' numbering sequence.
if (_SectionConfig.Section_OriginalSteps == "Y")
{
ppCbShowRplWords.Text = "Show Replace Words"; // C2020-021 add the word "the"
_isDefaultStepSection = true;
}
else
ppCbShowRplWords.Text = "Show Replace Words";
}
// if the parent has enhanced documents (and is not an enhanced document, i.e. the test
// ed.Type != 0 proves that) put up the group panel on the automation tab that allows for setting of
// link types (none, title only, content). The radio buttons are only enabled if the section is
// NEW (determined by the 'LnkEnh' being empty).
if (_isStepSection)
{
ProcedureInfo pi = ProcedureInfo.Get(_SectionConfig.MySection.MySectionInfo.MyProcedure.ItemID);
ProcedureConfig picfg = pi.MyConfig as ProcedureConfig;
bool hasEnh = false;
if (picfg.MyEnhancedDocuments != null && picfg.MyEnhancedDocuments.Count > 0)
{
foreach (EnhancedDocument ed in picfg.MyEnhancedDocuments)
{
if (ed.Type != 0)
{
checkEnhancedSettings = true;
hasEnh = true;
break;
}
}
if (hasEnh)
{
grpLnkEnh.Visible = true;
if (_SectionConfig.Section_LnkEnh == null || _SectionConfig.Section_LnkEnh == "" || _SectionConfig.Section_LnkEnh == "Y")
rbEnhLnkContents.Checked = true;
else if (_SectionConfig.Section_LnkEnh == "N")
rbEnhLnkNo.Checked = true;
else // "T" for title:
rbEnhLnkTitle.Checked = true;
rbEnhLnkContents.Enabled = rbEnhLnkNo.Enabled = rbEnhLnkTitle.Enabled = (_SectionConfig.Section_LnkEnh == null || _SectionConfig.Section_LnkEnh == "");
}
else
grpLnkEnh.Visible = false;
}
else
grpLnkEnh.Visible = false;
}
else
{
// for word docs, no enhanced controls should be visible:
grpLnkEnh.Visible = false;
ppCbNoDuplexFoldout.Visible = true; // B2019-165 make visible the checkbox to turn off duplex foldout for Word sections
}
//C2019-042 a section cannot be a foldout section and the default step section
cbIsFoldoutSection.Checked = _SectionConfig.Section_IsFoldout == "Y";
cbIsFoldoutSection.Enabled = !_isDefaultStepSection;
// B2019-165 check box to turn off adding duplex foldout on back of last Word doc page that does not include foldouts (Byron/Braidwood 11x14 cover/continuous action page
ppCbNoDuplexFoldout.Checked = _SectionConfig.Section_DontIncludeDuplexFoldout;
_Initializing = false;
//_InitialIndex = ppCmbxFormat.SelectedIndex;
}
int _InitialIndex = -2;
private void ppCmbxLibDocFill()
{
bool sav_Initializing = _Initializing;
_Initializing = true;
bool isLib = false;
// Only show the Convert To DocX button for non-library MS Word Sections
if (_SectionConfig.MySection.MyContent.MyEntry!=null && _SectionConfig.MySection.MyContent.MyEntry.MyDocument!=null && (_SectionConfig.MySection.MyContent.MyEntry.MyDocument.LibTitle != null) && (_SectionConfig.MySection.MyContent.MyEntry.MyDocument.LibTitle != "")) isLib = true;
if (isLib)
{
ppBtnConvertToDocX.Visible = false; // Don't allow save as DOCX for libraries documents
ppBtnCvrtToLibDoc.Text = "Convert this Section To A Non-Library Document";
lblLibraryDocument.Text = "Library Document";
superTooltip1.SetSuperTooltip(this.ppBtnCvrtToLibDoc, new DevComponents.DotNetBar.SuperTooltipInfo("Convert To Non-Library Document", "", "This button will convert the current section from a library document to a non-library document",
null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, false, new System.Drawing.Size(250, 76)));
}
else
{
// Only show the Convert To DocX button for RTF MS Word Sections
if (_SectionConfig.MySection.MyContent.MyEntry.MyDocument != null && _SectionConfig.MySection.MyContent.MyEntry.MyDocument.FileExtension == ".RTF")
{
ItemInfo ii = ItemInfo.Get(_SectionConfig.MySection.ItemID);
if (!ii.IsAutoTOCSection) // Only show the Convert To DocX button for non-Auto Table Of Contents Section
this.ppBtnConvertToDocX.Visible = true; // Only allow save as DocX for normal word sections when the existing text is RTF.
}
else
this.ppBtnConvertToDocX.Visible = false;
if (_SectionConfig.MySection.MyContent.MyEntry.MyDocument == null)
ppBtnCvrtToLibDoc.Visible = false;
else
{
ppBtnCvrtToLibDoc.Text = "Convert this to a Library Document";
lblLibraryDocument.Text = "Select Library Document";
superTooltip1.SetSuperTooltip(this.ppBtnCvrtToLibDoc, new DevComponents.DotNetBar.SuperTooltipInfo("Convert To Library Document button", "", "This button will convert the current section to a library document, allowing it t" +
"o be shared with other procedures.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, false, new System.Drawing.Size(250, 76)));
}
}
DocumentInfoList LibDocList = DocumentInfoList.GetLibraries(true);
int selindx = -1;
ppCmbxLibDoc.Items.Clear();
for (int i = 0; i < LibDocList.Count; i++)
{
ppCmbxLibDoc.Items.Add(LibDocList[i].DocumentTitle);
// see if this lib doc should be the selected index?
if (isLib && (LibDocList[i].DocID == _SectionConfig.MySection.MyContent.MyEntry.MyDocument.DocID)) selindx = i;
}
if (selindx > -1) ppCmbxLibDoc.SelectedIndex = selindx;
_Initializing = sav_Initializing;
}
#region General tab
/// <summary>
/// This is the General button used on the button interface design
/// </summary>
/// <param name="sender">object</param>
/// <param name="e">EventArgs</param>
private void btnGeneral_Click(object sender, EventArgs e)
{
ProcessButtonClick(tiGeneral, btnGeneral);
}
#endregion
#region Format tab
/// <summary>
/// This is the Format button used on the button interface design
/// </summary>
/// <param name="sender">object</param>
/// <param name="e">EventArgs</param>
private void btnFormat_Click(object sender, EventArgs e)
{
ProcessButtonClick(tiFormat, btnFormat);
if (_InitialIndex < -1) _InitialIndex = ppCmbxFormat.SelectedIndex; // save the current format selection (happens here when current section is set to the default format)
}
private void SetupPpCmbxSectionType()
{
bool myInit = _Initializing;
// pf will be the current selected format. If changing formats, then this will differ from the previously
// selected. If the format is being reset to default, selectedindex=-1. If this is a change, we'll need
// to check that there are enough docstyles to map the selected type of section.
PlantFormat pf = _SectionConfig.MyFormat != null ? _SectionConfig.MyFormat.PlantFormat : _SectionConfig.MyDefaultFormat.PlantFormat;
if (!_Initializing && ppCmbxFormat.SelectedIndex >= 0)
pf = FormatInfoList.SortedFormatInfoList[ppCmbxFormat.SelectedIndex].PlantFormat;
else if (!_Initializing) // if the format was changed, it may have been set to default.
pf = _SectionConfig.MyDefaultFormat.PlantFormat;
_Initializing = true;
ppCmbxStyleSectionType.DisplayMember = "Name";
ppCmbxStyleSectionType.ValueMember = "Index";
// if this has been defined as a step section, only list step section document styles, if
// a word section, only list word section styles.
// Also, if changing the format, check to be sure that the section that is selected will map
// to something valid in the new format, i.e. a section type of word or step sections exist,
// index-wise in the new format.
PlantFormat opf = null;
int oldSelIndx = -1;
if (!myInit)
{
DocStyleList oldDocStyles = null;
opf = _SectionConfig.MyFormat != null ? _SectionConfig.MyFormat.PlantFormat : _SectionConfig.MyDefaultFormat.PlantFormat;
if (pf != opf)
{
oldDocStyles = new DocStyleList(null);
foreach (DocStyle ds in opf.DocStyles.DocStyleListActive)
{
if (_isStepSection && ds.IsStepSection)
oldDocStyles.Add(ds); // find only step section types
else if (!_isStepSection && !ds.IsStepSection)
oldDocStyles.Add(ds); // find only accessory (MS Word) section types
if (_SectionConfig.SectionType == ds.Index) oldSelIndx = oldDocStyles.Count - 1;
}
}
if (oldSelIndx < 0) oldSelIndx = 0;
}
DocStyleList newDocStyles = new DocStyleList(null);
int selindx = -1;
foreach (DocStyle nds in pf.DocStyles.DocStyleListActive)
{
if (_isStepSection && nds.IsStepSection)
newDocStyles.Add(nds); // add only step section types
else if (!_isStepSection && !nds.IsStepSection)
newDocStyles.Add(nds); // add only accessory (MS Word) section types
if (_SectionConfig.SectionType == nds.Index) selindx = newDocStyles.Count - 1;
}
if (selindx < 0) selindx = 0;
// if changing format, check for valid type (see comment above)
if (!myInit && pf != opf)
{
if (newDocStyles.Count == 0)
{
string msg1 = string.Format("A Page Style for the type of section, {0}, is not available in the new format. You cannot do this operation.", _isStepSection? "Step Section": "Word Document");
MessageBox.Show(msg1, "Cannot change to this format");
return;
}
if (oldSelIndx > newDocStyles.Count)
{
string msg = string.Format("Since the format has been changed, the section type was also changed to '{0}'. Verify that it is appropriate and if not, select a new section type.", newDocStyles.GetDocStyleItem(0).Name);
MessageBox.Show(msg, "Verify section type");
selindx = 0;
}
}
ppCmbxStyleSectionType.DataSource = newDocStyles;
if (newDocStyles.Count > 0)
ppCmbxStyleSectionType.SelectedIndex = selindx;
ppCmbxStyleSectionType.Refresh();
ppBtnConvertToDocX.Visible = false;// Set the Convert To DocX button to invisible by default
if (!_isStepSection)
ppCmbxLibDocFill(); // set the Convert To DocX button to Visible if appropriate
_Initializing = myInit;
if (_isStepSection)
SetupCheckoffsDropdowns();
}
// C2020-003 This is used to sort the checkoff list from the format file
// if the checkoff has an OrderBy element, then use it for the sorting, otherwise use th checkoff Index element
private static int CompareCheckoffUsingOrderBy(CheckOff ckf1, CheckOff ckf2)
{
if (ckf1.OrderBy == null)
{
if (ckf2.OrderBy == null) // neither ckf1 nor ckf2 uses OrderBy index
{
if (ckf1.Index > ckf2.Index) return 1; //ckf1 goes before ckf2
if (ckf1.Index < ckf2.Index) return -1; // ckf1 goes after ckf2
return 0; //ckf1 and ckf2 have the same index value
}
else // ckf1 does not have OrderBy index but ckf2 has OrderBy index
{
if (ckf1.Index > ckf2.OrderBy) return 1; //ckf1 goes before ckf2
if (ckf1.Index < ckf2.OrderBy) return -1; // ckf1 goes after ckf2
return 0; //ckf1 and ckf2 have the same index value
}
}
else //ckf1 has orderBy
{
if (ckf2.OrderBy == null) // ckf1 has OrderBy index but ckf2 does not
{
if (ckf1.OrderBy > ckf2.Index) return 1; //ckf1 goes before ckf2
if (ckf1.OrderBy < ckf2.Index) return -1; // ckf1 goes after ckf2
return 0; //ckf1 and ckf2 have the same index value
}
else // both ckf1 and ckf2 has OrderBy index
{
if (ckf1.OrderBy > ckf2.OrderBy) return 1; //ckf1 goes before ckf2
if (ckf2.OrderBy > ckf1.OrderBy) return -1; // ckf1 goes after ckf2
return 0; //ckf1 and ckf2 have the same index value
}
}
}
private List<CheckOff> SectionPropertyCheckOffList = null;
private Dictionary<int, int> _CheckOffIndex = new Dictionary<int, int>(); // C2020-003 translate the sorted index number to the actual checkoff index
private void SetupCheckoffsDropdowns()
{
if (!_isStepSection) return; // not needed for accessory pages (word attachments)
bool myInit = _Initializing;
_Initializing = true;
PlantFormat pf = _SectionConfig.MyFormat!=null?_SectionConfig.MyFormat.PlantFormat:_SectionConfig.MyDefaultFormat.PlantFormat;
CheckOffList chkoffList = pf.FormatData.ProcData.CheckOffData.CheckOffList;
if (chkoffList != null) chkoffList.Sort(CompareCheckoffUsingOrderBy); // C2020-003 sort the checkoff list via the Index and/or OrderBy elements
CheckOffHeaderList chkoffHeaderList = pf.FormatData.ProcData.CheckOffData.CheckOffHeaderList;
int maxindx = pf.FormatData.ProcData.CheckOffUCF ? pf.FormatData.ProcData.CheckOffData.CheckOffList.MaxIndex : pf.FormatData.ProcData.CheckOffData.CheckOffList.MaxIndexNoInherit;
// B2019-013: was crashing on indexer of checkofflist. If there were UCF checkoffs but none in original format, the indexer
// was failing for index of 0 (indexer code went through index attribute of xml and was returning null even though there
// were items in list).
_hasSectionCheckoffDefault = false;
if (chkoffList != null)
{
foreach (CheckOff co in chkoffList)
{
if (co.MenuItem.ToUpper().Equals("{SECTION DEFAULT}"))
{
_hasSectionCheckoffDefault = true;
break;
}
}
}
if (chkoffList != null && maxindx > 0 &&
(pf.FormatData.ProcData.CheckOffData.Menu == "Signoff") || _hasSectionCheckoffDefault)
{
if (SectionPropertyCheckOffList!=null)SectionPropertyCheckOffList.Clear();
SectionPropertyCheckOffList = new List<CheckOff>();
// Don't put up the first item in the chkoffList, it is '{Section Default}'.
//for (int i = 1; i < chkoffList.Count; i++)
int idxcnt = 0;
int translatedCfgIdx = 0;
_CheckOffIndex.Clear();
foreach (CheckOff co in chkoffList)
{
if (!co.MenuItem.ToUpper().Equals("{SECTION DEFAULT}"))
{
SectionPropertyCheckOffList.Add(co);
_CheckOffIndex.Add(idxcnt, (int)co.Index); // C2020-003 dictionary of sorted indexes to format checkoff Index element
if (_SectionConfig.Section_CheckoffListSelection == co.Index)
translatedCfgIdx = idxcnt; // C2020-003 translate the previous checkoff select to the sorted checkoff list position
idxcnt++;
}
}
ppGpbxSignoffCheckoff.Enabled = true;
ppCmbxCheckoffType.DataSource = SectionPropertyCheckOffList;
ppCmbxCheckoffType.SelectedIndex = translatedCfgIdx; // C2020-003 save the actual checkoff index
}
else
{
ppGpbxSignoffCheckoff.Enabled = false;
}
if (chkoffHeaderList != null && chkoffHeaderList.MaxIndex > 1)
{
lblCheckoffHeading.Enabled = true;
ppCmbxCheckoffHeading.Enabled = true;
ppCmbxCheckoffHeading.DataSource = chkoffHeaderList;
// B2019-100: the checkoffselection may be larger than number in the list if elements of list were made inactive from UCF. Adjust as necessary:
if (_SectionConfig.Section_CheckoffHeaderSelection >= ppCmbxCheckoffHeading.Items.Count)
ppCmbxCheckoffHeading.SelectedIndex = -1;
else
ppCmbxCheckoffHeading.SelectedIndex = _SectionConfig.Section_CheckoffHeaderSelection;
}
else
{
lblCheckoffHeading.Enabled = false;
ppCmbxCheckoffHeading.Enabled = false;
}
_Initializing = myInit;
}
private void ppBtnDefaultFmt_Click(object sender, EventArgs e)
{
bool foundMatch = false;
bool isWordSection = rbWordSect.Checked;
FormatInfo dfi = _SectionConfig.MyDefaultFormat;
// check to see if the default format has a similar document style
// if it does not, then do not allow the selection of the default format
foreach (DocStyle ds in dfi.PlantFormat.DocStyles.DocStyleList)
{
if (ds.IsStepSection != isWordSection) foundMatch = true;
}
if (foundMatch)
{
_Initializing = true;
ppCmbxFormat.SelectedIndex = -1; //reset to the default Format setting
_Initializing = false;
SetupPpCmbxSectionType();
}
else
{
string suffix = "format ";
if (_DefaultFormatName.ToUpper().Contains("FORMAT")) suffix = "";
MessageBox.Show(string.Format("{0}\n\n{1}does not support {2} section type", _DefaultFormatName, suffix, isWordSection ? "MS Word" : "Step"), "Incompatible Format", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
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) // B2017-016 selectedindex of -1 means the default format was selected
{
PlantFormat pf = FormatInfoList.SortedFormatInfoList[ppCmbxFormat.SelectedIndex].PlantFormat;
// If the selected format does not have a docstyle compatable with the section
// then reset the format selection back to what it was
if (!ValidPlantFormat(pf))
{
_Initializing = true;
ppCmbxFormat.SelectedIndex = _InitialIndex; // reset the format selection to what it was
ppBtnCancel.Focus(); // this will force the property page to refresh
_Initializing = false;
return;
}
}
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;
//if (!didDefault) SetupPpCmbxSectionType();
SetupPpCmbxSectionType();
// B2017-272 disable/enable the Steps and Word radio buttons based on the section types defined in the format
// and the type of an existing section or if we are creating a new section.
CheckAvaibleSectionTypes();
}
// This function is used when the user selects different format for a give section.
// It will verify that the newly selected format contains a document style (docstyle)
// compatable with the that section. (i.e. if the section is a Word section, the selected format has Word section docstyle)
private bool ValidPlantFormat(PlantFormat pf)
{
bool foundMatch = false;
bool isWordSection = rbWordSect.Checked;
foreach (DocStyle ds in pf.DocStyles.DocStyleList)
{
if (ds.IsStepSection != isWordSection) foundMatch = true;
}
if (foundMatch)
return true; // valid format
string suffix = "format ";
if (ppCmbxFormat.SelectedValue.ToString().ToUpper().Contains("FORMAT")) suffix = "";
MessageBox.Show(string.Format("{0}\n\n{1}does not support {2} section type", ppCmbxFormat.SelectedValue, suffix, isWordSection ? "MS Word" : "Step"), "Incompatible Format", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
private void ppCmbxStyleSectionType_SelectedValueChanged(object sender, EventArgs e)
{
if (_Initializing) return;
if (ppCmbxStyleSectionType.SelectedValue != null)
_SectionConfig.SectionType = (int)(ppCmbxStyleSectionType.SelectedValue);
}
#endregion
#region Library Document tab
/// <summary>
/// This is the Library Document button used on the button interface design
/// </summary>
/// <param name="sender">object</param>
/// <param name="e">EventArgs</param>
private void btnLibDocs_Click(object sender, EventArgs e)
{
ProcessButtonClick(tiLibDoc, btnLibDocs);
}
private void ppBtnCvrtToLibDoc_Click(object sender, EventArgs e)
{
// Double Check that this is not a step section, if so just return.
if (_isStepSection) return;
// If current section is library document, user selected to convert to non-library document. If
// this is the case, data from lib doc must be copied to new document and the section must point
// to id.
if (ppBtnCvrtToLibDoc.Text.IndexOf("Non") > 0) // convert to a 'non' library.
{
ItemInfo ii = ItemInfo.Get(_SectionConfig.MySection.ItemID);
DocumentInfo doclibinfo = ii.MyContent.MyEntry.MyDocument;
doclibinfo.RefreshDocumentEntries(); // B2018-126 & B2018-133: Refresh for library document usage change
// if just one usage (this one), then just convert this to a non-library document. If there are more
// than one usage, make a copy so that the rest of the usages still point to the library document.
if (doclibinfo.DocumentEntryCount == 1)
_SectionConfig.MySection.MyContent.MyEntry.MyDocument.LibTitle = null;
else
{
// make new document with 'no' libtitle - use libtitle for the doc title. Then link this
// to the item...
Document doc = Document.MakeDocument(null, doclibinfo.DocContent, doclibinfo.DocAscii, doclibinfo.Config,doclibinfo.FileExtension);
_SectionConfig.MySection.MyContent.MyEntry.MyDocument = doc;
}
// B2018-126 & B2018-133: Refresh for library document usage change
_SectionConfig.MySection.MyContent.MyEntry.MyDocument.Save();
DocumentInfo docinfo = DocumentInfo.Get(_SectionConfig.MySection.MyContent.MyEntry.MyDocument.DocID);
docinfo.RefreshDocumentEntries();
ppCmbxLibDoc.Items.Clear();
ppCmbxLibDoc.WatermarkEnabled = true;
ppBtnCvrtToLibDoc.Text = "Convert this to a Library Document";
superTooltip1.SetSuperTooltip(this.ppBtnCvrtToLibDoc, new DevComponents.DotNetBar.SuperTooltipInfo("Convert To Library Document button", "", "This button will convert the current section to a library document, allowing it t" +
"o be shared with other procedures.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, false, new System.Drawing.Size(250, 76)));
return;
}
// If current section is not a library document, it is either a new section or the user selected the
// button to convert it to a library document. Check for this, if new, just attach to document.
else if (_SectionConfig.MySection.MyContent.MyEntry.MyDocument == null)
{
// if nothing was selected, give message & return
if (ppCmbxLibDoc.SelectedIndex == -1)
{
MessageBox.Show("Must select a library document");
return;
}
int docid = -1;
DocumentInfoList LibDocList = DocumentInfoList.GetLibraries(true);
for (int i = 0; i < LibDocList.Count; i++)
{
if (LibDocList[i].LibTitle == (string)ppCmbxLibDoc.Items[ppCmbxLibDoc.SelectedIndex])
{
docid = LibDocList[i].DocID;
break;
}
}
if (docid == -1) return;
using (Document dc = Document.Get(docid))
{
_SectionConfig.MySection.MyContent.MyEntry.MyDocument = dc;
}
}
else
// if converting to library document, just put 'text' into the 'LibTitle' property (that's what flags
// it to be a library document.
{
_SectionConfig.MySection.MyContent.MyEntry.MyDocument.LibTitle = _SectionConfig.MySection.MyContent.Text;
// Save now so that it shows up in the library document list in the ppcmbxlibdoc (combo box
// listing lib docs that is regenerated in ppCmbxLibDocFill)
_SectionConfig.MySection.MyContent.MyEntry.MyDocument.Save();
ppCmbxLibDocFill();
ppCmbxLibDoc.Enabled = false;
}
ppBtnCvrtToLibDoc.Text = "Convert this Section To A Non-Library Document";
lblLibraryDocument.Text = "Library Document";
superTooltip1.SetSuperTooltip(this.ppBtnCvrtToLibDoc, new DevComponents.DotNetBar.SuperTooltipInfo("Convert To Non-Library Document", "", "This button will convert the current section from a library document to a non-library document",
null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, false, new System.Drawing.Size(250, 76)));
}
private void ppCmbxLibDoc_SelectedIndexChanged(object sender, EventArgs e)
{
if (_Initializing) return;
// first check if this is a 'new' section - if so, then just return.
if (_SectionConfig.MySection.MyContent.MyEntry == null) return;
// see if this was NOT a library document. If it is not a library document, ask the user if
// it should be linked, thus losing the original text/data.
if (_SectionConfig.MySection.MyContent.MyEntry.MyDocument != null && !(_SectionConfig.MySection.MyContent.MyEntry.MyDocument.LibTitle != ""))
{
_SectionConfig.MySection.MyContent.MyEntry.MyDocument = Document.New();
if (ppCmbxLibDoc.SelectedIndex > -1)
{
if (MessageBox.Show("Linking to this library document will cause loss of data to this section. Do you want to continue?", "Link", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
_DocumentToDelete = _SectionConfig.MySection.MyContent.MyEntry.MyDocument;
DocumentInfoList LibDocList = DocumentInfoList.GetLibraries(true);
_SectionConfig.MySection.MyContent.MyEntry.MyDocument = Document.Get(LibDocList[ppCmbxLibDoc.SelectedIndex].DocID);
ppBtnCvrtToLibDoc.Enabled = true;
}
else
{
ppCmbxLibDoc.SelectedIndex = -1;
ppBtnCvrtToLibDoc.Enabled = false;
}
}
}
//else if (_SectionConfig.MySection.MyContent.MyEntry.MyDocument == null)
//{
// // was creating a new document & selected to connect it to a libdoc
// _DocumentToDelete = _SectionConfig.MySection.MyContent.MyEntry.MyDocument;
//}
else
{
// it already is a library document, just change usages...
DocumentInfoList LibDocList = DocumentInfoList.GetLibraries(true);
if (ppCmbxLibDoc.SelectedIndex >= 0 && ppCmbxLibDoc.SelectedIndex < LibDocList.Count)
{
_SectionConfig.MySection.MyContent.MyEntry.MyDocument = Document.Get(LibDocList[ppCmbxLibDoc.SelectedIndex].DocID);
ppBtnCvrtToLibDoc.Enabled = true;
}
else
{
throw new Exception(string.Format("Index Out Of Range Index = {0}, Count = {1}", ppCmbxLibDoc.SelectedIndex, LibDocList.Count));
}
}
}
#endregion
#region View Settings tab
/// <summary>
/// This is the View Settings button used on the button interface design
/// </summary>
/// <param name="sender">object</param>
/// <param name="e">EventArgs</param>
private void btnAutomation_Click(object sender, EventArgs e)
{
ProcessButtonClick(tiAutomation, btnAutomation);
}
#endregion
#region Generic functions used on this property page
/// <summary>
/// Determines what labels (showing default values) are visable on the property pages
/// </summary>
private void defaultSettingsVisiblity()
{
//ItemInfo ii = ItemInfo.Get(_SectionConfig.MySection.ItemID);
ppLblDefSettingsInfo.Visible = ppCbShwDefSettings.Checked;
ppLblFormatDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefaultFmt.Visible;
ppLblDefaultNumColumns.Visible = _isStepSection && ppCbShwDefSettings.Checked && ppBtnDefaultNumColumns.Visible;
ppBtnDefaultNumColumns.Visible = _isStepSection && ppBtnDefaultNumColumns.Visible; // bug fix B2016-241 something was sometimes setting this to true for Word sections
ppLblDefPaginationStyle.Visible = _isStepSection && ppCbShwDefSettings.Checked && ppBtnDefaultPaginationStyle.Visible;
ppBtnDefaultPaginationStyle.Visible = _isStepSection && ppBtnDefaultPaginationStyle.Visible; // bug fix B2016-241 insurence based on DefaultNumColumns sometimes set to true
//ppLblDefaultPrintSize.Visible = !_isStepSection && ppCbShwDefSettings.Checked && ppBtnDefaultPrintSize.Visible;
}
/// <summary>
/// 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.
/// </summary>
private void ClearAllCheckedButtons()
{
btnGeneral.Checked = false;
btnFormat.Checked = false;
btnLibDocs.Checked = false;
btnAutomation.Checked = false;
}
/// <summary>
/// Select the corresponding tab and set the button's state to checked
/// </summary>
/// <param name="tab">Property Page Tab</param>
/// <param name="button">Corresponding Property Page Button</param>
private void ProcessButtonClick(TabItem tab, ButtonX button)
{
ClearAllCheckedButtons();
tcSectionProp.SelectedTab = tab;
button.Checked = true;
}
/// <summary>
/// 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.
/// </summary>
/// <param name="sender"> type object</param>
/// <param name="e">type EventArgs</param>
private void tabpage_Enter(object sender, EventArgs e)
{
// Show or hide the labels containing the default values
//if (!_Initializing) // jsj 1-23-2017 was not showing default check upon property page entry
defaultSettingsVisiblity();
}
/// <summary>
/// Process a change in the combo box selection
/// </summary>
/// <param name="cmbx">Combo Box Name</param>
/// <param name="defstr">string containing default text</param>
/// <param name="button">button to reset to default value</param>
/// <param name="deflabel">label containing the default</param>
private void ProcessCmbxSelectedValueChange(ComboBoxEx cmbx, string defstr, ButtonX button, Label deflabel)
{
if ((cmbx.SelectedIndex != -1) && defstr != null && defstr.Equals(cmbx.SelectedValue))
{
button.Visible = true;
button.Focus();
button.PerformClick();
}
button.Visible = (cmbx.SelectedValue != null);
deflabel.Visible = (ppCbShwDefSettings.Checked) && button.Visible;
}
/// <summary>
/// Process a change in the enum combo box selection
/// </summary>
/// <param name="cmbx">Combo Box Name</param>
/// <param name="defstr">the default enum value</param>
/// <param name="button">button to reset to default value</param>
/// <param name="deflabel">label containing the default</param>
private void ProcessCmbxSelectionEnumChanged(ComboBoxEx cmbx, object enumval, ButtonX button, Label deflabel)
{
if ((cmbx.SelectedIndex != -1) &&
cmbx.SelectedValue.Equals(enumval))
{
bool sav_Initializing = _Initializing;
_Initializing = true;
button.Visible = true;
button.Focus();
button.PerformClick();
cmbx.SelectedIndex = -1; // This will hide the Default button
_Initializing = sav_Initializing;
}
//button.Visible = ((!_FolderConfig.Name.Equals("VEPROMS")) && (cmbx.SelectedValue != null));
button.Visible = ((cmbx.SelectedValue != null) && (cmbx.SelectedIndex >= 0));
deflabel.Visible = ppCbShwDefSettings.Checked && button.Visible;
}
#endregion
private void ppSectNumberStpRTB_Enter(object sender, EventArgs e)
{
_MyStepTabRibbon.MyStepRTB = ppSectNumberStpRTB;
}
private void ppSectTitleStpRTB_Enter(object sender, EventArgs e)
{
_MyStepTabRibbon.MyStepRTB = ppSectTitleStpRTB;
}
private void ShowAvailableOptionsForSectionType()
{
lblColumns.Visible = _isStepSection;
ppCmbxNumColumns.Visible = _isStepSection;
lblPagination.Visible = _isStepSection;
ppCmbxSectPagination.Visible = _isStepSection;
//lblPrintSize.Visible = !_isStepSection;
//ppCmbxAccPgPrintSize.Visible = !_isStepSection;
ppGpbxSignoffCheckoff.Visible = _isStepSection;
cbKeepWordDocMargins.Visible = !_isStepSection;
ppCbDefaultStepSection.Visible = _isStepSection;
ppCbShowRplWords.Visible = _isStepSection;
}
private void rbStepSect_CheckedChanged(object sender, EventArgs e)
{
_isStepSection = rbStepSect.Checked;
rbWordSect.Checked = !rbStepSect.Checked;
if (!_Initializing)
{
SetupPpCmbxSectionType();
ShowAvailableOptionsForSectionType();
tcpLibDoc.Enabled = !_isStepSection;
}
}
private void ppCmbxSectPagination_SelectedValueChanged(object sender, EventArgs e)
{
SectionConfig.SectionPagination secpgn = (SectionConfig.SectionPagination)Enum.Parse(typeof(SectionConfig.SectionPagination), _DefaultPaginationStyle);
ProcessCmbxSelectionEnumChanged(ppCmbxSectPagination, secpgn, ppBtnDefaultPaginationStyle, ppLblDefPaginationStyle);
tcpFormat.Focus();
}
private void ppCmbxNumColumns_SelectedValueChanged(object sender, EventArgs e)
{
SectionConfig.SectionColumnMode seccols = (SectionConfig.SectionColumnMode)Enum.Parse(typeof(SectionConfig.SectionColumnMode), _DefaultNumColumns);
ProcessCmbxSelectionEnumChanged(ppCmbxNumColumns, seccols, ppBtnDefaultNumColumns, ppLblDefaultNumColumns);
tcpFormat.Focus();
}
//private void ppCmbxAccPgPrintSize_SelectedValueChanged(object sender, EventArgs e)
//{
// SectionConfig.AttPrintSize attsize = (SectionConfig.AttPrintSize)Enum.Parse(typeof(SectionConfig.AttPrintSize), _DefaultPrintSize);
// ProcessCmbxSelectionEnumChanged(ppCmbxAccPgPrintSize, attsize, ppBtnDefaultPrintSize, ppLblDefaultPrintSize);
//}
private void ppBtnDefaultPaginationStyle_Click(object sender, EventArgs e)
{
// Get the parent setting
SectionConfig.SectionPagination secpgn = (SectionConfig.SectionPagination)Enum.Parse(typeof(SectionConfig.SectionPagination), _DefaultPaginationStyle);
// Compare parent setting with current setting
if (secpgn != _SectionConfig.Section_Pagination)
_SectionConfig.Section_Pagination = secpgn; // this will force a database update (write)
ppCmbxSectPagination.SelectedIndex = -1;//reset to the default Section Pagination Style setting
tcpFormat.Focus();
}
private void ppBtnDefaultNumColumns_Click(object sender, EventArgs e)
{
// Get the parent setting
SectionConfig.SectionColumnMode seccols = (SectionConfig.SectionColumnMode)Enum.Parse(typeof(SectionConfig.SectionColumnMode), _DefaultNumColumns);
// Compare parent setting with current setting
if (seccols != _SectionConfig.Section_ColumnMode)
_SectionConfig.Section_ColumnMode = seccols; // this will force a database update (write)
ppCmbxNumColumns.SelectedIndex = -1;//reset to the default Number of Columns setting
tcpFormat.Focus();
}
private void frmSectionProperties_Shown(object sender, EventArgs e)
{
ppSectNumberStpRTB.Focus();
}
private void ppCbEditableData_CheckedChanged(object sender, EventArgs e)
{
bool isEditable = ppCbEditableData.Checked;
if (!_Initializing)
_SectionConfig.SubSection_Edit = isEditable ? "Y" : "N";
}
private void ppCbPrnSecNumTitle_CheckedChanged(object sender, EventArgs e)
{
bool isEditable = ppCbPrnSecNumTitle.Checked;
if (!_Initializing)
_SectionConfig.Section_PrintHdr = isEditable ? "Y" : "N";
}
private void ppCbAutoIndent_CheckedChanged(object sender, EventArgs e)
{
bool isEditable = ppCbAutoIndent.Checked;
if (!_Initializing)
_SectionConfig.SubSection_AutoIndent = isEditable ? "Y" : "N";
}
private void ppCbIncTOC_CheckedChanged(object sender, EventArgs e)
{
bool isInToc = (_SectionConfig.MySection.MySectionInfo.MyDocStyle.IncludeInTOC) ? !ppCbIncTOC.Checked : ppCbIncTOC.Checked;
if (!_Initializing)
_SectionConfig.Section_TOC = ppCbIncTOC.Checked ? "Y" : "N";
gpTOC.Visible = isInToc;
}
private void ppCmbxCheckoffHeading_SelectedIndexChanged(object sender, EventArgs e)
{
int selindx = ppCmbxCheckoffHeading.SelectedIndex;
if (!_Initializing)
_SectionConfig.Section_CheckoffHeaderSelection = selindx;
}
private void cbKeepWordDocMargins_CheckedChanged(object sender, EventArgs e)
{
bool doWordMargin = cbKeepWordDocMargins.Checked;
if (!_Initializing)
_SectionConfig.Section_WordMargin = doWordMargin ? "Y" : "N";
}
private void ppCbPlaceKeeper_CheckedChanged(object sender, EventArgs e)
{
if (!_Initializing)
_SectionConfig.Section_Placekeeper = ppCbPlaceKeeper.Checked ? "Y" : "N";
}
private void ppCbPhoneList_CheckedChanged(object sender, EventArgs e)
{
if (!_Initializing)
_SectionConfig.Section_PhoneList = ppCbPhoneList.Checked ? "Y" : "N";
}
private void ppCbDefaultStepSection_CheckedChanged(object sender, EventArgs e)
{
if (!_Initializing)
{
// B2019-002: if there is more than one default step section (probably from migrated data), then allow this to be turned off.
// The bug was on changing a transition type that included a section header - but the section header was not included
// in the transition text if it was a default:
int cntDefaultSect = 0;
string defSectDesc = "";
string curSectDesc = "";
foreach (SectionInfo si in _SectionConfig.MySection.MySectionInfo.MyProcedure.Sections)
{
SectionConfig sc = si.MyConfig as SectionConfig;
if (sc != null && sc.Section_OriginalSteps == "Y")
{
cntDefaultSect++;
if (cntDefaultSect == 1) defSectDesc = string.Format("{0} {1}", sc.Number, sc.Title).Trim(); // get default section name - used in Warning message if another section is checked to be default
}
if (si.ItemID == _SectionConfig.MySection.ItemID) curSectDesc = string.Format("{0} {1}", sc.Number, sc.Title).Trim();
}
if (!ppCbDefaultStepSection.Checked) //user un-checked the default section box
{
if (cntDefaultSect == 1)
{
// B2020-007: Don't allow the user to unselect the Default Step Section. Give the user a message and turn the check
// box back on. The way to change the default section will be to check the box for the default section to change to.
// That will bring up a dialog asking the user if they want to change the default section (see the next 'else')
MessageBox.Show("One section MUST be set as the 'Default Step Section'.\n\nTo make another section the 'Default Step Section',\n select the checkbox on the Properties of that section.", "WARNING");
_Initializing = true;
ppCbDefaultStepSection.Checked = true;
_Initializing = false;
}
}
else // user checked the default section box
{
if (cntDefaultSect != 0)
{
// Note that this just sets the config item - it does not save it. Save is
// done when the 'OK' button is clicked. At that time, if this section's
// Section_OriginalSteps is set, then all other sections will need to have this
// property cleared (Only 1 section can be the OriginalStep section)
string msg = string.Format("Only one section can be set as the 'Default Step Section'. '{0}' is currently the default.\n\nDo you want to make '{1}' the Default?", defSectDesc, curSectDesc);
if (MessageBox.Show(msg, "WARNING", MessageBoxButtons.YesNo) == DialogResult.No)
{
_Initializing = true;
ppCbDefaultStepSection.Checked = false; // reset the check box back to unchecked
_Initializing = false;
}
}
}
//C2019-042 a section cannot be a foldout section and the default step section
cbIsFoldoutSection.Enabled = !ppCbDefaultStepSection.Checked; // disable the foldout checkbox if this is the default step section
_SectionConfig.Section_OriginalSteps = ppCbDefaultStepSection.Checked ? "Y" : "N";
}
}
private void ppBtnConvertToDocX_Click(object sender, EventArgs e)
{
// Get Document as file
ItemInfo ii = ItemInfo.Get(_SectionConfig.MySection.ItemID);
DocumentInfo doclibinfo = ii.MyContent.MyEntry.MyDocument;
DSOFile myfile = new DSOFile(doclibinfo);
// When trying to fix this , the update of the document waas causing a CSLA crash so I switched
// to make document
//using (Document myDoc = doclibinfo.Get())
//{
// Open MSWord App
LBWordLibrary.LBApplicationClass ap = new LBWordLibrary.LBApplicationClass();
LBWordLibrary.LBDocumentClass doc = ap.Documents.Open(myfile.FullName);
string filename = myfile.FullName.ToUpper().Replace(".RTF", ".DOCX");
doc.SaveAs(filename, LBWordLibrary.LBWdSaveFormat.wdFormatXMLDocument); // Convert to DocX
doc.Close();
ap.Quit();
FileInfo fi = new FileInfo(filename);
FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);// B2016-053
long len = fs.Length;
byte[] ByteArray = new byte[len];
int nBytesRead = fs.Read(ByteArray, 0, (int)len);
fs.Close();
Document myDoc = Document.MakeDocument(null, ByteArray, doclibinfo.DocAscii, doclibinfo.Config, ".DOCX");
_SectionConfig.MySection.MyContent.MyEntry.MyDocument = myDoc;
_SectionConfig.MySection.MyContent.MyEntry.Save();
//myDoc.DocContent = ByteArray;
//myDoc.FileExtension = ".DOCX";
//myDoc.Save();
fi.Delete();// Cleanup afterwards
ppBtnConvertToDocX.Visible = false; // Hide the button after the execution is complete.
//}
}
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();
ppCmbxStyleSectionType.Focus();
}
}
//C2019-042 added check box to identify a Foldout Section
private void cbIsFoldoutSection_CheckedChanged(object sender, EventArgs e)
{
// don't allow a foldout section be the default step section
ppCbDefaultStepSection.Enabled = !cbIsFoldoutSection.Checked;
_SectionConfig.Section_IsFoldout = (cbIsFoldoutSection.Checked) ? "Y" : "N";
}
// B2019-165 check box added to Automation tab to prevent a duplex foldout from
// being printed on the back of the last page of the Word document that does not include duplex foldouts
private void ppCbNoDuplexFoldout_CheckedChanged(object sender, EventArgs e)
{
_SectionConfig.Section_DontIncludeDuplexFoldout = ppCbNoDuplexFoldout.Checked;
}
// C2029-025 Show or hide replace words. Can highlight replace words in editor.
private void ppCbShowRplWords_CheckedChanged(object sender, EventArgs e)
{
if (!_Initializing)
{
_SectionConfig.Section_ShwRplWords = ppCbShowRplWords.Checked ? "Y" : "N";
}
}
//private void ppBtnDefaultPrintSize_Click(object sender, EventArgs e)
//{
// // Get the parent setting
// SectionConfig.AttPrintSize attsize = (SectionConfig.AttPrintSize)Enum.Parse(typeof(SectionConfig.AttPrintSize), _DefaultPrintSize);
// // Compare parent setting with current setting
// if (attsize != _SectionConfig.Section_AttachmentPrintSize)
// _SectionConfig.Section_AttachmentPrintSize = attsize; // this will force a database update (write)
// ppCmbxAccPgPrintSize.SelectedIndex = -1;//reset to the default Accessory page Print Size setting
// tcpFormat.Focus();
//}
}
}