using System;
using System.Collections.Generic;
using System.Threading;
using System.Web.UI.WebControls;
using CMS.FormEngine;
using CMS.GlobalHelper;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.UIControls;
using CMS.ExtendedControls.ActionsConfig;
using CMS.ExtendedControls;
public partial class CMSModules_AdminControls_Controls_Class_Layout : CMSUserControl
{
#region "Events"
public event EventHandler OnBeforeSave;
public event EventHandler OnAfterSave;
#endregion
#region "Private variables"
protected int mFormType = 0;
private int mOldObjectId = 0;
private int mDataClassId = 0;
private bool mIsAlternative = false;
private int mCssStyleSheetId = 0;
protected SaveAction save = null;
#endregion
#region "Public consts"
///
/// Undefined /unknown type of layout.
///
public const int FORMTYPE_UNKNOWN = 0;
///
/// Layout for document types.
///
public const int FORMTYPE_DOCUMENT = 1;
///
/// Layout for bizforms.
///
public const int FORMTYPE_BIZFORM = 2;
///
/// Layout for system tables.
///
public const int FORMTYPE_SYSTEMTABLE = 3;
///
/// Layout for custom tables.
///
public const int FORMTYPE_CUSTOMTABLE = 4;
#endregion
#region "Public properties"
///
/// Messages placeholder
///
public override MessagesPlaceHolder MessagesPlaceHolder
{
get
{
return plcMess;
}
}
///
/// Header actions
///
public override HeaderActions HeaderActions
{
get
{
return menu;
}
}
///
/// Indicates if control is used on live site
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
base.IsLiveSite = value;
plcMess.IsLiveSite = value;
}
}
///
/// Gets or sets object id (document type id, bizform id, alternative form id).
///
public int ObjectID
{
get
{
return ValidationHelper.GetInteger(ViewState["ObjectID"], 0);
}
set
{
ViewState["ObjectID"] = value;
}
}
///
/// Gets or sets layout.
///
public string FormLayout
{
get
{
if (htmlEditor.Value != null)
{
return htmlEditor.ResolvedValue;
}
return null;
}
set
{
if (value != null)
{
htmlEditor.ResolvedValue = value;
}
else
{
htmlEditor.Value = null;
}
}
}
///
/// Determines whether layout was set.
///
public bool LayoutIsSet
{
get
{
return !string.IsNullOrEmpty(FormLayout);
}
}
///
/// Gets or sets state of custom layout checkbox.
///
public bool CustomLayoutEnabled
{
get
{
return chkCustomLayout.Checked;
}
set
{
chkCustomLayout.Checked = value;
}
}
///
/// Gets or sets BizForm flag for BizForms.
///
public int FormType
{
get
{
return mFormType;
}
set
{
mFormType = value;
}
}
///
/// Gets or sets CSS style sheet ID that is used for editor area.
///
public int CssStyleSheetID
{
get
{
return mCssStyleSheetId;
}
set
{
mCssStyleSheetId = value;
}
}
///
/// Gets or sets alternative form behavior.
///
public bool IsAlternative
{
get
{
return mIsAlternative;
}
set
{
mIsAlternative = value;
}
}
///
/// Gets or sets object type which initializes CKEditor's dialog configuration.
///
public string ObjectType
{
get;
set;
}
///
/// Gets or sets object category which initializes CKEditor's dialog configuration.
///
public string ObjectCategory
{
get;
set;
}
#endregion
#region "Private properties"
///
/// Gets appropriate id (document, bizform, alternative form)according to layout.
///
private int DataClassID
{
get
{
if (mOldObjectId != ObjectID)
{
mOldObjectId = ObjectID;
if (!IsAlternative)
{
switch (FormType)
{
case FORMTYPE_DOCUMENT:
case FORMTYPE_SYSTEMTABLE:
case FORMTYPE_CUSTOMTABLE:
mDataClassId = ObjectID;
break;
case FORMTYPE_BIZFORM:
BizFormInfo bfi = BizFormInfoProvider.GetBizFormInfo(ObjectID);
if (bfi != null)
{
mDataClassId = bfi.FormClassID;
}
else
{
mDataClassId = 0;
}
break;
}
}
else
{
AlternativeFormInfo afi = AlternativeFormInfoProvider.GetAlternativeFormInfo(ObjectID);
if (afi != null)
{
mDataClassId = afi.FormClassID;
}
}
}
return mDataClassId;
}
}
#endregion
#region "Methods"
protected void Page_Load(object sender, EventArgs e)
{
// Register a script file
ScriptHelper.RegisterScriptFile(Page, "~/CMSModules/AdminControls/Controls/Class/layout.js");
// Add save action
save = new SaveAction(Page);
menu.ActionsList.Insert(0, save);
// Register for action
ComponentEvents.RequestEvents.RegisterForEvent(ComponentEvents.SAVE, lnkSave_Click);
lblAvailableFields.Text = GetString("DocumentType_Edit_Form.AvailableFields");
btnGenerateLayout.Text = GetString("DocumentType_Edit_Form.btnGenerateLayout");
btnInsertLabel.Text = GetString("DocumentType_Edit_Form.btnInsertLabel");
btnInsertInput.Text = GetString("DocumentType_Edit_Form.btnInsertInput");
btnInsertValLabel.Text = GetString("DocumentType_Edit_Form.InsertValidationLabel");
btnInsertSubmitButton.Text = GetString("DocumentType_Edit_Form.InsertSubmitButton");
btnInsertVisibility.Text = GetString("DocumentType_Edit_Form.InsertVisibility");
chkCustomLayout.Text = GetString("DocumentType_Edit_Form.chkCustomLayout");
// Alert messages for JavaScript
ltlAlertExist.Text = "";
ltlAlertExistFinal.Text = "";
ltlConfirmDelete.Text = "";
// Element IDs
ltlAvailFieldsElement.Text = ScriptHelper.GetScript("var lstAvailFieldsElem = document.getElementById('" + lstAvailableFields.ClientID + "'); ");
ltlHtmlEditorID.Text = ScriptHelper.GetScript("var ckEditorID = '" + htmlEditor.ClientID + "'; ");
if (!RequestHelper.IsPostBack())
{
FillFieldsList();
LoadData();
chkCustomLayout.Checked = LayoutIsSet;
}
InitHTMLeditor();
// Load CSS style for editor area if any
if (CssStyleSheetID > 0)
{
CssStylesheetInfo cssi = CssStylesheetInfoProvider.GetCssStylesheetInfo(CssStyleSheetID);
if (cssi != null)
{
htmlEditor.EditorAreaCSS = CSSHelper.GetStylesheetUrl(cssi.StylesheetName);
}
}
pnlCustomLayout.Visible = chkCustomLayout.Checked;
// Custom table forms use default submit button in header actions
plcSubmitButton.Visible = (FormType != FORMTYPE_CUSTOMTABLE);
// Display button for inserting visibility macros only if enabled and the class is 'cms.user'
if (IsAlternative)
{
DataClassInfo dci = DataClassInfoProvider.GetDataClass(DataClassID);
if ((dci != null) && (dci.ClassName.ToLowerCSafe() == "cms.user"))
{
plcVisibility.Visible = true;
}
}
}
protected override void OnPreRender(EventArgs e)
{
// Get save script
string script = null;
if (!CustomLayoutEnabled)
{
if (LayoutIsSet)
{
script = "if(!ConfirmDelete()) { return false; } ";
}
}
else
{
script = " if (!CheckContent()) { return false; } ";
}
// Refresh script
save.OnClientClick = script;
menu.ReloadData();
base.OnPreRender(e);
}
///
/// Initializes HTML editor's settings.
///
protected void InitHTMLeditor()
{
htmlEditor.AutoDetectLanguage = false;
htmlEditor.DefaultLanguage = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
htmlEditor.ToolbarSet = "BizForm";
// Allow metafile attachments in media dialog
if ((ObjectID > 0) && (!string.IsNullOrEmpty(ObjectType)) && (!string.IsNullOrEmpty(ObjectCategory)))
{
DialogConfiguration config = htmlEditor.MediaDialogConfig;
config.MetaFileObjectID = ObjectID;
config.MetaFileObjectType = ObjectType;
config.MetaFileCategory = ObjectCategory;
config.HideAttachments = false;
}
}
///
/// Fills list of available fields.
///
protected void FillFieldsList()
{
FormInfo fi = null;
DataClassInfo dci = DataClassInfoProvider.GetDataClass(DataClassID);
if (dci != null)
{
// Load form definition
string formDefinition = dci.ClassFormDefinition;
if (IsAlternative)
{
// Get alternative form definition and merge if with the original one
AlternativeFormInfo afi = AlternativeFormInfoProvider.GetAlternativeFormInfo(ObjectID);
if (afi.FormCoupledClassID > 0)
{
// If coupled class is defined combine form definitions
DataClassInfo coupledDci = DataClassInfoProvider.GetDataClass(afi.FormCoupledClassID);
if (coupledDci != null)
{
formDefinition = FormHelper.MergeFormDefinitions(formDefinition, coupledDci.ClassFormDefinition, true);
}
}
// Merge class and alternative form definitions
formDefinition = FormHelper.MergeFormDefinitions(formDefinition, afi.FormDefinition);
}
fi = new FormInfo(formDefinition);
// Get visible fields
var visibleFields = fi.GetFields(true, false);
lstAvailableFields.Items.Clear();
if (FormType == FORMTYPE_DOCUMENT)
{
if (dci.ClassNodeNameSource == "") //if node name source is not set
{
lstAvailableFields.Items.Add(new ListItem(GetString("DocumentType_Edit_Form.DocumentName"), "DocumentName"));
}
}
if (visibleFields != null)
{
// Add public visible fields to the list
foreach (FormFieldInfo ffi in visibleFields)
{
lstAvailableFields.Items.Add(new ListItem(ffi.Name, ffi.Name));
}
}
if (FormType == FORMTYPE_DOCUMENT)
{
if (dci.ClassUsePublishFromTo)
{
lstAvailableFields.Items.Add(new ListItem(GetString("DocumentType_Edit_Form.DocumentPublishFrom"), "DocumentPublishFrom"));
lstAvailableFields.Items.Add(new ListItem(GetString("DocumentType_Edit_Form.DocumentPublishTo"), "DocumentPublishTo"));
}
}
lstAvailableFields.SelectedIndex = 0;
}
}
protected void lnkSave_Click(object sender, EventArgs e)
{
// Perform OnBeforeSave if defined
if (OnBeforeSave != null)
{
OnBeforeSave(this, EventArgs.Empty);
}
SaveData();
// Perform OnAfterSave if defined
if (OnAfterSave != null)
{
OnAfterSave(this, EventArgs.Empty);
}
}
///
/// Loads form layout of document, bizform, systemtable or alternative form.
///
protected void LoadData()
{
if (DataClassID > 0)
{
if (!IsAlternative)
{
DataClassInfo dci = DataClassInfoProvider.GetDataClass(DataClassID);
CMSPage.EditedObject = dci;
if (dci != null)
{
// Load layout of document, bizform or systemtable
FormLayout = dci.ClassFormLayout;
}
}
else
{
AlternativeFormInfo afi = AlternativeFormInfoProvider.GetAlternativeFormInfo(ObjectID);
CMSPage.EditedObject = afi;
if (afi != null)
{
// Load layout of alternative form
FormLayout = afi.FormLayout;
}
}
}
else
{
CMSPage.EditedObject = null;
}
}
///
/// Saves form layout.
///
protected void SaveData()
{
bool saved = false;
bool deleted = false;
// Get form layout
string layout = FormLayout;
// Delete layout if editor is hidden
if (!CustomLayoutEnabled)
{
deleted = LayoutIsSet;
layout = null;
}
if (DataClassID > 0)
{
if (!IsAlternative)
{
DataClassInfo dci = DataClassInfoProvider.GetDataClass(DataClassID);
CMSPage.EditedObject = dci;
if (dci != null)
{
// Update dataclass form layout and save object
dci.ClassFormLayout = layout;
DataClassInfoProvider.SetDataClass(dci);
saved = true;
}
}
else
{
AlternativeFormInfo afi = AlternativeFormInfoProvider.GetAlternativeFormInfo(ObjectID);
CMSPage.EditedObject = afi;
if (afi != null)
{
// Update alternative form layout and save object
afi.FormLayout = layout;
AlternativeFormInfoProvider.SetAlternativeFormInfo(afi);
saved = true;
}
}
// Display info if successfully saved
if (saved)
{
if (!deleted)
{
ShowChangesSaved();
}
else
{
ShowConfirmation(GetString("DocumentType_Edit_Form.LayoutDeleted"));
}
}
}
else
{
CMSPage.EditedObject = null;
}
}
protected void chkCustomLayout_CheckedChanged(object sender, EventArgs e)
{
if (chkCustomLayout.Checked)
{
LoadData();
}
}
#endregion
}