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 CmdList = new List(); 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; } } /// /// 增加一个命令 /// /// 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; } /// /// 组件横向居中命令 /// public void HCenterCmd(PackObjBase selectPoB) { HCenterCmd cmd = new HCenterCmd(AreaManage, selectPoB); cmd.Execute(); AddCommand(cmd); } /// /// 组件垂直居中命令 /// /// 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); } /// /// 设置相同宽度 /// /// 选中要变的控件 /// 基准控件 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); } /// /// 设置相同高度 /// /// 选中要变的控件 /// 基准控件 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); } /// /// 设置右对齐 /// /// 选中要变的控件 /// 基准控件 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 ZList = new List(); protected List YList = new List(); public Command(AreaManageBase _area, PackObjBase packObj) { selPack = packObj; area = _area; } public virtual void Execute() { } /// /// 命令执行前执行的内容 /// public virtual void PreExecute() { } public virtual void Execute(float moveSpanX, float moveSpanY) { } /// /// 命令执行后执行的内容 /// 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; } /// /// 不记入命令集合的对象移动方法 /// /// /// 要移动的值 /// 要移动的值 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 subPack = area.GetPackObjeOfParentName(selectPoB.PackName); foreach (PackObjBase packT in subPack) { PackObjMove(packT, x, y); } } } /// /// 对象移动方法 /// /// /// 要移到的值 /// 要移到的值 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 subPack = area.GetPackObjeOfParentName(selectPoB.PackName); foreach (PackObjBase packT in subPack) { PackObjMoveTo(packT, x, y, isTop); } } } } /// /// 以父组件顶部对齐类 /// 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(); } } /// /// 以父组件左对齐类 /// 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(); } } /// /// /// 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(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(); } } } /// /// /// 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(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(); } } }