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.Startup;
using PaintDotNet.Base.CommTool;
using System.IO;
using static PaintDotNet.Base.SettingModel.LabelStyleModel;
using PaintDotNet.Annotation.Enum;
using System.Collections.Generic;
using PaintDotNet.Base.Enum;
namespace PaintDotNet.Annotation.Label
{
///
/// 标注->标记->日期
///
public class DrawTimeMark : DrawObject
{
private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur"));
///
/// 标注样式信息model
///
public TimeMark labelTimeMarkStyleModel;
///
/// 时间信息
///
private string timeStr = "";
///
/// 辅助为第一次创建时间对象赋值
///
public bool isFirstClick = true;
public DrawTimeMark(ISurfaceBox surfaceBox) : base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawTimeMark;
Initialize();
}
public DrawTimeMark(ISurfaceBox surfaceBox, string nowTime) : base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawTimeMark;
timeStr = nowTime;
labelTimeMarkStyleModel = surfaceBox.GetLabelStyleModel().timeMark;
startPoint = new PointF(0, 0);
Initialize();
}
public DrawTimeMark(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) :base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawTimeMark;
this.ISurfaceBox = surfaceBox;
labelTimeMarkStyleModel = (LabelStyleModel.TimeMark)parentStyleModel;
startPoint = points[0];
timeStr = content.ToString();
isFirstClick = false;
}
///
/// Clone this instance
///
public override DrawObject Clone()
{
DrawTimeMark timeMark = new DrawTimeMark(ISurfaceBox);
timeMark.objectType = DrawClass.Label;
timeMark.drawToolType = DrawToolType.DrawTimeMark;
timeMark.ISurfaceBox = this.ISurfaceBox;
timeMark.startPoint = this.startPoint;
timeMark.timeStr = this.timeStr;
timeMark.isFirstClick = false;
timeMark.labelTimeMarkStyleModel = this.labelTimeMarkStyleModel;
FillDrawObjectFields(timeMark);
return timeMark;
}
public override DrawObject Clone(ISurfaceBox surfaceBox)
{
DrawTimeMark timeMark = new DrawTimeMark(surfaceBox);
timeMark.objectType = DrawClass.Label;
timeMark.drawToolType = DrawToolType.DrawTimeMark;
timeMark.ISurfaceBox = surfaceBox;
timeMark.startPoint = this.startPoint;
timeMark.timeStr = this.timeStr;
timeMark.isFirstClick = false;
timeMark.labelTimeMarkStyleModel = this.labelTimeMarkStyleModel;
FillDrawObjectFields(timeMark);
return timeMark;
}
public override void Draw(Graphics g)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
Font textfont = new Font(this.labelTimeMarkStyleModel.font, this.labelTimeMarkStyleModel.fontSize);
Brush textbrush = new SolidBrush(Color.FromArgb(this.labelTimeMarkStyleModel.textColor));
Color color = Color.FromArgb(this.labelTimeMarkStyleModel.backgroundBoxColor);
Pen pen = new Pen(color, this.labelTimeMarkStyleModel.lineWidth);
Color fillColor = Color.FromArgb(this.labelTimeMarkStyleModel.backgroundColor);
SolidBrush fillBrush = new SolidBrush(fillColor);
Size fontSize = g.MeasureString(timeStr, textfont).ToSize();
float positionSize = 0;//位置大小
float backgroundSize = 0;//背景大小
if (fontSize.Width > fontSize.Height)
{
positionSize = fontSize.Width * (this.labelTimeMarkStyleModel.positionSize / 100f);
backgroundSize = fontSize.Width * (this.labelTimeMarkStyleModel.backgroundSize / 100f);
}
else
{
positionSize = fontSize.Height * (this.labelTimeMarkStyleModel.positionSize / 100f);
backgroundSize = fontSize.Height * (this.labelTimeMarkStyleModel.backgroundSize / 100f);
}
if (isFirstClick)
{
string gainPosition = this.labelTimeMarkStyleModel.position;
SizeF windowSize = this.ISurfaceBox.GetDocumentSize();
switch ((TagLocation)System.Enum.ToObject(typeof(TagLocation), int.Parse(gainPosition)))
{
case TagLocation.UpLeft:
startPoint.X = 0 + positionSize;
startPoint.Y = 0 + positionSize;
break;
case TagLocation.UpRight:
startPoint.X = Convert.ToInt32(windowSize.Width) - fontSize.Width - 2 * backgroundSize - positionSize;
startPoint.Y = 0 + positionSize;
break;
case TagLocation.DownLeft:
startPoint.X = 0 + positionSize;
startPoint.Y = Convert.ToInt32(windowSize.Height) - fontSize.Height - 2 * backgroundSize - positionSize;
break;
case TagLocation.DownRight:
startPoint.X = Convert.ToInt32(windowSize.Width) - fontSize.Width - 2 * backgroundSize - positionSize;
startPoint.Y = Convert.ToInt32(windowSize.Height) - fontSize.Height - 2 * backgroundSize - positionSize;
break;
}
isFirstClick = false;
}
g.FillRectangle(fillBrush, startPoint.X, startPoint.Y, fontSize.Width + 2 * backgroundSize, fontSize.Height + 2 * backgroundSize);
g.DrawRectangle(pen, startPoint.X, startPoint.Y, fontSize.Width + 2 * backgroundSize, fontSize.Height + 2 * backgroundSize);
g.DrawString(timeStr, textfont, textbrush, startPoint.X + backgroundSize, startPoint.Y + backgroundSize);
rectangle.X = startPoint.X;
rectangle.Y = startPoint.Y;
rectangle.Width = fontSize.Width + 2 * backgroundSize;
rectangle.Height = fontSize.Height + 2 * backgroundSize;
fillBrush.Dispose();
pen.Dispose();
}
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 labelTimeMarkStyleModel;
}
public override string GetContent()
{
return timeStr;
}
}
}