| /******************************************************************************* |
| * You may amend and distribute as you like, but don't remove this header! |
| * |
| * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets. |
| * See http://www.codeplex.com/EPPlus for details. |
| * |
| * Copyright (C) 2011 Jan Källman |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| * See the GNU Lesser General Public License for more details. |
| * |
| * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php |
| * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html |
| * |
| * All code and executables are provided "as is" with no warranty either express or implied. |
| * The author accepts no liability for any damage or loss of business that this product may cause. |
| * |
| * Code change notes: |
| * |
| * Author Change Date |
| * ****************************************************************************** |
| * Jan Källman Initial Release 2010-06-01 |
| * Jan Källman License changed GPL-->LGPL 2011-12-16 |
| *******************************************************************************/ |
| using System; |
| using System.Collections.Generic; |
| using System.Text; |
| using System.Xml; |
| using System.Globalization; |
| using System.Drawing; |
| |
| |
| namespace OfficeOpenXml.Drawing.Vml |
| { |
| /// <summary> |
| /// Drawing object used for header and footer pictures |
| /// </summary> |
| public class ExcelVmlDrawingPicture : ExcelVmlDrawingBase |
| { |
| ExcelWorksheet _worksheet; |
| internal ExcelVmlDrawingPicture(XmlNode topNode, XmlNamespaceManager ns, ExcelWorksheet ws) : |
| base(topNode, ns) |
| { |
| _worksheet = ws; |
| } |
| /// <summary> |
| /// Position ID |
| /// </summary> |
| public string Position |
| { |
| get |
| { |
| return GetXmlNodeString("@id"); |
| } |
| } |
| /// <summary> |
| /// The width in points |
| /// </summary> |
| public double Width |
| { |
| get |
| { |
| return GetStyleProp("width"); |
| } |
| set |
| { |
| SetStyleProp("width",value.ToString(CultureInfo.InvariantCulture) + "pt"); |
| } |
| } |
| /// <summary> |
| /// The height in points |
| /// </summary> |
| public double Height |
| { |
| get |
| { |
| return GetStyleProp("height"); |
| } |
| set |
| { |
| SetStyleProp("height", value.ToString(CultureInfo.InvariantCulture) + "pt"); |
| } |
| } |
| /// <summary> |
| /// Margin Left in points |
| /// </summary> |
| public double Left |
| { |
| get |
| { |
| return GetStyleProp("left"); |
| } |
| set |
| { |
| SetStyleProp("left", value.ToString(CultureInfo.InvariantCulture)); |
| } |
| } |
| /// <summary> |
| /// Margin top in points |
| /// </summary> |
| public double Top |
| { |
| get |
| { |
| return GetStyleProp("top"); |
| } |
| set |
| { |
| SetStyleProp("top", value.ToString(CultureInfo.InvariantCulture)); |
| } |
| } |
| /// <summary> |
| /// The Title of the image |
| /// </summary> |
| public string Title |
| { |
| get |
| { |
| return GetXmlNodeString("v:imagedata/@o:title"); |
| } |
| set |
| { |
| SetXmlNodeString("v:imagedata/@o:title",value); |
| } |
| } |
| /// <summary> |
| /// The image |
| /// </summary> |
| public Image Image |
| { |
| get |
| { |
| var pck = _worksheet._package.Package; |
| if (pck.PartExists(ImageUri)) |
| { |
| var part = pck.GetPart(ImageUri); |
| return Image.FromStream(part.GetStream()); |
| } |
| else |
| { |
| return null; |
| } |
| } |
| } |
| internal Uri ImageUri |
| { |
| get; |
| set; |
| } |
| internal string RelId |
| { |
| get |
| { |
| return GetXmlNodeString("v:imagedata/@o:relid"); |
| } |
| set |
| { |
| SetXmlNodeString("v:imagedata/@o:relid",value); |
| } |
| } |
| /// <summary> |
| /// Determines whether an image will be displayed in black and white |
| /// </summary> |
| public bool BiLevel |
| { |
| get |
| { |
| return GetXmlNodeString("v:imagedata/@bilevel")=="t"; |
| } |
| set |
| { |
| if (value) |
| { |
| SetXmlNodeString("v:imagedata/@bilevel", "t"); |
| } |
| else |
| { |
| DeleteNode("v:imagedata/@bilevel"); |
| } |
| } |
| } |
| /// <summary> |
| /// Determines whether a picture will be displayed in grayscale mode |
| /// </summary> |
| public bool GrayScale |
| { |
| get |
| { |
| return GetXmlNodeString("v:imagedata/@grayscale")=="t"; |
| } |
| set |
| { |
| if (value) |
| { |
| SetXmlNodeString("v:imagedata/@grayscale", "t"); |
| } |
| else |
| { |
| DeleteNode("v:imagedata/@grayscale"); |
| } |
| } |
| } |
| /// <summary> |
| /// Defines the intensity of all colors in an image |
| /// Default value is 1 |
| /// </summary> |
| public double Gain |
| { |
| get |
| { |
| string v = GetXmlNodeString("v:imagedata/@gain"); |
| return GetFracDT(v,1); |
| } |
| set |
| { |
| if (value < 0) |
| { |
| throw (new ArgumentOutOfRangeException("Value must be positive")); |
| } |
| if (value == 1) |
| { |
| DeleteNode("v:imagedata/@gamma"); |
| } |
| else |
| { |
| SetXmlNodeString("v:imagedata/@gain", value.ToString("#.0#", CultureInfo.InvariantCulture)); |
| } |
| } |
| } |
| /// <summary> |
| /// Defines the amount of contrast for an image |
| /// Default value is 0; |
| /// </summary> |
| public double Gamma |
| { |
| get |
| { |
| string v = GetXmlNodeString("v:imagedata/@gamma"); |
| return GetFracDT(v,0); |
| } |
| set |
| { |
| if (value == 0) //Default |
| { |
| DeleteNode("v:imagedata/@gamma"); |
| } |
| else |
| { |
| SetXmlNodeString("v:imagedata/@gamma", value.ToString("#.0#", CultureInfo.InvariantCulture)); |
| } |
| } |
| } |
| /// <summary> |
| /// Defines the intensity of black in an image |
| /// Default value is 0 |
| /// </summary> |
| public double BlackLevel |
| { |
| get |
| { |
| string v = GetXmlNodeString("v:imagedata/@blacklevel"); |
| return GetFracDT(v, 0); |
| } |
| set |
| { |
| if (value == 0) |
| { |
| DeleteNode("v:imagedata/@blacklevel"); |
| } |
| else |
| { |
| SetXmlNodeString("v:imagedata/@blacklevel", value.ToString("#.0#", CultureInfo.InvariantCulture)); |
| } |
| } |
| } |
| |
| #region Private Methods |
| private double GetFracDT(string v, double def) |
| { |
| double d; |
| if (v.EndsWith("f")) |
| { |
| v = v.Substring(0, v.Length - 1); |
| if (double.TryParse(v, out d)) |
| { |
| d /= 65535; |
| } |
| else |
| { |
| d = def; |
| } |
| } |
| else |
| { |
| if (!double.TryParse(v, out d)) |
| { |
| d = def; |
| } |
| } |
| return d; |
| } |
| private void SetStyleProp(string propertyName, string value) |
| { |
| string style = GetXmlNodeString("@style"); |
| string newStyle = ""; |
| bool found = false; |
| foreach (string prop in style.Split(';')) |
| { |
| string[] split = prop.Split(':'); |
| if (split[0] == propertyName) |
| { |
| newStyle += propertyName + ":" + value + ";"; |
| found = true; |
| } |
| else |
| { |
| newStyle += prop + ";"; |
| } |
| } |
| if (!found) |
| { |
| newStyle += propertyName + ":" + value + ";"; |
| } |
| SetXmlNodeString("@style", newStyle.Substring(0, newStyle.Length - 1)); |
| } |
| private double GetStyleProp(string propertyName) |
| { |
| string style = GetXmlNodeString("@style"); |
| foreach (string prop in style.Split(';')) |
| { |
| string[] split = prop.Split(':'); |
| if (split[0] == propertyName && split.Length > 1) |
| { |
| string value = split[1].EndsWith("pt") ? split[1].Substring(0, split[1].Length - 2) : split[1]; |
| double ret; |
| if (double.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out ret)) |
| { |
| return ret; |
| } |
| else |
| { |
| return 0; |
| } |
| } |
| } |
| return 0; |
| } |
| #endregion |
| } |
| } |