using System; using System.Data; using System.Collections; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using CMS.CMSHelper; using CMS.ExtendedControls; using CMS.FormControls; using CMS.FormEngine; using CMS.GlobalHelper; using CMS.SiteProvider; using CMS.DocumentEngine; using TreeNode = CMS.DocumentEngine.TreeNode; public partial class CMSModules_Content_FormControls_Documents_SelectDocument : FormEngineUserControl { #region "Variables" private bool mEnableSiteSelection = false; private DialogConfiguration mConfig = null; private TreeProvider mTreeProvider = null; #endregion #region "Private properties" /// /// Gets Value display name. /// public override string ValueDisplayName { get { if (FieldInfo.DataType == FormFieldDataTypeEnum.Text) { return txtName.Text; } return base.ValueDisplayName; } } /// /// Returns TreeProvider object. /// private TreeProvider TreeProvider { get { if (mTreeProvider == null) { mTreeProvider = new TreeProvider(CMSContext.CurrentUser); } return mTreeProvider; } } /// /// Gets the configuration for Copy and Move dialog. /// private DialogConfiguration Config { get { if (mConfig == null) { mConfig = new DialogConfiguration(); mConfig.HideLibraries = true; mConfig.HideAnchor = true; mConfig.HideAttachments = true; mConfig.HideContent = false; mConfig.HideEmail = true; mConfig.HideLibraries = true; mConfig.HideWeb = true; mConfig.EditorClientID = txtGuid.ClientID; mConfig.ContentSelectedSite = CMSContext.CurrentSiteName; mConfig.OutputFormat = OutputFormatEnum.Custom; mConfig.CustomFormatCode = "selectpath"; mConfig.SelectableContent = SelectableContentEnum.AllContent; } return mConfig; } } #endregion #region "Public properties" /// /// Gets or sets the enabled state of the control. /// public override bool Enabled { get { return base.Enabled; } set { base.Enabled = value; txtName.Enabled = value; btnSelect.Enabled = value; btnClear.Enabled = value; } } /// /// Gets or sets field value. /// public override object Value { get { return txtGuid.Text.Trim(); } set { if (value != null) { txtGuid.Text = value.ToString(); SetAliasPath(value, FieldIsInteger()); } } } /// /// Gets ClientID of the textbox with path. /// public override string ValueElementID { get { return txtName.ClientID; } } /// /// Determines whether to enable site selection or not. /// public bool EnableSiteSelection { get { return mEnableSiteSelection; } set { mEnableSiteSelection = value; Config.ContentSites = (value ? AvailableSitesEnum.All : AvailableSitesEnum.OnlyCurrentSite); } } /// /// Gets or sets the content starting path. /// public string ContentStartingPath { get { return Config.ContentStartingPath; } set { Config.ContentStartingPath = value; } } #endregion #region "Page events" protected void Page_Load(object sender, EventArgs e) { // Hide GUID textbox txtGuid.Attributes.Add("style", "display: none"); ScriptHelper.RegisterDialogScript(Page); var script = @" function DS_ClearDocument(txtClientID, hiddenClientId) { document.getElementById(txtClientID).value = ''; document.getElementById(hiddenClientId).value=''; DS_Changed(); } function DS_Changed() { if(window.Changed != null) { Changed(); } } "; ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "DS_Scripts", script, true); btnSelect.Text = GetString("general.select"); btnSelect.OnClientClick = "modalDialog('" + GetDialogUrl() + "','PathSelection', '90%', '85%'); return false;"; btnClear.Text = GetString("FormControls_SelectDocument.btnClear"); btnClear.OnClientClick = "DS_ClearDocument('" + txtName.ClientID + "', '" + txtGuid.ClientID + "'); return false;"; txtName.Attributes.Add("readonly", "readonly"); txtGuid.TextChanged += new EventHandler(txtGuid_TextChanged); } /// /// Determines whether parent form field is integer. /// /// TRUE if parent form field is integer. private bool FieldIsInteger() { return ((FieldInfo != null) && ((FieldInfo.DataType == FormFieldDataTypeEnum.Integer) || (FieldInfo.DataType == FormFieldDataTypeEnum.LongInteger))); } private void txtGuid_TextChanged(object sender, EventArgs e) { int nodeId = ValidationHelper.GetInteger(txtGuid.Text, 0); RegisterChangedScript(); if (FieldIsInteger()) { txtName.Text = GetNodeName(nodeId); return; } if (nodeId > 0) { TreeNode node = TreeProvider.SelectSingleNode(nodeId, TreeProvider.ALL_CULTURES, true); if (node != null) { string site = (node.NodeSiteID != CMSContext.CurrentSiteID ? ";" + node.NodeSiteName : ""); txtName.Text = node.NodeAliasPath; txtGuid.Text = node.NodeGUID.ToString() + site; } } } /// /// Registers script notifying page that change occurred. /// private void RegisterChangedScript() { ScriptHelper.RegisterStartupScript(Page, typeof(string), "DS_Changed", "DS_Changed();", true); } /// /// Clears selected value. /// public void Clear() { txtGuid.Text = String.Empty; txtName.Text = String.Empty; } #endregion #region "Private methods" private void SetAliasPath(object valueObj, bool isNodeId) { if (valueObj != null) { if (!isNodeId) { string[] split = valueObj.ToString().Split(';'); string siteName = null; // Check if site name is presented in value if (split.Length > 1) { siteName = split[1]; } else { if ((Form != null) && (Form.EditedObject != null)) { TreeNode editedNode = Form.EditedObject as TreeNode; if (editedNode != null) { int linkedSiteId = editedNode.OriginalNodeSiteID; if ((linkedSiteId > 0) && (linkedSiteId != CMSContext.CurrentSiteID)) { siteName = SiteInfoProvider.GetSiteName(linkedSiteId); } } } } if (ValidationHelper.GetGuid(split[0], Guid.Empty) != Guid.Empty) { txtName.Text = GetNodeName(split[0], siteName); } } else { txtName.Text = GetNodeName(ValidationHelper.GetInteger(valueObj, 0)); } } } /// /// Returns Correct URL of the copy or move dialog. /// private string GetDialogUrl() { string url = CMSDialogHelper.GetDialogUrl(Config, IsLiveSite, false, null, false); url = URLHelper.RemoveParameterFromUrl(url, "hash"); url = URLHelper.AddParameterToUrl(url, "selectionmode", "single"); url = URLHelper.AddParameterToUrl(url, "hash", QueryHelper.GetHash(url)); url = URLHelper.EncodeQueryString(url); return url; } /// /// Gets node name from guid. /// /// Guid object /// Site name private string GetNodeName(string objGuid, string siteName) { Guid nodeGuid = ValidationHelper.GetGuid(objGuid, Guid.Empty); if (nodeGuid != Guid.Empty) { if (String.IsNullOrEmpty(siteName)) { siteName = CMSContext.CurrentSiteName; } TreeNode node = TreeProvider.SelectSingleNode(nodeGuid, TreeProvider.ALL_CULTURES, siteName); if (node != null) { return node.NodeAliasPath; } } return ""; } /// /// Gets node name from node ID. /// /// Node ID private string GetNodeName(int nodeId) { if (nodeId > 0) { TreeNode node = TreeProvider.SelectSingleNode(nodeId, TreeProvider.ALL_CULTURES, true); if (node != null) { return node.NodeAliasPath; } } return ""; } /// /// Returns WHERE condition for selected form. /// public override string GetWhereCondition() { // Return correct WHERE condition for integer if none value is selected if ((FieldInfo != null) && ((FieldInfo.DataType == FormFieldDataTypeEnum.Integer) || (FieldInfo.DataType == FormFieldDataTypeEnum.LongInteger))) { int id = ValidationHelper.GetInteger(Value, 0); if (id > 0) { return base.GetWhereCondition(); } } return null; } #endregion }