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
}