using PaintDotNet.Annotation.Enum;
using PaintDotNet.Base.CommTool;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Globalization;
using System.Runtime.Serialization;
using System.Windows.Forms;
namespace PaintDotNet.Annotation.FieldView
{
///
/// 矩形视场绘制
///
public class ViewRectangle : ViewBase
{
public override double Width
{
get => Rectangle.Width;
set
{
MoveHandleTo(new PointF((float)(value + Points[0].X), 0), 4);
}
}
public override double Height
{
get => Rectangle.Height;
set
{
MoveHandleTo(new PointF(0, (float)(value + Points[0].Y)), 6);
}
}
#region Constructor
public ViewRectangle()
{
objectType = DrawClass.View;
drawToolType = DrawToolType.ViewRectangle;
Initialize();
}
public ViewRectangle(int x, int y) : this()
{
for (int i = 0; i < 4; i++) AddPoint(x, y);
}
public ViewRectangle(int x, int y, int width, int height) : this()
{
AddPoint(new PointF(x, y));
AddPoint(new PointF(x + width, y));
AddPoint(new PointF(x + width, y + height));
AddPoint(new PointF(x, y + height));
}
public ViewRectangle(List points) : this()
{
Points = points;
}
#endregion
#region Handle
public override int HandleCount
{
get
{
return 8;
}
}
public override PointF GetHandle(int handleIndex)
{
var count = Points.Count;
var x = Points[(handleIndex / 2) % count].X + Points[(handleIndex - 1) / 2].X;
var y = Points[(handleIndex / 2) % count].Y + Points[(handleIndex - 1) / 2].Y;
return new PointF(x / 2, y / 2);
}
public override Cursor GetHandleCursor(int handleNumber)
{
switch (handleNumber)
{
case 1:
return Cursors.SizeNWSE;
case 2:
return Cursors.SizeNS;
case 3:
return Cursors.SizeNESW;
case 4:
return Cursors.SizeWE;
case 5:
return Cursors.SizeNWSE;
case 6:
return Cursors.SizeNS;
case 7:
return Cursors.SizeNESW;
case 8:
return Cursors.SizeWE;
default:
return Cursors.Default;
}
}
public override void MoveHandleTo(Point point, int handleNumber)
{
MoveHandleTo((PointF)point, handleNumber);
}
public override void MoveHandleTo(PointF point, int handleNumber)
{
if (handleNumber % 2 == 0)
MoveEdge(point, handleNumber / 2 - 1);
else
MoveCorner(point, handleNumber / 2);
OnPropertyChanged();
}
private void MoveCorner(PointF point, int i)
{
Points[i] = point;
if (i % 2 == 0)
{
Points[(i + 1) % 4] = new PointF(Points[(i + 1) % 4].X, point.Y);
Points[(i + 3) % 4] = new PointF(point.X, Points[(i + 3) % 4].Y);
}
else
{
Points[(i + 1) % 4] = new PointF(point.X, Points[(i + 1) % 4].Y);
Points[(i + 3) % 4] = new PointF(Points[(i + 3) % 4].X, point.Y);
}
}
private void MoveEdge(PointF point, int i)
{
var tempk = i % 2 != 0 ? K : -1 / K;
this.Points[i] = BasicCalculationHelper.GetDropFeet(Points[(i + 3) % 4], tempk, point);
this.Points[(i + 1) % 4] = BasicCalculationHelper.GetDropFeet(Points[(i + 2) % 4], tempk, point);
}
#endregion
#region Clone
public override DrawObject Clone()
{
return Clone(ISurfaceBox);
}
public override DrawObject Clone(ISurfaceBox surfaceBox)
{
ViewRectangle drawRectangle = new ViewRectangle(Points);
drawRectangle.ISurfaceBox = surfaceBox;
drawRectangle.combineMode = combineMode;
drawRectangle.Color = Color;
drawRectangle.ID = ID;
FillDrawObjectFields(drawRectangle);
return drawRectangle;
}
#endregion
}
}