using System;
using System.Configuration;
using System.Web.UI;
using System.Web.UI.WebControls;
using AjaxControlToolkit;
using umbraco.cms.businesslogic;
using umbraco.interfaces;
namespace umbraco.editorControls.ultimatepicker
{
[ValidationProperty("IsValid")]
public class ultimatePickerDataEditor : UpdatePanel, IDataEditor
{
private IData _data;
string _configuration;
private string[] config;
private string controlType;
private string[] dataValues;
private TextBox childtxt;
private DropDownList dropdownlistNodes;
private CheckBoxList checkboxlistNodes;
private RadioButtonList radiobuttonlistNodes;
private ListBox listboxNodes;
private Button clearRadiobuttonlist;
private CheckBox clearRadiobuttons;
public ultimatePickerDataEditor(umbraco.interfaces.IData Data, string Configuration)
{
_data = Data;
_configuration = Configuration;
config = _configuration.Split("|".ToCharArray());
controlType = config[0];
RenderMode = UpdatePanelRenderMode.Inline;
}
public virtual bool TreatAsRichTextEditor
{
get { return false; }
}
public bool ShowLabel
{
get { return true; }
}
///
/// Internal logic for validation controls to detect whether or not it's valid (has to be public though)
///
/// Am I valid?
public string IsValid
{
get
{
switch (controlType.ToLower())
{
case "autocomplete":
if (childtxt.Text.Contains("|"))
{
return childtxt.Text;
}
break;
case "checkboxlist":
foreach (ListItem item in checkboxlistNodes.Items)
{
if (item.Selected)
{
return "valid";
}
}
break;
case "dropdownlist":
return dropdownlistNodes.SelectedValue;
break;
case "listbox":
foreach (ListItem item in listboxNodes.Items)
{
if (item.Selected)
{
return "valid";
}
}
break;
case "radiobuttonlist":
foreach (ListItem item in radiobuttonlistNodes.Items)
{
if (item.Selected)
{
return "valid";
}
}
break;
}
return "";
}
}
public Control Editor { get { return this; } }
public void Save()
{
string dataToSave = string.Empty;
switch (controlType)
{
case "AutoComplete":
if (childtxt.Text.Contains("|"))
{
dataToSave = childtxt.Text.Split("|".ToCharArray())[1];
}
break;
case "auto-suggest":
goto case "AutoComplete";
case "CheckBoxList":
foreach (ListItem item in checkboxlistNodes.Items)
{
if (item.Selected)
{
dataToSave += item.Value + ",";
}
}
if (dataToSave.Length > 0)
{
dataToSave = dataToSave.Substring(0, dataToSave.Length - 1);
}
break;
case "checkbox":
goto case "CheckBoxList";
case "DropDownList":
dataToSave = dropdownlistNodes.SelectedValue;
break;
case "dropdown":
goto case "DropDownList";
case "ListBox":
dataToSave = string.Empty;
foreach (ListItem item in listboxNodes.Items)
{
if (item.Selected)
{
dataToSave += item.Value + ",";
}
}
if (dataToSave.Length > 0)
{
dataToSave = dataToSave.Substring(0, dataToSave.Length - 1);
}
break;
case "listbox":
goto case "ListBox";
case "RadioButtonList":
dataToSave = string.Empty;
if (!clearRadiobuttons.Checked)
{
foreach (ListItem item in radiobuttonlistNodes.Items)
{
if (item.Selected)
{
dataToSave += item.Value + ",";
}
}
if (dataToSave.Length > 0)
{
dataToSave = dataToSave.Substring(0, dataToSave.Length - 1);
}
}
else
{
foreach (ListItem radiobutton in radiobuttonlistNodes.Items)
{
radiobutton.Selected = false;
}
clearRadiobuttons.Checked = false;
}
break;
case "radiobox":
goto case "RadioButtonList";
}
if (controlType != "auto-suggest" && controlType != "AutoComplete")
{
this._data.Value = dataToSave;
}
else
{
if (dataToSave.Length > 0)
{
this._data.Value = dataToSave;
}else
{
if (childtxt.Text.Trim().Length == 0)
{
this._data.Value = "";
}
}
}
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
try
{
int parentNodeId = Convert.ToInt32(config[1]);
umbraco.cms.businesslogic.Content parentNode = new umbraco.cms.businesslogic.Content(parentNodeId);
string documentAliasFilter = config[2];
string[] documentAliasFilters = documentAliasFilter.Split(",".ToCharArray());
bool showChildren = Convert.ToBoolean(config[3]);
string[] datavalues = _data.Value.ToString().Split(",".ToCharArray());
switch (controlType)
{
case "AutoComplete":
setupAutoComplete(parentNodeId);
break;
case "auto-suggest":
goto case "AutoComplete";
case "CheckBoxList":
checkboxlistNodes = new CheckBoxList();
//checkboxlistNodes.ID = "nodes";
addListControlNode(parentNode, 1, showChildren, checkboxlistNodes, documentAliasFilters);
base.ContentTemplateContainer.Controls.Add(checkboxlistNodes);
break;
case "checkbox":
goto case "CheckBoxList";
case "DropDownList":
dropdownlistNodes = new DropDownList();
//dropdownlistNodes.ID = "nodes";
ListItem empty = new ListItem("");
dropdownlistNodes.Items.Add(empty);
addListControlNode(parentNode, 1, showChildren, dropdownlistNodes, documentAliasFilters);
foreach (string datavalue in datavalues)
{
dropdownlistNodes.SelectedValue = datavalue;
}
base.ContentTemplateContainer.Controls.Add(dropdownlistNodes);
break;
case "dropdown":
goto case "DropDownList";
case "ListBox":
listboxNodes = new ListBox();
//listboxNodes.ID = "nodes";
listboxNodes.SelectionMode = ListSelectionMode.Multiple;
listboxNodes.Width = 300;
listboxNodes.Height = 200;
addListControlNode(parentNode, 1, showChildren, listboxNodes, documentAliasFilters);
base.ContentTemplateContainer.Controls.Add(listboxNodes);
break;
case "listbox":
goto case "ListBox";
case "RadioButtonList":
radiobuttonlistNodes = new RadioButtonList();
radiobuttonlistNodes.AutoPostBack = true;
radiobuttonlistNodes.SelectedIndexChanged += new EventHandler(radiobuttonlistNodes_SelectedIndexChanged);
//radiobuttonlistNodes.ID = "nodes";
addListControlNode(parentNode, 1, showChildren, radiobuttonlistNodes, documentAliasFilters);
clearRadiobuttonlist = new Button();
clearRadiobuttonlist.Click += new EventHandler(clearRadiobuttonlist_Click);
clearRadiobuttonlist.Text = "Clear";
clearRadiobuttons = new CheckBox();
clearRadiobuttons.Visible = false;
base.ContentTemplateContainer.Controls.Add(radiobuttonlistNodes);
base.ContentTemplateContainer.Controls.Add(clearRadiobuttonlist);
base.ContentTemplateContainer.Controls.Add(clearRadiobuttons);
break;
case "radiobox":
goto case "RadioButtonList";
}
}
catch { }
}
void radiobuttonlistNodes_SelectedIndexChanged(object sender, EventArgs e)
{
clearRadiobuttons.Checked = false;
}
void clearRadiobuttonlist_Click(object sender, EventArgs e)
{
foreach (ListItem radiobutton in radiobuttonlistNodes.Items)
{
radiobutton.Selected = false;
}
clearRadiobuttons.Checked = true;
}
///
/// Adds sub nodes to the ListControl object passed into the method, based on the Content node passed in
///
/// The node whos sub nodes are to be added to the ListControl
/// The level of the current node
/// Boolean determining if grand children should be displayed as well
/// The ListControl the nodes must be added to
/// String representing the documentTypeAlias that should be filtered for. If empty no filter is applied
private void addListControlNode(umbraco.cms.businesslogic.Content node, int level, bool showGrandChildren, ListControl control, string[] documentAliasFilters)
{
if (node.HasChildren)
{
//store children array here because iterating over an Array property object is very inneficient.
var c = node.Children;
foreach (CMSNode child in c)
{
umbraco.cms.businesslogic.Content doc = new umbraco.cms.businesslogic.Content(child.Id);
string preText = string.Empty;
for (int i = 1; i < level; i++)
{
preText += "- ";
}
//Run through the filters passed in
if (documentAliasFilters.Length > 0)
{
foreach (string filter in documentAliasFilters)
{
string trimmedFilter = filter.TrimStart(" ".ToCharArray());
trimmedFilter = trimmedFilter.TrimEnd(" ".ToCharArray());
if (doc.ContentType.Alias == trimmedFilter || trimmedFilter == string.Empty)
{
ListItem item = new ListItem(preText + doc.Text, doc.Id.ToString());
if (_data.Value.ToString().Contains(doc.Id.ToString()))
{
item.Selected = true;
}
control.Items.Add(item);
}
}
}
else
{
ListItem item = new ListItem(preText + doc.Text, doc.Id.ToString());
if (_data.Value.ToString().Contains(doc.Id.ToString()))
{
item.Selected = true;
}
control.Items.Add(item);
}
if (showGrandChildren)
{
addListControlNode(doc, level + 1, showGrandChildren, control, documentAliasFilters);
}
}
}
}
///
/// Sets up the autocomplete functionality
///
private void setupAutoComplete(int parentNodeId)
{
string script = "";
this.Page.ClientScript.RegisterClientScriptBlock(script.GetType(), "ultimatePickerCss", script);
childtxt = new TextBox();
childtxt.ID = "ultimatePickerBox" + base.ID;
childtxt.AutoCompleteType = AutoCompleteType.Disabled;
childtxt.CssClass = "umbEditorTextField";
AutoCompleteExtender extender = new AutoCompleteExtender();
extender.TargetControlID = "ultimatePickerBox" + base.ID;
extender.ServiceMethod = "getNodes";
extender.ServicePath = ConfigurationManager.AppSettings["umbracoPath"] + "/webservices/ultimatePickerAutoSuggest.asmx";
extender.MinimumPrefixLength = 2;
extender.CompletionInterval = 1000;
extender.EnableCaching = true;
extender.CompletionSetCount = 5;
extender.CompletionListCssClass = "autocomplete_completionListElement";
extender.CompletionListItemCssClass = "autocomplete_listItem";
extender.CompletionListHighlightedItemCssClass = "autocomplete_highlightedListItem";
extender.DelimiterCharacters = ";, :";
extender.UseContextKey = true;
extender.ContextKey = parentNodeId.ToString() + "|" + config[3] + "|" + config[2];
if (_data.Value.ToString().Length > 3)
{
try
{
CMSNode firstSaved = new CMSNode(Convert.ToInt32(_data.Value.ToString().Substring(0, 4)));
childtxt.Text = firstSaved.Text;
}
catch
{
}
}
base.ContentTemplateContainer.Controls.Add(childtxt);
base.ContentTemplateContainer.Controls.Add(extender);
}
}
}