509 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			509 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
 | ||
| using DrawGraph;
 | ||
| using Newtonsoft.Json;
 | ||
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.Configuration;
 | ||
| using System.Drawing;
 | ||
| using System.Linq;
 | ||
| 
 | ||
| namespace DrawGraph
 | ||
| {
 | ||
|     [JsonObject(MemberSerialization.OptOut)]
 | ||
|     [Serializable]
 | ||
|     public class TextsPackObj : PackObjBase
 | ||
|     {
 | ||
|         private float fontSize = 8f;
 | ||
| 
 | ||
|         private Color fontColor = Color.Black;
 | ||
| 
 | ||
|         private ELineType isHorizontal = ELineType.Horizontal;
 | ||
| 
 | ||
|         private EIsBool isUnderline = EIsBool.False;
 | ||
| 
 | ||
|         private bool underline = false;
 | ||
| 
 | ||
|         private int angle = 0;
 | ||
| 
 | ||
|         private EIsBool isBool = EIsBool.False;
 | ||
| 
 | ||
|         private int unit = 1;
 | ||
| 
 | ||
|         private EIsBool isTop = EIsBool.True;
 | ||
| 
 | ||
|         private string controlTitleText = "";
 | ||
| 
 | ||
|         private float rowSpan = 0f;
 | ||
| 
 | ||
|         private EIsBool isViewBoard = EIsBool.False;
 | ||
| 
 | ||
|         private EAlignType alignType = EAlignType.Left;
 | ||
| 
 | ||
|         private EIsBool isMultiline = EIsBool.False;
 | ||
| 
 | ||
|         [ClassAttributs(CName = "旋转角度", Description = "旋转角度")]
 | ||
|         public int Angle
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.angle;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.angle = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "下划线", Description = "显示下划线")]
 | ||
|         public EIsBool IsUnderline
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.isUnderline;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.isUnderline = value;
 | ||
|                 bool flag = this.isUnderline == EIsBool.True;
 | ||
|                 if (flag)
 | ||
|                 {
 | ||
|                     this.underline = true;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "横向画", Description = "是否横向画")]
 | ||
|         public ELineType IsHorizontal
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.isHorizontal;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.isHorizontal = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "文本字体", Description = "字体大小")]
 | ||
|         public float FontSize
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.fontSize;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 bool flag = value > 2f && value < 24f;
 | ||
|                 if (flag)
 | ||
|                 {
 | ||
|                     this.fontSize = value;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "下换行", Description = "多行时,换行向下画,反之向上画")]
 | ||
|         public EIsBool IsTop
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.isTop;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.isTop = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "前景色", Description = "前景色")]
 | ||
|         public Color FontColor
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.fontColor;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.fontColor = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "格式化文本", Description = "格式化字符串的样式")]
 | ||
|         public string ControlTitleText
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.controlTitleText.Trim();
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.controlTitleText = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "加粗")]
 | ||
|         public EIsBool IsBool
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.isBool;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.isBool = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "一行几个组件", Description = "最大单元数,文本框时:是有多少行;单选框或复选框:是一行放几个控件")]
 | ||
|         public int Unit
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.unit;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.unit = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "行间距", Description = "行间距,值为0-1之间的值")]
 | ||
|         public float RowSpan
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.rowSpan;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.rowSpan = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "显示边框", Description = "是否显示边框")]
 | ||
|         public EIsBool IsViewBoard
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.isViewBoard;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.isViewBoard = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "文本对齐", Description = "文本对齐方式")]
 | ||
|         public EAlignType AlignType
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.alignType;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.alignType = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [ClassAttributs(CName = "多行", Description = "是否是多行,默认为FALSE单选")]
 | ||
|         public EIsBool IsMultiline
 | ||
