2026-01-26 14:51:28 +09:00

302 lines
9.6 KiB
C#

using System.Collections.Generic;
namespace CoreUnit.Control.UserControl.Canvas
{
class EditCommandBase
{
public virtual bool DoUndo(IModel data)
{
return false;
}
public virtual bool DoRedo(IModel data)
{
return false;
}
}
class EditCommandAdd : EditCommandBase
{
List<IDrawObject> m_objects = null;
IDrawObject m_object;
ICanvasLayer m_layer;
public EditCommandAdd(ICanvasLayer layer, IDrawObject obj)
{
m_object = obj;
m_layer = layer;
}
public EditCommandAdd(ICanvasLayer layer, List<IDrawObject> objects)
{
m_objects = new List<IDrawObject>(objects);
m_layer = layer;
}
public override bool DoUndo(IModel data)
{
if (m_object != null) {
data.DeleteObjects(new List<IDrawObject>() { m_object });
/////////////////////////////////////////////////
//객체 삭제 후 이름을 재 명명(hochul.kim)
for (int i = 0; i < m_layer.Objects.Count; i++) {
IDrawObject obj = m_layer.Objects[i];
obj.No = i;
}
/////////////////////////////////////////////////
}
if (m_objects != null) {
data.DeleteObjects(m_objects);
/////////////////////////////////////////////////
//객체 삭제 후 이름을 재 명명(hochul.kim)
for (int i = 0; i < m_layer.Objects.Count; i++) {
IDrawObject obj = m_layer.Objects[i];
obj.No = i;
}
/////////////////////////////////////////////////
}
return true;
}
public override bool DoRedo(IModel data)
{
if (m_object != null) {
data.AddObject(m_layer, m_object);
/////////////////////////////////////////////////
//객체 삭제 후 이름을 재 명명(hochul.kim)
for (int i = 0; i < m_layer.Objects.Count; i++) {
IDrawObject obj = m_layer.Objects[i];
obj.No = i;
}
/////////////////////////////////////////////////
}
if (m_objects != null) {
foreach (IDrawObject obj in m_objects) {
data.AddObject(m_layer, obj);
}
/////////////////////////////////////////////////
//객체 삭제 후 이름을 재 명명(hochul.kim)
for (int i = 0; i < m_layer.Objects.Count; i++) {
IDrawObject obj = m_layer.Objects[i];
obj.No = i;
}
/////////////////////////////////////////////////
}
return true;
}
}
class EditCommandRemove : EditCommandBase
{
List<IDrawObject> m_objects = null;
ICanvasLayer m_layer;
public EditCommandRemove(ICanvasLayer layer, List<IDrawObject> objects)
{
m_objects = new List<IDrawObject>(objects);
m_layer = layer;
}
public override bool DoUndo(IModel data)
{
if (m_objects != null) {
foreach (IDrawObject obj in m_objects) {
m_layer.Objects.Insert(obj.No, obj);
}
/////////////////////////////////////////////////
//객체 삭제 후 이름을 재 명명(hochul.kim)
for (int i = 0; i < m_layer.Objects.Count; i++) {
IDrawObject obj = m_layer.Objects[i];
obj.No = i;
}
}
/////////////////////////////////////////////////
return true;
}
public override bool DoRedo(IModel data)
{
if (m_objects != null) {
data.DeleteObjects(m_objects);
/////////////////////////////////////////////////
//객체 삭제 후 이름을 재 명명(hochul.kim)
for (int i = 0; i < m_layer.Objects.Count; i++) {
IDrawObject obj = m_layer.Objects[i];
obj.No = i;
}
/////////////////////////////////////////////////
}
return true;
}
}
class EditCommandMove : EditCommandBase
{
List<IDrawObject> m_objects = new List<IDrawObject>();
UnitPoint m_offset;
public EditCommandMove(UnitPoint offset, IEnumerable<IDrawObject> objects)
{
m_objects = new List<IDrawObject>(objects);
m_offset = offset;
}
public override bool DoUndo(IModel data)
{
foreach (IDrawObject obj in m_objects) {
UnitPoint offset = new UnitPoint(-m_offset.X, -m_offset.Y);
obj.Move(offset);
}
return true;
}
public override bool DoRedo(IModel data)
{
foreach (IDrawObject obj in m_objects)
obj.Move(m_offset);
return true;
}
}
class EditCommandRotate : EditCommandBase
{
List<IDrawObject> m_objects = new List<IDrawObject>();
float m_angle;
public EditCommandRotate(float angle, IEnumerable<IDrawObject> objects)
{
m_objects = new List<IDrawObject>(objects);
m_angle = angle;
}
public override bool DoUndo(IModel data)
{
foreach (IDrawObject obj in m_objects) {
obj.Rotate(-1 * m_angle, new UnitPoint(obj.MiddlePoint.X, obj.MiddlePoint.Y));
}
return true;
}
public override bool DoRedo(IModel data)
{
foreach (IDrawObject obj in m_objects)
obj.Rotate(m_angle, new UnitPoint(obj.MiddlePoint.X, obj.MiddlePoint.Y));
return true;
}
}
class EditCommandMakeLength : EditCommandBase
{
List<IDrawObject> m_objects = new List<IDrawObject>();
float m_distance;
public EditCommandMakeLength(float distance, IEnumerable<IDrawObject> objects)
{
m_objects = new List<IDrawObject>(objects);
m_distance = distance;
}
public override bool DoUndo(IModel data)
{
foreach (IDrawObject obj in m_objects) {
obj.MakeLength(-1 * m_distance);
}
return true;
}
public override bool DoRedo(IModel data)
{
foreach (IDrawObject obj in m_objects)
obj.MakeLength(m_distance);
return true;
}
}
class EditCommandNodeMove : EditCommandBase
{
List<INodePoint> m_objects = new List<INodePoint>();
public EditCommandNodeMove(IEnumerable<INodePoint> objects)
{
m_objects = new List<INodePoint>(objects);
}
public override bool DoUndo(IModel data)
{
foreach (INodePoint obj in m_objects)
obj.Undo();
return true;
}
public override bool DoRedo(IModel data)
{
foreach (INodePoint obj in m_objects)
obj.Redo();
return true;
}
}
class EditCommandEditTool : EditCommandBase
{
IEditTool m_tool;
public EditCommandEditTool(IEditTool tool)
{
m_tool = tool;
}
public override bool DoUndo(IModel data)
{
m_tool.Undo();
return true;
}
public override bool DoRedo(IModel data)
{
m_tool.Redo();
return true;
}
}
class UndoRedoBuffer
{
List<EditCommandBase> m_undoBuffer = new List<EditCommandBase>();
List<EditCommandBase> m_redoBuffer = new List<EditCommandBase>();
bool m_canCapture = true;
bool m_dirty = false;
public UndoRedoBuffer()
{
}
public void Clear()
{
m_undoBuffer.Clear();
m_redoBuffer.Clear();
}
public bool Dirty {
get { return m_dirty; }
set { m_dirty = value; }
}
public bool CanCapture {
get { return m_canCapture; }
}
public bool CanUndo {
get { return m_undoBuffer.Count > 0; }
}
public bool CanRedo {
get { return m_redoBuffer.Count > 0; }
}
public void AddCommand(EditCommandBase command)
{
if (m_canCapture && command != null) {
m_undoBuffer.Add(command);
m_redoBuffer.Clear();
Dirty = true;
}
}
public bool DoUndo(IModel data)
{
if (m_undoBuffer.Count == 0)
return false;
m_canCapture = false;
EditCommandBase command = m_undoBuffer[m_undoBuffer.Count - 1];
bool result = command.DoUndo(data);
m_undoBuffer.RemoveAt(m_undoBuffer.Count - 1);
m_redoBuffer.Add(command);
m_canCapture = true;
Dirty = true;
return result;
}
public bool DoRedo(IModel data)
{
if (m_redoBuffer.Count == 0)
return false;
m_canCapture = false;
EditCommandBase command = m_redoBuffer[m_redoBuffer.Count - 1];
bool result = command.DoRedo(data);
m_redoBuffer.RemoveAt(m_redoBuffer.Count - 1);
m_undoBuffer.Add(command);
m_canCapture = true;
Dirty = true;
return result;
}
}
}