446 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			446 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| 
 | |
| namespace DrawGraph
 | |
| {
 | |
|     public class CommandManage
 | |
|     {
 | |
|         public bool CtrlDown = false; //CTRL键被按下
 | |
|         public bool MouseLeftDown = false; //CTRL键被按下
 | |
|         public global::DrawGraph.AreaManageBase AreaManage;
 | |
| 
 | |
|         private List<Command> CmdList = new List<Command>();
 | |
|         private int CurrentCmdIndex = 0; //当前命令的索
 | |
|         private int CmdCount = 6; //默认缓存50条命令
 | |
| 
 | |
|         private CommandManage() { }
 | |
| 
 | |
|         private static readonly CommandManage singleInstance = new CommandManage();
 | |
| 
 | |
|         public static CommandManage GetInstance
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return singleInstance;
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 增加一个命令
 | |
|         /// </summary>
 | |
|         /// <param name="cmd"></param>
 | |
|         public void AddCommand(Command cmd)
 | |
|         {
 | |
|             if (CurrentCmdIndex == 0) this.CurrentCmdIndex = this.CmdList.Count;
 | |
| 
 | |
|             int count = this.CmdList.Count - this.CurrentCmdIndex;
 | |
|             if (count > 0)
 | |
|             {
 | |
|                 this.CmdList.RemoveRange(this.CurrentCmdIndex, count);
 | |
|             }
 | |
| 
 | |
|             this.CurrentCmdIndex++;
 | |
|             this.CmdList.Add(cmd);
 | |
|             if (this.CmdList.Count > this.CmdCount)
 | |
|             {
 | |
|                 this.CmdList.RemoveAt(0);
 | |
|                 this.CurrentCmdIndex -= 1;
 | |
|             }
 | |
|         }
 | |
|         public bool CtrlZCommand()
 | |
|         {
 | |
|             bool val = false;
 | |
|             if (this.CurrentCmdIndex == 0)
 | |
|             {
 | |
|                 val = false;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 this.CurrentCmdIndex--;
 | |
|                 val = this.CmdList[CurrentCmdIndex].CtrlZ();
 | |
|             }
 | |
|             return val;
 | |
|         }
 | |
|         public void Clear()
 | |
|         {
 | |
|             CurrentCmdIndex = 0;
 | |
|             CmdList.Clear();
 | |
|         }
 | |
|         public bool CtrlYCommand()
 | |
|         {
 | |
|             bool val = false;
 | |
|             if (this.CurrentCmdIndex >= this.CmdList.Count)
 | |
|             {
 | |
|                 val = false;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 val = this.CmdList[this.CurrentCmdIndex].CtrlY();
 | |
|                 this.CurrentCmdIndex++;
 | |
|             }
 | |
|             return val;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 组件横向居中命令
 | |
|         /// </summary>
 | |
|         public void HCenterCmd(PackObjBase selectPoB)
 | |
|         {
 | |
|             HCenterCmd cmd = new HCenterCmd(AreaManage, selectPoB);
 | |
|             cmd.Execute();
 | |
|             AddCommand(cmd);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 组件垂直居中命令
 | |
|         /// </summary>
 | |
|         /// <param name="packObjBase"></param>
 | |
|         public void VCenterCmd(PackObjBase selectPoB) {
 | |
|             VCenterCmd cmd = new VCenterCmd(AreaManage, selectPoB);
 | |
|             cmd.Execute();
 | |
|             AddCommand(cmd);
 | |
| 
 | |
|         }
 | |
|         public void TopAlignCmd(PackObjBase selectPoB)
 | |
|         {
 | |
|             TopAlignCmd cmd = new TopAlignCmd(AreaManage, selectPoB);
 | |
|             cmd.Execute();
 | |
|             AddCommand(cmd);
 | |
|         }
 | |
| 
 | |
|         public void LeftAlignCmd(PackObjBase selectPoB)
 | |
|         {
 | |
|             LeftAlignCmd cmd = new LeftAlignCmd(AreaManage, selectPoB);
 | |
|             cmd.Execute();
 | |
|             AddCommand(cmd);
 | |
|         }
 | |
| 
 | |
|         public void AlignCmdOfPack(PackObjBase selectPoB, PackObjBase jZPack, string alignType)
 | |
|         {
 | |
|             float x = 0, y = 0;
 | |
|             if (alignType == "上") {
 | |
|                 x = 0;
 | |
|                 y = jZPack.Y - selectPoB.Y;
 | |
|             }
 | |
|             if(alignType == "左") {
 | |
|                 x = jZPack.X - selectPoB.X;
 | |
|                 y = 0;
 | |
|             }
 | |
|             if (alignType == "等宽")
 | |
|             {
 | |
|                 x = jZPack.X - selectPoB.X;
 | |
|                 y = 0;
 | |
|             }
 | |
|             MovePackObjCommand cmd = new MovePackObjCommand(AreaManage, selectPoB);
 | |
|             cmd.PreExecute();
 | |
|             cmd.Execute(x, y);
 | |
|             cmd.LastExecute();
 | |
|             AddCommand(cmd);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 设置相同宽度 
 | |
|         /// </summary>
 | |
|         /// <param name="selectPoB">选中要变的控件</param>
 | |
|         /// <param name="jZPack">基准控件</param>
 | |
|         public void SameWidthCmd(PackObjBase selectPoB, PackObjBase jZPack) {
 | |
|             MovePackObjCommand cmd = new MovePackObjCommand(AreaManage, selectPoB);
 | |
|             cmd.PreExecute();
 | |
| 
 | |
|             //selectPoB.X = jZPack.X;
 | |
|             selectPoB.EndX = selectPoB.X + jZPack.Width;
 | |
| 
 | |
|             selectPoB.Draw();
 | |
|             cmd.LastExecute();
 | |
|             AddCommand(cmd);
 | |
|         }        
 | |
|         /// <summary>
 | |
|         /// 设置相同高度 
 | |
|         /// </summary>
 | |
|         /// <param name="selectPoB">选中要变的控件</param>
 | |
|         /// <param name="jZPack">基准控件</param>
 | |
|         public void SameHeightCmd(PackObjBase selectPoB, PackObjBase jZPack)
 | |
|         {
 | |
|             MovePackObjCommand cmd = new MovePackObjCommand(AreaManage, selectPoB);
 | |
|             cmd.PreExecute();
 | |
| 
 | |
|             //selectPoB.X = jZPack.X;
 | |
|             selectPoB.EndY = selectPoB.Y + jZPack.Height;
 | |
| 
 | |
|             selectPoB.Draw();
 | |
|             cmd.LastExecute();
 | |
|             AddCommand(cmd);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 设置右对齐 
 | |
|         /// </summary>
 | |
|         /// <param name="selectPoB">选中要变的控件</param>
 | |
|         /// <param name="jZPack">基准控件</param>
 | |
|         public void SameRightCmd(PackObjBase selectPoB, PackObjBase jZPack)
 | |
|         {
 | |
|             MovePackObjCommand cmd = new MovePackObjCommand(AreaManage, selectPoB);
 | |
|             cmd.PreExecute();
 | |
| 
 | |
|             //Endx变动的距离
 | |
|             float selPackEndx = jZPack.EndX - selectPoB.EndX;
 | |
|             
 | |
|             selectPoB.EndX = jZPack.EndX;
 | |
|             selectPoB.X += selPackEndx;
 | |
| 
 | |
|             selectPoB.Draw();
 | |
|             cmd.LastExecute();
 | |
|             AddCommand(cmd);
 | |
|         }
 | |
|         
 | |
|     }
 | |
| 
 | |
|     public class Command {
 | |
|         protected PackObjBase selPack = null;
 | |
|         protected AreaManageBase area = null;
 | |
| 
 | |
|         protected List<PackObjBase> ZList = new List<PackObjBase>();
 | |
|         protected List<PackObjBase> YList = new List<PackObjBase>();
 | |
|         public Command(AreaManageBase _area, PackObjBase packObj) {
 | |
|             selPack = packObj;
 | |
|             area = _area;
 | |
|         }
 | |
|         public virtual void Execute() { }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 命令执行前执行的内容
 | |
|         /// </summary>
 | |
|         public virtual void PreExecute() { }
 | |
|         public virtual void Execute(float moveSpanX, float moveSpanY) { }
 | |
|         /// <summary>
 | |
|         /// 命令执行后执行的内容
 | |
|         /// </summary>
 | |
|         public virtual void LastExecute() { }
 | |
| 
 | |
|         public bool CtrlZ()
 | |
|         {
 | |
|             bool val = false;
 | |
|             if (ZList.Count > 0)
 | |
|             {
 | |
|                 area.PackManage.ListPob.Clear();
 | |
|                 area.PackManage.ListPob.AddRange(ZList);
 | |
|                 val = true;
 | |
|             }
 | |
|             return val;
 | |
|         }
 | |
| 
 | |
|         public bool CtrlY()
 | |
|         {
 | |
|             bool val = false;
 | |
|             if (ZList.Count > 0)
 | |
|             {
 | |
|                 area.PackManage.ListPob.Clear();
 | |
|                 area.PackManage.ListPob.AddRange(YList);
 | |
|                 val = true;
 | |
|             }
 | |
|             return val;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 不记入命令集合的对象移动方法
 | |
|         /// </summary>
 | |
|         /// <param name="selectPoB"></param>
 | |
|         /// <param name="x">要移动的值</param>
 | |
|         /// <param name="y">要移动的值</param>
 | |
|         public void PackObjMove(PackObjBase selectPoB, float x, float y)
 | |
|         {
 | |
|             if (selectPoB is BorderPackObj) return;
 | |
|             selectPoB.X += x;
 | |
|             selectPoB.Y += y;
 | |
| 
 | |
|             selectPoB.EndX += x;
 | |
|             selectPoB.EndY += y;
 | |
| 
 | |
|             selectPoB.Draw();
 | |
|             if (selectPoB.IsCascadeUnderpinning == EIsBool.True && area != null)
 | |
|             {
 | |
|                 List<PackObjBase> subPack = area.GetPackObjeOfParentName(selectPoB.PackName);
 | |
|                 foreach (PackObjBase packT in subPack)
 | |
|                 {
 | |
|                     PackObjMove(packT, x, y);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 对象移动方法
 | |
|         /// </summary>
 | |
|         /// <param name="selectPoB"></param>
 | |
|         /// <param name="x">要移到的值</param>
 | |
|         /// <param name="y">要移到的值</param>
 | |
|         public void PackObjMoveTo(PackObjBase selectPoB, float x, float y, bool isTop = true)
 | |
|         {
 | |
|             if (selectPoB is BorderPackObj) return;
 | |
|             if (isTop)
 | |
|             {
 | |
|                 float spanY = y - selectPoB.Y;
 | |
|                 selectPoB.Y = y;
 | |
|                 selectPoB.EndY += spanY;
 | |
|                 selectPoB.Draw();
 | |
|             }
 | |
|             else {
 | |
| 
 | |
|                 float spanX = x - selectPoB.X;
 | |
|                 selectPoB.X = x;
 | |
|                 selectPoB.EndX += spanX;
 | |
|                 selectPoB.Draw();
 | |
|             }
 | |
| 
 | |
| 
 | |
|             if (selectPoB.IsCascadeUnderpinning == EIsBool.True && area != null)
 | |
|             {
 | |
|                 List<PackObjBase> subPack = area.GetPackObjeOfParentName(selectPoB.PackName);
 | |
|                 foreach (PackObjBase packT in subPack)
 | |
|                 {
 | |
|                     PackObjMoveTo(packT, x, y, isTop);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// 以父组件顶部对齐类
 | |
|     /// </summary>
 | |
|     public class TopAlignCmd : Command
 | |
|     {
 | |
|         public TopAlignCmd(AreaManageBase _area, PackObjBase packObj) : base(_area, packObj)
 | |
|         {
 | |
| 
 | |
|         }
 | |
|         public override void Execute()
 | |
|         {
 | |
|             if (selPack == null) return;
 | |
| 
 | |
|             ZList = area.PackManage.Clone();
 | |
|             PackObjMoveTo(selPack, selPack.X, selPack.Y);
 | |
|             YList = area.PackManage.Clone();
 | |
|         }
 | |
|     }
 | |
|     /// <summary>
 | |
|     /// 以父组件左对齐类
 | |
|     /// </summary>
 | |
|     public class LeftAlignCmd : Command
 | |
|     {
 | |
|         public LeftAlignCmd(AreaManageBase _area, PackObjBase packObj) : base(_area, packObj)
 | |
|         {
 | |
| 
 | |
|         }
 | |
|         public override void Execute()
 | |
|         {
 | |
|             if (selPack == null) return;
 | |
| 
 | |
|             ZList = area.PackManage.Clone();
 | |
|             PackObjMoveTo(selPack, selPack.X, selPack.Y, false);
 | |
|             YList = area.PackManage.Clone();
 | |
|         }
 | |
|     }
 | |
|     /// <summary>
 | |
|     /// 
 | |
|     /// </summary>
 | |
|     public class HCenterCmd : Command
 | |
|     {
 | |
|         public HCenterCmd(AreaManageBase _area, PackObjBase packObj) : base(_area, packObj)
 | |
|         {
 | |
| 
 | |
|         }
 | |
|         public override void Execute()
 | |
|         {
 | |
|             if (selPack == null) return;
 | |
| 
 | |
|             float parentWidth = 0;
 | |
|             float parentStartX = 0;
 | |
|             PackObjBase parentPack = null;
 | |
| 
 | |
|             parentPack = area.PackManage.ListPob.FirstOrDefault<PackObjBase>(s => s.PackName == selPack.ParentName);
 | |
|             if (parentPack != null)
 | |
|             {
 | |
| 
 | |
|                 ZList = area.PackManage.Clone();
 | |
| 
 | |
|                 if (parentPack is BorderPackObj)
 | |
|                 {
 | |
|                     parentWidth = 1;
 | |
|                     parentStartX = 0;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     parentWidth = parentPack.Width;
 | |
|                     parentStartX = parentPack.X;
 | |
|                 }
 | |
|                 float startX = parentStartX + (parentWidth - selPack.Width) / 2;
 | |
|                 float startY = selPack.Y;
 | |
|                 float moveSpanX = startX - selPack.X;
 | |
|                 float moveSpanY = startY - selPack.Y;
 | |
|                 PackObjMove(selPack, moveSpanX, moveSpanY);
 | |
| 
 | |
|                 YList = area.PackManage.Clone();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// 
 | |
|     /// </summary>
 | |
|     public class VCenterCmd : Command
 | |
|     {
 | |
|         public VCenterCmd(AreaManageBase _area, PackObjBase packObj) : base(_area, packObj)
 | |
|         {
 | |
| 
 | |
|         }
 | |
|         public override void Execute()
 | |
|         {
 | |
|             if (selPack == null) return;
 | |
|             float parentHeight = 0;
 | |
|             float parentStartY = 0;
 | |
|             PackObjBase parentPack = null;
 | |
| 
 | |
|             parentPack = area.PackManage.ListPob.FirstOrDefault<PackObjBase>(s => s.PackName == selPack.ParentName);
 | |
|             if (parentPack != null)
 | |
|             {
 | |
| 
 | |
|                 ZList = area.PackManage.Clone();
 | |
| 
 | |
|                 if (parentPack is BorderPackObj)
 | |
|                 {
 | |
|                     parentHeight = 1;
 | |
|                     parentStartY = 0;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     parentHeight = parentPack.Height;
 | |
|                     parentStartY = parentPack.Y;
 | |
|                 }
 | |
|                 float startX = selPack.X;
 | |
|                 float startY = parentStartY + (parentHeight - selPack.Height) / 2;
 | |
|                 float moveSpanX = startX - selPack.X;
 | |
|                 float moveSpanY = startY - selPack.Y;
 | |
|                 PackObjMove(selPack, moveSpanX, moveSpanY);
 | |
| 
 | |
|                 YList = area.PackManage.Clone();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     public class MovePackObjCommand : Command
 | |
|     {
 | |
|         public MovePackObjCommand(AreaManageBase _area, PackObjBase packObj):base(_area, packObj)
 | |
|         {
 | |
| 
 | |
|         }
 | |
|         public override void PreExecute()
 | |
|         {
 | |
|             ZList = area.PackManage.Clone();
 | |
|         }
 | |
|         public override void Execute(float moveSpanX, float moveSpanY)
 | |
|         {
 | |
|             PackObjMove(selPack, moveSpanX, moveSpanY);
 | |
|         }
 | |
|         public override void LastExecute()
 | |
|         {
 | |
|             YList = area.PackManage.Clone();
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 |