Files
Umbraco-CMS/components/editorControls/relatedlinks/RelatedLinksDataEditor.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

326 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml;
using umbraco.interfaces;
using umbraco.editorControls;
using umbraco.cms.businesslogic;
using umbraco.cms.businesslogic.datatype;
namespace umbraco.editorControls.relatedlinks
{
[ValidationProperty("IsValid")]
public class RelatedLinksDataEditor : UpdatePanel, IDataEditor
{
private umbraco.interfaces.IData _data;
string _configuration;
private ListBox _listboxLinks;
private Button _buttonUp;
private Button _buttonDown;
private Button _buttonDelete;
private TextBox _textboxLinkTitle;
private CheckBox _checkNewWindow;
private TextBox _textBoxExtUrl;
private Button _buttonAddExtUrl;
private Button _buttonAddIntUrlCP;
private XmlDocument _xml;
private pagePicker _pagePicker;
private PagePickerDataExtractor _pagePickerExtractor;
public RelatedLinksDataEditor(umbraco.interfaces.IData Data, string Configuration)
{
_data = Data;
_configuration = Configuration;
}
public virtual bool TreatAsRichTextEditor
{
get { return false; }
}
/// <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 {
if (_listboxLinks != null) {
if (_listboxLinks.Items.Count > 0)
return "Valid";
}
return "";
}
}
public bool ShowLabel
{
get { return true; }
}
public Control Editor { get { return this; } }
//Creates and saves a xml format of the content of the _listboxLinks
// <links>
// <link type="external" title="google" link="http://google.com" newwindow="1" />
// <link type="internal" title="home" link="1234" newwindow="0" />
// </links>
//We could adapt the global xml at every adjustment, but this implementation is easier
// (and possibly more efficient).
public void Save()
{
XmlDocument doc = createBaseXmlDocument();
XmlNode root = doc.DocumentElement;
foreach (ListItem item in _listboxLinks.Items)
{
string value = item.Value;
XmlNode newNode = doc.CreateElement("link");
XmlNode titleAttr = doc.CreateNode(XmlNodeType.Attribute, "title", null);
titleAttr.Value = item.Text;
newNode.Attributes.SetNamedItem(titleAttr);
XmlNode linkAttr = doc.CreateNode(XmlNodeType.Attribute, "link", null);
linkAttr.Value = value.Substring(2);
newNode.Attributes.SetNamedItem(linkAttr);
XmlNode typeAttr = doc.CreateNode(XmlNodeType.Attribute, "type", null);
if (value.Substring(0, 1).Equals("i"))
typeAttr.Value = "internal";
else
typeAttr.Value = "external";
newNode.Attributes.SetNamedItem(typeAttr);
XmlNode windowAttr = doc.CreateNode(XmlNodeType.Attribute, "newwindow", null);
if (value.Substring(1, 1).Equals("n"))
windowAttr.Value = "1";
else
windowAttr.Value = "0";
newNode.Attributes.SetNamedItem(windowAttr);
root.AppendChild(newNode);
}
this._data.Value = doc.InnerXml;
}
//Draws the controls, only gets called for the first drawing of the page, not for each postback
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
try
{
_xml = new XmlDocument();
_xml.LoadXml(_data.Value.ToString());
}
catch
{
_xml = createBaseXmlDocument();
}
_listboxLinks = new ListBox();
_listboxLinks.ID = "links" + base.ID;
_listboxLinks.Width = 400;
_listboxLinks.Height = 140;
foreach (XmlNode node in _xml.DocumentElement.ChildNodes)
{
string text = node.Attributes["title"].Value.ToString();
string value = (node.Attributes["type"].Value.ToString().Equals("internal") ? "i" : "e")
+ (node.Attributes["newwindow"].Value.ToString().Equals("1") ? "n" : "o")
+ node.Attributes["link"].Value.ToString();
_listboxLinks.Items.Add(new ListItem(text, value));
}
_buttonUp = new Button();
_buttonUp.ID = "btnUp" + base.ID;
_buttonUp.Text = umbraco.ui.GetText("relatedlinks", "modeUp");
_buttonUp.Width = 80;
_buttonUp.Click += new EventHandler(this.buttonUp_Click);
_buttonDown = new Button();
_buttonDown.ID = "btnDown" + base.ID;
_buttonDown.Attributes.Add("style", "margin-top: 5px;");
_buttonDown.Text = umbraco.ui.GetText("relatedlinks", "modeDown");
_buttonDown.Width = 80;
_buttonDown.Click += new EventHandler(this.buttonDown_Click);
_buttonDelete = new Button();
_buttonDelete.ID = "btnDel" + base.ID;
_buttonDelete.Text = umbraco.ui.GetText("relatedlinks", "removeLink");
_buttonDelete.Width = 80;
_buttonDelete.Click += new EventHandler(this.buttonDel_Click);
_textboxLinkTitle = new TextBox();
_textboxLinkTitle.Width = 400;
_textboxLinkTitle.ID = "linktitle" + base.ID;
_checkNewWindow = new CheckBox();
_checkNewWindow.ID = "checkNewWindow" + base.ID;
_checkNewWindow.Checked = false;
_checkNewWindow.Text = umbraco.ui.GetText("relatedlinks", "newWindow");
_textBoxExtUrl = new TextBox();
_textBoxExtUrl.Width = 400;
_textBoxExtUrl.ID = "exturl" + base.ID;
_buttonAddExtUrl = new Button();
_buttonAddExtUrl.ID = "btnAddExtUrl" + base.ID;
_buttonAddExtUrl.Text = umbraco.ui.GetText("relatedlinks", "addlink");
_buttonAddExtUrl.Width = 80;
_buttonAddExtUrl.Click += new EventHandler(this.buttonAddExt_Click);
_buttonAddIntUrlCP = new Button();
_buttonAddIntUrlCP.ID = "btnAddIntUrl" + base.ID;
_buttonAddIntUrlCP.Text = umbraco.ui.GetText("relatedlinks", "addlink");
_buttonAddIntUrlCP.Width = 80;
_buttonAddIntUrlCP.Click += new EventHandler(this.buttonAddIntCP_Click);
_pagePickerExtractor = new PagePickerDataExtractor();
_pagePicker = new pagePicker(_pagePickerExtractor);
_pagePicker.ID = "pagePicker" + base.ID;
ContentTemplateContainer.Controls.Add(new LiteralControl("<div class=\"relatedlinksdatatype\" style=\"text-align: left; padding: 5px;\"><table><tr><td rowspan=\"2\">"));
ContentTemplateContainer.Controls.Add(_listboxLinks);
ContentTemplateContainer.Controls.Add(new LiteralControl("</td><td style=\"vertical-align: top\">"));
ContentTemplateContainer.Controls.Add(_buttonUp);
ContentTemplateContainer.Controls.Add(new LiteralControl("<br />"));
ContentTemplateContainer.Controls.Add(_buttonDown);
ContentTemplateContainer.Controls.Add(new LiteralControl("</td></tr><tr><td style=\"vertical-align: bottom\">"));
ContentTemplateContainer.Controls.Add(_buttonDelete);
ContentTemplateContainer.Controls.Add(new LiteralControl("<br />"));
ContentTemplateContainer.Controls.Add(new LiteralControl("</td></tr></table>"));
// Add related links container
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("<a href=\"javascript:;\" onClick=\"document.getElementById('{0}_addExternalLinkPanel').style.display='none';document.getElementById('{0}_addExternalLinkButton').style.display='none';document.getElementById('{0}_addLinkContainer').style.display='block';document.getElementById('{0}_addInternalLinkPanel').style.display='block';document.getElementById('{0}_addInternalLinkButton').style.display='block';\"><strong>{1}</strong></a>", ClientID, umbraco.ui.GetText("relatedlinks", "addInternal"))));
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format(" | <a href=\"javascript:;\" onClick=\"document.getElementById('{0}_addInternalLinkPanel').style.display='none';document.getElementById('{0}_addInternalLinkButton').style.display='none';document.getElementById('{0}_addLinkContainer').style.display='block';document.getElementById('{0}_addExternalLinkPanel').style.display='block';document.getElementById('{0}_addExternalLinkButton').style.display='block';\"><strong>{1}</strong></a>", ClientID, umbraco.ui.GetText("relatedlinks", "addExternal"))));
// All urls
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("<div id=\"{0}_addLinkContainer\" style=\"display: none; padding: 4px; border: 1px solid #ccc; margin-top: 5px;margin-right:10px;\">", ClientID)));
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("<a href=\"javascript:;\" onClick=\"document.getElementById('{0}_addLinkContainer').style.display='none';\" style=\"border: none;\"><img src=\"{1}/images/close.png\" style=\"float: right\" /></a>", ClientID, GlobalSettings.Path)));
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("{0}:<br />", umbraco.ui.GetText("relatedlinks", "caption"))));
ContentTemplateContainer.Controls.Add(_textboxLinkTitle);
ContentTemplateContainer.Controls.Add(new LiteralControl("<br />"));
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("<div id=\"{0}_addExternalLinkPanel\" style=\"display: none; margin: 3px 0\">", ClientID)));
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("{0}:<br />", umbraco.ui.GetText("relatedlinks", "linkurl"))));
ContentTemplateContainer.Controls.Add(_textBoxExtUrl);
ContentTemplateContainer.Controls.Add(new LiteralControl("</div>"));
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("<div id=\"{0}_addInternalLinkPanel\" style=\"display: none; margin: 3px 0\">", ClientID)));
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("{0}:<br />", umbraco.ui.GetText("relatedlinks", "internalPage"))));
ContentTemplateContainer.Controls.Add(_pagePicker);
ContentTemplateContainer.Controls.Add(new LiteralControl("</div>"));
ContentTemplateContainer.Controls.Add(new LiteralControl("<div style=\"margin: 5px 0\">"));
ContentTemplateContainer.Controls.Add(_checkNewWindow);
ContentTemplateContainer.Controls.Add(new LiteralControl("</div>"));
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("<div id=\"{0}_addInternalLinkButton\" style=\"display: none;\">", ClientID)));
ContentTemplateContainer.Controls.Add(_buttonAddIntUrlCP);
ContentTemplateContainer.Controls.Add(new LiteralControl("</div>"));
ContentTemplateContainer.Controls.Add(new LiteralControl(String.Format("<div id=\"{0}_addExternalLinkButton\" style=\"display: none;\">", ClientID)));
ContentTemplateContainer.Controls.Add(_buttonAddExtUrl);
ContentTemplateContainer.Controls.Add(new LiteralControl("</div>"));
ContentTemplateContainer.Controls.Add(new LiteralControl("</div>"));
ContentTemplateContainer.Controls.Add(new LiteralControl("</div>"));
resetInputMedia();
}
private XmlDocument createBaseXmlDocument()
{
XmlDocument doc = new XmlDocument();
XmlNode root = doc.CreateElement("links");
doc.AppendChild(root);
return doc;
}
private void buttonUp_Click(Object o, EventArgs ea)
{
int index = _listboxLinks.SelectedIndex;
if (index > 0) //not the first item
{
ListItem temp = _listboxLinks.SelectedItem;
_listboxLinks.Items.RemoveAt(index);
_listboxLinks.Items.Insert(index - 1, temp);
_listboxLinks.SelectedIndex = index - 1;
}
}
private void buttonDown_Click(Object o, EventArgs ea)
{
int index = _listboxLinks.SelectedIndex;
if (index > -1 && index < _listboxLinks.Items.Count - 1) //not the last item
{
ListItem temp = _listboxLinks.SelectedItem;
_listboxLinks.Items.RemoveAt(index);
_listboxLinks.Items.Insert(index + 1, temp);
_listboxLinks.SelectedIndex = index + 1;
}
}
private void buttonDel_Click(Object o, EventArgs ea)
{
int index = _listboxLinks.SelectedIndex;
if (index > -1)
{
_listboxLinks.Items.RemoveAt(index);
}
}
private void buttonAddExt_Click(Object o, EventArgs ea)
{
string url = _textBoxExtUrl.Text.Trim();
if (url.Length > 0 && _textboxLinkTitle.Text.Length > 0)
{
// use default HTTP protocol if no protocol was specified
if (!(url.Contains("://")))
{
url = "http://" + url;
}
string value = "e" + (_checkNewWindow.Checked ? "n" : "o") + url;
_listboxLinks.Items.Add(new ListItem(_textboxLinkTitle.Text, value));
resetInputMedia();
}
}
private void buttonAddIntCP_Click(Object o, EventArgs ea)
{
_pagePicker.Save();
if (!String.IsNullOrEmpty(_textboxLinkTitle.Text)
&& _pagePickerExtractor.Value != null
&& _pagePickerExtractor.Value.ToString() != "")
{
string value = "i" + (_checkNewWindow.Checked ? "n" : "o") + _pagePickerExtractor.Value.ToString();
_listboxLinks.Items.Add(new ListItem(_textboxLinkTitle.Text, value));
resetInputMedia();
ScriptManager.RegisterClientScriptBlock(_pagePicker, _pagePicker.GetType(), "clearPagePicker", _pagePicker.ClientID + "_clear();", true);
}
}
private void resetInputMedia()
{
_textBoxExtUrl.Text = "http://";
_textboxLinkTitle.Text = "";
_pagePickerExtractor.Value = "";
}
}
}