PageRenderTime 76ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/CMSModules/AdminControls/Controls/Class/FieldEditor/FieldEditor.ascx.cs

https://bitbucket.org/mchudo89/cms.io.rackspace-with-kentico
C# | 4441 lines | 3254 code | 594 blank | 593 comment | 625 complexity | 7e1a44de649d7a392a8359477eecba91 MD5 | raw file
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Runtime.InteropServices;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Text;
  10. using System.Xml;
  11. using CMS.CMSHelper;
  12. using CMS.DataEngine;
  13. using CMS.EventLog;
  14. using CMS.ExtendedControls;
  15. using CMS.FormControls;
  16. using CMS.FormEngine;
  17. using CMS.GlobalHelper;
  18. using CMS.PortalEngine;
  19. using CMS.SettingsProvider;
  20. using CMS.SiteProvider;
  21. using CMS.UIControls;
  22. using CMS.ExtendedControls.ActionsConfig;
  23. using CMS.DocumentEngine;
  24. using CMS.IO;
  25. [Guid("B1E7505C-1699-4872-9A02-6D17FD661ABA")]
  26. public partial class CMSModules_AdminControls_Controls_Class_FieldEditor_FieldEditor : CMSUserControl
  27. {
  28. #region "Events"
  29. /// <summary>
  30. /// Event raised when OK button is clicked and before xml definition is changed.
  31. /// </summary>
  32. public event EventHandler OnBeforeDefinitionUpdate;
  33. /// <summary>
  34. /// Event raised when OK button is clicked and after xml definition is changed.
  35. /// </summary>
  36. public event EventHandler OnAfterDefinitionUpdate;
  37. /// <summary>
  38. /// Event raised when new field is created and form definition is saved.
  39. /// </summary>
  40. public event OnFieldCreatedEventHandler OnFieldCreated;
  41. /// <summary>
  42. /// Event raised when field name was changed.
  43. /// </summary>
  44. public event OnFieldNameChangedEventHandler OnFieldNameChanged;
  45. #endregion
  46. #region "Variables"
  47. private FormInfo fi = null;
  48. private FormFieldInfo ffi = null;
  49. private FormCategoryInfo fci = null;
  50. private IEnumerable<string> columnNames = null;
  51. private bool mShowFieldVisibility = false;
  52. private bool mDevelopmentMode = false;
  53. private string mClassName = String.Empty;
  54. private string mImageDirectoryPath = null;
  55. private bool mDisplaySourceFieldSelection = true;
  56. private int mWebPartId = 0;
  57. private FieldEditorModeEnum mMode;
  58. private FieldEditorControlsEnum mDisplayedControls = FieldEditorControlsEnum.ModeSelected;
  59. private bool mEnableSystemFields = false;
  60. private bool mEnableMacrosForDefaultValue = true;
  61. private string mDisplayIn = String.Empty;
  62. private HeaderAction btnSave;
  63. private HeaderAction btnSimplified;
  64. private HeaderAction btnAdvanced;
  65. private bool mIsWizard;
  66. #endregion
  67. #region "Properties"
  68. /// <summary>
  69. /// Messages placeholder
  70. /// </summary>
  71. public override MessagesPlaceHolder MessagesPlaceHolder
  72. {
  73. get
  74. {
  75. return plcMess;
  76. }
  77. }
  78. /// <summary>
  79. /// Indicates if control is used on live site.
  80. /// </summary>
  81. public override bool IsLiveSite
  82. {
  83. get
  84. {
  85. return base.IsLiveSite;
  86. }
  87. set
  88. {
  89. hdrActions.IsLiveSite = value;
  90. plcMess.IsLiveSite = value;
  91. base.IsLiveSite = value;
  92. }
  93. }
  94. /// <summary>
  95. /// Adjust the context in which the attribute can be displayed.
  96. /// </summary>
  97. public string DisplayIn
  98. {
  99. get
  100. {
  101. return mDisplayIn;
  102. }
  103. set
  104. {
  105. mDisplayIn = value;
  106. }
  107. }
  108. /// <summary>
  109. /// Indicates if system fields from tables CMS_Tree and CMS_Document are offered to the user.
  110. /// </summary>
  111. public bool EnableSystemFields
  112. {
  113. get
  114. {
  115. return mEnableSystemFields;
  116. }
  117. set
  118. {
  119. mEnableSystemFields = value;
  120. databaseConfiguration.EnableSystemFields = value;
  121. }
  122. }
  123. /// <summary>
  124. /// Indicates if field visibility selector should be displayed.
  125. /// </summary>
  126. public bool ShowFieldVisibility
  127. {
  128. get
  129. {
  130. return mShowFieldVisibility;
  131. }
  132. set
  133. {
  134. mShowFieldVisibility = value;
  135. fieldAppearance.ShowFieldVisibility = value;
  136. }
  137. }
  138. /// <summary>
  139. /// Indicates if field editor works in development mode.
  140. /// </summary>
  141. public bool DevelopmentMode
  142. {
  143. get
  144. {
  145. return mDevelopmentMode;
  146. }
  147. set
  148. {
  149. fieldAppearance.DevelopmentMode = value;
  150. mDevelopmentMode = value;
  151. }
  152. }
  153. /// <summary>
  154. /// Class name.
  155. /// </summary>
  156. public string ClassName
  157. {
  158. get
  159. {
  160. return mClassName;
  161. }
  162. set
  163. {
  164. mClassName = value;
  165. fieldAppearance.ClassName = value;
  166. }
  167. }
  168. /// <summary>
  169. /// Coupled class name.
  170. /// </summary>
  171. public string CoupledClassName
  172. {
  173. get;
  174. set;
  175. }
  176. /// <summary>
  177. /// Header actions control.
  178. /// </summary>
  179. public override HeaderActions HeaderActions
  180. {
  181. get
  182. {
  183. return hdrActions;
  184. }
  185. }
  186. /// <summary>
  187. /// Directory path for images.
  188. /// </summary>
  189. public string ImageDirectoryPath
  190. {
  191. get
  192. {
  193. if (String.IsNullOrEmpty(mImageDirectoryPath))
  194. {
  195. mImageDirectoryPath = "CMSModules/CMS_Class/";
  196. }
  197. return mImageDirectoryPath;
  198. }
  199. set
  200. {
  201. if (!value.EndsWithCSafe("/"))
  202. {
  203. mImageDirectoryPath = value + "/";
  204. }
  205. else
  206. {
  207. mImageDirectoryPath = value;
  208. }
  209. }
  210. }
  211. /// <summary>
  212. /// Indicates if display source field selection.
  213. /// </summary>
  214. public bool DisplaySourceFieldSelection
  215. {
  216. get
  217. {
  218. return mDisplaySourceFieldSelection;
  219. }
  220. set
  221. {
  222. mDisplaySourceFieldSelection = value;
  223. }
  224. }
  225. /// <summary>
  226. /// Webpart ID.
  227. /// </summary>
  228. public int WebPartId
  229. {
  230. get
  231. {
  232. return mWebPartId;
  233. }
  234. set
  235. {
  236. mWebPartId = value;
  237. }
  238. }
  239. /// <summary>
  240. /// Field editor mode.
  241. /// </summary>
  242. public FieldEditorModeEnum Mode
  243. {
  244. get
  245. {
  246. return mMode;
  247. }
  248. set
  249. {
  250. mMode = value;
  251. fieldAppearance.Mode = value;
  252. }
  253. }
  254. /// <summary>
  255. /// Type of custom controls that can be selected from the control list in FieldEditor.
  256. /// </summary>
  257. public FieldEditorControlsEnum DisplayedControls
  258. {
  259. get
  260. {
  261. return mDisplayedControls;
  262. }
  263. set
  264. {
  265. mDisplayedControls = value;
  266. fieldAppearance.DisplayedControls = value;
  267. }
  268. }
  269. /// <summary>
  270. /// Indicates if simplified mode is enabled.
  271. /// </summary>
  272. public bool EnableSimplifiedMode
  273. {
  274. get;
  275. set;
  276. }
  277. /// <summary>
  278. /// Form XML definition.
  279. /// </summary>
  280. public string FormDefinition
  281. {
  282. get
  283. {
  284. return ValidationHelper.GetString(ViewState["FormDefinition"], "");
  285. }
  286. set
  287. {
  288. ViewState["FormDefinition"] = value;
  289. }
  290. }
  291. /// <summary>
  292. /// Enable or disable the option to use macros as default value.
  293. /// </summary>
  294. public bool EnableMacrosForDefaultValue
  295. {
  296. get
  297. {
  298. return mEnableMacrosForDefaultValue;
  299. }
  300. set
  301. {
  302. mEnableMacrosForDefaultValue = value;
  303. }
  304. }
  305. /// <summary>
  306. /// Gets or sets value indicating if control is placed in wizard.
  307. /// </summary>
  308. public bool IsWizard
  309. {
  310. get
  311. {
  312. return mIsWizard;
  313. }
  314. set
  315. {
  316. mIsWizard = value;
  317. categoryEdit.IsWizard = value;
  318. fieldAdvancedSettings.IsWizard = value;
  319. }
  320. }
  321. /// <summary>
  322. /// Indicates if Field Editor is used as alternative form.
  323. /// </summary>
  324. public bool IsAlternativeForm
  325. {
  326. get;
  327. set;
  328. }
  329. /// <summary>
  330. /// Gets or sets alternative form full name.
  331. /// </summary>
  332. public string AlternativeFormFullName
  333. {
  334. get;
  335. set;
  336. }
  337. /// <summary>
  338. /// Shows in what control is this basic form used.
  339. /// </summary>
  340. public FormTypeEnum FormType
  341. {
  342. get
  343. {
  344. return simpleMode.FormType;
  345. }
  346. set
  347. {
  348. simpleMode.FormType = value;
  349. controlSettings.FormType = value;
  350. }
  351. }
  352. /// <summary>
  353. /// Enables or disables to edit <see cref='CMS.FormEngine.FormFieldInfo.Inheritable'> settings.
  354. /// </summary>
  355. public bool ShowInheritanceSettings
  356. {
  357. get
  358. {
  359. return fieldAppearance.ShowInheritanceSettings;
  360. }
  361. set
  362. {
  363. fieldAppearance.ShowInheritanceSettings = value;
  364. }
  365. }
  366. #endregion
  367. #region "Private properties"
  368. /// <summary>
  369. /// Returns True if system fields are enabled and one of them is selected.
  370. /// </summary>
  371. private bool IsSystemFieldSelected
  372. {
  373. get
  374. {
  375. return databaseConfiguration.IsSystemFieldSelected;
  376. }
  377. }
  378. /// <summary>
  379. /// Selected mode.
  380. /// </summary>
  381. private FieldEditorSelectedModeEnum SelectedMode
  382. {
  383. get
  384. {
  385. FieldEditorSelectedModeEnum mode;
  386. if (ViewState["SelectedMode"] == null)
  387. {
  388. mode = GetDefaultSelectedMode();
  389. }
  390. else
  391. {
  392. switch (ValidationHelper.GetInteger(ViewState["SelectedMode"], 0))
  393. {
  394. case 0:
  395. mode = FieldEditorSelectedModeEnum.Simplified;
  396. break;
  397. case 1:
  398. mode = FieldEditorSelectedModeEnum.Advanced;
  399. break;
  400. default:
  401. mode = GetDefaultSelectedMode();
  402. break;
  403. }
  404. }
  405. return mode;
  406. }
  407. set
  408. {
  409. switch (value)
  410. {
  411. case FieldEditorSelectedModeEnum.Simplified:
  412. ViewState["SelectedMode"] = 0;
  413. break;
  414. case FieldEditorSelectedModeEnum.Advanced:
  415. ViewState["SelectedMode"] = 1;
  416. break;
  417. }
  418. }
  419. }
  420. /// <summary>
  421. /// Indicates whether new item is edited.
  422. /// </summary>
  423. private bool IsNewItemEdited
  424. {
  425. get
  426. {
  427. return ValidationHelper.GetBoolean(ViewState["IsNewItemEdited"], false);
  428. }
  429. set
  430. {
  431. ViewState["IsNewItemEdited"] = value;
  432. databaseConfiguration.IsNewItemEdited = value;
  433. simpleMode.IsNewItemEdited = value;
  434. }
  435. }
  436. /// <summary>
  437. /// Selected item name.
  438. /// </summary>
  439. private string SelectedItemName
  440. {
  441. get
  442. {
  443. return ValidationHelper.GetString(ViewState["SelectedItemName"], "");
  444. }
  445. set
  446. {
  447. ViewState["SelectedItemName"] = value;
  448. }
  449. }
  450. /// <summary>
  451. /// Selected item type.
  452. /// </summary>
  453. private FieldEditorSelectedItemEnum SelectedItemType
  454. {
  455. get
  456. {
  457. object obj = ViewState["SelectedItemType"];
  458. return (obj == null) ? 0 : (FieldEditorSelectedItemEnum)obj;
  459. }
  460. set
  461. {
  462. ViewState["SelectedItemType"] = value;
  463. }
  464. }
  465. /// <summary>
  466. /// Is field primary.
  467. /// </summary>
  468. private bool IsPrimaryField
  469. {
  470. get
  471. {
  472. return ValidationHelper.GetBoolean(ViewState["IsPrimaryField"], false);
  473. }
  474. set
  475. {
  476. ViewState["IsPrimaryField"] = value;
  477. }
  478. }
  479. /// <summary>
  480. /// Indicates if document type is edited.
  481. /// </summary>
  482. private bool IsDocumentType
  483. {
  484. get
  485. {
  486. object obj = ViewState["IsDocumentType"];
  487. if ((obj == null) && (!string.IsNullOrEmpty(ClassName)))
  488. {
  489. DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName);
  490. ViewState["IsDocumentType"] = ((dci != null) && dci.ClassIsDocumentType);
  491. }
  492. return ValidationHelper.GetBoolean(ViewState["IsDocumentType"], false);
  493. }
  494. }
  495. /// <summary>
  496. /// Gets or sets value indicating what item was selected in field type drop-down list.
  497. /// </summary>
  498. private string PreviousField
  499. {
  500. get
  501. {
  502. return ValidationHelper.GetString(ViewState["PreviousValue"], "");
  503. }
  504. set
  505. {
  506. ViewState["PreviousValue"] = value;
  507. }
  508. }
  509. /// <summary>
  510. /// Gets or sets value indicating if detailed controls are visible.
  511. /// </summary>
  512. private bool FieldDetailsVisible
  513. {
  514. get
  515. {
  516. return ValidationHelper.GetBoolean(ViewState["FieldDetailsVisible"], false);
  517. }
  518. set
  519. {
  520. ViewState["FieldDetailsVisible"] = value;
  521. }
  522. }
  523. /// <summary>
  524. /// Gets macro resolver name.
  525. /// </summary>
  526. private string ResolverName
  527. {
  528. get
  529. {
  530. if (!string.IsNullOrEmpty(ClassName))
  531. {
  532. return "form." + ClassName;
  533. }
  534. else
  535. {
  536. return "formdefinition." + FormDefinition;
  537. }
  538. }
  539. }
  540. #endregion
  541. #region "Global definitions"
  542. // Constants
  543. private const string newCategPreffix = "#categ##new#";
  544. private const string newFieldPreffix = "#field##new#";
  545. private const string categPreffix = "#categ#";
  546. private const string fieldPreffix = "#field#";
  547. private const int preffixLength = 7; // Length of categPreffix = length of fieldPreffix = 7
  548. private const string controlPrefix = "#uc#";
  549. #endregion
  550. #region "Page events"
  551. protected override void OnInit(EventArgs e)
  552. {
  553. base.OnInit(e);
  554. var page = Page as CMSPage;
  555. if (page != null)
  556. {
  557. page.EnsureScriptManager();
  558. if (page.ScriptManagerControl != null)
  559. {
  560. var script = new ScriptReference("~/CMSScripts/RestoreLostFocus.js");
  561. page.ScriptManagerControl.Scripts.Add(script);
  562. }
  563. }
  564. CreateHeaderActions();
  565. // Set method delegates
  566. fieldAppearance.GetControls = GetControls;
  567. simpleMode.GetControls = GetControls;
  568. }
  569. /// <summary>
  570. /// Creates header actions - save, switch to advanced and switch to simple mode buttons.
  571. /// </summary>
  572. private void CreateHeaderActions()
  573. {
  574. HeaderActions.ActionsList.Clear();
  575. btnSave = new HeaderAction()
  576. {
  577. RegisterShortcutScript = true,
  578. CommandName = "save",
  579. CommandArgument = "save",
  580. Text = GetString("general.save"),
  581. ImageUrl = GetImageUrl("CMSModules/CMS_Content/EditMenu/save.png"),
  582. SmallImageUrl = GetImageUrl("CMSModules/CMS_Content/EditMenu/16/save.png")
  583. };
  584. btnSimplified = new HeaderAction()
  585. {
  586. CommandName = "simplified",
  587. Text = GetString("fieldeditor.tabs.simplifiedmode"),
  588. ControlType = HeaderActionTypeEnum.Hyperlink,
  589. ImageUrl = GetImageUrl("CMSModules/CMS_FormEngine/arrowup.png"),
  590. Visible = false
  591. };
  592. btnAdvanced = new HeaderAction()
  593. {
  594. CommandName = "advanced",
  595. Text = GetString("fieldeditor.tabs.advancedmode"),
  596. ControlType = HeaderActionTypeEnum.Hyperlink,
  597. ImageUrl = GetImageUrl("CMSModules/CMS_FormEngine/arrowdown.png"),
  598. Visible = false
  599. };
  600. HeaderActions.AddAction(btnSave);
  601. HeaderActions.AddAction(btnSimplified);
  602. HeaderActions.AddAction(btnAdvanced);
  603. HeaderActions.ActionPerformed += HeaderActions_ActionPerformed;
  604. }
  605. /// <summary>
  606. /// Actions handler.
  607. /// </summary>
  608. protected void HeaderActions_ActionPerformed(object sender, CommandEventArgs e)
  609. {
  610. switch (e.CommandName)
  611. {
  612. case "save":
  613. SaveField();
  614. break;
  615. case "simplified":
  616. SwitchToSimpleMode();
  617. break;
  618. case "advanced":
  619. SwitchToAdvancedMode();
  620. break;
  621. }
  622. }
  623. protected void Page_Load(object sender, EventArgs e)
  624. {
  625. if (EnableSystemFields)
  626. {
  627. btnNewSysAttribute.Visible = true;
  628. btnNewSysAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "NewSystem.png");
  629. btnNewSysAttribute.ToolTip = GetString("TemplateDesigner.NewSysAttribute");
  630. }
  631. else
  632. {
  633. btnNewSysAttribute.Visible = false;
  634. }
  635. fieldAdvancedSettings.ResolverName = categoryEdit.ResolverName = ResolverName;
  636. fieldAdvancedSettings.ShowDisplayInSimpleModeCheckBox = (Mode == FieldEditorModeEnum.FormControls);
  637. // Hide New primary attribute if we are not in system development mode
  638. btnNewPrimaryAttribute.Visible = DevelopmentMode;
  639. simpleMode.DevelopmentMode = DevelopmentMode;
  640. simpleMode.Mode = Mode;
  641. lnkCode.Visible = SettingsKeyProvider.DevelopmentMode && !IsWizard;
  642. lnkFormDef.Visible = SettingsKeyProvider.DevelopmentMode && !IsWizard;
  643. // Set images url
  644. btnNewCategory.ImageUrl = GetImageUrl(ImageDirectoryPath + "NewCategory.png");
  645. btnNewAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "New.png");
  646. btnNewPrimaryAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "NewPK.png");
  647. btnDeleteItem.ImageUrl = GetImageUrl(ImageDirectoryPath + "Delete.png");
  648. btnUpAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "Up.png");
  649. btnDownAttribute.ImageUrl = GetImageUrl(ImageDirectoryPath + "Down.png");
  650. btnDeleteItem.ToolTip = GetString("TemplateDesigner.DeleteItem");
  651. btnNewCategory.ToolTip = GetString("TemplateDesigner.NewCategory");
  652. btnNewAttribute.ToolTip = GetString("TemplateDesigner.NewAttribute");
  653. btnNewPrimaryAttribute.ToolTip = GetString("TemplateDesigner.NewPrimaryAttribute");
  654. btnDownAttribute.ToolTip = GetString("TemplateDesigner.DownAttribute");
  655. btnUpAttribute.ToolTip = GetString("TemplateDesigner.UpAttribute");
  656. if (CMSString.Compare(DisplayIn, FormInfo.DISPLAY_CONTEXT_DASHBOARD, true) == 0)
  657. {
  658. pnlDisplayInDashBoard.Visible = true;
  659. }
  660. ltlConfirmText.Text = "<input type=\"hidden\" id=\"confirmdelete\" value=\"" + GetString("TemplateDesigner.ConfirmDelete") + "\"/>";
  661. btnDeleteItem.Attributes.Add("onclick", "javascript:return confirmDelete();");
  662. btnUpAttribute.Enabled = true;
  663. btnDownAttribute.Enabled = true;
  664. btnDeleteItem.Enabled = true;
  665. btnNewAttribute.Enabled = true;
  666. btnNewCategory.Enabled = true;
  667. databaseConfiguration.LoadGroupField();
  668. if (!URLHelper.IsPostback())
  669. {
  670. Reload(null);
  671. }
  672. else
  673. {
  674. LoadControlSettings(PreviousField, false);
  675. }
  676. // Register event handlers
  677. databaseConfiguration.DropChanged += databaseConfiguration_DropChanged;
  678. databaseConfiguration.AttributeChanged += databaseConfiguration_AttributeChanged;
  679. fieldAppearance.OnFieldSelected += control_FieldSelected;
  680. simpleMode.OnFieldSelected += control_FieldSelected;
  681. simpleMode.OnGetFieldInfo += simpleMode_OnGetFieldInfo;
  682. documentSource.OnSourceFieldChanged += documentSource_OnSourceFieldChanged;
  683. plcValidation.Visible = true;
  684. plcQuickValidation.Visible = true;
  685. plcSettings.Visible = true;
  686. }
  687. protected void Page_PreRender(object sender, EventArgs e)
  688. {
  689. // Display controls and quick links according to current mode
  690. bool displayDetails = FieldDetailsVisible && chkDisplayInForm.Checked;
  691. fieldAppearance.Visible = displayDetails;
  692. fieldAdvancedSettings.Visible = displayDetails;
  693. cssSettings.Visible = displayDetails;
  694. validationSettings.DisplayControls();
  695. validationSettings.Visible = displayDetails && validationSettings.Visible;
  696. controlSettings.CheckVisibility();
  697. controlSettings.Visible = displayDetails && controlSettings.Visible;
  698. plcQuickValidation.Visible = displayDetails && validationSettings.Visible;
  699. plcQuickSettings.Visible = displayDetails && controlSettings.Visible;
  700. plcQuickStyles.Visible = displayDetails && cssSettings.Visible;
  701. plcQuickAppearance.Visible = displayDetails && fieldAppearance.Visible;
  702. chkDisplayInDashBoard.Enabled = chkDisplayInForm.Checked;
  703. // Display and store last value for simple mode
  704. if (SelectedMode == FieldEditorSelectedModeEnum.Simplified)
  705. {
  706. PreviousField = simpleMode.FieldType;
  707. plcQuickSelect.Visible = false;
  708. }
  709. // Display and store last value for advanced mode
  710. else
  711. {
  712. PreviousField = fieldAppearance.FieldType;
  713. plcQuickSelect.Visible = true;
  714. }
  715. // Display or hide tabs
  716. btnAdvanced.Visible = btnSimplified.Visible = false;
  717. if (EnableSimplifiedMode)
  718. {
  719. if (SelectedItemType == FieldEditorSelectedItemEnum.Field)
  720. {
  721. btnAdvanced.Visible = (SelectedMode == FieldEditorSelectedModeEnum.Simplified);
  722. btnSimplified.Visible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified);
  723. }
  724. }
  725. // Hide quick links if only 'database quick link' should be displayed
  726. if ((SelectedItemType == 0) || (!plcQuickValidation.Visible && !plcQuickSettings.Visible && !plcQuickStyles.Visible && !plcQuickAppearance.Visible))
  727. {
  728. plcQuickSelect.Visible = false;
  729. }
  730. // Register script for scrolling content using quick links
  731. ScriptHelper.RegisterJQuery(Page);
  732. ScriptHelper.RegisterStartupScript(this, typeof(string), "ContentSlider", ScriptHelper.GetScript(@"
  733. jQuery(document).ready(function(){
  734. jQuery('a[href*=#]').click(function() {
  735. if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'')
  736. && location.hostname == this.hostname) {
  737. var $target = jQuery(this.hash);
  738. $target = $target.length && $target
  739. || jQuery('[name=' + this.hash.slice(1) +']');
  740. if ($target.length) {
  741. var targetOffset = $target." + (IsWizard ? "position" : "offset") + @"().top;
  742. jQuery('" + (IsWizard ? ".FieldPanelRightWizard" : "html, body") + @"')
  743. .animate({scrollTop: targetOffset}, 300);
  744. return false;
  745. }
  746. }
  747. });
  748. });
  749. "));
  750. // Disable padding on the page caused by PageContent CSS class
  751. Panel contentPanel = ((CMSPage)Page).CurrentMaster.PanelContent;
  752. if (!IsWizard && contentPanel != null)
  753. {
  754. contentPanel.CssClass = string.Empty;
  755. }
  756. // Highlight attribute list items
  757. HighlightListItems();
  758. }
  759. /// <summary>
  760. /// Highlights attribute list items like categories, primary keys and hidden fields.
  761. /// </summary>
  762. private void HighlightListItems()
  763. {
  764. if (fi == null)
  765. {
  766. LoadFormDefinition();
  767. }
  768. if ((lstAttributes.Items.Count > 0) && (fi != null))
  769. {
  770. FormFieldInfo formField = null;
  771. string cssClass = null;
  772. foreach (ListItem li in lstAttributes.Items)
  773. {
  774. // Mark category item with different color
  775. if (li.Value.StartsWithCSafe(categPreffix))
  776. {
  777. li.Attributes.Add("class", "FieldEditorCategoryItem");
  778. }
  779. else
  780. {
  781. // Get form field info
  782. formField = fi.GetFormField(li.Value.Substring(preffixLength));
  783. if (formField != null)
  784. {
  785. cssClass = string.Empty;
  786. if (DevelopmentMode && formField.PrimaryKey)
  787. {
  788. // Highlight primary keys in the list
  789. cssClass = "FieldEditorPrimaryAttribute";
  790. }
  791. if (!formField.Visible)
  792. {
  793. if (!string.IsNullOrEmpty(cssClass))
  794. {
  795. cssClass += " ";
  796. }
  797. // Highlight fields that are not visible
  798. cssClass += "FieldEditorHiddenItem";
  799. }
  800. if (!string.IsNullOrEmpty(cssClass))
  801. {
  802. li.Attributes.Add("class", cssClass);
  803. }
  804. }
  805. }
  806. }
  807. }
  808. }
  809. #endregion
  810. #region "Methods"
  811. /// <summary>
  812. /// Reload field editor.
  813. /// </summary>
  814. /// <param name="selectedValue">Selected field in field list</param>
  815. public void Reload(string selectedValue)
  816. {
  817. Reload(selectedValue, false);
  818. }
  819. /// <summary>
  820. /// Reload field editor.
  821. /// </summary>
  822. /// <param name="selectedValue">Selected field in field list</param>
  823. /// <param name="partialReload">Indicates if not all controls need to be reloaded</param>
  824. private void Reload(string selectedValue, bool partialReload)
  825. {
  826. bool isModeSelected = false;
  827. bool isItemSelected = false;
  828. // Check for alternative form mode
  829. if (IsAlternativeForm)
  830. {
  831. if (!string.IsNullOrEmpty(FormDefinition))
  832. {
  833. isModeSelected = true;
  834. }
  835. else
  836. {
  837. // Clear item list
  838. lstAttributes.Items.Clear();
  839. }
  840. }
  841. else
  842. {
  843. switch (mMode)
  844. {
  845. case FieldEditorModeEnum.General:
  846. case FieldEditorModeEnum.FormControls:
  847. if (!string.IsNullOrEmpty(FormDefinition))
  848. {
  849. isModeSelected = true;
  850. }
  851. else
  852. {
  853. // Clear item list
  854. lstAttributes.Items.Clear();
  855. }
  856. break;
  857. case FieldEditorModeEnum.ClassFormDefinition:
  858. case FieldEditorModeEnum.BizFormDefinition:
  859. case FieldEditorModeEnum.SystemTable:
  860. case FieldEditorModeEnum.CustomTable:
  861. if (!string.IsNullOrEmpty(mClassName))
  862. {
  863. isModeSelected = true;
  864. }
  865. else
  866. {
  867. ShowError(GetString("fieldeditor.noclassname"));
  868. }
  869. break;
  870. case FieldEditorModeEnum.WebPartProperties:
  871. if ((mWebPartId > 0))
  872. {
  873. isModeSelected = true;
  874. }
  875. else
  876. {
  877. ShowError(GetString("fieldeditor.nowebpartid"));
  878. }
  879. break;
  880. default:
  881. ShowError(GetString("fieldeditor.nomode"));
  882. break;
  883. }
  884. }
  885. if (!partialReload)
  886. {
  887. // Display controls if mode is determined
  888. ShowOrHideFieldDetails(true);
  889. }
  890. if (isModeSelected)
  891. {
  892. isItemSelected = LoadInnerControls(selectedValue, partialReload);
  893. }
  894. // Hide controls when item isn't selected
  895. if ((!partialReload) && (!isItemSelected))
  896. {
  897. HideAllPanels();
  898. btnSave.Enabled = false;
  899. btnSave.ImageUrl = GetImageUrl("CMSModules/CMS_Content/EditMenu/savedisabled.png");
  900. btnUpAttribute.Enabled = false;
  901. btnDownAttribute.Enabled = false;
  902. btnDeleteItem.Enabled = false;
  903. btnNewAttribute.Enabled = true; // Only new items can be added
  904. btnNewCategory.Enabled = true; // Only new items can be added
  905. ShowInformation(GetString("fieldeditor.nofieldsdefined"));
  906. }
  907. DisplayOrHideActions();
  908. if (documentSource.VisibleContent)
  909. {
  910. documentSource.Reload();
  911. }
  912. // Show or hide field visibility selector
  913. fieldAppearance.ShowFieldVisibility = ShowFieldVisibility;
  914. }
  915. /// <summary>
  916. /// Loads inner FieldEditor controls.
  917. /// </summary>
  918. /// <returns>Returns TRUE if any item is selected</returns>
  919. private bool LoadInnerControls(string selectedValue, bool partialReload)
  920. {
  921. bool isItemSelected = false;
  922. LoadFormDefinition();
  923. if (!partialReload)
  924. {
  925. LoadAttributesList(selectedValue);
  926. }
  927. documentSource.FormInfo = fi;
  928. documentSource.Mode = Mode;
  929. documentSource.IsAlternativeForm = IsAlternativeForm;
  930. documentSource.ClassName = ClassName;
  931. fieldAppearance.IsAlternativeForm = IsAlternativeForm;
  932. fieldAppearance.AlternativeFormFullName = AlternativeFormFullName;
  933. if (SelectedItemType == FieldEditorSelectedItemEnum.Field)
  934. {
  935. isItemSelected = true;
  936. DisplaySelectedTabContent();
  937. ffi = fi.GetFormField(SelectedItemName);
  938. if (EnableSimplifiedMode)
  939. {
  940. btnAdvanced.Visible = (SelectedMode == FieldEditorSelectedModeEnum.Simplified);
  941. btnSimplified.Visible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified);
  942. }
  943. LoadSelectedField(partialReload);
  944. }
  945. else if (SelectedItemType == FieldEditorSelectedItemEnum.Category)
  946. {
  947. isItemSelected = true;
  948. btnAdvanced.Visible = btnSimplified.Visible = false;
  949. LoadSelectedCategory();
  950. }
  951. return isItemSelected;
  952. }
  953. /// <summary>
  954. /// Load xml definition of the form.
  955. /// </summary>
  956. private void LoadFormDefinition()
  957. {
  958. bool isError = false;
  959. switch (mMode)
  960. {
  961. case FieldEditorModeEnum.General:
  962. // Definition is loaded from external xml
  963. break;
  964. case FieldEditorModeEnum.WebPartProperties:
  965. if (!IsAlternativeForm)
  966. {
  967. // Load xml definition from web part info
  968. WebPartInfo wpi = WebPartInfoProvider.GetWebPartInfo(mWebPartId);
  969. if (wpi != null)
  970. {
  971. FormDefinition = wpi.WebPartProperties;
  972. }
  973. else
  974. {
  975. isError = true;
  976. }
  977. }
  978. break;
  979. case FieldEditorModeEnum.ClassFormDefinition:
  980. case FieldEditorModeEnum.BizFormDefinition:
  981. case FieldEditorModeEnum.SystemTable:
  982. case FieldEditorModeEnum.CustomTable:
  983. if (!IsAlternativeForm)
  984. {
  985. // Load xml definition from Class info
  986. DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName);
  987. if (dci != null)
  988. {
  989. FormDefinition = dci.ClassFormDefinition;
  990. }
  991. else
  992. {
  993. isError = true;
  994. }
  995. }
  996. break;
  997. }
  998. if (isError)
  999. {
  1000. ShowError("[ FieldEditor.LoadFormDefinition() ]: " + GetString("FieldEditor.XmlDefinitionNotLoaded"));
  1001. }
  1002. fi = new FormInfo(FormDefinition);
  1003. }
  1004. /// <summary>
  1005. /// Fill attribute list.
  1006. /// </summary>
  1007. /// <param name="selectedValue">Selected value in attribute list, null if first item is selected</param>
  1008. private void LoadAttributesList(string selectedValue)
  1009. {
  1010. FormFieldInfo formField = null;
  1011. FormCategoryInfo formCategory = null;
  1012. ListItem li = null;
  1013. // Reload list only if new item is not edited
  1014. if (!IsNewItemEdited)
  1015. {
  1016. // Clear item list
  1017. lstAttributes.Items.Clear();
  1018. // Get all list items (fields and categories)
  1019. var itemList = fi.GetFormElements(true, true);
  1020. if (itemList != null)
  1021. {
  1022. string itemDisplayName = null;
  1023. string itemCodeName = null;
  1024. foreach (object item in itemList)
  1025. {
  1026. if (item is FormFieldInfo)
  1027. {
  1028. formField = ((FormFieldInfo)(item));
  1029. itemDisplayName = formField.Name;
  1030. if (!formField.AllowEmpty)
  1031. {
  1032. itemDisplayName += ResHelper.RequiredMark;
  1033. }
  1034. itemCodeName = fieldPreffix + formField.Name;
  1035. li = new ListItem(itemDisplayName, itemCodeName);
  1036. }
  1037. else if (item is FormCategoryInfo)
  1038. {
  1039. formCategory = ((FormCategoryInfo)(item));
  1040. itemDisplayName = ResHelper.LocalizeString(formCategory.CategoryCaption);
  1041. itemCodeName = categPreffix + formCategory.CategoryName;
  1042. li = new ListItem(itemDisplayName, itemCodeName);
  1043. }
  1044. // Load list box
  1045. if (li != null)
  1046. {
  1047. lstAttributes.Items.Add(li);
  1048. }
  1049. }
  1050. }
  1051. // Set selected item
  1052. if (lstAttributes.Items.Count > 0)
  1053. {
  1054. if (!string.IsNullOrEmpty(selectedValue) && lstAttributes.Items.FindByValue(selectedValue) != null)
  1055. {
  1056. lstAttributes.SelectedValue = selectedValue;
  1057. }
  1058. else
  1059. {
  1060. // Select first item of the list
  1061. lstAttributes.SelectedIndex = 0;
  1062. }
  1063. }
  1064. // Default values - list is empty
  1065. SelectedItemName = null;
  1066. SelectedItemType = 0;
  1067. // Save selected item info
  1068. if (lstAttributes.SelectedValue != null)
  1069. {
  1070. if (lstAttributes.SelectedValue.StartsWithCSafe(fieldPreffix))
  1071. {
  1072. SelectedItemName = lstAttributes.SelectedValue.Substring(preffixLength);
  1073. SelectedItemType = FieldEditorSelectedItemEnum.Field;
  1074. }
  1075. else if (lstAttributes.SelectedValue.StartsWithCSafe(categPreffix))
  1076. {
  1077. SelectedItemName = lstAttributes.SelectedValue.Substring(preffixLength);
  1078. SelectedItemType = FieldEditorSelectedItemEnum.Category;
  1079. }
  1080. }
  1081. }
  1082. }
  1083. /// <summary>
  1084. /// Sets all values of the category edit form to defaults.
  1085. /// </summary>
  1086. private void LoadDefaultCategoryEditForm()
  1087. {
  1088. plcCategory.Visible = true;
  1089. plcSimple.Visible = false;
  1090. plcAdvanced.Visible = false;
  1091. categoryEdit.Value = string.Empty;
  1092. categoryEdit.Collapsible = false;
  1093. categoryEdit.CollapsedByDefault = false;
  1094. categoryEdit.VisibleMacro = string.Empty;
  1095. categoryEdit.CategoryVisible = true;
  1096. LoadFormDefinition();
  1097. }
  1098. /// <summary>
  1099. /// Sets all values of form to defaults.
  1100. /// </summary>
  1101. /// <param name="system">True - empty form for node or document attribute should be loaded, False - standard form should be loaded</param>
  1102. /// <param name="partialReload">True - indicates that only some controls should be loaded, False - reload all controls</param>
  1103. private void LoadDefaultAttributeEditForm(bool system, bool partialReload)
  1104. {
  1105. ffi = null;
  1106. plcCategory.Visible = false;
  1107. chkDisplayInForm.Checked = true;
  1108. chkDisplayInDashBoard.Checked = true;
  1109. if ((SelectedMode == FieldEditorSelectedModeEnum.Advanced) && !partialReload)
  1110. {
  1111. databaseConfiguration.DevelopmentMode = DevelopmentMode;
  1112. databaseConfiguration.ShowSystemFields = system;
  1113. databaseConfiguration.IsDocumentType = IsDocumentType;
  1114. databaseConfiguration.Mode = Mode;
  1115. databaseConfiguration.ClassName = ClassName;
  1116. databaseConfiguration.CoupledClassName = CoupledClassName;
  1117. databaseConfiguration.IsAlternativeForm = IsAlternativeForm;
  1118. databaseConfiguration.Reload("", IsNewItemEdited);
  1119. databaseConfiguration.ShowDefaultControl();
  1120. }
  1121. if (system)
  1122. {
  1123. LoadSystemField();
  1124. }
  1125. if (SelectedMode == FieldEditorSelectedModeEnum.Advanced)
  1126. {
  1127. fieldAppearance.ClassName = ClassName;
  1128. fieldAppearance.AttributeType = databaseConfiguration.AttributeType;
  1129. fieldAppearance.Reload();
  1130. fieldAdvancedSettings.Reload();
  1131. cssSettings.Reload();
  1132. LoadValidationSettings();
  1133. validationSettings.DisplayControls();
  1134. validationSettings.Reload();
  1135. chkDisplayInForm.Checked = true;
  1136. chkDisplayInDashBoard.Checked = true;
  1137. }
  1138. else
  1139. {
  1140. simpleMode.FieldInfo = null;
  1141. simpleMode.DisplayedControls = DisplayedControls;
  1142. simpleMode.Mode = Mode;
  1143. simpleMode.ClearForm();
  1144. simpleMode.LoadTypes();
  1145. simpleMode.LoadControlSettings(null, true);
  1146. }
  1147. }
  1148. /// <summary>
  1149. /// Fill form with selected category data.
  1150. /// </summary>
  1151. private void LoadSelectedCategory()
  1152. {
  1153. plcAdvanced.Visible = false;
  1154. plcSimple.Visible = false;
  1155. plcCategory.Visible = true;
  1156. fci = fi.GetFormCategory(SelectedItemName);
  1157. if (fci != null)
  1158. {
  1159. HandleInherited(fci.IsInherited);
  1160. categoryEdit.Value = fci.CategoryCaption;
  1161. categoryEdit.Collapsible = fci.CategoryCollapsible;
  1162. categoryEdit.CollapsedByDefault = fci.CategoryCollapsedByDefault;
  1163. categoryEdit.VisibleMacro = fci.VisibleMacro;
  1164. categoryEdit.CategoryVisible = fci.Visible;
  1165. }
  1166. else
  1167. {
  1168. LoadDefaultCategoryEditForm();
  1169. }
  1170. }
  1171. /// <summary>
  1172. /// Displays controls for advanced editing.
  1173. /// </summary>
  1174. private void ShowAdvancedOptions()
  1175. {
  1176. if (SelectedMode != FieldEditorSelectedModeEnum.Simplified)
  1177. {
  1178. plcSimple.Visible = false;
  1179. plcCategory.Visible = false;
  1180. databaseConfiguration.Visible = true;
  1181. controlSettings.Visible = true;
  1182. fieldAppearance.Visible = true;
  1183. fieldAdvancedSettings.Visible = true;
  1184. validationSettings.Visible = true;
  1185. cssSettings.Visible = true;
  1186. FieldDetailsVisible = true;
  1187. }
  1188. }
  1189. /// <summary>
  1190. /// Handles the inheritance of the field.
  1191. /// </summary>
  1192. private void HandleInherited(bool inherited)
  1193. {
  1194. pnlField.Enabled = true;
  1195. btnSave.Enabled = true;
  1196. btnDeleteItem.Visible = true;
  1197. ShowInformation("");
  1198. if (inherited)
  1199. {
  1200. // Get information on inherited class
  1201. DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName);
  1202. if (dci != null)
  1203. {
  1204. DataClassInfo parentCi = DataClassInfoProvider.GetDataClass(dci.ClassInheritsFromClassID);
  1205. if (parentCi != null)
  1206. {
  1207. pnlField.Enabled = false;
  1208. btnSave.Enabled = false;
  1209. btnDeleteItem.Visible = false;
  1210. ShowInformation(String.Format(GetString("DocumentType.FieldIsInherited"), parentCi.ClassDisplayName));
  1211. }
  1212. }
  1213. }
  1214. }
  1215. /// <summary>
  1216. /// Fill form with selected attribute data.
  1217. /// </summary>
  1218. /// <param name="partialReload">Indicates if only some controls should be reloaded</param>
  1219. private void LoadSelectedField(bool partialReload)
  1220. {
  1221. // Fill form
  1222. if (ffi != null)
  1223. {
  1224. HandleInherited(ffi.IsInherited);
  1225. IsPrimaryField = ffi.PrimaryKey;
  1226. if (!partialReload)
  1227. {
  1228. bool controlIsInvalid = !ffi.Visible || (CMSString.Compare(ffi.Settings["controlname"] as String, FormHelper.GetFormFieldControlTypeString(FormFieldControlTypeEnum.Unknown), true) != 0);
  1229. chkDisplayInForm.Checked = ffi.Visible && controlIsInvalid;
  1230. chkDisplayInDashBoard.Checked = (CMSString.Compare(ffi.DisplayIn, DisplayIn, true) == 0);
  1231. }
  1232. DisplaySelectedTabContent();
  1233. ShowAdvancedOptions();
  1234. // Load controls for advanced mode
  1235. if (SelectedMode == FieldEditorSelectedModeEnum.Advanced)
  1236. {
  1237. if (!partialReload)
  1238. {
  1239. databaseConfiguration.DevelopmentMode = DevelopmentMode;
  1240. databaseConfiguration.ShowSystemFields = ffi.External;
  1241. databaseConfiguration.FieldInfo = ffi;
  1242. databaseConfiguration.IsDocumentType = IsDocumentType;
  1243. databaseConfiguration.Mode = Mode;
  1244. databaseConfiguration.IsAlternativeForm = IsAlternativeForm;
  1245. databaseConfiguration.ClassName = ClassName;
  1246. databaseConfiguration.CoupledClassName = CoupledClassName;
  1247. databaseConfiguration.Reload(ffi.Name, IsNewItemEdited);
  1248. }
  1249. if (chkDisplayInForm.Checked && fieldAppearance.Visible)
  1250. {
  1251. fieldAppearance.Mode = Mode;
  1252. fieldAppearance.ClassName = ClassName;
  1253. fieldAppearance.FieldInfo = ffi;
  1254. fieldAppearance.AttributeType = databaseConfiguration.AttributeType;
  1255. fieldAppearance.Reload();
  1256. }
  1257. if (chkDisplayInForm.Checked && fieldAdvancedSettings.Visible)
  1258. {
  1259. fieldAdvancedSettings.FieldInfo = ffi;
  1260. fieldAdvancedSettings.Reload();
  1261. }
  1262. if (chkDisplayInForm.Checked && validationSettings.Visible)
  1263. {
  1264. LoadValidationSettings();
  1265. validationSettings.DisplayControls();
  1266. validationSettings.Reload();
  1267. }
  1268. if (chkDisplayInForm.Checked && cssSettings.Visible)
  1269. {
  1270. cssSettings.FieldInfo = ffi;
  1271. cssSettings.Reload();
  1272. cssSettings.Enabled = true;
  1273. }
  1274. }
  1275. // Load controls for simple mode
  1276. else
  1277. {
  1278. simpleMode.FieldInfo = ffi;
  1279. simpleMode.Mode = Mode;
  1280. simpleMode.LoadTypes();
  1281. }
  1282. LoadControlSettings(null, false);
  1283. }
  1284. else
  1285. {
  1286. LoadDefaultAttributeEditForm(false, partialReload);
  1287. }
  1288. }
  1289. /// <summary>
  1290. /// Loads validation settings.
  1291. /// </summary>
  1292. private void LoadValidationSettings()
  1293. {
  1294. validationSettings.IsPrimary = IsPrimaryField;
  1295. validationSettings.FieldInfo = ffi;
  1296. validationSettings.Mode = Mode;
  1297. validationSettings.AttributeType = databaseConfiguration.AttributeType;
  1298. validationSettings.FieldType = fieldAppearance.FieldType;
  1299. }
  1300. /// <summary>
  1301. /// Displays or hides actions according to the selected mode.
  1302. /// </summary>
  1303. protected void DisplayOrHideActions()
  1304. {
  1305. // Hide actions only when alternative form definition is edited
  1306. if (IsAlternativeForm)
  1307. {
  1308. plcActions.Visible = false;
  1309. }
  1310. }
  1311. protected void lnkCode_Click(object sender, EventArgs e)
  1312. {
  1313. GenerateCode(false);
  1314. }
  1315. protected void lnkFormDef_Click(object sender, EventArgs e)
  1316. {
  1317. GetFormDefinition();
  1318. }
  1319. /// <summary>
  1320. /// Outputs the form definition XML of the current view
  1321. /// </summary>
  1322. protected void GetFormDefinition()
  1323. {
  1324. LoadFormDefinition();
  1325. if (fi != null)
  1326. {
  1327. string xml = HTMLHelper.ReformatHTML(fi.GetXmlDefinition());
  1328. // Write directly to response
  1329. Response.Clear();
  1330. Response.AddHeader("Content-Disposition", "attachment; filename=formDefinition.xml");
  1331. Response.ContentType = "text/xml";
  1332. Response.Write(xml);
  1333. Response.End();
  1334. }
  1335. }
  1336. /// <summary>
  1337. /// Generates the class code.
  1338. /// </summary>
  1339. /// <param name="file">If true, the code is generated to a file, if false, it gets directly to output</param>
  1340. protected void GenerateCode(bool file)
  1341. {
  1342. switch (mMode)
  1343. {
  1344. case FieldEditorModeEnum.WebPartProperties:
  1345. case FieldEditorModeEnum.SystemTable:
  1346. case FieldEditorModeEnum.FormControls:
  1347. return;
  1348. }
  1349. try
  1350. {
  1351. // Prepare the folders
  1352. string templateFile = Server.MapPath("~/App_Data/CodeTemplates/");
  1353. string codeFile = Server.MapPath("~/App_Code");
  1354. if (!Directory.Exists(codeFile))
  1355. {
  1356. codeFile = Server.MapPath("~/Old_App_Code");
  1357. }
  1358. codeFile += "/Global/AutoGenerated/";
  1359. // Ensure the directory
  1360. if (file)
  1361. {
  1362. Directory.CreateDirectory(codeFile);
  1363. }
  1364. // Save xml string to CMS_Class table
  1365. DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName);
  1366. if (dci != null)
  1367. {
  1368. // Prepare the class name
  1369. string className = dci.ClassName;
  1370. int dotIndex = className.LastIndexOf('.');
  1371. if (dotIndex >= 0)
  1372. {
  1373. className = className.Substring(dotIndex + 1);
  1374. }
  1375. className = ValidationHelper.GetIdentifier(className, "");
  1376. className = (className[0]) + className.Substring(1).ToUpperCSafe();
  1377. string originalClassName = null;
  1378. if (dci.ClassIsDocumentType)
  1379. {
  1380. // Document type
  1381. className += "Document";
  1382. codeFile += "DocumentTypes/";
  1383. templateFile += "DocType.template";
  1384. originalClassName = "DocType";
  1385. }
  1386. else if (dci.ClassIsCustomTable)
  1387. {
  1388. // Custom table
  1389. className += "Item";
  1390. codeFile += "CustomTables/";
  1391. templateFile += "CustomTableType.template";
  1392. originalClassName = "CustomTableType";
  1393. }
  1394. else
  1395. {
  1396. // BizForm
  1397. className += "Item";
  1398. codeFile += "BizForms/";
  1399. templateFile += "BizFormType.template";
  1400. originalClassName = "BizFormType";
  1401. }
  1402. // Generate the code
  1403. string code = File.ReadAllText(templateFile);
  1404. StringBuilder sbInit = new StringBuilder();
  1405. if (fi == null)
  1406. {
  1407. fi = new FormInfo(dci.ClassFormDefinition);
  1408. }
  1409. string propertiesCode = CodeGenerator.GetPropertiesCode(fi, false, null, null, false);
  1410. // Replace in code
  1411. code = code.Replace("##CLASSNAME##", dci.ClassName);
  1412. code = code.Replace(originalClassName, className);
  1413. code = code.Replace("// ##PROPERTIES##", propertiesCode);
  1414. code = code.Replace("##SUMMARY##", dci.ClassDisplayName);
  1415. codeFile += className + ".cs";
  1416. if (file)
  1417. {
  1418. File.WriteAllText(codeFile, code);
  1419. }
  1420. else
  1421. {
  1422. // Write directly to response
  1423. Response.Clear();
  1424. Response.AddHeader("Content-Disposition", "attachment; filename=" + className + ".cs");
  1425. Response.ContentType = "text/plain";
  1426. Response.Write(code);
  1427. Response.End();
  1428. }
  1429. }
  1430. else
  1431. {
  1432. ShowError("[FieldEditor.UpdateFormDefinition]: " + GetString("FieldEditor.ClassNotFound"));
  1433. }
  1434. }
  1435. catch (Exception ex)
  1436. {
  1437. // Log the error silently
  1438. EventLogProvider.LogException("FieldEditor", "CODEGEN", ex);
  1439. }
  1440. }
  1441. /// <summary>
  1442. /// Saves the form definition and refreshes the form.
  1443. /// </summary>
  1444. protected void SaveFormDefinition()
  1445. {
  1446. // Update form definition
  1447. FormDefinition = fi.GetXmlDefinition();
  1448. switch (mMode)
  1449. {
  1450. case FieldEditorModeEnum.WebPartProperties:
  1451. // Save xml string to CMS_WebPart table
  1452. WebPartInfo wpi = WebPartInfoProvider.GetWebPartInfo(mWebPartId);
  1453. if (wpi != null)
  1454. {
  1455. wpi.WebPartProperties = FormDefinition;
  1456. WebPartInfoProvider.SetWebPartInfo(wpi);
  1457. }
  1458. else
  1459. {
  1460. ShowError("[FieldEditor.UpdateFormDefinition]: " + GetString("FieldEditor.WebpartNotFound"));
  1461. }
  1462. break;
  1463. case FieldEditorModeEnum.ClassFormDefinition:
  1464. case FieldEditorModeEnum.BizFormDefinition:
  1465. case FieldEditorModeEnum.SystemTable:
  1466. case FieldEditorModeEnum.CustomTable:
  1467. // Save xml string to CMS_Class table
  1468. DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName);
  1469. if (dci != null)
  1470. {
  1471. dci.ClassFormDefinition = FormDefinition;
  1472. using (CMSActionContext context = new CMSActionContext())
  1473. {
  1474. // Do not log synchronization for BizForm
  1475. if (mMode == FieldEditorModeEnum.BizFormDefinition)
  1476. {
  1477. context.DisableLogging();
  1478. }
  1479. // Save the class data
  1480. DataClassInfoProvider.SetDataClass(dci);
  1481. // Update inherited classes with new fields
  1482. FormHelper.UpdateInheritedClasses(dci);
  1483. }
  1484. }
  1485. else
  1486. {
  1487. ShowError("[FieldEditor.UpdateFormDefinition]: " + GetString("FieldEditor.ClassNotFound"));
  1488. }
  1489. break;
  1490. }
  1491. // Reload attribute list
  1492. LoadAttributesList(lstAttributes.SelectedValue);
  1493. }
  1494. /// <summary>
  1495. /// When attribute up button is clicked.
  1496. /// </summary>
  1497. protected void btnUpAttribute_Click(Object sender, ImageClickEventArgs e)
  1498. {
  1499. // Raise on before definition update event
  1500. if (OnBeforeDefinitionUpdate != null)
  1501. {
  1502. OnBeforeDefinitionUpdate(this, EventArgs.Empty);
  1503. }
  1504. if (Mode == FieldEditorModeEnum.BizFormDefinition)
  1505. {
  1506. // Check 'EditForm' permission
  1507. if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm"))
  1508. {
  1509. RedirectToAccessDenied("cms.form", "EditForm");
  1510. }
  1511. }
  1512. LoadFormDefinition();
  1513. // First item of the attribute list cannot be moved higher
  1514. if (string.IsNullOrEmpty(lstAttributes.SelectedValue) || (lstAttributes.SelectedIndex == 0))
  1515. {
  1516. return;
  1517. }
  1518. // 'new (not saved)' attribute cannot be moved
  1519. else if ((SelectedItemName == newCategPreffix) || (SelectedItemName == newFieldPreffix))
  1520. {
  1521. ShowMessage(GetString("TemplateDesigner.AlertNewAttributeCannotBeMoved"));
  1522. return;
  1523. }
  1524. if (SelectedItemType == FieldEditorSelectedItemEnum.Field)
  1525. {
  1526. // Move attribute up in attribute list
  1527. fi.MoveFormFieldUp(SelectedItemName);
  1528. }
  1529. else if (SelectedItemType == FieldEditorSelectedItemEnum.Category)
  1530. {
  1531. // Move category up in attribute list
  1532. fi.MoveFormCategoryUp(SelectedItemName);
  1533. }
  1534. // Update the form definition
  1535. SaveFormDefinition();
  1536. if (OnAfterDefinitionUpdate != null)
  1537. {
  1538. OnAfterDefinitionUpdate(this, EventArgs.Empty);
  1539. }
  1540. }
  1541. /// <summary>
  1542. /// When attribute down button is clicked.
  1543. /// </summary>
  1544. protected void btnDownAttribute_Click(Object sender, ImageClickEventArgs e)
  1545. {
  1546. // Raise on before definition update event
  1547. if (OnBeforeDefinitionUpdate != null)
  1548. {
  1549. OnBeforeDefinitionUpdate(this, EventArgs.Empty);
  1550. }
  1551. if (Mode == FieldEditorModeEnum.BizFormDefinition)
  1552. {
  1553. // Check 'EditForm' permission
  1554. if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm"))
  1555. {
  1556. RedirectToAccessDenied("cms.form", "EditForm");
  1557. }
  1558. }
  1559. LoadFormDefinition();
  1560. // Last item of the attribute list cannot be moved lower
  1561. if (string.IsNullOrEmpty(lstAttributes.SelectedValue) || lstAttributes.SelectedIndex >= lstAttributes.Items.Count - 1)
  1562. {
  1563. return;
  1564. }
  1565. // 'new and not saved' attribute cannot be moved
  1566. else if ((SelectedItemName == newCategPreffix) || (SelectedItemName == newFieldPreffix))
  1567. {
  1568. ShowMessage(GetString("TemplateDesigner.AlertNewAttributeCannotBeMoved"));
  1569. return;
  1570. }
  1571. if (SelectedItemType == FieldEditorSelectedItemEnum.Field)
  1572. {
  1573. // Move attribute down in attribute list
  1574. fi.MoveFormFieldDown(SelectedItemName);
  1575. }
  1576. else if (SelectedItemType == FieldEditorSelectedItemEnum.Category)
  1577. {
  1578. // Move category down in attribute list
  1579. fi.MoveFormCategoryDown(SelectedItemName);
  1580. }
  1581. // Update the form definition
  1582. SaveFormDefinition();
  1583. // Raise on after definition update event
  1584. if (OnAfterDefinitionUpdate != null)
  1585. {
  1586. OnAfterDefinitionUpdate(this, EventArgs.Empty);
  1587. }
  1588. }
  1589. /// <summary>
  1590. /// When chkDisplayInForm checkbox checked changed.
  1591. /// </summary>
  1592. protected void chkDisplayInForm_CheckedChanged(Object sender, EventArgs e)
  1593. {
  1594. ShowOrHideFieldDetails(false);
  1595. }
  1596. /// <summary>
  1597. /// Selected attribute changed event handler.
  1598. /// </summary>
  1599. protected void lstAttributes_SelectedIndexChanged(Object sender, EventArgs e)
  1600. {
  1601. bool isNewCreated = false;
  1602. // Check if new attribute is edited -> select it and avoid selecting another attribute
  1603. foreach (ListItem item in lstAttributes.Items)
  1604. {
  1605. switch (item.Value)
  1606. {
  1607. case newCategPreffix:
  1608. isNewCreated = true;
  1609. lstAttributes.SelectedValue = newCategPreffix;
  1610. break;
  1611. case newFieldPreffix:
  1612. isNewCreated = true;
  1613. lstAttributes.SelectedValue = newFieldPreffix;
  1614. break;
  1615. }
  1616. if (isNewCreated)
  1617. {
  1618. ShowMessage(GetString("TemplateDesigner.AlertSaveNewItemOrDeleteItFirst"));
  1619. if (IsSystemFieldSelected)
  1620. {
  1621. databaseConfiguration.DisableFieldEditing(true, false);
  1622. simpleMode.DisableFieldEditing();
  1623. }
  1624. else
  1625. {
  1626. databaseConfiguration.EnableFieldEditing();
  1627. simpleMode.EnableFieldEditing();
  1628. }
  1629. return;
  1630. }
  1631. }
  1632. // Reload data
  1633. Reload(lstAttributes.SelectedValue);
  1634. }
  1635. /// <summary>
  1636. /// Show or hide details according to chkDisplayInForm checkbox is checked or not.
  1637. /// </summary>
  1638. /// <param name="changeMode">Indicates if SelectedMode was changed by link</param>
  1639. private void ShowOrHideFieldDetails(bool changeMode)
  1640. {
  1641. // Hide or display controls because mode was changed from Simple to Advanced or otherwise
  1642. if (changeMode)
  1643. {
  1644. FieldDetailsVisible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified);
  1645. }
  1646. // Hide or display controls because checkbox 'display in form' was checked
  1647. else
  1648. {
  1649. FieldDetailsVisible = chkDisplayInForm.Checked;
  1650. }
  1651. if (FieldDetailsVisible)
  1652. {
  1653. Reload(lstAttributes.SelectedValue, true);
  1654. }
  1655. }
  1656. /// <summary>
  1657. /// Saves currently edited field.
  1658. /// </summary>
  1659. private void SaveField()
  1660. {
  1661. // Raise on after definition update event
  1662. if (OnBeforeDefinitionUpdate != null)
  1663. {
  1664. OnBeforeDefinitionUpdate(this, EventArgs.Empty);
  1665. }
  1666. if (Mode == FieldEditorModeEnum.BizFormDefinition)
  1667. {
  1668. // Check 'EditForm' permission
  1669. if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm"))
  1670. {
  1671. RedirectToAccessDenied("cms.form", "EditForm");
  1672. }
  1673. }
  1674. string errorMessage = String.Empty;
  1675. if (SelectedItemType == FieldEditorSelectedItemEnum.Field)
  1676. {
  1677. errorMessage += ValidateForm();
  1678. }
  1679. // Check occurred errors
  1680. if (!string.IsNullOrEmpty(errorMessage))
  1681. {
  1682. ShowError(errorMessage);
  1683. }
  1684. else
  1685. {
  1686. if (ValidateControlForms())
  1687. {
  1688. // Save selected field
  1689. SaveSelectedField();
  1690. ClearHashtables();
  1691. }
  1692. else
  1693. {
  1694. ShowError(GetString("fieldeditor.invalidcontrolform"));
  1695. }
  1696. }
  1697. // Raise on after definition update event
  1698. if (OnAfterDefinitionUpdate != null)
  1699. {
  1700. OnAfterDefinitionUpdate(this, EventArgs.Empty);
  1701. }
  1702. }
  1703. /// <summary>
  1704. /// Save selected field.
  1705. /// </summary>
  1706. private void SaveSelectedField()
  1707. {
  1708. // Ensure the transaction
  1709. using (var tr = new CMSLateBoundTransaction())
  1710. {
  1711. // FormFieldInfo structure with data from updated form
  1712. FormFieldInfo ffiUpdated = null;
  1713. // FormCategoryInfo structure with data from updated form
  1714. FormCategoryInfo fciUpdated = null;
  1715. // Determines whether it is a new attribute (or attribute to update)
  1716. bool isNewItem = false;
  1717. string errorMessage = null;
  1718. DataClassInfo dci = null;
  1719. WebPartInfo wpi = null;
  1720. // Variables for changes in DB tables
  1721. string tableName = null;
  1722. string oldColumnName = null;
  1723. string newColumnName = null;
  1724. string newColumnSize = null;
  1725. string newColumnType = null;
  1726. string newColumnDefaultValue = null; // No default value
  1727. bool newColumnAllowNull = true;
  1728. TableManager tm = null;
  1729. if (!IsAlternativeForm)
  1730. {
  1731. switch (mMode)
  1732. {
  1733. case FieldEditorModeEnum.WebPartProperties:
  1734. // Fill WebPartInfo structure with data from database
  1735. wpi = WebPartInfoProvider.GetWebPartInfo(mWebPartId);
  1736. break;
  1737. case FieldEditorModeEnum.ClassFormDefinition:
  1738. case FieldEditorModeEnum.BizFormDefinition:
  1739. case FieldEditorModeEnum.SystemTable:
  1740. case FieldEditorModeEnum.CustomTable:
  1741. {
  1742. // Fill ClassInfo structure with data from database
  1743. dci = DataClassInfoProvider.GetDataClass(mClassName);
  1744. if (dci != null)
  1745. {
  1746. // Set table name
  1747. tableName = dci.ClassTableName;
  1748. tm = new TableManager(dci.ClassConnectionString);
  1749. tr.BeginTransaction();
  1750. }
  1751. else
  1752. {
  1753. ShowError(GetString("fieldeditor.notablename"));
  1754. return;
  1755. }
  1756. }
  1757. break;
  1758. }
  1759. }
  1760. // Load current xml form definition
  1761. LoadFormDefinition();
  1762. if (SelectedItemType == FieldEditorSelectedItemEnum.Field)
  1763. {
  1764. // Fill FormFieldInfo structure with original data
  1765. ffi = fi.GetFormField(SelectedItemName);
  1766. // Fill FormFieldInfo structure with updated form data
  1767. ffiUpdated = FillFormFieldInfoStructure(ffi);
  1768. // Determine whether it is a new attribute or not
  1769. isNewItem = (ffi == null);
  1770. // Check if the attribute name already exists
  1771. if (isNewItem || (ffi.Name.ToLowerCSafe() != ffiUpdated.Name.ToLowerCSafe()))
  1772. {
  1773. columnNames = fi.GetColumnNames();
  1774. if (columnNames != null)
  1775. {
  1776. foreach (string colName in columnNames)
  1777. {
  1778. // If name already exists
  1779. if (ffiUpdated.Name.ToLowerCSafe() == colName.ToLowerCSafe())
  1780. {
  1781. ShowError(GetString("TemplateDesigner.ErrorExistingColumnName"));
  1782. return;
  1783. }
  1784. }
  1785. }
  1786. // Check column name duplicity in JOINed tables
  1787. if (!IsSystemFieldSelected)
  1788. {
  1789. // Check whether current column already exists in 'View_CMS_Tree_Joined'
  1790. if (IsDocumentType && DocumentHelper.ColumnExistsInSystemTable(ffiUpdated.Name))
  1791. {
  1792. ShowError(GetString("TemplateDesigner.ErrorExistingColumnInJoinedTable"));
  1793. return;
  1794. }
  1795. // Check whether current column is unique in tables used to create views - applied only for system tables
  1796. if ((Mode == FieldEditorModeEnum.SystemTable) && FormHelper.ColumnExistsInView(mClassName, ffiUpdated.Name))
  1797. {
  1798. ShowError(GetString("TemplateDesigner.ErrorExistingColumnInJoinedTable"));
  1799. return;
  1800. }
  1801. }
  1802. }
  1803. // New node
  1804. if (isNewItem)
  1805. {
  1806. ffiUpdated.PrimaryKey = IsPrimaryField;
  1807. newColumnName = ffiUpdated.Name;
  1808. newColumnAllowNull = ffiUpdated.AllowEmpty;
  1809. // Set implicit default value
  1810. if (!(newColumnAllowNull) && (string.IsNullOrEmpty(ffiUpdated.DefaultValue)))
  1811. {
  1812. if (!DevelopmentMode)
  1813. {
  1814. switch (ffiUpdated.DataType)
  1815. {
  1816. case FormFieldDataTypeEnum.Integer:
  1817. case FormFieldDataTypeEnum.LongInteger:
  1818. case FormFieldDataTypeEnum.Decimal:
  1819. case FormFieldDataTypeEnum.Boolean:
  1820. newColumnDefaultValue = "0";
  1821. break;
  1822. case FormFieldDataTypeEnum.Text:
  1823. case FormFieldDataTypeEnum.LongText:
  1824. case FormFieldDataTypeEnum.DocumentAttachments:
  1825. newColumnDefaultValue = "";
  1826. break;
  1827. case FormFieldDataTypeEnum.DateTime:
  1828. newColumnDefaultValue = new DateTime(1970, 1, 1, 0, 0, 0).ToString();
  1829. break;
  1830. case FormFieldDataTypeEnum.File:
  1831. case FormFieldDataTypeEnum.GUID:
  1832. // 32 digits, empty Guid
  1833. newColumnDefaultValue = Guid.Empty.ToString();
  1834. break;
  1835. case FormFieldDataTypeEnum.Binary:
  1836. newColumnDefaultValue = null;
  1837. break;
  1838. }
  1839. }
  1840. }
  1841. // Check if default value is in required format
  1842. else if (!string.IsNullOrEmpty(ffiUpdated.DefaultValue))
  1843. {
  1844. // If default value is macro, don't try to ensure the type
  1845. if (!ffiUpdated.IsMacro)
  1846. {
  1847. switch (ffiUpdated.DataType)
  1848. {
  1849. case FormFieldDataTypeEnum.Integer:
  1850. try
  1851. {
  1852. int i = Int32.Parse(ffiUpdated.DefaultValue);
  1853. newColumnDefaultValue = i.ToString();
  1854. }
  1855. catch
  1856. {
  1857. newColumnDefaultValue = "0";
  1858. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueInteger");
  1859. }
  1860. break;
  1861. case FormFieldDataTypeEnum.LongInteger:
  1862. try
  1863. {
  1864. long longInt = long.Parse(ffiUpdated.DefaultValue);
  1865. newColumnDefaultValue = longInt.ToString();
  1866. }
  1867. catch
  1868. {
  1869. newColumnDefaultValue = "0";
  1870. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueLongInteger");
  1871. }
  1872. break;
  1873. case FormFieldDataTypeEnum.Decimal:
  1874. if (ValidationHelper.IsDouble(ffiUpdated.DefaultValue))
  1875. {
  1876. newColumnDefaultValue = FormHelper.GetDoubleValueInDBCulture(ffiUpdated.DefaultValue);
  1877. }
  1878. else
  1879. {
  1880. newColumnDefaultValue = "0";
  1881. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueDouble");
  1882. }
  1883. break;
  1884. case FormFieldDataTypeEnum.DateTime:
  1885. if ((ffiUpdated.DefaultValue.ToLowerCSafe() == DateTimePicker.DATE_TODAY.ToLowerCSafe()) || (ffiUpdated.DefaultValue.ToLowerCSafe() == DateTimePicker.TIME_NOW.ToLowerCSafe()))
  1886. {
  1887. newColumnDefaultValue = ffiUpdated.DefaultValue;
  1888. }
  1889. else
  1890. {
  1891. try
  1892. {
  1893. DateTime dat = DateTime.Parse(ffiUpdated.DefaultValue);
  1894. newColumnDefaultValue = dat.ToString();
  1895. }
  1896. catch
  1897. {
  1898. newColumnDefaultValue = DateTime.Now.ToString();
  1899. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueDateTime");
  1900. }
  1901. }
  1902. break;
  1903. case FormFieldDataTypeEnum.File:
  1904. case FormFieldDataTypeEnum.GUID:
  1905. try
  1906. {
  1907. Guid g = new Guid(ffiUpdated.DefaultValue);
  1908. newColumnDefaultValue = g.ToString();
  1909. }
  1910. catch
  1911. {
  1912. newColumnDefaultValue = Guid.Empty.ToString();
  1913. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueGuid");
  1914. }
  1915. break;
  1916. case FormFieldDataTypeEnum.LongText:
  1917. case FormFieldDataTypeEnum.Text:
  1918. case FormFieldDataTypeEnum.Boolean:
  1919. newColumnDefaultValue = ffiUpdated.DefaultValue;
  1920. break;
  1921. }
  1922. }
  1923. }
  1924. // Set column type and size
  1925. LoadColumnTypeAndSize(ffiUpdated.DataType, ffiUpdated.Size, ref newColumnType, ref newColumnSize);
  1926. if (string.IsNullOrEmpty(errorMessage))
  1927. {
  1928. if (!IsAlternativeForm)
  1929. {
  1930. switch (mMode)
  1931. {
  1932. case FieldEditorModeEnum.ClassFormDefinition:
  1933. case FieldEditorModeEnum.BizFormDefinition:
  1934. case FieldEditorModeEnum.SystemTable:
  1935. case FieldEditorModeEnum.CustomTable:
  1936. // Add new column to specified table
  1937. try
  1938. {
  1939. string newDBDefaultValue = null;
  1940. // Check if it is not a macro
  1941. if (ffiUpdated.IsMacro)
  1942. {
  1943. newDBDefaultValue = newColumnDefaultValue;
  1944. }
  1945. else
  1946. {
  1947. switch (ffiUpdated.DataType)
  1948. {
  1949. case FormFieldDataTypeEnum.Decimal:
  1950. newDBDefaultValue = FormHelper.GetDoubleValueInDBCulture(newColumnDefaultValue);
  1951. break;
  1952. case FormFieldDataTypeEnum.DateTime:
  1953. newDBDefaultValue = FormHelper.GetDateTimeValueInDBCulture(newColumnDefaultValue);
  1954. break;
  1955. default:
  1956. newDBDefaultValue = newColumnDefaultValue;
  1957. break;
  1958. }
  1959. }
  1960. if (!ffiUpdated.External)
  1961. {
  1962. if (DevelopmentMode)
  1963. {
  1964. tm.AddTableColumn(tableName, newColumnName, newColumnType, newColumnAllowNull, newDBDefaultValue, false);
  1965. }
  1966. else
  1967. {
  1968. tm.AddTableColumn(tableName, newColumnName, newColumnType, newColumnAllowNull, newDBDefaultValue);
  1969. }
  1970. // Recreate the table PK constraint
  1971. if (IsPrimaryField)
  1972. {
  1973. int pos = 0;
  1974. var pkFields = fi.GetFields(true, true, true, true);
  1975. string[] primaryKeys = new string[pkFields.Count() + 1];
  1976. foreach (FormFieldInfo pk in pkFields)
  1977. {
  1978. if (pk != null)
  1979. {
  1980. primaryKeys[pos++] = "[" + pk.Name + "]";
  1981. }
  1982. }
  1983. primaryKeys[pos] = "[" + newColumnName + "]";
  1984. tm.RecreatePKConstraint(tableName, primaryKeys);
  1985. }
  1986. }
  1987. }
  1988. catch (Exception ex)
  1989. {
  1990. ShowError(GetString("general.saveerror"), ex.Message, null);
  1991. return;
  1992. }
  1993. break;
  1994. }
  1995. }
  1996. }
  1997. // Some error has occurred
  1998. else
  1999. {
  2000. ShowError(errorMessage);
  2001. return;
  2002. }
  2003. }
  2004. // Existing node
  2005. else
  2006. {
  2007. // Get info whether it is a primary key or system field
  2008. ffiUpdated.PrimaryKey = ffi.PrimaryKey;
  2009. // If attribute is a primary key
  2010. if (ffi.PrimaryKey)
  2011. {
  2012. // Check if the attribute type is integer number
  2013. if (ffiUpdated.DataType != FormFieldDataTypeEnum.Integer)
  2014. {
  2015. errorMessage += GetString("TemplateDesigner.ErrorPKNotInteger") + " ";
  2016. }
  2017. // Check if allow empty is disabled
  2018. if (ffiUpdated.AllowEmpty)
  2019. {
  2020. errorMessage += GetString("TemplateDesigner.ErrorPKAllowsNulls") + " ";
  2021. }
  2022. // Check that the field type is label
  2023. string labelControlName = Enum.GetName(typeof(FormFieldControlTypeEnum), FormFieldControlTypeEnum.LabelControl).ToLowerCSafe();
  2024. if ((ffiUpdated.FieldType != FormFieldControlTypeEnum.LabelControl) && ((ffiUpdated.FieldType != FormFieldControlTypeEnum.CustomUserControl) && (ffiUpdated.Settings["controlname"].ToString().ToLowerCSafe() != labelControlName)))
  2025. {
  2026. errorMessage += GetString("TemplateDesigner.ErrorPKisNotLabel") + " ";
  2027. }
  2028. // Some error has occurred
  2029. if (!string.IsNullOrEmpty(errorMessage))
  2030. {
  2031. ShowError(GetString("TemplateDesigner.ErrorPKThisIsPK") + " " + errorMessage);
  2032. return;
  2033. }
  2034. }
  2035. // If table column update is needed
  2036. if (((ffi.PrimaryKey) && (ffi.Name != ffiUpdated.Name)) ||
  2037. ((!ffi.PrimaryKey) &&
  2038. ((ffi.Name != ffiUpdated.Name) ||
  2039. (ffi.DataType != ffiUpdated.DataType) ||
  2040. (ffi.AllowEmpty != ffiUpdated.AllowEmpty) ||
  2041. (ffi.Size != ffiUpdated.Size) ||
  2042. ((ffi.DefaultValue != ffiUpdated.DefaultValue) || (ffiUpdated.DataType == FormFieldDataTypeEnum.Decimal)))
  2043. )
  2044. )
  2045. {
  2046. // Set variables needed for changes in DB
  2047. oldColumnName = ffi.Name;
  2048. newColumnName = ffiUpdated.Name;
  2049. newColumnAllowNull = ffiUpdated.AllowEmpty;
  2050. // Set implicit default value
  2051. if (!(newColumnAllowNull) && (string.IsNullOrEmpty(ffiUpdated.DefaultValue)))
  2052. {
  2053. switch (ffiUpdated.DataType)
  2054. {
  2055. case FormFieldDataTypeEnum.Integer:
  2056. case FormFieldDataTypeEnum.LongInteger:
  2057. case FormFieldDataTypeEnum.Decimal:
  2058. case FormFieldDataTypeEnum.Boolean:
  2059. newColumnDefaultValue = "0";
  2060. break;
  2061. case FormFieldDataTypeEnum.Text:
  2062. case FormFieldDataTypeEnum.LongText:
  2063. newColumnDefaultValue = "";
  2064. break;
  2065. case FormFieldDataTypeEnum.DateTime:
  2066. newColumnDefaultValue = DateTime.Now.ToString();
  2067. break;
  2068. case FormFieldDataTypeEnum.File:
  2069. case FormFieldDataTypeEnum.GUID:
  2070. // 32 digits, empty Guid
  2071. newColumnDefaultValue = Guid.Empty.ToString();
  2072. break;
  2073. case FormFieldDataTypeEnum.Binary:
  2074. newColumnDefaultValue = null;
  2075. break;
  2076. }
  2077. }
  2078. // Check if default value is in required format
  2079. else if (!string.IsNullOrEmpty(ffiUpdated.DefaultValue))
  2080. {
  2081. // If default value is macro, don't try to ensure the type
  2082. if (!ffiUpdated.IsMacro)
  2083. {
  2084. switch (ffiUpdated.DataType)
  2085. {
  2086. case FormFieldDataTypeEnum.Integer:
  2087. try
  2088. {
  2089. int i = Int32.Parse(ffiUpdated.DefaultValue);
  2090. newColumnDefaultValue = i.ToString();
  2091. }
  2092. catch
  2093. {
  2094. newColumnDefaultValue = "0";
  2095. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueInteger");
  2096. }
  2097. break;
  2098. case FormFieldDataTypeEnum.LongInteger:
  2099. try
  2100. {
  2101. long longInt = long.Parse(ffiUpdated.DefaultValue);
  2102. newColumnDefaultValue = longInt.ToString();
  2103. }
  2104. catch
  2105. {
  2106. newColumnDefaultValue = "0";
  2107. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueLongInteger");
  2108. }
  2109. break;
  2110. case FormFieldDataTypeEnum.Decimal:
  2111. if (ValidationHelper.IsDouble(ffiUpdated.DefaultValue))
  2112. {
  2113. newColumnDefaultValue = FormHelper.GetDoubleValueInDBCulture(ffiUpdated.DefaultValue);
  2114. }
  2115. else
  2116. {
  2117. newColumnDefaultValue = "0";
  2118. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueDouble");
  2119. }
  2120. break;
  2121. case FormFieldDataTypeEnum.DateTime:
  2122. if ((ffiUpdated.DefaultValue.ToLowerCSafe() == DateTimePicker.DATE_TODAY.ToLowerCSafe()) || (ffiUpdated.DefaultValue.ToLowerCSafe() == DateTimePicker.TIME_NOW.ToLowerCSafe()))
  2123. {
  2124. newColumnDefaultValue = ffiUpdated.DefaultValue;
  2125. }
  2126. else
  2127. {
  2128. try
  2129. {
  2130. DateTime dat = DateTime.Parse(ffiUpdated.DefaultValue);
  2131. newColumnDefaultValue = dat.ToString();
  2132. }
  2133. catch
  2134. {
  2135. newColumnDefaultValue = DateTime.Now.ToString();
  2136. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueDateTime");
  2137. }
  2138. }
  2139. break;
  2140. case FormFieldDataTypeEnum.File:
  2141. case FormFieldDataTypeEnum.GUID:
  2142. try
  2143. {
  2144. Guid g = new Guid(ffiUpdated.DefaultValue);
  2145. newColumnDefaultValue = g.ToString();
  2146. }
  2147. catch
  2148. {
  2149. newColumnDefaultValue = Guid.Empty.ToString();
  2150. errorMessage = GetString("TemplateDesigner.ErrorDefaultValueGuid");
  2151. }
  2152. break;
  2153. case FormFieldDataTypeEnum.LongText:
  2154. case FormFieldDataTypeEnum.Text:
  2155. case FormFieldDataTypeEnum.Boolean:
  2156. newColumnDefaultValue = ffiUpdated.DefaultValue;
  2157. break;
  2158. }
  2159. }
  2160. }
  2161. // Set column type and size
  2162. LoadColumnTypeAndSize(ffiUpdated.DataType, ffiUpdated.Size, ref newColumnType, ref newColumnSize);
  2163. if (string.IsNullOrEmpty(errorMessage))
  2164. {
  2165. if (!IsAlternativeForm)
  2166. {
  2167. switch (mMode)
  2168. {
  2169. case FieldEditorModeEnum.ClassFormDefinition:
  2170. case FieldEditorModeEnum.BizFormDefinition:
  2171. case FieldEditorModeEnum.SystemTable:
  2172. case FieldEditorModeEnum.CustomTable:
  2173. try
  2174. {
  2175. string newDBDefaultValue = null;
  2176. // Check if it is not a macro
  2177. if (ffiUpdated.IsMacro)
  2178. {
  2179. newDBDefaultValue = newColumnDefaultValue;
  2180. }
  2181. else
  2182. {
  2183. switch (ffiUpdated.DataType)
  2184. {
  2185. case FormFieldDataTypeEnum.Decimal:
  2186. newDBDefaultValue = FormHelper.GetDoubleValueInDBCulture(newColumnDefaultValue);
  2187. break;
  2188. case FormFieldDataTypeEnum.DateTime:
  2189. newDBDefaultValue = FormHelper.GetDateTimeValueInDBCulture(newColumnDefaultValue);
  2190. break;
  2191. default:
  2192. newDBDefaultValue = newColumnDefaultValue;
  2193. break;
  2194. }
  2195. }
  2196. if (ffiUpdated.External)
  2197. {
  2198. if (!ffi.External)
  2199. {
  2200. // Drop old column from table
  2201. tm.DropTableColumn(tableName, ffi.Name);
  2202. }
  2203. }
  2204. else
  2205. {
  2206. if (ffi.External)
  2207. {
  2208. // Add table column
  2209. tm.AddTableColumn(tableName, newColumnName, newColumnType, newColumnAllowNull, newDBDefaultValue);
  2210. }
  2211. else
  2212. {
  2213. // Change table column
  2214. tm.AlterTableColumn(tableName, oldColumnName, newColumnName, newColumnType, newColumnAllowNull, newDBDefaultValue);
  2215. if (OnFieldNameChanged != null)
  2216. {
  2217. OnFieldNameChanged(this, oldColumnName, newColumnName);
  2218. }
  2219. }
  2220. }
  2221. }
  2222. catch (Exception ex)
  2223. {
  2224. // User friendly message for not null setting of column
  2225. if (ffi.AllowEmpty && !newColumnAllowNull)
  2226. {
  2227. ShowError(GetString("FieldEditor.ColumnNotAcceptNull"), ex.Message, null);
  2228. }
  2229. else
  2230. {
  2231. ShowError(GetString("general.saveerror"), ex.Message, null);
  2232. }
  2233. return;
  2234. }
  2235. break;
  2236. }
  2237. }
  2238. }
  2239. // Some error has occurred
  2240. else
  2241. {
  2242. ShowError(errorMessage);
  2243. return;
  2244. }
  2245. } // End update needed
  2246. } // End existing node
  2247. // Insert new field
  2248. if (isNewItem)
  2249. {
  2250. InsertFormItem(ffiUpdated);
  2251. // Hide field for alternative forms that require it
  2252. dci = DataClassInfoProvider.GetDataClass(mClassName);
  2253. if (dci != null)
  2254. {
  2255. string where = "FormClassID=" + dci.ClassID;
  2256. // If edited class is user settings, update user alt.forms which are combined with user settings too
  2257. if (mClassName.EqualsCSafe(SiteObjectType.USERSETTINGS, StringComparison.InvariantCultureIgnoreCase))
  2258. {
  2259. DataClassInfo userClass = DataClassInfoProvider.GetDataClass(SiteObjectType.USER);
  2260. if (userClass != null)
  2261. {
  2262. where = SqlHelperClass.AddWhereCondition(where, "FormClassID=" + userClass.ClassID + " AND FormCoupledClassID=" + dci.ClassID, "OR");
  2263. }
  2264. }
  2265. where = SqlHelperClass.AddWhereCondition(where, "FormHideNewParentFields=1");
  2266. var altforms = AlternativeFormInfoProvider.GetAlternativeForms(where, null);
  2267. foreach (AlternativeFormInfo afi in altforms)
  2268. {
  2269. afi.HideField(ffiUpdated);
  2270. AlternativeFormInfoProvider.SetAlternativeFormInfo(afi);
  2271. }
  2272. }
  2273. }
  2274. // Update current field
  2275. else
  2276. {
  2277. fi.UpdateFormField(ffi.Name, ffiUpdated);
  2278. }
  2279. }
  2280. else if (SelectedItemType == FieldEditorSelectedItemEnum.Category)
  2281. {
  2282. // Fill FormCategoryInfo structure with original data
  2283. fci = fi.GetFormCategory(SelectedItemName);
  2284. // Determine whether it is a new attribute or not
  2285. isNewItem = (fci == null);
  2286. // Fill FormCategoryInfo structure with updated form data
  2287. fciUpdated = new FormCategoryInfo();
  2288. fciUpdated.CategoryCaption = categoryEdit.Value.Replace("'", "");
  2289. fciUpdated.CategoryCollapsible = categoryEdit.Collapsible;
  2290. fciUpdated.CategoryCollapsedByDefault = categoryEdit.CollapsedByDefault;
  2291. fciUpdated.VisibleMacro = categoryEdit.VisibleMacro;
  2292. fciUpdated.Visible = categoryEdit.CategoryVisible;
  2293. // Check if the category caption is empty
  2294. if (string.IsNullOrEmpty(fciUpdated.CategoryCaption))
  2295. {
  2296. ShowError(GetString("TemplateDesigner.ErrorCategoryNameEmpty"));
  2297. return;
  2298. }
  2299. // Use codenamed category caption for name attribute
  2300. fciUpdated.CategoryName = IsAlternativeForm ? fci.CategoryName : ValidationHelper.GetCodeName(fciUpdated.CategoryCaption);
  2301. // Get form category names
  2302. if ((isNewItem || fciUpdated.CategoryName != fci.CategoryName) && fi.GetCategoryNames().Exists(x => x == fciUpdated.CategoryName))
  2303. {
  2304. ShowError(GetString("TemplateDesigner.ErrorExistingCategoryName"));
  2305. return;
  2306. }
  2307. if (isNewItem)
  2308. {
  2309. // Insert new category
  2310. InsertFormItem(fciUpdated);
  2311. }
  2312. else
  2313. {
  2314. // Update current
  2315. fi.UpdateFormCategory(fci.CategoryName, fciUpdated);
  2316. }
  2317. }
  2318. // Make changes in database
  2319. if (SelectedItemType != 0)
  2320. {
  2321. // Get updated definition
  2322. FormDefinition = fi.GetXmlDefinition();
  2323. string error = null;
  2324. if (!IsAlternativeForm)
  2325. {
  2326. switch (mMode)
  2327. {
  2328. case FieldEditorModeEnum.WebPartProperties:
  2329. if (wpi != null)
  2330. {
  2331. // Update xml definition
  2332. wpi.WebPartProperties = FormDefinition;
  2333. try
  2334. {
  2335. WebPartInfoProvider.SetWebPartInfo(wpi);
  2336. }
  2337. catch (Exception ex)
  2338. {
  2339. error = ex.Message;
  2340. }
  2341. }
  2342. else
  2343. {
  2344. error = GetString("FieldEditor.WebpartNotFound");
  2345. }
  2346. break;
  2347. case FieldEditorModeEnum.ClassFormDefinition:
  2348. case FieldEditorModeEnum.BizFormDefinition:
  2349. case FieldEditorModeEnum.SystemTable:
  2350. case FieldEditorModeEnum.CustomTable:
  2351. if (dci != null)
  2352. {
  2353. // Update xml definition
  2354. dci.ClassFormDefinition = FormDefinition;
  2355. // Update xml schema
  2356. dci.ClassXmlSchema = tm.GetXmlSchema(dci.ClassTableName);
  2357. // When updating existing field
  2358. if (ffi != null)
  2359. {
  2360. // Update ClassNodeNameSource field
  2361. if (dci.ClassNodeNameSource == ffi.Name)
  2362. {
  2363. dci.ClassNodeNameSource = ffiUpdated.Name;
  2364. }
  2365. }
  2366. // Update changes in DB
  2367. try
  2368. {
  2369. // Save the data class
  2370. DataClassInfoProvider.SetDataClass(dci);
  2371. // Generate the class code - Temporarily disabled
  2372. //GenerateCode(true);
  2373. // Update inherited classes with new fields
  2374. FormHelper.UpdateInheritedClasses(dci);
  2375. }
  2376. catch (Exception ex)
  2377. {
  2378. error = ex.Message;
  2379. }
  2380. bool fieldType = (SelectedItemType == FieldEditorSelectedItemEnum.Field);
  2381. if (fieldType)
  2382. {
  2383. // Generate default view
  2384. if (mMode == FieldEditorModeEnum.BizFormDefinition)
  2385. {
  2386. SqlGenerator.GenerateDefaultView(dci, CMSContext.CurrentSiteName);
  2387. }
  2388. else
  2389. {
  2390. SqlGenerator.GenerateDefaultView(dci, null);
  2391. }
  2392. // Regenerate queries
  2393. SqlGenerator.GenerateDefaultQueries(dci, true, true);
  2394. }
  2395. // Updates custom views
  2396. if (((mMode == FieldEditorModeEnum.SystemTable) || (mMode == FieldEditorModeEnum.ClassFormDefinition)))
  2397. {
  2398. // Refresh views only if needed
  2399. bool refreshViews = (fci == null);
  2400. if ((ffi != null) && (ffiUpdated != null))
  2401. {
  2402. refreshViews = false;
  2403. if (ffi.Name != ffiUpdated.Name)
  2404. {
  2405. refreshViews = true;
  2406. }
  2407. if (ffi.DataType != ffiUpdated.DataType)
  2408. {
  2409. refreshViews = true;
  2410. }
  2411. if (ffi.Size != ffiUpdated.Size)
  2412. {
  2413. refreshViews = true;
  2414. }
  2415. if (ffi.AllowEmpty != ffiUpdated.AllowEmpty)
  2416. {
  2417. refreshViews = true;
  2418. }
  2419. if (ffi.DefaultValue != ffiUpdated.DefaultValue)
  2420. {
  2421. refreshViews = true;
  2422. }
  2423. }
  2424. if (refreshViews)
  2425. {
  2426. try
  2427. {
  2428. tm.RefreshCustomViews(dci.ClassTableName);
  2429. string lowClassName = dci.ClassName.ToLowerCSafe();
  2430. if (lowClassName == "cms.document" || lowClassName == "cms.tree")
  2431. {
  2432. tm.RefreshDocumentViews();
  2433. }
  2434. }
  2435. catch (Exception ex)
  2436. {
  2437. error = ResHelper.GetString("fieldeditor.refreshingviewsfailed");
  2438. EventLogProvider ev = new EventLogProvider();
  2439. ev.LogEvent("Field Editor", "EXCEPTION", ex);
  2440. }
  2441. }
  2442. }
  2443. }
  2444. else
  2445. {
  2446. error = GetString("FieldEditor.ClassNotFound");
  2447. }
  2448. break;
  2449. }
  2450. }
  2451. if (!string.IsNullOrEmpty(error))
  2452. {
  2453. ShowError("[FieldEditor.SaveSelectedField()]: " + error);
  2454. return;
  2455. }
  2456. IsNewItemEdited = false;
  2457. if (SelectedItemType == FieldEditorSelectedItemEnum.Category)
  2458. {
  2459. Reload(categPreffix + fciUpdated.CategoryName);
  2460. }
  2461. else if (SelectedItemType == FieldEditorSelectedItemEnum.Field)
  2462. {
  2463. Reload(fieldPreffix + ffiUpdated.Name);
  2464. }
  2465. ShowChangesSaved();
  2466. }
  2467. // All done and new item, fire OnFieldCreated event
  2468. if (isNewItem && (ffiUpdated != null))
  2469. {
  2470. RaiseOnFieldCreated(ffiUpdated);
  2471. }
  2472. // Commit the transaction
  2473. tr.Commit();
  2474. }
  2475. }
  2476. /// <summary>
  2477. /// New category button clicked.
  2478. /// </summary>
  2479. protected void btnNewCategory_Click(Object sender, ImageClickEventArgs e)
  2480. {
  2481. if (Mode == FieldEditorModeEnum.BizFormDefinition)
  2482. {
  2483. // Check 'EditForm' permission
  2484. if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm"))
  2485. {
  2486. RedirectToAccessDenied("cms.form", "EditForm");
  2487. }
  2488. }
  2489. if (IsNewItemEdited)
  2490. {
  2491. // Display error - Only one new item can be edited
  2492. ShowMessage(GetString("TemplateDesigner.ErrorCannotCreateAnotherNewItem"));
  2493. }
  2494. else
  2495. {
  2496. HandleInherited(false);
  2497. // Create #categ##new# item in list
  2498. ListItem newListItem = new ListItem(GetString("TemplateDesigner.NewCategory"), newCategPreffix);
  2499. if ((lstAttributes.Items.Count > 0) && (lstAttributes.SelectedIndex >= 0))
  2500. {
  2501. // Add behind the selected item
  2502. lstAttributes.Items.Insert(lstAttributes.SelectedIndex + 1, newListItem);
  2503. }
  2504. else
  2505. {
  2506. // Add at the end of the item collection
  2507. lstAttributes.Items.Add(newListItem);
  2508. }
  2509. // Select new item
  2510. lstAttributes.SelectedIndex = lstAttributes.Items.IndexOf(newListItem);
  2511. SelectedItemType = FieldEditorSelectedItemEnum.Category;
  2512. SelectedItemName = newCategPreffix;
  2513. LoadDefaultCategoryEditForm();
  2514. IsNewItemEdited = true;
  2515. }
  2516. }
  2517. /// <summary>
  2518. /// New system attribute button clicked.
  2519. /// </summary>
  2520. protected void btnNewSysAttribute_Click(Object sender, ImageClickEventArgs e)
  2521. {
  2522. NewAttribute(true);
  2523. }
  2524. /// <summary>
  2525. /// New attribute button clicked.
  2526. /// </summary>
  2527. protected void btnNewAttribute_Click(Object sender, ImageClickEventArgs e)
  2528. {
  2529. NewAttribute(false);
  2530. }
  2531. /// <summary>
  2532. /// New attribute button clicked.
  2533. /// </summary>
  2534. protected void btnNewPrimaryAttribute_Click(Object sender, ImageClickEventArgs e)
  2535. {
  2536. NewAttribute(false, true);
  2537. }
  2538. /// <summary>
  2539. /// Creates new attribute with non-primary key.
  2540. /// </summary>
  2541. private void NewAttribute(bool system)
  2542. {
  2543. NewAttribute(system, false);
  2544. }
  2545. /// <summary>
  2546. /// Creates new attribute.
  2547. /// </summary>
  2548. /// <param name="system">Indicates if attribute is system</param>
  2549. /// <param name="isPrimary">Indicates if attribute is primary</param>
  2550. private void NewAttribute(bool system, bool isPrimary)
  2551. {
  2552. HandleInherited(false);
  2553. FieldDetailsVisible = true;
  2554. // Clear settings
  2555. simpleMode.Settings = new Hashtable();
  2556. simpleMode.SelectedItemType = FieldEditorSelectedItemEnum.Field;
  2557. controlSettings.Settings = new Hashtable();
  2558. if (Mode == FieldEditorModeEnum.BizFormDefinition)
  2559. {
  2560. // Check 'EditForm' permission
  2561. if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm"))
  2562. {
  2563. RedirectToAccessDenied("cms.form", "EditForm");
  2564. }
  2565. }
  2566. IsPrimaryField = isPrimary;
  2567. if (IsNewItemEdited)
  2568. {
  2569. // Only one new item can be edited
  2570. ShowMessage(GetString("TemplateDesigner.ErrorCannotCreateAnotherNewItem"));
  2571. }
  2572. else
  2573. {
  2574. // Create #new# attribute in attribute list
  2575. ListItem newListItem = new ListItem(GetString("TemplateDesigner.NewAttribute"), newFieldPreffix);
  2576. if ((lstAttributes.Items.Count > 0) && (lstAttributes.SelectedIndex >= 0))
  2577. {
  2578. // Add behind the selected item
  2579. lstAttributes.Items.Insert(lstAttributes.SelectedIndex + 1, newListItem);
  2580. }
  2581. else
  2582. {
  2583. // Add at the end of the item collection
  2584. lstAttributes.Items.Add(newListItem);
  2585. }
  2586. // Select new item
  2587. lstAttributes.SelectedIndex = lstAttributes.Items.IndexOf(newListItem);
  2588. // Get type of previously selected item
  2589. FieldEditorSelectedItemEnum oldItemType = SelectedItemType;
  2590. // Initialize currently selected item type and name
  2591. SelectedItemType = FieldEditorSelectedItemEnum.Field;
  2592. SelectedItemName = newFieldPreffix;
  2593. IsNewItemEdited = true;
  2594. databaseConfiguration.AttributeName = "";
  2595. string defaultControl = FormHelper.GetFormFieldDefaultControlType(FormFieldDataTypeCode.TEXT);
  2596. if (FormHelper.IsValidControl(defaultControl, GetControls(DisplayedControls, mMode, DevelopmentMode)))
  2597. {
  2598. simpleMode.FieldType = defaultControl;
  2599. }
  2600. else
  2601. {
  2602. simpleMode.ClearForm();
  2603. }
  2604. fieldAppearance.AttributeType = FormFieldDataTypeCode.TEXT;
  2605. fieldAppearance.FieldType = defaultControl;
  2606. fieldAppearance.LoadFieldTypes(isPrimary);
  2607. LoadControlSettings(null, false);
  2608. bool newItemBlank = ValidationHelper.GetBoolean(SettingsHelper.AppSettings["CMSClearFieldEditor"], true);
  2609. if (newItemBlank || (oldItemType != FieldEditorSelectedItemEnum.Field))
  2610. {
  2611. LoadDefaultAttributeEditForm(system, false);
  2612. }
  2613. DisplaySelectedTabContent();
  2614. }
  2615. }
  2616. /// <summary>
  2617. /// Gets available controls.
  2618. /// </summary>
  2619. /// <returns>Returns FieldEditorControlsEnum</returns>
  2620. private static FieldEditorControlsEnum GetControls(FieldEditorControlsEnum DisplayedControls, FieldEditorModeEnum Mode, bool DevelopmentMode)
  2621. {
  2622. FieldEditorControlsEnum controls = FieldEditorControlsEnum.None;
  2623. // Get displayed controls
  2624. if (DisplayedControls == FieldEditorControlsEnum.ModeSelected)
  2625. {
  2626. switch (Mode)
  2627. {
  2628. case FieldEditorModeEnum.BizFormDefinition:
  2629. controls = FieldEditorControlsEnum.Bizforms;
  2630. break;
  2631. case FieldEditorModeEnum.ClassFormDefinition:
  2632. if (DevelopmentMode)
  2633. {
  2634. controls = FieldEditorControlsEnum.All;
  2635. }
  2636. else
  2637. {
  2638. controls = FieldEditorControlsEnum.DocumentTypes;
  2639. }
  2640. break;
  2641. case FieldEditorModeEnum.SystemTable:
  2642. controls = FieldEditorControlsEnum.SystemTables;
  2643. break;
  2644. case FieldEditorModeEnum.CustomTable:
  2645. controls = FieldEditorControlsEnum.CustomTables;
  2646. break;
  2647. case FieldEditorModeEnum.WebPartProperties:
  2648. controls = FieldEditorControlsEnum.Controls;
  2649. break;
  2650. case FieldEditorModeEnum.General:
  2651. case FieldEditorModeEnum.FormControls:
  2652. controls = FieldEditorControlsEnum.All;
  2653. break;
  2654. }
  2655. }
  2656. else
  2657. {
  2658. controls = DisplayedControls;
  2659. }
  2660. return controls;
  2661. }
  2662. /// <summary>
  2663. /// Delete attribute button clicked.
  2664. /// </summary>
  2665. protected void btnDeleteItem_Click(Object sender, ImageClickEventArgs e)
  2666. {
  2667. // Ensure the transaction
  2668. using (var tr = new CMSLateBoundTransaction())
  2669. {
  2670. if (Mode == FieldEditorModeEnum.BizFormDefinition)
  2671. {
  2672. // Check 'EditForm' permission
  2673. if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.form", "EditForm"))
  2674. {
  2675. RedirectToAccessDenied("cms.form", "EditForm");
  2676. }
  2677. }
  2678. // Raise on before definition update event
  2679. if (OnBeforeDefinitionUpdate != null)
  2680. {
  2681. OnBeforeDefinitionUpdate(this, EventArgs.Empty);
  2682. }
  2683. FormFieldInfo ffiSelected = null;
  2684. DataClassInfo dci = null;
  2685. WebPartInfo wpi = null;
  2686. string errorMessage = null;
  2687. string newSelectedValue = null;
  2688. string deletedItemPreffix = null;
  2689. // Clear settings
  2690. simpleMode.Settings = new Hashtable();
  2691. controlSettings.Settings = new Hashtable();
  2692. TableManager tm = null;
  2693. switch (mMode)
  2694. {
  2695. case FieldEditorModeEnum.WebPartProperties:
  2696. // Get the web part
  2697. {
  2698. wpi = WebPartInfoProvider.GetWebPartInfo(mWebPartId);
  2699. if (wpi == null)
  2700. {
  2701. errorMessage = GetString("FieldEditor.WebpartNotFound");
  2702. return;
  2703. }
  2704. }
  2705. break;
  2706. case FieldEditorModeEnum.ClassFormDefinition:
  2707. case FieldEditorModeEnum.BizFormDefinition:
  2708. case FieldEditorModeEnum.SystemTable:
  2709. case FieldEditorModeEnum.CustomTable:
  2710. {
  2711. // Get the DataClass
  2712. dci = DataClassInfoProvider.GetDataClass(mClassName);
  2713. if (dci == null)
  2714. {
  2715. errorMessage = GetString("FieldEditor.ClassNotFound");
  2716. return;
  2717. }
  2718. tm = new TableManager(dci.ClassConnectionString);
  2719. tr.BeginTransaction();
  2720. }
  2721. break;
  2722. }
  2723. // Load current xml form definition
  2724. LoadFormDefinition();
  2725. if ((!string.IsNullOrEmpty(SelectedItemName)) && (!IsNewItemEdited))
  2726. {
  2727. if (SelectedItemType == FieldEditorSelectedItemEnum.Field)
  2728. {
  2729. ffiSelected = fi.GetFormField(SelectedItemName);
  2730. deletedItemPreffix = fieldPreffix;
  2731. if (ffiSelected != null)
  2732. {
  2733. // Do not allow deleting of the primary key except for external fields
  2734. if (ffiSelected.PrimaryKey && !ffiSelected.External)
  2735. {
  2736. if (!DevelopmentMode)
  2737. {
  2738. ShowError(GetString("TemplateDesigner.ErrorCannotDeletePK"));
  2739. return;
  2740. }
  2741. else
  2742. {
  2743. // Check if at least one primary key stays
  2744. if (fi.GetFields(true, true, false, true).Count() < 2)
  2745. {
  2746. ShowError(GetString("TemplateDesigner.ErrorCannotDeletePK"));
  2747. return;
  2748. }
  2749. }
  2750. }
  2751. // Check if at least two fields stay in document type definition
  2752. if ((Mode == FieldEditorModeEnum.ClassFormDefinition) && (fi.GetFields(true, true, true).Count() < 3))
  2753. {
  2754. ShowError(GetString("TemplateDesigner.ErrorCannotDeleteAllCustomFields"));
  2755. return;
  2756. }
  2757. // Do not allow deleting of the system field
  2758. if (ffiSelected.System && !ffiSelected.External && !DevelopmentMode)
  2759. {
  2760. ShowError(GetString("TemplateDesigner.ErrorCannotDeleteSystemField"));
  2761. return;
  2762. }
  2763. // Remove specific field from xml form definition
  2764. fi.RemoveFormField(SelectedItemName);
  2765. // Get updated definition
  2766. FormDefinition = fi.GetXmlDefinition();
  2767. switch (mMode)
  2768. {
  2769. case FieldEditorModeEnum.WebPartProperties:
  2770. // Web part properties
  2771. {
  2772. wpi.WebPartProperties = FormDefinition;
  2773. try
  2774. {
  2775. WebPartInfoProvider.SetWebPartInfo(wpi);
  2776. }
  2777. catch (Exception ex)
  2778. {
  2779. errorMessage = ex.Message;
  2780. }
  2781. }
  2782. break;
  2783. case FieldEditorModeEnum.ClassFormDefinition:
  2784. case FieldEditorModeEnum.BizFormDefinition:
  2785. case FieldEditorModeEnum.SystemTable:
  2786. case FieldEditorModeEnum.CustomTable:
  2787. {
  2788. // If document type is edited AND field that should be removed is FILE
  2789. if ((mMode == FieldEditorModeEnum.ClassFormDefinition) && (!string.IsNullOrEmpty(ClassName)) &&
  2790. (ffiSelected.DataType == FormFieldDataTypeEnum.File))
  2791. {
  2792. DocumentHelper.DeleteDocumentAttachments(ClassName, ffiSelected.Name, null);
  2793. }
  2794. // If bizform is edited AND field that should be removed is FILE
  2795. if ((mMode == FieldEditorModeEnum.BizFormDefinition) && (!string.IsNullOrEmpty(ClassName)) &&
  2796. (ffiSelected.FieldType == FormFieldControlTypeEnum.UploadControl))
  2797. {
  2798. BizFormInfoProvider.DeleteBizFormFiles(ClassName, ffiSelected.Name, CMSContext.CurrentSiteID);
  2799. }
  2800. // Update xml definition
  2801. dci.ClassFormDefinition = FormDefinition;
  2802. try
  2803. {
  2804. if (!ffiSelected.External)
  2805. {
  2806. // Remove corresponding column from table
  2807. tm.DropTableColumn(dci.ClassTableName, SelectedItemName);
  2808. // Update xml schema
  2809. dci.ClassXmlSchema = tm.GetXmlSchema(dci.ClassTableName);
  2810. }
  2811. }
  2812. catch (Exception ex)
  2813. {
  2814. errorMessage = ex.Message;
  2815. }
  2816. // Deleted field is used as ClassNodeNameSource -> remove node name source
  2817. if (dci.ClassNodeNameSource == SelectedItemName)
  2818. {
  2819. dci.ClassNodeNameSource = "";
  2820. }
  2821. // Update changes in database
  2822. try
  2823. {
  2824. using (CMSActionContext context = new CMSActionContext())
  2825. {
  2826. // Do not log synchronization for BizForm
  2827. if (mMode == FieldEditorModeEnum.BizFormDefinition)
  2828. {
  2829. context.DisableLogging();
  2830. }
  2831. // Save the data class
  2832. DataClassInfoProvider.SetDataClass(dci);
  2833. // Update inherited classes with new fields
  2834. FormHelper.UpdateInheritedClasses(dci);
  2835. // Update alternative forms
  2836. var altforms = AlternativeFormInfoProvider.GetAlternativeForms("FormClassID=" + dci.ClassID, null);
  2837. foreach (AlternativeFormInfo afi in altforms)
  2838. {
  2839. afi.ClearDefinition(fi.GetColumnNames());
  2840. AlternativeFormInfoProvider.SetAlternativeFormInfo(afi);
  2841. }
  2842. }
  2843. }
  2844. catch (Exception ex)
  2845. {
  2846. errorMessage = ex.Message;
  2847. }
  2848. // Refresh views and queries only if changes to DB were made
  2849. if (!ffiSelected.External)
  2850. {
  2851. // Generate default view
  2852. if (mMode == FieldEditorModeEnum.BizFormDefinition)
  2853. {
  2854. SqlGenerator.GenerateDefaultView(dci, CMSContext.CurrentSiteName);
  2855. }
  2856. else
  2857. {
  2858. SqlGenerator.GenerateDefaultView(dci, null);
  2859. }
  2860. // Regenerate queries
  2861. SqlGenerator.GenerateDefaultQueries(dci, true, true);
  2862. // Updates custom views
  2863. if ((mMode == FieldEditorModeEnum.SystemTable) || (mMode == FieldEditorModeEnum.ClassFormDefinition))
  2864. {
  2865. try
  2866. {
  2867. tm.RefreshCustomViews(dci.ClassTableName);
  2868. string lowClassName = dci.ClassName.ToLowerCSafe();
  2869. if (lowClassName == "cms.document" || lowClassName == "cms.tree")
  2870. {
  2871. tm.RefreshDocumentViews();
  2872. }
  2873. }
  2874. catch (Exception ex)
  2875. {
  2876. errorMessage = ResHelper.GetString("fieldeditor.refreshingviewsfailed");
  2877. EventLogProvider ev = new EventLogProvider();
  2878. ev.LogEvent("Field Editor", "EXCEPTION", ex);
  2879. }
  2880. }
  2881. }
  2882. // Clear hashtables
  2883. ClearHashtables();
  2884. }
  2885. break;
  2886. }
  2887. }
  2888. }
  2889. else if (SelectedItemType == FieldEditorSelectedItemEnum.Category)
  2890. {
  2891. deletedItemPreffix = categPreffix;
  2892. // Remove specific category from xml form definition
  2893. fi.RemoveFormCategory(SelectedItemName);
  2894. // Get updated form definition
  2895. FormDefinition = fi.GetXmlDefinition();
  2896. switch (mMode)
  2897. {
  2898. case FieldEditorModeEnum.WebPartProperties:
  2899. // Web part
  2900. {
  2901. wpi.WebPartProperties = FormDefinition;
  2902. try
  2903. {
  2904. WebPartInfoProvider.SetWebPartInfo(wpi);
  2905. }
  2906. catch (Exception ex)
  2907. {
  2908. errorMessage = ex.Message;
  2909. }
  2910. }
  2911. break;
  2912. case FieldEditorModeEnum.ClassFormDefinition:
  2913. case FieldEditorModeEnum.BizFormDefinition:
  2914. case FieldEditorModeEnum.SystemTable:
  2915. case FieldEditorModeEnum.CustomTable:
  2916. // Standard classes
  2917. {
  2918. // Update xml definition
  2919. dci.ClassFormDefinition = FormDefinition;
  2920. // Update changes in database
  2921. try
  2922. {
  2923. using (CMSActionContext context = new CMSActionContext())
  2924. {
  2925. // Do not log synchronization for BizForm
  2926. if (mMode == FieldEditorModeEnum.BizFormDefinition)
  2927. {
  2928. context.DisableLogging();
  2929. }
  2930. // Save the data class
  2931. DataClassInfoProvider.SetDataClass(dci);
  2932. // Update inherited classes with new fields
  2933. FormHelper.UpdateInheritedClasses(dci);
  2934. }
  2935. }
  2936. catch (Exception ex)
  2937. {
  2938. errorMessage = ex.Message;
  2939. }
  2940. }
  2941. break;
  2942. }
  2943. }
  2944. if (!string.IsNullOrEmpty(errorMessage))
  2945. {
  2946. ShowError("[ FieldEditor.btnDeleteItem_Click() ]: " + errorMessage);
  2947. }
  2948. }
  2949. else
  2950. {
  2951. // "delete" new item from the list
  2952. IsNewItemEdited = false;
  2953. }
  2954. // Set new selected value
  2955. ListItem deletedItem = lstAttributes.Items.FindByValue(deletedItemPreffix + SelectedItemName);
  2956. int deletedItemIndex = lstAttributes.Items.IndexOf(deletedItem);
  2957. if ((deletedItemIndex > 0) && (lstAttributes.Items[deletedItemIndex - 1] != null))
  2958. {
  2959. newSelectedValue = lstAttributes.Items[deletedItemIndex - 1].Value;
  2960. }
  2961. // Reload data
  2962. Reload(newSelectedValue);
  2963. // Raise on after definition update event
  2964. if (OnAfterDefinitionUpdate != null)
  2965. {
  2966. OnAfterDefinitionUpdate(this, EventArgs.Empty);
  2967. }
  2968. // Commit the transaction
  2969. tr.Commit();
  2970. }
  2971. }
  2972. /// <summary>
  2973. /// Show javascript alert message.
  2974. /// </summary>
  2975. /// <param name="message">Message to show</param>
  2976. private void ShowMessage(string message)
  2977. {
  2978. ltlScript.Text = ScriptHelper.GetScript("alert(" + ScriptHelper.GetString(message) + ");");
  2979. }
  2980. /// <summary>
  2981. /// Called when source field selected index changed.
  2982. /// </summary>
  2983. protected void documentSource_OnSourceFieldChanged(object sender, EventArgs e)
  2984. {
  2985. if (mMode == FieldEditorModeEnum.ClassFormDefinition)
  2986. {
  2987. string errorMessage = null;
  2988. DataClassInfo dci = DataClassInfoProvider.GetDataClass(ClassName);
  2989. if (dci != null)
  2990. {
  2991. // Set document name source field
  2992. if (string.IsNullOrEmpty(documentSource.SourceFieldValue))
  2993. {
  2994. // Use extra field
  2995. dci.ClassNodeNameSource = "";
  2996. }
  2997. else
  2998. {
  2999. // Use specified name
  3000. dci.ClassNodeNameSource = documentSource.SourceFieldValue;
  3001. }
  3002. // Set document alias source field
  3003. if (string.IsNullOrEmpty(documentSource.SourceAliasFieldValue))
  3004. {
  3005. // Use extra field
  3006. dci.ClassNodeAliasSource = "";
  3007. }
  3008. else
  3009. {
  3010. // Use specified name
  3011. dci.ClassNodeAliasSource = documentSource.SourceAliasFieldValue;
  3012. }
  3013. try
  3014. {
  3015. using (CMSActionContext context = new CMSActionContext())
  3016. {
  3017. // Do not log synchronization for BizForm
  3018. if (mMode == FieldEditorModeEnum.BizFormDefinition)
  3019. {
  3020. context.DisableLogging();
  3021. }
  3022. DataClassInfoProvider.SetDataClass(dci);
  3023. }
  3024. ShowConfirmation(GetString("TemplateDesigner.SourceFieldSaved"));
  3025. WebControl control = sender as WebControl;
  3026. if (control != null && (control.ID == "drpSourceAliasField"))
  3027. {
  3028. ShowConfirmation(GetString("TemplateDesigner.SourceAliasFieldSaved"));
  3029. }
  3030. }
  3031. catch (Exception ex)
  3032. {
  3033. errorMessage = ex.Message;
  3034. }
  3035. }
  3036. else
  3037. {
  3038. errorMessage = GetString("FieldEditor.ClassNotFound");
  3039. }
  3040. if (!string.IsNullOrEmpty(errorMessage))
  3041. {
  3042. ShowError("[ FieldEditor.drpSourceField_SelectedIndexChanged() ]: " + errorMessage);
  3043. }
  3044. }
  3045. }
  3046. /// <summary>
  3047. /// Validates form and returns validation error message.
  3048. /// </summary>
  3049. private string ValidateForm()
  3050. {
  3051. const string INVALIDCHARACTERS = @".,;'`:/\*|?""&%$!-+=()[]{} ";
  3052. string attributeName = null;
  3053. string fieldCaption = null;
  3054. string control = null;
  3055. bool MinAndMaxLengthInCorrectFormat = true;
  3056. bool MinAndMaxValueInCorrectFormat = true;
  3057. if (SelectedMode == FieldEditorSelectedModeEnum.Simplified)
  3058. {
  3059. attributeName = simpleMode.AttributeName;
  3060. fieldCaption = simpleMode.FieldCaption;
  3061. control = simpleMode.FieldType;
  3062. }
  3063. else
  3064. {
  3065. attributeName = databaseConfiguration.GetAttributeName();
  3066. fieldCaption = fieldAppearance.FieldCaption;
  3067. control = fieldAppearance.FieldType;
  3068. }
  3069. // Check if attribute name isn't empty
  3070. if (string.IsNullOrEmpty(attributeName))
  3071. {
  3072. return GetString("TemplateDesigner.ErrorEmptyAttributeName") + " ";
  3073. }
  3074. // Check if attribute name starts with a letter or '_' (if it is an identifier)
  3075. if (!ValidationHelper.IsIdentifier(attributeName))
  3076. {
  3077. return GetString("TemplateDesigner.ErrorAttributeNameDoesNotStartWithLetter") + " ";
  3078. }
  3079. // Check attribute name for invalid characters
  3080. for (int i = 0; i <= INVALIDCHARACTERS.Length - 1; i++)
  3081. {
  3082. if (attributeName.Contains(Convert.ToString(INVALIDCHARACTERS[i])))
  3083. {
  3084. return GetString("TemplateDesigner.ErrorInvalidCharacter") + INVALIDCHARACTERS + ". ";
  3085. }
  3086. }
  3087. if (chkDisplayInForm.Checked)
  3088. {
  3089. // Check if field caption is entered
  3090. if (string.IsNullOrEmpty(fieldCaption))
  3091. {
  3092. return GetString("TemplateDesigner.ErrorEmptyFieldCaption") + " ";
  3093. }
  3094. // Check if control is selected
  3095. if (String.IsNullOrEmpty(control))
  3096. {
  3097. return GetString("fieldeditor.selectformcontrol");
  3098. }
  3099. }
  3100. // Validation of the advanced mode controls
  3101. if (SelectedMode == FieldEditorSelectedModeEnum.Advanced)
  3102. {
  3103. // Check attribute size value
  3104. if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.TEXT)
  3105. {
  3106. string attSize = databaseConfiguration.AttributeSize;
  3107. // Attribute size is empty -> error
  3108. if (string.IsNullOrEmpty(attSize))
  3109. {
  3110. return GetString("TemplateDesigner.ErrorEmptyAttributeSize") + " ";
  3111. }
  3112. int attributeSize = ValidationHelper.GetInteger(attSize, 0);
  3113. // Attribute size is invalid -> error
  3114. if ((attributeSize <= 0) || (attributeSize > ValidationHelper.MAX_NVARCHAR_LENGTH))
  3115. {
  3116. return GetString("TemplateDesigner.ErrorInvalidAttributeSize") + " ";
  3117. }
  3118. if ((databaseConfiguration.DefaultValueText.Length > attributeSize) ||
  3119. (databaseConfiguration.LargeDefaultValueText.Length > attributeSize))
  3120. {
  3121. return GetString("TemplateDesigner.ErrorDefaultValueSize") + " ";
  3122. }
  3123. }
  3124. // Check min length value
  3125. string minLength = validationSettings.MinLengthText;
  3126. if (!string.IsNullOrEmpty(minLength))
  3127. {
  3128. if ((!ValidationHelper.IsInteger(minLength)) ||
  3129. ((ValidationHelper.IsInteger(minLength)) && (Convert.ToInt32(minLength) < 0)))
  3130. {
  3131. MinAndMaxLengthInCorrectFormat = false;
  3132. return GetString("TemplateDesigner.ErrorMinLengthNotInteger") + " ";
  3133. }
  3134. }
  3135. // Check max length value
  3136. string maxLength = validationSettings.MaxLengthText;
  3137. if (!string.IsNullOrEmpty(maxLength))
  3138. {
  3139. if ((!ValidationHelper.IsInteger(maxLength)) ||
  3140. ((ValidationHelper.IsInteger(maxLength)) && (Convert.ToInt32(maxLength) < 0)))
  3141. {
  3142. MinAndMaxLengthInCorrectFormat = false;
  3143. return GetString("TemplateDesigner.ErrorMaxLengthNotInteger") + " ";
  3144. }
  3145. }
  3146. // Min and max length are specified and in correct format -> check if min length is less than max length
  3147. if ((!string.IsNullOrEmpty(minLength)) && (!string.IsNullOrEmpty(maxLength)) && (MinAndMaxLengthInCorrectFormat))
  3148. {
  3149. if ((Convert.ToInt32(minLength)) > (Convert.ToInt32(maxLength)))
  3150. {
  3151. return GetString("TemplateDesigner.ErrorMinLengthGreater") + " ";
  3152. }
  3153. }
  3154. if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.DOUBLE)
  3155. {
  3156. string strMinValue = validationSettings.MinValueText;
  3157. string strMaxValue = validationSettings.MaxValueText;
  3158. double minValue = 0.0;
  3159. double maxValue = 0.0;
  3160. // Check min value
  3161. if (!string.IsNullOrEmpty(strMinValue))
  3162. {
  3163. minValue = ValidationHelper.GetDouble(strMinValue, Double.NaN);
  3164. if (Double.IsNaN(minValue))
  3165. {
  3166. MinAndMaxValueInCorrectFormat = false;
  3167. return GetString("TemplateDesigner.ErrorMinValueNotDouble") + " ";
  3168. }
  3169. }
  3170. // Check max value
  3171. if (!string.IsNullOrEmpty(strMaxValue))
  3172. {
  3173. maxValue = ValidationHelper.GetDouble(strMaxValue, Double.NaN);
  3174. if (Double.IsNaN(maxValue))
  3175. {
  3176. MinAndMaxValueInCorrectFormat = false;
  3177. return GetString("TemplateDesigner.ErrorMaxValueNotDouble") + " ";
  3178. }
  3179. }
  3180. // Min and max value are specified and in correct format -> check if min value is less than max value
  3181. if ((!string.IsNullOrEmpty(strMinValue)) && (!string.IsNullOrEmpty(strMaxValue)) && (MinAndMaxValueInCorrectFormat))
  3182. {
  3183. if (minValue > maxValue)
  3184. {
  3185. return GetString("TemplateDesigner.ErrorMinValueGreater") + " ";
  3186. }
  3187. }
  3188. }
  3189. else if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.INTEGER)
  3190. {
  3191. // Check min value
  3192. if (!string.IsNullOrEmpty(validationSettings.MinValueText))
  3193. {
  3194. if (!ValidationHelper.IsInteger(validationSettings.MinValueText))
  3195. {
  3196. MinAndMaxValueInCorrectFormat = false;
  3197. return GetString("TemplateDesigner.ErrorMinValueNotInteger") + " ";
  3198. }
  3199. }
  3200. // Check max value
  3201. if (!string.IsNullOrEmpty(validationSettings.MaxValueText))
  3202. {
  3203. if (!ValidationHelper.IsInteger(validationSettings.MaxValueText))
  3204. {
  3205. MinAndMaxValueInCorrectFormat = false;
  3206. return GetString("TemplateDesigner.ErrorMaxValueNotInteger") + " ";
  3207. }
  3208. }
  3209. // Min and max value are specified and in correct format -> check if min value is less than max value
  3210. if ((!string.IsNullOrEmpty(validationSettings.MinValueText)) && (!string.IsNullOrEmpty(validationSettings.MaxValueText)) && (MinAndMaxValueInCorrectFormat))
  3211. {
  3212. if ((Convert.ToInt32(validationSettings.MinValueText)) > (Convert.ToInt32(validationSettings.MaxValueText)))
  3213. {
  3214. return GetString("TemplateDesigner.ErrorMinValueGreater") + " ";
  3215. }
  3216. }
  3217. }
  3218. else if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.LONGINTEGER)
  3219. {
  3220. string minValue = validationSettings.MinValueText;
  3221. string maxValue = validationSettings.MaxValueText;
  3222. // Check min value
  3223. if (!string.IsNullOrEmpty(minValue))
  3224. {
  3225. if (!ValidationHelper.IsLong(minValue))
  3226. {
  3227. MinAndMaxValueInCorrectFormat = false;
  3228. return GetString("TemplateDesigner.ErrorMinValueNotLongInteger") + " ";
  3229. }
  3230. }
  3231. // Check max value
  3232. if (!string.IsNullOrEmpty(maxValue))
  3233. {
  3234. if (!ValidationHelper.IsLong(maxValue))
  3235. {
  3236. MinAndMaxValueInCorrectFormat = false;
  3237. return GetString("TemplateDesigner.ErrorMaxValueNotLongInteger") + " ";
  3238. }
  3239. }
  3240. // Min and max value are specified and in correct format -> check if min value is less than max value
  3241. if ((!string.IsNullOrEmpty(minValue)) && (!string.IsNullOrEmpty(maxValue)) && (MinAndMaxValueInCorrectFormat))
  3242. {
  3243. if ((Convert.ToInt64(minValue)) > (Convert.ToInt64(maxValue)))
  3244. {
  3245. return GetString("TemplateDesigner.ErrorMinValueGreater") + " ";
  3246. }
  3247. }
  3248. }
  3249. }
  3250. // Validate simple mode
  3251. else
  3252. {
  3253. // Check that textbox field has some minimum length set
  3254. if (simpleMode.AttributeType == FormFieldDataTypeCode.TEXT)
  3255. {
  3256. if (simpleMode.AttributeSize <= 0 || simpleMode.AttributeSize > ValidationHelper.MAX_NVARCHAR_LENGTH)
  3257. {
  3258. return GetString("TemplateDesigner.ErrorInvalidTextBoxMaxLength");
  3259. }
  3260. ffi = fi.GetFormField(SelectedItemName);
  3261. if (simpleMode.GetDefaultValue(ffi).Length > simpleMode.AttributeSize)
  3262. {
  3263. return GetString("TemplateDesigner.ErrorDefaultValueSize");
  3264. }
  3265. }
  3266. }
  3267. return null;
  3268. }
  3269. /// <summary>
  3270. /// Validates basic forms for simple or advanced mode for generated properties.
  3271. /// </summary>
  3272. /// <returns>TRUE if form is valid. FALSE is form is invalid</returns>
  3273. private bool ValidateControlForms()
  3274. {
  3275. if (SelectedMode == FieldEditorSelectedModeEnum.Simplified)
  3276. {
  3277. return simpleMode.SaveData();
  3278. }
  3279. else if (chkDisplayInForm.Checked)
  3280. {
  3281. return controlSettings.SaveData();
  3282. }
  3283. return true;
  3284. }
  3285. /// <summary>
  3286. /// Returns FormFieldInfo structure with form data.
  3287. /// </summary>
  3288. /// <param name="ffiOriginal">Original field info</param>
  3289. private FormFieldInfo FillFormFieldInfoStructure(FormFieldInfo ffiOriginal)
  3290. {
  3291. // Field info with updated information
  3292. FormFieldInfo ffi = new FormFieldInfo();
  3293. // Ensure field GUID
  3294. if (ffiOriginal != null)
  3295. {
  3296. ffi.Guid = ffiOriginal.Guid;
  3297. }
  3298. if (ffi.Guid == Guid.Empty)
  3299. {
  3300. ffi.Guid = Guid.NewGuid();
  3301. }
  3302. // Load FormFieldInfo with data from simple control
  3303. if (SelectedMode == FieldEditorSelectedModeEnum.Simplified)
  3304. {
  3305. string selectedType = simpleMode.FieldType;
  3306. // Part of database section
  3307. ffi.Name = simpleMode.AttributeName;
  3308. ffi.Caption = simpleMode.FieldCaption;
  3309. ffi.AllowEmpty = simpleMode.AllowEmpty;
  3310. ffi.System = simpleMode.IsSystem;
  3311. ffi.DefaultValue = simpleMode.GetDefaultValue(ffiOriginal);
  3312. ffi.IsMacro = EnableMacrosForDefaultValue && ValidationHelper.IsMacro(ffi.DefaultValue);
  3313. // Get control data type
  3314. string[] controlDefaultDataType = FormUserControlInfoProvider.GetUserControlDefaultDataType(selectedType);
  3315. ffi.DataType = FormHelper.GetFormFieldDataType(controlDefaultDataType[0]);
  3316. if (simpleMode.AttributeType == "text")
  3317. {
  3318. ffi.Size = simpleMode.AttributeSize;
  3319. }
  3320. else
  3321. {
  3322. ffi.Size = ValidationHelper.GetInteger(controlDefaultDataType[1], 0);
  3323. }
  3324. // Remove control prefix if exists
  3325. if (selectedType.Contains(controlPrefix))
  3326. {
  3327. selectedType = selectedType.Substring(controlPrefix.Length);
  3328. }
  3329. // Store field type
  3330. ffi.Settings.Add("controlname", selectedType);
  3331. if ((simpleMode.FormData != null) && (simpleMode.FormData.ItemArray.Length > 0))
  3332. {
  3333. foreach (DataColumn column in simpleMode.FormData.Table.Columns)
  3334. {
  3335. ffi.Settings[column.ColumnName] = simpleMode.FormData.Table.Rows[0][column.Caption];
  3336. }
  3337. }
  3338. if ((Mode == FieldEditorModeEnum.BizFormDefinition) || (DisplayedControls == FieldEditorControlsEnum.Bizforms))
  3339. {
  3340. ffi.PublicField = simpleMode.PublicField;
  3341. }
  3342. else
  3343. {
  3344. ffi.PublicField = false;
  3345. }
  3346. ffi.Visible = true;
  3347. // Existing field -> set advanced settings to original settings
  3348. if (ffiOriginal != null)
  3349. {
  3350. ffi.DataType = ffiOriginal.DataType;
  3351. ffi.Visible = ffiOriginal.Visible;
  3352. // Part of database section
  3353. ffi.Description = ffiOriginal.Description;
  3354. // Validation section
  3355. ffi.RegularExpression = ffiOriginal.RegularExpression;
  3356. ffi.MinStringLength = ffiOriginal.MinStringLength;
  3357. ffi.MaxStringLength = ffiOriginal.MaxStringLength;
  3358. ffi.MinValue = ffiOriginal.MinValue;
  3359. ffi.MaxValue = ffiOriginal.MaxValue;
  3360. ffi.MinDateTimeValue = ffiOriginal.MinDateTimeValue;
  3361. ffi.MaxDateTimeValue = ffiOriginal.MaxDateTimeValue;
  3362. ffi.ValidationErrorMessage = ffiOriginal.ValidationErrorMessage;
  3363. // Design section
  3364. ffi.CaptionStyle = ffiOriginal.CaptionStyle;
  3365. ffi.InputControlStyle = ffiOriginal.InputControlStyle;
  3366. ffi.ControlCssClass = ffiOriginal.ControlCssClass;
  3367. // Field advanced settings
  3368. ffi.VisibleMacro = ffiOriginal.VisibleMacro;
  3369. ffi.EnabledMacro = ffiOriginal.EnabledMacro;
  3370. ffi.HasDependingFields = ffiOriginal.HasDependingFields;
  3371. ffi.DependsOnAnotherField = ffiOriginal.DependsOnAnotherField;
  3372. }
  3373. }
  3374. // Load FormFieldInfo with data from advanced control
  3375. else
  3376. {
  3377. string selectedType = fieldAppearance.FieldType;
  3378. string attributeType = databaseConfiguration.AttributeType;
  3379. // Part of database section
  3380. ffi.Name = databaseConfiguration.GetAttributeName();
  3381. ffi.Caption = fieldAppearance.FieldCaption;
  3382. ffi.AllowEmpty = databaseConfiguration.AllowEmpty;
  3383. ffi.System = databaseConfiguration.IsSystem;
  3384. ffi.TranslateField = databaseConfiguration.TranslateField;
  3385. ffi.DefaultValue = GetDefaultValue();
  3386. ffi.IsMacro = EnableMacrosForDefaultValue && ValidationHelper.IsMacro(ffi.DefaultValue);
  3387. // Save user visibility
  3388. ffi.AllowUserToChangeVisibility = fieldAppearance.ChangeVisibility;
  3389. ffi.Visibility = fieldAppearance.VisibilityValue;
  3390. ffi.VisibilityControl = fieldAppearance.VisibilityDDL;
  3391. ffi.VisibleMacro = fieldAdvancedSettings.VisibleMacro;
  3392. ffi.EnabledMacro = fieldAdvancedSettings.EnabledMacro;
  3393. ffi.DisplayInSimpleMode = fieldAdvancedSettings.DisplayInSimpleMode;
  3394. if (ShowInheritanceSettings)
  3395. {
  3396. ffi.Inheritable = fieldAppearance.ControlInheritable;
  3397. }
  3398. if ((Mode == FieldEditorModeEnum.BizFormDefinition) ||
  3399. DisplayedControls == FieldEditorControlsEnum.Bizforms)
  3400. {
  3401. ffi.PublicField = fieldAppearance.PublicField;
  3402. }
  3403. else
  3404. {
  3405. ffi.PublicField = false;
  3406. }
  3407. // Remove control prefix if exists
  3408. if (selectedType.Contains(controlPrefix))
  3409. {
  3410. selectedType = selectedType.Substring(controlPrefix.Length);
  3411. }
  3412. // Store field type
  3413. ffi.Settings.Add("controlname", selectedType);
  3414. // Store settings
  3415. if ((controlSettings.FormData != null) && (controlSettings.FormData.ItemArray.Length > 0))
  3416. {
  3417. foreach (DataColumn column in controlSettings.FormData.Table.Columns)
  3418. {
  3419. ffi.Settings[column.ColumnName] = controlSettings.FormData.Table.Rows[0][column.Caption];
  3420. }
  3421. }
  3422. // Determine if it is external column
  3423. ffi.External = IsSystemFieldSelected || (ffiOriginal != null ? ffiOriginal.External : false);
  3424. if (((Mode == FieldEditorModeEnum.BizFormDefinition) || (Mode == FieldEditorModeEnum.SystemTable))
  3425. && (databaseConfiguration.AttributeType == FormFieldDataTypeCode.FILE))
  3426. {
  3427. // Allow to save <guid>.<extension>
  3428. ffi.DataType = FormFieldDataTypeEnum.Text;
  3429. ffi.Size = 500;
  3430. }
  3431. else if (databaseConfiguration.AttributeType == FormFieldDataTypeCode.DOCUMENT_ATTACHMENTS)
  3432. {
  3433. ffi.DataType = FormFieldDataTypeEnum.DocumentAttachments;
  3434. ffi.Size = 200;
  3435. }
  3436. else
  3437. {
  3438. ffi.DataType = FormHelper.GetFormFieldDataType(databaseConfiguration.AttributeType);
  3439. ffi.Size = ValidationHelper.GetInteger(databaseConfiguration.AttributeSize, 0);
  3440. }
  3441. // Part of database section
  3442. ffi.Visible = chkDisplayInForm.Checked;
  3443. ffi.Description = fieldAppearance.Description;
  3444. ffi.SpellCheck = validationSettings.SpellCheck;
  3445. // Control dependencies
  3446. ffi.HasDependingFields = fieldAdvancedSettings.HasDependingFields;
  3447. ffi.DependsOnAnotherField = fieldAdvancedSettings.DependsOnAnotherField;
  3448. ffi.DisplayIn = String.Empty;
  3449. if (chkDisplayInDashBoard.Checked)
  3450. {
  3451. ffi.DisplayIn = DisplayIn;
  3452. }
  3453. // Validation section
  3454. ffi.RegularExpression = validationSettings.RegularExpression;
  3455. ffi.MinStringLength = (string.IsNullOrEmpty(validationSettings.MinLengthText)) ? -1 : Convert.ToInt32(validationSettings.MinLengthText);
  3456. ffi.MaxStringLength = (string.IsNullOrEmpty(validationSettings.MaxLengthText)) ? -1 : Convert.ToInt32(validationSettings.MaxLengthText);
  3457. ffi.MinValue = validationSettings.MinValueText;
  3458. ffi.MaxValue = validationSettings.MaxValueText;
  3459. ffi.MinDateTimeValue = validationSettings.DateFrom;
  3460. ffi.MaxDateTimeValue = validationSettings.DateTo;
  3461. ffi.ValidationErrorMessage = validationSettings.ErrorMessage;
  3462. // Design section
  3463. ffi.CaptionStyle = cssSettings.CaptionStyle;
  3464. ffi.InputControlStyle = cssSettings.InputStyle;
  3465. ffi.ControlCssClass = cssSettings.ControlCssClass;
  3466. }
  3467. ffi.FieldType = FormFieldControlTypeEnum.CustomUserControl;
  3468. return ffi;
  3469. }
  3470. /// <summary>
  3471. /// Returns default value according to attribute type.
  3472. /// </summary>
  3473. protected string GetDefaultValue()
  3474. {
  3475. string defaultValue = null;
  3476. switch (SelectedMode)
  3477. {
  3478. // Advanced mode
  3479. case FieldEditorSelectedModeEnum.Advanced:
  3480. switch (databaseConfiguration.AttributeType)
  3481. {
  3482. case FormFieldDataTypeCode.DATETIME:
  3483. string datetimevalue = databaseConfiguration.DefaultDateTime;
  3484. if (datetimevalue.ToLowerCSafe() == DateTimePicker.DATE_TODAY.ToLowerCSafe())
  3485. {
  3486. defaultValue = DateTimePicker.DATE_TODAY;
  3487. }
  3488. else if (datetimevalue.ToLowerCSafe() == DateTimePicker.TIME_NOW.ToLowerCSafe())
  3489. {
  3490. defaultValue = DateTimePicker.TIME_NOW;
  3491. }
  3492. else if (ValidationHelper.IsMacro(datetimevalue))
  3493. {
  3494. defaultValue = datetimevalue;
  3495. }
  3496. else if (ValidationHelper.GetDateTime(datetimevalue, DateTime.MinValue) == DateTimePicker.NOT_SELECTED)
  3497. {
  3498. defaultValue = "";
  3499. }
  3500. else
  3501. {
  3502. defaultValue = datetimevalue;
  3503. }
  3504. break;
  3505. case FormFieldDataTypeCode.BOOLEAN:
  3506. defaultValue = Convert.ToString(databaseConfiguration.DefaultBoolValue).ToLowerCSafe();
  3507. break;
  3508. case FormFieldDataTypeCode.LONGTEXT:
  3509. defaultValue = databaseConfiguration.LargeDefaultValueText;
  3510. break;
  3511. case FormFieldControlTypeCode.DOCUMENT_ATTACHMENTS:
  3512. string defValue = databaseConfiguration.DefaultValueText;
  3513. defaultValue = (string.IsNullOrEmpty(defValue)) ? null : defValue;
  3514. break;
  3515. default:
  3516. defaultValue = databaseConfiguration.DefaultValueText;
  3517. break;
  3518. }
  3519. break;
  3520. }
  3521. return defaultValue;
  3522. }
  3523. /// <summary>
  3524. /// Displays selected tab content.
  3525. /// </summary>
  3526. protected void DisplaySelectedTabContent()
  3527. {
  3528. switch (SelectedMode)
  3529. {
  3530. case FieldEditorSelectedModeEnum.Simplified:
  3531. plcAdvanced.Visible = false;
  3532. plcSimple.Visible = true;
  3533. plcCategory.Visible = false;
  3534. break;
  3535. case FieldEditorSelectedModeEnum.Advanced:
  3536. plcAdvanced.Visible = true;
  3537. plcSimple.Visible = false;
  3538. plcCategory.Visible = false;
  3539. break;
  3540. }
  3541. }
  3542. /// <summary>
  3543. /// Switches field editor to simple mode.
  3544. /// </summary>
  3545. private void SwitchToSimpleMode()
  3546. {
  3547. SelectedMode = FieldEditorSelectedModeEnum.Simplified;
  3548. btnAdvanced.Visible = (SelectedMode == FieldEditorSelectedModeEnum.Simplified);
  3549. btnSimplified.Visible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified);
  3550. Reload(lstAttributes.SelectedValue);
  3551. }
  3552. /// <summary>
  3553. /// Switches field editor to advanced mode.
  3554. /// </summary>
  3555. private void SwitchToAdvancedMode()
  3556. {
  3557. SelectedMode = FieldEditorSelectedModeEnum.Advanced;
  3558. btnAdvanced.Visible = (SelectedMode == FieldEditorSelectedModeEnum.Simplified);
  3559. btnSimplified.Visible = (SelectedMode != FieldEditorSelectedModeEnum.Simplified);
  3560. Reload(lstAttributes.SelectedValue);
  3561. LoadControlSettings(null, true);
  3562. }
  3563. /// <summary>
  3564. /// Returns default selected mode.
  3565. /// </summary>
  3566. private FieldEditorSelectedModeEnum GetDefaultSelectedMode()
  3567. {
  3568. if (EnableSimplifiedMode)
  3569. {
  3570. return FieldEditorSelectedModeEnum.Simplified;
  3571. }
  3572. else
  3573. {
  3574. return FieldEditorSelectedModeEnum.Advanced;
  3575. }
  3576. }
  3577. /// <summary>
  3578. /// Hides all editing panels.
  3579. /// </summary>
  3580. protected void HideAllPanels()
  3581. {
  3582. plcCategory.Visible = false;
  3583. plcSimple.Visible = false;
  3584. plcAdvanced.Visible = false;
  3585. }
  3586. /// <summary>
  3587. /// Adds new form item (field or category) to the form definition.
  3588. /// </summary>
  3589. /// <param name="formItem">Form item to add</param>
  3590. protected void InsertFormItem(IFormItem formItem)
  3591. {
  3592. // Set new item preffix
  3593. string newItemPreffix = (formItem is FormFieldInfo) ? newFieldPreffix : newCategPreffix;
  3594. ListItem newItem = lstAttributes.Items.FindByValue(newItemPreffix);
  3595. int newItemIndex = lstAttributes.Items.IndexOf(newItem);
  3596. if ((newItemIndex > 0) && (lstAttributes.Items[newItemIndex - 1] != null))
  3597. {
  3598. // Add new item at the specified position
  3599. fi.AddFormItem(formItem, newItemIndex);
  3600. }
  3601. else
  3602. {
  3603. if (formItem is FormFieldInfo)
  3604. {
  3605. // Add new field at the end of the collection
  3606. fi.AddFormField((FormFieldInfo)formItem);
  3607. }
  3608. else if (formItem is FormCategoryInfo)
  3609. {
  3610. // Add new category at the end of the collection
  3611. fi.AddFormCategory((FormCategoryInfo)formItem);
  3612. }
  3613. }
  3614. }
  3615. /// <summary>
  3616. /// Returns FormInfo for given form user control.
  3617. /// </summary>
  3618. /// <param name="controlName">Code name of form control</param>
  3619. /// <returns>Form info</returns>
  3620. private FormInfo GetUserControlSettings(string controlName)
  3621. {
  3622. FormUserControlInfo control = FormUserControlInfoProvider.GetFormUserControlInfo(controlName);
  3623. if (control != null)
  3624. {
  3625. FormInfo fi = null;
  3626. if (control.UserControlParentID > 0)
  3627. {
  3628. // Get merged form info from inherited and parent form control
  3629. fi = FormHelper.GetFormControlParameters(controlName, control.MergedFormInfo, true);
  3630. }
  3631. else
  3632. {
  3633. // Get only current form control parameters
  3634. fi = FormHelper.GetFormControlParameters(controlName, control.UserControlParameters, true);
  3635. }
  3636. return fi;
  3637. }
  3638. return null;
  3639. }
  3640. /// <summary>
  3641. /// Clears hashtables.
  3642. /// </summary>
  3643. private void ClearHashtables()
  3644. {
  3645. // Clear the object type hashtable
  3646. ProviderStringDictionary.ReloadDictionaries(ClassName, true);
  3647. // Clear the classes hashtable
  3648. ProviderStringDictionary.ReloadDictionaries("cms.class", true);
  3649. // Clear class structures
  3650. ClassStructureInfo.Remove(ClassName, true);
  3651. // Clear data items type infos
  3652. switch (Mode)
  3653. {
  3654. case FieldEditorModeEnum.CustomTable:
  3655. CMSObjectHelper.RemoveReadOnlyObjects(CustomTableItemProvider.GetObjectType(ClassName), true);
  3656. CustomTableItemProvider.Remove(ClassName, true);
  3657. break;
  3658. case FieldEditorModeEnum.BizFormDefinition:
  3659. CMSObjectHelper.RemoveReadOnlyObjects(BizFormItemProvider.GetObjectType(ClassName), true);
  3660. BizFormItemProvider.Remove(ClassName, true);
  3661. break;
  3662. }
  3663. // Get lower case class name
  3664. string lowerClassName = ValidationHelper.GetString(ClassName, String.Empty).ToLowerCSafe();
  3665. // Invalidate objects based on object type
  3666. TypeInfo ti = TypeInfo.GetTypeInfo(ClassName);
  3667. if (ti != null)
  3668. {
  3669. ti.InvalidateColumnNames();
  3670. ti.InvalidateAllObjects();
  3671. // If edited class is user settings, clear the user structure info which contains the user settings columns
  3672. if ((Mode == FieldEditorModeEnum.SystemTable) && mClassName.EqualsCSafe(SiteObjectType.USERSETTINGS, StringComparison.InvariantCultureIgnoreCase))
  3673. {
  3674. TypeInfo userTypeInfo = UserInfo.TYPEINFO;
  3675. userTypeInfo.InvalidateColumnNames();
  3676. userTypeInfo.InvalidateAllObjects();
  3677. }
  3678. }
  3679. }
  3680. /// <summary>
  3681. /// Raises OnFieldCreated event.
  3682. /// </summary>
  3683. /// <param name="newField">Newly created field</param>
  3684. protected void RaiseOnFieldCreated(FormFieldInfo newField)
  3685. {
  3686. if (OnFieldCreated != null)
  3687. {
  3688. OnFieldCreated(this, newField);
  3689. }
  3690. }
  3691. #endregion
  3692. #region "Support for system fields"
  3693. /// <summary>
  3694. /// Group changed event handler.
  3695. /// </summary>
  3696. private void databaseConfiguration_DropChanged(object sender, EventArgs e)
  3697. {
  3698. LoadSystemField();
  3699. }
  3700. /// <summary>
  3701. /// Database attribute has changed.
  3702. /// </summary>
  3703. private void databaseConfiguration_AttributeChanged(object sender, EventArgs e)
  3704. {
  3705. databaseConfiguration.Mode = Mode;
  3706. databaseConfiguration.IsAlternativeForm = IsAlternativeForm;
  3707. databaseConfiguration.EnableOrDisableAttributeSize();
  3708. fieldAppearance.Mode = Mode;
  3709. fieldAppearance.ClassName = ClassName;
  3710. fieldAppearance.AttributeType = databaseConfiguration.AttributeType;
  3711. fieldAppearance.FieldType = FormHelper.GetFormFieldDefaultControlType(databaseConfiguration.AttributeType);
  3712. fieldAppearance.LoadFieldTypes(IsPrimaryField);
  3713. ShowAdvancedOptions();
  3714. LoadValidationSettings();
  3715. databaseConfiguration.ShowDefaultControl();
  3716. LoadControlSettings(null, false);
  3717. }
  3718. /// <summary>
  3719. /// Field control changed event handler.
  3720. /// </summary>
  3721. private void control_FieldSelected(object sender, EventArgs e)
  3722. {
  3723. LoadControlSettings(null, true);
  3724. LoadValidationSettings();
  3725. }
  3726. /// <summary>
  3727. /// SimpleMode control request FormFieldInfo.
  3728. /// </summary>
  3729. private void simpleMode_OnGetFieldInfo(object sender, EventArgs e)
  3730. {
  3731. if (ffi != null)
  3732. {
  3733. simpleMode.FieldInfo = ffi;
  3734. }
  3735. else
  3736. {
  3737. LoadFormDefinition();
  3738. simpleMode.FieldInfo = fi.GetFormField(SelectedItemName);
  3739. }
  3740. }
  3741. /// <summary>
  3742. /// Loads control with new FormInfo data.
  3743. /// </summary>
  3744. /// <param name="selectedFieldType">Selected field</param>
  3745. /// <param name="defaultValues">Indicates if simple field editor should load default values for selected field</param>
  3746. private void LoadControlSettings(string selectedFieldType, bool defaultValues)
  3747. {
  3748. // Reload control for simplified mode
  3749. if (SelectedMode == FieldEditorSelectedModeEnum.Simplified)
  3750. {
  3751. simpleMode.FieldInfo = ffi;
  3752. if (ffi != null)
  3753. {
  3754. simpleMode.Settings = ffi.Settings;
  3755. }
  3756. simpleMode.LoadControlSettings(selectedFieldType, defaultValues);
  3757. simpleMode.Mode = Mode;
  3758. simpleMode.ClassName = ClassName;
  3759. simpleMode.DisplayedControls = DisplayedControls;
  3760. simpleMode.SelectedItemType = SelectedItemType;
  3761. }
  3762. // Reload control for advanced mode
  3763. else
  3764. {
  3765. if (String.IsNullOrEmpty(selectedFieldType))
  3766. {
  3767. selectedFieldType = fieldAppearance.FieldType;
  3768. }
  3769. if (selectedFieldType.StartsWithCSafe(controlPrefix))
  3770. {
  3771. selectedFieldType = selectedFieldType.Substring(controlPrefix.Length);
  3772. }
  3773. controlSettings.FormInfo = GetUserControlSettings(selectedFieldType);
  3774. if (ffi != null)
  3775. {
  3776. controlSettings.Settings = ffi.Settings;
  3777. }
  3778. validationSettings.FieldType = selectedFieldType;
  3779. validationSettings.AttributeType = databaseConfiguration.AttributeType;
  3780. controlSettings.Reload(true);
  3781. }
  3782. }
  3783. /// <summary>
  3784. /// Loads system field either from database column data or from field XML definition.
  3785. /// </summary>
  3786. private void LoadSystemField()
  3787. {
  3788. string tableName = databaseConfiguration.GroupValue;
  3789. string columnName = databaseConfiguration.SystemValue;
  3790. if (SelectedItemName.ToLowerCSafe() != columnName.ToLowerCSafe())
  3791. {
  3792. DataClassInfo dci = DataClassInfoProvider.GetDataClass(mClassName);
  3793. // Get field info from database column
  3794. ffi = FormHelper.GetFormFieldInfo(dci, tableName, columnName);
  3795. }
  3796. else
  3797. {
  3798. // Get field info from XML definition
  3799. LoadFormDefinition();
  3800. ffi = fi.GetFormField(SelectedItemName);
  3801. }
  3802. LoadSelectedField(false);
  3803. }
  3804. /// <summary>
  3805. /// Loads the new column type and size.
  3806. /// </summary>
  3807. /// <param name="dataType">Data type</param>
  3808. /// <param name="newSize">New size</param>
  3809. /// <param name="newColumnType">New column type</param>
  3810. /// <param name="newColumnSize">New column size</param>
  3811. protected void LoadColumnTypeAndSize(FormFieldDataTypeEnum dataType, int newSize, ref string newColumnType, ref string newColumnSize)
  3812. {
  3813. switch (dataType)
  3814. {
  3815. case FormFieldDataTypeEnum.Integer:
  3816. newColumnType = SqlHelperClass.DATATYPE_INTEGER;
  3817. break;
  3818. case FormFieldDataTypeEnum.LongInteger:
  3819. newColumnType = SqlHelperClass.DATATYPE_LONG;
  3820. break;
  3821. case FormFieldDataTypeEnum.Decimal:
  3822. newColumnType = SqlHelperClass.DATATYPE_FLOAT;
  3823. break;
  3824. case FormFieldDataTypeEnum.Boolean:
  3825. newColumnType = SqlHelperClass.DATATYPE_BOOLEAN;
  3826. break;
  3827. case FormFieldDataTypeEnum.DateTime:
  3828. newColumnType = SqlHelperClass.DATATYPE_DATETIME;
  3829. break;
  3830. case FormFieldDataTypeEnum.LongText:
  3831. newColumnType = SqlHelperClass.DATATYPE_LONGTEXT;
  3832. break;
  3833. case FormFieldDataTypeEnum.File:
  3834. case FormFieldDataTypeEnum.GUID:
  3835. newColumnType = SqlHelperClass.DATATYPE_GUID;
  3836. break;
  3837. case FormFieldDataTypeEnum.Binary:
  3838. newColumnType = SqlHelperClass.DATATYPE_BINARY;
  3839. break;
  3840. default:
  3841. newColumnSize = Convert.ToString(newSize);
  3842. newColumnType = SqlHelperClass.DATATYPE_TEXT + "(" + newColumnSize + ")";
  3843. break;
  3844. }
  3845. }
  3846. #endregion
  3847. }