using System;
using System.ComponentModel;
using System.Drawing;
using FastReport.Utils;
using System.Windows.Forms;
using System.Drawing.Design;
namespace FastReport
{
///
/// Specifies the watermark image size mode.
///
public enum WatermarkImageSize
{
///
/// Specifies the normal (original) size.
///
Normal,
///
/// Specifies the centered image.
///
Center,
///
/// Specifies the stretched image.
///
Stretch,
///
/// Specifies the stretched image that keeps its aspect ratio.
///
Zoom,
///
/// Specifies the tiled image.
///
Tile
}
///
/// Specifies the watermark text rotation.
///
public enum WatermarkTextRotation
{
///
/// Specifies a horizontal text.
///
Horizontal,
///
/// Specifies a vertical text.
///
Vertical,
///
/// Specifies a diagonal text.
///
ForwardDiagonal,
///
/// Specifies a backward diagonal text.
///
BackwardDiagonal
}
///
/// Represents the report page watermark.
///
///
/// Watermark can draw text and/or image behind the page objects on in front of them. To enable
/// watermark, set its Enabled property to true.
///
[TypeConverter(typeof(FastReport.TypeConverters.FRExpandableObjectConverter))]
[EditorAttribute("FastReport.TypeEditors.WatermarkEditor, FastReport", typeof(UITypeEditor))]
public class Watermark : IDisposable
{
#region Fields
private bool enabled;
private PictureObject pictureObject;
private TextObject textObject;
private WatermarkTextRotation textRotation;
private WatermarkImageSize imageSize;
private bool showImageOnTop;
private bool showTextOnTop;
#endregion
#region Properties
///
/// Gets or sets avalue indicating that watermark is enabled.
///
[DefaultValue(false)]
public bool Enabled
{
get { return enabled; }
set { enabled = value; }
}
///
/// Gets or sets the watermark image.
///
public Image Image
{
get { return pictureObject.Image; }
set { pictureObject.Image = value; }
}
///
/// Gets or sets the watermark image size mode.
///
[DefaultValue(WatermarkImageSize.Zoom)]
public WatermarkImageSize ImageSize
{
get { return imageSize; }
set { imageSize = value; }
}
///
/// Gets or sets an image transparency.
///
///
/// Valid values are 0..1. 1 means totally transparent image.
///
[DefaultValue(0f)]
public float ImageTransparency
{
get { return pictureObject.Transparency; }
set { pictureObject.Transparency = value; }
}
///
/// Gets or sets the watermark text.
///
public string Text
{
get { return textObject.Text; }
set { textObject.Text = value; }
}
///
/// Gets or sets a font of the watermark text.
///
public Font Font
{
get { return textObject.Font; }
set { textObject.Font = value; }
}
///
/// Gets or sets a text fill.
///
[Editor("FastReport.TypeEditors.FillEditor, FastReport", typeof(UITypeEditor))]
public FillBase TextFill
{
get { return textObject.TextFill; }
set { textObject.TextFill = value; }
}
///
/// Gets or sets a text rotation.
///
[DefaultValue(WatermarkTextRotation.ForwardDiagonal)]
public WatermarkTextRotation TextRotation
{
get { return textRotation; }
set { textRotation = value; }
}
///
/// Gets or sets a value indicates that the text should be displayed on top of all page objects.
///
[DefaultValue(true)]
public bool ShowTextOnTop
{
get { return showTextOnTop; }
set { showTextOnTop = value; }
}
///
/// Gets or sets a value indicates that the image should be displayed on top of all page objects.
///
[DefaultValue(false)]
public bool ShowImageOnTop
{
get { return showImageOnTop; }
set { showImageOnTop = value; }
}
internal TextObject TextObject
{
get { return textObject; }
}
///
///
///
public PictureObject PictureObject
{
get { return pictureObject; }
set { pictureObject = value; }
}
#endregion
#region Private Methods
//private bool ShouldSerializeFont()
//{
// return Font.Name != DrawUtils.DefaultReportFont.Name || Font.Size != 60 || Font.Style != FontStyle.Regular;
//}
private bool ShouldSerializeTextFill()
{
return !(TextFill is SolidFill) || (TextFill as SolidFill).Color != Color.LightGray;
}
private bool ShouldSerializeImage()
{
return Image != null;
}
#endregion
#region Public Methods
///
/// Draws watermark image.
///
///
///
///
///
public virtual void DrawImage(FRPaintEventArgs e, RectangleF displayRect, Report report, bool isPrinting)
{
pictureObject.SetReport(report);
pictureObject.Bounds = displayRect;
PictureBoxSizeMode sizeMode = PictureBoxSizeMode.Normal;
if (ImageSize == WatermarkImageSize.Stretch)
sizeMode = PictureBoxSizeMode.StretchImage;
else if (ImageSize == WatermarkImageSize.Zoom)
sizeMode = PictureBoxSizeMode.Zoom;
else if (ImageSize == WatermarkImageSize.Center)
sizeMode = PictureBoxSizeMode.CenterImage;
pictureObject.SizeMode = sizeMode;
pictureObject.Tile = ImageSize == WatermarkImageSize.Tile;
pictureObject.SetPrinting(isPrinting);
pictureObject.DrawImage(e);
}
///
/// Draws watermark text.
///
///
///
///
///
public void DrawText(FRPaintEventArgs e, RectangleF displayRect, Report report, bool isPrinting)
{
textObject.SetReport(report);
textObject.Bounds = displayRect;
int angle = 0;
switch (TextRotation)
{
case WatermarkTextRotation.Horizontal:
angle = 0;
break;
case WatermarkTextRotation.Vertical:
angle = 270;
break;
case WatermarkTextRotation.ForwardDiagonal:
angle = 360 - (int)(Math.Atan(displayRect.Height / displayRect.Width) * (180 / Math.PI));
break;
case WatermarkTextRotation.BackwardDiagonal:
angle = (int)(Math.Atan(displayRect.Height / displayRect.Width) * (180 / Math.PI));
break;
}
textObject.Angle = angle;
textObject.SetPrinting(isPrinting);
textObject.DrawText(e);
}
///
/// Serializes the watermark.
///
/// Writer object.
/// The watermark property name.
/// Another Watermark object to compare with.
///
/// This method is for internal use only.
///
public void Serialize(FRWriter writer, string prefix, Watermark c)
{
if (Enabled != c.Enabled)
writer.WriteBool(prefix + ".Enabled", Enabled);
if (!writer.AreEqual(Image, c.Image))
writer.WriteValue(prefix + ".Image", Image);
if (ImageSize != c.ImageSize)
writer.WriteValue(prefix + ".ImageSize", ImageSize);
if (ImageTransparency != c.ImageTransparency)
writer.WriteFloat(prefix + ".ImageTransparency", ImageTransparency);
if (Text != c.Text)
writer.WriteStr(prefix + ".Text", Text);
if ((writer.SerializeTo != SerializeTo.Preview || !writer.AreEqual(Font, c.Font)) && writer.ItemName != "inherited")
writer.WriteValue(prefix + ".Font", Font);
TextFill.Serialize(writer, prefix + ".TextFill", c.TextFill);
if (TextRotation != c.TextRotation)
writer.WriteValue(prefix + ".TextRotation", TextRotation);
if (ShowTextOnTop != c.ShowTextOnTop)
writer.WriteBool(prefix + ".ShowTextOnTop", ShowTextOnTop);
if (ShowImageOnTop != c.ShowImageOnTop)
writer.WriteBool(prefix + ".ShowImageOnTop", ShowImageOnTop);
}
///
/// Disposes resources used by the watermark.
///
public void Dispose()
{
pictureObject.Dispose();
textObject.Dispose();
}
///
/// Assigns values from another source.
///
/// Source to assign from.
public void Assign(Watermark source)
{
Enabled = source.Enabled;
Image = source.Image == null ? null : source.Image.Clone() as Image;
ImageSize = source.ImageSize;
ImageTransparency = source.ImageTransparency;
Text = source.Text;
Font = source.Font;
TextFill = source.TextFill.Clone();
TextRotation = source.TextRotation;
ShowTextOnTop = source.ShowTextOnTop;
ShowImageOnTop = source.ShowImageOnTop;
}
///
/// Creates exact copy of this Watermark.
///
/// Copy of this watermark.
public Watermark Clone()
{
Watermark result = new Watermark();
result.Assign(this);
return result;
}
#endregion
///
/// Initializes a new instance of the class with default settings.
///
public Watermark()
{
pictureObject = new PictureObject();
textObject = new TextObject();
pictureObject.ShowErrorImage = false;
textObject.HorzAlign = HorzAlign.Center;
textObject.VertAlign = VertAlign.Center;
ImageSize = WatermarkImageSize.Zoom;
Font = new Font(DrawUtils.DefaultReportFont.Name, 60);
TextFill = new SolidFill(Color.FromArgb(40, Color.Gray));
TextRotation = WatermarkTextRotation.ForwardDiagonal;
ShowTextOnTop = true;
}
}
}