using PaintDotNet.Base.SettingModel;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Globalization;
using System.Runtime.Serialization;
using System.Windows.Forms;
using PaintDotNet.Base.CommTool;
using System.IO;
using static PaintDotNet.Base.SettingModel.LabelStyleModel;
using PaintDotNet.Annotation.Enum;
using System.Collections;
using System.Collections.Generic;
namespace PaintDotNet.Annotation.Label
{
///
/// 标注->标记->数字标记
///
public class DrawNumberMark : DrawObject
{
private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur"));
///
/// 标注样式信息model
///
public NumberMark labelNumberMarkStyleModel;
public int nowNum = 0;
public bool canSetNum = false;
public DrawNumberMark(ISurfaceBox surfaceBox) : base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawNumberMark;
Initialize();
}
public DrawNumberMark(ISurfaceBox surfaceBox, int x1, int y1) : base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawNumberMark;
startPoint = new PointF(x1, y1);
labelNumberMarkStyleModel = surfaceBox.GetLabelStyleModel().numberMark;
Initialize();
}
public DrawNumberMark(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) : base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawNumberMark;
this.ISurfaceBox = surfaceBox;
labelNumberMarkStyleModel = (LabelStyleModel.NumberMark)parentStyleModel;
startPoint = points[0];
nowNum = Convert.ToInt32(content);
}
///
/// Clone this instance
///
public override DrawObject Clone()
{
DrawNumberMark numberMark = new DrawNumberMark(ISurfaceBox);
numberMark.objectType = DrawClass.Label;
numberMark.drawToolType = DrawToolType.DrawNumberMark;
numberMark.ISurfaceBox = this.ISurfaceBox;
numberMark.startPoint = this.startPoint;
numberMark.labelNumberMarkStyleModel = this.labelNumberMarkStyleModel;
//numberMark.nowNum = this.nowNum;
numberMark.canSetNum = true;
FillDrawObjectFields(numberMark);
return numberMark;
}
public override DrawObject Clone(ISurfaceBox surfaceBox)
{
DrawNumberMark numberMark = new DrawNumberMark(surfaceBox);
numberMark.objectType = DrawClass.Label;
numberMark.drawToolType = DrawToolType.DrawNumberMark;
numberMark.ISurfaceBox = surfaceBox;
numberMark.startPoint = this.startPoint;
numberMark.labelNumberMarkStyleModel = this.labelNumberMarkStyleModel;
//numberMark.nowNum = this.nowNum;
numberMark.canSetNum = true;
FillDrawObjectFields(numberMark);
return numberMark;
}
public override void Draw(Graphics g)
{
if (canSetNum)
{
nowNum = setNowNumber();
canSetNum = false;
}
Font textfont = new Font(this.labelNumberMarkStyleModel.font, this.labelNumberMarkStyleModel.fontSize);
Brush textbrush = new SolidBrush(Color.FromArgb(this.labelNumberMarkStyleModel.textColor));
Color color = Color.FromArgb(this.labelNumberMarkStyleModel.backgroundBoxColor);
Pen pen = new Pen(color, this.labelNumberMarkStyleModel.lineWidth);
Color fillColor = Color.FromArgb(this.labelNumberMarkStyleModel.backgroundColor);
SolidBrush fillBrush = new SolidBrush(fillColor);
Size fontSize = g.MeasureString(nowNum.ToString(), textfont).ToSize();
float backgroundSize = 0;//背景大小
if (fontSize.Width > fontSize.Height)
backgroundSize = fontSize.Width * (this.labelNumberMarkStyleModel.backgroundSize / 100f);
else
backgroundSize = fontSize.Height * (this.labelNumberMarkStyleModel.backgroundSize / 100f);
g.SmoothingMode = SmoothingMode.AntiAlias;
rectangle.X = startPoint.X;
rectangle.Y = startPoint.Y;
rectangle.Width = fontSize.Width + 2 * backgroundSize;
rectangle.Height = fontSize.Height + 2 * backgroundSize;
g.FillRectangle(fillBrush, rectangle);
g.DrawRectangle(pen, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
g.DrawString(nowNum.ToString(), textfont, textbrush, startPoint.X + backgroundSize, startPoint.Y + backgroundSize);
fillBrush.Dispose();
pen.Dispose();
}
public int setNowNumber()
{
List objList = this.ISurfaceBox.GraphicsList.GetDrawToolTypeList(DrawToolType.DrawNumberMark);
objList.Reverse();
int indexNum = objList.IndexOf(this) + 1;
return indexNum;
}
public override int HandleCount
{
get
{
return 1;
}
}
///
/// Get handle pointscroll by 1-based number
///
///
///
public override PointF GetHandle(int handleNumber)
{
return startPoint;
}
///
/// Hit test.
/// Return value: -1 - no hit
/// 0 - hit anywhere
/// > 1 - handle number
///
///
///
public override int HitTest(Point point)
{
if (Selected)
{
for (int i = 1; i <= HandleCount; i++)
{
if (GetHandleRectangle(i).Contains(point))
return i;
}
}
if (PointInObject(point))
return 0;
return -1;
}
protected override bool PointInObject(Point point)
{
return rectangle.Contains(point);
}
public override bool IntersectsWith(Rectangle rectangle)
{
return Rectangle.IntersectsWith(rectangle);
}
public override Cursor GetHandleCursor(int handleNumber)
{
return Cursors.Default;
}
public override void MoveHandleTo(Point point, int handleNumber)
{
startPoint = point;
}
public override void Move(int deltaX, int deltaY)
{
int x = ISurfaceBox.UnscaleScalar(deltaX);
int y = ISurfaceBox.UnscaleScalar(deltaY);
startPoint.X += x;
startPoint.Y += y;
rectangle.X += x;
rectangle.Y += y;
}
public override RectangleF GetBoundingBox()
{
return rectangle;
}
public override List GetPoints()
{
List points = new List();
points.Add(startPoint);
return points;
}
public override ParentStyleModel GetStyle()
{
return labelNumberMarkStyleModel;
}
public override string GetContent()
{
return nowNum.ToString();
}
}
}