using System;
using System.Web;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Collections;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.FormControls;
using CMS.FormEngine;
using CMS.SettingsProvider;
using CMS.UIControls;
public partial class CMSModules_AdminControls_Controls_Class_FieldEditor_ControlSettings : CMSUserControl
{
#region "Variables"
private FormInfo fi = null;
private static Hashtable mSettings = null;
#endregion
#region "Properties"
///
/// FormInfo for specific control.
///
public FormInfo FormInfo
{
get
{
return fi;
}
set
{
form.FormInformation = fi = value;
}
}
///
/// Shows in what control is this form used.
///
public FormTypeEnum FormType
{
get
{
return form.FormType;
}
set
{
form.FormType = value;
}
}
///
/// Field settings hashtable.
///
public Hashtable Settings
{
get
{
return mSettings;
}
set
{
mSettings = new Hashtable(value, StringComparer.InvariantCultureIgnoreCase);
}
}
///
/// Basic form data.
///
public DataRow FormData
{
get
{
return form.DataRow;
}
}
///
/// Sets basicform to simple or advanced mode.
///
public bool SimpleMode
{
get;
set;
}
///
/// Determines whether to allow mode switching (simple <-> advanced).
///
public bool AllowModeSwitch
{
get
{
return form.AllowModeSwitch;
}
set
{
form.AllowModeSwitch = value;
}
}
///
/// Defines minimum of items needed to be visible to display mode switch
///
public int MinItemsToAllowSwitch
{
get;
set;
}
#endregion
#region "Page events"
protected void Page_Load(object sender, EventArgs e)
{
lnkSimple.Click += link_Click;
lnkAdvanced.Click += link_Click;
pnlSettings.GroupingText = GetString("templatedesigner.section.settings");
}
protected void Page_PreRender(object sender, EventArgs e)
{
lnkSimple.Visible = AllowModeSwitch && !SimpleMode;
lnkAdvanced.Visible = AllowModeSwitch && SimpleMode;
if (SimpleMode)
{
// Simplify the form
ProcessSimpleModeVisibility();
}
}
protected void link_Click(object sender, EventArgs e)
{
// Switch the mode
SimpleMode = !SimpleMode;
}
#endregion
#region "Methods"
///
/// Checks if form is loaded with any controls and returns appropriate value.
///
public bool CheckVisibility()
{
Visible = true;
if (!form.IsAnyFieldVisible() && !AllowModeSwitch)
{
Visible = false;
}
if (form.FormInformation != null && !form.FormInformation.ItemsList.Any())
{
Visible = false;
}
return Visible;
}
///
/// Reloads control.
///
public void Reload(bool forceReloadCategories)
{
if (fi != null)
{
form.SubmitButton.Visible = false;
form.SiteName = CMSContext.CurrentSiteName;
form.FormInformation = FormInfo;
form.Data = GetData();
form.ShowPrivateFields = true;
form.ForceReloadCategories = forceReloadCategories;
form.StopProcessing = false;
}
else
{
form.DataRow = null;
form.FormInformation = null;
form.StopProcessing = true;
}
form.ReloadData();
}
///
/// Saves basic form data.
///
public bool SaveData()
{
if (form.Visible && form.FieldControls != null && form.FieldControls.Count != 0)
{
return form.SaveData(null);
}
return true;
}
///
/// Loads DataRow for BasicForm with data from FormFieldInfo settings.
///
private DataRowContainer GetData()
{
DataRowContainer result = new DataRowContainer(FormInfo.GetDataRow());
if (Settings != null)
{
foreach (string columnName in result.ColumnNames)
{
if (Settings.ContainsKey(columnName) && !String.IsNullOrEmpty(Convert.ToString(Settings[columnName])))
{
result[columnName] = Settings[columnName];
}
}
}
return result;
}
///
/// Sets simple/advanced mode.
///
private void ProcessSimpleModeVisibility()
{
// Check switch visibility - no need to show it if there are no advanced items
bool mVisible = form.AllowModeSwitch && ContainsAdvancedItems(FormInfo);
// If there is not enough items, hide switch and set advanced mode
bool tooFewItems = HasTooFewItems(FormInfo);
mVisible &= !tooFewItems;
// Visibility needs to be set via a variable, since if control is in panel that is not visible at the time when this method is called
// 'Visible' property isn't rewritten (stays false). In that case control tries to set Visible attribute again at PreRender event.
plcSwitch.Visible = mVisible;
// And process fields visibility depending on mode
if (form.IsSimpleMode != (!tooFewItems && SimpleMode))
{
form.EnableViewState = false;
form.IsSimpleMode = !tooFewItems && SimpleMode;
form.FieldsToHide.AddRange(form.FormInformation.ItemsList.OfType().Where(x => !x.DisplayInSimpleMode).Select(x => x.Name).ToList());
}
}
///
/// Checks if FormInfo contains items that are shown only in advanced mode.
///
private bool ContainsAdvancedItems(FormInfo formInfo)
{
if (formInfo == null)
{
return false;
}
return formInfo.ItemsList.OfType().Any(y => y.Visible && !y.DisplayInSimpleMode);
}
///
/// Indicates whether given FormInfo has too few items to be bothered by mode switching.
///
private bool HasTooFewItems(FormInfo formInfo)
{
if (formInfo == null)
{
return false;
}
return formInfo.ItemsList.OfType().Where(y => y.Visible).Count() <= MinItemsToAllowSwitch;
}
#endregion
#region "View State Methods"
protected override void LoadViewState(object savedState)
{
object[] updatedState = (object[])savedState;
// Load orig ViewState
if (updatedState[0] != null)
{
base.LoadViewState(updatedState[0]);
}
// Load Mode settings
if (updatedState[1] != null)
{
SimpleMode = (bool)updatedState[1];
}
}
protected override object SaveViewState()
{
object[] updatedState = new object[2];
updatedState[0] = base.SaveViewState();
updatedState[1] = SimpleMode;
return updatedState;
}
#endregion
}