ASCU_ALL/PrintPDF/MigraDoc.DocumentObjectModel/DocumentObjectModel/Font.cs
2021-05-25 17:00:45 +05:00

465 lines
16 KiB
C#

#region MigraDoc - Creating Documents on the Fly
//
// Authors:
// Stefan Lange
// Klaus Potzesny
// David Stephensen
//
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
//
// http://www.pdfsharp.com
// http://www.migradoc.com
// http://sourceforge.net/projects/pdfsharp
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
#endregion
using System;
using MigraDoc.DocumentObjectModel.publics;
namespace MigraDoc.DocumentObjectModel
{
/// <summary>
/// Font represents the formatting of characters in a paragraph.
/// </summary>
public sealed class Font : DocumentObject
{
/// <summary>
/// Initializes a new instance of the Font class that can be used as a template.
/// </summary>
public Font()
{ }
/// <summary>
/// Initializes a new instance of the Font class with the specified parent.
/// </summary>
public Font(DocumentObject parent) : base(parent) { }
/// <summary>
/// Initializes a new instance of the Font class with the specified name and size.
/// </summary>
public Font(string name, Unit size)
{
_name.Value = name;
_size.Value = size;
}
/// <summary>
/// Initializes a new instance of the Font class with the specified name.
/// </summary>
public Font(string name)
{
_name.Value = name;
}
#region Methods
/// <summary>
/// Creates a copy of the Font.
/// </summary>
public new Font Clone()
{
return (Font)DeepCopy();
}
/// <summary>
/// Applies all non-null properties of a font to this font if the given font's property is different from the given refFont's property.
/// </summary>
public void ApplyFont(Font font, Font refFont)
{
if (font == null)
throw new ArgumentNullException("font");
if ((!font._name.IsNull && font._name.Value != "") && (refFont == null || font.Name != refFont.Name))
Name = font.Name;
if (!font._size.IsNull && (refFont == null || font.Size != refFont.Size))
Size = font.Size;
if (!font._bold.IsNull && (refFont == null || font.Bold != refFont.Bold))
Bold = font.Bold;
if (!font._italic.IsNull && (refFont == null || font.Italic != refFont.Italic))
Italic = font.Italic;
if (!font._subscript.IsNull && (refFont == null || font.Subscript != refFont.Subscript))
Subscript = font.Subscript;
else if (!font._superscript.IsNull && (refFont == null || font.Superscript != refFont.Superscript))
Superscript = font.Superscript;
if (!font._underline.IsNull && (refFont == null || font.Underline != refFont.Underline))
Underline = font.Underline;
if (!font._color.IsNull && (refFont == null || font.Color.Argb != refFont.Color.Argb))
Color = font.Color;
}
/// <summary>
/// Applies all non-null properties of a font to this font.
/// </summary>
public void ApplyFont(Font font)
{
if (font == null)
throw new ArgumentNullException("font");
if (!font._name.IsNull && font._name.Value != "")
Name = font.Name;
if (!font._size.IsNull)
Size = font.Size;
if (!font._bold.IsNull)
Bold = font.Bold;
if (!font._italic.IsNull)
Italic = font.Italic;
if (!font._subscript.IsNull)
Subscript = font.Subscript;
else if (!font._superscript.IsNull)
Superscript = font.Superscript;
if (!font._underline.IsNull)
Underline = font.Underline;
if (!font._color.IsNull)
Color = font.Color;
}
#endregion
#region Properties
/// <summary>
/// Gets or sets the name of the font.
/// </summary>
public string Name
{
get { return _name.Value; }
set { _name.Value = value; }
}
[DV]
public NString _name = NString.NullValue;
/// <summary>
/// Gets or sets the size of the font.
/// </summary>
public Unit Size
{
get { return _size; }
set { _size = value; }
}
[DV]
public Unit _size = Unit.NullValue;
/// <summary>
/// Gets or sets the bold property.
/// </summary>
public bool Bold
{
get { return _bold.Value; }
set { _bold.Value = value; }
}
[DV]
public NBool _bold = NBool.NullValue;
/// <summary>
/// Gets or sets the italic property.
/// </summary>
public bool Italic
{
get { return _italic.Value; }
set { _italic.Value = value; }
}
[DV]
public NBool _italic = NBool.NullValue;
// THHO4STLA Implementation for Strikethrough in the forum: http://forum.pdfsharp.net/viewtopic.php?p=4636#p4636
/// <summary>
/// Gets or sets the underline property.
/// </summary>
public Underline Underline
{
get { return (Underline)_underline.Value; }
set { _underline.Value = (int)value; }
}
[DV(Type = typeof(Underline))]
public NEnum _underline = NEnum.NullValue(typeof(Underline));
/// <summary>
/// Gets or sets the color property.
/// </summary>
public Color Color
{
get { return _color; }
set { _color = value; }
}
[DV]
public Color _color = Color.Empty;
/// <summary>
/// Gets or sets the superscript property.
/// </summary>
public bool Superscript
{
get { return _superscript.Value; }
set
{
_superscript.Value = value;
_subscript.SetNull();
}
}
[DV]
public NBool _superscript = NBool.NullValue;
/// <summary>
/// Gets or sets the subscript property.
/// </summary>
public bool Subscript
{
get { return _subscript.Value; }
set
{
_subscript.Value = value;
_superscript.SetNull();
}
}
[DV]
public NBool _subscript = NBool.NullValue;
// + .Name = "Arial"
// + .Size = 8
// + .Bold = False
// + .Italic = False
// + .Underline = wdUnderlineDouble
// * .UnderlineColor = wdColorOrange
// .StrikeThrough = False
// .DoubleStrikeThrough = False
// .Outline = False
// .Emboss = False
// .Shadow = False
// .Hidden = False
// * .SmallCaps = False
// * .AllCaps = False
// + .Color = wdColorAutomatic
// .Engrave = False
// + .Superscript = False
// + .Subscript = False
// * .Spacing = 0
// * .Scaling = 100
// * .Position = 0
// .Kerning = 0
// .Animation = wdAnimationNone
#endregion
/// <summary>
/// Gets a value indicating whether the specified font exists.
/// </summary>
[Obsolete("This function is removed from DocumentObjectModel and always returns false.")]
public static bool Exists(string fontName)
{
//System.Drawing.FontFamily[] families = System.Drawing.FontFamily.Families;
//foreach (System.Drawing.FontFamily family in families)
//{
// if (String.Compare(family.Name, fontName, true) == 0)
// return true;
//}
return false;
}
#region public
/// <summary>
/// Get a bitmask of all non-null properties.
/// </summary>
private FontProperties CheckWhatIsNotNull()
{
FontProperties fp = FontProperties.None;
if (!_name.IsNull)
fp |= FontProperties.Name;
if (!_size.IsNull)
fp |= FontProperties.Size;
if (!_bold.IsNull)
fp |= FontProperties.Bold;
if (!_italic.IsNull)
fp |= FontProperties.Italic;
if (!_underline.IsNull)
fp |= FontProperties.Underline;
if (!_color.IsNull)
fp |= FontProperties.Color;
if (!_superscript.IsNull)
fp |= FontProperties.Superscript;
if (!_subscript.IsNull)
fp |= FontProperties.Subscript;
return fp;
}
/// <summary>
/// Converts Font into DDL.
/// </summary>
public override void Serialize(Serializer serializer)
{
Serialize(serializer, null);
}
/// <summary>
/// Converts Font into DDL. Properties with the same value as in an optionally given
/// font are not serialized.
/// </summary>
public void Serialize(Serializer serializer, Font font)
{
if (Parent is FormattedText)
{
string fontStyle = "";
if (((FormattedText)Parent)._style.IsNull)
{
// Check if we can use a DDL keyword.
FontProperties notNull = CheckWhatIsNotNull();
if (notNull == FontProperties.Size)
{
serializer.Write("\\fontsize(" + _size + ")");
return;
}
if (notNull == FontProperties.Bold && _bold.Value)
{
serializer.Write("\\bold");
return;
}
if (notNull == FontProperties.Italic && _italic.Value)
{
serializer.Write("\\italic");
return;
}
if (notNull == FontProperties.Color)
{
serializer.Write("\\fontcolor(" + _color + ")");
return;
}
}
else
fontStyle = "(\"" + ((FormattedText)Parent).Style + "\")";
//bool needBlank = false; // nice, but later...
serializer.Write("\\font" + fontStyle + "[");
if (!_name.IsNull && _name.Value != "")
serializer.WriteSimpleAttribute("Name", Name);
#if DEBUG_ // Test
if (!_size.IsNull && Size != 0 && Size.Point == 0)
GetType();
#endif
if ((!_size.IsNull))
serializer.WriteSimpleAttribute("Size", Size);
if (!_bold.IsNull)
serializer.WriteSimpleAttribute("Bold", Bold);
if (!_italic.IsNull)
serializer.WriteSimpleAttribute("Italic", Italic);
if (!_underline.IsNull)
serializer.WriteSimpleAttribute("Underline", Underline);
if (!_superscript.IsNull)
serializer.WriteSimpleAttribute("Superscript", Superscript);
if (!_subscript.IsNull)
serializer.WriteSimpleAttribute("Subscript", Subscript);
if (!_color.IsNull)
serializer.WriteSimpleAttribute("Color", Color);
serializer.Write("]");
}
else
{
int pos = serializer.BeginContent("Font");
#if true
// Don't write null values if font is null.
// Do write null values if font is not null!
if ((!_name.IsNull && Name != String.Empty && font == null) ||
(font != null && !_name.IsNull && Name != String.Empty && Name != font.Name))
serializer.WriteSimpleAttribute("Name", Name);
#if DEBUG_
// Test
if (!_size.IsNull && Size != 0 && Size.Point == 0)
GetType();
#endif
if (!_size.IsNull &&
(font == null || Size != font.Size))
serializer.WriteSimpleAttribute("Size", Size);
// NBool and NEnum have to be compared directly to check whether the value Null is.
if (!_bold.IsNull && (font == null || Bold != font.Bold || font._bold.IsNull))
serializer.WriteSimpleAttribute("Bold", Bold);
if (!_italic.IsNull && (font == null || Italic != font.Italic || font._italic.IsNull))
serializer.WriteSimpleAttribute("Italic", Italic);
if (!_underline.IsNull && (font == null || Underline != font.Underline || font._underline.IsNull))
serializer.WriteSimpleAttribute("Underline", Underline);
if (!_superscript.IsNull && (font == null || Superscript != font.Superscript || font._superscript.IsNull))
serializer.WriteSimpleAttribute("Superscript", Superscript);
if (!_subscript.IsNull && (font == null || Subscript != font.Subscript || font._subscript.IsNull))
serializer.WriteSimpleAttribute("Subscript", Subscript);
if (!_color.IsNull && (font == null || Color.Argb != font.Color.Argb))// && Color.RGB != Color.Transparent.RGB)
serializer.WriteSimpleAttribute("Color", Color);
#else
if ((!this .name.IsNull && Name != String.Empty) && (font == null || Name != font.Name))
serializer.WriteSimpleAttribute("Name", Name);
if (!this .size.IsNull && (font == null || Size != font.Size))
serializer.WriteSimpleAttribute("Size", Size);
//NBool and NEnum have to be compared directly to check whether the value Null is
if (!this .bold.IsNull && (font == null || Bold != font.Bold))
serializer.WriteSimpleAttribute("Bold", Bold);
if (!this .italic.IsNull && (font == null || Italic != font.Italic))
serializer.WriteSimpleAttribute("Italic", Italic);
if (!this .underline.IsNull && (font == null || Underline != font.Underline))
serializer.WriteSimpleAttribute("Underline", Underline);
if (!this .superscript.IsNull && (font == null || Superscript != font.Superscript))
serializer.WriteSimpleAttribute("Superscript", Superscript);
if (!this .subscript.IsNull && (font == null || Subscript != font.Subscript))
serializer.WriteSimpleAttribute("Subscript", Subscript);
if (!this .color.IsNull && (font == null || Color.Argb != font.Color.Argb))// && Color.RGB != Color.Transparent.RGB)
serializer.WriteSimpleAttribute("Color", Color);
#endif
serializer.EndContent(pos);
}
}
/// <summary>
/// Returns the meta object of this instance.
/// </summary>
public override Meta Meta
{
get { return _meta ?? (_meta = new Meta(typeof(Font))); }
}
static Meta _meta;
#endregion
}
}