Files
Umbraco-CMS/components/editorControls/XPathCheckBoxList/XPathCheckBoxListDataEditor.cs

159 lines
4.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Linq;
using umbraco.interfaces;
namespace umbraco.editorControls.XPathCheckBoxList
{
/// <summary>
/// Renders a CheckBoxList using with option nodes obtained by an XPath expression
/// </summary>
public class XPathCheckBoxListDataEditor : CompositeControl, IDataEditor
{
/// <summary>
/// Field for the data.
/// </summary>
private IData data;
/// <summary>
/// Field for the options.
/// </summary>
private XPathCheckBoxListOptions options;
/// <summary>
/// Field for the checkbox list.
/// </summary>
private CheckBoxList checkBoxList = new CheckBoxList();
/// <summary>
/// Gets a value indicating whether [treat as rich text editor].
/// </summary>
/// <value>
/// <c>true</c> if [treat as rich text editor]; otherwise, <c>false</c>.
/// </value>
public virtual bool TreatAsRichTextEditor
{
get
{
return false;
}
}
/// <summary>
/// Gets a value indicating whether [show label].
/// </summary>
/// <value><c>true</c> if [show label]; otherwise, <c>false</c>.</value>
public virtual bool ShowLabel
{
get
{
return true;
}
}
/// <summary>
/// Gets the editor.
/// </summary>
/// <value>The editor.</value>
public Control Editor
{
get
{
return this;
}
}
/// <summary>
/// Initializes a new instance of XPathCheckBoxListDataEditor
/// </summary>
/// <param name="data"></param>
/// <param name="options"></param>
internal XPathCheckBoxListDataEditor(IData data, XPathCheckBoxListOptions options)
{
this.data = data;
this.options = options;
}
/// <summary>
/// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering.
/// </summary>
protected override void CreateChildControls()
{
this.checkBoxList.DataSource = uQuery.GetNodesByXPath(this.options.XPath).ToNameIds();
this.checkBoxList.DataTextField = "Value";
this.checkBoxList.DataValueField = this.options.UseIds ? "Key" : "Value";
this.checkBoxList.DataBind();
this.Controls.Add(this.checkBoxList);
}
/// <summary>
/// Raises the <see cref="E:System.Web.UI.Control.Load"/> event.
/// </summary>
/// <param name="e">The <see cref="T:System.EventArgs"/> object that contains the event data.</param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.EnsureChildControls();
if (!this.Page.IsPostBack && this.data.Value != null)
{
string value = this.data.Value.ToString();
List<string> selectedValues = new List<string>();
if (xmlHelper.CouldItBeXml(value))
{
// build selected values from XML fragment
foreach (XElement nodeXElement in XElement.Parse(value).Elements())
{
selectedValues.Add(nodeXElement.Value);
}
}
else
{
// Assume a CSV source
selectedValues = value.Split(',').ToList();
}
// Find checkboxes where values match the stored values and set to selected
ListItem checkBoxListItem = null;
foreach (string selectedValue in selectedValues)
{
checkBoxListItem = this.checkBoxList.Items.FindByValue(selectedValue);
if (checkBoxListItem != null)
{
checkBoxListItem.Selected = true;
}
}
}
}
/// <summary>
/// Called by Umbraco when saving the node
/// </summary>
public void Save()
{
// Get all checked item values
IEnumerable<string> selectedOptions = from ListItem item in this.checkBoxList.Items
where item.Selected
select item.Value;
if (this.options.UseXml)
{
string elementName = this.options.UseIds ? "nodeId" : "nodeName";
this.data.Value = new XElement("XPathCheckBoxList",
selectedOptions.Select(x => new XElement(elementName, x.ToString()))).ToString();
}
else
{
// Save the CSV
this.data.Value = string.Join(",", selectedOptions.ToArray());
}
}
}
}