Пример #1
0
		private void WritePenElement(System.Xml.XmlWriter writer,
			FlowChartX.Pen pen, string element, SortedList brushes)
		{
			if(pen == null)
				return;

			writer.WriteStartElement(element);

			if(pen.Brush != null)
			{
				int bi = brushes.IndexOfValue(pen.Brush);

				writer.WriteStartElement("Brush");
				writer.WriteAttributeString("Id",
					XmlConvert.FromInt32((int)brushes.GetKey(bi)));
				writer.WriteEndElement();
			}

			writer.WriteElementString("Color",
				XmlConvert.FromColor(pen.Color));

			if(pen.CompoundArray != null)
			{
				WriteFloatArrayElement(writer, pen.CompoundArray,
					"CompoundArray", "Pos");
			}

			writer.WriteElementString("DashOffset",
				XmlConvert.FromSingle(pen.DashOffset));

			if(pen.DashPattern != null)
			{
				WriteFloatArrayElement(writer, pen.DashPattern,
					"DashPattern", "Pos");
			}

			writer.WriteElementString("DashStyle",
				pen.DashStyle.ToString());

			writer.WriteElementString("LineJoint",
				pen.LineJoin.ToString());

			writer.WriteElementString("MiterLimit",
				XmlConvert.FromSingle(pen.MiterLimit));

			writer.WriteElementString("Width",
				XmlConvert.FromSingle(pen.Width));

			writer.WriteEndElement();
		}
Пример #2
0
		private void WriteBrushRefElement(System.Xml.XmlWriter writer,
			FlowChartX.Brush brush, string element, SortedList brushes)
		{
			writer.WriteStartElement(element);
			if(brush != null)
			{
				int bi = brushes.IndexOfValue(brush);

				writer.WriteAttributeString("Id",
					XmlConvert.FromInt32((int)brushes.GetKey(bi)));
			}
			else
			{
				writer.WriteAttributeString("Id", "-1");
			}
			writer.WriteEndElement();
		}
Пример #3
0
		private void WriteBrushElement(System.Xml.XmlWriter writer,
			FlowChartX.Brush brush, SortedList brushes)
		{
			if(brush == null)
				return;

			int ix = brushes.IndexOfValue(brush);
			if(ix < 0)
				throw new Exception(
					"Brush not found in the brush list!");

			writer.WriteStartElement("Brush");
			writer.WriteAttributeString("Id",
				XmlConvert.FromInt32((int)brushes.GetKey(ix)));

			if(brush.GetType().Equals(typeof(FlowChartX.SolidBrush)))
			{
				FlowChartX.SolidBrush bb =
					(FlowChartX.SolidBrush)brush;

				writer.WriteAttributeString("Type", "Solid");

				writer.WriteElementString("Color",
					XmlConvert.FromColor(bb.Color));
			}
			else if(brush.GetType().Equals(typeof(FlowChartX.HatchBrush)))
			{
				FlowChartX.HatchBrush bb =
					(FlowChartX.HatchBrush)brush;

				writer.WriteAttributeString("Type", "Hatch");

				writer.WriteElementString("ForeColor",
					XmlConvert.FromColor(bb.ForegroundColor));
				writer.WriteElementString("BackColor",
					XmlConvert.FromColor(bb.BackgroundColor));
				writer.WriteElementString("Style",
					bb.HatchStyle.ToString());
			}
			else if(brush.GetType().Equals(typeof(FlowChartX.LinearGradientBrush)))
			{
				FlowChartX.LinearGradientBrush bb =
					(FlowChartX.LinearGradientBrush)brush;

				writer.WriteAttributeString("Type", "Gradient");

				// Write angle
				writer.WriteElementString("Angle",
					XmlConvert.FromSingle(bb.Angle));

				// Write blend pattern
				if(bb.Blend != null)
				{
					writer.WriteStartElement("Blend");

					WriteFloatArrayElement(writer, bb.Blend.Positions,
						"Positions", "Pos");
					WriteFloatArrayElement(writer, bb.Blend.Factors,
						"Factors", "Fac");

					writer.WriteEndElement();
				}

				// Write linear colors
				writer.WriteElementString("Color1",
					XmlConvert.FromColor(bb.LinearColors[0]));
				writer.WriteElementString("Color2",
					XmlConvert.FromColor(bb.LinearColors[1]));

				// Write interpolation colors
				if(bb.InterpolationColor != null)
				{
					writer.WriteStartElement("ColorBlend");

					WriteFloatArrayElement(writer, bb.InterpolationColor.Positions,
						"Positions", "Pos");
					writer.WriteStartElement("Colors");
					writer.WriteAttributeString("Count",
						XmlConvert.FromInt32(bb.InterpolationColor.Colors.Length));
					for(int j = 0; j < bb.InterpolationColor.Colors.Length; j++)
					{
						Color c = (Color)
							bb.InterpolationColor.Colors.GetValue(j);
						writer.WriteElementString("Color",
							XmlConvert.FromColor(c));
					}
					writer.WriteEndElement();

					writer.WriteEndElement();
				}
			}
			else if(brush.GetType().Equals(typeof(FlowChartX.TextureBrush)))
			{
				FlowChartX.TextureBrush bb =
					(FlowChartX.TextureBrush)brush;

				writer.WriteAttributeString("Type", "Texture");

				writer.WriteElementString("WrapMode",
					bb.WrapMode.ToString());
				writer.WriteElementString("Image",
					Version >= 4 ? XmlConvert.FromImageV4(bb.Image) :
						XmlConvert.FromImage(bb.Image));
			}

			writer.WriteEndElement();
		}
