using System; using System.Web.UI; using System.Web.UI.WebControls; using umbraco.BusinessLogic; using umbraco.editorControls; using umbraco.DataLayer; using umbraco.interfaces; namespace umbraco.editorControls.imagecropper { public class PrevalueEditor : PlaceHolder, IDataPrevalue { private readonly umbraco.cms.businesslogic.datatype.BaseDataType _dataType; private TextBox txtPropertyAlias; private CheckBox chkGenerateCrops; private CheckBox chkShowLabel; private Literal litQuality; private TextBox txtQuality; private SmartListBox slbPresets; private TextBox txtCropName; private TextBox txtTargetWidth; private TextBox txtTargetHeight; private CheckBox chkKeepAspect; private DropDownList ddlDefaultPosH; private DropDownList ddlDefaultPosV; private Button btnUp; private Button btnDown; private Button btnAdd; private Button btnRemove; private Button btnGenerate; //private RegularExpressionValidator revName; //private RequiredFieldValidator rqfName; //private ValidationSummary vsErrors; public PrevalueEditor(umbraco.cms.businesslogic.datatype.BaseDataType dataType) { _dataType = dataType; SetupChildControls(); } public void SetupChildControls() { txtPropertyAlias = new TextBox {ID = "upload", Width = Unit.Pixel(100)}; chkGenerateCrops = new CheckBox {ID = "generateimg", AutoPostBack = true}; litQuality = new Literal {ID = "qualityLiteral", Text = " Quality ", Visible = false}; txtQuality = new TextBox {ID = "quality", Width = Unit.Pixel(30), Visible = false}; chkShowLabel = new CheckBox {ID = "label"}; slbPresets = new SmartListBox { ID = "presets", SelectionMode = ListSelectionMode.Multiple, Height = Unit.Pixel(123), Width = Unit.Pixel(350) }; txtCropName = new TextBox {ID = "presetname", Width = Unit.Pixel(100)}; txtTargetWidth = new TextBox {ID = "presetw", Width = Unit.Pixel(50)}; txtTargetHeight = new TextBox {ID = "preseth", Width = Unit.Pixel(50)}; chkKeepAspect = new CheckBox {ID = "aspect", Checked = true}; ddlDefaultPosH = new DropDownList {ID = "posh"}; ddlDefaultPosH.Items.Add(new ListItem("Left", "L")); ddlDefaultPosH.Items.Add(new ListItem("Center", "C")); ddlDefaultPosH.Items.Add(new ListItem("Right", "R")); ddlDefaultPosV = new DropDownList {ID = "posv"}; ddlDefaultPosV.Items.Add(new ListItem("Top", "T")); ddlDefaultPosV.Items.Add(new ListItem("Middle", "M")); ddlDefaultPosV.Items.Add(new ListItem("Bottom", "B")); btnUp = new Button {ID = "up", Text = "Up", Width = Unit.Pixel(60)}; btnDown = new Button {ID = "down", Text = "Down", Width = Unit.Pixel(60)}; btnAdd = new Button {ID = "add", Text = "Add", Width = Unit.Pixel(60)}; btnRemove = new Button {ID = "remove", Text = "Remove", Width = Unit.Pixel(60)}; btnGenerate = new Button {ID = "generate", Text = "Generate", Width = Unit.Pixel(60)}; //vsErrors = new ValidationSummary {ID = "summary", ValidationGroup = "cropper"}; //rqfName = new RequiredFieldValidator {ID = "namevalidator", ValidationGroup = "cropper", ControlToValidate = txtCropName.ClientID, ErrorMessage = "Crop name missing", Text="*" }; //revName = new RegularExpressionValidator // { // ID = "namevalidator", // ValidationExpression = ".*[a-zA-Z0-9-_ ].*", // ValidationGroup = "cropper", // ErrorMessage = "Invalid name. Alphanumerical only please as this will be the filename", // AssociatedControlID = txtCropName.ID // }; Controls.Add(txtPropertyAlias); Controls.Add(chkGenerateCrops); Controls.Add(litQuality); Controls.Add(txtQuality); Controls.Add(chkShowLabel); Controls.Add(slbPresets); Controls.Add(txtCropName); Controls.Add(txtTargetWidth); Controls.Add(txtTargetHeight); Controls.Add(chkKeepAspect); Controls.Add(ddlDefaultPosH); Controls.Add(ddlDefaultPosV); Controls.Add(btnUp); Controls.Add(btnDown); Controls.Add(btnAdd); Controls.Add(btnRemove); Controls.Add(btnGenerate); //Controls.Add(vsErrors); //Controls.Add(rqfName); //Controls.Add(revName); btnUp.Click += _upButton_Click; btnDown.Click += _downButton_Click; btnAdd.Click += _addButton_Click; btnRemove.Click += _removeButton_Click; //btnGenerate.Click += _generateButton_Click; chkGenerateCrops.CheckedChanged += _generateImagesCheckBox_CheckedChanged; } #if false void _generateButton_Click(object sender, EventArgs e) { Config config = new Config(Configuration); // get list of nodeids with this datatype using (IRecordsReader rdr = SqlHelper.ExecuteReader( "SELECT DISTINCT contentNodeId, " + "(SELECT Alias FROM cmsPropertyType WHERE Id = pd.propertyTypeId) AS propertyAlias " + "FROM cmsPropertyData pd " + "WHERE PropertyTypeId IN (SELECT Id FROM cmsPropertyType WHERE DataTypeId = " + _dataType.DataTypeDefinitionId + ")")) { while (rdr.Read()) { int documentId = rdr.GetInt("contentNodeId"); string propertyAlias = rdr.GetString("propertyAlias"); Document document = new Document(documentId); Property cropProperty = document.getProperty(propertyAlias); Property imageProperty = document.getProperty(config.UploadPropertyAlias); if (cropProperty != null) // && cropProperty.Value.ToString() == "" { ImageInfo imageInfo = new ImageInfo(imageProperty.Value.ToString()); if (imageInfo.Exists) { SaveData saveData = new SaveData(); foreach (Preset preset in config.presets) { Crop crop = preset.Fit(imageInfo); saveData.data.Add(crop); } //cropProperty.Value = saveData.Xml(config, imageInfo); imageInfo.GenerateThumbnails(saveData, config); if (document.Published) { //document.Publish(document.User); //umbraco.library.UpdateDocumentCache(document.Id); } else { //document.Save(); } } } } } } #endif void _generateImagesCheckBox_CheckedChanged(object sender, EventArgs e) { txtQuality.Visible = chkGenerateCrops.Checked; litQuality.Visible = chkGenerateCrops.Checked; } void _upButton_Click(object sender, EventArgs e) { slbPresets.MoveUp(); } void _downButton_Click(object sender, EventArgs e) { slbPresets.MoveDown(); } void _removeButton_Click(object sender, EventArgs e) { for (int i = slbPresets.Items.Count - 1; i >= 0; i--) { if (slbPresets.Items[i].Selected) slbPresets.Items.Remove(slbPresets.Items[i]); } } void _addButton_Click(object sender, EventArgs e) { slbPresets.Items.Add( new ListItem( getListItemDisplayName( txtCropName.Text, txtTargetWidth.Text, txtTargetHeight.Text, chkKeepAspect.Checked ? "1" : "0", String.Concat(ddlDefaultPosH.SelectedValue, ddlDefaultPosV.SelectedValue)), String.Format("{0},{1},{2},{3},{4}", txtCropName.Text, txtTargetWidth.Text, txtTargetHeight.Text, chkKeepAspect.Checked ? "1" : "0", String.Concat(ddlDefaultPosH.SelectedValue, ddlDefaultPosV.SelectedValue)) ) ); txtCropName.Text = ""; txtTargetWidth.Text = ""; txtTargetHeight.Text = ""; chkKeepAspect.Checked = true; } public Control Editor { get { return this; } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (!Page.IsPostBack) LoadData(); } private void LoadData() { if (!string.IsNullOrEmpty(Configuration)) { Config config = new Config(Configuration); txtPropertyAlias.Text = config.UploadPropertyAlias; chkGenerateCrops.Checked = config.GenerateImages; chkShowLabel.Checked = config.ShowLabel; txtQuality.Visible = chkShowLabel.Checked; txtQuality.Text = config.Quality.ToString(); litQuality.Visible = chkShowLabel.Checked; foreach (Preset preset in config.presets) { slbPresets.Items.Add( new ListItem( getListItemDisplayName( preset.Name, preset.TargetWidth.ToString(), preset.TargetHeight.ToString(), preset.KeepAspect ? "1" : "0", String.Concat(preset.PositionH, preset.PositionV)), String.Format("{0},{1},{2},{3},{4}{5}", preset.Name, preset.TargetWidth, preset.TargetHeight, preset.KeepAspect ? "1" : "0", preset.PositionH, preset.PositionV))); } } } private static string getListItemDisplayName(string presetTemplateName, string width, string height, string keepAspect, string position) { return String.Format("{0}, width: {1}px, height: {2}px, keep aspect: {3}, {4}", presetTemplateName, width, height, keepAspect == "1" ? "yes" : "no", position); } /// /// Serialize configuration to: /// uploadPropertyAlias,generateImages,showLabel|presetTemplateName,targetWidth,targetHeight,keepAspect; /// public void Save() { _dataType.DBType = (umbraco.cms.businesslogic.datatype.DBTypes)Enum.Parse( typeof(umbraco.cms.businesslogic.datatype.DBTypes), DBTypes.Ntext.ToString(), true); string generalData = String.Format("{0},{1},{2}", txtPropertyAlias.Text, chkGenerateCrops.Checked ? "1" : "0", chkShowLabel.Checked ? "1" : "0" ); string templateData = ""; for (int i = 0; i < slbPresets.Items.Count; i++) { templateData += slbPresets.Items[i].Value; if (i < slbPresets.Items.Count - 1) templateData += ";"; } string data = String.Format("{0}|{1}", generalData, templateData); SqlHelper.ExecuteNonQuery("delete from cmsDataTypePreValues where datatypenodeid = @dtdefid", SqlHelper.CreateParameter("@dtdefid", _dataType.DataTypeDefinitionId)); SqlHelper.ExecuteNonQuery("insert into cmsDataTypePreValues (datatypenodeid,[value],sortorder,alias) values (@dtdefid,@value,0,'')", SqlHelper.CreateParameter("@dtdefid", _dataType.DataTypeDefinitionId), SqlHelper.CreateParameter("@value", data)); } protected override void Render(HtmlTextWriter writer) { writer.Write("

General

"); writer.Write(""); writer.Write(" "); writer.Write(" "); writer.Write(" "); writer.Write("
Property alias: (eg. 'umbracoFile'):"); txtPropertyAlias.RenderControl(writer); writer.Write("
Save crop images (/media/(imageid)/(filename)_(cropname).jpg):"); chkGenerateCrops.RenderControl(writer); litQuality.RenderControl(writer); txtQuality.RenderControl(writer); writer.Write("
Show Label:"); chkShowLabel.RenderControl(writer); writer.Write("
"); writer.Write("

Crops

"); writer.Write(""); writer.Write(" "); writer.Write("
"); writer.Write(" "); writer.Write(" "); writer.Write(" "); writer.Write(" "); writer.Write(" "); writer.Write(" "); writer.Write("
Name"); txtCropName.RenderControl(writer); writer.Write("
Target width"); txtTargetWidth.RenderControl(writer); writer.Write(" px
Target height"); txtTargetHeight.RenderControl(writer); writer.Write(" px
Default position "); ddlDefaultPosH.RenderControl(writer); writer.Write(" "); ddlDefaultPosV.RenderControl(writer); writer.Write("
Keep aspect"); chkKeepAspect.RenderControl(writer); writer.Write("

"); btnAdd.RenderControl(writer); writer.Write("
  "); slbPresets.RenderControl(writer); writer.Write(" "); btnUp.RenderControl(writer); writer.Write("
"); btnDown.RenderControl(writer); writer.Write("




"); btnRemove.RenderControl(writer); writer.Write("
"); //_generateButton.RenderControl(writer); //_vsErrors.RenderControl(writer); //_revName.RenderControl(writer); } public string Configuration { get { object conf = SqlHelper.ExecuteScalar("select value from cmsDataTypePreValues where datatypenodeid = @datatypenodeid", SqlHelper.CreateParameter("@datatypenodeid", _dataType.DataTypeDefinitionId)); if (conf != null) return conf.ToString(); return string.Empty; } } public static ISqlHelper SqlHelper { get { return Application.SqlHelper; } } } }