AIMS/DrawGraph/GUtil/CommandManage.cs
2022-08-23 21:12:59 +08:00

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();
}
}
}