Files
Umbraco-CMS/umbraco/presentation/umbraco/LiveEditing/Modules/SkinModule/SkinModule.cs
T
2010-12-23 20:42:50 -01:00

274 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using umbraco.presentation.LiveEditing.Modules;
using ClientDependency.Core;
using System.Web.UI.WebControls;
using umbraco.presentation.LiveEditing.Controls;
using umbraco.IO;
using System.Web.UI;
using umbraco.cms.businesslogic.skinning;
using ClientDependency.Core.Controls;
using umbraco.presentation.umbraco.controls;
using HtmlAgilityPack;
using umbraco.cms.businesslogic.template;
using System.Text;
using System.IO;
using System.Collections;
namespace umbraco.presentation.umbraco.LiveEditing.Modules.SkinModule
{
[ClientDependency(200, ClientDependencyType.Javascript, "modal/modal.js", "UmbracoClient")]
[ClientDependency(200, ClientDependencyType.Css, "modal/style.css", "UmbracoClient")]
[ClientDependency(500, ClientDependencyType.Javascript, "LiveEditing/Modules/SkinModule/js/ModuleInjection.js", "UmbracoRoot")]
[ClientDependency(800, ClientDependencyType.Javascript, "LiveEditing/Modules/SkinModule/js/disableInstallButtonsOnClick.js", "UmbracoRoot")]
public class SkinModule : BaseModule
{
protected LabelButton m_SkinButton = new LabelButton();
protected Panel m_SkinModal;
protected LabelButton m_ModuleButton = new LabelButton();
protected Panel m_ModuleModal;
public SkinModule(LiveEditingManager manager)
: base(manager)
{ }
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
EnsureChildControls();
}
protected override void CreateChildControls()
{
base.CreateChildControls();
Skin ActiveSkin = Skin.CreateFromAlias(Skinning.GetCurrentSkinAlias(NodeFactory.Node.GetCurrent().template));
m_SkinModal = new Panel();
m_SkinModal.ID = "LeSkinModal";
m_SkinModal.Attributes.Add("style", "display: none");
m_SkinModal.Controls.Add(new UserControl().LoadControl(String.Format("{0}/LiveEditing/Modules/SKinModule/SkinCustomizer.ascx", SystemDirectories.Umbraco)));
Controls.Add(m_SkinModal);
m_SkinButton.ID = "LeSkinButton";
m_SkinButton.CssClass = "button";
m_SkinButton.ToolTip = ActiveSkin != null && ActiveSkin.Dependencies.Count > 0 ? "Customize skin" : "Change skin";
m_SkinButton.ImageUrl = String.Format("{0}/LiveEditing/Modules/SKinModule/images/skin.gif", SystemDirectories.Umbraco);
string s = (ActiveSkin != null && ActiveSkin.Dependencies.Count > 0 ? "setTasksClientScripts();" : "") + "jQuery('#" + m_SkinModal.ClientID + @"').show();" + "jQuery('#" + m_SkinModal.ClientID + @"').ModalWindowShowWithoutBackground('" + ui.GetText("skin") + "',true,500,400,50,0, ['.modalbuton'], null);";
m_SkinButton.OnClientClick = s +"return false;";
Controls.Add(m_SkinButton);
if (UmbracoContext.Current.LiveEditingContext.InSkinningMode && !string.IsNullOrEmpty(UmbracoContext.Current.Request["umbSkinningConfigurator"]))
{
ScriptManager.RegisterClientScriptBlock(
this,
this.GetType(),
"ShowSkinModule",
"function ShowSkinModule(){" + s + "}",
true);
ClientDependencyLoader.Instance.RegisterDependency(500, "LiveEditing/Modules/SkinModule/js/SkinModuleShowOnStartup.js", "UmbracoRoot", ClientDependencyType.Javascript);
}
// modules
if (CanInsertModules(NodeFactory.Node.GetCurrent().template))
{
m_ModuleModal = new Panel();
m_ModuleModal.ID = "LeModuleModal";
m_ModuleModal.CssClass = "ModuleSelector";
m_ModuleModal.Attributes.Add("style", "display: none");
m_ModuleModal.Controls.Add(new UserControl().LoadControl(String.Format("{0}/LiveEditing/Modules/SKinModule/ModuleSelector.ascx", SystemDirectories.Umbraco)));
Controls.Add(m_ModuleModal);
m_ModuleButton.ID = "LeModuleButton";
m_ModuleButton.CssClass = "button";
m_ModuleButton.ToolTip = "Insert Module";
m_ModuleButton.ImageUrl = String.Format("{0}/LiveEditing/Modules/SKinModule/images/module.gif", SystemDirectories.Umbraco);
m_ModuleButton.OnClientClick = "umbShowModuleSelection();" + "return false;";
Controls.Add(m_ModuleButton);
}
}
private bool CanInsertModules(int template)
{
Template t = new Template(template);
HtmlDocument doc = new HtmlDocument();
doc.Load(t.MasterPageFile);
if (doc.DocumentNode.SelectNodes(string.Format("//*[@class = '{0}']", "umbModuleContainer")) != null)
return true;
else
{
if (t.HasMasterTemplate)
return CanInsertModules(t.MasterTemplate);
else
return false;
}
}
protected override void Manager_MessageReceived(object sender, MesssageReceivedArgs e)
{
switch (e.Type)
{
case "injectmodule":
//update template, insert macro tag
InsertModule(NodeFactory.Node.GetCurrent().template, e.Message.Split(';')[0], e.Message.Split(';')[1], e.Message.Split(';')[2] == "prepend");
break;
case "movemodule":
string moduleId = e.Message.Split(';')[0];
string parentId = e.Message.Split(';')[1];
int index = 0;
int.TryParse(e.Message.Split(';')[2], out index);
HtmlNode module = FindModule(NodeFactory.Node.GetCurrent().template, moduleId, false);
if (module != null)
{
FindModule(NodeFactory.Node.GetCurrent().template, moduleId, true);
MoveModule(NodeFactory.Node.GetCurrent().template, module, parentId, index);
}
break;
case "removemodule":
FindModule(NodeFactory.Node.GetCurrent().template, e.Message.Split(';')[0], true);
break;
}
}
private bool MoveModule(int template, HtmlNode module, string targetId, int index)
{
Template t = new Template(template);
string TargetFile = t.MasterPageFile;
string TargetID = targetId;
HtmlDocument doc = new HtmlDocument();
doc.Load(TargetFile);
if (doc.DocumentNode.SelectNodes(string.Format("//*[@id = '{0}']", TargetID)) != null)
{
HtmlNode parent = doc.DocumentNode.SelectSingleNode(string.Format("//*[@id = '{0}']", TargetID));
if (index > 0 && parent.ChildNodes.Count > 0)
{
parent.InsertAfter(module, parent.ChildNodes[index - 1]);
}
else if (index == 0 && parent.ChildNodes.Count > 0)
{
parent.InsertBefore(module, parent.ChildNodes[0]);
}
else
{
parent.ChildNodes.Add(module);
}
doc.Save(TargetFile);
return true;
}
else
{
//might be on master template
if (t.HasMasterTemplate)
return MoveModule(template, module, targetId,index);
else
return false;
}
}
private HtmlNode FindModule(int template, string id, bool remove)
{
Template t = new Template(template);
string TargetFile = t.MasterPageFile;
string TargetID = id;
HtmlDocument doc = new HtmlDocument();
doc.Load(TargetFile);
if (doc.DocumentNode.SelectSingleNode(string.Format("//*[@id = '{0}']", TargetID)) != null)
{
if (!remove)
return doc.DocumentNode.SelectSingleNode(string.Format("//*[@id = '{0}']", TargetID));
else
{
HtmlNode r = doc.DocumentNode.SelectSingleNode(string.Format("//*[@id = '{0}']", TargetID)).Clone();
doc.DocumentNode.SelectSingleNode(string.Format("//*[@id = '{0}']", TargetID)).Remove();
doc.Save(TargetFile);
return r;
}
}
else
{
if (t.HasMasterTemplate)
return FindModule(template,id,remove);
else
return null;
}
}
private bool InsertModule(int template, string targetId, string tag, bool prepend)
{
Template t = new Template(template);
string TargetFile = t.MasterPageFile;
string TargetID = targetId;
HtmlDocument doc = new HtmlDocument();
doc.Load(TargetFile);
if (doc.DocumentNode.SelectNodes(string.Format("//*[@id = '{0}']", TargetID)) != null)
{
foreach (HtmlNode target in doc.DocumentNode.SelectNodes(string.Format("//*[@id = '{0}']", TargetID)))
{
HtmlNode macrotag = HtmlNode.CreateNode(tag);
if (prepend)
target.PrependChild(macrotag);
else
target.AppendChild(macrotag);
}
doc.Save(TargetFile);
return true;
}
else
{
//might be on master template
if (t.HasMasterTemplate)
return InsertModule(t.MasterTemplate, targetId, tag, prepend);
else
return false;
}
}
}
}