3c1f479b9d
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
234 lines
8.6 KiB
C#
234 lines
8.6 KiB
C#
#pragma warning disable 1634, 1691
|
|
namespace System.Workflow.ComponentModel.Design
|
|
{
|
|
using System;
|
|
using System.IO;
|
|
using System.Drawing;
|
|
using System.CodeDom;
|
|
using System.Diagnostics;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Windows.Forms;
|
|
using System.ComponentModel;
|
|
using System.Globalization;
|
|
using System.Drawing.Design;
|
|
using System.Drawing.Imaging;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Windows.Forms.Design;
|
|
using System.ComponentModel.Design;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel.Design.Serialization;
|
|
using System.Workflow.ComponentModel.Compiler;
|
|
using System.Workflow.ComponentModel.Serialization;
|
|
using System.Collections.ObjectModel;
|
|
using System.Reflection;
|
|
using System.Workflow.ComponentModel.Design;
|
|
using System.Runtime.Serialization.Formatters.Binary;
|
|
|
|
//
|
|
|
|
#region Class Header/Footer
|
|
/// <summary>
|
|
/// Base class for Header and Footer to be associated with SequentialWorkflowRootDesigner
|
|
/// </summary>
|
|
[Obsolete("The System.Workflow.* types are deprecated. Instead, please use the new types from System.Activities.*")]
|
|
public class SequentialWorkflowHeaderFooter
|
|
{
|
|
private SequentialWorkflowRootDesigner rootDesigner;
|
|
private Image image;
|
|
private string text = String.Empty;
|
|
private bool isHeader = true;
|
|
internal Size textSize = Size.Empty;
|
|
|
|
/// <summary>
|
|
/// Default constructor
|
|
/// </summary>
|
|
/// <param name="parent">Parent designer associated with the Header or Footer</param>
|
|
/// <param name="isHeader">True if it is a header, false if it is a footer</param>
|
|
public SequentialWorkflowHeaderFooter(SequentialWorkflowRootDesigner parent, bool isHeader)
|
|
{
|
|
this.rootDesigner = parent;
|
|
this.isHeader = isHeader;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the image associated with Header/Footer
|
|
/// </summary>
|
|
public virtual Image Image
|
|
{
|
|
get
|
|
{
|
|
return this.image;
|
|
}
|
|
|
|
set
|
|
{
|
|
if (this.image == value)
|
|
return;
|
|
|
|
this.image = value;
|
|
|
|
AssociatedDesigner.InternalPerformLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the text associated with Header/Footer
|
|
/// </summary>
|
|
public virtual string Text
|
|
{
|
|
get
|
|
{
|
|
return this.text;
|
|
}
|
|
|
|
set
|
|
{
|
|
if (this.text == value)
|
|
return;
|
|
|
|
this.text = value;
|
|
|
|
AssociatedDesigner.InternalPerformLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the bonding rectangle for Header/Footer
|
|
/// </summary>
|
|
public virtual Rectangle Bounds
|
|
{
|
|
get
|
|
{
|
|
Rectangle bounds = Rectangle.Empty;
|
|
|
|
Size margin = WorkflowTheme.CurrentTheme.AmbientTheme.Margin;
|
|
|
|
Rectangle textBounds = TextRectangle;
|
|
Rectangle imageBounds = ImageRectangle;
|
|
if (!textBounds.Size.IsEmpty || !imageBounds.Size.IsEmpty)
|
|
{
|
|
bounds.Width = Math.Max(imageBounds.Width, textBounds.Width) + 2 * margin.Width;
|
|
bounds.Height = margin.Height + imageBounds.Height;
|
|
bounds.Height += (imageBounds.Height > 0) ? margin.Height : 0;
|
|
bounds.Height += textBounds.Height;
|
|
bounds.Height += (textBounds.Height > 0) ? margin.Height : 0;
|
|
|
|
//Before returning we adjust the bounds based on the header / footer setting
|
|
Rectangle designerBounds = this.rootDesigner.Bounds;
|
|
bounds.X = designerBounds.Left + designerBounds.Width / 2 - bounds.Width / 2;
|
|
bounds.Y = (this.isHeader) ? designerBounds.Top : designerBounds.Bottom - bounds.Height;
|
|
}
|
|
|
|
return bounds;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the bounding rectangle for text associated with Header/Footer
|
|
/// </summary>
|
|
public virtual Rectangle TextRectangle
|
|
{
|
|
get
|
|
{
|
|
Rectangle bounds = Rectangle.Empty;
|
|
if (!String.IsNullOrEmpty(Text))
|
|
{
|
|
Size margin = WorkflowTheme.CurrentTheme.AmbientTheme.Margin;
|
|
Rectangle designerBounds = this.rootDesigner.Bounds;
|
|
bounds.Size = this.textSize;
|
|
bounds.X = designerBounds.Left + designerBounds.Width / 2 - this.textSize.Width / 2;
|
|
bounds.Y = (this.isHeader) ? designerBounds.Top + margin.Height : designerBounds.Bottom - margin.Height - this.textSize.Height;
|
|
}
|
|
|
|
return bounds;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the bounding rectangle for Image associated with Header/Footer
|
|
/// </summary>
|
|
public virtual Rectangle ImageRectangle
|
|
{
|
|
get
|
|
{
|
|
Rectangle bounds = Rectangle.Empty;
|
|
if (Image != null)
|
|
{
|
|
ActivityDesignerTheme designerTheme = this.rootDesigner.DesignerTheme;
|
|
Size margin = WorkflowTheme.CurrentTheme.AmbientTheme.Margin;
|
|
Rectangle designerBounds = this.rootDesigner.Bounds;
|
|
Rectangle textRectangle = TextRectangle;
|
|
|
|
bounds.Size = designerTheme.ImageSize;
|
|
bounds.X = designerBounds.Left + designerBounds.Width / 2 - bounds.Width / 2;
|
|
if (this.isHeader)
|
|
{
|
|
bounds.Y = designerBounds.Top + margin.Height;
|
|
bounds.Y += textRectangle.Height;
|
|
bounds.Y += (textRectangle.Height > 0) ? margin.Height : 0;
|
|
}
|
|
else
|
|
{
|
|
bounds.Y = designerBounds.Bottom - margin.Height;
|
|
bounds.Y -= textRectangle.Height;
|
|
bounds.Y -= (textRectangle.Height > 0) ? margin.Height : 0;
|
|
bounds.Y -= bounds.Height;
|
|
}
|
|
}
|
|
|
|
return bounds;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Layouts the visual cues inside Header/Footer
|
|
/// </summary>
|
|
/// <param name="e">ActivityDesignerLayoutEventArgs holding layouting arguments</param>
|
|
public virtual void OnLayout(ActivityDesignerLayoutEventArgs e)
|
|
{
|
|
if (e == null)
|
|
throw new ArgumentNullException("e");
|
|
|
|
if (!String.IsNullOrEmpty(Text) && e.DesignerTheme != null && e.DesignerTheme.Font != null)
|
|
{
|
|
using (Font font = new Font(e.DesignerTheme.Font.FontFamily, e.DesignerTheme.Font.SizeInPoints + 1.0f, FontStyle.Bold))
|
|
this.textSize = ActivityDesignerPaint.MeasureString(e.Graphics, font, Text, StringAlignment.Center, Size.Empty);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draws the Header/Footer associated with workflow root designer.
|
|
/// </summary>
|
|
/// <param name="e">ActivityDesignerPaintEventArgs holding drawing arguments</param>
|
|
public virtual void OnPaint(ActivityDesignerPaintEventArgs e)
|
|
{
|
|
if (e == null)
|
|
throw new ArgumentNullException("e");
|
|
|
|
if (!String.IsNullOrEmpty(Text) && !TextRectangle.Size.IsEmpty && e.DesignerTheme != null && e.DesignerTheme.Font != null)
|
|
{
|
|
//use bold or regular font based on mouse over status
|
|
using (Font font = new Font(e.DesignerTheme.Font.FontFamily, e.DesignerTheme.Font.SizeInPoints + 1.0f, (this.AssociatedDesigner.SmartTagVisible) ? FontStyle.Bold : FontStyle.Regular))
|
|
ActivityDesignerPaint.DrawText(e.Graphics, font, Text, TextRectangle, StringAlignment.Center, TextQuality.AntiAliased, e.DesignerTheme.ForegroundBrush);
|
|
}
|
|
|
|
if (Image != null && !ImageRectangle.Size.IsEmpty)
|
|
ActivityDesignerPaint.DrawImage(e.Graphics, Image, ImageRectangle, DesignerContentAlignment.Fill);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the designer associated with header/footer
|
|
/// </summary>
|
|
protected SequentialWorkflowRootDesigner AssociatedDesigner
|
|
{
|
|
get
|
|
{
|
|
return this.rootDesigner;
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
}
|