Files
Umbraco-CMS/components/editorControls/imagecropper/DataEditor.cs
hartvig 8885005e62 Fixes 27584
[TFS Changeset #70429]
2010-06-21 09:46:10 +00:00

213 lines
8.2 KiB
C#

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using umbraco.cms.businesslogic.property;
using umbraco.cms.businesslogic.web;
using System.Xml;
using System.Text;
using umbraco.editorControls.imagecropper;
using umbraco.cms.businesslogic.media;
using umbraco.cms.businesslogic;
using umbraco.cms.businesslogic.member;
namespace umbraco.editorControls.imagecropper
{
public class DataEditor : PlaceHolder, umbraco.interfaces.IDataEditor
{
private umbraco.interfaces.IData data;
private Config config;
private XmlDocument _xml;
public Image imgImage = new Image();
public HiddenField hdnJson = new HiddenField();
public HiddenField hdnRaw = new HiddenField();
public HiddenField hdnSer = new HiddenField();
public DataEditor(umbraco.interfaces.IData Data, string Configuration)
{
data = Data;
config = new Config(Configuration);
}
public virtual bool TreatAsRichTextEditor { get { return false; } }
public bool ShowLabel { get { return config.ShowLabel; } }
public Control Editor { get { return this; } }
protected override void OnInit(EventArgs e)
//protected override void OnLoad(EventArgs e)
{
this.ID = "ImageCropper";
//base.OnInit(e);
int propertyId = ((umbraco.cms.businesslogic.datatype.DefaultData)data).PropertyId;
int currentDocumentId = ((umbraco.cms.businesslogic.datatype.DefaultData)data).NodeId;
Property uploadProperty;
// we need this ugly code because there's no way to use a base class
CMSNode node = new CMSNode(currentDocumentId);
if (node.nodeObjectType == Document._objectType)
{
uploadProperty =
new Document(currentDocumentId).getProperty(config.UploadPropertyAlias);
}
else if (node.nodeObjectType == umbraco.cms.businesslogic.media.Media._objectType)
{
uploadProperty =
new Media(currentDocumentId).getProperty(config.UploadPropertyAlias);
}
else if (node.nodeObjectType == Member._objectType)
{
uploadProperty =
new Member(currentDocumentId).getProperty(config.UploadPropertyAlias);
}
else
{
throw new Exception("Unsupported Umbraco Node type for Image Cropper (only Document, Media and Members are supported.");
}
string relativeImagePath = uploadProperty.Value.ToString();
ImageInfo imageInfo = new ImageInfo(relativeImagePath);
imgImage.ImageUrl = relativeImagePath;
imgImage.ID = String.Format("cropBox_{0}", propertyId);
StringBuilder sbJson = new StringBuilder();
StringBuilder sbRaw = new StringBuilder();
try
{
_xml = new XmlDocument();
_xml.LoadXml(data.Value.ToString());
}
catch
{
_xml = createBaseXmlDocument();
}
sbJson.Append("{ \"current\": 0, \"crops\": [");
for (int i = 0; i < config.presets.Count; i++)
{
Preset preset = (Preset)config.presets[i];
Crop crop;
sbJson.Append("{\"name\":'" + preset.Name + "'");
sbJson.Append(",\"config\":{" +
String.Format("\"targetWidth\":{0},\"targetHeight\":{1},\"keepAspect\":{2}",
preset.TargetWidth, preset.TargetHeight,
(preset.KeepAspect ? "true" : "false") + "}"));
if (imageInfo.Exists)
{
crop = preset.Fit(imageInfo);
}
else
{
crop.X = 0;
crop.Y = 0;
crop.X2 = preset.TargetWidth;
crop.Y2 = preset.TargetHeight;
}
// stored
if (_xml.DocumentElement != null && _xml.DocumentElement.ChildNodes.Count == config.presets.Count)
{
XmlNode xmlNode = _xml.DocumentElement.ChildNodes[i];
int xml_x = Convert.ToInt32(xmlNode.Attributes["x"].Value);
int xml_y = Convert.ToInt32(xmlNode.Attributes["y"].Value);
int xml_x2 = Convert.ToInt32(xmlNode.Attributes["x2"].Value);
int xml_y2 = Convert.ToInt32(xmlNode.Attributes["y2"].Value);
DateTime fileDate = Convert.ToDateTime(_xml.DocumentElement.Attributes["date"].Value);
// only use xml values if image is the same and different from defaults (document is stored inbetween image upload and cropping)
//if (xml_x2 - xml_x != preset.TargetWidth || xml_y2 - xml_y != preset.TargetHeight)
//fileDate == imageInfo.DateStamp && (
if (crop.X != xml_x || crop.X2 != xml_x2 || crop.Y != xml_y || crop.Y2 != xml_y2)
{
crop.X = xml_x;
crop.Y = xml_y;
crop.X2 = xml_x2;
crop.Y2 = xml_y2;
}
}
sbJson.Append(",\"value\":{" + String.Format("\"x\":{0},\"y\":{1},\"x2\":{2},\"y2\":{3}", crop.X, crop.Y, crop.X2, crop.Y2) + "}}");
sbRaw.Append(String.Format("{0},{1},{2},{3}", crop.X, crop.Y, crop.X2, crop.Y2));
if (i < config.presets.Count - 1)
{
sbJson.Append(",");
sbRaw.Append(";");
}
}
sbJson.Append("]}");
hdnJson.Value = sbJson.ToString();
//hdnJson.ID = String.Format("json_{0}", propertyId);
hdnRaw.Value = sbRaw.ToString();
//hdnRaw.ID = String.Format("raw_{0}", propertyId);
Controls.Add(imgImage);
Controls.Add(hdnJson);
Controls.Add(hdnRaw);
string imageCropperInitScript =
"initImageCropper('" +
imgImage.ClientID + "', '" +
hdnJson.ClientID + "', '" +
hdnRaw.ClientID +
"');";
Page.ClientScript.RegisterStartupScript(GetType(), ClientID + "_imageCropper", imageCropperInitScript, true);
Page.ClientScript.RegisterClientScriptBlock(Resources.json2Script.GetType(), "json2Script", Resources.json2Script, true);
Page.ClientScript.RegisterClientScriptBlock(Resources.jCropCSS.GetType(), "jCropCSS", Resources.jCropCSS);
Page.ClientScript.RegisterClientScriptBlock(Resources.jCropScript.GetType(), "jCropScript", Resources.jCropScript, true);
Page.ClientScript.RegisterClientScriptBlock(Resources.imageCropperScript.GetType(), "imageCropperScript", Resources.imageCropperScript, true);
base.OnInit(e);
}
/// <summary>
/// Store data as string XML (overridden by ToXMl to store "real" XML
/// XML format:
/// <crops dateStamp="">
/// <crop name="" x="" y="" x2="" y2="" url="" />
/// </crops>
/// </summary>
public void Save()
{
ImageInfo imageInfo = new ImageInfo(imgImage.ImageUrl);
if (!imageInfo.Exists)
{
data.Value = "";
}
else
{
SaveData saveData = new SaveData(hdnRaw.Value);
data.Value = saveData.Xml(config, imageInfo);
imageInfo.GenerateThumbnails(saveData, config);
}
}
private static XmlDocument createBaseXmlDocument()
{
XmlDocument doc = new XmlDocument();
XmlNode root = doc.CreateElement("crops");
doc.AppendChild(root);
return doc;
}
}
}