|         {
 | ||
|             get
 | ||
|             {
 | ||
|                 return this.isMultiline;
 | ||
|             }
 | ||
|             set
 | ||
|             {
 | ||
|                 this.isMultiline = value;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private float GetFontSize()
 | ||
|         {
 | ||
|             float result;
 | ||
|             try
 | ||
|             {
 | ||
|                 string text = null;// ConfigurationManager.AppSettings["FontSize"];
 | ||
|                 bool flag = text == null;
 | ||
|                 if (flag)
 | ||
|                 {
 | ||
|                     result = 8f;
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     result = float.Parse(text);
 | ||
|                 }
 | ||
|             }
 | ||
|             catch (Exception)
 | ||
|             {
 | ||
|                 result = 8f;
 | ||
|             }
 | ||
|             return result;
 | ||
|         }
 | ||
| 
 | ||
|         public TextsPackObj(ZedGraphControl zgc, PackObjManager poManager) : base(zgc, poManager)
 | ||
|         {
 | ||
|             this.baseZed = zgc;
 | ||
|             base.PackText = "文本" + this.index.ToString();
 | ||
|             this.fontSize = this.GetFontSize();
 | ||
|         }
 | ||
| 
 | ||
|         public override void Draw()
 | ||
|         {
 | ||
|             bool flag = this.baseZed == null;
 | ||
|             if (!flag)
 | ||
|             {
 | ||
|                 this.Clear();
 | ||
|                 base.PackText = base.PackText;//.Replace("\r", "\u3000").Replace("\n", "\u3000");
 | ||
|                 bool flag2 = this.IsHorizontal == ELineType.Horizontal;
 | ||
|                 if (flag2)
 | ||
|                 {
 | ||
|                     this.hDraw();
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     this.vDraw();
 | ||
|                 }
 | ||
|                 bool flag3 = this.isViewBoard == EIsBool.True;
 | ||
|                 if (flag3)
 | ||
|                 {
 | ||
|                     string packTag = base.PackTag + "_board";
 | ||
|                     RectangleFramePackObj rectangleFramePackObj = new RectangleFramePackObj(this.baseZed, this.poManager);
 | ||
|                     rectangleFramePackObj.PackTag = packTag;
 | ||
|                     float num = base.X;
 | ||
|                     bool flag4 = this.AlignType == EAlignType.Center;
 | ||
|                     if (flag4)
 | ||
|                     {
 | ||
|                         num -= base.Width / 2f;
 | ||
|                     }
 | ||
|                     rectangleFramePackObj.X = num;
 | ||
|                     rectangleFramePackObj.Y = base.Y;
 | ||
|                     rectangleFramePackObj.EndX = num + base.Width;
 | ||
|                     rectangleFramePackObj.EndY = base.Y + base.Height;
 | ||
|                     rectangleFramePackObj.Draw();
 | ||
|                 }
 | ||
|                 base.Refresh();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void hDraw()
 | ||
|         {
 | ||
|             bool flag = base.PackText == "";
 | ||
|             if (!flag)
 | ||
|             { 
 | ||
|                 if ( this.IsMultiline == EIsBool.False)
 | ||
|                 {
 | ||
|                     base.PackText = base.PackText.Replace("\r", "\u3000").Replace("\n", "\u3000");
 | ||
|                     TextObj textObj = this.CreateTextObj(base.PackText, base.PackTag);
 | ||
|                     ZUtil.DrawText(textObj, this.baseZed);
 | ||
|                     this.width = ZUtil.GetColWidthFraction(textObj, this.baseZed);
 | ||
|                     this.height = ZUtil.GetColHeightFraction(textObj, this.baseZed);
 | ||
|                     base.EndX = base.X + this.width;
 | ||
|                     base.EndY = base.Y + this.height;
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     List<string> list = this.breakLinesForCanvas(base.PackText);
 | ||
|                     for (int i = 0; i < list.Count; i++)
 | ||
|                     {
 | ||
|                         string text = list[i];
 | ||
|                         double num = (double)base.RealY;
 | ||
|                         bool flag3 = this.IsTop == EIsBool.True;
 | ||
|                         if (flag3)
 | ||
|                         {
 | ||
|                             num = (double)(base.RealY + (float)i * this.RowSpan);
 | ||
|                         }
 | ||
|                         else
 | ||
|                         {
 | ||
|                             num = (double)(base.RealY - (float)(list.Count - i - 1) * this.RowSpan);
 | ||
|                         }
 | ||
|                         bool flag4 = text == "";
 | ||
|                         if (flag4)
 | ||
|                         {
 | ||
|                             break;
 | ||
|                         }
 | ||
|                         TextObj textObj2 = this.CreateTextObj(text, base.PackTag + "_" + i.ToString());
 | ||
|                         try
 | ||
|                         {
 | ||
|                             float colHeightFraction = ZUtil.GetColHeightFraction(textObj2, this.baseZed);
 | ||
|                             bool flag5 = i == 0 && base.X == base.EndX;
 | ||
|                             if (flag5)
 | ||
|                             {
 | ||
|                                 this.width = ZUtil.GetColWidthFraction(textObj2, this.baseZed);
 | ||
|                                 this.height = ZUtil.GetColHeightFraction(textObj2, this.baseZed);
 | ||
|                             }
 | ||
|                             this.height = (float)num - base.RealY + colHeightFraction;
 | ||
|                             bool flag6 = base.X == base.EndX;
 | ||
|                             if (flag6)
 | ||
|                             {
 | ||
|                                 base.EndX = base.X + this.width;
 | ||
|                                 base.EndY = base.Y + this.height;
 | ||
|                             }
 | ||
|                         }
 | ||
|                         catch (Exception)
 | ||
|                         {
 | ||
|                         }
 | ||
|                         textObj2.Location.X = (double)base.RealX;
 | ||
|                         textObj2.Location.Y = num;
 | ||
|                         ZUtil.DrawText(textObj2, this.baseZed);
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private int findBreakPoint(string text)
 | ||
|         {
 | ||
|             double num = 0.0;
 | ||
|             double num2 = (double)(text.Length - 1);
 | ||
|             int result;
 | ||
|             try
 | ||
|             {
 | ||
|                 bool flag = base.RealEndX != base.RealX;
 | ||
|                 if (flag)
 | ||
|                 {
 | ||
|                     while (num <= num2)
 | ||
|                     {
 | ||
|                         int num3 = Convert.ToInt32(Math.Floor((num + num2) / 2.0));
 | ||
|                         string a = text.Substring(0, num3);
 | ||
|                         bool flag2 = a != "";
 | ||
|                         if (!flag2)
 | ||
|                         {
 | ||
|                             result = -1;
 | ||
|                             return result;
 | ||
|                         }
 | ||
|                         TextObj text2 = this.CreateTextObj(text.Substring(0, num3), base.PackTag);
 | ||
|                         float colWidthFraction = ZUtil.GetColWidthFraction(text2, this.baseZed);
 | ||
|                         TextObj text3 = this.CreateTextObj(text.Substring(0, num3 + 1), base.PackTag);
 | ||
|                         float colWidthFraction2 = ZUtil.GetColWidthFraction(text3, this.baseZed);
 | ||
|                         float num4 = base.RealEndX - base.RealX + 0.0002f;
 | ||
|                         bool flag3 = colWidthFraction <= num4 && colWidthFraction2 > num4;
 | ||
|                         if (flag3)
 | ||
|                         {
 | ||
|                             result = num3;
 | ||
|                             return result;
 | ||
|                         }
 | ||
|                         bool flag4 = colWidthFraction < num4;
 | ||
|                         if (flag4)
 | ||
|                         {
 | ||
|                             num = (double)(num3 + 1);
 | ||
|                         }
 | ||
|                         else
 | ||
|                         {
 | ||
|                             num2 = (double)(num3 - 1);
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             catch (Exception)
 | ||
|             {
 | ||
|                 result = -1;
 | ||
|                 return result;
 | ||
|             }
 | ||
|             result = -1;
 | ||
|             return result;
 | ||
|         }
 | ||
| 
 | ||
|         public List<string> breakLinesForCanvas(string text)
 | ||
|         {
 | ||
|             List<string> result = text.Replace("\r\n", "^").Split('^').ToList();
 | ||
|             List<string> list = new List<string>();
 | ||
|             for (int i = 0; i < result.Count; i++)
 | ||
|             {
 | ||
|                 string item = result[i].Replace("  ", " ") ;
 | ||
|                 int num;
 | ||
|                 while ((num = this.findBreakPoint(item)) != -1)
 | ||
|                 {
 | ||
|                     list.Add(item.Substring(0, num));
 | ||
|                     item = item.Substring(num);
 | ||
|                 }
 | ||
|                 bool flag = item != "";
 | ||
|                 if (flag)
 | ||
|                 {
 | ||
|                     list.Add(item);
 | ||
|                 }
 | ||
|             }
 | ||
|             return list;
 | ||
|         }
 | ||
| 
 | ||
|         private void vDraw()
 | ||
|         {
 | ||
|             for (int i = 0; i < base.PackText.Length; i++)
 | ||
|             {
 | ||
|                 string text = base.PackText.Substring(i, 1);
 | ||
|                 bool flag = text.Trim() == "";
 | ||
|                 if (!flag)
 | ||
|                 {
 | ||
|                     float num = base.RealY + (float)i * this.RowSpan;
 | ||
|                     TextObj textObj = this.CreateTextObj(text, base.PackTag + "_" + i.ToString());
 | ||
|                     textObj.Location = new Location((double)base.RealX, (double)num, CoordType.PaneFraction);
 | ||
|                     ZUtil.DrawText(textObj, this.baseZed);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private TextObj CreateTextObj(string packTextTemp, string packTag)
 | ||
|         {
 | ||
|             Color color = Color.FromArgb(this.fontColor.ToArgb());
 | ||
|             bool isSelect = base.IsSelect;
 | ||
|             if (isSelect)
 | ||
|             {
 | ||
|                 color = Color.Red;
 | ||
|             }
 | ||
|             TextObj textObj = new TextObj(packTextTemp, (double)base.RealX, (double)base.RealY, CoordType.PaneFraction);
 | ||
|             textObj.FontSpec = new FontSpec(PackObjBase.fontFamily, this.fontSize, color, this.isBool == EIsBool.True, false, this.underline);
 | ||
|             textObj.FontSpec.Border.Width = 0f;
 | ||
|             textObj.FontSpec.Border.IsVisible = false;
 | ||
|             textObj.FontSpec.StringAlignment = StringAlignment.Near;
 | ||
|             textObj.Tag = packTag;
 | ||
|             textObj.FontSpec.Fill.IsVisible = false;
 | ||
|             AlignH alignH = AlignH.Left;
 | ||
|             bool flag = this.AlignType == EAlignType.Center;
 | ||
|             if (flag)
 | ||
|             {
 | ||
|                 alignH = AlignH.Center;
 | ||
|             }
 | ||
|             bool flag2 = this.AlignType == EAlignType.Right;
 | ||
|             if (flag2)
 | ||
|             {
 | ||
|                 alignH = AlignH.Right;
 | ||
|             }
 | ||
|             textObj.Location.AlignH = alignH;
 | ||
|             textObj.Location.AlignV = AlignV.Top;
 | ||
|             textObj.ZOrder = ZOrder.A_InFront;
 | ||
|             textObj.FontSpec.Angle = (float)this.angle;
 | ||
|             return textObj;
 | ||
|         }
 | ||
| 
 | ||
|         public override void Clear()
 | ||
|         {
 | ||
|             base.Clear();
 | ||
|             for (int i = 0; i <= 20; i++)
 | ||
|             {
 | ||
|                 string tag = base.PackTag + "_" + i.ToString();
 | ||
|                 bool flag = this.baseZed.MasterPane != null;
 | ||
|                 if (flag)
 | ||
|                 {
 | ||
|                     GraphObj graphObj = this.baseZed.MasterPane.GraphObjList[tag];
 | ||
|                     bool flag2 = graphObj != null;
 | ||
|                     if (flag2)
 | ||
|                     {
 | ||
|                         this.baseZed.MasterPane.GraphObjList.Remove(graphObj);
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             string tag2 = base.PackTag + "_board";
 | ||
|             bool flag3 = this.baseZed.MasterPane != null;
 | ||
|             if (flag3)
 | ||
|             {
 | ||
|                 GraphObj graphObj2 = this.baseZed.MasterPane.GraphObjList[tag2];
 | ||
|                 bool flag4 = graphObj2 != null;
 | ||
|                 if (flag4)
 | ||
|                 {
 | ||
|                     this.baseZed.MasterPane.GraphObjList.Remove(graphObj2);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 |