using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
#if NET8_0
#else
using System.Drawing.Design;
#endif
using System.Linq;
using System.Xml.Serialization;
using GeoSigma;
using GeoSigma.SigmaDrawerStyle;
using GeoSigmaDrawLib;
using SigmaDrawerStyle;
namespace SigmaDrawerElement
{
///
/// The drawer text.
///
[TypeConverter(typeof(PropertySorter))]
public class DrawerText : ElementBase
{
///
/// 属性类别排序
///
private List categorys = new List() { "基础属性", "文本", "对齐方式", "其他", "杂项" };
///
/// Initializes a new instance of the class.
///
public DrawerText()
{
ElementType = DrawElementType.ELEMENT_TEXT;
}
///
/// Gets or sets the name.
///
[XmlAttribute("Name")]
[Category("基础属性"), DisplayName("名称"), Browsable(false), PropertyOrder(0)]
public override string Name { get => base.Name; set => base.Name = value; }
[Category("文本"), DisplayName("坐标"), PropertyOrder(1)]
[XmlElement("Coordinate")]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BaseExpandableConverter))]
public DrawerCoordinateXYZ Coordinate { get; set; } = new DrawerCoordinateXYZ();
[XmlIgnore]
[Category("文本"), DisplayName("文字大小"), PropertyOrder(2)]
public double Height
{
get => Other.Height;
//set => Other.Height = value;
set
{
if (Math.Abs(this.Height - value) < 1E-5 || value == 0)
{
return;
}
//if (this.SizeScaleFix == true)
//{
if (this.Width == 0 || this.Height == 0)
{
this.Other.Height = value;
return;
}
double dFactor = this.Width / this.Height;
this.Other.Width = value * dFactor;
this.Other.Height = value;
//}
//else
//{
// this.Other.Height = value;
//}
}
}
#region Font
[Browsable(false)]
[XmlElement("Font")]
public LogFont NameFont { get; set; } = LogFont.Default;
private Font _TextFont;
[XmlIgnore]
[Category("文本"), DisplayName("字体"), PropertyOrder(3)]
[TypeConverter(typeof(FontPropertyConvert))]
public Font TextFont
{
get
{
_TextFont = Font.FromLogFont(NameFont);
return _TextFont;
}
set
{
_TextFont = value;
NameFont = LogFontConverter.convert(_TextFont);
}
}
#endregion
[Browsable(false)]
[XmlAttribute("Color")]
public int ColorRef;
[XmlIgnore]
#if NET8_0
#else
[Editor(typeof(PropertyEditorColor), typeof(UITypeEditor))]
#endif
[Category("文本"), DisplayName("颜色"), PropertyOrder(4)]
public Color LineColor
{
get
{
return ColorTranslator.FromWin32(ColorRef);
}
set
{
ColorRef = ColorTranslator.ToWin32(value);
}
}
[XmlIgnore]
[Category("文本"), DisplayName("角度"), PropertyOrder(5)]
public double Angle
{
get => Other.Angle;
set => Other.Angle = value;
}
[XmlIgnore]
[Category("文本"), DisplayName("文字边框"), PropertyOrder(6)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BorderTypeConverter))]
public int BorderType
{
get
{
return Other.Style & (int)TextStyleFlags.frameAll;
}
set
{
Other.Style &= ~(int)TextStyleFlags.frameAll;
Other.Style |= value;
}
}
[Browsable(false)]
[XmlElement("Other")]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BaseExpandableConverter))]
public TxOther Other { get; set; } = new TxOther();
[XmlIgnore]
[Category("文本"), DisplayName("文字宽度"), Browsable(false), PropertyOrder(0)]
public double Width
{
get => Other.Width;
set
{
if (Math.Abs(this.Width - value) < 1E-5 || value == 0)
{
return;
}
if (this.SizeScaleFix == true)
{
if (this.Width == 0 || this.Height == 0)
{
this.Other.Width = value;
return;
}
double dFactor = this.Height / this.Width;
this.Other.Height = value * dFactor;
this.Other.Width = value;
}
else
{
this.Other.Width = value;
}
}
}
public bool sizeScaleFix = true;
[XmlIgnore]
[Category("文本"), DisplayName("固定高宽比"), Browsable(false)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.YesNoConverter))]
public bool SizeScaleFix
{
get => sizeScaleFix;
set => sizeScaleFix = value;
}
[XmlIgnore]
[Category("文本"), DisplayName("显示上下标"), Browsable(false)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.YesNoConverter))]
public bool Script
{
get => Other.Script == 1;
set => Other.Script = value ? 1 : 0;
}
[XmlIgnore]
[Category("对齐方式"), DisplayName("水平对齐"), PropertyOrder(6)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.AlignHorizionMultConverter))]
public int AlignHorizion
{
get
{
int nStyle = Other.AlignMul;
return nStyle;
//int nStyle = Other.Style & (int)TextStyleFlags.alignAllH;
//if (nStyle == (int)TextStyleFlags.alignRight)
//{
// return (int)TextStyleFlags.alignLeftMult;
//}
//else if (nStyle == ((int)TextStyleFlags.alignRight | (int)TextStyleFlags.alignLeftMult))
//{
// nStyle = (int)TextStyleFlags.alignLeftMult;
//}
//else if (nStyle == ((int)TextStyleFlags.alignRight | (int)TextStyleFlags.alignCenterMult))
//{
// nStyle = (int)TextStyleFlags.alignCenterMult;
//}
//else if (nStyle == ((int)TextStyleFlags.alignRight | (int)TextStyleFlags.alignRightMult))
//{
// nStyle = (int)TextStyleFlags.alignRightMult;
//}
//return nStyle;
}
set
{
Other.Style &= ~(int)TextStyleFlags.alignAllMult;
Other.Style |= value;
}
}
[XmlIgnore]
[Category("对齐方式"), DisplayName("\t\t垂直对齐"),Browsable(false)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.AlignVerticalConverter))]
public int AlignVertical
{
get
{
return Other.Style & (int)TextStyleFlags.alignAllV;
}
set
{
Other.Style &= ~(int)TextStyleFlags.alignAllV;
Other.Style |= value;
}
}
#region String
public class TxString
{
[XmlAttribute]
public int Line
{
get => Items.Count;
set { } // 这个空 set 不能删除,否则 xml 序列化时将无法生成 Line 属性
}
public class TxsItem
{
[XmlAttribute]
public string Value { get; set; }
}
[Browsable(false)]
[XmlElement("Item")]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BaseCollectionConverter))]
public List Items { get; set; } = new List();
public override string ToString()
{
return string.Join(string.Empty, Items.Select(r => r.Value));
}
}
[Category("其他"), DisplayName("内容"), ReadOnly(true)]
[XmlElement("String")]
public TxString String { get; set; } = new TxString();
#endregion
}
#region Other
public class TxOther
{
[XmlAttribute]
public double Height { get; set; }
[XmlAttribute]
public double Width { get; set; }
[XmlAttribute]
public double Angle { get; set; }
private int style = (int)(TextStyleFlags.alignLeftMult |
TextStyleFlags.alignBottom |
TextStyleFlags.frameNull);
[XmlAttribute]
public int Style
{
get {
return style;
}
set {
style = value;
int nPos = style & (int)TextStyleFlags.alignAllPosition;
if (nPos > 0)
{
PositionH = nPos;
}
int nAlignH = style & (int)TextStyleFlags.alignAllMult;
if (nAlignH > 0)
{
AlignMul = nAlignH;
}
}
}
///
/// 水平对齐
///
[XmlIgnore]
public int AlignMul { get; set; } = (int)TextStyleFlags.alignLeftMult;
private int positionH = (int)TextStyleFlags.alignRight;
///
/// 水平位置
///
[XmlIgnore]
public int PositionH
{
get
{
return positionH;
}
set
{
positionH = value;
}
}
[XmlAttribute]
public int Script { get; set; }
}
#endregion
}