using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Runtime.InteropServices; using System.Web.UI; using System.Web.UI.WebControls; using System.Text; using System.Xml; using CMS.CMSHelper; using CMS.DataEngine; using CMS.EventLog; using CMS.ExtendedControls; using CMS.FormControls; using CMS.FormEngine; using CMS.GlobalHelper; using CMS.PortalEngine; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.UIControls; using CMS.ExtendedControls.ActionsConfig; using CMS.DocumentEngine; using CMS.IO; [Guid("B1E7505C-1699-4872-9A02-6D17FD661ABA")] public partial class CMSModules_AdminControls_Controls_Class_FieldEditor_FieldEditor : CMSUserControl { #region "Events" /// /// Event raised when OK button is clicked and before xml definition is changed. /// public event EventHandler OnBeforeDefinitionUpdate; /// /// Event raised when OK button is clicked and after xml definition is changed. /// public event EventHandler OnAfterDefinitionUpdate; /// /// Event raised when new field is created and form definition is saved. /// public event OnFieldCreatedEventHandler OnFieldCreated; /// /// Event raised when field name was changed. /// public event OnFieldNameChangedEventHandler OnFieldNameChanged; #endregion #region "Variables" private FormInfo fi = null; private FormFieldInfo ffi = null; private FormCategoryInfo fci = null; private IEnumerable columnNames = null; private bool mShowFieldVisibility = false; private bool mDevelopmentMode = false; private string mClassName = String.Empty; private string mImageDirectoryPath = null; private bool mDisplaySourceFieldSelection = true; private int mWebPartId = 0; private FieldEditorModeEnum mMode; private FieldEditorControlsEnum mDisplayedControls = FieldEditorControlsEnum.ModeSelected; private bool mEnableSystemFields = false; private bool mEnableMacrosForDefaultValue = true; private string mDisplayIn = String.Empty; private HeaderAction btnSave; private HeaderAction btnSimplified; private HeaderAction btnAdvanced; private bool mIsWizard; #endregion #region "Properties" /// /// Messages placeholder /// public override MessagesPlaceHolder MessagesPlaceHolder { get { return plcMess; } } /// /// Indicates if control is used on live site. /// public override bool IsLiveSite { get { return base.IsLiveSite; } set { hdrActions.IsLiveSite = value; plcMess.IsLiveSite = value; base.IsLiveSite = value; } } /// /// Adjust the context in which the attribute can be displayed. /// public string DisplayIn { get { return mDisplayIn; } set { mDisplayIn = value; } } /// /// Indicates if system fields from tables CMS_Tree and CMS_Document are offered to the user. /// public bool EnableSystemFields { get { return mEnableSystemFields; } set { mEnableSystemFields = value; databaseConfiguration.EnableSystemFields = value; } } /// /// Indicates if field visibility selector should be displayed. /// public bool ShowFieldVisibility { get { return mShowFieldVisibility; } set { mShowFieldVisibility = value; fieldAppearance.ShowFieldVisibility = value; } } /// /// Indicates if field editor works in development mode. /// public bool DevelopmentMode { get { return mDevelopmentMode; } set { fieldAppearance.DevelopmentMode = value; mDevelopmentMode = value; } } /// /// Class name. /// public string ClassName { get { return mClassName; } set { mClassName = value; fieldAppearance.ClassName = value; } } /// /// Coupled class name. /// public string CoupledClassName { get; set; } /// /// Header actions control. /// public override HeaderActions HeaderActions { get { return hdrActions; } } /// /// Directory path for images. /// public string ImageDirectoryPath { get { if (String.IsNullOrEmpty(mImageDirectoryPath)) { mImageDirectoryPath = "CMSModules/CMS_Class/"; } return mImageDirectoryPath; } set { if (!value.EndsWithCSafe("/")) { mImageDirectoryPath = value + "/"; } else { mImageDirectoryPath = value; } } } /// /// Indicates if display source field selection. /// public bool DisplaySourceFieldSelection { get { return mDisplaySourceFieldSelection; } set { mDisplaySourceFieldSelection = value; } } /// /// Webpart ID. /// public int WebPartId { get { return mWebPartId; } set { mWebPartId = value; } } /// /// Field editor mode. /// public FieldEditorModeEnum Mode { get { return mMode; } set { mMode = value; fieldAppearance.Mode = value; } } /// /// Type of custom controls that can be selected from the control list in FieldEditor. /// public FieldEditorControlsEnum DisplayedControls { get { return mDisplayedControls; } set { mDisplayedControls = value; fieldAppearance.DisplayedControls = value; } } /// /// Indicates if simplified mode is enabled. /// public bool EnableSimplifiedMode { get; set; } /// /// Form XML definition. /// public string FormDefinition { get { return ValidationHelper.GetString(ViewState["FormDefinition"], ""); } set { ViewState["FormDefinition"] = value; } } /// /// Enable or disable the option to use macros as default value. /// public bool EnableMacrosForDefaultValue { get { return mEnableMacrosForDefaultValue; } set { mEnableMacrosForDefaultValue = value; } } /// /// Gets or sets value indicating if control is placed in wizard. /// public bool IsWizard { get { return mIsWizard; } set { mIsWizard = value; categoryEdit.IsWizard = value; fieldAdvancedSettings.IsWizard = value; } } /// /// Indicates if Field Editor is used as alternative form. /// public bool IsAlternativeForm { get; set; } /// /// Gets or sets alternative form full name. /// public string AlternativeFormFullName { get; set; } /// /// Shows in what control is this basic form used. /// public FormTypeEnum FormType { get { return simpleMode.FormType; } set { simpleMode.FormType = value; controlSettings.FormType = value; } } /// /// Enables or disables to edit settings. /// public bool ShowInheritanceSettings { get { return fieldAppearance.ShowInheritanceSettings; } set { fieldAppearance.ShowInheritanceSettings = value; } } private bool mReloadOnDelete = true; /// /// Indicates if page with field editor should be reloaded after a form element is deleted. /// public bool ReloadOnDelete { get { return mReloadOnDelete; } set { mReloadOnDelete = value; } } #endregion #region "Private properties" /// /// Returns True if system fields are enabled and one of them is selected. /// private bool IsSystemFieldSelected { get { return databaseConfiguration.IsSystemFieldSelected; } } /// /// Selected mode. /// private FieldEditorSelectedModeEnum SelectedMode { get { FieldEditorSelectedModeEnum mode; if (ViewState["SelectedMode"] == null) { mode = GetDefaultSelectedMode(); } else { switch (ValidationHelper.GetInteger(ViewState["SelectedMode"], 0)) { case 0: mode = FieldEditorSelectedModeEnum.Simplified; break; case 1: mode = FieldEditorSelectedModeEnum.Advanced; break; default: mode = GetDefaultSelectedMode(); break; } } return mode; } set { switch (value) { case FieldEditorSelectedModeEnum.Simplified: ViewState["SelectedMode"] = 0; break; case FieldEditorSelectedModeEnum.Advanced: ViewState["SelectedMode"] = 1; break; } } } /// /// Indicates whether new item is edited. /// private bool IsNewItemEdited { get { return ValidationHelper.GetBoolean(ViewState["IsNewItemEdited"], false); } set { ViewState["IsNewItemEdited"] = value; databaseConfiguration.IsNewItemEdited = value; simpleMode.IsNewItemEdited = value; } } /// /// Selected item name. /// private string SelectedItemName { get { return ValidationHelper.GetString(ViewState["SelectedItemName"], ""); } set { ViewState["SelectedItemName"] = value; } } /// /// Selected item type. /// private FieldEditorSelectedItemEnum SelectedItemType { get { object obj = ViewState["SelectedItemType"]; return (obj == null) ? 0 : (FieldEditorSelectedItemEnum)obj; } set { ViewState["SelectedItemType"] = value; } } /// /// Is field primary. /// private bool IsPrimaryField { get { return ValidationHelper.GetBoolean(ViewState["IsPrimaryField"], false); } set { ViewState["IsPrimaryField"] = value; } } /// /// Indicates if document type is edited. /// private bool IsDocumentType { get { object obj = ViewState["IsDocumentType"]; if ((obj == null) && (!string.IsNullOrEmpty(ClassName))) { DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName); ViewState["IsDocumentType"] = ((dci != null) && dci.ClassIsDocumentType); } return ValidationHelper.GetBoolean(ViewState["IsDocumentType"], false); } } /// /// Gets or sets value indicating what item was selected in field type drop-down list. /// private string PreviousField { get { return ValidationHelper.GetString(ViewState["PreviousValue"], ""); } set { ViewState["PreviousValue"] = value; } } /// /// Gets or sets value indicating if detailed controls are visible. /// private bool FieldDetailsVisible { get { return ValidationHelper.GetBoolean(ViewState["FieldDetailsVisible"], false); } set { ViewState["FieldDetailsVisible"] = value; } } /// /// Gets macro resolver name. /// private string ResolverName { get { if (!string.IsNullOrEmpty(ClassName)) { return "form." + ClassName; } else { return "formdefinition." + FormDefinition; } } } #endregion #region "Global definitions" // Constants private const string newCategPreffix = "#categ##new#"; private const string newFieldPreffix = "#field##new#"; private const string categPreffix = "#categ#"; private const string fieldPreffix = "#field#"; private const int preffixLength = 7; // Length of categPreffix = length of fieldPreffix = 7 private const string controlPrefix = "#uc#"; #endregion #region "Page events" protected override void OnInit(EventArgs e) { base.OnInit(e); var page = Page as CMSPage; if (page != null) { page.EnsureScriptManager(); if (page.ScriptManagerControl != null) { var script = new ScriptReference("~/CMSScripts/RestoreLostFocus.js"); page.ScriptManagerControl.Scripts.Add(script); } } CreateHeaderActions(); // Set method delegates fieldAppearance.GetControls = GetControls; simpleMode.GetControls = GetControls; } /// /// Creates header actions - save, switch to advanced and switch to simple mode buttons. /// private void CreateHeaderActions() { HeaderActions.ActionsList.Clear(); btnSave = new HeaderAction() { RegisterShortcutScript = true, CommandName = "save", CommandArgument = "save", Text = GetString("general.save"), ImageUrl = GetImageUrl("CMSModules/CMS_Content/EditMenu/save.png"), SmallImageUrl = GetImageUrl("CMSModules/CMS_Content/EditMenu/16/save.png") }; btnSimplified = new HeaderAction() { CommandName = "simplified", Text = GetString("fieldeditor.tabs.simplifiedmode"), ControlType = HeaderActionTypeEnum.Hyperlink, ImageUrl = GetImageUrl("CMSModules/CMS_FormEngine/arrowup.png"), Visible = false }; btnAdvanced = new HeaderAction() { CommandName = "advanced", Text = GetString("fieldeditor.tabs.advancedmode"), ControlType = HeaderActionTypeEnum.Hyperlink, ImageUrl = GetImageUrl("CMSModules/CMS_FormEngine/arrowdown.png"), Visible = false }; HeaderActions.AddAction(btnSave); HeaderActions.AddAction(btnSimplified); HeaderActions.AddAction(btnAdvanced); HeaderActions.ActionPerformed += HeaderActions_ActionPerformed; } /// /// Actions handler. /// protected void HeaderActions_ActionPerformed(object sender, CommandEventArgs e) { switch (e.CommandName) { case "save": SaveField(); break; case "simplified": SwitchToSimpleMode(); break; case "advanced": SwitchToAdvancedMode(); break; } } protected void Page_Load(object sender, EventArgs e) { if (EnableSystemFields) { btnNewSysAttribute.Visible = true; btnNewSysAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "NewSystem.png"); btnNewSysAttribute.ToolTip = GetString("TemplateDesigner.NewSysAttribute"); } else { btnNewSysAttribute.Visible = false; } fieldAdvancedSettings.ResolverName = categoryEdit.ResolverName = ResolverName; fieldAdvancedSettings.ShowDisplayInSimpleModeCheckBox = (Mode == FieldEditorModeEnum.FormControls); // Hide New primary attribute if we are not in system development mode btnNewPrimaryAttribute.Visible = DevelopmentMode; simpleMode.DevelopmentMode = DevelopmentMode; simpleMode.Mode = Mode; lnkCode.Visible = SettingsKeyProvider.DevelopmentMode && !IsWizard; lnkFormDef.Visible = SettingsKeyProvider.DevelopmentMode && !IsWizard; // Set images url btnNewCategory.ImageUrl = GetImageUrl(ImageDirectoryPath + "NewCategory.png"); btnNewAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "New.png"); btnNewPrimaryAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "NewPK.png"); btnDeleteItem.ImageUrl = GetImageUrl(ImageDirectoryPath + "Delete.png"); btnUpAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "Up.png"); btnDownAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "Down.png"); btnDeleteItem.ToolTip = GetString("TemplateDesigner.DeleteItem"); btnNewCategory.ToolTip = GetString("TemplateDesigner.NewCategory"); btnNewAttribute.ToolTip = GetString("TemplateDesigner.NewAttribute"); btnNewPrimaryAttribute.ToolTip = GetString("TemplateDesigner.NewPrimaryAttribute"); btnDownAttribute.ToolTip = GetString("TemplateDesigner.DownAttribute"); btnUpAttribute.ToolTip = GetString("TemplateDesigner.UpAttribute"); if (CMSString.Compare(DisplayIn, FormInfo.DISPLAY_CONTEXT_DASHBOARD, true) == 0) { pnlDisplayInDashBoard.Visible = true; } ltlConfirmText.Text = ""; btnDeleteItem.Attributes.Add("onclick", "javascript:return confirmDelete();"); btnUpAttribute.Enabled = true; btnDownAttribute.Enabled = true; btnDeleteItem.Enabled = true; btnNewAttribute.Enabled = true; btnNewCategory.Enabled = true; databaseConfiguration.LoadGroupField(); if (!URLHelper.IsPostback()) { // Preselect field if query-string parameter is set string preselectedField = QueryHelper.GetString("selectedfield", string.Empty).Replace("%23", "#"); Reload(preselectedField); } else { LoadControlSettings(PreviousField, false); } // Register event handlers databaseConfiguration.DropChanged += databaseConfiguration_DropChanged; databaseConfiguration.AttributeChanged += databaseConfiguration_AttributeChanged; fieldAppearance.OnFieldSelected += control_FieldSelected; simpleMode.OnFieldSelected += control_FieldSelected; simpleMode.OnGetFieldInfo += simpleMode_OnGetFieldInfo; documentSource.OnSourceFieldChanged += documentSource_OnSourceFieldChanged; plcValidation.Visible = true; plcQuickValidation.Visible = true; plcSettings.Visible = true; } protected void Page_PreRender(object sender, EventArgs e) { // Display controls and quick links according to current mode bool displayDetails = FieldDetailsVisible && chkDisplayInForm.Checked; fieldAppearance.Visible = displayDetails; fieldAdvancedSettings.Visible = displayDetails; cssSettings.Visible = displayDetails; validationSettings.DisplayControls(); validationSettings.Visible = displayDetails && validationSettings.Visible; controlSettings.CheckVisibility(); controlSettings.Visible = displayDetails && controlSettings.Visible; plcQuickValidation.Visible = displayDetails && validationSettings.Visible; plcQuickSettings.Visible = displayDetails && controlSettings.Visible; plcQuickStyles.Visible = displayDetails && cssSettings.Visible; plcQuickAppearance.Visible = displayDetails && fieldAppearance.Visible; chkDisplayInDashBoard.Enabled = chkDisplayInForm.Checked; // Display and store last value for simple mode if (SelectedMode == FieldEditorSelectedModeEnum.Simplified) { PreviousField = simpleMode.FieldType; plcQuickSelect.Visible = false; } // Display and store last value for advanced mode else { PreviousField = fieldAppearance.FieldType; plcQuickSelect.Visible = true; } // Display or hide tabs btnAdvanced.Visible = btnSimplified.Visible = false; if (EnableSimplifiedMode) { if (SelectedItemType == FieldEditorSelectedItemEnum.Field) { btnAdvanced.Visible = (SelectedMode == FieldEditorSelectedModeEnum.Simplified); btnSimplified.Visible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified); } } // Hide quick links if only 'database quick link' should be displayed if ((SelectedItemType == 0) || (!plcQuickValidation.Visible && !plcQuickSettings.Visible && !plcQuickStyles.Visible && !plcQuickAppearance.Visible)) { plcQuickSelect.Visible = false; } // Register script for scrolling content using quick links ScriptHelper.RegisterJQuery(Page); ScriptHelper.RegisterStartupScript(this, typeof(string), "ContentSlider", ScriptHelper.GetScript(@" jQuery(document).ready(function(){ jQuery('a[href*=#]').click(function() { if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) { var $target = jQuery(this.hash); $target = $target.length && $target || jQuery('[name=' + this.hash.slice(1) +']'); if ($target.length) { var targetOffset = $target." + (IsWizard ? "position" : "offset") + @"().top; jQuery('" + (IsWizard ? ".FieldPanelRightWizard" : "html, body") + @"') .animate({scrollTop: targetOffset}, 300); return false; } } }); }); ")); // Disable padding on the page caused by PageContent CSS class Panel contentPanel = ((CMSPage)Page).CurrentMaster.PanelContent; if (!IsWizard && contentPanel != null) { contentPanel.CssClass = string.Empty; } // Highlight attribute list items HighlightListItems(); } /// /// Highlights attribute list items like categories, primary keys and hidden fields. /// private void HighlightListItems() { if (fi == null) { LoadFormDefinition(); } if ((lstAttributes.Items.Count > 0) && (fi != null)) { FormFieldInfo formField = null; string cssClass = null; foreach (ListItem li in lstAttributes.Items) { // Mark category item with different color if (li.Value.StartsWithCSafe(categPreffix)) { li.Attributes.Add("class", "FieldEditorCategoryItem"); } else { // Get form field info formField = fi.GetFormField(li.Value.Substring(preffixLength)); if (formField != null) { cssClass = string.Empty; if (DevelopmentMode && formField.PrimaryKey) { // Highlight primary keys in the list cssClass = "FieldEditorPrimaryAttribute"; } if (!formField.Visible) { if (!string.IsNullOrEmpty(cssClass)) { cssClass += " "; } // Highlight fields that are not visible cssClass += "FieldEditorHiddenItem"; } if (!string.IsNullOrEmpty(cssClass)) { li.Attributes.Add("class", cssClass); } } } } } } #endregion #region "Methods" /// /// Reload field editor. /// /// Selected field in field list public void Reload(string selectedValue) { Reload(selectedValue, false); } /// /// Reload field editor. /// /// Selected field in field list /// Indicates if not all controls need to be reloaded private void Reload(string selectedValue, bool partialReload) { bool isModeSelected = false; bool isItemSelected = false; // Check for alternative form mode if (IsAlternativeForm) { if (!string.IsNullOrEmpty(FormDefinition)) { isModeSelected = true; } else { // Clear item list lstAttributes.Items.Clear(); } } else { switch (mMode) { case FieldEditorModeEnum.General: case FieldEditorModeEnum.FormControls: if (!string.IsNullOrEmpty(FormDefinition)) { isModeSelected = true; } else { // Clear item list lstAttributes.Items.Clear(); } break; case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: if (!string.IsNullOrEmpty(mClassName)) { isModeSelected = true; } else { ShowError(GetString("fieldeditor.noclassname")); } break; case FieldEditorModeEnum.WebPartProperties: if ((mWebPartId > 0)) { isModeSelected = true; } else { ShowError(GetString("fieldeditor.nowebpartid")); } break; default: ShowError(GetString("fieldeditor.nomode")); break; } } if (!partialReload) { // Display controls if mode is determined ShowOrHideFieldDetails(true); } if (isModeSelected) { isItemSelected = LoadInnerControls(selectedValue, partialReload); } // Hide controls when item isn't selected if ((!partialReload) && (!isItemSelected)) { HideAllPanels(); btnSave.Enabled = false; btnSave.ImageUrl = GetImageUrl("CMSModules/CMS_Content/EditMenu/savedisabled.png"); btnUpAttribute.Enabled = false; btnDownAttribute.Enabled = false; btnDeleteItem.Enabled = false; btnNewAttribute.Enabled = true; // Only new items can be added btnNewCategory.Enabled = true; // Only new items can be added ShowInformation(GetString("fieldeditor.nofieldsdefined")); } DisplayOrHideActions(); if (documentSource.VisibleContent) { documentSource.Reload(); } // Show or hide field visibility selector fieldAppearance.ShowFieldVisibility = ShowFieldVisibility; } /// /// Loads inner FieldEditor controls. /// /// Returns TRUE if any item is selected private bool LoadInnerControls(string selectedValue, bool partialReload) { bool isItemSelected = false; LoadFormDefinition(); if (!partialReload) { LoadAttributesList(selectedValue); } documentSource.FormInfo = fi; documentSource.Mode = Mode; documentSource.IsAlternativeForm = IsAlternativeForm; documentSource.ClassName = ClassName; fieldAppearance.IsAlternativeForm = IsAlternativeForm; fieldAppearance.AlternativeFormFullName = AlternativeFormFullName; if (SelectedItemType == FieldEditorSelectedItemEnum.Field) { isItemSelected = true; DisplaySelectedTabContent(); ffi = fi.GetFormField(SelectedItemName); if (EnableSimplifiedMode) { btnAdvanced.Visible = (SelectedMode == FieldEditorSelectedModeEnum.Simplified); btnSimplified.Visible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified); } LoadSelectedField(partialReload); } else if (SelectedItemType == FieldEditorSelectedItemEnum.Category) { isItemSelected = true; btnAdvanced.Visible = btnSimplified.Visible = false; LoadSelectedCategory(); } return isItemSelected; } /// /// Load xml definition of the form. /// private void LoadFormDefinition() { bool isError = false; switch (mMode) { case FieldEditorModeEnum.General: // Definition is loaded from external xml break; case FieldEditorModeEnum.WebPartProperties: if (!IsAlternativeForm) { // Load xml definition from web part info WebPartInfo wpi = WebPartInfoProvider.GetWebPartInfo(mWebPartId); if (wpi != null) { FormDefinition = wpi.WebPartProperties; } else { isError = true; } } break; case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: if (!IsAlternativeForm) { // Load xml definition from Class info DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName); if (dci != null) { FormDefinition = dci.ClassFormDefinition; } else { isError = true; } } break; } if (isError) { ShowError("[ FieldEditor.LoadFormDefinition() ]: " + GetString("FieldEditor.XmlDefinitionNotLoaded")); } fi = new FormInfo(FormDefinition); } /// /// Fill attribute list. /// /// Selected value in attribute list, null if first item is selected private void LoadAttributesList(string selectedValue) { FormFieldInfo formField = null; FormCategoryInfo formCategory = null; ListItem li = null; // Reload list only if new item is not edited if (!IsNewItemEdited) { // Clear item list lstAttributes.Items.Clear(); // Get all list items (fields and categories) var itemList = fi.GetFormElements(true, true); if (itemList != null) { string itemDisplayName = null; string itemCodeName = null; foreach (object item in itemList) { if (item is FormFieldInfo) { formField = ((FormFieldInfo)(item)); itemDisplayName = formField.Name; if (!formField.AllowEmpty) { itemDisplayName += ResHelper.RequiredMark; } itemCodeName = fieldPreffix + formField.Name; li = new ListItem(itemDisplayName, itemCodeName); } else if (item is FormCategoryInfo) { formCategory = ((FormCategoryInfo)(item)); itemDisplayName = ResHelper.LocalizeString(formCategory.CategoryCaption); itemCodeName = categPreffix + formCategory.CategoryName; li = new ListItem(itemDisplayName, itemCodeName); } // Load list box if (li != null) { lstAttributes.Items.Add(li); } } } // Set selected item if (lstAttributes.Items.Count > 0) { if (!string.IsNullOrEmpty(selectedValue) && lstAttributes.Items.FindByValue(selectedValue) != null) { lstAttributes.SelectedValue = selectedValue; } else { // Select first item of the list lstAttributes.SelectedIndex = 0; } } // Default values - list is empty SelectedItemName = null; SelectedItemType = 0; // Save selected item info if (lstAttributes.SelectedValue != null) { if (lstAttributes.SelectedValue.StartsWithCSafe(fieldPreffix)) { SelectedItemName = lstAttributes.SelectedValue.Substring(preffixLength); SelectedItemType = FieldEditorSelectedItemEnum.Field; } else if (lstAttributes.SelectedValue.StartsWithCSafe(categPreffix)) { SelectedItemName = lstAttributes.SelectedValue.Substring(preffixLength); SelectedItemType = FieldEditorSelectedItemEnum.Category; } } } } /// /// Sets all values of the category edit form to defaults. /// private void LoadDefaultCategoryEditForm() { plcCategory.Visible = true; plcSimple.Visible = false; plcAdvanced.Visible = false; categoryEdit.Value = string.Empty; categoryEdit.Collapsible = false; categoryEdit.CollapsedByDefault = false; categoryEdit.VisibleMacro = string.Empty; categoryEdit.CategoryVisible = true; LoadFormDefinition(); } /// /// Sets all values of form to defaults. /// /// True - empty form for node or document attribute should be loaded, False - standard form should be loaded /// True - indicates that only some controls should be loaded, False - reload all controls private void LoadDefaultAttributeEditForm(bool system, bool partialReload) { ffi = null; plcCategory.Visible = false; chkDisplayInForm.Checked = true; chkDisplayInDashBoard.Checked = true; if ((SelectedMode == FieldEditorSelectedModeEnum.Advanced) && !partialReload) { databaseConfiguration.DevelopmentMode = DevelopmentMode; databaseConfiguration.ShowSystemFields = system; databaseConfiguration.IsDocumentType = IsDocumentType; databaseConfiguration.Mode = Mode; databaseConfiguration.ClassName = ClassName; databaseConfiguration.CoupledClassName = CoupledClassName; databaseConfiguration.IsAlternativeForm = IsAlternativeForm; databaseConfiguration.Reload("", IsNewItemEdited); databaseConfiguration.ShowDefaultControl(); } if (system) { LoadSystemField(); } if (SelectedMode == FieldEditorSelectedModeEnum.Advanced) { fieldAppearance.ClassName = ClassName; fieldAppearance.AttributeType = databaseConfiguration.AttributeType; fieldAppearance.Reload(); fieldAdvancedSettings.Reload(); cssSettings.Reload(); LoadValidationSettings(); validationSettings.DisplayControls(); validationSettings.Reload(); chkDisplayInForm.Checked = true; chkDisplayInDashBoard.Checked = true; } else { simpleMode.FieldInfo = null; simpleMode.DisplayedControls = DisplayedControls; simpleMode.Mode = Mode; simpleMode.ClearForm(); simpleMode.LoadTypes(); simpleMode.LoadControlSettings(null, true); } } /// /// Fill form with selected category data. /// private void LoadSelectedCategory() { plcAdvanced.Visible = false; plcSimple.Visible = false; plcCategory.Visible = true; fci = fi.GetFormCategory(SelectedItemName); if (fci != null) { HandleInherited(fci.IsInherited); categoryEdit.Value = fci.CategoryCaption; categoryEdit.Collapsible = fci.CategoryCollapsible; categoryEdit.CollapsedByDefault = fci.CategoryCollapsedByDefault; categoryEdit.VisibleMacro = fci.VisibleMacro; categoryEdit.CategoryVisible = fci.Visible; } else { LoadDefaultCategoryEditForm(); } } /// /// Displays controls for advanced editing. /// private void ShowAdvancedOptions() { if (SelectedMode != FieldEditorSelectedModeEnum.Simplified) { plcSimple.Visible = false; plcCategory.Visible = false; databaseConfiguration.Visible = true; controlSettings.Visible = true; fieldAppearance.Visible = true; fieldAdvancedSettings.Visible = true; validationSettings.Visible = true; cssSettings.Visible = true; FieldDetailsVisible = true; } } /// /// Handles the inheritance of the field. /// private void HandleInherited(bool inherited) { pnlField.Enabled = true; btnSave.Enabled = true; btnDeleteItem.Visible = true; ShowInformation(String.Empty); if (inherited && !IsAlternativeForm) { // Get information on inherited class DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName); if (dci != null) { DataClassInfo parentCi = DataClassInfoProvider.GetDataClass(dci.ClassInheritsFromClassID); if (parentCi != null) { pnlField.Enabled = false; btnSave.Enabled = false; btnDeleteItem.Visible = false; ShowInformation(String.Format(GetString("DocumentType.FieldIsInherited"), parentCi.ClassDisplayName)); } } } } /// /// Fill form with selected attribute data. /// /// Indicates if only some controls should be reloaded private void LoadSelectedField(bool partialReload) { // Fill form if (ffi != null) { HandleInherited(ffi.IsInherited); IsPrimaryField = ffi.PrimaryKey; if (!partialReload) { bool controlIsInvalid = !ffi.Visible || (CMSString.Compare(ffi.Settings["controlname"] as String, FormHelper.GetFormFieldControlTypeString(FormFieldControlTypeEnum.Unknown), true) != 0); chkDisplayInForm.Checked = ffi.Visible && controlIsInvalid; chkDisplayInDashBoard.Checked = (CMSString.Compare(ffi.DisplayIn, DisplayIn, true) == 0); } DisplaySelectedTabContent(); ShowAdvancedOptions(); // Load controls for advanced mode if (SelectedMode == FieldEditorSelectedModeEnum.Advanced) { if (!partialReload) { databaseConfiguration.DevelopmentMode = DevelopmentMode; databaseConfiguration.ShowSystemFields = ffi.External; databaseConfiguration.FieldInfo = ffi; databaseConfiguration.IsDocumentType = IsDocumentType; databaseConfiguration.Mode = Mode; databaseConfiguration.IsAlternativeForm = IsAlternativeForm; databaseConfiguration.ClassName = ClassName; databaseConfiguration.CoupledClassName = CoupledClassName; databaseConfiguration.Reload(ffi.Name, IsNewItemEdited); } if (chkDisplayInForm.Checked && fieldAppearance.Visible) { fieldAppearance.Mode = Mode; fieldAppearance.ClassName = ClassName; fieldAppearance.FieldInfo = ffi; fieldAppearance.AttributeType = databaseConfiguration.AttributeType; fieldAppearance.Reload(); } if (chkDisplayInForm.Checked && fieldAdvancedSettings.Visible) { fieldAdvancedSettings.FieldInfo = ffi; fieldAdvancedSettings.Reload(); } if (chkDisplayInForm.Checked && validationSettings.Visible) { LoadValidationSettings(); validationSettings.DisplayControls(); validationSettings.Reload(); } if (chkDisplayInForm.Checked && cssSettings.Visible) { cssSettings.FieldInfo = ffi; cssSettings.Reload(); cssSettings.Enabled = true; } } // Load controls for simple mode else { simpleMode.FieldInfo = ffi; simpleMode.Mode = Mode; simpleMode.LoadTypes(); } LoadControlSettings(null, false); } else { LoadDefaultAttributeEditForm(false, partialReload); } } /// /// Loads validation settings. /// private void LoadValidationSettings() { validationSettings.IsPrimary = IsPrimaryField; validationSettings.FieldInfo = ffi; validationSettings.Mode = Mode; validationSettings.AttributeType = databaseConfiguration.AttributeType; validationSettings.FieldType = fieldAppearance.FieldType; } /// /// Displays or hides actions according to the selected mode. /// protected void DisplayOrHideActions() { // Hide actions only when alternative form definition is edited if (IsAlternativeForm) { plcActions.Visible = false; } } protected void lnkCode_Click(object sender, EventArgs e) { GenerateCode(false); } protected void lnkFormDef_Click(object sender, EventArgs e) { GetFormDefinition(); } /// /// Outputs the form definition XML of the current view /// protected void GetFormDefinition() { LoadFormDefinition(); if (fi != null) { string xml = HTMLHelper.ReformatHTML(fi.GetXmlDefinition()); // Write directly to response Response.Clear(); Response.AddHeader("Content-Disposition", "attachment; filename=formDefinition.xml"); Response.ContentType = "text/xml"; Response.Write(xml); Response.End(); } } /// /// Generates the class code. /// /// If true, the code is generated to a file, if false, it gets directly to output protected void GenerateCode(bool file) { switch (mMode) { case FieldEditorModeEnum.WebPartProperties: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.FormControls: return; } try { // Prepare the folders string templateFile = Server.MapPath("~/App_Data/CodeTemplates/"); string codeFile = Server.MapPath("~/App_Code"); if (!Directory.Exists(codeFile)) { codeFile = Server.MapPath("~/Old_App_Code"); } codeFile += "/Global/AutoGenerated/"; // Ensure the directory if (file) { Directory.CreateDirectory(codeFile); } // Save xml string to CMS_Class table DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName); if (dci != null) { // Prepare the class name string className = dci.ClassName; int dotIndex = className.LastIndexOf('.'); if (dotIndex >= 0) { className = className.Substring(dotIndex + 1); } className = ValidationHelper.GetIdentifier(className, ""); className = (className[0]) + className.Substring(1).ToUpperCSafe(); string originalClassName = null; if (dci.ClassIsDocumentType) { // Document type className += "Document"; codeFile += "DocumentTypes/"; templateFile += "DocType.template"; originalClassName = "DocType"; } else if (dci.ClassIsCustomTable) { // Custom table className += "Item"; codeFile += "CustomTables/"; templateFile += "CustomTableType.template"; originalClassName = "CustomTableType"; } else { // BizForm className += "Item"; codeFile += "BizForms/"; templateFile += "BizFormType.template"; originalClassName = "BizFormType"; } // Generate the code string code = File.ReadAllText(templateFile); StringBuilder sbInit = new StringBuilder(); if (fi == null) { fi = new FormInfo(dci.ClassFormDefinition); } string propertiesCode = CodeGenerator.GetPropertiesCode(fi, false, null, null, false); // Replace in code code = code.Replace("##CLASSNAME##", dci.ClassName); code = code.Replace(originalClassName, className); code = code.Replace("// ##PROPERTIES##", propertiesCode); code = code.Replace("##SUMMARY##", dci.ClassDisplayName); codeFile += className + ".cs"; if (file) { File.WriteAllText(codeFile, code); } else { // Write directly to response Response.Clear(); Response.AddHeader("Content-Disposition", "attachment; filename=" + className + ".cs"); Response.ContentType = "text/plain"; Response.Write(code); Response.End(); } } else { ShowError("[FieldEditor.UpdateFormDefinition]: " + GetString("FieldEditor.ClassNotFound")); } } catch (Exception ex) { // Log the error silently EventLogProvider.LogException("FieldEditor", "CODEGEN", ex); } } /// /// Saves the form definition and refreshes the form. /// protected void SaveFormDefinition() { // Update form definition FormDefinition = fi.GetXmlDefinition(); switch (mMode) { case FieldEditorModeEnum.WebPartProperties: // Save xml string to CMS_WebPart table WebPartInfo wpi = WebPartInfoProvider.GetWebPartInfo(mWebPartId); if (wpi != null) { wpi.WebPartProperties = FormDefinition; WebPartInfoProvider.SetWebPartInfo(wpi); } else { ShowError("[FieldEditor.UpdateFormDefinition]: " + GetString("FieldEditor.WebpartNotFound")); } break; case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: // Save xml string to CMS_Class table DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName); if (dci != null) { dci.ClassFormDefinition = FormDefinition; using (CMSActionContext context = new CMSActionContext()) { // Do not log synchronization for BizForm if (mMode == FieldEditorModeEnum.BizFormDefinition) { context.DisableLogging(); } // Save the class data DataClassInfoProvider.SetDataClass(dci); // Update inherited classes with new fields FormHelper.UpdateInheritedClasses(dci); } } else { ShowError("[FieldEditor.UpdateFormDefinition]: " + GetString("FieldEditor.ClassNotFound")); } break; } // Reload attribute list LoadAttributesList(lstAttributes.SelectedValue); } /// /// When attribute up button is clicked. /// protected void btnUpAttribute_Click(Object sender, ImageClickEventArgs e) { // Raise on before definition update event if (OnBeforeDefinitionUpdate != null) { OnBeforeDefinitionUpdate(this, EventArgs.Empty); } if (Mode == FieldEditorModeEnum.BizFormDefinition) { // Check 'EditForm' permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm")) { RedirectToAccessDenied("cms.form", "EditForm"); } } LoadFormDefinition(); // First item of the attribute list cannot be moved higher if (string.IsNullOrEmpty(lstAttributes.SelectedValue) || (lstAttributes.SelectedIndex == 0)) { return; } // 'new (not saved)' attribute cannot be moved else if ((SelectedItemName == newCategPreffix) || (SelectedItemName == newFieldPreffix)) { ShowMessage(GetString("TemplateDesigner.AlertNewAttributeCannotBeMoved")); return; } if (SelectedItemType == FieldEditorSelectedItemEnum.Field) { // Move attribute up in attribute list fi.MoveFormFieldUp(SelectedItemName); } else if (SelectedItemType == FieldEditorSelectedItemEnum.Category) { // Move category up in attribute list fi.MoveFormCategoryUp(SelectedItemName); } // Update the form definition SaveFormDefinition(); if (OnAfterDefinitionUpdate != null) { OnAfterDefinitionUpdate(this, EventArgs.Empty); } } /// /// When attribute down button is clicked. /// protected void btnDownAttribute_Click(Object sender, ImageClickEventArgs e) { // Raise on before definition update event if (OnBeforeDefinitionUpdate != null) { OnBeforeDefinitionUpdate(this, EventArgs.Empty); } if (Mode == FieldEditorModeEnum.BizFormDefinition) { // Check 'EditForm' permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm")) { RedirectToAccessDenied("cms.form", "EditForm"); } } LoadFormDefinition(); // Last item of the attribute list cannot be moved lower if (string.IsNullOrEmpty(lstAttributes.SelectedValue) || lstAttributes.SelectedIndex >= lstAttributes.Items.Count - 1) { return; } // 'new and not saved' attribute cannot be moved else if ((SelectedItemName == newCategPreffix) || (SelectedItemName == newFieldPreffix)) { ShowMessage(GetString("TemplateDesigner.AlertNewAttributeCannotBeMoved")); return; } if (SelectedItemType == FieldEditorSelectedItemEnum.Field) { // Move attribute down in attribute list fi.MoveFormFieldDown(SelectedItemName); } else if (SelectedItemType == FieldEditorSelectedItemEnum.Category) { // Move category down in attribute list fi.MoveFormCategoryDown(SelectedItemName); } // Update the form definition SaveFormDefinition(); // Raise on after definition update event if (OnAfterDefinitionUpdate != null) { OnAfterDefinitionUpdate(this, EventArgs.Empty); } } /// /// When chkDisplayInForm checkbox checked changed. /// protected void chkDisplayInForm_CheckedChanged(Object sender, EventArgs e) { ShowOrHideFieldDetails(false); } /// /// Selected attribute changed event handler. /// protected void lstAttributes_SelectedIndexChanged(Object sender, EventArgs e) { bool isNewCreated = false; // Check if new attribute is edited -> select it and avoid selecting another attribute foreach (ListItem item in lstAttributes.Items) { switch (item.Value) { case newCategPreffix: isNewCreated = true; lstAttributes.SelectedValue = newCategPreffix; break; case newFieldPreffix: isNewCreated = true; lstAttributes.SelectedValue = newFieldPreffix; break; } if (isNewCreated) { ShowMessage(GetString("TemplateDesigner.AlertSaveNewItemOrDeleteItFirst")); if (IsSystemFieldSelected) { databaseConfiguration.DisableFieldEditing(true, false); simpleMode.DisableFieldEditing(); } else { databaseConfiguration.EnableFieldEditing(); simpleMode.EnableFieldEditing(); } return; } } // Reload data Reload(lstAttributes.SelectedValue); } /// /// Show or hide details according to chkDisplayInForm checkbox is checked or not. /// /// Indicates if SelectedMode was changed by link private void ShowOrHideFieldDetails(bool changeMode) { // Hide or display controls because mode was changed from Simple to Advanced or otherwise if (changeMode) { FieldDetailsVisible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified); } // Hide or display controls because checkbox 'display in form' was checked else { FieldDetailsVisible = chkDisplayInForm.Checked; } if (FieldDetailsVisible) { Reload(lstAttributes.SelectedValue, true); } } /// /// Saves currently edited field. /// private void SaveField() { // Raise on after definition update event if (OnBeforeDefinitionUpdate != null) { OnBeforeDefinitionUpdate(this, EventArgs.Empty); } if (Mode == FieldEditorModeEnum.BizFormDefinition) { // Check 'EditForm' permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm")) { RedirectToAccessDenied("cms.form", "EditForm"); } } string errorMessage = String.Empty; if (SelectedItemType == FieldEditorSelectedItemEnum.Field) { errorMessage += ValidateForm(); } // Check occurred errors if (!string.IsNullOrEmpty(errorMessage)) { ShowError(errorMessage); } else { if (ValidateControlForms()) { // Save selected field SaveSelectedField(); ClearHashtables(); } else { ShowError(GetString("fieldeditor.invalidcontrolform")); } } // Raise on after definition update event if (OnAfterDefinitionUpdate != null) { OnAfterDefinitionUpdate(this, EventArgs.Empty); } } /// /// Save selected field. /// private void SaveSelectedField() { DataClassInfo dci = null; bool updateInherited = false; // Ensure the transaction using (var tr = new CMSLateBoundTransaction()) { // FormFieldInfo structure with data from updated form FormFieldInfo ffiUpdated = null; // FormCategoryInfo structure with data from updated form FormCategoryInfo fciUpdated = null; // Determines whether it is a new attribute (or attribute to update) bool isNewItem = false; string errorMessage = null; WebPartInfo wpi = null; // Variables for changes in DB tables string tableName = null; string oldColumnName = null; string newColumnName = null; string newColumnSize = null; string newColumnType = null; string newColumnDefaultValue = null; // No default value bool newColumnAllowNull = true; TableManager tm = null; if (!IsAlternativeForm) { switch (mMode) { case FieldEditorModeEnum.WebPartProperties: // Fill WebPartInfo structure with data from database wpi = WebPartInfoProvider.GetWebPartInfo(mWebPartId); break; case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: { // Fill ClassInfo structure with data from database dci = DataClassInfoProvider.GetDataClass(mClassName); if (dci != null) { // Set table name tableName = dci.ClassTableName; tm = new TableManager(dci.ClassConnectionString); tr.BeginTransaction(); } else { ShowError(GetString("fieldeditor.notablename")); return; } } break; } } // Load current xml form definition LoadFormDefinition(); if (SelectedItemType == FieldEditorSelectedItemEnum.Field) { // Fill FormFieldInfo structure with original data ffi = fi.GetFormField(SelectedItemName); // Fill FormFieldInfo structure with updated form data ffiUpdated = FillFormFieldInfoStructure(ffi); // Determine whether it is a new attribute or not isNewItem = (ffi == null); // Check if the attribute name already exists if (isNewItem || (ffi.Name.ToLowerCSafe() != ffiUpdated.Name.ToLowerCSafe())) { columnNames = fi.GetColumnNames(); if (columnNames != null) { foreach (string colName in columnNames) { // If name already exists if (ffiUpdated.Name.ToLowerCSafe() == colName.ToLowerCSafe()) { ShowError(GetString("TemplateDesigner.ErrorExistingColumnName")); return; } } } // Check column name duplicity in JOINed tables if (!IsSystemFieldSelected) { // Check whether current column already exists in 'View_CMS_Tree_Joined' if (IsDocumentType && DocumentHelper.ColumnExistsInSystemTable(ffiUpdated.Name)) { ShowError(GetString("TemplateDesigner.ErrorExistingColumnInJoinedTable")); return; } // Check whether current column is unique in tables used to create views - applied only for system tables if ((Mode == FieldEditorModeEnum.SystemTable) && FormHelper.ColumnExistsInView(mClassName, ffiUpdated.Name)) { ShowError(GetString("TemplateDesigner.ErrorExistingColumnInJoinedTable")); return; } } } // New node if (isNewItem) { ffiUpdated.PrimaryKey = IsPrimaryField; newColumnName = ffiUpdated.Name; newColumnAllowNull = ffiUpdated.AllowEmpty; // Set implicit default value if (!(newColumnAllowNull) && (string.IsNullOrEmpty(ffiUpdated.DefaultValue))) { if (!DevelopmentMode) { switch (ffiUpdated.DataType) { case FormFieldDataTypeEnum.Integer: case FormFieldDataTypeEnum.LongInteger: case FormFieldDataTypeEnum.Decimal: case FormFieldDataTypeEnum.Boolean: newColumnDefaultValue = "0"; break; case FormFieldDataTypeEnum.Text: case FormFieldDataTypeEnum.LongText: case FormFieldDataTypeEnum.DocumentAttachments: newColumnDefaultValue = ""; break; case FormFieldDataTypeEnum.DateTime: newColumnDefaultValue = new DateTime(1970, 1, 1, 0, 0, 0).ToString(); break; case FormFieldDataTypeEnum.File: case FormFieldDataTypeEnum.GUID: // 32 digits, empty Guid newColumnDefaultValue = Guid.Empty.ToString(); break; case FormFieldDataTypeEnum.Binary: newColumnDefaultValue = null; break; } } } // Check if default value is in required format else if (!string.IsNullOrEmpty(ffiUpdated.DefaultValue)) { // If default value is macro, don't try to ensure the type if (!ffiUpdated.IsMacro) { switch (ffiUpdated.DataType) { case FormFieldDataTypeEnum.Integer: try { int i = Int32.Parse(ffiUpdated.DefaultValue); newColumnDefaultValue = i.ToString(); } catch { newColumnDefaultValue = "0"; errorMessage = GetString("TemplateDesigner.ErrorDefaultValueInteger"); } break; case FormFieldDataTypeEnum.LongInteger: try { long longInt = long.Parse(ffiUpdated.DefaultValue); newColumnDefaultValue = longInt.ToString(); } catch { newColumnDefaultValue = "0"; errorMessage = GetString("TemplateDesigner.ErrorDefaultValueLongInteger"); } break; case FormFieldDataTypeEnum.Decimal: if (ValidationHelper.IsDouble(ffiUpdated.DefaultValue)) { newColumnDefaultValue = FormHelper.GetDoubleValueInDBCulture(ffiUpdated.DefaultValue); } else { newColumnDefaultValue = "0"; errorMessage = GetString("TemplateDesigner.ErrorDefaultValueDouble"); } break; case FormFieldDataTypeEnum.DateTime: if ((ffiUpdated.DefaultValue.ToLowerCSafe() == DateTimePicker.DATE_TODAY.ToLowerCSafe()) || (ffiUpdated.DefaultValue.ToLowerCSafe() == DateTimePicker.TIME_NOW.ToLowerCSafe())) { newColumnDefaultValue = ffiUpdated.DefaultValue; } else { try { DateTime dat = DateTime.Parse(ffiUpdated.DefaultValue); newColumnDefaultValue = dat.ToString(); } catch { newColumnDefaultValue = DateTime.Now.ToString(); errorMessage = GetString("TemplateDesigner.ErrorDefaultValueDateTime"); } } break; case FormFieldDataTypeEnum.File: case FormFieldDataTypeEnum.GUID: try { Guid g = new Guid(ffiUpdated.DefaultValue); newColumnDefaultValue = g.ToString(); } catch { newColumnDefaultValue = Guid.Empty.ToString(); errorMessage = GetString("TemplateDesigner.ErrorDefaultValueGuid"); } break; case FormFieldDataTypeEnum.LongText: case FormFieldDataTypeEnum.Text: case FormFieldDataTypeEnum.Boolean: newColumnDefaultValue = ffiUpdated.DefaultValue; break; } } } // Set column type and size LoadColumnTypeAndSize(ffiUpdated.DataType, ffiUpdated.Size, ref newColumnType, ref newColumnSize); if (string.IsNullOrEmpty(errorMessage)) { if (!IsAlternativeForm) { switch (mMode) { case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: // Add new column to specified table try { string newDBDefaultValue = null; // Check if it is not a macro if (ffiUpdated.IsMacro) { newDBDefaultValue = newColumnDefaultValue; } else { switch (ffiUpdated.DataType) { case FormFieldDataTypeEnum.Decimal: newDBDefaultValue = FormHelper.GetDoubleValueInDBCulture(newColumnDefaultValue); break; case FormFieldDataTypeEnum.DateTime: newDBDefaultValue = FormHelper.GetDateTimeValueInDBCulture(newColumnDefaultValue); break; default: newDBDefaultValue = newColumnDefaultValue; break; } } if (!ffiUpdated.External) { if (DevelopmentMode) { tm.AddTableColumn(tableName, newColumnName, newColumnType, newColumnAllowNull, newDBDefaultValue, false); } else { tm.AddTableColumn(tableName, newColumnName, newColumnType, newColumnAllowNull, newDBDefaultValue); } // Recreate the table PK constraint if (IsPrimaryField) { int pos = 0; var pkFields = fi.GetFields(true, true, true, true); string[] primaryKeys = new string[pkFields.Count() + 1]; foreach (FormFieldInfo pk in pkFields) { if (pk != null) { primaryKeys[pos++] = "[" + pk.Name + "]"; } } primaryKeys[pos] = "[" + newColumnName + "]"; tm.RecreatePKConstraint(tableName, primaryKeys); } } } catch (Exception ex) { ShowError(GetString("general.saveerror"), ex.Message, null); return; } break; } } } // Some error has occurred else { ShowError(errorMessage); return; } } // Existing node else { // Get info whether it is a primary key or system field ffiUpdated.PrimaryKey = ffi.PrimaryKey; // If attribute is a primary key if (ffi.PrimaryKey) { // Check if the attribute type is integer number if (ffiUpdated.DataType != FormFieldDataTypeEnum.Integer) { errorMessage += GetString("TemplateDesigner.ErrorPKNotInteger") + " "; } // Check if allow empty is disabled if (ffiUpdated.AllowEmpty) { errorMessage += GetString("TemplateDesigner.ErrorPKAllowsNulls") + " "; } // Check that the field type is label string labelControlName = Enum.GetName(typeof(FormFieldControlTypeEnum), FormFieldControlTypeEnum.LabelControl).ToLowerCSafe(); if ((ffiUpdated.FieldType != FormFieldControlTypeEnum.LabelControl) && ((ffiUpdated.FieldType != FormFieldControlTypeEnum.CustomUserControl) && (ffiUpdated.Settings["controlname"].ToString().ToLowerCSafe() != labelControlName))) { errorMessage += GetString("TemplateDesigner.ErrorPKisNotLabel") + " "; } // Some error has occurred if (!string.IsNullOrEmpty(errorMessage)) { ShowError(GetString("TemplateDesigner.ErrorPKThisIsPK") + " " + errorMessage); return; } } // If table column update is needed if (((ffi.PrimaryKey) && (ffi.Name != ffiUpdated.Name)) || ((!ffi.PrimaryKey) && ((ffi.Name != ffiUpdated.Name) || (ffi.DataType != ffiUpdated.DataType) || (ffi.AllowEmpty != ffiUpdated.AllowEmpty) || (ffi.Size != ffiUpdated.Size) || ((ffi.DefaultValue != ffiUpdated.DefaultValue) || (ffiUpdated.DataType == FormFieldDataTypeEnum.Decimal))) ) ) { // Set variables needed for changes in DB oldColumnName = ffi.Name; newColumnName = ffiUpdated.Name; newColumnAllowNull = ffiUpdated.AllowEmpty; // Set implicit default value if (!(newColumnAllowNull) && (string.IsNullOrEmpty(ffiUpdated.DefaultValue))) { switch (ffiUpdated.DataType) { case FormFieldDataTypeEnum.Integer: case FormFieldDataTypeEnum.LongInteger: case FormFieldDataTypeEnum.Decimal: case FormFieldDataTypeEnum.Boolean: newColumnDefaultValue = "0"; break; case FormFieldDataTypeEnum.Text: case FormFieldDataTypeEnum.LongText: newColumnDefaultValue = ""; break; case FormFieldDataTypeEnum.DateTime: newColumnDefaultValue = DateTime.Now.ToString(); break; case FormFieldDataTypeEnum.File: case FormFieldDataTypeEnum.GUID: // 32 digits, empty Guid newColumnDefaultValue = Guid.Empty.ToString(); break; case FormFieldDataTypeEnum.Binary: newColumnDefaultValue = null; break; } } // Check if default value is in required format else if (!string.IsNullOrEmpty(ffiUpdated.DefaultValue)) { // If default value is macro, don't try to ensure the type if (!ffiUpdated.IsMacro) { switch (ffiUpdated.DataType) { case FormFieldDataTypeEnum.Integer: try { int i = Int32.Parse(ffiUpdated.DefaultValue); newColumnDefaultValue = i.ToString(); } catch { newColumnDefaultValue = "0"; errorMessage = GetString("TemplateDesigner.ErrorDefaultValueInteger"); } break; case FormFieldDataTypeEnum.LongInteger: try { long longInt = long.Parse(ffiUpdated.DefaultValue); newColumnDefaultValue = longInt.ToString(); } catch { newColumnDefaultValue = "0"; errorMessage = GetString("TemplateDesigner.ErrorDefaultValueLongInteger"); } break; case FormFieldDataTypeEnum.Decimal: if (ValidationHelper.IsDouble(ffiUpdated.DefaultValue)) { newColumnDefaultValue = FormHelper.GetDoubleValueInDBCulture(ffiUpdated.DefaultValue); } else { newColumnDefaultValue = "0"; errorMessage = GetString("TemplateDesigner.ErrorDefaultValueDouble"); } break; case FormFieldDataTypeEnum.DateTime: if ((ffiUpdated.DefaultValue.ToLowerCSafe() == DateTimePicker.DATE_TODAY.ToLowerCSafe()) || (ffiUpdated.DefaultValue.ToLowerCSafe() == DateTimePicker.TIME_NOW.ToLowerCSafe())) { newColumnDefaultValue = ffiUpdated.DefaultValue; } else { try { DateTime dat = DateTime.Parse(ffiUpdated.DefaultValue); newColumnDefaultValue = dat.ToString(); } catch { newColumnDefaultValue = DateTime.Now.ToString(); errorMessage = GetString("TemplateDesigner.ErrorDefaultValueDateTime"); } } break; case FormFieldDataTypeEnum.File: case FormFieldDataTypeEnum.GUID: try { Guid g = new Guid(ffiUpdated.DefaultValue); newColumnDefaultValue = g.ToString(); } catch { newColumnDefaultValue = Guid.Empty.ToString(); errorMessage = GetString("TemplateDesigner.ErrorDefaultValueGuid"); } break; case FormFieldDataTypeEnum.LongText: case FormFieldDataTypeEnum.Text: case FormFieldDataTypeEnum.Boolean: newColumnDefaultValue = ffiUpdated.DefaultValue; break; } } } // Set column type and size LoadColumnTypeAndSize(ffiUpdated.DataType, ffiUpdated.Size, ref newColumnType, ref newColumnSize); if (string.IsNullOrEmpty(errorMessage)) { if (!IsAlternativeForm) { switch (mMode) { case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: try { string newDBDefaultValue = null; // Check if it is not a macro if (ffiUpdated.IsMacro) { newDBDefaultValue = newColumnDefaultValue; } else { switch (ffiUpdated.DataType) { case FormFieldDataTypeEnum.Decimal: newDBDefaultValue = FormHelper.GetDoubleValueInDBCulture(newColumnDefaultValue); break; case FormFieldDataTypeEnum.DateTime: newDBDefaultValue = FormHelper.GetDateTimeValueInDBCulture(newColumnDefaultValue); break; default: newDBDefaultValue = newColumnDefaultValue; break; } } if (ffiUpdated.External) { if (!ffi.External) { // Drop old column from table tm.DropTableColumn(tableName, ffi.Name); } } else { if (ffi.External) { // Add table column tm.AddTableColumn(tableName, newColumnName, newColumnType, newColumnAllowNull, newDBDefaultValue); } else { // Change table column tm.AlterTableColumn(tableName, oldColumnName, newColumnName, newColumnType, newColumnAllowNull, newDBDefaultValue); if (OnFieldNameChanged != null) { OnFieldNameChanged(this, oldColumnName, newColumnName); } } } } catch (Exception ex) { // User friendly message for not null setting of column if (ffi.AllowEmpty && !newColumnAllowNull) { ShowError(GetString("FieldEditor.ColumnNotAcceptNull"), ex.Message, null); } else { ShowError(GetString("general.saveerror"), ex.Message, null); } return; } break; } } } // Some error has occurred else { ShowError(errorMessage); return; } } // End update needed } // End existing node // Insert new field if (isNewItem) { InsertFormItem(ffiUpdated); // Hide field for alternative forms that require it dci = DataClassInfoProvider.GetDataClass(mClassName); if (dci != null) { string where = "FormClassID=" + dci.ClassID; // If edited class is user settings, update user alt.forms which are combined with user settings too if (mClassName.EqualsCSafe(SiteObjectType.USERSETTINGS, StringComparison.InvariantCultureIgnoreCase)) { DataClassInfo userClass = DataClassInfoProvider.GetDataClass(SiteObjectType.USER); if (userClass != null) { where = SqlHelperClass.AddWhereCondition(where, "FormClassID=" + userClass.ClassID + " AND FormCoupledClassID=" + dci.ClassID, "OR"); } } where = SqlHelperClass.AddWhereCondition(where, "FormHideNewParentFields=1"); var altforms = AlternativeFormInfoProvider.GetAlternativeForms(where, null); foreach (AlternativeFormInfo afi in altforms) { afi.HideField(ffiUpdated); AlternativeFormInfoProvider.SetAlternativeFormInfo(afi); } } } // Update current field else { fi.UpdateFormField(ffi.Name, ffiUpdated); } } else if (SelectedItemType == FieldEditorSelectedItemEnum.Category) { // Fill FormCategoryInfo structure with original data fci = fi.GetFormCategory(SelectedItemName); // Determine whether it is a new attribute or not isNewItem = (fci == null); // Fill FormCategoryInfo structure with updated form data fciUpdated = new FormCategoryInfo(); fciUpdated.CategoryCaption = categoryEdit.Value.Replace("'", ""); fciUpdated.CategoryCollapsible = categoryEdit.Collapsible; fciUpdated.CategoryCollapsedByDefault = categoryEdit.CollapsedByDefault; fciUpdated.VisibleMacro = categoryEdit.VisibleMacro; fciUpdated.Visible = categoryEdit.CategoryVisible; // Check if the category caption is empty if (string.IsNullOrEmpty(fciUpdated.CategoryCaption)) { ShowError(GetString("TemplateDesigner.ErrorCategoryNameEmpty")); return; } // Use codenamed category caption for name attribute fciUpdated.CategoryName = IsAlternativeForm ? fci.CategoryName : ValidationHelper.GetCodeName(fciUpdated.CategoryCaption, null, 0 ,true, true); // Get form category names if ((isNewItem || fciUpdated.CategoryName != fci.CategoryName) && fi.GetCategoryNames().Exists(x => x == fciUpdated.CategoryName)) { ShowError(GetString("TemplateDesigner.ErrorExistingCategoryName")); return; } if (isNewItem) { // Insert new category InsertFormItem(fciUpdated); } else { // Update current fi.UpdateFormCategory(fci.CategoryName, fciUpdated); } } // Make changes in database if (SelectedItemType != 0) { // Get updated definition FormDefinition = fi.GetXmlDefinition(); string error = null; if (!IsAlternativeForm) { switch (mMode) { case FieldEditorModeEnum.WebPartProperties: if (wpi != null) { // Update xml definition wpi.WebPartProperties = FormDefinition; try { WebPartInfoProvider.SetWebPartInfo(wpi); } catch (Exception ex) { error = ex.Message; } } else { error = GetString("FieldEditor.WebpartNotFound"); } break; case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: if (dci != null) { // Update xml definition dci.ClassFormDefinition = FormDefinition; // Update xml schema dci.ClassXmlSchema = tm.GetXmlSchema(dci.ClassTableName); // When updating existing field if (ffi != null) { // Update ClassNodeNameSource field if (dci.ClassNodeNameSource == ffi.Name) { dci.ClassNodeNameSource = ffiUpdated.Name; } } // Update changes in DB try { // Save the data class DataClassInfoProvider.SetDataClass(dci); // Generate the class code - Temporarily disabled //GenerateCode(true); updateInherited = true; } catch (Exception ex) { error = ex.Message; } bool fieldType = (SelectedItemType == FieldEditorSelectedItemEnum.Field); if (fieldType) { // Generate default view if (mMode == FieldEditorModeEnum.BizFormDefinition) { SqlGenerator.GenerateDefaultView(dci, CMSContext.CurrentSiteName); } else { SqlGenerator.GenerateDefaultView(dci, null); } // Regenerate queries SqlGenerator.GenerateDefaultQueries(dci, true, true); } // Updates custom views if (((mMode == FieldEditorModeEnum.SystemTable) || (mMode == FieldEditorModeEnum.ClassFormDefinition))) { // Refresh views only if needed bool refreshViews = (fci == null); if ((ffi != null) && (ffiUpdated != null)) { refreshViews = false; if (ffi.Name != ffiUpdated.Name) { refreshViews = true; } if (ffi.DataType != ffiUpdated.DataType) { refreshViews = true; } if (ffi.Size != ffiUpdated.Size) { refreshViews = true; } if (ffi.AllowEmpty != ffiUpdated.AllowEmpty) { refreshViews = true; } if (ffi.DefaultValue != ffiUpdated.DefaultValue) { refreshViews = true; } } if (refreshViews) { try { tm.RefreshCustomViews(dci.ClassTableName); string lowClassName = dci.ClassName.ToLowerCSafe(); if (lowClassName == "cms.document" || lowClassName == "cms.tree") { tm.RefreshDocumentViews(); } } catch (Exception ex) { error = ResHelper.GetString("fieldeditor.refreshingviewsfailed"); EventLogProvider ev = new EventLogProvider(); ev.LogEvent("Field Editor", "EXCEPTION", ex); } } } } else { error = GetString("FieldEditor.ClassNotFound"); } break; } } if (!string.IsNullOrEmpty(error)) { ShowError("[FieldEditor.SaveSelectedField()]: " + error); return; } IsNewItemEdited = false; if (SelectedItemType == FieldEditorSelectedItemEnum.Category) { Reload(categPreffix + fciUpdated.CategoryName); } else if (SelectedItemType == FieldEditorSelectedItemEnum.Field) { Reload(fieldPreffix + ffiUpdated.Name); } ShowChangesSaved(); } // All done and new item, fire OnFieldCreated event if (isNewItem && (ffiUpdated != null)) { RaiseOnFieldCreated(ffiUpdated); } // Commit the transaction tr.Commit(); } // Update inherited classes with new fields if (updateInherited) { FormHelper.UpdateInheritedClasses(dci); } } /// /// New category button clicked. /// protected void btnNewCategory_Click(Object sender, ImageClickEventArgs e) { if (Mode == FieldEditorModeEnum.BizFormDefinition) { // Check 'EditForm' permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm")) { RedirectToAccessDenied("cms.form", "EditForm"); } } if (IsNewItemEdited) { // Display error - Only one new item can be edited ShowMessage(GetString("TemplateDesigner.ErrorCannotCreateAnotherNewItem")); } else { HandleInherited(false); // Create #categ##new# item in list ListItem newListItem = new ListItem(GetString("TemplateDesigner.NewCategory"), newCategPreffix); if ((lstAttributes.Items.Count > 0) && (lstAttributes.SelectedIndex >= 0)) { // Add behind the selected item lstAttributes.Items.Insert(lstAttributes.SelectedIndex + 1, newListItem); } else { // Add at the end of the item collection lstAttributes.Items.Add(newListItem); } // Select new item lstAttributes.SelectedIndex = lstAttributes.Items.IndexOf(newListItem); SelectedItemType = FieldEditorSelectedItemEnum.Category; SelectedItemName = newCategPreffix; LoadDefaultCategoryEditForm(); IsNewItemEdited = true; } } /// /// New system attribute button clicked. /// protected void btnNewSysAttribute_Click(Object sender, ImageClickEventArgs e) { NewAttribute(true); } /// /// New attribute button clicked. /// protected void btnNewAttribute_Click(Object sender, ImageClickEventArgs e) { NewAttribute(false); } /// /// New attribute button clicked. /// protected void btnNewPrimaryAttribute_Click(Object sender, ImageClickEventArgs e) { NewAttribute(false, true); } /// /// Creates new attribute with non-primary key. /// private void NewAttribute(bool system) { NewAttribute(system, false); } /// /// Creates new attribute. /// /// Indicates if attribute is system /// Indicates if attribute is primary private void NewAttribute(bool system, bool isPrimary) { HandleInherited(false); FieldDetailsVisible = true; // Clear settings simpleMode.Settings = new Hashtable(); simpleMode.SelectedItemType = FieldEditorSelectedItemEnum.Field; controlSettings.Settings = new Hashtable(); if (Mode == FieldEditorModeEnum.BizFormDefinition) { // Check 'EditForm' permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm")) { RedirectToAccessDenied("cms.form", "EditForm"); } } IsPrimaryField = isPrimary; if (IsNewItemEdited) { // Only one new item can be edited ShowMessage(GetString("TemplateDesigner.ErrorCannotCreateAnotherNewItem")); } else { // Create #new# attribute in attribute list ListItem newListItem = new ListItem(GetString("TemplateDesigner.NewAttribute"), newFieldPreffix); if ((lstAttributes.Items.Count > 0) && (lstAttributes.SelectedIndex >= 0)) { // Add behind the selected item lstAttributes.Items.Insert(lstAttributes.SelectedIndex + 1, newListItem); } else { // Add at the end of the item collection lstAttributes.Items.Add(newListItem); } // Select new item lstAttributes.SelectedIndex = lstAttributes.Items.IndexOf(newListItem); // Get type of previously selected item FieldEditorSelectedItemEnum oldItemType = SelectedItemType; // Initialize currently selected item type and name SelectedItemType = FieldEditorSelectedItemEnum.Field; SelectedItemName = newFieldPreffix; IsNewItemEdited = true; databaseConfiguration.AttributeName = ""; string defaultControl = FormHelper.GetFormFieldDefaultControlType(FormFieldDataTypeCode.TEXT); if (FormHelper.IsValidControl(defaultControl, GetControls(DisplayedControls, mMode, DevelopmentMode))) { simpleMode.FieldType = defaultControl; } else { simpleMode.ClearForm(); } fieldAppearance.AttributeType = FormFieldDataTypeCode.TEXT; fieldAppearance.FieldType = defaultControl; fieldAppearance.LoadFieldTypes(isPrimary); LoadControlSettings(null, false); bool newItemBlank = ValidationHelper.GetBoolean(SettingsHelper.AppSettings["CMSClearFieldEditor"], true); if (newItemBlank || (oldItemType != FieldEditorSelectedItemEnum.Field)) { LoadDefaultAttributeEditForm(system, false); } DisplaySelectedTabContent(); } } /// /// Gets available controls. /// /// Returns FieldEditorControlsEnum private static FieldEditorControlsEnum GetControls(FieldEditorControlsEnum DisplayedControls, FieldEditorModeEnum Mode, bool DevelopmentMode) { FieldEditorControlsEnum controls = FieldEditorControlsEnum.None; // Get displayed controls if (DisplayedControls == FieldEditorControlsEnum.ModeSelected) { switch (Mode) { case FieldEditorModeEnum.BizFormDefinition: controls = FieldEditorControlsEnum.Bizforms; break; case FieldEditorModeEnum.ClassFormDefinition: if (DevelopmentMode) { controls = FieldEditorControlsEnum.All; } else { controls = FieldEditorControlsEnum.DocumentTypes; } break; case FieldEditorModeEnum.SystemTable: controls = FieldEditorControlsEnum.SystemTables; break; case FieldEditorModeEnum.CustomTable: controls = FieldEditorControlsEnum.CustomTables; break; case FieldEditorModeEnum.WebPartProperties: controls = FieldEditorControlsEnum.Controls; break; case FieldEditorModeEnum.General: case FieldEditorModeEnum.FormControls: controls = FieldEditorControlsEnum.All; break; } } else { controls = DisplayedControls; } return controls; } /// /// Delete attribute button clicked. /// protected void btnDeleteItem_Click(Object sender, ImageClickEventArgs e) { DataClassInfo dci = null; bool updateInherited = false; string newSelectedValue = null; // Ensure the transaction using (var tr = new CMSLateBoundTransaction()) { if (Mode == FieldEditorModeEnum.BizFormDefinition) { // Check 'EditForm' permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm")) { RedirectToAccessDenied("cms.form", "EditForm"); } } // Raise on before definition update event if (OnBeforeDefinitionUpdate != null) { OnBeforeDefinitionUpdate(this, EventArgs.Empty); } FormFieldInfo ffiSelected = null; WebPartInfo wpi = null; string errorMessage = null; string deletedItemPreffix = null; // Clear settings simpleMode.Settings = new Hashtable(); controlSettings.Settings = new Hashtable(); TableManager tm = null; switch (mMode) { case FieldEditorModeEnum.WebPartProperties: // Get the web part { wpi = WebPartInfoProvider.GetWebPartInfo(mWebPartId); if (wpi == null) { errorMessage = GetString("FieldEditor.WebpartNotFound"); return; } } break; case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: { // Get the DataClass dci = DataClassInfoProvider.GetDataClass(mClassName); if (dci == null) { errorMessage = GetString("FieldEditor.ClassNotFound"); return; } tm = new TableManager(dci.ClassConnectionString); tr.BeginTransaction(); } break; } // Load current xml form definition LoadFormDefinition(); if ((!string.IsNullOrEmpty(SelectedItemName)) && (!IsNewItemEdited)) { if (SelectedItemType == FieldEditorSelectedItemEnum.Field) { ffiSelected = fi.GetFormField(SelectedItemName); deletedItemPreffix = fieldPreffix; if (ffiSelected != null) { // Do not allow deleting of the primary key except for external fields if (ffiSelected.PrimaryKey && !ffiSelected.External) { if (!DevelopmentMode) { ShowError(GetString("TemplateDesigner.ErrorCannotDeletePK")); return; } else { // Check if at least one primary key stays if (fi.GetFields(true, true, false, true).Count() < 2) { ShowError(GetString("TemplateDesigner.ErrorCannotDeletePK")); return; } } } // Check if at least two fields stay in document type definition if ((Mode == FieldEditorModeEnum.ClassFormDefinition) && (fi.GetFields(true, true, true).Count() < 3)) { ShowError(GetString("TemplateDesigner.ErrorCannotDeleteAllCustomFields")); return; } // Do not allow deleting of the system field if (ffiSelected.System && !ffiSelected.External && !DevelopmentMode) { ShowError(GetString("TemplateDesigner.ErrorCannotDeleteSystemField")); return; } // Remove specific field from xml form definition fi.RemoveFormField(SelectedItemName); // Get updated definition FormDefinition = fi.GetXmlDefinition(); switch (mMode) { case FieldEditorModeEnum.WebPartProperties: // Web part properties { wpi.WebPartProperties = FormDefinition; try { WebPartInfoProvider.SetWebPartInfo(wpi); } catch (Exception ex) { errorMessage = ex.Message; } } break; case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: { // If document type is edited AND field that should be removed is FILE if ((mMode == FieldEditorModeEnum.ClassFormDefinition) && (!string.IsNullOrEmpty(ClassName)) && (ffiSelected.DataType == FormFieldDataTypeEnum.File)) { DocumentHelper.DeleteDocumentAttachments(ClassName, ffiSelected.Name, null); } // If bizform is edited AND field that should be removed is FILE if ((mMode == FieldEditorModeEnum.BizFormDefinition) && (!string.IsNullOrEmpty(ClassName)) && (ffiSelected.FieldType == FormFieldControlTypeEnum.UploadControl)) { BizFormInfoProvider.DeleteBizFormFiles(ClassName, ffiSelected.Name, CMSContext.CurrentSiteID); } // Update xml definition dci.ClassFormDefinition = FormDefinition; try { if (!ffiSelected.External) { // Remove corresponding column from table tm.DropTableColumn(dci.ClassTableName, SelectedItemName); // Update xml schema dci.ClassXmlSchema = tm.GetXmlSchema(dci.ClassTableName); } } catch (Exception ex) { errorMessage = ex.Message; } // Deleted field is used as ClassNodeNameSource -> remove node name source if (dci.ClassNodeNameSource == SelectedItemName) { dci.ClassNodeNameSource = ""; } // Update changes in database try { using (CMSActionContext context = new CMSActionContext()) { // Do not log synchronization for BizForm if (mMode == FieldEditorModeEnum.BizFormDefinition) { context.DisableLogging(); } // Save the data class DataClassInfoProvider.SetDataClass(dci); updateInherited = true; // Update alternative forms var altforms = AlternativeFormInfoProvider.GetAlternativeForms("FormClassID=" + dci.ClassID, null); foreach (AlternativeFormInfo afi in altforms) { afi.ClearDefinition(fi.GetColumnNames()); AlternativeFormInfoProvider.SetAlternativeFormInfo(afi); } } } catch (Exception ex) { errorMessage = ex.Message; } // Refresh views and queries only if changes to DB were made if (!ffiSelected.External) { // Generate default view if (mMode == FieldEditorModeEnum.BizFormDefinition) { SqlGenerator.GenerateDefaultView(dci, CMSContext.CurrentSiteName); } else { SqlGenerator.GenerateDefaultView(dci, null); } // Regenerate queries SqlGenerator.GenerateDefaultQueries(dci, true, true); // Updates custom views if ((mMode == FieldEditorModeEnum.SystemTable) || (mMode == FieldEditorModeEnum.ClassFormDefinition)) { try { tm.RefreshCustomViews(dci.ClassTableName); string lowClassName = dci.ClassName.ToLowerCSafe(); if (lowClassName == "cms.document" || lowClassName == "cms.tree") { tm.RefreshDocumentViews(); } } catch (Exception ex) { errorMessage = ResHelper.GetString("fieldeditor.refreshingviewsfailed"); EventLogProvider ev = new EventLogProvider(); ev.LogEvent("Field Editor", "EXCEPTION", ex); } } } // Clear hashtables ClearHashtables(); } break; } } } else if (SelectedItemType == FieldEditorSelectedItemEnum.Category) { deletedItemPreffix = categPreffix; // Remove specific category from xml form definition fi.RemoveFormCategory(SelectedItemName); // Get updated form definition FormDefinition = fi.GetXmlDefinition(); switch (mMode) { case FieldEditorModeEnum.WebPartProperties: // Web part { wpi.WebPartProperties = FormDefinition; try { WebPartInfoProvider.SetWebPartInfo(wpi); } catch (Exception ex) { errorMessage = ex.Message; } } break; case FieldEditorModeEnum.ClassFormDefinition: case FieldEditorModeEnum.BizFormDefinition: case FieldEditorModeEnum.SystemTable: case FieldEditorModeEnum.CustomTable: // Standard classes { // Update xml definition dci.ClassFormDefinition = FormDefinition; // Update changes in database try { using (CMSActionContext context = new CMSActionContext()) { // Do not log synchronization for BizForm if (mMode == FieldEditorModeEnum.BizFormDefinition) { context.DisableLogging(); } // Save the data class DataClassInfoProvider.SetDataClass(dci); updateInherited = true; } } catch (Exception ex) { errorMessage = ex.Message; } } break; } } if (!string.IsNullOrEmpty(errorMessage)) { ShowError("[ FieldEditor.btnDeleteItem_Click() ]: " + errorMessage); } } else { // "delete" new item from the list IsNewItemEdited = false; } // Raise on after definition update event if (OnAfterDefinitionUpdate != null) { OnAfterDefinitionUpdate(this, EventArgs.Empty); } // Commit the transaction tr.Commit(); // Set new selected value ListItem deletedItem = lstAttributes.Items.FindByValue(deletedItemPreffix + SelectedItemName); int deletedItemIndex = lstAttributes.Items.IndexOf(deletedItem); if ((deletedItemIndex > 0) && (lstAttributes.Items[deletedItemIndex - 1] != null)) { newSelectedValue = lstAttributes.Items[deletedItemIndex - 1].Value; } if (!ReloadOnDelete) { // Reload data Reload(newSelectedValue); } } // Update inherited classes with new fields if necessary if (updateInherited) { FormHelper.UpdateInheritedClasses(dci); } if (ReloadOnDelete) { // Reload the page and preselect current field/category URLHelper.ResponseRedirect(string.IsNullOrEmpty(newSelectedValue) ? URLHelper.CurrentURL : URLHelper.AddParameterToUrl(URLHelper.CurrentURL, "selectedfield", newSelectedValue.Replace("#", "%23"))); } } /// /// Show javascript alert message. /// /// Message to show private void ShowMessage(string message) { ltlScript.Text = ScriptHelper.GetScript("alert(" + ScriptHelper.GetString(message) + ");"); } /// /// Called when source field selected index changed. /// protected void documentSource_OnSourceFieldChanged(object sender, EventArgs e) { if (mMode == FieldEditorModeEnum.ClassFormDefinition) { string errorMessage = null; DataClassInfo dci = DataClassInfoProvider.GetDataClass(ClassName); if (dci != null) { // Set document name source field if (string.IsNullOrEmpty(documentSource.SourceFieldValue)) { // Use extra field dci.ClassNodeNameSource = ""; } else { // Use specified name dci.ClassNodeNameSource = documentSource.SourceFieldValue; } // Set document alias source field if (string.IsNullOrEmpty(documentSource.SourceAliasFieldValue)) { // Use extra field dci.ClassNodeAliasSource = ""; } else { // Use specified name dci.ClassNodeAliasSource = documentSource.SourceAliasFieldValue; } try { using (CMSActionContext context = new CMSActionContext()) { // Do not log synchronization for BizForm if (mMode == FieldEditorModeEnum.BizFormDefinition) { context.DisableLogging(); } DataClassInfoProvider.SetDataClass(dci); } ShowConfirmation(GetString("TemplateDesigner.SourceFieldSaved")); WebControl control = sender as WebControl; if (control != null && (control.ID == "drpSourceAliasField")) { ShowConfirmation(GetString("TemplateDesigner.SourceAliasFieldSaved")); } } catch (Exception ex) { errorMessage = ex.Message; } } else { errorMessage = GetString("FieldEditor.ClassNotFound"); } if (!string.IsNullOrEmpty(errorMessage)) { ShowError("[ FieldEditor.drpSourceField_SelectedIndexChanged() ]: " + errorMessage); } } } /// /// Validates form and returns validation error message. /// private string ValidateForm() { const string INVALIDCHARACTERS = @".,;'`:/\*|?""&%$!-+=()[]{} "; string attributeName = null; string fieldCaption = null; string control = null; bool MinAndMaxLengthInCorrectFormat = true; bool MinAndMaxValueInCorrectFormat = true; if (SelectedMode == FieldEditorSelectedModeEnum.Simplified) { attributeName = simpleMode.AttributeName; fieldCaption = simpleMode.FieldCaption; control = simpleMode.FieldType; } else { attributeName = databaseConfiguration.GetAttributeName(); fieldCaption = fieldAppearance.FieldCaption; control = fieldAppearance.FieldType; } // Check if attribute name isn't empty if (string.IsNullOrEmpty(attributeName)) { return GetString("TemplateDesigner.ErrorEmptyAttributeName") + " "; } // Check if attribute name starts with a letter or '_' (if it is an identifier) if (!ValidationHelper.IsIdentifier(attributeName)) { return GetString("TemplateDesigner.ErrorAttributeNameDoesNotStartWithLetter") + " "; } // Check attribute name for invalid characters for (int i = 0; i <= INVALIDCHARACTERS.Length - 1; i++) { if (attributeName.Contains(Convert.ToString(INVALIDCHARACTERS[i]))) { return GetString("TemplateDesigner.ErrorInvalidCharacter") + INVALIDCHARACTERS + ". "; } } if (chkDisplayInForm.Checked) { // Check if field caption is entered if (string.IsNullOrEmpty(fieldCaption)) { return GetString("TemplateDesigner.ErrorEmptyFieldCaption") + " "; } // Check if control is selected if (String.IsNullOrEmpty(control)) { return GetString("fieldeditor.selectformcontrol"); } } // Validation of the advanced mode controls if (SelectedMode == FieldEditorSelectedModeEnum.Advanced) { // Check attribute size value if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.TEXT) { string attSize = databaseConfiguration.AttributeSize; // Attribute size is empty -> error if (string.IsNullOrEmpty(attSize)) { return GetString("TemplateDesigner.ErrorEmptyAttributeSize") + " "; } int attributeSize = ValidationHelper.GetInteger(attSize, 0); // Attribute size is invalid -> error if ((attributeSize <= 0) || (attributeSize > ValidationHelper.MAX_NVARCHAR_LENGTH)) { return GetString("TemplateDesigner.ErrorInvalidAttributeSize") + " "; } if ((databaseConfiguration.DefaultValueText.Length > attributeSize) || (databaseConfiguration.LargeDefaultValueText.Length > attributeSize)) { return GetString("TemplateDesigner.ErrorDefaultValueSize") + " "; } } // Check min length value string minLength = validationSettings.MinLengthText; if (!string.IsNullOrEmpty(minLength)) { if ((!ValidationHelper.IsInteger(minLength)) || ((ValidationHelper.IsInteger(minLength)) && (Convert.ToInt32(minLength) < 0))) { MinAndMaxLengthInCorrectFormat = false; return GetString("TemplateDesigner.ErrorMinLengthNotInteger") + " "; } } // Check max length value string maxLength = validationSettings.MaxLengthText; if (!string.IsNullOrEmpty(maxLength)) { if ((!ValidationHelper.IsInteger(maxLength)) || ((ValidationHelper.IsInteger(maxLength)) && (Convert.ToInt32(maxLength) < 0))) { MinAndMaxLengthInCorrectFormat = false; return GetString("TemplateDesigner.ErrorMaxLengthNotInteger") + " "; } } // Min and max length are specified and in correct format -> check if min length is less than max length if ((!string.IsNullOrEmpty(minLength)) && (!string.IsNullOrEmpty(maxLength)) && (MinAndMaxLengthInCorrectFormat)) { if ((Convert.ToInt32(minLength)) > (Convert.ToInt32(maxLength))) { return GetString("TemplateDesigner.ErrorMinLengthGreater") + " "; } } if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.DOUBLE) { string strMinValue = validationSettings.MinValueText; string strMaxValue = validationSettings.MaxValueText; double minValue = 0.0; double maxValue = 0.0; // Check min value if (!string.IsNullOrEmpty(strMinValue)) { minValue = ValidationHelper.GetDouble(strMinValue, Double.NaN); if (Double.IsNaN(minValue)) { MinAndMaxValueInCorrectFormat = false; return GetString("TemplateDesigner.ErrorMinValueNotDouble") + " "; } } // Check max value if (!string.IsNullOrEmpty(strMaxValue)) { maxValue = ValidationHelper.GetDouble(strMaxValue, Double.NaN); if (Double.IsNaN(maxValue)) { MinAndMaxValueInCorrectFormat = false; return GetString("TemplateDesigner.ErrorMaxValueNotDouble") + " "; } } // Min and max value are specified and in correct format -> check if min value is less than max value if ((!string.IsNullOrEmpty(strMinValue)) && (!string.IsNullOrEmpty(strMaxValue)) && (MinAndMaxValueInCorrectFormat)) { if (minValue > maxValue) { return GetString("TemplateDesigner.ErrorMinValueGreater") + " "; } } } else if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.INTEGER) { // Check min value if (!string.IsNullOrEmpty(validationSettings.MinValueText)) { if (!ValidationHelper.IsInteger(validationSettings.MinValueText)) { MinAndMaxValueInCorrectFormat = false; return GetString("TemplateDesigner.ErrorMinValueNotInteger") + " "; } } // Check max value if (!string.IsNullOrEmpty(validationSettings.MaxValueText)) { if (!ValidationHelper.IsInteger(validationSettings.MaxValueText)) { MinAndMaxValueInCorrectFormat = false; return GetString("TemplateDesigner.ErrorMaxValueNotInteger") + " "; } } // Min and max value are specified and in correct format -> check if min value is less than max value if ((!string.IsNullOrEmpty(validationSettings.MinValueText)) && (!string.IsNullOrEmpty(validationSettings.MaxValueText)) && (MinAndMaxValueInCorrectFormat)) { if ((Convert.ToInt32(validationSettings.MinValueText)) > (Convert.ToInt32(validationSettings.MaxValueText))) { return GetString("TemplateDesigner.ErrorMinValueGreater") + " "; } } } else if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.LONGINTEGER) { string minValue = validationSettings.MinValueText; string maxValue = validationSettings.MaxValueText; // Check min value if (!string.IsNullOrEmpty(minValue)) { if (!ValidationHelper.IsLong(minValue)) { MinAndMaxValueInCorrectFormat = false; return GetString("TemplateDesigner.ErrorMinValueNotLongInteger") + " "; } } // Check max value if (!string.IsNullOrEmpty(maxValue)) { if (!ValidationHelper.IsLong(maxValue)) { MinAndMaxValueInCorrectFormat = false; return GetString("TemplateDesigner.ErrorMaxValueNotLongInteger") + " "; } } // Min and max value are specified and in correct format -> check if min value is less than max value if ((!string.IsNullOrEmpty(minValue)) && (!string.IsNullOrEmpty(maxValue)) && (MinAndMaxValueInCorrectFormat)) { if ((Convert.ToInt64(minValue)) > (Convert.ToInt64(maxValue))) { return GetString("TemplateDesigner.ErrorMinValueGreater") + " "; } } } } // Validate simple mode else { // Check that textbox field has some minimum length set if (simpleMode.AttributeType == FormFieldDataTypeCode.TEXT) { if (simpleMode.AttributeSize <= 0 || simpleMode.AttributeSize > ValidationHelper.MAX_NVARCHAR_LENGTH) { return GetString("TemplateDesigner.ErrorInvalidTextBoxMaxLength"); } ffi = fi.GetFormField(SelectedItemName); if (simpleMode.GetDefaultValue(ffi).Length > simpleMode.AttributeSize) { return GetString("TemplateDesigner.ErrorDefaultValueSize"); } } } return null; } /// /// Validates basic forms for simple or advanced mode for generated properties. /// /// TRUE if form is valid. FALSE is form is invalid private bool ValidateControlForms() { if (SelectedMode == FieldEditorSelectedModeEnum.Simplified) { return simpleMode.SaveData(); } else if (chkDisplayInForm.Checked) { return controlSettings.SaveData(); } return true; } /// /// Returns FormFieldInfo structure with form data. /// /// Original field info private FormFieldInfo FillFormFieldInfoStructure(FormFieldInfo ffiOriginal) { // Field info with updated information FormFieldInfo ffi; // Ensure field GUID if (ffiOriginal != null) { ffi = (FormFieldInfo)ffiOriginal.Clone(); if (chkDisplayInForm.Checked) { ffi.Settings.Clear(); } } else { ffi = new FormFieldInfo(); } if (ffi.Guid == Guid.Empty) { ffi.Guid = Guid.NewGuid(); } // Load FormFieldInfo with data from simple control if (SelectedMode == FieldEditorSelectedModeEnum.Simplified) { string selectedType = simpleMode.FieldType; // Part of database section ffi.Name = simpleMode.AttributeName; ffi.Caption = simpleMode.FieldCaption; ffi.AllowEmpty = simpleMode.AllowEmpty; ffi.System = simpleMode.IsSystem; ffi.DefaultValue = simpleMode.GetDefaultValue(ffiOriginal); ffi.IsMacro = EnableMacrosForDefaultValue && ValidationHelper.IsMacro(ffi.DefaultValue); // Get control data type string[] controlDefaultDataType = FormUserControlInfoProvider.GetUserControlDefaultDataType(selectedType); // Update datatype only in advanced mode or if FormFieldInfo is inserted (newly created) if (SelectedMode == FieldEditorSelectedModeEnum.Advanced || ffiOriginal == null) { ffi.DataType = FormHelper.GetFormFieldDataType(controlDefaultDataType[0]); } if (simpleMode.AttributeType == "text") { ffi.Size = simpleMode.AttributeSize; } else { ffi.Size = ValidationHelper.GetInteger(controlDefaultDataType[1], 0); } // Remove control prefix if exists if (selectedType.Contains(controlPrefix)) { selectedType = selectedType.Substring(controlPrefix.Length); } // Store field type ffi.Settings["controlname"] = selectedType; if ((simpleMode.FormData != null) && (simpleMode.FormData.ItemArray.Length > 0)) { foreach (DataColumn column in simpleMode.FormData.Table.Columns) { ffi.Settings[column.ColumnName] = simpleMode.FormData.Table.Rows[0][column.Caption]; } } if ((Mode == FieldEditorModeEnum.BizFormDefinition) || (DisplayedControls == FieldEditorControlsEnum.Bizforms)) { ffi.PublicField = simpleMode.PublicField; } else { ffi.PublicField = false; } } // Load FormFieldInfo with data from advanced control else { string selectedType = fieldAppearance.FieldType; string attributeType = databaseConfiguration.AttributeType; // Part of database section ffi.Name = databaseConfiguration.GetAttributeName(); ffi.AllowEmpty = databaseConfiguration.AllowEmpty; ffi.System = databaseConfiguration.IsSystem; ffi.TranslateField = databaseConfiguration.TranslateField; ffi.DefaultValue = GetDefaultValue(); ffi.IsMacro = EnableMacrosForDefaultValue && ValidationHelper.IsMacro(ffi.DefaultValue); if (chkDisplayInForm.Checked) { // Save user visibility ffi.AllowUserToChangeVisibility = fieldAppearance.ChangeVisibility; ffi.Visibility = fieldAppearance.VisibilityValue; ffi.VisibilityControl = fieldAppearance.VisibilityDDL; ffi.VisibleMacro = fieldAdvancedSettings.VisibleMacro; ffi.EnabledMacro = fieldAdvancedSettings.EnabledMacro; ffi.DisplayInSimpleMode = fieldAdvancedSettings.DisplayInSimpleMode; ffi.Description = fieldAppearance.Description; ffi.Caption = fieldAppearance.FieldCaption; if (ShowInheritanceSettings) { ffi.Inheritable = fieldAppearance.ControlInheritable; } if ((Mode == FieldEditorModeEnum.BizFormDefinition) || DisplayedControls == FieldEditorControlsEnum.Bizforms) { ffi.PublicField = fieldAppearance.PublicField; } else { ffi.PublicField = false; } // Remove control prefix if exists if (selectedType.Contains(controlPrefix)) { selectedType = selectedType.Substring(controlPrefix.Length); } // Store field type ffi.Settings["controlname"] = selectedType; // Store settings if ((controlSettings.FormData != null) && (controlSettings.FormData.ItemArray.Length > 0)) { foreach (DataColumn column in controlSettings.FormData.Table.Columns) { ffi.Settings[column.ColumnName] = controlSettings.FormData.Table.Rows[0][column.Caption]; } } // Control dependencies ffi.HasDependingFields = fieldAdvancedSettings.HasDependingFields; ffi.DependsOnAnotherField = fieldAdvancedSettings.DependsOnAnotherField; // Validation section ffi.RegularExpression = validationSettings.RegularExpression; ffi.MinStringLength = (string.IsNullOrEmpty(validationSettings.MinLengthText)) ? -1 : Convert.ToInt32(validationSettings.MinLengthText); ffi.MaxStringLength = (string.IsNullOrEmpty(validationSettings.MaxLengthText)) ? -1 : Convert.ToInt32(validationSettings.MaxLengthText); ffi.MinValue = validationSettings.MinValueText; ffi.MaxValue = validationSettings.MaxValueText; ffi.MinDateTimeValue = validationSettings.DateFrom; ffi.MaxDateTimeValue = validationSettings.DateTo; ffi.ValidationErrorMessage = validationSettings.ErrorMessage; ffi.SpellCheck = validationSettings.SpellCheck; // Design section ffi.CaptionStyle = cssSettings.CaptionStyle; ffi.InputControlStyle = cssSettings.InputStyle; ffi.ControlCssClass = cssSettings.ControlCssClass; } // Determine if it is external column ffi.External |= IsSystemFieldSelected; if (((Mode == FieldEditorModeEnum.BizFormDefinition) || (Mode == FieldEditorModeEnum.SystemTable)) && (databaseConfiguration.AttributeType == FormFieldDataTypeCode.FILE)) { // Allow to save . ffi.DataType = FormFieldDataTypeEnum.Text; ffi.Size = 500; } else if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.DOCUMENT_ATTACHMENTS) { ffi.DataType = FormFieldDataTypeEnum.DocumentAttachments; ffi.Size = 200; } else { ffi.DataType = FormHelper.GetFormFieldDataType(databaseConfiguration.AttributeType); ffi.Size = ValidationHelper.GetInteger(databaseConfiguration.AttributeSize, 0); } ffi.DisplayIn = String.Empty; if (chkDisplayInDashBoard.Checked) { ffi.DisplayIn = DisplayIn; } } ffi.Visible = chkDisplayInForm.Checked; ffi.FieldType = FormFieldControlTypeEnum.CustomUserControl; return ffi; } /// /// Returns default value according to attribute type. /// protected string GetDefaultValue() { string defaultValue = null; switch (SelectedMode) { // Advanced mode case FieldEditorSelectedModeEnum.Advanced: switch (databaseConfiguration.AttributeType) { case FormFieldDataTypeCode.DATETIME: string datetimevalue = databaseConfiguration.DefaultDateTime; if (datetimevalue.ToLowerCSafe() == DateTimePicker.DATE_TODAY.ToLowerCSafe()) { defaultValue = DateTimePicker.DATE_TODAY; } else if (datetimevalue.ToLowerCSafe() == DateTimePicker.TIME_NOW.ToLowerCSafe()) { defaultValue = DateTimePicker.TIME_NOW; } else if (ValidationHelper.IsMacro(datetimevalue)) { defaultValue = datetimevalue; } else if (ValidationHelper.GetDateTime(datetimevalue, DateTime.MinValue) == DateTimePicker.NOT_SELECTED) { defaultValue = ""; } else { defaultValue = datetimevalue; } break; case FormFieldDataTypeCode.BOOLEAN: defaultValue = Convert.ToString(databaseConfiguration.DefaultBoolValue).ToLowerCSafe(); break; case FormFieldDataTypeCode.LONGTEXT: defaultValue = databaseConfiguration.LargeDefaultValueText; break; case FormFieldControlTypeCode.DOCUMENT_ATTACHMENTS: string defValue = databaseConfiguration.DefaultValueText; defaultValue = (string.IsNullOrEmpty(defValue)) ? null : defValue; break; default: defaultValue = databaseConfiguration.DefaultValueText; break; } break; } return defaultValue; } /// /// Displays selected tab content. /// protected void DisplaySelectedTabContent() { switch (SelectedMode) { case FieldEditorSelectedModeEnum.Simplified: plcAdvanced.Visible = false; plcSimple.Visible = true; plcCategory.Visible = false; break; case FieldEditorSelectedModeEnum.Advanced: plcAdvanced.Visible = true; plcSimple.Visible = false; plcCategory.Visible = false; break; } } /// /// Switches field editor to simple mode. /// private void SwitchToSimpleMode() { SelectedMode = FieldEditorSelectedModeEnum.Simplified; btnAdvanced.Visible = (SelectedMode == FieldEditorSelectedModeEnum.Simplified); btnSimplified.Visible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified); Reload(lstAttributes.SelectedValue); } /// /// Switches field editor to advanced mode. /// private void SwitchToAdvancedMode() { SelectedMode = FieldEditorSelectedModeEnum.Advanced; btnAdvanced.Visible = (SelectedMode == FieldEditorSelectedModeEnum.Simplified); btnSimplified.Visible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified); Reload(lstAttributes.SelectedValue); LoadControlSettings(null, true); } /// /// Returns default selected mode. /// private FieldEditorSelectedModeEnum GetDefaultSelectedMode() { if (EnableSimplifiedMode) { return FieldEditorSelectedModeEnum.Simplified; } else { return FieldEditorSelectedModeEnum.Advanced; } } /// /// Hides all editing panels. /// protected void HideAllPanels() { plcCategory.Visible = false; plcSimple.Visible = false; plcAdvanced.Visible = false; } /// /// Adds new form item (field or category) to the form definition. /// /// Form item to add protected void InsertFormItem(IFormItem formItem) { // Set new item preffix string newItemPreffix = (formItem is FormFieldInfo) ? newFieldPreffix : newCategPreffix; ListItem newItem = lstAttributes.Items.FindByValue(newItemPreffix); int newItemIndex = lstAttributes.Items.IndexOf(newItem); if ((newItemIndex > 0) && (lstAttributes.Items[newItemIndex - 1] != null)) { // Add new item at the specified position fi.AddFormItem(formItem, newItemIndex); } else { if (formItem is FormFieldInfo) { // Add new field at the end of the collection fi.AddFormField((FormFieldInfo)formItem); } else if (formItem is FormCategoryInfo) { // Add new category at the end of the collection fi.AddFormCategory((FormCategoryInfo)formItem); } } } /// /// Returns FormInfo for given form user control. /// /// Code name of form control /// Form info private FormInfo GetUserControlSettings(string controlName) { FormUserControlInfo control = FormUserControlInfoProvider.GetFormUserControlInfo(controlName); if (control != null) { FormInfo fi = null; if (control.UserControlParentID > 0) { // Get merged form info from inherited and parent form control fi = FormHelper.GetFormControlParameters(controlName, control.MergedFormInfo, true); } else { // Get only current form control parameters fi = FormHelper.GetFormControlParameters(controlName, control.UserControlParameters, true); } return fi; } return null; } /// /// Clears hashtables. /// private void ClearHashtables() { // Clear the object type hashtable ProviderStringDictionary.ReloadDictionaries(ClassName, true); // Clear the classes hashtable ProviderStringDictionary.ReloadDictionaries("cms.class", true); // Clear class structures ClassStructureInfo.Remove(ClassName, true); // Clear data items type infos switch (Mode) { case FieldEditorModeEnum.CustomTable: CMSObjectHelper.RemoveReadOnlyObjects(CustomTableItemProvider.GetObjectType(ClassName), true); CustomTableItemProvider.Remove(ClassName, true); break; case FieldEditorModeEnum.BizFormDefinition: CMSObjectHelper.RemoveReadOnlyObjects(BizFormItemProvider.GetObjectType(ClassName), true); BizFormItemProvider.Remove(ClassName, true); break; } // Get lower case class name string lowerClassName = ValidationHelper.GetString(ClassName, String.Empty).ToLowerCSafe(); // Invalidate objects based on object type TypeInfo ti = TypeInfo.GetTypeInfo(ClassName); if ((ti != null) && (ti.ProviderType != null)) { ti.InvalidateColumnNames(); ti.InvalidateAllObjects(); // If edited class is user settings, clear the user structure info which contains the user settings columns if ((Mode == FieldEditorModeEnum.SystemTable) && mClassName.EqualsCSafe(SiteObjectType.USERSETTINGS, StringComparison.InvariantCultureIgnoreCase)) { TypeInfo userTypeInfo = UserInfo.TYPEINFO; userTypeInfo.InvalidateColumnNames(); userTypeInfo.InvalidateAllObjects(); } } } /// /// Raises OnFieldCreated event. /// /// Newly created field protected void RaiseOnFieldCreated(FormFieldInfo newField) { if (OnFieldCreated != null) { OnFieldCreated(this, newField); } } #endregion #region "Support for system fields" /// /// Group changed event handler. /// private void databaseConfiguration_DropChanged(object sender, EventArgs e) { LoadSystemField(); } /// /// Database attribute has changed. /// private void databaseConfiguration_AttributeChanged(object sender, EventArgs e) { databaseConfiguration.Mode = Mode; databaseConfiguration.IsAlternativeForm = IsAlternativeForm; databaseConfiguration.EnableOrDisableAttributeSize(); fieldAppearance.Mode = Mode; fieldAppearance.ClassName = ClassName; fieldAppearance.AttributeType = databaseConfiguration.AttributeType; fieldAppearance.FieldType = FormHelper.GetFormFieldDefaultControlType(databaseConfiguration.AttributeType); fieldAppearance.LoadFieldTypes(IsPrimaryField); ShowAdvancedOptions(); LoadValidationSettings(); databaseConfiguration.ShowDefaultControl(); LoadControlSettings(null, false); } /// /// Field control changed event handler. /// private void control_FieldSelected(object sender, EventArgs e) { LoadControlSettings(null, true); LoadValidationSettings(); } /// /// SimpleMode control request FormFieldInfo. /// private void simpleMode_OnGetFieldInfo(object sender, EventArgs e) { if (ffi != null) { simpleMode.FieldInfo = ffi; } else { LoadFormDefinition(); simpleMode.FieldInfo = fi.GetFormField(SelectedItemName); } } /// /// Loads control with new FormInfo data. /// /// Selected field /// Indicates if simple field editor should load default values for selected field private void LoadControlSettings(string selectedFieldType, bool defaultValues) { // Reload control for simplified mode if (SelectedMode == FieldEditorSelectedModeEnum.Simplified) { simpleMode.FieldInfo = ffi; if (ffi != null) { simpleMode.Settings = ffi.Settings; } simpleMode.LoadControlSettings(selectedFieldType, defaultValues); simpleMode.Mode = Mode; simpleMode.ClassName = ClassName; simpleMode.DisplayedControls = DisplayedControls; simpleMode.SelectedItemType = SelectedItemType; } // Reload control for advanced mode else { if (String.IsNullOrEmpty(selectedFieldType)) { selectedFieldType = fieldAppearance.FieldType; } if (selectedFieldType.StartsWithCSafe(controlPrefix)) { selectedFieldType = selectedFieldType.Substring(controlPrefix.Length); } controlSettings.FormInfo = GetUserControlSettings(selectedFieldType); if (ffi != null) { controlSettings.Settings = ffi.Settings; } validationSettings.FieldType = selectedFieldType; validationSettings.AttributeType = databaseConfiguration.AttributeType; controlSettings.Reload(true); } } /// /// Loads system field either from database column data or from field XML definition. /// private void LoadSystemField() { string tableName = databaseConfiguration.GroupValue; string columnName = databaseConfiguration.SystemValue; if (SelectedItemName.ToLowerCSafe() != columnName.ToLowerCSafe()) { DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName); // Get field info from database column ffi = FormHelper.GetFormFieldInfo(dci, tableName, columnName); } else { // Get field info from XML definition LoadFormDefinition(); ffi = fi.GetFormField(SelectedItemName); } LoadSelectedField(false); } /// /// Loads the new column type and size. /// /// Data type /// New size /// New column type /// New column size protected void LoadColumnTypeAndSize(FormFieldDataTypeEnum dataType, int newSize, ref string newColumnType, ref string newColumnSize) { switch (dataType) { case FormFieldDataTypeEnum.Integer: newColumnType = SqlHelperClass.DATATYPE_INTEGER; break; case FormFieldDataTypeEnum.LongInteger: newColumnType = SqlHelperClass.DATATYPE_LONG; break; case FormFieldDataTypeEnum.Decimal: newColumnType = SqlHelperClass.DATATYPE_FLOAT; break; case FormFieldDataTypeEnum.Boolean: newColumnType = SqlHelperClass.DATATYPE_BOOLEAN; break; case FormFieldDataTypeEnum.DateTime: newColumnType = SqlHelperClass.DATATYPE_DATETIME; break; case FormFieldDataTypeEnum.LongText: newColumnType = SqlHelperClass.DATATYPE_LONGTEXT; break; case FormFieldDataTypeEnum.File: case FormFieldDataTypeEnum.GUID: newColumnType = SqlHelperClass.DATATYPE_GUID; break; case FormFieldDataTypeEnum.Binary: newColumnType = SqlHelperClass.DATATYPE_BINARY; break; default: newColumnSize = Convert.ToString(newSize); newColumnType = SqlHelperClass.DATATYPE_TEXT + "(" + newColumnSize + ")"; break; } } #endregion }