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 DescriptiveEnum;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Controls;
namespace VEPROMS
{
  public partial class frmProcedureProperties : DevComponents.DotNetBar.Office2007Form
  {
	  private string _DefaultFormatName = null;
	  private string _DefaultPagination = null;
	  private string _DefaultWatermark = null;
	  private string _DefaultChgBarType = null;
	  private string _DefaultChgBarLoc = null;
	  private string _DefaultChgBarText = null;
	  private string _DefaultChgBarUsrMsg1 = null;
	  private string _DefaultChgBarUsrMsg2 = null;
	  private string _DefaultFormatColumns = null;
	  private bool _Initializing;
	  private ProcedureConfig _ProcedureConfig;
    public frmProcedureProperties(ProcedureConfig procedureConfig)
    {
      _ProcedureConfig = procedureConfig;
		_Initializing = true;
		InitializeComponent();
		btnGeneral.PerformClick();  // always start with General tab or button
		_Initializing = false;
		// build the title bar caption
		this.Text = string.Format("{0}  {1} Properties", procedureConfig.Number, procedureConfig.Title);
    }
	  private void ppBtnOK_Click(object sender, EventArgs e)
    {
		DialogResult = DialogResult.OK;
		procedureConfigBindingSource.EndEdit();
		// Save Default settings for User
		//
		// Save whether we should display the default values on this property page
		Settings.Default.ShowDefaultProcedureProp = ppCbShwDefSettings.Checked;
		Settings.Default.Save();
		this.Close();
    }
	  private void ppBtnCancel_Click(object sender, EventArgs e)
    {
		procedureConfigBindingSource.CancelEdit();
      this.Close();
    }
	 /// 
	 /// 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()
	  {
		  _ProcedureConfig.ParentLookup = true;
		  // Get the default format name
		  _DefaultFormatName = _ProcedureConfig.DefaultFormatSelection;
		  SetupDefault(_DefaultFormatName, ppLblFormatDefault, ppCmbxFormat);
		  // Get the default Change Bar Type
		  _DefaultChgBarType = _ProcedureConfig.Print_ChangeBar.ToString();
		  SetupDefault(EnumDescConverter.GetEnumDescription(_ProcedureConfig.Print_ChangeBar), ppLblChangeBarTypeDefault, ppCmbxChangeBarType);
		  // Get the default Change Bar Location
		  _DefaultChgBarLoc = _ProcedureConfig.Print_ChangeBarLoc.ToString();
		  SetupDefault(EnumDescConverter.GetEnumDescription(_ProcedureConfig.Print_ChangeBarLoc), ppLblChgBarPosDefault, ppCmbxChgBarPos);
		  // Get the default Change Bar text
		  _DefaultChgBarText = _ProcedureConfig.Print_ChangeBarText.ToString();
		  SetupDefault(EnumDescConverter.GetEnumDescription(_ProcedureConfig.Print_ChangeBarText), ppLblChgBarTxtTypeDefault, ppCmbxChgBarTxtType);
		  // Get the default User Change Bar Message 1
		  _DefaultChgBarUsrMsg1 = _ProcedureConfig.Print_UserCBMess1;
		  if (!(_DefaultChgBarUsrMsg1.Equals("")))
			  ppLblChgBarUserMsgOneDefault.Text = string.Format("({0})", _DefaultChgBarUsrMsg1);
		  // Get the default User Change Bar Message 2
		  _DefaultChgBarUsrMsg2 = _ProcedureConfig.Print_UserCBMess2;
		  if (!(_DefaultChgBarUsrMsg2.Equals("")))
			  ppLblChgBarUserMsgTwoDefault.Text = string.Format("({0})", _DefaultChgBarUsrMsg2);
		  // Get the default Print Pagination
		  _DefaultPagination = _ProcedureConfig.Print_Pagination.ToString();
		  SetupDefault(EnumDescConverter.GetEnumDescription(_ProcedureConfig.Print_Pagination), ppLblPaginationDefault, ppCmbxPagination);
		  // Get the default Watermark
		  _DefaultWatermark = _ProcedureConfig.Print_Watermark.ToString();
		  SetupDefault(EnumDescConverter.GetEnumDescription(_ProcedureConfig.Print_Watermark), ppLblWatermarkDefault, ppCmbxWatermark);
		  // Get the default Format Columns
		  _DefaultFormatColumns = _ProcedureConfig.Format_Columns.ToString();
		  SetupDefault(EnumDescConverter.GetEnumDescription(_ProcedureConfig.Format_Columns), ppLblStpEditorColsDefault, ppCmbxStpEditorCols);
		  _ProcedureConfig.ParentLookup = false;
	  }
	  private void frmProcedureProperties_Load(object sender, EventArgs e)
	  {
		  _Initializing = true;
		  procedureConfigBindingSource.DataSource = _ProcedureConfig;
		  formatInfoListBindingSource.DataSource = FormatInfoList.Get();
		  // Get the saved settings for this user
		  //
		  // This setting tells us if we should display the default values on this property page
		  ppCbShwDefSettings.Checked = (Settings.Default["ShowDefaultProcedureProp"] != null) ? Settings.Default.ShowDefaultProcedureProp : 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)
		  {
			  tcProcProp.TabsVisible = true;
			  panProcBtns.Visible = false;
			  this.Width -= panProcBtns.Width;
		  }
		  // Get the default values for the property page information
		  FindDefaultValues();
		  // Assign the data sources to the combo boxes
		  ppCmbxChgBarPos.DataSource = EnumDetail.Details();
		  ppCmbxChgBarPos.DisplayMember = "Description";
		  ppCmbxChgBarPos.ValueMember = "EValue";
		  ppCmbxChgBarPos.SelectedIndex = -1;
		  ppCmbxChgBarTxtType.DataSource = EnumDetail.Details();
		  ppCmbxChgBarTxtType.DisplayMember = "Description";
		  ppCmbxChgBarTxtType.ValueMember = "EValue";
		  ppCmbxChgBarTxtType.SelectedIndex = -1;
		  ppCmbxChangeBarType.DataSource = EnumDetail.Details();
		  ppCmbxChangeBarType.DisplayMember = "Description";
		  ppCmbxChangeBarType.ValueMember = "EValue";
		  ppCmbxChangeBarType.SelectedIndex = -1;
		  ppCmbxPagination.DataSource = EnumDetail.Details();
		  ppCmbxPagination.DisplayMember = "Description";
		  ppCmbxPagination.ValueMember = "EValue";
		  ppCmbxPagination.SelectedIndex = -1;
		  ppCmbxWatermark.DataSource = EnumDetail.Details();
		  ppCmbxWatermark.DisplayMember = "Description";
		  ppCmbxWatermark.ValueMember = "EValue";
		  ppCmbxWatermark.SelectedIndex = -1;
		  ppCmbxStpEditorCols.DataSource = EnumDetail.Details();
		  ppCmbxStpEditorCols.DisplayMember = "Description";
		  ppCmbxStpEditorCols.ValueMember = "EValue";
		  ppCmbxStpEditorCols.SelectedIndex = -1;
		  _Initializing = false;
	  }
	  #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);
	  }
	  /// 
	  /// Selection in Default Column Mode combo box changed.
	  /// 
	  /// object
	  /// EventArgs
	  private void ppCmbxStpEditorCols_SelectedValueChanged(object sender, EventArgs e)
	  {
		  ProcedureConfig.FormatColumns fc = (ProcedureConfig.FormatColumns)Enum.Parse(typeof(ProcedureConfig.FormatColumns), _DefaultFormatColumns);
		  if ((ppCmbxStpEditorCols.SelectedIndex != -1) && ppCmbxStpEditorCols.SelectedValue.Equals(fc))
		  {
			  ppBtnDefEdCols.Focus();
			  ppBtnDefEdCols.PerformClick();
		  }
		  ppBtnDefEdCols.Visible = ppCmbxStpEditorCols.SelectedValue != null;
		  ppLblStpEditorColsDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefEdCols.Visible;
	  }
	  #endregion
	  #region Format Settings tab
	  /// 
	  /// This is the Format Settings button used on the button interface design
	  /// 
	  /// object
	  /// EventArgs
	  private void btnFmtStngs_Click(object sender, EventArgs e)
	  {
		  ProcessButtonClick(tiFmtStngs, btnFmtStngs);
	  }
	  private void ppBtnDefaultFmt_Click(object sender, EventArgs e)
	  {
		  ppCmbxFormat.SelectedIndex = -1; //reset to the default Format setting
	  }
	  /// 
	  /// Selection in Format combo box changed.
	  /// 
	  /// object
	  /// EventArgs
	  private void ppCmbxFormat_SelectedValueChanged(object sender, EventArgs e)
	  {
		  ProcessCmbxSelectedValueChange(ppCmbxFormat, _DefaultFormatName, ppBtnDefaultFmt, ppLblFormatDefault);
	  }
	  /// 
	  /// Enable or disable the user specified change bar options base on the type
	  /// of change bar selected.
	  /// 
	  private void setEnabledUserSpecifiedChgBarCombos(ProcedureConfig.PrintChangeBar pcb)
	  {
		  ppGpbxUserSpecCB.Enabled =
		  ppCmbxChgBarPos.Enabled =
		  ppCmbxChgBarTxtType.Enabled =
		  ppBtnDefaultCbPos.Enabled =
		  ppBtnDefCbTxtTyp.Enabled = (ppCmbxChangeBarType.SelectedValue != null &&
			ppCmbxChangeBarType.SelectedValue.Equals(ProcedureConfig.PrintChangeBar.WithUserSpecified)) ||
			(ppCmbxChangeBarType.SelectedValue == null && pcb.Equals(DocVersionConfig.PrintChangeBar.WithUserSpecified));
	  }
	  /// 
	  /// Selection in Change Bar combo box changed.
	  /// 
	  /// object
	  /// EventArgs
	  private void ppCmbxChangeBarType_SelectedValueChanged(object sender, EventArgs e)
	  {
		  if (!_Initializing)
		  {
			  ProcedureConfig.PrintChangeBar pcb = (ProcedureConfig.PrintChangeBar)Enum.Parse(typeof(ProcedureConfig.PrintChangeBar), _DefaultChgBarType);
			  ProcessCmbxSelectionEnumChanged(ppCmbxChangeBarType, pcb, ppBtnDefaultChgBar, ppLblChangeBarTypeDefault);
			  setEnabledUserSpecifiedChgBarCombos(pcb);
		  }
	  }
	  /// 
	  /// Reset to the parent setting.
	  /// Find the parent setting and assign it to _ProcedureConfig.PrintChangeBar.  
	  /// This will force the database to be updated.
	  /// 
	  /// 
	  /// 
	  private void ppBtnDefaultChgBar_Click(object sender, EventArgs e)
	  {
		  // Get the parent setting
		  ProcedureConfig.PrintChangeBar pcb = (ProcedureConfig.PrintChangeBar)Enum.Parse(typeof(ProcedureConfig.PrintChangeBar), _DefaultChgBarType);
		  // Compare parent setting with current setting
		  if (pcb != _ProcedureConfig.Print_ChangeBar)
			  _ProcedureConfig.Print_ChangeBar = pcb; // this will force a database update (write)
		  ppCmbxChangeBarType.SelectedIndex = -1;  //reset 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)
		  {
			  ProcedureConfig.PrintChangeBarLoc cbl = (ProcedureConfig.PrintChangeBarLoc)Enum.Parse(typeof(ProcedureConfig.PrintChangeBarLoc), _DefaultChgBarLoc);
			  ProcessCmbxSelectionEnumChanged(ppCmbxChgBarPos, cbl, ppBtnDefaultCbPos, ppLblChgBarPosDefault);
		  }
	  }
	  /// 
	  /// Reset to the parent setting.
	  /// Find the parent setting and assign it to _ProcedureConfig.Print_ChangeBarLoc.  
	  /// This will force the database to be updated.
	  /// 
	  /// 
	  /// 
	  private void ppBtnDefaultCbPos_Click(object sender, EventArgs e)
	  {
		  // Get the parent setting
		  ProcedureConfig.PrintChangeBarLoc cbl = (ProcedureConfig.PrintChangeBarLoc)Enum.Parse(typeof(ProcedureConfig.PrintChangeBarLoc), _DefaultChgBarLoc);
		  // Compare parent setting with current setting
		  if (cbl != _ProcedureConfig.Print_ChangeBarLoc)
			  _ProcedureConfig.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)
		  {
			  ProcedureConfig.PrintChangeBarText cbt = (ProcedureConfig.PrintChangeBarText)Enum.Parse(typeof(ProcedureConfig.PrintChangeBarText), _DefaultChgBarText);
			  ProcessCmbxSelectionEnumChanged(ppCmbxChgBarTxtType, cbt, ppBtnDefCbTxtTyp, ppLblChgBarTxtTypeDefault);
			  setEnabledUserSpecifiedChgBarText();
		  }
	  }
	  /// 
	  /// Reset to the parent setting.
	  /// Find the parent setting and assign it to _ProcedureConfig.Print_ChangeBarText.  
	  /// This will force the database to be updated.
	  /// 
	  /// 
	  /// 
	  private void ppBtnDefCbTxtTyp_Click(object sender, EventArgs e)
	  {
		  // Get the parent setting
		  ProcedureConfig.PrintChangeBarText cbt = (ProcedureConfig.PrintChangeBarText)Enum.Parse(typeof(ProcedureConfig.PrintChangeBarText), _DefaultChgBarText);
		  // Compare parent setting with current setting
		  if (cbt != _ProcedureConfig.Print_ChangeBarText)
			  _ProcedureConfig.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()
	  {
		  ppGpbxUserSpecTxt.Enabled =
		  ppTxbxChangeBarUserMsgOne.Enabled =
		  ppTxbxChgBarUserMsgTwo.Enabled =
		  ppBtnDefCbTxt1.Enabled =
		  ppBtnDefCbTxt2.Enabled = (ppCmbxChgBarTxtType.SelectedValue != null &&
		  ppCmbxChgBarTxtType.SelectedValue.Equals(ProcedureConfig.PrintChangeBarText.UserDef));
	  }
	  #endregion
	  #region Output Settings tab
	  /// 
	  /// This is the Output Settings button used on the button interface design
	  /// 
	  /// object
	  /// EventArgs
	  private void btnOutputStngs_Click(object sender, EventArgs e)
	  {
		  ProcessButtonClick(tiOutputStngs, btnOutputStngs);
	  }
	  /// 
	  /// Selection in Pagination combo box changed.
	  /// 
	  /// object
	  /// EventArgs
	  private void ppCmbxPagination_SelectedValueChanged(object sender, EventArgs e)
	  {
		  if (!_Initializing)
		  {
			  ProcedureConfig.PrintPagination pgtn = (ProcedureConfig.PrintPagination)Enum.Parse(typeof(ProcedureConfig.PrintPagination), _DefaultPagination);
			  ProcessCmbxSelectionEnumChanged(ppCmbxPagination, pgtn, ppBtnDefPagination, ppLblPaginationDefault);
		  }
	  }
	  /// 
	  /// Reset to the parent setting.
	  /// Find the parent setting and assign it to _ProcedureConfig.Print_Pagination.  
	  /// This will force the database to be updated.
	  /// 
	  /// 
	  /// 
	  private void ppBtnDefPagination_Click(object sender, EventArgs e)
	  {
		  // Get the parent setting
		  ProcedureConfig.PrintPagination pgtn = (ProcedureConfig.PrintPagination)Enum.Parse(typeof(ProcedureConfig.PrintPagination), _DefaultPagination);
		  // Compare parent setting with current setting
		  if (pgtn != _ProcedureConfig.Print_Pagination)
			  _ProcedureConfig.Print_Pagination = pgtn; // this will force a database update (write)
		  ppCmbxPagination.SelectedIndex = -1;  //reset to the default Pagination setting
	  }
	  /// 
	  /// Selection in Watermark combo box changed.
	  /// 
	  /// object
	  /// EventArgs
	  private void ppCmbxWatermark_SelectedValueChanged(object sender, EventArgs e)
	  {
		  if (!_Initializing)
		  {
			  ProcedureConfig.PrintWatermark wtr = (ProcedureConfig.PrintWatermark)Enum.Parse(typeof(ProcedureConfig.PrintWatermark), _DefaultWatermark);
			  ProcessCmbxSelectionEnumChanged(ppCmbxWatermark, wtr, ppBtnDefWatermark, ppLblWatermarkDefault);
		  }
	  }
	  /// 
	  /// Reset to the parent setting.
	  /// Find the parent setting and assign it to _ProcedureConfig.Print_Watermark.  
	  /// This will force the database to be updated.
	  /// 
	  /// 
	  /// 
	  private void ppBtnDefWatermark_Click(object sender, EventArgs e)
	  {
		  // Get the parent setting
		  ProcedureConfig.PrintWatermark wtr = (ProcedureConfig.PrintWatermark)Enum.Parse(typeof(ProcedureConfig.PrintWatermark), _DefaultWatermark);
		  // Compare parent setting with current setting
		  if (wtr != _ProcedureConfig.Print_Watermark)
			  _ProcedureConfig.Print_Watermark = wtr; // this will force a database update (write)
		  ppCmbxWatermark.SelectedIndex = -1;  //reset to the default Watermark setting
	  }
	  #endregion
	  #region View Settings tab
	  /// 
	  /// This is the View Settings button used on the button interface design
	  /// 
	  /// object
	  /// EventArgs
	  private void btnVwStngs_Click(object sender, EventArgs e)
	  {
		  ProcessButtonClick(tiViewStngs, btnVwStngs);
	  }
	  #endregion
	  #region Generic functions used on this property page
	  /// 
	  /// Determines what labels (showing default values) are visable on the property pages
	  /// 
	  private void defaultSettingsVisiblity()
	  {
		  ppLblDefSettingsInfo.Visible = ppCbShwDefSettings.Checked;
		  ppLblWatermarkDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefWatermark.Visible;
		  ppLblPaginationDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefPagination.Visible;
		  ppLblStpEditorColsDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefEdCols.Visible;
		  ppLblFormatDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefaultFmt.Visible;
		  ppLblChangeBarTypeDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefaultChgBar.Visible;
		  ppLblChgBarPosDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefaultCbPos.Visible;
		  ppLblChgBarTxtTypeDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefCbTxtTyp.Visible;
		  ppLblChgBarUserMsgOneDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefCbTxt1.Visible;
		  ppLblChgBarUserMsgTwoDefault.Visible = ppCbShwDefSettings.Checked && ppBtnDefCbTxt2.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();
		  tcProcProp.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;
		  btnFmtStngs.Checked = false;
		  btnOutputStngs.Checked = false;
		  btnVwStngs.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
		  if (!_Initializing)
			  defaultSettingsVisiblity();
	  }
	  /// 
	  /// 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("")))
		  {
			  lbl.Text = string.Format("({0})", defaultText);
			  cmbo.WatermarkText = string.Format("{0}", defaultText);
		  }
	  }
	  /// 
	  /// 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))
		  {
			  button.Focus();
			  button.PerformClick();
		  }
		  button.Visible = (cmbx.SelectedValue != null);
		  deflabel.Visible = ppCbShwDefSettings.Checked && button.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;
		  deflabel.Visible = ppCbShwDefSettings.Checked && button.Visible;
	  }
	  #endregion
  }
}