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