Пример #4
0
		private bool AddBox(RectangleF rect, long ItemID, float RotationAngle, float ShapeOrientation, Image Picture ,
			Color FillColor, Color FrameColor, Color TextColor, Font ShapeFont, bool Transparent,
			FlowChartX.Pen ItemPen, FlowChartX.Brush ItemBrush, bool IsStyled, string ItemText, 
			BoxStyle ItemStyle, FlowChartX.ShapeTemplate ItemTemplate,
			RectangleF rectGroup, bool IsGroup, StringAlignment sa)
		{
			bool bOk = false, bPicture = false, NoDimChanges = false;
			double lLeft = 0,	lRight = 0,	lTop = 0, lBottom =	0, lW =	0, lH =	0, 
				lLeftG = 0,lRightG = 0,lTopG = 0, lBottomG =0,lWG = 0, lHG =0, fTemp = 0;
			string sTemp = null, sImg = null;
			XmlNode node_temp = null;


			try
			{
				// Inserting new Box
				if ( rectGroup != RectangleF.Empty)
				{
					sTemp = String.Format("vdx:Shape[@ID='{0}']", ItemID );
					shapeNew = shapeRoot.SelectSingleNode(sTemp, ns);
					if ( shapeNew == null )
						shapeNew = groupLast.InsertAfter( shapeTemplate.Clone(),  groupLast.LastChild );
					else
						NoDimChanges = true;
				}
				else
				{
					if (IsGroup) // If the box is main group's frame
					{
						
						shapeNew = shapeRoot.InsertAfter( shapeTemplate.Clone(), shapeRoot.LastChild);
					}
					else
						shapeNew = shapeRoot.InsertAfter( shapeTemplate.Clone(), shapeLast);
				}
				
				if ( shapeNew == null )
					return false;

				// If group is added then creating <Shapes> sub-tree

				
				/*
				 * 
				 * ROTATION
				 * 
				 */
				
				if ( RotationAngle!=0 )
				{
				
					float fAngle = RotationAngle + ShapeOrientation;
					int iSign = ( fAngle<180 ) ? -1 : 1;
					float fAngle2 = ( fAngle<180 ) ? fAngle : 360 - fAngle;

					sTemp =  String.Format("{0}", iSign*Math.PI*(fAngle2/180));
					sTemp = sTemp.Replace(sSeparator, ".");
					SetShapeAttr("vdx:XForm/vdx:Angle","",shapeNew, sTemp);
					RemoveNode(shapeNew.SelectSingleNode("vdx:XForm/vdx:Angle", ns),"F",false);

				}

				if (IsGroup)
				{
					node_temp = shapeNew.InsertAfter(doc.CreateNode(XmlNodeType.Element,"Shapes","http://schemas.microsoft.com/visio/2003/core"), shapeNew.LastChild);
					if ( node_temp == null )
						return false;

					groupLast = node_temp;
				}

				// Setting shape's ID & unique GUID
				if ( rectGroup == RectangleF.Empty)
					shapeLast = shapeNew;

				shapeNew.Attributes["ID"].Value = ItemID.ToString();
			
				sTemp = GetGUID();
				if ( sTemp != null )
				{
					shapeNew.Attributes["UniqueID"].Value = sTemp;
				}	
				lLeft = rect.Left;
				lRight =  rect.Right;
				lTop =  rect.Top;
				lBottom = rect.Bottom;
				lW = rect.Width;
				lH = rect.Height;

				if (( ShapeOrientation == 90 )|| (ShapeOrientation == 270 ))
				{
					double lTemp = lW;
					lW = lH;
					lH = lTemp;
				}

				if ( Picture != null )
				{
					bPicture = true;
					sImg = Image2String(Picture);
					
				}

				if (rectGroup!=RectangleF.Empty )
				{
					lLeftG = rectGroup.Left;
					lRightG = rectGroup.Right;
					lTopG =  rectGroup.Top;
					lBottomG = rectGroup.Bottom;
					lWG = rectGroup.Width;
					lHG = rectGroup.Height;
					
					lLeft = lLeft - ( lLeftG );
					lTop = lTop - lTopG + lDocY  - lHG;
				}

				if (!IsGroup)
				{
					if ( bPicture )
					{
						// If the box is picture container
						// If box is PICTURE or OLE Control

						RemoveNode(shapeNew, "vdx:LayerMem", true);
						RemoveNode(shapeNew, "vdx:Event", true);
						RemoveNode(shapeNew, "vdx:Char", true);
						RemoveNode(shapeNew, "vdx:Text", true);
						RemoveNode(shapeNew, "vdx:Line", true);
						RemoveNode(shapeNew, "vdx:Fill", true);
						RemoveNode(shapeNew, "vdx:Misc", true);
						RemoveNode(shapeNew, "vdx:Group", true);
						RemoveNode(shapeNew, "Master", false);
						
						shapeNew.Attributes["NameU"].Value =  String.Format("Foreign.{0}", ItemID);
						shapeNew.Attributes["Name"].Value =  String.Format("Foreign.{0}", ItemID);
						shapeNew.Attributes["Type"].Value =  "Foreign";
						
						shapeNew.SelectSingleNode("vdx:XForm/vdx:LocPinX", ns).Attributes.RemoveNamedItem("F");
						shapeNew.SelectSingleNode("vdx:XForm/vdx:LocPinY", ns).Attributes.RemoveNamedItem("F");
					
						node_temp = shapeNew.SelectSingleNode("vdx:XForm", ns);

						if ( node_temp!=null)
						{
							XmlNode foregin_node = shapeNew.InsertAfter(doc.CreateNode(XmlNodeType.Element,"Foreign","http://schemas.microsoft.com/visio/2003/core"), node_temp);
							if ( foregin_node!=null)
							{
								XmlNode first_node = null, second_node = null;
								first_node = foregin_node.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ImgOffsetX","http://schemas.microsoft.com/visio/2003/core"), first_node);
								second_node = foregin_node.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ImgOffsetY","http://schemas.microsoft.com/visio/2003/core"), first_node);
								second_node = foregin_node.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ImgWidth","http://schemas.microsoft.com/visio/2003/core"), second_node);
								second_node = foregin_node.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ImgHeight","http://schemas.microsoft.com/visio/2003/core"), second_node);
								SetShapeDim(shapeNew, "vdx:Foreign/vdx:ImgOffsetX", 0 , false);
								SetShapeDim(shapeNew, "vdx:Foreign/vdx:ImgOffsetY", 0, false);
								SetShapeDim(shapeNew, "vdx:Foreign/vdx:ImgWidth", lW , false);
								SetShapeDim(shapeNew, "vdx:Foreign/vdx:ImgHeight", lH, false);
							}

							XmlNode foregin_data_node = shapeNew.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ForeignData","http://schemas.microsoft.com/visio/2003/core"), foregin_node);
							if ( foregin_data_node!=null)
							{
								SetShapeAttr("", "ForeignType",foregin_data_node, "Bitmap");
								foregin_data_node.InnerText = sImg;
																
							}
						}

					
					}
					else
					{
						// If the box is regular					
						sTemp= SetMasterID(shapeNew,ItemTemplate, ItemStyle, ItemID);
						if (!NoDimChanges)
							RemoveNode(shapeNew, "vdx:Group", true);
					}

				}
				else
				{
					// If the box is a main group object

					SetShapeAttr("vdx:Misc/vdx:ObjType","", shapeNew, "8");
					SetShapeAttr("","Type", shapeNew, "Group");

					RemoveNode(shapeNew, "vdx:LayerMem", true);
					RemoveNode(shapeNew, "vdx:Event", true);
					//RemoveNode(shapeNew, "vdx:Char", true);
					//RemoveNode(shapeNew, "vdx:Text", true);
					//RemoveNode(shapeNew, "vdx:Line", true);
					//RemoveNode(shapeNew, "vdx:Fill", true);
					RemoveNode(shapeNew, "vdx:Foreign", true);
					RemoveNode(shapeNew, "vdx:ForeignData", true);
					RemoveNode(shapeNew, "Master", false);
					RemoveNode(shapeNew, "NameU", false);
					RemoveNode(shapeNew, "Name", false);
					sTemp = SetMasterID(shapeNew,ItemTemplate, ItemStyle, ItemID);
					
				}
				
				// Setting shape's dimensions for Visio	XML	nodes
				if (!NoDimChanges)
				{
					SetShapeDim(shapeNew, "vdx:XForm/vdx:PinX", lLeft + lW/2,  true);
					SetShapeDim(shapeNew, "vdx:XForm/vdx:PinY", (lDocY - ( lTop + lH/2)),  true);
					SetShapeDim(shapeNew, "vdx:XForm/vdx:Width",	 lW ,  true);
					SetShapeDim(shapeNew, "vdx:XForm/vdx:Height", lH,  true) ; 
					SetShapeDim(shapeNew, "vdx:XForm/vdx:LocPinX", lW/2 ,  true );
					SetShapeDim(shapeNew, "vdx:XForm/vdx:LocPinY", lH/2 ,  true);
				}

				if ( bPicture )
					return true;

				// Getting font's parameters

				if (ShapeFont == null)
					ShapeFont = pChart.Font;

				SetShapeFont(shapeNew, ShapeFont);

				// Setting shape elements colors
				
				SetShapeColor(shapeNew, "vdx:Fill/vdx:FillForegnd", FillColor);
				
				
				if ( ItemBrush is MindFusion.FlowChartX.LinearGradientBrush )
				{
					SetShapeColor(shapeNew, "vdx:Fill/vdx:FillBkgnd", 
						(ItemBrush as MindFusion.FlowChartX.LinearGradientBrush).LinearColors[1]);
					SetShapeAttr("vdx:Fill/vdx:FillPattern","", shapeNew, "36");
				}
				

				SetShapeColor(shapeNew, "vdx:Char/vdx:Color", TextColor);
				SetShapeColor(shapeNew, "vdx:Line/vdx:LineColor",FrameColor	);

				// Getting shape's transparency	level
				if (Transparent)
				{
					SetShapeAttr("vdx:Fill/vdx:FillForegndTrans","",shapeNew, "1");
					SetShapeAttr("vdx:Line/vdx:LineColorTrans","",shapeNew, "1");
					SetShapeAttr("vdx:Fill/vdx:FillPattern","", shapeNew, "0");
				}
				else
				{
					if (( FillColor == Color.Transparent ) || ( FillColor.A == 0 ))
					{
						SetShapeAttr("vdx:Fill/vdx:FillForegndTrans","",shapeNew, "1");
						SetShapeAttr("vdx:Fill/vdx:FillPattern","", shapeNew, "0");
					}
					else
					{
						fTemp  = (1 - FillColor.A)/ 255;
						sTemp = String.Format("{0}", fTemp);
						SetShapeAttr("vdx:Fill/vdx:FillForegndTrans","",shapeNew, sTemp);
					}
					
					if ( FrameColor == Color.Transparent )
					{
						SetShapeAttr("vdx:Line/vdx:LineColorTrans","",shapeNew, "1");
					}	
						
					
				}
		
				// Setting shape's text
				SetText(shapeNew, ItemText, IsStyled , ShapeFont, sa);

				// Getting line	width & pattern
		
				fTemp =  ItemPen.Width / PixPerInch;
				sTemp = String.Format("{0}", fTemp);
				sTemp = sTemp.Replace(sSeparator, ".");
				SetShapeAttr("vdx:Line/vdx:LineWeight","",shapeNew, sTemp);
				SetShapeAttr("vdx:Line/vdx:LinePattern","",shapeNew, DashStyle2String(ItemPen.DashStyle));

				bOk = true;
			}
			catch ( Exception ex )
			{
				Trace.WriteLine(String.Format("Box#{2}({3}) {0} error {1}\n","AddBox",ex.Message, ItemID, ItemText));
				bOk = false;
			}

			return bOk;
		
		}