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; } } }