| /******************************************************************************* | 
 |  * 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		        2009-10-01 | 
 |  * Jan Källman		License changed GPL-->LGPL 2011-12-16 | 
 |  *******************************************************************************/ | 
 | using System; | 
 | using System.Collections.Generic; | 
 | using System.Globalization; | 
 | using System.Text; | 
 | using System.Xml; | 
 | using OfficeOpenXml.Style.XmlAccess; | 
 | using OfficeOpenXml.Drawing; | 
 | using OfficeOpenXml.Style; | 
 | /// <summary> | 
 | /// Shape style | 
 | /// </summary> | 
 | public enum eShapeStyle | 
 | { | 
 |     AccentBorderCallout1, | 
 |     AccentBorderCallout2, | 
 |     AccentBorderCallout3, | 
 |     AccentCallout1, | 
 |     AccentCallout2, | 
 |     AccentCallout3, | 
 |     ActionButtonBackPrevious, | 
 |     ActionButtonBeginning, | 
 |     ActionButtonBlank, | 
 |     ActionButtonDocument, | 
 |     ActionButtonEnd, | 
 |     ActionButtonForwardNext, | 
 |     ActionButtonHelp, | 
 |     ActionButtonHome, | 
 |     ActionButtonInformation, | 
 |     ActionButtonMovie, | 
 |     ActionButtonReturn, | 
 |     ActionButtonSound, | 
 |     Arc, | 
 |     BentArrow, | 
 |     BentConnector2, | 
 |     BentConnector3, | 
 |     BentConnector4, | 
 |     BentConnector5, | 
 |     BentUpArrow, | 
 |     Bevel, | 
 |     BlockArc, | 
 |     BorderCallout1, | 
 |     BorderCallout2, | 
 |     BorderCallout3, | 
 |     BracePair, | 
 |     BracketPair, | 
 |     Callout1, | 
 |     Callout2, | 
 |     Callout3, | 
 |     Can, | 
 |     ChartPlus, | 
 |     ChartStar, | 
 |     ChartX, | 
 |     Chevron, | 
 |     Chord, | 
 |     CircularArrow, | 
 |     Cloud, | 
 |     CloudCallout, | 
 |     Corner, | 
 |     CornerTabs, | 
 |     Cube, | 
 |     CurvedConnector2, | 
 |     CurvedConnector3, | 
 |     CurvedConnector4, | 
 |     CurvedConnector5, | 
 |     CurvedDownArrow, | 
 |     CurvedLeftArrow, | 
 |     CurvedRightArrow, | 
 |     CurvedUpArrow, | 
 |     Decagon, | 
 |     DiagStripe, | 
 |     Diamond, | 
 |     Dodecagon, | 
 |     Donut, | 
 |     DoubleWave, | 
 |     DownArrow, | 
 |     DownArrowCallout, | 
 |     Ellipse, | 
 |     EllipseRibbon, | 
 |     EllipseRibbon2, | 
 |     FlowChartAlternateProcess, | 
 |     FlowChartCollate, | 
 |     FlowChartConnector, | 
 |     FlowChartDecision, | 
 |     FlowChartDelay, | 
 |     FlowChartDisplay, | 
 |     FlowChartDocument, | 
 |     FlowChartExtract, | 
 |     FlowChartInputOutput, | 
 |     FlowChartInternalStorage, | 
 |     FlowChartMagneticDisk, | 
 |     FlowChartMagneticDrum, | 
 |     FlowChartMagneticTape, | 
 |     FlowChartManualInput, | 
 |     FlowChartManualOperation, | 
 |     FlowChartMerge, | 
 |     FlowChartMultidocument, | 
 |     FlowChartOfflineStorage, | 
 |     FlowChartOffpageConnector, | 
 |     FlowChartOnlineStorage, | 
 |     FlowChartOr, | 
 |     FlowChartPredefinedProcess, | 
 |     FlowChartPreparation, | 
 |     FlowChartProcess, | 
 |     FlowChartPunchedCard, | 
 |     FlowChartPunchedTape, | 
 |     FlowChartSort, | 
 |     FlowChartSummingJunction, | 
 |     FlowChartTerminator, | 
 |     FoldedCorner, | 
 |     Frame, | 
 |     Funnel, | 
 |     Gear6, | 
 |     Gear9, | 
 |     HalfFrame, | 
 |     Heart, | 
 |     Heptagon, | 
 |     Hexagon, | 
 |     HomePlate, | 
 |     HorizontalScroll, | 
 |     IrregularSeal1, | 
 |     IrregularSeal2, | 
 |     LeftArrow, | 
 |     LeftArrowCallout, | 
 |     LeftBrace, | 
 |     LeftBracket, | 
 |     LeftCircularArrow, | 
 |     LeftRightArrow, | 
 |     LeftRightArrowCallout, | 
 |     LeftRightCircularArrow, | 
 |     LeftRightRibbon, | 
 |     LeftRightUpArrow, | 
 |     LeftUpArrow, | 
 |     LightningBolt, | 
 |     Line, | 
 |     LineInv, | 
 |     MathDivide, | 
 |     MathEqual, | 
 |     MathMinus, | 
 |     MathMultiply, | 
 |     MathNotEqual, | 
 |     MathPlus, | 
 |     Moon, | 
 |     NonIsoscelesTrapezoid, | 
 |     NoSmoking, | 
 |     NotchedRightArrow, | 
 |     Octagon, | 
 |     Parallelogram, | 
 |     Pentagon, | 
 |     Pie, | 
 |     PieWedge, | 
 |     Plaque, | 
 |     PlaqueTabs, | 
 |     Plus, | 
 |     QuadArrow, | 
 |     QuadArrowCallout, | 
 |     Rect, | 
 |     Ribbon, | 
 |     Ribbon2, | 
 |     RightArrow, | 
 |     RightArrowCallout, | 
 |     RightBrace, | 
 |     RightBracket, | 
 |     Round1Rect, | 
 |     Round2DiagRect, | 
 |     Round2SameRect, | 
 |     RoundRect, | 
 |     RtTriangle, | 
 |     SmileyFace, | 
 |     Snip1Rect, | 
 |     Snip2DiagRect, | 
 |     Snip2SameRect, | 
 |     SnipRoundRect, | 
 |     SquareTabs, | 
 |     Star10, | 
 |     Star12, | 
 |     Star16, | 
 |     Star24, | 
 |     Star32, | 
 |     Star4, | 
 |     Star5, | 
 |     Star6, | 
 |     Star7, | 
 |     Star8, | 
 |     StraightConnector1, | 
 |     StripedRightArrow, | 
 |     Sun, | 
 |     SwooshArrow, | 
 |     Teardrop, | 
 |     Trapezoid, | 
 |     Triangle, | 
 |     UpArrow, | 
 |     UpArrowCallout, | 
 |     UpDownArrow, | 
 |     UpDownArrowCallout, | 
 |     UturnArrow, | 
 |     Wave, | 
 |     WedgeEllipseCallout, | 
 |     WedgeRectCallout, | 
 |     WedgeRoundRectCallout, | 
 |     VerticalScroll | 
 | } | 
 | /// <summary> | 
 | /// Text alignment | 
 | /// </summary> | 
 | public enum eTextAlignment | 
 | { | 
 |     Left, | 
 |     Center, | 
 |     Right, | 
 |     Distributed, | 
 |     Justified, | 
 |     JustifiedLow, | 
 |     ThaiDistributed | 
 | } | 
 | /// <summary> | 
 | /// Fillstyle. | 
 | /// </summary> | 
 | public enum eFillStyle | 
 | { | 
 |     NoFill, | 
 |     SolidFill, | 
 |     GradientFill, | 
 |     PatternFill, | 
 |     BlipFill, | 
 |     GroupFill | 
 | } | 
 | namespace OfficeOpenXml.Drawing | 
 | { | 
 |     /// <summary> | 
 |     /// An Excel shape. | 
 |     /// </summary> | 
 |     public sealed class ExcelShape : ExcelDrawing | 
 |     { | 
 |         internal ExcelShape(ExcelDrawings drawings, XmlNode node) : | 
 |             base(drawings, node, "xdr:sp/xdr:nvSpPr/xdr:cNvPr/@name") | 
 |         { | 
 |             init(); | 
 |         } | 
 |         internal ExcelShape(ExcelDrawings drawings, XmlNode node, eShapeStyle style) : | 
 |             base(drawings, node, "xdr:sp/xdr:nvSpPr/xdr:cNvPr/@name") | 
 |         { | 
 |             init(); | 
 |             XmlElement shapeNode = node.OwnerDocument.CreateElement("xdr", "sp", ExcelPackage.schemaSheetDrawings); | 
 |             shapeNode.SetAttribute("macro", ""); | 
 |             shapeNode.SetAttribute("textlink", ""); | 
 |             node.AppendChild(shapeNode); | 
 |  | 
 |             shapeNode.InnerXml = ShapeStartXml(); | 
 |             node.AppendChild(shapeNode.OwnerDocument.CreateElement("xdr", "clientData", ExcelPackage.schemaSheetDrawings)); | 
 |         } | 
 |         private void init() | 
 |         { | 
 |             SchemaNodeOrder = new string[] { "prstGeom", "ln", "pPr", "defRPr", "solidFill", "uFill", "latin", "cs", "r", "rPr", "t" }; | 
 |         } | 
 |         #region "public methods" | 
 |         const string ShapeStylePath = "xdr:sp/xdr:spPr/a:prstGeom/@prst"; | 
 |         /// <summary> | 
 |         /// Shape style | 
 |         /// </summary> | 
 |         public eShapeStyle Style | 
 |         { | 
 |             get | 
 |             { | 
 |                 string v = GetXmlNodeString(ShapeStylePath); | 
 |                 try | 
 |                 { | 
 |                     return (eShapeStyle)Enum.Parse(typeof(eShapeStyle), v, true); | 
 |                 } | 
 |                 catch | 
 |                 { | 
 |                     throw (new Exception(string.Format("Invalid shapetype {0}", v))); | 
 |                 } | 
 |             } | 
 |             set | 
 |             { | 
 |                 string v = value.ToString(); | 
 |                 v = v.Substring(0, 1).ToLower(CultureInfo.InvariantCulture) + v.Substring(1, v.Length - 1); | 
 |                 SetXmlNodeString(ShapeStylePath, v); | 
 |             } | 
 |         } | 
 |         ExcelDrawingFill _fill = null; | 
 |         /// <summary> | 
 |         /// Fill | 
 |         /// </summary> | 
 |         public ExcelDrawingFill Fill | 
 |         { | 
 |             get | 
 |             { | 
 |                 if (_fill == null) | 
 |                 { | 
 |                     _fill = new ExcelDrawingFill(NameSpaceManager, TopNode, "xdr:sp/xdr:spPr"); | 
 |                 } | 
 |                 return _fill; | 
 |             } | 
 |         } | 
 |         ExcelDrawingBorder _border = null; | 
 |         /// <summary> | 
 |         /// Border | 
 |         /// </summary> | 
 |         public ExcelDrawingBorder Border         | 
 |         { | 
 |             get | 
 |             { | 
 |                 if (_border == null) | 
 |                 { | 
 |                     _border = new ExcelDrawingBorder(NameSpaceManager, TopNode, "xdr:sp/xdr:spPr/a:ln"); | 
 |                 } | 
 |                 return _border; | 
 |             } | 
 |         } | 
 |         string[] paragraphNodeOrder = new string[] { "pPr", "defRPr", "solidFill", "uFill", "latin", "cs", "r", "rPr", "t" }; | 
 |         const string PARAGRAPH_PATH = "xdr:sp/xdr:txBody/a:p"; | 
 |         ExcelTextFont _font=null; | 
 |         public ExcelTextFont Font | 
 |         { | 
 |             get | 
 |             { | 
 |                 if (_font == null) | 
 |                 { | 
 |                     XmlNode node = TopNode.SelectSingleNode(PARAGRAPH_PATH, NameSpaceManager); | 
 |                     if(node==null) | 
 |                     { | 
 |                         Text="";    //Creates the node p element | 
 |                         node = TopNode.SelectSingleNode(PARAGRAPH_PATH, NameSpaceManager); | 
 |                     } | 
 |                     _font = new ExcelTextFont(NameSpaceManager, TopNode, "xdr:sp/xdr:txBody/a:p/a:pPr/a:defRPr", paragraphNodeOrder); | 
 |                 } | 
 |                 return _font; | 
 |             } | 
 |         } | 
 |         const string TextPath = "xdr:sp/xdr:txBody/a:p/a:r/a:t"; | 
 |         /// <summary> | 
 |         /// Text inside the shape | 
 |         /// </summary> | 
 |         public string Text | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetXmlNodeString(TextPath); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetXmlNodeString(TextPath, value); | 
 |             } | 
 |  | 
 |         } | 
 |         string lockTextPath = "xdr:sp/@fLocksText"; | 
 |         /// <summary> | 
 |         /// Lock drawing | 
 |         /// </summary> | 
 |         public bool LockText | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetXmlNodeBool(lockTextPath, true); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetXmlNodeBool(lockTextPath, value); | 
 |             } | 
 |         } | 
 |         ExcelParagraphCollection _richText = null; | 
 |         /// <summary> | 
 |         /// Richtext collection. Used to format specific parts of the text | 
 |         /// </summary> | 
 |         public ExcelParagraphCollection RichText | 
 |         { | 
 |             get | 
 |             { | 
 |                 if (_richText == null) | 
 |                 { | 
 |                     //XmlNode node=TopNode.SelectSingleNode(PARAGRAPH_PATH, NameSpaceManager); | 
 |                     //if (node == null) | 
 |                     //{ | 
 |                     //    CreateNode(PARAGRAPH_PATH); | 
 |                     //} | 
 |                         _richText = new ExcelParagraphCollection(NameSpaceManager, TopNode, PARAGRAPH_PATH, paragraphNodeOrder); | 
 |                 } | 
 |                 return _richText; | 
 |             } | 
 |         } | 
 |         const string TextAnchoringPath = "xdr:sp/xdr:txBody/a:bodyPr/@anchor"; | 
 |         /// <summary> | 
 |         /// Text Anchoring | 
 |         /// </summary> | 
 |         public eTextAnchoringType TextAnchoring | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetTextAchoringEnum(GetXmlNodeString(TextAnchoringPath)); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetXmlNodeString(TextAnchoringPath, GetTextAchoringText(value)); | 
 |             } | 
 |         } | 
 |         const string TextAnchoringCtlPath = "xdr:sp/xdr:txBody/a:bodyPr/@anchorCtr"; | 
 |         /// <summary> | 
 |         /// Specifies the centering of the text box. | 
 |         /// </summary> | 
 |         public bool TextAnchoringControl | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetXmlNodeBool(TextAnchoringCtlPath); | 
 |             } | 
 |             set | 
 |             { | 
 |                 if (value) | 
 |                 { | 
 |                     SetXmlNodeString(TextAnchoringCtlPath, "1"); | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     SetXmlNodeString(TextAnchoringCtlPath, "0"); | 
 |                 } | 
 |             } | 
 |         } | 
 |         const string TEXT_ALIGN_PATH = "xdr:sp/xdr:txBody/a:p/a:pPr/@algn"; | 
 |         /// <summary> | 
 |         /// How the text is aligned | 
 |         /// </summary> | 
 |         public eTextAlignment TextAlignment | 
 |         { | 
 |             get | 
 |             { | 
 |                switch(GetXmlNodeString(TEXT_ALIGN_PATH)) | 
 |                { | 
 |                    case "ctr": | 
 |                        return eTextAlignment.Center; | 
 |                    case "r": | 
 |                        return eTextAlignment.Right; | 
 |                    case "dist": | 
 |                        return eTextAlignment.Distributed; | 
 |                    case "just": | 
 |                        return eTextAlignment.Justified; | 
 |                    case "justLow": | 
 |                        return eTextAlignment.JustifiedLow; | 
 |                    case "thaiDist": | 
 |                        return eTextAlignment.ThaiDistributed; | 
 |                    default:  | 
 |                        return eTextAlignment.Left; | 
 |                } | 
 |             } | 
 |             set | 
 |             { | 
 |                 switch (value) | 
 |                 { | 
 |                     case eTextAlignment.Right: | 
 |                         SetXmlNodeString(TEXT_ALIGN_PATH, "r"); | 
 |                         break; | 
 |                     case eTextAlignment.Center: | 
 |                         SetXmlNodeString(TEXT_ALIGN_PATH, "ctr"); | 
 |                         break; | 
 |                     case eTextAlignment.Distributed: | 
 |                         SetXmlNodeString(TEXT_ALIGN_PATH, "dist"); | 
 |                         break; | 
 |                     case eTextAlignment.Justified: | 
 |                         SetXmlNodeString(TEXT_ALIGN_PATH, "just"); | 
 |                         break; | 
 |                     case eTextAlignment.JustifiedLow: | 
 |                         SetXmlNodeString(TEXT_ALIGN_PATH, "justLow"); | 
 |                         break; | 
 |                     case eTextAlignment.ThaiDistributed: | 
 |                         SetXmlNodeString(TEXT_ALIGN_PATH, "thaiDist"); | 
 |                         break; | 
 |                     default: | 
 |                         DeleteNode(TEXT_ALIGN_PATH); | 
 |                         break; | 
 |                 }                 | 
 |             } | 
 |         } | 
 |         const string INDENT_ALIGN_PATH = "xdr:sp/xdr:txBody/a:p/a:pPr/@lvl"; | 
 |         /// <summary> | 
 |         /// Indentation | 
 |         /// </summary> | 
 |         public int Indent | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetXmlNodeInt(INDENT_ALIGN_PATH); | 
 |             } | 
 |             set | 
 |             { | 
 |                 if (value < 0 || value > 8) | 
 |                 { | 
 |                     throw(new ArgumentOutOfRangeException("Indent level must be between 0 and 8")); | 
 |                 } | 
 |                 SetXmlNodeString(INDENT_ALIGN_PATH, value.ToString()); | 
 |             } | 
 |         } | 
 |         const string TextVerticalPath = "xdr:sp/xdr:txBody/a:bodyPr/@vert"; | 
 |         /// <summary> | 
 |         /// Vertical text | 
 |         /// </summary> | 
 |         public eTextVerticalType TextVertical | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetTextVerticalEnum(GetXmlNodeString(TextVerticalPath)); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetXmlNodeString(TextVerticalPath, GetTextVerticalText(value)); | 
 |             } | 
 |         } | 
 |  | 
 |         #endregion | 
 |         #region "Private Methods" | 
 |         private string ShapeStartXml() | 
 |         { | 
 |             StringBuilder xml = new StringBuilder(); | 
 |             xml.AppendFormat("<xdr:nvSpPr><xdr:cNvPr id=\"{0}\" name=\"{1}\" /><xdr:cNvSpPr /></xdr:nvSpPr><xdr:spPr><a:prstGeom prst=\"rect\"><a:avLst /></a:prstGeom></xdr:spPr><xdr:style><a:lnRef idx=\"2\"><a:schemeClr val=\"accent1\"><a:shade val=\"50000\" /></a:schemeClr></a:lnRef><a:fillRef idx=\"1\"><a:schemeClr val=\"accent1\" /></a:fillRef><a:effectRef idx=\"0\"><a:schemeClr val=\"accent1\" /></a:effectRef><a:fontRef idx=\"minor\"><a:schemeClr val=\"lt1\" /></a:fontRef></xdr:style><xdr:txBody><a:bodyPr vertOverflow=\"clip\" rtlCol=\"0\" anchor=\"ctr\" /><a:lstStyle /><a:p></a:p></xdr:txBody>", _id, Name); | 
 |             return xml.ToString(); | 
 |         } | 
 |         #endregion | 
 |         internal new string Id | 
 |         { | 
 |             get { return Name + Text; } | 
 |         } | 
 |     } | 
 | } |