Files
Umbraco-CMS/components/editorControls/ultimatepicker/ultimatePickerDataEditor.cs
Shandem f6d0d043b5 DO NOT DOWNLOAD. DOWNLOAT LATEST STABLE FROM RELEASE TAB
Created 4.1.0 branch

[TFS Changeset #55082]
2009-06-19 07:39:16 +00:00

422 lines
18 KiB
C#

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; }
}
/// <summary>
/// Internal logic for validation controls to detect whether or not it's valid (has to be public though)
/// </summary>
/// <value>Am I valid?</value>
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;
}
/// <summary>
/// Adds sub nodes to the ListControl object passed into the method, based on the Content node passed in
/// </summary>
/// <param name="node">The node whos sub nodes are to be added to the ListControl</param>
/// <param name="level">The level of the current node</param>
/// <param name="showGrandChildren">Boolean determining if grand children should be displayed as well</param>
/// <param name="control">The ListControl the nodes must be added to</param>
/// <param name="documentAliasFilter">String representing the documentTypeAlias that should be filtered for. If empty no filter is applied</param>
private void addListControlNode(umbraco.cms.businesslogic.Content node, int level, bool showGrandChildren, ListControl control, string[] documentAliasFilters)
{
if (node.HasChildren)
{
foreach (CMSNode child in node.Children)
{
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);
}
}
}
}
/// <summary>
/// Sets up the autocomplete functionality
/// </summary>
private void setupAutoComplete(int parentNodeId)
{
string script = "<style>/*AutoComplete flyout */\r\n .autocomplete_completionListElement \r\n { \r\n\t visibility : hidden;\r\n\t margin : 0px !Important;\r\n\t padding: 0px !Important;\r\n background-color : #fff;\r\n\t color : #000;\r\n\t border : #ccc;\r\n\t border-width : 1px;\r\n\t border-style : solid;\r\n\t cursor : 'default';\r\n\t overflow : auto;\r\n\t height : 100px;\r\n text-align : left; \r\n list-style: none !Important;\r\n width: 400px !Important;\r\n z-index: 9999999;\r\n }\r\n .autocomplete_completionListElement li{\r\n display: block;\r\n padding: 1px !Important;\r\n margin: 0px;\r\n }\r\n /* AutoComplete highlighted item */\r\n\r\n .autocomplete_highlightedListItem\r\n {\r\n\t background-color: #ffff99;\r\n\t color: black;\r\n\t padding: 1px;\r\n }\r\n\r\n /* AutoComplete item */\r\n\r\n .autocomplete_listItem \r\n {\r\n\t background-color : window;\r\n\t color : windowtext;\r\n\t padding : 1px;\r\n }</style>";
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);
}
}
}